Jhonatan Pinheiro
Carregando página...
Jhonatan Pinheiro
Carregando página...
Jhonatan Pinheiro
Carregando página...
Performance e eBPF, kernel e sysctl, namespaces e cgroups, firewall, storage, rede, depuração com strace e perf, boot e recuperação: 200 comandos de produção.
Aqui o Linux deixa de ser "usar o terminal" e vira entender o que o sistema está fazendo: onde o tempo é gasto, por que a latência subiu, quem segurou o disco, o que o kernel decidiu e como recuperar uma máquina que não dá mais boot.
São 200 comandos de diagnóstico, ajuste e endurecimento — os que você usa em incidente, não em tutorial.
Aviso: boa parte destes comandos altera o comportamento do sistema. Teste em ambiente de homologação, entenda o efeito e tenha um caminho de volta antes de rodar em produção.
O método USE: para cada recurso, meça Utilização, Saturação e Erros.
A sequência que a Netflix popularizou para diagnosticar qualquer máquina lenta.
uptime
dmesg -T | tail
vmstat 1 5
mpstat -P ALL 1 3
pidstat 1 3
iostat -xz 1 3
free -m
sar -n DEV 1 3
topÉ a fila de processos esperando CPU e I/O. Compare sempre com o número de núcleos.
uptime
nproc
# load 8 em 8 núcleos = saturado; em 32, tranquiloVisão geral: processos, memória, swap, I/O e CPU. r alto = espera por CPU; b alto = espera por I/O.
vmstat 1Descobre CPU única saturada enquanto a média parece baixa.
mpstat -P ALL 1us usuário, sy kernel, wa espera de I/O, st roubo do hypervisor.
top -bn1 | head -5
# %st alto em nuvem = vizinho barulhentoCPU, memória e I/O de cada processo ao longo do tempo.
pidstat 1
pidstat -d 1 # I/O
pidstat -r 1 # memóriaDados coletados ao longo do dia: permite investigar incidente já encerrado.
sar -u 1 3 # CPU agora
sar -u -f /var/log/sysstat/sa10 # CPU do dia 10
sar -r -s 14:00 -e 15:00Latência e utilização de disco. await alto com %util em 100 é gargalo de I/O.
iostat -xz 1Quem está gerando I/O agora.
sudo iotop -oPaavailable é o que importa; free baixo com muito cache é normal e saudável.
free -m
cat /proc/meminfo | head -20Ordena por memória residente.
ps aux --sort=-%mem | head -10
ps -eo pid,comm,rss,vsz --sort=-rss | headPSS divide a memória compartilhada — muito mais honesto que o RSS.
smem -rs pss | head -15O que está mapeado e quanto ocupa.
pmap -x 12345 | tail -1
cat /proc/12345/status | grep -i vmO kernel usa RAM livre como cache — e devolve quando precisa.
free -h
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches # só para teste, nunca em produçãoLimite estourado derruba serviço com "too many open files".
ulimit -n
cat /proc/sys/fs/file-nr
ls /proc/12345/fd | wc -lNo systemd, o limits.conf não vale para serviços.
# /etc/security/limits.conf
app soft nofile 65535
app hard nofile 65535
# unit systemd
[Service]
LimitNOFILE=65535Muitos context switches indicam concorrência excessiva ou thrashing.
vmstat 1 | awk '{print $12, $13}'
pidstat -w 1Onde a CPU está sendo gasta, função por função, em tempo real.
sudo perf top
sudo perf top -p 12345Grava o perfil e analisa depois.
sudo perf record -F 99 -a -g -- sleep 30
sudo perf report --stdioTransforma o perfil em gráfico onde o gargalo salta aos olhos.
sudo perf record -F 99 -a -g -- sleep 30
sudo perf script | stackcollapse-perf.pl | flamegraph.pl > perfil.svgFerramentas eBPF que medem sem quase custo.
sudo biotop # I/O por processo
sudo execsnoop # cada exec do sistema
sudo opensnoop # cada openDistribuição da latência, não só a média.
sudo biolatency 10 1Mostra chamadas de sistema que passaram do limite.
sudo funcslower -u vfs_read 10000Reproduz o problema para validar a hipótese.
stress-ng --cpu 4 --timeout 60s
stress-ng --vm 2 --vm-bytes 1G --timeout 60sfio mede IOPS e latência de verdade.
fio --name=teste --rw=randread --bs=4k --size=1G --numjobs=4 --runtime=60 --group_reportingCPU, disco, rede e memória na mesma tela.
dstat -tcdngy 1Espera ininterrupta de I/O — não morrem nem com kill -9.
ps -eo pid,state,comm | awk '$2 == "D"'Processo morto que o pai não recolheu. O problema está no pai.
ps -eo pid,ppid,state,comm | awk '$3 == "Z"'Quando a máquina é compartilhada.
systemd-cgtop
docker stats --no-streamSem histórico, todo número parece anormal. Colete métrica contínua.
# habilite o sysstat para ter histórico
sudo systemctl enable --now sysstat
sar -u -f /var/log/sysstat/sa$(date +%d)Ajustar o comportamento do núcleo — com consciência do que cada número faz.
Interface para os parâmetros do kernel em tempo de execução.
sysctl -a | less
sysctl net.ipv4.ip_forward
sudo sysctl -w net.ipv4.ip_forward=1Arquivo em /etc/sysctl.d/ sobrevive ao reboot.
# /etc/sysctl.d/99-tuning.conf
net.core.somaxconn = 4096
vm.swappiness = 10
sudo sysctl --systemsomaxconn baixo derruba conexão em pico de tráfego.
sysctl net.core.somaxconn
sudo sysctl -w net.core.somaxconn=4096Servidor com muitas conexões curtas esgota portas efêmeras.
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.ip_local_port_range="10000 65535"Aumentar ajuda em link de alta latência e banda.
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216BBR costuma render mais que cubic em link com perda.
sysctl net.ipv4.tcp_congestion_control
sudo sysctl -w net.ipv4.tcp_congestion_control=bbrDefine se o kernel promete mais memória do que tem.
sysctl vm.overcommit_memory
# 0 heurístico | 1 sempre permite | 2 limita de verdadeProtege (ou sacrifica) um processo específico.
echo -1000 | sudo tee /proc/12345/oom_score_adj # quase imune
cat /proc/12345/oom_scoreControla quanto pode ficar em memória antes de ir para o disco.
sysctl vm.dirty_ratio vm.dirty_background_ratioLimite global do sistema.
sysctl kernel.pid_max
cat /proc/sys/kernel/threads-maxListar, carregar e remover.
lsmod
sudo modprobe nf_conntrack
sudo rmmod nome_modulo
modinfo nf_conntrackImpede o carregamento automático de driver indesejado.
# /etc/modprobe.d/blacklist-custom.conf
blacklist pcspkrVer o que foi passado ao kernel na inicialização.
cat /proc/cmdlineConfirma suporte a recurso antes de habilitar.
uname -r
grep CONFIG_BPF /boot/config-$(uname -r)Listar instalados e escolher o padrão do GRUB.
dpkg --list | grep linux-image
sudo grub-set-default 1
sudo update-grubBanco de dados costuma pedir para desligar.
cat /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabledperformance elimina a latência de mudança de frequência.
cpupower frequency-info
sudo cpupower frequency-set -g performanceEm servidor grande, memória do nó errado custa latência.
numactl --hardware
numactl --cpunodebind=0 --membind=0 ./programaPouca entropia trava geração de chave em VM.
cat /proc/sys/kernel/random/entropy_avail
sudo apt install haveged/proc e /sys são a fonte de quase toda métrica.
cat /proc/loadavg
cat /proc/stat | head -3
ls /sys/class/net/O que existe por baixo de todo container.
Cada link mostra em qual namespace ele está.
sudo ls -l /proc/12345/ns/Visão geral de todos os namespaces do sistema.
sudo lsns
sudo lsns -t netRoda um processo isolado, sem Docker nenhum.
sudo unshare --pid --fork --mount-proc bash
ps aux # só enxerga o próprio namespaceEntra no namespace de um container para depurar.
sudo nsenter -t 12345 -n ip a # rede do processo
sudo nsenter -t 12345 -m -u -i -n -p bashCria uma pilha de rede separada.
sudo ip netns add teste
sudo ip netns list
sudo ip netns exec teste ip aPar veth: o cabo virtual que o Docker usa.
sudo ip link add veth0 type veth peer name veth1
sudo ip link set veth1 netns teste
sudo ip addr add 10.0.0.1/24 dev veth0
sudo ip link set veth0 upOnde ficam os limites de recurso por grupo de processos.
cat /sys/fs/cgroup/cgroup.controllers
systemd-cglsLimite aplicado direto pelo kernel.
sudo mkdir /sys/fs/cgroup/meugrupo
echo 512M | sudo tee /sys/fs/cgroup/meugrupo/memory.max
echo 12345 | sudo tee /sys/fs/cgroup/meugrupo/cgroup.procsCota e período definem a fatia de CPU.
echo "50000 100000" | sudo tee /sys/fs/cgroup/meugrupo/cpu.max # 50% de um núcleoA forma prática de aplicar cgroup a um comando.
sudo systemd-run --scope -p MemoryMax=512M -p CPUQuota=50% ./tarefa-pesada.shDescobre a que container/serviço ele pertence.
cat /proc/12345/cgroupConsumo por cgroup: mostra qual serviço come a máquina.
systemd-cgtopPrivilégios granulares em vez do root inteiro.
getcap /usr/bin/ping
sudo setcap cap_net_bind_service=+ep /usr/local/bin/minha-api
capsh --printFiltra quais syscalls o processo pode chamar — base do isolamento de container.
grep Seccomp /proc/12345/status
docker run --security-opt seccomp=perfil.json minha-appTroca a raiz do sistema de arquivos. Isolamento fraco, mas útil em recuperação.
sudo chroot /mnt/sistema /bin/bashDo lado do host, container é processo comum.
sudo systemd-cgls /system.slice/docker-*.scope
ps -eo pid,comm,cgroup | grep dockerPonte entre o container e as ferramentas do host.
docker inspect -f '{{.State.Pid}}' meu-containerEntra nos namespaces dele com as ferramentas do host.
pid=$(docker inspect -f '{{.State.Pid}}' minha-app)
sudo nsenter -t $pid -n ss -tulpnO sistema de arquivos em camadas das imagens de container.
mount | grep overlay
sudo mount -t overlay overlay -o lowerdir=/base,upperdir=/mudancas,workdir=/trabalho /mnt/finalImpede fork bomb dentro de um serviço.
# unit systemd
[Service]
TasksMax=512Reduzir a superfície de ataque e detectar quando algo passou.
Sucessor do iptables. Sintaxe única para IPv4 e IPv6.
sudo nft list ruleset
sudo nft add table inet filtro
sudo nft add chain inet filtro entrada '{ type filter hook input priority 0; policy drop; }'Regra mínima de um servidor web.
sudo nft add rule inet filtro entrada ct state established,related accept
sudo nft add rule inet filtro entrada iif lo accept
sudo nft add rule inet filtro entrada tcp dport { 22, 80, 443 } acceptAinda onipresente em sistema legado.
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables-save > /etc/iptables/rules.v4Mitiga força bruta e flood na porta SSH.
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
-m limit --limit 3/min --limit-burst 3 -j ACCEPTTabela de conexões rastreadas — pode estourar em servidor movimentado.
sudo conntrack -L | wc -l
sysctl net.netfilter.nf_conntrack_maxA porta só abre depois de uma sequência de tentativas.
sudo apt install knockd
# /etc/knockd.conf define a sequênciaControle de acesso obrigatório do RHEL.
getenforce
sudo setenforce 0 # permissivo (temporário)
sestatusArquivo com contexto errado faz o serviço falhar sem erro claro.
ls -Z /var/www/html
sudo restorecon -Rv /var/www/html
sudo semanage fcontext -a -t httpd_sys_content_t "/dados(/.*)?"Descobre o que foi bloqueado e por quê.
sudo ausearch -m avc -ts recent
sudo sealert -a /var/log/audit/audit.logEquivalente do Ubuntu, baseado em caminho.
sudo aa-status
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginxRegistra acesso a arquivo e execução de comando.
sudo auditctl -w /etc/passwd -p wa -k senhas
sudo ausearch -k senhas
sudo aureport --summaryPorta de entrada clássica para escalada de privilégio.
sudo find / -perm -4000 -type f 2>/dev/null | sort > suid-hoje.txt
diff suid-base.txt suid-hoje.txtDetecta alteração em arquivo do sistema.
sudo aide --init
sudo aide --checkVarredura por rootkit conhecido.
sudo rkhunter --update && sudo rkhunter --check
sudo chkrootkitProcesso conversando com endereço estranho.
sudo ss -tnp state established
sudo lsof -i -n -P | grep ESTABLISHEDSinal forte de malware em memória.
sudo ls -l /proc/*/exe 2>/dev/null | grep deletedCifra a partição inteira em repouso.
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup open /dev/sdb1 dados
sudo mkfs.ext4 /dev/mapper/dadosTLS gratuito e renovação automática.
sudo certbot --nginx -d exemplo.com -d www.exemplo.com
sudo certbot renew --dry-runEvita a queda por certificado expirado.
echo | openssl s_client -connect exemplo.com:443 2>/dev/null | openssl x509 -noout -enddatePara certificado interno ou emissão manual.
openssl req -newkey rsa:4096 -nodes -keyout chave.pem -out pedido.csrBloqueia spoofing e redirecionamento indevido.
# /etc/sysctl.d/99-hardening.conf
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.tcp_syncookies = 1O que não roda não pode ser explorado.
systemctl list-unit-files --state=enabled
sudo systemctl disable --now avahi-daemonImpede executar binário a partir de área gravável por todos.
# /etc/fstab
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0Arquivo de credencial precisa de permissão restrita e dono correto.
sudo chown root:app /etc/app/segredos.env
sudo chmod 640 /etc/app/segredos.envA ordem importa: preserve evidência antes de limpar.
# 1. isole a máquina da rede (sem desligar)
# 2. copie logs e memória para outro host
# 3. identifique persistência: cron, systemd, authorized_keys, LD_PRELOAD
# 4. reinstale — máquina comprometida não se conserta com faxinaRAID, LVM, tuning de filesystem e o que fazer quando o disco vira o gargalo.
mdadm monta o array sem controladora dedicada.
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
cat /proc/mdstatAcompanhar sincronização e detectar disco degradado.
sudo mdadm --detail /dev/md0
watch cat /proc/mdstatMarca como falho, remove e adiciona o novo.
sudo mdadm /dev/md0 --fail /dev/sdb --remove /dev/sdb
sudo mdadm /dev/md0 --add /dev/sddMigra um volume para outro disco sem parar o serviço.
sudo pvmove /dev/sdb1 /dev/sdc1Usa um SSD como cache de um volume em disco mecânico.
sudo lvcreate --type cache --cachevol cache-lv -L 100G vg/dados-lvAloca sob demanda — cuidado para não estourar o pool.
sudo lvcreate -L 100G -T vg/pool
sudo lvcreate -V 500G -T vg/pool -n volume-finoReduz escrita desnecessária e reserva de espaço.
sudo tune2fs -m 1 /dev/sdb1 # reserva 1% em vez de 5%
sudo tune2fs -l /dev/sdb1 | head -20XFS só cresce (nunca encolhe) e repara com ferramenta própria.
sudo xfs_growfs /dados
sudo xfs_repair /dev/sdb1 # partição desmontadaSnapshot instantâneo e barato, no próprio filesystem.
sudo btrfs subvolume create /dados/sub
sudo btrfs subvolume snapshot /dados/sub /dados/snap-$(date +%F)Integridade por checksum, compressão e snapshot nativos.
sudo zpool create dados mirror /dev/sdb /dev/sdc
sudo zfs create dados/postgres
sudo zfs set compression=lz4 dados/postgresnone/mq-deadline para NVMe; bfq para desktop.
cat /sys/block/nvme0n1/queue/scheduler
echo none | sudo tee /sys/block/nvme0n1/queue/schedulerMantém a performance do SSD ao longo do tempo.
sudo fstrim -av
sudo systemctl enable --now fstrim.timerLatência por dispositivo, separada de leitura e escrita.
iostat -xz 1
sudo biolatency-bpfcc 10 1Desligar aumenta durabilidade e reduz desempenho — decisão consciente em banco.
sudo hdparm -W /dev/sda
sudo hdparm -W0 /dev/sdaCópia bit a bit. status=progress mostra o andamento.
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress conv=fsyncPare de escrever no disco imediatamente e trabalhe sobre uma imagem.
sudo ddrescue /dev/sdb imagem.img log.txt
sudo testdisk imagem.img
sudo photorec imagem.imgSobrescreve para impedir recuperação antes de descartar a mídia.
sudo shred -vfz -n 3 /dev/sdb
sudo blkdiscard /dev/nvme0n1 # SSDLimita o espaço por usuário ou grupo.
sudo quotacheck -cug /home
sudo edquota -u maria
sudo repquota -aDisco com espaço livre mas sem inodes: milhões de arquivos pequenos.
df -i
find /var -xdev -type f | cut -d/ -f2-3 | sort | uniq -c | sort -nr | headRemonta como leitura e escrita quando o sistema entra em modo protegido.
sudo mount -o remount,rw /Controlar tráfego, simular problema e diagnosticar o que o ping não mostra.
Limita banda de uma interface.
sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms
sudo tc qdisc show dev eth0Testa como a aplicação se comporta em rede ruim.
sudo tc qdisc add dev eth0 root netem delay 200ms loss 5%
sudo tc qdisc del dev eth0 rootAgrega links para redundância ou banda.
sudo modprobe bonding
sudo ip link add bond0 type bond mode active-backup
sudo ip link set eth0 master bond0Interface marcada com tag 802.1Q.
sudo ip link add link eth0 name eth0.100 type vlan id 100
sudo ip link set eth0.100 upComutador virtual — a base da rede de container e VM.
sudo ip link add br0 type bridge
sudo ip link set eth0 master br0
bridge link showCompartilha a conexão com uma rede interna.
sudo sysctl -w net.ipv4.ip_forward=1
sudo nft add rule ip nat postrouting oif eth0 masqueradeEscolhe a rota conforme a origem, não só o destino.
sudo ip rule add from 192.168.2.0/24 table 100
sudo ip route add default via 10.0.0.1 table 100
ip rule showMostra por quais regras o pacote passou.
sudo nft add rule inet filtro entrada tcp dport 8080 meta nftrace set 1
sudo nft monitor traceBPF na captura reduz ruído e custo.
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0 and not port 22' -nEstatística sem abrir o Wireshark.
tshark -r captura.pcap -q -z conv,tcp
tshark -r captura.pcap -Y "http.response.code >= 500"Sinal claro de perda de pacote no caminho.
netstat -s | grep -i retrans
ss -ti | grep -i retransRTT, janela e congestionamento por socket.
ss -tinConexão recusada mesmo com o serviço no ar.
ss -ltn # Send-Q é o backlog configurado
nstat -az TcpExtListenOverflowsMTU errado causa travamento intermitente difícil de diagnosticar.
ip link show eth0 | grep mtu
ping -M do -s 1472 destino # testa MTU 1500mtr combina ping e traceroute continuamente.
mtr -rw -c 100 exemplo.comSegue a cadeia desde os servidores raiz.
dig +trace exemplo.com
dig +short TXT exemplo.comDistribui conexões entre backends sem proxy dedicado.
sudo nft add rule ip nat prerouting tcp dport 80 dnat to numgen inc mod 2 map { 0 : 10.0.0.1, 1 : 10.0.0.2 }VPN moderna: simples, rápida e no kernel.
wg genkey | tee chave-privada | wg pubkey > chave-publica
sudo wg-quick up wg0
sudo wg showDiagnóstico de aplicação que usa multicast.
ip maddr show
netstat -gDesligar offload ajuda a diagnosticar captura estranha.
ethtool -k eth0
sudo ethtool -K eth0 gro off tso off
ethtool -S eth0 | grep -i dropQuando o log não basta e você precisa ver o que o processo está realmente fazendo.
Mostra cada chamada ao kernel. O comando que responde "onde ele travou?".
sudo strace -p 12345
strace -f ./programaSó as chamadas que interessam, com menos ruído.
sudo strace -p 12345 -e trace=openat,read,write
sudo strace -p 12345 -e trace=networkDescobre qual chamada está demorando.
sudo strace -p 12345 -T -tt
sudo strace -c -p 12345 # resumo por syscallO clássico: encontrar o ENOENT no strace.
strace -f -e trace=openat ./programa 2>&1 | grep ENOENTUm nível acima do strace.
ltrace ./programaAnexa ao processo e inspeciona a pilha.
sudo gdb -p 12345
(gdb) bt
(gdb) thread apply all bt
(gdb) detachHabilita e localiza o despejo de memória do processo que quebrou.
ulimit -c unlimited
cat /proc/sys/kernel/core_pattern
coredumpctl list
coredumpctl gdb 12345Onde o processo está parado dentro do kernel (estado D).
sudo cat /proc/12345/stack
sudo cat /proc/12345/wchanO diretório /proc/PID responde quase qualquer pergunta.
ls -l /proc/12345/cwd /proc/12345/exe
cat /proc/12345/environ | tr '\0' '\n'
cat /proc/12345/limitsDescobre socket, log e biblioteca em uso.
sudo lsof -p 12345
sudo ls -l /proc/12345/fdContador que só cresce indica fd não fechado.
watch -n 5 "ls /proc/12345/fd | wc -l"RSS crescendo sem parar; valgrind confirma a origem.
while true; do ps -o rss= -p 12345; sleep 60; done
valgrind --leak-check=full ./programaQual thread está consumindo CPU.
top -H -p 12345
ps -T -p 12345Enviar sinal específico — muitos daemons recarregam com SIGHUP.
kill -l
kill -HUP 12345
kill -USR1 12345Auditoria responde quando o serviço morre sem explicação.
sudo auditctl -a always,exit -F arch=b64 -S kill -k mata
sudo ausearch -k mataCada processo iniciado no sistema, com argumentos.
sudo execsnoop-bpfcc
sudo exitsnoop-bpfccDescobre acesso a arquivo em tempo real.
sudo opensnoop-bpfcc -p 12345Cada conexão estabelecida, com processo e destino.
sudo tcpconnect-bpfcc
sudo tcpretrans-bpfccLinguagem própria para instrumentar o kernel na hora.
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'Histograma de duração de uma syscall.
sudo bpftrace -e 'kprobe:vfs_read { @inicio[tid] = nsecs; } kretprobe:vfs_read /@inicio[tid]/ { @us = hist((nsecs - @inicio[tid]) / 1000); delete(@inicio[tid]); }'Rode o ExecStart à mão, com o mesmo usuário e ambiente.
systemctl cat minha-api
sudo -u app env $(cat /etc/minha-api/env | xargs) /usr/bin/node /opt/minha-api/server.jsElimina variável de ambiente como causa.
env -i /bin/bash --noprofile --norcDependência faltando é causa comum de "não executa".
ldd /usr/local/bin/programa
LD_DEBUG=libs ./programa 2>&1 | headRastreia a origem de um binário do sistema.
dpkg -S /usr/bin/curl
rpm -qf /usr/bin/curlQuando funciona em um servidor e não em outro, a diferença está em algum destes.
diff <(ssh srv1 'env | sort') <(ssh srv2 'env | sort')
diff <(ssh srv1 'dpkg -l | awk "{print \$2,\$3}"') <(ssh srv2 'dpkg -l | awk "{print \$2,\$3}"')O que fazer quando a máquina não sobe — e você só tem o console.
Entender a ordem é metade do diagnóstico.
# BIOS/UEFI -> bootloader (GRUB) -> kernel -> initramfs -> systemd -> alvo padrãoe no menu edita a linha do kernel para esta inicialização.
# adicione ao fim da linha "linux":
systemd.unit=rescue.target
# ou, em caso extremo:
init=/bin/bashSobem o mínimo para consertar o sistema.
sudo systemctl isolate rescue.target
sudo systemctl isolate emergency.targetConsertar bootloader a partir de um live CD.
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot/efi
for d in dev proc sys run; do sudo mount --bind /$d /mnt/$d; done
sudo chroot /mnt grub-install /dev/sda
sudo chroot /mnt update-grubNecessário após trocar driver de disco ou criptografia.
sudo update-initramfs -u -k all # Debian/Ubuntu
sudo dracut -f --regenerate-all # RHEL/FedoraConfere se o módulo necessário está lá dentro.
lsinitramfs /boot/initrd.img-$(uname -r) | grep -i nvmeLog do boot anterior mostra a última etapa.
journalctl -b -1 -p err
journalctl -b -1 | tail -50Impede que um serviço quebrado trave a inicialização.
sudo systemctl mask servico-problema
# ou, no GRUB: systemd.mask=servico-problema.servicePelo GRUB, com o sistema montado para escrita.
# na linha do kernel: rw init=/bin/bash
mount -o remount,rw /
passwd root
exec /sbin/initForça verificação do sistema de arquivos na próxima inicialização.
sudo touch /forcefsck
# ou na linha do kernel: fsck.mode=forceO kernel protege o disco ao detectar erro. Verifique antes de remontar.
dmesg -T | grep -i "read-only\|ext4-fs error"
sudo mount -o remount,rw /Kernel antigo acumulado impede atualização.
df -h /boot
sudo apt autoremove --purge
dpkg -l | grep linux-imageGerencia a ordem de inicialização pela firmware.
efibootmgr -v
sudo efibootmgr -o 0002,0001Com LVM ou Btrfs, dá para voltar atrás em minutos.
sudo lvcreate -L 10G -s -n antes-upgrade /dev/vg/root
# rollback: lvconvert --merge /dev/vg/antes-upgradeAcesso quando SSH e vídeo não respondem.
# na linha do kernel:
console=ttyS0,115200n8
sudo systemctl enable serial-getty@ttyS0.serviceGuarda o despejo do kernel após um panic para análise posterior.
sudo systemctl status kdump
ls /var/crash/Reinicia a máquina automaticamente se o kernel travar.
cat /proc/sys/kernel/watchdog
sudo systemctl status watchdogSistema de arquivo raiz imutável em appliance e edge.
# /etc/fstab
/dev/sda2 / ext4 ro,errors=remount-ro 0 1Executa outro comando para inspecionar o sistema de arquivos.
docker run -it --entrypoint sh minha-app:1.0
docker create --name tmp minha-app:1.0 && docker cp tmp:/app ./appReboot resolve — e também esconde a causa. Colete evidência antes.
# 1. salve dmesg, journalctl -b e ps aux
# 2. confirme que o serviço sobe no boot (systemctl is-enabled)
# 3. confira o fstab (mount -a) para não travar na volta
# 4. avise quem depende do sistemaFazer uma vez, repetir sempre igual — e deixar registrado.
Rodar duas vezes tem que dar o mesmo resultado. É o princípio de toda automação confiável.
# ruim: echo "linha" >> /etc/hosts
# bom:
grep -qxF "10.0.0.1 api" /etc/hosts || echo "10.0.0.1 api" | sudo tee -a /etc/hostsExecuta em muitas máquinas de uma vez, sem agente.
ansible todos -i inventario -m ping
ansible web -i inventario -a "systemctl status nginx" --becomeEstado desejado descrito em YAML.
- hosts: web
become: true
tasks:
- name: nginx instalado
apt: name=nginx state=present update_cache=yes
- name: nginx ativo
service: name=nginx state=started enabled=true--check mostra o que mudaria sem aplicar.
ansible-playbook site.yml --check --diffLaço simples quando não há ferramenta de configuração.
for host in web1 web2 web3; do
ssh "$host" "sudo systemctl restart minha-api" || echo "falhou em $host" >&2
doneMuito mais rápido em dezenas de servidores.
cat hosts.txt | xargs -P 10 -I{} ssh {} "uptime"O SSH cai e o processo continua. Indispensável em manutenção longa.
tmux new -s deploy
# Ctrl+B D desanexa
tmux attach -t deploy
tmux lsAlternativa clássica ao tmux.
screen -S manutencao
# Ctrl+A D desanexa
screen -r manutencaoscript grava tudo que aconteceu no terminal — ótimo para pós-mortem.
script -a incidente-$(date +%F).logNotifica quando a rotina falha, em vez de descobrir depois.
curl -s -X POST -H "Content-Type: application/json" \
-d '{"text":"Backup falhou em '"$(hostname)"'"}' "$WEBHOOK_URL"Sai com código diferente de zero para o monitoramento entender.
if ! curl -sf http://localhost:8080/health > /dev/null; then
logger -p user.err -t saude "API fora do ar"
exit 1
fiRede falha; script bom tenta de novo antes de desistir.
for tentativa in 1 2 3 4 5; do
curl -sf "$URL" && break
sleep $((2 ** tentativa))
doneBackup que não é testado não conta.
tar -czf backup.tar.gz /dados && tar -tzf backup.tar.gz > /dev/null \
&& echo "backup íntegro" || echo "backup corrompido" >&2Mantém os N mais recentes e apaga o resto.
ls -1t /backup/*.tar.gz | tail -n +8 | xargs -r rm --Cópia externa — a parte do 3-2-1 que salva de ransomware.
rclone sync /backup remoto:bucket/backup --progress
aws s3 sync /backup s3://meu-bucket/backupInventário automático vale mais que wiki desatualizada.
{
echo "== $(hostname) =="
uname -a; lsb_release -d
systemctl list-unit-files --state=enabled
ss -tulpn
} > inventario-$(hostname).txtAchar a diferença que explica o comportamento distinto.
for h in web1 web2; do ssh $h "md5sum /etc/nginx/nginx.conf"; doneHistórico de tudo que mudou na configuração do servidor.
cd /etc && sudo git init && sudo git add -A && sudo git commit -m "estado inicial"
# ou use o etckeeperSilencia alerta, avisa e limita o tempo da operação.
# 1. silencie o monitoramento
# 2. avise os interessados com antecedência
# 3. tenha rollback escrito e testado
# 4. defina o horário de aborto ("se às 4h não estiver de pé, voltamos")O objetivo é corrigir o sistema, não achar responsável. Registre linha do tempo, causa, impacto e ações.
# Template: o que aconteceu | quando detectamos | como mitigamos
# | causa raiz | por que não pegamos antes | o que muda a partir de agora