Jhonatan Pinheiro
Cargando página...
Jhonatan Pinheiro
Cargando página...
Jhonatan Pinheiro
Cargando página...
Rendimiento y eBPF, kernel y sysctl, namespaces y cgroups, firewall, almacenamiento, red, depuración con strace y perf, arranque y recuperación: 200 comandos.
Aquí Linux deja de ser "usar la terminal" y pasa a ser entender qué está haciendo el sistema: dónde se gasta el tiempo, por qué subió la latencia, quién retuvo el disco, qué decidió el kernel y cómo recuperar una máquina que ya no arranca.
Son 200 comandos de diagnóstico, ajuste y endurecimiento — los que usas en un incidente, no en un tutorial.
Aviso: buena parte de estos comandos altera el comportamiento del sistema. Pruébalos en un entorno de preproducción, entiende su efecto y ten un camino de vuelta antes de ejecutarlos en producción.
El método USE: para cada recurso, mide Utilización, Saturación y Errores.
La secuencia que popularizó Netflix para diagnosticar cualquier 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
topEs la cola de procesos esperando CPU y E/S. Compáralo siempre con el número de núcleos.
uptime
nproc
# un load de 8 en 8 núcleos = saturado; en 32, tranquiloVisión general: procesos, memoria, swap, E/S y CPU. Una r alta = espera por CPU; una b alta = espera por E/S.
vmstat 1Descubre una CPU concreta saturada mientras la media parece baja.
mpstat -P ALL 1us usuario, sy kernel, wa espera de E/S, st robo del hipervisor.
top -bn1 | head -5
# un %st alto en la nube = un vecino ruidosoCPU, memoria y E/S de cada proceso a lo largo del tiempo.
pidstat 1
pidstat -d 1 # E/S
pidstat -r 1 # memoriaDatos recogidos a lo largo del día: permite investigar un incidente ya cerrado.
sar -u 1 3 # CPU ahora
sar -u -f /var/log/sysstat/sa10 # CPU del día 10
sar -r -s 14:00 -e 15:00Latencia y utilización del disco. Un await alto con el %util en 100 es un cuello de botella de E/S.
iostat -xz 1Quién está generando E/S ahora.
sudo iotop -oPaavailable es lo que importa; un free bajo con mucha caché es normal y saludable.
free -m
cat /proc/meminfo | head -20Ordena por memoria residente.
ps aux --sort=-%mem | head -10
ps -eo pid,comm,rss,vsz --sort=-rss | headEl PSS reparte la memoria compartida — mucho más honesto que el RSS.
smem -rs pss | head -15Qué está mapeado y cuánto ocupa.
pmap -x 12345 | tail -1
cat /proc/12345/status | grep -i vmEl kernel usa la RAM libre como caché — y la devuelve cuando la necesita.
free -h
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches # solo para pruebas, nunca en producciónUn límite desbordado tumba el servicio con "too many open files".
ulimit -n
cat /proc/sys/fs/file-nr
ls /proc/12345/fd | wc -lEn systemd, el limits.conf no vale para los servicios.
# /etc/security/limits.conf
app soft nofile 65535
app hard nofile 65535
# unit de systemd
[Service]
LimitNOFILE=65535Muchos context switches indican concurrencia excesiva o thrashing.
vmstat 1 | awk '{print $12, $13}'
pidstat -w 1Dónde se está gastando la CPU, función por función, en tiempo real.
sudo perf top
sudo perf top -p 12345Graba el perfil y lo analiza después.
sudo perf record -F 99 -a -g -- sleep 30
sudo perf report --stdioConvierte el perfil en un gráfico donde el cuello de botella salta a la vista.
sudo perf record -F 99 -a -g -- sleep 30
sudo perf script | stackcollapse-perf.pl | flamegraph.pl > perfil.svgHerramientas eBPF que miden casi sin coste.
sudo biotop # E/S por proceso
sudo execsnoop # cada exec del sistema
sudo opensnoop # cada openLa distribución de la latencia, no solo la media.
sudo biolatency 10 1Muestra las llamadas al sistema que pasaron de un umbral.
sudo funcslower -u vfs_read 10000Reproduce el problema para validar la hipótesis.
stress-ng --cpu 4 --timeout 60s
stress-ng --vm 2 --vm-bytes 1G --timeout 60sfio mide IOPS y latencia de verdad.
fio --name=teste --rw=randread --bs=4k --size=1G --numjobs=4 --runtime=60 --group_reportingCPU, disco, red y memoria en la misma pantalla.
dstat -tcdngy 1Espera ininterrumpible de E/S — no mueren ni con kill -9.
ps -eo pid,state,comm | awk '$2 == "D"'Un proceso muerto que el padre no recogió. El problema está en el padre.
ps -eo pid,ppid,state,comm | awk '$3 == "Z"'Cuando la máquina es compartida.
systemd-cgtop
docker stats --no-streamSin histórico, cualquier número parece anormal. Recoge métricas de forma continua.
# habilita sysstat para tener histórico
sudo systemctl enable --now sysstat
sar -u -f /var/log/sysstat/sa$(date +%d)Ajustar el comportamiento del núcleo — con conciencia de lo que hace cada número.
La interfaz con los parámetros del kernel en tiempo de ejecución.
sysctl -a | less
sysctl net.ipv4.ip_forward
sudo sysctl -w net.ipv4.ip_forward=1Un archivo en /etc/sysctl.d/ sobrevive al reinicio.
# /etc/sysctl.d/99-tuning.conf
net.core.somaxconn = 4096
vm.swappiness = 10
sudo sysctl --systemUn somaxconn bajo tira conexiones en un pico de tráfico.
sysctl net.core.somaxconn
sudo sysctl -w net.core.somaxconn=4096Un servidor con muchas conexiones cortas agota los puertos efímeros.
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.ip_local_port_range="10000 65535"Aumentarlos ayuda en un enlace de alta latencia y ancho de banda.
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216BBR suele rendir más que cubic en un enlace con pérdidas.
sysctl net.ipv4.tcp_congestion_control
sudo sysctl -w net.ipv4.tcp_congestion_control=bbrDefine si el kernel promete más memoria de la que tiene.
sysctl vm.overcommit_memory
# 0 heurístico | 1 siempre lo permite | 2 limita de verdadProtege (o sacrifica) un proceso concreto.
echo -1000 | sudo tee /proc/12345/oom_score_adj # casi inmune
cat /proc/12345/oom_scoreControla cuánto puede quedarse en memoria antes de ir al disco.
sysctl vm.dirty_ratio vm.dirty_background_ratioEl límite global del sistema.
sysctl kernel.pid_max
cat /proc/sys/kernel/threads-maxListar, cargar y quitar.
lsmod
sudo modprobe nf_conntrack
sudo rmmod nome_modulo
modinfo nf_conntrackImpide la carga automática de un driver indeseado.
# /etc/modprobe.d/blacklist-custom.conf
blacklist pcspkrVer lo que se le pasó al kernel en el inicio.
cat /proc/cmdlineConfirma el soporte de una función antes de habilitarla.
uname -r
grep CONFIG_BPF /boot/config-$(uname -r)Listar los instalados y elegir el predeterminado de GRUB.
dpkg --list | grep linux-image
sudo grub-set-default 1
sudo update-grubLas bases de datos suelen pedir que se desactiven.
cat /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabledperformance elimina la latencia del cambio de frecuencia.
cpupower frequency-info
sudo cpupower frequency-set -g performanceEn un servidor grande, la memoria del nodo equivocado cuesta latencia.
numactl --hardware
numactl --cpunodebind=0 --membind=0 ./programaPoca entropía bloquea la generación de claves en una VM.
cat /proc/sys/kernel/random/entropy_avail
sudo apt install haveged/proc y /sys son la fuente de casi todas las métricas.
cat /proc/loadavg
cat /proc/stat | head -3
ls /sys/class/net/Lo que existe por debajo de todo contenedor.
Cada enlace muestra en qué namespace está.
sudo ls -l /proc/12345/ns/Visión general de todos los namespaces del sistema.
sudo lsns
sudo lsns -t netEjecuta un proceso aislado, sin Docker de por medio.
sudo unshare --pid --fork --mount-proc bash
ps aux # solo ve su propio namespaceEntra en el namespace de un contenedor para depurarlo.
sudo nsenter -t 12345 -n ip a # la red del proceso
sudo nsenter -t 12345 -m -u -i -n -p bashCrea una pila de red separada.
sudo ip netns add teste
sudo ip netns list
sudo ip netns exec teste ip aUn par veth: el cable virtual que usa Docker.
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 upDonde están los límites de recursos por grupo de procesos.
cat /sys/fs/cgroup/cgroup.controllers
systemd-cglsUn límite aplicado directamente por el 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.procsLa cuota y el periodo definen la porción de CPU.
echo "50000 100000" | sudo tee /sys/fs/cgroup/meugrupo/cpu.max # 50% de un núcleoLa forma práctica de aplicar un cgroup a un comando.
sudo systemd-run --scope -p MemoryMax=512M -p CPUQuota=50% ./tarefa-pesada.shDescubre a qué contenedor/servicio pertenece.
cat /proc/12345/cgroupConsumo por cgroup: muestra qué servicio se está comiendo la máquina.
systemd-cgtopPrivilegios granulares en lugar del root entero.
getcap /usr/bin/ping
sudo setcap cap_net_bind_service=+ep /usr/local/bin/minha-api
capsh --printFiltra qué syscalls puede llamar el proceso — la base del aislamiento de contenedores.
grep Seccomp /proc/12345/status
docker run --security-opt seccomp=perfil.json minha-appCambia la raíz del sistema de archivos. Aislamiento débil, pero útil en una recuperación.
sudo chroot /mnt/sistema /bin/bashDesde el lado del host, un contenedor es un proceso corriente.
sudo systemd-cgls /system.slice/docker-*.scope
ps -eo pid,comm,cgroup | grep dockerEl puente entre el contenedor y las herramientas del host.
docker inspect -f '{{.State.Pid}}' meu-containerEntra en sus namespaces con las herramientas del host.
pid=$(docker inspect -f '{{.State.Pid}}' minha-app)
sudo nsenter -t $pid -n ss -tulpnEl sistema de archivos por capas de las imágenes de contenedor.
mount | grep overlay
sudo mount -t overlay overlay -o lowerdir=/base,upperdir=/mudancas,workdir=/trabalho /mnt/finalImpide una fork bomb dentro de un servicio.
# unit de systemd
[Service]
TasksMax=512Reducir la superficie de ataque y detectar cuándo algo ha pasado.
El sucesor de iptables. Una sintaxis ú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; }'El conjunto mínimo de reglas de un 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 } acceptTodavía omnipresente en sistemas heredados.
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables-save > /etc/iptables/rules.v4Mitiga la fuerza bruta y el flood en el puerto SSH.
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
-m limit --limit 3/min --limit-burst 3 -j ACCEPTLa tabla de conexiones rastreadas — puede desbordarse en un servidor con mucho movimiento.
sudo conntrack -L | wc -l
sysctl net.netfilter.nf_conntrack_maxEl puerto solo se abre tras una secuencia de intentos.
sudo apt install knockd
# /etc/knockd.conf define la secuenciaEl control de acceso obligatorio de RHEL.
getenforce
sudo setenforce 0 # permisivo (temporal)
sestatusUn archivo con el contexto equivocado hace que el servicio falle sin un error claro.
ls -Z /var/www/html
sudo restorecon -Rv /var/www/html
sudo semanage fcontext -a -t httpd_sys_content_t "/dados(/.*)?"Descubre qué se bloqueó y por qué.
sudo ausearch -m avc -ts recent
sudo sealert -a /var/log/audit/audit.logEl equivalente de Ubuntu, basado en rutas.
sudo aa-status
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginxRegistra el acceso a archivos y la ejecución de comandos.
sudo auditctl -w /etc/passwd -p wa -k senhas
sudo ausearch -k senhas
sudo aureport --summaryLa puerta de entrada clásica para la escalada de privilegios.
sudo find / -perm -4000 -type f 2>/dev/null | sort > suid-hoje.txt
diff suid-base.txt suid-hoje.txtDetecta un cambio en un archivo del sistema.
sudo aide --init
sudo aide --checkUn escaneo en busca de rootkits conocidos.
sudo rkhunter --update && sudo rkhunter --check
sudo chkrootkitUn proceso hablando con una dirección extraña.
sudo ss -tnp state established
sudo lsof -i -n -P | grep ESTABLISHEDUna señal fuerte de malware en memoria.
sudo ls -l /proc/*/exe 2>/dev/null | grep deletedCifra la partición entera en reposo.
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup open /dev/sdb1 dados
sudo mkfs.ext4 /dev/mapper/dadosTLS gratuito y renovación automática.
sudo certbot --nginx -d exemplo.com -d www.exemplo.com
sudo certbot renew --dry-runEvita la caída por un certificado caducado.
echo | openssl s_client -connect exemplo.com:443 2>/dev/null | openssl x509 -noout -enddatePara un certificado interno o una emisión manual.
openssl req -newkey rsa:4096 -nodes -keyout chave.pem -out pedido.csrBloquea el spoofing y la redirección indebida.
# /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 = 1Lo que no se ejecuta no se puede explotar.
systemctl list-unit-files --state=enabled
sudo systemctl disable --now avahi-daemonImpide ejecutar un binario desde un área escribible por todos.
# /etc/fstab
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0Un archivo de credenciales necesita permisos restringidos y el dueño correcto.
sudo chown root:app /etc/app/segredos.env
sudo chmod 640 /etc/app/segredos.envEl orden importa: preserva la evidencia antes de limpiar.
# 1. aísla la máquina de la red (sin apagarla)
# 2. copia los logs y la memoria a otro host
# 3. identifica la persistencia: cron, systemd, authorized_keys, LD_PRELOAD
# 4. reinstala — una máquina comprometida no se arregla con una limpiezaRAID, LVM, tuning del filesystem y qué hacer cuando el disco se convierte en el cuello de botella.
mdadm monta el array sin una controladora dedicada.
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
cat /proc/mdstatSeguir la sincronización y detectar un disco degradado.
sudo mdadm --detail /dev/md0
watch cat /proc/mdstatMárcalo como fallido, quítalo y añade el nuevo.
sudo mdadm /dev/md0 --fail /dev/sdb --remove /dev/sdb
sudo mdadm /dev/md0 --add /dev/sddMigra un volumen a otro disco sin parar el servicio.
sudo pvmove /dev/sdb1 /dev/sdc1Usa un SSD como caché de un volumen en disco mecánico.
sudo lvcreate --type cache --cachevol cache-lv -L 100G vg/dados-lvAsigna bajo demanda — cuidado con desbordar el pool.
sudo lvcreate -L 100G -T vg/pool
sudo lvcreate -V 500G -T vg/pool -n volume-finoReduce la escritura innecesaria y la reserva de espacio.
sudo tune2fs -m 1 /dev/sdb1 # reserva el 1% en lugar del 5%
sudo tune2fs -l /dev/sdb1 | head -20XFS solo crece (nunca encoge) y se repara con su propia herramienta.
sudo xfs_growfs /dados
sudo xfs_repair /dev/sdb1 # partición desmontadaUn snapshot instantáneo y barato, en el propio filesystem.
sudo btrfs subvolume create /dados/sub
sudo btrfs subvolume snapshot /dados/sub /dados/snap-$(date +%F)Integridad por checksum, compresión y snapshots 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 escritorio.
cat /sys/block/nvme0n1/queue/scheduler
echo none | sudo tee /sys/block/nvme0n1/queue/schedulerMantiene el rendimiento del SSD a lo largo del tiempo.
sudo fstrim -av
sudo systemctl enable --now fstrim.timerLatencia por dispositivo, separada entre lectura y escritura.
iostat -xz 1
sudo biolatency-bpfcc 10 1Desactivarla aumenta la durabilidad y reduce el rendimiento — una decisión consciente en una base de datos.
sudo hdparm -W /dev/sda
sudo hdparm -W0 /dev/sdaUna copia bit a bit. status=progress muestra el avance.
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress conv=fsyncDeja de escribir en el disco de inmediato y trabaja sobre una imagen.
sudo ddrescue /dev/sdb imagem.img log.txt
sudo testdisk imagem.img
sudo photorec imagem.imgSobrescribe para impedir la recuperación antes de descartar el medio.
sudo shred -vfz -n 3 /dev/sdb
sudo blkdiscard /dev/nvme0n1 # SSDLimita el espacio por usuario o por grupo.
sudo quotacheck -cug /home
sudo edquota -u maria
sudo repquota -aUn disco con espacio libre pero sin inodos: millones de archivos pequeños.
df -i
find /var -xdev -type f | cut -d/ -f2-3 | sort | uniq -c | sort -nr | headVuelve a montar como lectura y escritura cuando el sistema entra en modo protegido.
sudo mount -o remount,rw /Controlar el tráfico, simular un problema y diagnosticar lo que el ping no muestra.
Limita el ancho de banda de una interfaz.
sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms
sudo tc qdisc show dev eth0Prueba cómo se comporta la aplicación en una red mala.
sudo tc qdisc add dev eth0 root netem delay 200ms loss 5%
sudo tc qdisc del dev eth0 rootAgrega enlaces para redundancia o ancho de banda.
sudo modprobe bonding
sudo ip link add bond0 type bond mode active-backup
sudo ip link set eth0 master bond0Una interfaz marcada con la etiqueta 802.1Q.
sudo ip link add link eth0 name eth0.100 type vlan id 100
sudo ip link set eth0.100 upUn conmutador virtual — la base de la red de contenedores y VM.
sudo ip link add br0 type bridge
sudo ip link set eth0 master br0
bridge link showComparte la conexión con una red interna.
sudo sysctl -w net.ipv4.ip_forward=1
sudo nft add rule ip nat postrouting oif eth0 masqueradeElige la ruta según el origen, no solo el 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 showMuestra por qué reglas pasó el paquete.
sudo nft add rule inet filtro entrada tcp dport 8080 meta nftrace set 1
sudo nft monitor traceEl BPF en la captura reduce el ruido y el coste.
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0 and not port 22' -nEstadísticas sin abrir Wireshark.
tshark -r captura.pcap -q -z conv,tcp
tshark -r captura.pcap -Y "http.response.code >= 500"Una señal clara de pérdida de paquetes en el camino.
netstat -s | grep -i retrans
ss -ti | grep -i retransRTT, ventana y congestión por socket.
ss -tinConexión rechazada aun con el servicio levantado.
ss -ltn # Send-Q es el backlog configurado
nstat -az TcpExtListenOverflowsUn MTU equivocado provoca un bloqueo intermitente difícil de diagnosticar.
ip link show eth0 | grep mtu
ping -M do -s 1472 destino # prueba el MTU 1500mtr combina ping y traceroute de forma continua.
mtr -rw -c 100 exemplo.comSigue la cadena desde los servidores raíz.
dig +trace exemplo.com
dig +short TXT exemplo.comDistribuye las conexiones entre backends sin un 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 }Una VPN moderna: sencilla, rápida y en el kernel.
wg genkey | tee chave-privada | wg pubkey > chave-publica
sudo wg-quick up wg0
sudo wg showDiagnóstico de una aplicación que usa multicast.
ip maddr show
netstat -gDesactivar el offload ayuda a diagnosticar una captura extraña.
ethtool -k eth0
sudo ethtool -K eth0 gro off tso off
ethtool -S eth0 | grep -i dropCuando el log no basta y necesitas ver qué está haciendo realmente el proceso.
Muestra cada llamada al kernel. El comando que responde "¿dónde se quedó colgado?".
sudo strace -p 12345
strace -f ./programaSolo las llamadas que interesan, con menos ruido.
sudo strace -p 12345 -e trace=openat,read,write
sudo strace -p 12345 -e trace=networkDescubre qué llamada está tardando.
sudo strace -p 12345 -T -tt
sudo strace -c -p 12345 # resumen por syscallEl clásico: encontrar el ENOENT en el strace.
strace -f -e trace=openat ./programa 2>&1 | grep ENOENTUn nivel por encima de strace.
ltrace ./programaSe engancha al proceso e inspecciona la pila.
sudo gdb -p 12345
(gdb) bt
(gdb) thread apply all bt
(gdb) detachHabilita y localiza el volcado de memoria del proceso que se rompió.
ulimit -c unlimited
cat /proc/sys/kernel/core_pattern
coredumpctl list
coredumpctl gdb 12345Dónde está parado el proceso dentro del kernel (estado D).
sudo cat /proc/12345/stack
sudo cat /proc/12345/wchanEl directorio /proc/PID responde casi cualquier pregunta.
ls -l /proc/12345/cwd /proc/12345/exe
cat /proc/12345/environ | tr '\0' '\n'
cat /proc/12345/limitsDescubre el socket, el log y la biblioteca en uso.
sudo lsof -p 12345
sudo ls -l /proc/12345/fdUn contador que solo crece indica un fd que no se cierra.
watch -n 5 "ls /proc/12345/fd | wc -l"El RSS creciendo sin parar; valgrind confirma el origen.
while true; do ps -o rss= -p 12345; sleep 60; done
valgrind --leak-check=full ./programaQué hilo está consumiendo CPU.
top -H -p 12345
ps -T -p 12345Enviar una señal concreta — muchos demonios recargan con SIGHUP.
kill -l
kill -HUP 12345
kill -USR1 12345La auditoría responde cuando el servicio muere sin explicación.
sudo auditctl -a always,exit -F arch=b64 -S kill -k mata
sudo ausearch -k mataCada proceso iniciado en el sistema, con sus argumentos.
sudo execsnoop-bpfcc
sudo exitsnoop-bpfccDescubre el acceso a archivos en tiempo real.
sudo opensnoop-bpfcc -p 12345Cada conexión establecida, con el proceso y el destino.
sudo tcpconnect-bpfcc
sudo tcpretrans-bpfccUn lenguaje propio para instrumentar el kernel al momento.
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'Un histograma de la duración de una syscall.
sudo bpftrace -e 'kprobe:vfs_read { @inicio[tid] = nsecs; } kretprobe:vfs_read /@inicio[tid]/ { @us = hist((nsecs - @inicio[tid]) / 1000); delete(@inicio[tid]); }'Ejecuta el ExecStart a mano, con el mismo usuario y entorno.
systemctl cat minha-api
sudo -u app env $(cat /etc/minha-api/env | xargs) /usr/bin/node /opt/minha-api/server.jsDescarta una variable de entorno como causa.
env -i /bin/bash --noprofile --norcUna dependencia que falta es una causa común de "no se ejecuta".
ldd /usr/local/bin/programa
LD_DEBUG=libs ./programa 2>&1 | headRastrea el origen de un binario del sistema.
dpkg -S /usr/bin/curl
rpm -qf /usr/bin/curlCuando funciona en un servidor y no en otro, la diferencia está en alguno de estos.
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}"')Qué hacer cuando la máquina no levanta — y solo tienes la consola.
Entender el orden es la mitad del diagnóstico.
# BIOS/UEFI -> gestor de arranque (GRUB) -> kernel -> initramfs -> systemd -> target por defectoe en el menú edita la línea del kernel para este inicio.
# añade al final de la línea "linux":
systemd.unit=rescue.target
# o, en un caso extremo:
init=/bin/bashLevantan lo mínimo para arreglar el sistema.
sudo systemctl isolate rescue.target
sudo systemctl isolate emergency.targetArreglar el gestor de arranque desde un 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-grubNecesario tras cambiar el driver de disco o el cifrado.
sudo update-initramfs -u -k all # Debian/Ubuntu
sudo dracut -f --regenerate-all # RHEL/FedoraComprueba si el módulo necesario está ahí dentro.
lsinitramfs /boot/initrd.img-$(uname -r) | grep -i nvmeEl log del arranque anterior muestra el último paso.
journalctl -b -1 -p err
journalctl -b -1 | tail -50Impide que un servicio roto bloquee el inicio.
sudo systemctl mask servico-problema
# o, en GRUB: systemd.mask=servico-problema.servicePor GRUB, con el sistema montado para escritura.
# en la línea del kernel: rw init=/bin/bash
mount -o remount,rw /
passwd root
exec /sbin/initFuerza la verificación del sistema de archivos en el siguiente inicio.
sudo touch /forcefsck
# o en la línea del kernel: fsck.mode=forceEl kernel protege el disco al detectar un error. Comprueba antes de volver a montar.
dmesg -T | grep -i "read-only\|ext4-fs error"
sudo mount -o remount,rw /Kernels antiguos acumulados impiden una actualización.
df -h /boot
sudo apt autoremove --purge
dpkg -l | grep linux-imageGestiona el orden de inicio desde el firmware.
efibootmgr -v
sudo efibootmgr -o 0002,0001Con LVM o Btrfs, se puede volver atrás en minutos.
sudo lvcreate -L 10G -s -n antes-upgrade /dev/vg/root
# rollback: lvconvert --merge /dev/vg/antes-upgradeAcceso para cuando SSH y el vídeo no responden.
# en la línea del kernel:
console=ttyS0,115200n8
sudo systemctl enable serial-getty@ttyS0.serviceGuarda el volcado del kernel tras un panic para analizarlo después.
sudo systemctl status kdump
ls /var/crash/Reinicia la máquina automáticamente si el kernel se cuelga.
cat /proc/sys/kernel/watchdog
sudo systemctl status watchdogUn sistema de archivos raíz inmutable en un appliance o en el edge.
# /etc/fstab
/dev/sda2 / ext4 ro,errors=remount-ro 0 1Ejecuta otro comando para inspeccionar el sistema de archivos.
docker run -it --entrypoint sh minha-app:1.0
docker create --name tmp minha-app:1.0 && docker cp tmp:/app ./appUn reinicio lo arregla — y también esconde la causa. Recoge la evidencia antes.
# 1. guarda dmesg, journalctl -b y ps aux
# 2. confirma que el servicio arranca en el boot (systemctl is-enabled)
# 3. revisa el fstab (mount -a) para que no se cuelgue a la vuelta
# 4. avisa a quien depende del sistemaHacerlo una vez, repetirlo siempre igual — y dejarlo registrado.
Ejecutarlo dos veces tiene que dar el mismo resultado. Es el principio de toda automatización fiable.
# mal: echo "linha" >> /etc/hosts
# bien:
grep -qxF "10.0.0.1 api" /etc/hosts || echo "10.0.0.1 api" | sudo tee -a /etc/hostsSe ejecuta en muchas máquinas a la vez, sin agente.
ansible todos -i inventario -m ping
ansible web -i inventario -a "systemctl status nginx" --becomeEl estado deseado descrito en 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 muestra lo que cambiaría sin aplicarlo.
ansible-playbook site.yml --check --diffUn bucle sencillo cuando no hay herramienta de configuración.
for host in web1 web2 web3; do
ssh "$host" "sudo systemctl restart minha-api" || echo "falhou em $host" >&2
doneMucho más rápido en decenas de servidores.
cat hosts.txt | xargs -P 10 -I{} ssh {} "uptime"Se cae el SSH y el proceso continúa. Imprescindible en un mantenimiento largo.
tmux new -s deploy
# Ctrl+B D desengancha
tmux attach -t deploy
tmux lsLa alternativa clásica a tmux.
screen -S manutencao
# Ctrl+A D desengancha
screen -r manutencaoscript graba todo lo que ocurrió en la terminal — ideal para un post-mortem.
script -a incidente-$(date +%F).logAvisa cuando la rutina falla, en vez de descubrirlo después.
curl -s -X POST -H "Content-Type: application/json" \
-d '{"text":"Backup falhou em '"$(hostname)"'"}' "$WEBHOOK_URL"Sale con un código distinto de cero para que la monitorización lo entienda.
if ! curl -sf http://localhost:8080/health > /dev/null; then
logger -p user.err -t saude "API fora do ar"
exit 1
fiLa red falla; un buen script lo intenta de nuevo antes de rendirse.
for tentativa in 1 2 3 4 5; do
curl -sf "$URL" && break
sleep $((2 ** tentativa))
doneUn backup que no se prueba no cuenta.
tar -czf backup.tar.gz /dados && tar -tzf backup.tar.gz > /dev/null \
&& echo "backup íntegro" || echo "backup corrompido" >&2Mantiene los N más recientes y borra el resto.
ls -1t /backup/*.tar.gz | tail -n +8 | xargs -r rm --Una copia externa — la parte del 3-2-1 que te salva del ransomware.
rclone sync /backup remoto:bucket/backup --progress
aws s3 sync /backup s3://meu-bucket/backupUn inventario automático vale más que un wiki desactualizado.
{
echo "== $(hostname) =="
uname -a; lsb_release -d
systemctl list-unit-files --state=enabled
ss -tulpn
} > inventario-$(hostname).txtEncontrar la diferencia que explica el comportamiento distinto.
for h in web1 web2; do ssh $h "md5sum /etc/nginx/nginx.conf"; doneUn historial de todo lo que cambió en la configuración del servidor.
cd /etc && sudo git init && sudo git add -A && sudo git commit -m "estado inicial"
# o usa etckeeperSilencia las alertas, avisa y acota el tiempo de la operación.
# 1. silencia la monitorización
# 2. avisa a los interesados con antelación
# 3. ten un rollback escrito y probado
# 4. define la hora de aborto ("si a las 4 no está en pie, volvemos atrás")El objetivo es corregir el sistema, no encontrar a un responsable. Registra la cronología, la causa, el impacto y las acciones.
# Plantilla: qué pasó | cuándo lo detectamos | cómo lo mitigamos
# | causa raíz | por qué no lo pillamos antes | qué cambia a partir de ahora