helio.loureiro.eng.br
  • Home
  • Unix
  • Linux
  • Blog
  • Python
  • Programação
  • Tudo
  • Suécia
  1. You are here:  
  2. Home
  3. Unix
  4. Linux

Os artigos mais lidos de 2024

  • linux-br.org num ritmo mais lento
  • Criando um serviço de relay de DNS-over-HTTPS
  • Minha palestra sobre a história do Unix na IX BSD Day
  • Pedal forte de 2023 em dados do Google
  • Linux vs GNU/Linux

Monitorando a temperatura da sala dos servidores

Details
Written by: Helio Loureiro
Category: Linux
Published: September 12, 2025
Hits: 147
  • grafana
  • alloy
  • temperature
  • temperatura

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.

https://thepihut.com/products/temper2-usb-dual-temperature-sensor

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.

Dados via python

Existe um software descrito na página do produto que aponta pro seguinte repositório no GitHub:

https://github.com/modmypi/temper

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.

https://github.com/helioloureiro/temper

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?

Exportando as métricas 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.

Serviço no systemd

  
[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.

https://github.com/urwen/temper

Problema com zfs no Ubuntu

Details
Written by: Helio Loureiro
Category: Linux
Published: August 15, 2025
Hits: 293
  • zfs

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.

https://bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+bug/2110891

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.

https://gist.github.com/faustinoaq/d267102dd004651801c13fae9d7973ec
https://toabctl.wordpress.com/2023/05/10/mounting-an-encrypted-zfs-filesystem/
https://develmonk.com/2022/05/20/mount-ubuntu-22-04-zfs-partitions-using-live-iso-for-disaster-recovery/

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.

O ano do Linux no desktop está acontecendo!

Details
Written by: Helio Loureiro
Category: Linux
Published: May 05, 2025
Hits: 621
  • migração
  • youtube
  • pewdiepie
  • influencer

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?

Autenticação por reconhecimento biométrico (leitura de digital)

Details
Written by: Helio Loureiro
Category: Linux
Published: March 07, 2025
Hits: 787
  • KDE
  • biometria
  • thinkpad
  • leitura de digitais
  • autenticação
  • fingerd

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.

https://forums.linuxmint.com/viewtopic.php?t=408129

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.

Configurando o teclado Keychron C3 no Linux

Details
Written by: Helio Loureiro
Category: Linux
Published: February 17, 2025
Hits: 937
  • teclado
  • keychron
  • c3
  • teclado mecânico

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:

https://www.reddit.com/r/Keychron/comments/144dj1c/keychronvia_support_and_linux/

Que por sua vez apontava pra outro artigo:

https://www.reddit.com/r/Keychron/comments/12f3gat/useviaapp_in_linux_ie_via_support_useful_for/

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:

https://www.reddit.com/r/Keychron/comments/179gp5d/comment/l0dndbf/?utm_source=share&utm_med ium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button

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.

  1. Aumentando o swap com zfs no Ubuntu 24.04
  2. Ferramentas modernas de Unix
  3. Estado dos processadores em termos de vulnerabilidade com Linux
  4. Melhorando a previsão do ano do Linux no desktop

Page 1 of 20

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Estatísticas

  • Users 2
  • Articles 468
  • Articles View Hits 3356563

Imagem aleatória