Por motivos que não cabem aqui, temos alguns servidores instalados em uma sala na empresa. E essa sala tem um ar-condicionado pra manter a temperatura sob controle.
Um belo dia estou olhando os dados no Grafana e noto que essas máquinas não reportaram dados (não temos alertas enviados pelo Grafana, mas o porquê disso fica pra um outro dia). Entro na sala e a temperatura estava simplemente... 32°C. Era verão na Suécia, que é curto mas tem seus dias bem quentes. E o hardware das máquinas desligaram pra proteção.
Entre entrar em contato com técnico do ar-condicionado e deixar a sala aberta pra ventilar, ficamos com aquele gosto amargo de não ter nenhum dado sobre a temperatura.
A solução? raspberrypi!
Ele tem um sensor que é vendido na Internet.
O sensor já chegou mas não o raspberrypi. O motivo deve ser porque compramos um modelo que funciona como KVM e tem algumas coisas a mais.
Então aqui a descrição de como botar o serviço pra funcionar em Linux.
Existe um software descrito na página do produto que aponta pro seguinte repositório no GitHub:
Mas o repositório parece abandonado. Já faz 7 anos que ninguém manda nenhum commit. E o código não funciona com a versão mais moderna do sensor.
O que fazer? Patch!
Então corrigi o programa e criei um fork do repo original.
Então temos o software pronto pra funcionar. Ou quase.
Antes é preciso corrigir as permissões de leitura e escrita do dispositivo.
E pra isso eu criei uma pequena regra no udev
em
/etc/udev/rules.d/90-temperature-sensor.rules
KERNEL=="hidraw[0-9]*", SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="3553", ATTRS{idProduct}=="a001", MODE="0666", SYMLINK+="temper"
Pegando a saída do kernel:
# dmesg | grep -i temper
[ 5.152423] usb 1-10.4: Product: TEMPer2
[ 6.769788] input: PCsensor TEMPer2 as /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.4/1-10.4:1.0/0003:3553:A001.0005/input/input14
[ 6.826541] hid-generic 0003:3553:A001.0005: input,hidraw4: USB HID v1.11 Keyboard [PCsensor TEMPer2] on usb-0000:00:14.0-10.4/input0
[ 6.826720] input: PCsensor TEMPer2 as /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.4/1-10.4:1.1/0003:3553:A001.0006/input/input15
[ 6.827067] hid-generic 0003:3553:A001.0006: input,hidraw5: USB HID v1.10 Device [PCsensor TEMPer2] on usb-0000:00:14.0-10.4/input1
[ 939.507362] usb 1-10.4: Product: TEMPer2
[ 939.521617] input: PCsensor TEMPer2 as /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.4/1-10.4:1.0/0003:3553:A001.000B/input/input26
[ 939.580825] hid-generic 0003:3553:A001.000B: input,hidraw4: USB HID v1.11 Keyboard [PCsensor TEMPer2] on usb-0000:00:14.0-10.4/input0
[ 939.581808] input: PCsensor TEMPer2 as /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.4/1-10.4:1.1/0003:3553:A001.000C/input/input27
[ 939.582035] hid-generic 0003:3553:A001.000C: input,hidraw5: USB HID v1.10 Device [PCsensor TEMPer2] on usb-0000:00:14.0-10.4/input1
É possível ver que o dispositivo aparece como dois devices:
/dev/hidraw4
e
/dev/hidraw5
.
Eu tentei usar a permissão 0644 primeiro, mas essa não funcionou pra ler os dados. Então tive de mudar pra 0666 mesmo sendo algo que só lê informação.
Feita essa etapa, ainda não estamos prontos pra rodar o programa temper.py
.
Ainda é preciso instalar a dependência: serial
.
Se seu sistema é baseado em debian/ubuntu:
> sudo apt install -y python3-serial
Se não for, talvez seja mais fácil fazer com virtualenv.
E pra isso eu atualmente uso o uv
> uv venv venv
> source venv/bin/activate
(venv)> uv pip install serial
Tendo tudo pronto, chegamos ao momento da verdade:
(venv)> ./temper.py
Bus 001 Dev 011 3553:a001 TEMPer2_V4.1 25.6C 78.0F - 22.8C 73.1F -
Pegando a saída como JSON permite ver melhor o que é cada um desses resultados.
(venv)> ./temper.py --json
[
{
"vendorid": 13651,
"productid": 40961,
"manufacturer": "PCsensor",
"product": "TEMPer2",
"busnum": 1,
"devnum": 11,
"devices": [
"hidraw4",
"hidraw5"
],
"firmware": "TEMPer2_V4.1",
"hex_firmware": "54454d506572325f56342e3100000000",
"hex_data": "808009f64e200000800108e94e200000",
"internal temperature": 25.5,
"external temperature": 22.81
}
]
Então a primeira temperatura lida, de /dev/hidraw4
, é 25.5°C interna do dispositivo.
A segunda, /dev/hidraw5
, é de 22.81°C e externa, do cabo.
Temos as leituras e os dados. Como mandar isso pro Grafana?
Eu primeiramente tentei fazer em shell script e mandar o dados pro mimir, que é onde eu agrego as métricas.
Fracassei miseravelmente.
Não existe uma forma muito fácil de enviar um dados pro lá. O formato que o alloy usa é protobuf, que é um dado comprimido em snappy, etc.
Qual outra alternativa?
Expor o dado como open metric pro alloy pegar e enviar.
Pode parecer simples mas... precisamos de um servidor web pra isso.
Algo que temos fácil em python.
Então usando uvicorn
e fastapi
podemos ter tudo funcionando.
E é possível importar o temper.py
como módulo.
E é preciso incrementar nosso virtualenv (ou pacotes) com esses pacotes:
> sudo apt install -y python3-uvicorn python3-fastapi
ou
(venv)> uv pip install uvicorn
(venv)> uv pip install fastapi
Sem mais delongas, eis aqui o código do monitor.py
:
#! /usr/bin/env python3
import subprocess
import argparse
import logging
import threading
import time
try:
import temper
except ImportError as e:
print(f"Error importing temper module: {e}")
print("Make sure python3-serial is installed: sudo apt-get install python3-serial")
exit(1)
import uvicorn
from fastapi import FastAPI
from fastapi.responses import PlainTextResponse
CELSIUS = "\u2103"
DEFAULT_PORT = 8000
TEMPERATURE_MAX = 25.0
logger = logging.getLogger(__file__)
consoleOutputHandler = logging.StreamHandler()
formatter = logging.Formatter(
fmt="[%(asctime)s] (%(levelname)s) %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
consoleOutputHandler.setFormatter(formatter)
logger.addHandler(consoleOutputHandler)
logger.setLevel(logging.INFO)
def shellExec(command: str) -> str:
'run a command and return its output'
try:
return subprocess.getoutput(command)
except Exception as e:
logger.error(f"Error executing shell command '{command}': {e}")
return f"Error: {e}"
app = FastAPI()
# Global temperature monitor instance (will be set in main)
temperature_monitor = None
@app.get("/metrics", response_class=PlainTextResponse)
async def metrics():
if temperature_monitor is None or temperature_monitor.temperature_current is None:
return ""
temperature_current = temperature_monitor.temperature_current
logger.info(f"/metrics: {temperature_current}{CELSIUS}")
data_lines = list()
data_lines.append("#HELP server_room_temperature_celsius the room with servers current temperature")
data_lines.append("#TYPE server_room_temperature_celsius gauge")
data_lines.append(f"server_room_temperature_celsius {temperature_current}")
data_lines.append("")
return "\n".join(data_lines)
class TemperatureMonitor:
'A class that handle the temperature monitoring'
port: int = DEFAULT_PORT
temperature_max: float = TEMPERATURE_MAX
temperature_current: float|None = None
alert_lock: bool = False
def __init__(self, port=None, temperature_max=None) -> None:
if port:
self.port = port
if temperature_max:
self.temperature_max = temperature_max
def monitor(self) -> None:
th = threading.Thread(target=self.webserver)
th.daemon = True # Make it a daemon thread
th.start()
try:
while True:
self.update()
time.sleep(15)
except KeyboardInterrupt:
logger.info("Monitoring stopped by user")
except Exception as e:
logger.error(f"Error in monitoring loop: {e}")
raise
def webserver(self) -> None:
uvicorn.run(app, host="127.0.0.1", port=self.port)
def update(self) -> None:
'Read the output from the command'
try:
tp = temper.Temper().read()
if not tp or len(tp) == 0:
logger.warning("No temperature devices found")
self.temperature_current = None
return
self.temperature_current = tp[0].get('external temperature')
if self.temperature_current is not None:
logger.info(f"🌡️ current temperature: {self.temperature_current}{CELSIUS}")
else:
logger.warning("External temperature reading is None")
except Exception as e:
logger.error(f"Error reading temperature sensor: {e}")
self.temperature_current = None
if __name__ == '__main__':
parse = argparse.ArgumentParser(description="script to monitor temperature")
parse.add_argument("--loglevel", default="info", help="the logging level (default=info)")
parse.add_argument("--tempmax", type=float, default=TEMPERATURE_MAX, help="maximum temperature before raising alert")
parse.add_argument("--port", type=int, default=DEFAULT_PORT, help="port to listen the service")
args = parse.parse_args()
# Validate log level
valid_log_levels = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
if args.loglevel.upper() not in valid_log_levels:
print(f"Invalid log level: {args.loglevel}. Valid options: {', '.join(valid_log_levels)}")
exit(1)
if args.loglevel.upper() != "INFO":
logger.setLevel(args.loglevel.upper())
# Validate temperature threshold
if args.tempmax <= 0:
print("Temperature threshold must be greater than 0")
exit(1)
# Validate port number
if not (1 <= args.port <= 65535):
print("Port must be between 1 and 65535")
exit(1)
# Create temperature monitor instance
temperature_monitor = TemperatureMonitor(args.port, args.tempmax)
temperature_monitor.monitor()
Eu tenho integrado uma parte de alerta que usa outro sistema, mas removi pra deixar o código fazendo somente o que é preciso.
No alloy, adicionei as seguintes linhas:
discovery.relabel "temperature_sensor" {
targets = array.concat(
[{
__address__ = "localhost:8000",
}],
)
rule {
source_labels = ["__address__"]
target_label = "instance"
replacement = "temper"
}
}
prometheus.scrape "temperature_sensor" {
targets = discovery.relabel.temperature_sensor.output
forward_to = [prometheus.remote_write.prod.receiver]
job_name = "agent"
}
Tudo pronto.
Ou quase.
Falta rodar o monitor.py
que mostrei acima como serviço.
E pra isso usamos o systemd
.
Basta criar o arquivo /etc/systemd/system/temperature-monitor.service
e iniciar.
[Unit]
Description=Temperature monitoring service
After=network.target
[Service]
User=helio
Group=helio
WorkingDirectory=/home/helio/temperature-sensor
ExecStart=/home/helio/temperature-sensor/monitor.sh
Restart=always
[Install]
WantedBy=multi-user.target
O script monitor.sh
é pra somente ler o virtualenv corretamente:
#! /usr/bin/env bash
die() {
echo "ERROR: $@" >&2
echo "[$(date)] exiting with error"
exit 1
}
program="$0"
root_dir=$(readlink -f $program)
root_dir=$(dirname $root_dir)
cd $root_dir
source venv/bin/activate || \
die "failed to read virtualenv"
exec ./monitor.py
E iniciando o serviço:
> sudo systemctl daemon-reload
> sudo systemctl enable --now temperature-monitor
O que resta é criar um gráfico pra métrica server_room_temperature_celsius
e partir pro abraço.
Update: [Fri Sep 12 05:30:00 PM CEST 2025] acabo de perceber que o repositório que fiz fork é na verdade um fork de outro, que parece ser bem mais completo.
Eu tenho um laptop pessoal que é um Thinkpad T480. Escrevi sobre o mesmo aqui: entrei pra moda do laptop refurbished. Como não estou usando ele pra muita coisa e tenho também um Thinkpad pro trabalho, deixo o meu pra rodar o último Ubuntu.
E estava com o oneiric, 24.10, quando tentei fazer upgrade pro plucky, 25.04. E tive um belo dum crash no zfs.
------------[ cut here ]------------
WARNING: CPU: 0 PID: 227 at drivers/usb/typec/ucsi/ucsi.c:1390 ucsi_reset_ppm+0x1ad/0x1c0 [typec_ucsi]
Modules linked in: zfs(PO) spl(O) dm_crypt hid_multitouch hid_generic cdc_ncm cdc_ether usbnet uas mii usbhid hid usb_storage crct10dif_pclmul crc32_pclmul polyval_clmulni polyval_generic nvme ghash_clmulni_intel snd sha256_ssse3 soundcore sha1_ssse3 nvme_core e1000e video thunderbolt ucsi_acpi psmouse nvme_auth xhci_pci typec_ucsi typec xhci_pci_renesas sparse_keymap platform_profile wmi aesni_intel crypto_simd cryptd
CPU: 0 UID: 0 PID: 227 Comm: kworker/0:2 Tainted: P O 6.11.0-25-generic #25-Ubuntu
Tainted: [P]=PROPRIETARY_MODULE, [O]=OOT_MODULE
Hardware name: LENOVO 20L6S4G700/20L6S4G700, BIOS N24ET76W (1.51 ) 02/27/2024
Workqueue: events_long ucsi_init_work [typec_ucsi]
RIP: 0010:ucsi_reset_ppm+0x1ad/0x1c0 [typec_ucsi]
Code: ff 8b 55 bc 81 e2 00 00 00 08 0f 85 33 ff ff ff 4c 89 75 c8 48 8b 05 72 9d 4a cb 49 39 c5 79 94 b8 92 ff ff ff e9 19 ff ff ff <0f> 0b e9 57 ff ff ff e8 17 1b 17 ca 0f 1f 80 00 00 00 00 90 90 90
RSP: 0018:ffffba53c03a3d80 EFLAGS: 00010206
RAX: 0000000008000000 RBX: ffff9d0102192800 RCX: 0000000000000000
RDX: 00000000fffb83c0 RSI: 0000000000000000 RDI: 0000000000000000
RBP: ffffba53c03a3dd0 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: ffffba53c03a3d8c
R13: 00000000fffb83be R14: ffff9d0101a4fc00 R15: ffff9d01021928c0
FS: 0000000000000000(0000) GS:ffff9d0666200000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00005799b59ce675 CR3: 00000003afe3e004 CR4: 00000000003706f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
<TASK>
? show_trace_log_lvl+0x1be/0x310
? show_trace_log_lvl+0x1be/0x310
? ucsi_init+0x32/0x310 [typec_ucsi]
? show_regs.part.0+0x22/0x30
? show_regs.cold+0x8/0x10
? ucsi_reset_ppm+0x1ad/0x1c0 [typec_ucsi]
? __warn.cold+0xa7/0x101
? ucsi_reset_ppm+0x1ad/0x1c0 [typec_ucsi]
? report_bug+0x114/0x160
? handle_bug+0x6e/0xb0
? exc_invalid_op+0x18/0x80
? asm_exc_invalid_op+0x1b/0x20
? ucsi_reset_ppm+0x1ad/0x1c0 [typec_ucsi]
ucsi_init+0x32/0x310 [typec_ucsi]
ucsi_init_work+0x18/0x90 [typec_ucsi]
process_one_work+0x174/0x350
worker_thread+0x31a/0x450
? _raw_spin_lock_irqsave+0xe/0x20
? __pfx_worker_thread+0x10/0x10
kthread+0xe1/0x110
? __pfx_kthread+0x10/0x10
ret_from_fork+0x44/0x70
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
</TASK>
---[ endtrace 0000000000000000 ]---
WARNING: CPU: 0 PID: 978 at /build/linux-Ajk80v/linux-6.11.0/debian/build/build-generic/____________________________________________________________________________dkms/build/zfs/2.2.6/build/module/zfs/zfs_log.c:817 zfs_log_setsaxattr+0x140/0x150 [zfs]
Modules linked in: msr(+) parport_pc ppdev lp parport efi_pstore nfnetlink dmi_sysfs ip_tables x_tables autofs4 typec_displayport zfs(PO) spl(O) dm_crypt hid_multitouch hid_generic cdc_ncm cdc_ether usbnet uas mii usbhid hid usb_storage crct10dif_pclmul crc32_pclmul polyval_clmulni polyval_generic nvme ghash_clmulni_intel snd sha256_ssse3 soundcore sha1_ssse3 nvme_core e1000e video thunderbolt ucsi_acpi psmouse nvme_auth xhci_pci typec_ucsi typec xhci_pci_renesas sparse_keymap platform_profile wmi aesni_intel crypto_simd cryptd
CPU: 0 UID: 0 PID: 978 Comm: systemd-random- Tainted: P W O 6.11.0-25-generic #25-Ubuntu
Tainted: [P]=PROPRIETARY_MODULE, [W]=WARN, [O]=OOT_MODULE
Hardware name: LENOVO 20L6S4G700/20L6S4G700, BIOS N24ET76W (1.51 ) 02/27/2024
RIP: 0010:zfs_log_setsaxattr+0x140/0x150 [zfs]
Code: ff ff ff 31 c9 48 c7 c2 c0 94 e5 c0 4c 89 f6 4c 89 55 c0 48 c7 c7 68 8e e5 c0 4c 89 4d d0 c6 05 4a 50 13 00 01 e8 a0 c3 a9 c8 <0f> 0b 4c 8b 55 c0 4c 8b 4d d0 e9 30 ff ff ff 90 90 90 90 90 90 90
RSP: 0018:ffffba53c192f748 EFLAGS: 00010246
RAX: 0000000000000000 RBX: ffff9d0107f7bdb0 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
RBP: ffffba53c192f790 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: ffff9d011613e800
R13: ffff9d010b3499c0 R14: 000000000000001c R15: 0000000000000000
FS: 00007a57caef8980(0000) GS:ffff9d0666200000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007a57cbf071e0 CR3: 000000010a016003 CR4: 00000000003706f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
<TASK>
? show_trace_log_lvl+0x1be/0x310
? show_trace_log_lvl+0x1be/0x310
? zfs_sa_set_xattr+0x34a/0x3b0 [zfs]
? show_regs.part.0+0x22/0x30
? show_regs.cold+0x8/0x10
? zfs_log_setsaxattr+0x140/0x150 [zfs]
? __warn.cold+0xa7/0x101
? zfs_log_setsaxattr+0x140/0x150 [zfs]
? report_bug+0x114/0x160
? handle_bug+0x6e/0xb0
? exc_invalid_op+0x18/0x80
? asm_exc_invalid_op+0x1b/0x20
? zfs_log_setsaxattr+0x140/0x150 [zfs]
? zfs_log_setsaxattr+0x140/0x150 [zfs]
zfs_sa_set_xattr+0x34a/0x3b0 [zfs]
zpl_xattr_set_sa+0x102/0x200 [zfs]
zpl_xattr_set+0x21c/0x290 [zfs]
__zpl_xattr_user_set+0x128/0x170 [zfs]
zpl_xattr_user_set+0x22/0x40 [zfs]
__vfs_removexattr+0x81/0xd0
__vfs_removexattr_locked+0xe5/0x1a0
? touch_atime+0xbe/0x120
vfs_removexattr+0x59/0x110
__do_sys_fremovexattr+0x130/0x1c0
__x64_sys_fremovexattr+0x15/0x20
x64_sys_call+0x1fc7/0x22b0
do_syscall_64+0x7e/0x170
? filemap_map_pages+0x34f/0x570
? xa_load+0x73/0xb0
? do_read_fault+0xfd/0x200
? do_fault+0x183/0x210
? generic_file_llseek+0x24/0x40
? zpl_llseek+0x32/0xd0 [zfs]
? ksys_lseek+0x7d/0xd0
? syscall_exit_to_user_mode+0x4e/0x250
? do_syscall_64+0x8a/0x170
? __count_memcg_events+0x86/0x160
? count_memcg_events.constprop.0+0x2a/0x50
? handle_mm_fault+0x1bb/0x2d0
? do_user_addr_fault+0x5e9/0x7e0
? irqentry_exit_to_user_mode+0x43/0x250
? irqentry_exit+0x43/0x50
? exc_page_fault+0x96/0x1c0
entry_SYSCALL_64_after_hwframe+0x76/0x7e
RIP: 0033:0x7a57cba5d4eb
Code: 73 01 c3 48 8b 0d 0d 79 0e 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa b8 c7 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d dd 78 0e 00 f7 d8 64 89 01 48
RSP: 002b:00007ffe118d0498 EFLAGS: 00000246 ORIG_RAX: 00000000000000c7
RAX: ffffffffffffffda RBX: 0000000000000004 RCX: 00007a57cba5d4eb
RDX: 000000000000001a RSI: 00006015c386c08b RDI: 0000000000000005
RBP: 00007ffe118d05d0 R08: 00007a57cbb45b20 R09: 00000000000000c0
R10: 0000601603619fc0 R11: 0000000000000246 R12: 0000000000000005
R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000001
</TASK>
E ficava nisso.
Tinha de mandar um zfs rollback
nos volumes pra conseguir voltar a usar.
E tentar o upgrade novamente.
Depois de muito tentar, resolvi abrir um bug report no launchpad. Meu bug foi marcado como duplicado e passei então a interagir no bug onde o problema foi reportado primeiramente.
tl;dr: o bug era do zfs no kernel padrão que o plucky instala. A correção exige upgrade tanto do zfs quanto do kernel antes de ir pro upgrade do plucky.
Da primeira vez eu errei esse upgrade. E precisei recuperar o zfs pra voltar o snapshot.
E mais um problema já que não existe um procedimento bem descritivo de como fazer isso. Ou tem?
Sim tem. E mais de um.
Tive de recuperar algumas vezes o sistema. Então fiquei meio que craque em fazer isso. O esquema está abaixo:
root@ubuntu:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 squashfs 4.0 0 100% /rofs
loop1 squashfs 4.0
loop2 squashfs 4.0
loop3 squashfs 4.0 0 100% /snap/bare/5
loop4 squashfs 4.0 0 100% /snap/core22/1748
loop5 squashfs 4.0 0 100% /snap/firefox/5751
loop6 squashfs 4.0 0 100% /snap/firmware-updater/167
loop7 squashfs 4.0 0 100% /snap/gnome-42-2204/202
loop8 squashfs 4.0 0 100% /snap/gtk-common-themes/1535
loop9 squashfs 4.0 0 100% /snap/snap-store/1248
loop10 squashfs 4.0 0 100% /snap/thunderbird/644
loop11 squashfs 4.0 0 100% /snap/ubuntu-desktop-bootstrap/315
loop12 squashfs 4.0 0 100% /snap/snapd-desktop-integration/253
loop13 squashfs 4.0 0 100% /snap/snapd/23545
sda iso9660 Joliet Extension Ubuntu 24.04.2 LTS amd64 2025-02-15-09-15-26-00
├─sda1 iso9660 Joliet Extension Ubuntu 24.04.2 LTS amd64 2025-02-15-09-15-26-00 0 100% /cdrom
├─sda2 vfat FAT12 ESP B5A5-8010
├─sda3
└─sda4 ext4 1.0 writable 5729a291-83ad-4b15-91b1-09a17bfc9504 1.3G 4% /var/crash
/var/log
sdb
nvme0n1
├─nvme0n1p1 vfat FAT32 C399-15AF
├─nvme0n1p2 zfs_member 5000 bpool 4626876014803904226
├─nvme0n1p3
└─nvme0n1p4 zfs_member 5000 rpool 15334588309526604034
root@ubuntu:~# zpool import -f rpool
root@ubuntu:~# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
rpool 936G 365G 571G - - 6% 39% 1.00x ONLINE -
root@ubuntu:~# cryptsetup open /dev/zvol/rpool/keystore rpool-keystore
Enter passphrase for /dev/zvol/rpool/keystore:
root@ubuntu:~# mkdir /mnt-keystore
root@ubuntu:~# mount /dev/mapper/rpool-keystore /mnt-keystore
root@ubuntu:~# ls /mnt-keystore
lost+found system.key
root@ubuntu:~# cat /mnt-keystore/system.key | zfs load-key -L prompt rpool
root@ubuntu:~# umount /mnt-keystore
root@ubuntu:~# cryptsetup close rpool-keystore
root@ubuntu:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 365G 542G 192K /
rpool/ROOT 106G 542G 192K none
rpool/ROOT/ubuntu_ni6nkv 106G 542G 11.5G /mnt
rpool/ROOT/ubuntu_ni6nkv/srv 352K 542G 192K /mnt/srv
rpool/ROOT/ubuntu_ni6nkv/usr 7.96M 542G 192K /mnt/usr
rpool/ROOT/ubuntu_ni6nkv/usr/local 7.77M 542G 6.02M /mnt/usr/local
rpool/ROOT/ubuntu_ni6nkv/var 64.4G 542G 192K /mnt/var
rpool/ROOT/ubuntu_ni6nkv/var/games 272K 542G 192K /mnt/var/games
rpool/ROOT/ubuntu_ni6nkv/var/lib 60.0G 542G 24.2G /mnt/var/lib
rpool/ROOT/ubuntu_ni6nkv/var/lib/AccountsService 1.07M 542G 212K /mnt/var/lib/AccountsService
rpool/ROOT/ubuntu_ni6nkv/var/lib/NetworkManager 7.59M 542G 580K /mnt/var/lib/NetworkManager
rpool/ROOT/ubuntu_ni6nkv/var/lib/apt 388M 542G 103M /mnt/var/lib/apt
rpool/ROOT/ubuntu_ni6nkv/var/lib/dpkg 1.14G 542G 169M /mnt/var/lib/dpkg
rpool/ROOT/ubuntu_ni6nkv/var/log 261M 542G 92.7M /mnt/var/log
rpool/ROOT/ubuntu_ni6nkv/var/mail 272K 542G 192K /mnt/var/mail
rpool/ROOT/ubuntu_ni6nkv/var/snap 4.11G 542G 4.03G /mnt/var/snap
rpool/ROOT/ubuntu_ni6nkv/var/spool 10.6M 542G 468K /mnt/var/spool
rpool/ROOT/ubuntu_ni6nkv/var/www 55.3M 542G 55.1M /mnt/var/www
rpool/USERDATA 258G 542G 192K none
rpool/USERDATA/home_39e1h7 258G 542G 242G /home
rpool/USERDATA/root_39e1h7 58.8M 542G 28.4M /root
rpool/keystore 39.8M 542G 16.5M -
rpool/var 739M 542G 192K /var
rpool/var/lib 739M 542G 192K /var/lib
rpool/var/lib/docker 738M 542G 729M /var/lib/docker
root@ubuntu:~# zfs set mountpoint=/mnt rpool/ROOT/ubuntu_ni6nkv
root@ubuntu:~# zfs mount rpool/ROOT/ubuntu_ni6nkv
root@ubuntu:~# ls /mnt
bin boot cdrom dev etc home lib lib32 lib64 media mnt opt proc root run sbin snap srv sys tmp usr var
root@ubuntu:~# zpool import -N -R /mnt bpool
root@ubuntu:~# zfs mount bpool/BOOT/ubuntu_ni6nkv
root@ubuntu:~# ls /mnt/boot/
System.map-6.11.0-21-generic config-6.11.0-21-generic efi initrd.img-6.11.0-21-generic initrd.img.old memtest86+x64.bin vmlinuz-6.11.0-21-generic vmlinuz.old
System.map-6.11.0-24-generic config-6.11.0-24-generic grub initrd.img-6.11.0-24-generic memtest86+ia32.bin memtest86+x64.efi vmlinuz-6.11.0-24-generic
System.map-6.14.0-15-generic config-6.14.0-15-generic initrd.img initrd.img-6.14.0-15-generic memtest86+ia32.efi vmlinuz vmlinuz-6.14.0-15-generic
root@ubuntu:~# mount /dev/nvme0n1p1 /mnt/boot/efi/
root@ubuntu:~# ls /mnt/boot/efi/
EFI
root@ubuntu:~# for i in proc dev sys dev/pts; do mount -v --bind /$i /mnt/$i; done
mount: /proc bound on /mnt/proc.
mount: /dev bound on /mnt/dev.
mount: /sys bound on /mnt/sys.
mount: /dev/pts bound on /mnt/dev/pts.
root@ubuntu:~# zfs set mountpoint=/ rpool/ROOT/ubuntu_ni6nkv
Broadcast message from systemd-journald@ubuntu (Sat 2025-04-19 15:35:17 UTC):
systemd[1]: Caught , from our own process.
root@ubuntu:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
bpool 838M 953M 96K /mnt/boot
bpool/BOOT 833M 953M 96K none
bpool/BOOT/ubuntu_ni6nkv 833M 953M 295M /mnt/boot
rpool 365G 542G 192K /
rpool/ROOT 106G 542G 192K none
rpool/ROOT/ubuntu_ni6nkv 106G 542G 11.5G /
rpool/ROOT/ubuntu_ni6nkv/srv 352K 542G 192K /srv
rpool/ROOT/ubuntu_ni6nkv/usr 7.96M 542G 192K /usr
rpool/ROOT/ubuntu_ni6nkv/usr/local 7.77M 542G 6.02M /usr/local
rpool/ROOT/ubuntu_ni6nkv/var 64.4G 542G 192K /var
rpool/ROOT/ubuntu_ni6nkv/var/games 272K 542G 192K /var/games
rpool/ROOT/ubuntu_ni6nkv/var/lib 60.0G 542G 24.2G /var/lib
rpool/ROOT/ubuntu_ni6nkv/var/lib/AccountsService 1.07M 542G 212K /var/lib/AccountsService
rpool/ROOT/ubuntu_ni6nkv/var/lib/NetworkManager 7.59M 542G 580K /var/lib/NetworkManager
rpool/ROOT/ubuntu_ni6nkv/var/lib/apt 388M 542G 103M /var/lib/apt
rpool/ROOT/ubuntu_ni6nkv/var/lib/dpkg 1.14G 542G 169M /var/lib/dpkg
rpool/ROOT/ubuntu_ni6nkv/var/log 261M 542G 92.7M /var/log
rpool/ROOT/ubuntu_ni6nkv/var/mail 272K 542G 192K /var/mail
rpool/ROOT/ubuntu_ni6nkv/var/snap 4.11G 542G 4.03G /var/snap
rpool/ROOT/ubuntu_ni6nkv/var/spool 10.6M 542G 468K /var/spool
rpool/ROOT/ubuntu_ni6nkv/var/www 55.3M 542G 55.1M /var/www
rpool/USERDATA 258G 542G 192K none
rpool/USERDATA/home_39e1h7 258G 542G 242G /home
rpool/USERDATA/root_39e1h7 58.8M 542G 28.4M /root
rpool/keystore 39.8M 542G 16.5M -
rpool/var 739M 542G 192K /var
rpool/var/lib 739M 542G 192K /var/lib
rpool/var/lib/docker 738M 542G 729M /var/lib/docker
root@ubuntu:~# zfs set mountpoint=/boot bpool
root@ubuntu:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
bpool 838M 953M 96K /mnt/boot
bpool/BOOT 833M 953M 96K none
bpool/BOOT/ubuntu_ni6nkv 833M 953M 295M /mnt/boot
rpool 365G 542G 192K /
rpool/ROOT 106G 542G 192K none
rpool/ROOT/ubuntu_ni6nkv 106G 542G 11.5G /
rpool/ROOT/ubuntu_ni6nkv/srv 352K 542G 192K /srv
rpool/ROOT/ubuntu_ni6nkv/usr 7.96M 542G 192K /usr
rpool/ROOT/ubuntu_ni6nkv/usr/local 7.77M 542G 6.02M /usr/local
rpool/ROOT/ubuntu_ni6nkv/var 64.4G 542G 192K /var
rpool/ROOT/ubuntu_ni6nkv/var/games 272K 542G 192K /var/games
rpool/ROOT/ubuntu_ni6nkv/var/lib 60.0G 542G 24.2G /var/lib
rpool/ROOT/ubuntu_ni6nkv/var/lib/AccountsService 1.07M 542G 212K /var/lib/AccountsService
rpool/ROOT/ubuntu_ni6nkv/var/lib/NetworkManager 7.59M 542G 580K /var/lib/NetworkManager
rpool/ROOT/ubuntu_ni6nkv/var/lib/apt 388M 542G 103M /var/lib/apt
rpool/ROOT/ubuntu_ni6nkv/var/lib/dpkg 1.14G 542G 169M /var/lib/dpkg
rpool/ROOT/ubuntu_ni6nkv/var/log 261M 542G 92.7M /var/log
rpool/ROOT/ubuntu_ni6nkv/var/mail 272K 542G 192K /var/mail
rpool/ROOT/ubuntu_ni6nkv/var/snap 4.11G 542G 4.03G /var/snap
rpool/ROOT/ubuntu_ni6nkv/var/spool 10.6M 542G 468K /var/spool
rpool/ROOT/ubuntu_ni6nkv/var/www 55.3M 542G 55.1M /var/www
rpool/USERDATA 258G 542G 192K none
rpool/USERDATA/home_39e1h7 258G 542G 242G /home
rpool/USERDATA/root_39e1h7 58.8M 542G 28.4M /root
rpool/keystore 39.8M 542G 16.5M -
rpool/var 739M 542G 192K /var
rpool/var/lib 739M 542G 192K /var/lib
rpool/var/lib/docker 738M 542G 729M /var/lib/docker
No fim deu certo e consegui fazer upgrade pro plucky. Mas o problema ainda existe. Não sei se será um problema quando chegar a época de upgrade do 24.04.
Espero que não.
Sempre tenho renovado meus votos sobre o ano do Linux no desktop. E parece que dessa vez deu certo mesmo.
Sem nenhuma ligação com comunidades Linux ou software livre, o influenciador digital "PewDiePie", com milhões de seguidores, simplemente resolveu migrar e enaltecer o uso do Linux. E não pense que foi pouca coisa. O cara já meteu uma variante do archlinux com hyperland.
Simplesmente maravilhoso. Confira:
Se ainda existisse FISL, era certeza que o PewDiePie era o próximo keynote. Quem sabe não seja no FOSDEM?
Outro dia eu estava mexendo no meu perfil no KDE quando percebi a possibilidade de registrar as digitais pra fazer autenticação. Algo possível nos laptops da linha ThinkPad.
Configurei meus dois dedos indicadores e... nada. Simplesmente não funcionou.
Deixei isso pra lá. Afinal não era algo que eu queria tanto assim. Mas ficou aquele desgosto de ter falhado. E hoje eu resolvi pesquisar um pouco mais.
A dica pra resolver estava numa discussão do Linux Mint.
tl;dr: o daemon que cuida de tudo é o fingerd, que estava instalado.
Mas faltava rodar o comando pam-auth-update
e selecionar pra fazer a autenticação pelas digitais.
Feito isso, a autenticação passou a funcionar tanto pra desbloquear a interface gráfica quanto pro uso do sudo
.
E basta um ctrl+c
pra voltar pra usar a senha digitada pelo teclado.
Eu já tinha comentando que uso teclados da marca Keychron no artigo trabalhando de home-office - atualização de 2021 com teclado Keychron C1, mas o que eu não tinha descrito ainda é que acabei comprando mais de 1 teclado.
Como gostei bastante do teclado com switches brown, mais macios e menos barulhentos que o blue, eu queria experimentar os red. Encontrei uma promoção do modelo K1, wireless, por 70 USD. E com switches red. Só não tinha RGB e os switches eram fixos. Se eu comprasse somente os switches, uma vez que meu teclado C1 é swappable, eu gastaria 60 USD. Então por 10 USD a mais eu teria um teclado novo. E resolvi fechar a compra.
Quando fui apertar pra comprar... aparece uma promoção de um teclado C3 com switches red por 30 USD. A mão conçou, o escorpião no bolso não ficou feliz, mas fui lá e comprei esse outro teclado com a ideia de deixar ele no trabalho. E assim foram 100 USD em teclado que eu nem precisava. Mas isso fica pra outra estória.
Quando recebi os teclados novos, coloquei o K1 em casa e deixei o C3 no trabalho. Na época estava com um laptop da Apple. E tudo funcionava sem problemas.
O tempo passou, e as coisas mudaram. Mudei de emprego. E de laptop como consequência. Mas levei o C3 pra ficar no trabalho, de onde tirei essa foto. Só então percebi que a tecla de menu não funcionava no Linux. E fiquei sem funcionar uns 4 meses. Até que resolvi deixar de ser preguiçoso e corrigir. Achei o artigo abaixo que falava sobre esse teclado no Linux:
Que por sua vez apontava pra outro artigo:
Eu apliquei a solução proposta pra ter o programa pelo browser funcionando pra mapear as teclas.
❯ cat /etc/udev/rules.d/99-vial.rules
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="3434", ATTRS{idProduct}=="0430", M
ODE="0660", GROUP="users", TAG+="uaccess", TAG+="udev-acl"
Reiniciei o udev:
$ udevadm trigger
$ udevadm control --reload-rules
E o resultado ao reconectar o teclado:
Feb 13 13:37:47 thinkpadL14 kernel: usb 1-2.3: new full-speed USB device number 53 using xhci
_hcd
Feb 13 13:37:47 thinkpadL14 kernel: usb 1-2.3: New USB device found, idVendor=3434, idProduct
=0430, bcdDevice= 1.00
Feb 13 13:37:47 thinkpadL14 kernel: usb 1-2.3: New USB device strings: Mfr=1, Product=2, Seri
alNumber=0
Feb 13 13:37:47 thinkpadL14 kernel: usb 1-2.3: Product: Keychron C3 Pro
Feb 13 13:37:47 thinkpadL14 kernel: usb 1-2.3: Manufacturer: Keychron
Feb 13 13:37:47 thinkpadL14 kernel: input: Keychron Keychron C3 Pro as /devices/pci0000:00/00
00:00:14.0/usb1/1-2/1-2.3/1-2.3:1.0/0003:3434:0430.001E/input/input94
Feb 13 13:37:47 thinkpadL14 kernel: hid-generic 0003:3434:0430.001E: input,hidraw1: USB HID v
1.11 Keyboard [Keychron Keychron C3 Pro] on usb-0000:00:14.0-2.3/input0
Feb 13 13:37:47 thinkpadL14 kernel: hid-generic 0003:3434:0430.001F: hiddev0,hidraw2: USB HID
v1.11 Device [Keychron Keychron C3 Pro] on usb-0000:00:14.0-2.3/input1
Feb 13 13:37:47 thinkpadL14 kernel: input: Keychron Keychron C3 Pro Mouse as /devices/pci0000
:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3:1.2/0003:3434:0430.0020/input/input95
Feb 13 13:37:47 thinkpadL14 kernel: input: Keychron Keychron C3 Pro System Control as /device
s/pci0000:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3:1.2/0003:3434:0430.0020/input/input96
Feb 13 13:37:47 thinkpadL14 kernel: input: Keychron Keychron C3 Pro Consumer Control as /devi
ces/pci0000:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3:1.2/0003:3434:0430.0020/input/input97
Feb 13 13:37:47 silverhand kernel: input: Keychron Keychron C3 Pro Keyboard as /devices/pci0
000:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3:1.2/0003:3434:0430.0020/input/input98
Feb 13 13:37:47 thinkpadL14 kernel: hid-generic 0003:3434:0430.0020: input,hidraw3: USB HID v
1.11 Mouse [Keychron Keychron C3 Pro] on usb-0000:00:14.0-2.3/input2
Mas nada da tecla funcionar. Continuei lendo os posts até que achei esse aqui:
tl;dr: basicamente era só usar <Fn>+<Win/Ubuntu Key> pra voltar a ativar. Fácil assim. E agora tenho a tecla funcionando. E sim, eu coloquei um stickerzinho de Ubuntu em cima da tecla.