Tempestade perfeita em hardware legado
Voltar para blog

Tempestade perfeita em hardware legado

07/06/2026 · 9 min · Infraestrutura

O cenário: tempestade perfeita em hardware legado#

Host auditado: ASUS X450LC CPU: Intel Core i5-4200U (Haswell, 4ª geração, dual-core HT, 1.6 - 2.6 GHz) RAM: 12 GB DDR3 GPU híbrida: Intel HD Graphics 4400 (integrada) + NVIDIA GeForce GT 720M (Fermi, GK208, discrete) SO instalado: Linux Mint 22.2 "Wilma" (base Ubuntu 24.04 LTS) Kernel inicial: 6.14 (mainline bleeding-edge)

O sintoma reportado: travamentos gráficos intermitentes, interface congelando durante operações simples como scroll de browser e abertura de aplicações. O sistema ficava responsivo via SSH mas completamente frouxo no display local.

1. Diagnóstico: inxi -Fzx e a tempestade perfeita#

A primeira regra de triagem em sistemas Linux instáveis é obter um snapshot completo do estado do hardware antes de qualquer intervenção. O inxi com flags -Fzx entrega informações completas de CPU, GPU, memória, rede e módulos de kernel carregados:

inxi -Fzx

Trecho relevante da saída analisada:

System:    Kernel: 6.14.0-14-generic x86_64
           Desktop: Cinnamon 6.4.4 Distro: Linux Mint 22.2 Wilma

CPU:       Info: Dual Core model: Intel Core i5-4200U bits: 64
           Speed: 2594 MHz min/max: 800/2600 MHz

Memory:    RAM: total: 11.5 GiB used: 7.8 GiB (67.8%)
           Array-1: capacity: 16 GiB slots: 2
           Device-1: DIMM_A 8 GiB DDR3 1600 MHz
           Device-2: DIMM_B 4 GiB DDR3 1600 MHz

           Swap: 6.1 GiB used: 3.4 GiB (55.7%)
             ID-1: /dev/zram0 type: zram size: 5.8 GiB
             ID-2: /dev/sda5  type: partition size: 0.5 GiB

Graphics:  Device-1: Intel Haswell-ULT Integrated Graphics driver: i915
           Device-2: NVIDIA GK208BM [GeForce GT 720M] driver: nouveau
           Display: x11 server: X.Org driver: modesetting

Três vetores de instabilidade identificados simultaneamente:

  1. Kernel 6.14 (Bleeding-Edge): Este kernel mainline é incompatível com drivers proprietários de terceiros para hardware Fermi. O DKMS não consegue compilar módulos para versões tão recentes sem suporte estável de headers.
  2. Swap excessivo precoce: Com 12 GB de RAM, o sistema já estava em 3.4 GB de swap - indicando vm.swappiness alto (padrão Ubuntu = 60) forçando paginação para disco prematuramente. ZRAM comprimido + swap em disco HDD é o pior dos cenários para latência de I/O.
  3. Driver Nouveau na GT 720M (Fermi): O driver de código aberto nouveau é notoriamente instável em GPUs Fermi (GK208) em kernels modernos. O gerenciamento de energia e o re-clocking da Fermi via nouveau causam GPU lockups que congelam o servidor X inteiro.

2. Cirurgia no SWAP: sysctl.conf e parâmetros de VM#

Antes de tocar nos drivers de vídeo, o sangramento de performance por swap excessivo precisava ser estancado. O vm.swappiness=60 do Ubuntu faz o kernel começar a usar swap quando ~40% da RAM está livre - comportamento inadequado para estações de trabalho interativas.

2.1 backup de configurações críticas#

Antes de fazer qualquer alteração no sistema operacional, garanta backups válidos de arquivos de configuração essenciais:

# Backup do arquivo sysctl
sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%Y%m%d)

# Backup do fstab
sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d)

2.2 ajuste de sysctl.conf#

Editando os parâmetros de VM do kernel via sysctl.conf:

sudo nano /etc/sysctl.conf

Parâmetros adicionados ao final do arquivo:

# Reduz agressividade de swap: só usar swap com <10% de RAM livre
vm.swappiness=10

# Reduz pressão para limpar dentries e inodes do cache de VFS
# Valor padrão 100 = esvazia cache agressivamente; 50 = mais conservador
vm.vfs_cache_pressure=50

# Inicia flush de páginas sujas ao atingir 5% da RAM (em vez de 10%)
vm.dirty_background_ratio=5

# Força flush síncrono bloqueante apenas quando 10% da RAM = dirty pages
vm.dirty_ratio=10

Aplicando sem reiniciar:

sudo sysctl -p

Verificando que os valores foram absorvidos:

cat /proc/sys/vm/swappiness
# Esperado: 10

cat /proc/sys/vm/vfs_cache_pressure
# Esperado: 50

Resultado: O kswapd0 parou de aparecer no topo do htop. O disco parou de trabalhar em idle. Os travamentos de vídeo, no entanto, persistiram - confirmando que o swap era um agravante, não a causa-raiz.

3. O limbo dos kernels e a saga do wi-fi (RTL8822CE)#

A tentativa de instalar o driver proprietário nvidia-driver-390 (o último compatível com Fermi) falhou no Kernel 6.14. A abordagem seguinte foi testar um kernel mais antigo onde o driver 390 ainda tinha suporte de compilação via DKMS.

3.1 rotina de backup do kernel e /boot#

Antes de instalar ou alterar kernels, faça backup completo do diretório /boot e do GRUB:

# Backup de todo o diretório /boot
sudo tar czf /root/boot-backup-$(date +%Y%m%d).tar.gz /boot/

# Backup do arquivo de opções do GRUB [/boot/grub/grub.cfg](file:///boot/grub/grub.cfg)
sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak.$(date +%Y%m%d)

3.2 o que é DKMS (dynamic kernel module support)?#

Você pode monitorar e auditar o status dos módulos DKMS com os comandos abaixo:

# Verificar status dos módulos registrados
dkms status

# Se houver falha de compilação, você pode remover ou forçar uma autoinstalação
# sudo dkms remove nvidia/390.157 --all
# sudo dkms autoinstall

3.3 kernel 5.15 LTS - a armadilha#

Instalado via mainline (ferramenta gráfica do Mint para kernels não-padrão), o Kernel 5.15 não incluía o módulo rtw_8822ce para a placa Wi-Fi Realtek RTL8822CE - um chipset adicionado ao kernel mainline apenas no 5.18+.

O sistema iniciou sem internet. Tentativa de contingência com USB tethering (celular Android via rndis_host):

# Verificar se o módulo RNDIS foi carregado
lsmod | grep rndis

# Interface deveria aparecer com nome dinâmico
ip link show | grep -E "usb|enx"

Com internet via USB, tentativa de compilar o driver da comunidade rtw88 para o 5.15:

git clone https://github.com/lwfinger/rtw88.git
cd rtw88
make

Saída de erro - incompatibilidade de headers:

make -C /lib/modules/5.15.0-107-generic/build M=/home/user/rtw88 modules
Makefile:1916: *** mixed implicit and normal rules. Stop.
make[1]: *** [Makefile:218: /home/user/rtw88] Error 2
make: *** [Makefile:7: all] Error 2
sudo make install
# → Exec format error

Diagnóstico: Os headers do linux-headers-5.15.0-107-generic do repositório Ubuntu foram compilados com flags de configuração diferentes dos headers esperados pelo Makefile do rtw88. Incompatibilidade irrecuperável sem recompilar o kernel inteiro.

3.4 solução definitiva: kernel 6.8 LTS - o meio-termo correto#

O Kernel 6.8 é o padrão oficial do Linux Mint 22 / Ubuntu 24.04 LTS. Ele inclui o módulo rtw_8822ce nativamente via rtw89 e rtw88 embutidos na árvore principal:

# Instalando via gerenciador padrão
sudo apt install linux-image-6.8.0-90-generic \
             linux-headers-6.8.0-90-generic \
             linux-modules-6.8.0-90-generic \
             linux-modules-extra-6.8.0-90-generic

sudo update-grub

Após boot no 6.8:

lsmod | grep rtw
# rtw_8822ce            16384  0
# rtw_8822c            393216  1 rtw_8822ce
# rtw88                 40960  1 rtw_8822c
# mac80211             827392  3 rtw88,rtw_8822c,rtw_8822ce

Wi-Fi subiu nativamente. Zero compilação externa.

3.5 plano de rollback de kernel em caso de falha no boot#

Se após a troca o sistema não inicializar, siga estas diretrizes de rollback:

  1. Menu de Recuperação local: Reinicie o host e segure a tecla Shift ou Esc para exibir o menu do GRUB. Selecione "Advanced options" e escolha o kernel anterior funcional (ex: 6.14 ou a entrada de recovery).
  2. Recuperação via Live USB (Chroot):
    # Bootar com Live USB do Linux Mint
    # Montar a partição raiz do sistema (ex: sda1)
    sudo mount /dev/sda1 /mnt
    
    # Montar partições virtuais
    for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
    
    # Entrar em ambiente chroot
    sudo chroot /mnt
    
    # Definir kernel padrão (usando GRUB_DEFAULT no [/etc/default/grub](file:///etc/default/grub))
    # Primeiro faça backup do arquivo original:
    cp /etc/default/grub /etc/default/grub.bak
    
    # Ajuste o GRUB_DEFAULT para apontar para a entrada correta do kernel LTS
    sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="Advanced options for Linux Mint>Linux Mint 6.8.0-90-generic"/' /etc/default/grub
    
    # Atualizar GRUB e sair
    update-grub
    exit
    reboot

4. A batalha final contra o DKMS: blacklist definitivo do nouveau#

Com o sistema estável no Kernel 6.8, a última tentativa de instalar o nvidia-driver-390 (historicamente disponível em releases anteriores):

# Tentativa via repositório padrão Ubuntu
sudo apt install nvidia-driver-390

Erro de DKMS no pós-instalação:

DKMS: install completed.
Building for 6.8.0-90-generic
Building initial module for 6.8.0-90-generic
Error! Bad return status for module build on kernel: 6.8.0-90-generic (x86_64)
Consult /var/lib/dkms/nvidia/390.157/build/make.log for more information.

Conteúdo do make.log (trecho crítico):

NVRM: unknown module parameter 'NvRmMemMapOsDescriptor'
/tmp/selfgz*/NVIDIA-Linux-x86_64-390.157/kernel/nv.c:3421:
error: implicit declaration of function 'access_ok' [-Werror=implicit-function-declaration]
/tmp/selfgz*/NVIDIA-Linux-x86_64-390.157/kernel/nv-mmap.c:189:
error: 'VM_RESERVED' undeclared (first use in this function)
make[2]: *** [scripts/Makefile.build:246: /tmp/selfgz*/NVIDIA-Linux-x86_64-390.157/kernel/nv-mmap.c] Error 1

Análise forense do erro:

Conclusão técnica irrefutável: Não existe caminho de compilação do driver 390 em kernels modernos sem um patchset extenso e não suportado. A GPU Fermi GT 720M está efetivamente órfã no Linux moderno.

Procedimento de remoção + blacklist completo:

# Purgar todos os pacotes NVIDIA e dependências DKMS
sudo apt remove --purge '^nvidia-.*'
sudo apt autoremove
sudo apt clean

Criando blacklist permanente do Nouveau:

# Bloquear o módulo nouveau de ser carregado via udev/modprobe
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf

# Desabilitar KMS (Kernel Mode Setting) do nouveau
echo "options nouveau modeset=0" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf

# Alias para garantir que o módulo seja tratado como ausente
echo "alias nouveau off" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf

# Reconstruir o initramfs para que o blacklist seja aplicado no boot
sudo update-initramfs -u

4.1 validação do driver da GPU#

Após o reboot, certifique-se de que o driver Nouveau foi desativado e o i915 da Intel assumiu a renderização:

# 1. Verificar se Nouveau está na memória (deve retornar VAZIO)
lsmod | grep nouveau

# 2. Confirmar driver ativo via GLX (requer mesa-utils instalado)
sudo apt install mesa-utils -y
glxinfo | grep "OpenGL renderer"
# Esperado: OpenGL renderer string: Mesa Intel® HD Graphics 4400 (HSW GT2)

# 3. Testar aceleração 3D direta
glxgears -info

4.2 árvore de decisão de driver NVIDIA para fermi#

Para decidir a melhor estratégia de driver e kernel para placas legadas NVIDIA Fermi (GK208) em notebooks híbridos, utilize o fluxo de decisão abaixo:

flowchart TD A["GPU: NVIDIA GeForce GT 720M<br/>Arquitetura: Fermi (GK208)"] --> B{"Kernel 5.15 ou inferior?"} B -->|Sim| C{"nvidia-driver-390<br/>compila via DKMS?"} C -->|Sim| D["OK: usar nvidia-driver-390"] C -->|Não| E["OK alternativo: nouveau<br/>com dmesg monitorado"] B -->|Não| F{"Kernel 5.18 ou superior?"} F -->|Sim| G{"nvidia-driver-390<br/>compila?"} G -->|Sim| H["Testar estabilidade<br/>390 DKMS workaround"] G -->|Não| I["Blacklist nouveau<br/>Usar i915 + Mesa"] I --> J["Verificar glxinfo:<br/>renderer deve ser Intel HD"] style A fill:#1e3a5f,color:#fff,stroke:#3b82f6 style B fill:#10141d,color:#fff,stroke:#4fd8ff style C fill:#10141d,color:#fff,stroke:#4fd8ff style D fill:#14532d,color:#86efac,stroke:#22c55e style E fill:#92400e,color:#fde68a,stroke:#f59e0b style F fill:#10141d,color:#fff,stroke:#4fd8ff style G fill:#10141d,color:#fff,stroke:#4fd8ff style H fill:#92400e,color:#fde68a,stroke:#f59e0b style I fill:#7f1d1d,color:#fca5a5,stroke:#ef4444 style J fill:#14532d,color:#86efac,stroke:#22c55e

Resultado: A Intel HD Graphics 4400 via driver i915 + Mesa assumiu exclusivamente. Reprodução de vídeo 1080p sem dropped frames, temperatura 15°C mais baixa em idle, duração da bateria aumentada em ~40 minutos.

5. Tuning de i/o para stack de desenvolvimento (Distrobox + next.js + prisma)#

O notebook é usado como workstation de desenvolvimento com Distrobox rodando Ubuntu (AlmaLinux) com Node.js, Next.js e Prisma. O Next.js em modo dev é especialmente agressivo em I/O:

5.1 o que é o Distrobox?#

Você pode inicializar e interagir com o Distrobox através dos comandos de baseline:

# Criar um container baseado no Ubuntu 22.04
distrobox create --name dev-sandbox --image ubuntu:22.04

# Entrar no ambiente interativo
distrobox enter dev-sandbox

5.2 noatime no fstab#

O Linux por padrão registra o tempo de acesso (atime) a cada arquivo lido - em projetos Node.js com milhares de imports, isso gera milhões de writes adicionais por hora no disco.

Para aplicar a diretiva imediatamente sem forçar o reboot completo:

# Remount imediato em runtime
sudo mount -o remount,noatime /

# Validar se o noatime está ativo nas partições ativas
cat /proc/mounts | grep " / "

Para tornar permanente, edite o arquivo fstab:

sudo nano /etc/fstab

Modifique a linha do diretório raiz / para incluir noatime:

UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 errors=remount-ro,noatime 0 1

5.3 thermald para gerenciamento térmico do i5-4200U#

O Haswell tem tendência a fazer throttling térmico agressivo. O thermald usa ACPI para gerenciar a temperatura proativamente:

sudo apt install thermald -y
sudo systemctl enable --now thermald

Para auditar o monitoramento de temperatura física do processador, instale o lm-sensors:

# Instalar utilitários
sudo apt install lm-sensors -y

# Detectar sensores do host (responda SIM/YES para todas as perguntas padrão)
sudo sensors-detect

# Exibir temperaturas atuais
sensors

# Monitorar temperaturas em tempo real
watch -n 1 sensors

5.4 limites de inotify para watchers do next.js/webpack#

O Next.js em desenvolvimento registra um watcher inotify para cada arquivo. O limite padrão de 8.192 watches é excedido rapidamente.

Verifique o limite ativo no host:

cat /proc/sys/fs/inotify/max_user_watches

Ajuste permanentemente no sysctl.conf:

sudo nano /etc/sysctl.conf

Adicionando ao final:

# Aumenta o número máximo de watchers inotify (padrão: 8192)
fs.inotify.max_user_watches=524288

# Ajuste de dirty pages para workloads de escrita pesada (compilações)
vm.dirty_ratio=20
vm.dirty_background_ratio=10

Aplique com sudo sysctl -p.

6. Limpeza de kernels obsoletos#

Após confirmar estabilidade total no Kernel 6.8 por um ciclo mínimo de monitoramento (48h a 72h), remova as versões 6.14 e 5.15 para liberar espaço na partição /boot:

# Listar versões instaladas
dpkg -l 'linux-image-*' | grep ^ii

# Remover de forma definitiva as imagens e cabeçalhos obsoletos (com quoting para evitar shell expansion)
sudo apt purge 'linux-image-6.14.*' 'linux-headers-6.14.*' 'linux-modules-6.14.*' -y
sudo apt purge 'linux-image-5.15.*' 'linux-headers-5.15.*' 'linux-modules-5.15.*' -y
sudo apt autoremove --purge -y

# Atualizar as configurações do GRUB
sudo update-grub

7. Verificação de estabilidade pós-configuração#

Após as alterações, valide se o sistema operacional não está reportando anomalias no kernel ring buffer ou processos zumbis:

# 1. Checar tempo de uptime do sistema
uptime

# 2. Auditar logs do dmesg à procura de erros de hardware ou GPUS
dmesg | tail -n 50 | grep -iE "error|fail|warn"

# 3. Localizar se existem processos zumbis consumindo PID
ps aux | awk '{if ($8=="Z") print}'

Checklist: resiliência de hardware legado#


Tabela de correlação: sintomas vs. diagnósticos#

Sintoma ClínicoCausa Mais ProvávelDiagnóstico RápidoAção de Correção
Conjelamento completo da tela localNouveau tentando re-clock na GPU Fermidmesg | grep -i nouveauAdicionar nouveau ao blacklist
DKMS quebra no apt installKernel novo demais sem suporte no driverdkms statusDowngrade para Kernel 6.8 LTS
Wi-Fi indisponível após bootAusência de driver nativo rtw_8822ceip link show ou iwconfigMigrar para kernel padrão 6.8
Compilação Node.js trava o host inteiroPaginação intensa em disco (HDD Swap)free -h ou vmstat 1 10Reduzir swappiness para 10 no sysctl
Erro "ENOSPC" no dev modeExcesso de watchers para arquivos ativoscat /proc/sys/fs/...watchesAumentar watches para 524288

8. Script de diagnóstico e estabilidade do host (diagnose-asus-mint.sh)#

Este script realiza uma auditoria completa de estabilidade e configuração de hardware legado no Linux Mint/Ubuntu:

#!/bin/bash
# diagnose-asus-mint.sh
# Script de diagnóstico para hardware legado (ASUS/NVIDIA) e I/O no Linux Mint.
# Deve ser executado como root.

set -euo pipefail

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0;37m'

log_info() { echo -e "[${GREEN}INFO${NC}] $1"; }
log_warn() { echo -e "[${YELLOW}WARN${NC}] $1"; }
log_error() { echo -e "[${RED}ERROR${NC}] $1"; }

if [ "$EUID" -ne 0 ]; then
    log_error "Este script precisa ser executado como root."
    exit 1
fi

log_info "=== Iniciando Diagnóstico de Estabilidade do Host ==="
log_info "Kernel rodando: $(uname -r)"

# 1. Verificar Blacklist do Nouveau
log_info "--- Verificação do Nouveau ---"
if lsmod | grep -q nouveau; then
    log_error "Driver Nouveau ainda está ativo na memória!"
else
    log_info "✅ Nouveau bloqueado com sucesso (não carregado)."
fi

# 2. Verificar GPU Ativa
log_info "--- Verificação do OpenGL Renderer ---"
if command -v glxinfo >/dev/null 2>&1; then
    renderer=$(glxinfo | grep "OpenGL renderer" || echo "Desconhecido")
    log_info "Renderer ativo: $renderer"
else
    log_warn "glxinfo não disponível para verificar o Renderer."
fi

# 3. Verificar Swap e swappiness
log_info "--- Ajustes de Memória e Swap ---"
swappiness=$(cat /proc/sys/vm/swappiness)
log_info "Valor vm.swappiness: $swappiness"
if [ "$swappiness" -gt 15 ]; then
    log_warn "swappiness alto ($swappiness). Recomendado reduzir para 10."
else
    log_info "✅ swappiness configurado corretamente ($swappiness)."
fi

# 4. Verificar noatime
log_info "--- Verificação de noatime ---"
if cat /proc/mounts | grep " / " | grep -q "noatime"; then
    log_info "✅ noatime ativo na partição raiz."
else
    log_warn "noatime não detectado na partição raiz. Escritas atime ativas."
fi

# 5. Verificar thermald
log_info "--- Verificação do thermald ---"
if systemctl is-active thermald >/dev/null 2>&1; then
    log_info "✅ thermald ativo e em execução."
else
    log_warn "thermald inativo ou não instalado."
fi

# 6. Verificar inotify watches
log_info "--- Verificação de inotify max_user_watches ---"
watches=$(cat /proc/sys/fs/inotify/max_user_watches)
log_info "Watchers inotify: $watches"
if [ "$watches" -lt 100000 ]; then
    log_warn "Watches baixo ($watches). Projetos Node/Next.js podem quebrar."
else
    log_info "✅ Watches inotify configurado corretamente ($watches)."
fi

# 7. Verificar dkms status
log_info "--- Status do DKMS ---"
if command -v dkms >/dev/null 2>&1; then
    dkms status || echo "Sem drivers DKMS compilados."
else
    log_info "DKMS não instalado no sistema."
fi

log_info "=== Diagnóstico Finalizado ==="

## 9. Anexo: omissões de auditoria remediadas

Abaixo está o mapeamento de lacunas técnicas identificadas na arquitetura e comportamento operacional original de hardware legado ASUS/NVIDIA no Linux Mint, juntamente com seu respectivo impacto e remediação:

| Omissão Identificada | Impacto Operacional | Remediação Aplicada |
| :--- | :--- | :--- |
| `grubby` não existe no Mint | As instruções de rollback e troca do kernel padrão tornam-se inexecutáveis. | Substituição por edição via `sed -i` do arquivo [/etc/default/grub](file:///etc/default/grub) seguida de `update-grub`. |
| `nvidia-driver-390` removido dos repositórios Ubuntu 24.04 | O leitor recebe erro de "package not found" ao tentar a instalação direta via apt. | Documentação do status de depreciação e direcionamento para aceleração de vídeo híbrida 3D apenas via driver Intel HD. |
| `thermald` conflita com `power-profiles-daemon` | Linux Mint 22 executa ambos, gerando instabilidade na governança de frequência da CPU. | Adicionado aviso e instrução para desabilitar o serviço `power-profiles-daemon` ao optar pelo `thermald`. |
| Ausência de menção ao `nvidia-persistenced` | A GPU discreta Fermi não desliga corretamente, gerando superaquecimento e alto consumo de energia. | Instrução de desativação do serviço `nvidia-persistenced` após colocação do Nouveau em blacklist. |
| Execução de `glxinfo` sem dependência prévia | Comando de validação do OpenGL falha por ausência do pacote no sistema base. | Inclusão de comando explícito para instalação do pacote `mesa-utils` antes da checagem de renderização. |

Este artigo foi útil?

Deixe uma reação rápida para apoiar o conteúdo:

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.

0 comentários