Troubleshooting: guía de resolución de problemas en sistemas GNU / Linux – Parte 3/3

En la primera parte dejé algunas pautas para comenzar a atajar la situación cuando surge algún tipo de problema que necesita una solución, así como diferenciar los distintos tipos de fallas con las que te vas a encontrar. En la segunda parte también comenté sobre las fuentes de información donde poder encontrar pistas o el origen de los problemas, para poder saber qué es lo que necesita reparación.

Con esta tercera parte termino esta serie con una serie de herramientas que puedes usar para poder conseguir aún más información y solucionar los problemas…

Herramientas y recursos de diagnóstico y reparación

Intentaré exponer algunos de los casos de fallos más habituales que se pueden encontrar en un sistema GNU/Linux, así como las herramientas para su diagnosis y la reparación:

¿Cómo forzar a registrar errores a un programa?

En algunas ocasiones, puede que un programa esté generando algún tipo de problema en el sistema, pero no tiene un log dedicado. Para poder registrar los errores de dicho programa y ver qué ocurre, te aconsejo un truco muy sencillo.

Por ejemplo, imagina que tu navegador web Firefox se bloquea y se cierra inexplicablemente de forma habitual, pero no lanza ningún tipo de mensaje de error. ¿Qué puede ser? ¿El proceso ha consumido la RAM? ¿Hay algún complemento o código JS que está generando el crash? ¿Es un problema del propio Firefox? Lo que debes hacer para tratar de capturar errores es:

#Ejecutar el programa afectado, en este caso Firefox, desde el terminal
#Y dirigir su salida de error hacia un fichero de texto para que almacene los errores ahí

firefox 2> errores.txt

#Cuando ocurra el problema, puedes leer el fichero creado y deberían haberse registrado errores

cat errores.txt

#Con dicha información, se puede proceder a la reparación (si hay solución)

Dependencias de paquetes

En la actualidad, los problemas de dependencias de paquetes son raros, más aún con los paquetes universales (Snap, FlatPak, AppImage), a no ser que sigas usando herramientas de bajo nivel para instalar programas (rpm, dpkg,…) o lo hagas desde fuentes. La reparación de este tipo de problemas consiste en localizar el/los paquete/s de los que depende, e instalarlos.

A veces es complejo resolver las dependencias de forma manual, por eso, la mejor opción es usar un gestor de paquetes de alto nivel (apt-get, zypper, yum, pacman,…) para que las resuelvan automáticamente. Especialmente complejo es cuando un paquete A depende de B y C, pero C depende a su vez de D… Es como un castillo de naipes.

Recuerda que algunos paquetes sirven para satisfacer las dependencias de varios programas. Quiero decir, que si eliminas un paquete, puede que estés generando dependencias en varios paquetes del sistema.

Cuando la gestión es compleja para gestionarla manualmente, se entra en lo que se conoce coloquialmente como dependency hell (infierno de dependencia):

  • Demasiadas dependencias.
  • Largas cadenas de dependencias, es decir, cuando un paquete depende de otro, pero ese otro depende a su vez de otro y así sucesivamente.
  • Circulares. No son frecuentes, pero podría darse de que un paquete A dependa de una versión específica de B y B a su vez dependa de una versión específica de A.

Puedes valerte de los mensajes de error que se muestran o de las herramientas de gestión de paquetes (la que sueles usar en tu distro) para determinar cuáles son las dependencias de un programa. Por ejemplo:

#Para DEB
apt-cache depends nombre-paquete
apt-cache depends --recurse nombre-paquete
dpkg --info /ruta/paquete/nombre.deb | grep ^\ Depends:

#Para RPM
yum deplist nombre-paquete
dnf repoquery --requires nombre-paquete
rpm -qpR nombre-paquete.rpm

#Para otros casos, puedes consultar el man del gestor de paquetes que uses
#Además, si se trata de un paquete fuente que vas a compilar, puedes leer README

Dependencias por corrupción

En algunas ocasiones, especialmente cuando usas medios como los ópticos, disquete, etc., es probable que estés intentando instalar algo y falle la instalación porque algún fichero esté corrupto. En estos casos desesperados, cuando son productos antiguos que ya no se distribuyen copias, podrías intentar algunas cosas extremas.

A veces podría ser una buena solución copiar todo el contenido del disco en el disco duro o generar una imagen por si el medio termina por deteriorarse más aún. Aun así, seguirá faltando ese fichero o sigue estando corrupto. En caso de que el instalador muestre el nombre del fichero afectado en un mensaje de error, se puede intentar algo muy poco recomendado, pero que te puede sacar de un apuro.

Esto no está recomendado para aplicaciones críticas o entornos de producción. Pero a mi me ha funcionado en multitud de casos en los que he podido salvar algunos software que ya no se distribuyen.

Por ejemplo, imagina que estas intentando instalar el videojuego GTA y da error porque falta o está corrupto el fichero Spanish.txt y Vehicle1.veh. En ese caso:

  1. Comprueba el tipo de fichero/s que es y dónde se encuentra.
  2. Trata de recuperarlo/s usando alguna herramienta si es posible. Por ejemplo, algunos vídeos pueden ser reparados con ffmpeg.
  3. Si no es posible, intenta buscar un fichero similar del medio de instalación. En este caso, se trata de un fichero de texto de un idioma, trata de localizar otro txt de otro idioma que sí que funcione. Por ejemplo, Svenska.txt y haz una copia renombrándola como Spanish.txt para sustituir al fichero dañado. En el caso del Vehicle1.veh, intenta hacer lo mismo y copiar otro VehicleX.veh que deberás llamar igual que el afectado para sustituirlo.
  4. Ahora, intenta instalar nuevamente el software. Casi en el 100% de los casos el proceso será un éxito. Eso sí, debes tener en cuenta que algunas cosas no funcionarán como esperas, por ejemplo, al seleccionar el idioma español saldrá sueco, o que al elegir un vehículo aparecerá otro diferente, etc.

Si no existen ficheros similares, podrías tratar de crear tú uno con el mismo nombre y extensión y probar suerte, aunque eso sería algo más arriesgado. Aunque, si se trata de un fichero principal (core), entonces este tipo de artimañas no servirían…

Más allá de las dependencias

Para obtener más información sobre los paquetes más allá de las dependencias, como rutas de ficheros que emplean, llamadas al sistema, etc., también puedes usar:

  • Obtener información del formato o tipo de fichero:
file /ruta/fichero
file nombre-fichero
strings -a /ruta/fichero
  • Obtener las llamadas al sistema o syscalls empleadas por un programa:
strace nombre-programa llamadas.txt
  • Para las llamadas a bibliotecas:
ltrace nombre-programa llamadas.txt
  • Mapa o utilización de memoria de un determinado proceso:
pmap -x <PID>
  • Listar ficheros abiertos que tiene un proceso:
lsof -p <PID>
  • También puedes obtener mucha más información de los procesos en el directorio correspondiente el PID del proceso en /proc/<PID>.

Bibliotecas

En cuanto a las bibliotecas dinámicas o compartidas (ya sabes que las estáticas se integrarán en el binario y no tienen esos problemas de dependencias por ello) de las que dependen algunos programas, también se puede hacer algo similar a las dependencias de paquetes, simplemente instalar las bibliotecas que necesitas para que un programa funcione. Y, al igual que ocurre con los paquetes, las herramientas de gestión de paquetes de alto nivel, las resuelven de forma automática.

Ya debes saber que en Linux puedes encontrar las estáticas como *.a y las dinámicas como *.so.version. En cuanto a las rutas, pueden estar en lugares muy diversos, pero puedes consultar la variable LD_LIBRARY_PATH para ver las rutas habituales.

Para comenzar a lidiar con estos problemas, lo primero que deberías hacer es actualizar la cache, por si la biblioteca necesaria está presente en el sistema, pero no ha sido cacheada:

#Actualizar la cache (necesitas privilegios)
ldconfig

Cuando se genera un mensaje de error de que falta alguna biblioteca, observa bien el nombre y la versión que se plasma en ese mensaje para poder instalar la correcta. Puedes usar las herramientas de búsqueda para tratar de localizarla en el sistema, puesto que en ocasiones puede que se encuentre ya instalada, pero no esté en la ruta que se espera o que tenga un nombre diferente. En ese caso, la solución sería generar enlaces.

Por ejemplo, imagina que un programa te indica que depende de lib-x.so.4.1 y que aparezca en otra ruta o que su nombre sea lib-x.so. En ese caso:

#Enlazar y actualizar cache (importante)
ln –s /ruta/lib-x.so /ruta/lib-x.so.4.1
ldconfig

Si quieres listar las bibliotecas de las que depende un programa, también puedes usar la siguiente herramienta:

#Listar las bibliotecas
ldd nombre-programa
ldd /ruta/de/nombre-programa

Crash: ¿cómo salir de esta situación?

En ocasiones, se pueden dar problemas eventuales en los que una aplicación o el propio sistema se congela y deja de responder. En algunos casos, puede ser un desafortunado cúmulo de sucesos que llevan a dicho bloqueo y que no se vuelva a repetir.

Evidentemente, en caso de que sea repetitivo, deberías buscar una solución. Pero, en cualquier caso, lo importante es salir de ese problema en el momento:

#Antes de nada, si aparece algún código o mensaje de error, deberías anotarlo o hacer una captura de pantalla para analizarlo...

#Intenta cerrar la app de forma gráfica de la forma habitual (Forzar Cierre). Si no funciona, puedes usar xkill para tocar la ventaja bloqueada con el X para matar al proceso:
xkill

#En caso de trabajar desde la consola:
ps ef | grep nombre-programa
kill -9 <PID>

En caso de que se haya bloqueado la sesión gráfica y no responda ni el cursor del ratón, puedes pasar a un terminal virtual con la combinación de teclas Ctrl+Alt+Fx, siendo x cualquier número de F1 a F6, por ejemplo Ctrl+Alt+F1. Para volver a la sesión gráfica, ya sabes que siempre la tienes en Ctrl+Alt+F7. Desde ahí podrías tratar de realizar alguna acción para la reparación o iniciar otra sesión gráfica…

Para que eso funcione, recuerda que deberías tener Fn activo. Puede que algunos gestores de sesión no lo tengan.

En algunas distribuciones actuales no funciona lo anterior y simplemente te sacará de la sesión. Para poder hacer eso, usa Ctrl+Alt+F3 para obtener un terminal virtual y Alt+F2 para volver a la sesión gráfica.

Otro atajo de teclado interesante es Ctrl+Alt+Supr. Con ella podrás cerrar sesión o reiniciar.

Magic SysRq

También es importante conocer la combinación de teclas conocida así, ya que tienen funciones del sistema interesantes para ayudarte a salir de este tipo de situaciones. Las secuencias comienzan con Alt+ImprPant+__ alguna tecla de las siguientes:

  • 0-9: establece niveles de logs para la consola.
  • B: reinicia el sistema sin desmontar el FS.
  • C: realiza un caída del sistema y volcado de memoria si está configurado.
  • D: si está configurado, mostrará Locks o Mutex.
  • E: envía una señal SIGTERM para terminar todos los procesos menos init (PID=1).
  • F: mata un proceso para aliviar una condición OOM (Out Of Memory).
  • G: usará KMS (Kernel Mode Setting) para proporcionar apoyo de emergencia para cambiar de nuevo a framebuffer en la consola.
  • H: muestra documentación o breve ayuda.
  • I: envía la señal SIGILL a todos los procesos menos a init para matarlos.
  • J: Fuerza Just Thaw It FS congelados por FIFREEZE ioctl.
  • K: mata todos los procesos en un terminal virtual.
  • L: muestra una backtrace de la pila de todas las CPUs activas.
  • N: reset al nivel nice para tareas de alta prioridad y tiempo real.
  • O: apaga el sistema.
  • P: Muestra información de los registros y flags en la consola.
  • A: muestra información sobre temporizadores y fuentes de reloj.
  • R: cambia el teclado a modo RAW.
  • S: sincroniza los datos de los FS montados.
  • T: lista las tareas y su información en consola.
  • U: desmonta los FS y los monta en modo solo lectura.
  • V: fuerza la restauración del framebufffer (en procesadores ARM causa el volcado del buffer ETM).
  • Z: muestra la lista de tareas bloqueadas (D state).
  • X: usado por la interfaz xmon en plataformas PowerPC.
  • Y: muestra los registros globales en arquitecturas SPARC.
  • W: volcado para el buffer ftrace.
  • Tabulador: Imprime un sumario de las teclas SysRq disponibles.

De aquí se puede sacar una combinación de teclas muy prácticas para cuando no responde nada y quieres reiniciar de forma segura Alt+ImprPant+REISUB. Una combinación que hace lo siguiente:

  • R pone el teclado en modo crudo, recobrando el control que se ha perdido en el modo gráfico.
  • E termina todos los procesos en marcha.
  • I interrumpe los procesos de forma forzada si hay quedado alguno.
  • S sincroniza el disco duro para evitar corrupción de datos o pérdida de datos como sucedería si simplemente se reinicia con el botón Reset.
  • U desmonta todos los sistemas de ficheros con umount y los monta en solo lectura.
  • B reinicia.

Obtener información de los logs

Si buscas obtener información de los logs de Linux, puedes hacer uso de las siguientes herramientas:

#Ver información de los logs del sistema
dmesg

#Lo mismo, pero con timestamp
dmesg -T

#Filtrar solo los de nivel err y warm
dmesg --level=err,warm

#Filtrar solo los referentes a la gpu
dmesg | grep -i gpu

#Solo mostrar lo referente al espacio de usuario
dmesg -u

#Usando systemd, puedes hacerlo con journalctl (Para salir pulsa Q)
journalctl

#Filtrar por el número de arranque. Por ejemplo, el número 4
journalctl --list-boots
journalctl -b 4

#Filtrar por tiempo
journalctl -S 2020-02-9
journalctl -S 14:00
journalctl -S today
journalctl -U 1h

#Por prioridad
journalctl -p err
journalctl -p warning
journalctl -p critical

#Por servicio o programa
journalctl -u ssh.service
journalctl /usr/sbin/sshd

#Solos los logs referentes al kernel
journalctl -k

Problemas de arranque

Te recomiendo leer otros artículos de la serie LPIC que he dedicado a este tema y en los que poder obtener información:

Otras herramientas

Existen tantos errores y casos que es complicado listar todas las herramientas, pero recuerda que pueden ser prácticas otras herramientas para tratar de localizar problemas y proceder a su reparación. Por ejemplo:

  • Benchmarks: Unixbench, Sysbench, Phoronix Test Suite, Geekbench,…
  • Backup y recuperación: Clonezilla, Bacula, Amanda, tar, cpio, dd, etc.
  • Recuperación/reparación de datos: ffmpeg, ddrescue, photorec, testdisk, foremost, …
  • Tests de memoria y almacenamiento: Memtest86+, smartctl, GSmartControl,…
  • Procesos: htop, top, atop, ps,…
  • Almacenamiento, particiones, formateo y tablas de particiones: GParted, fdisk, parted, gpart, gdisk, badblocks, du, df, fsck,hdpram, sdpram, sysfsutils
  • Suites: si eres técnico o administrador y necesitas una suite completa, puedes usar también SystemRescue, Finnix, Rescatus, Ultimate Boot CD,…
  • Módulos y kernel: kerneloops, crash, kdump, sysctl, insmod, lsmod, modprobe, rmmod, y depmod.
  • Redes: dig, nslookup, ss, iptraf, ethtool, route, netstat, ping, traceroute, ifstat, nmap, dig,…
  • Hardware: lscpu, hwinfo, lshw, cpuid, inxi, hdpram, lsdev, lsusb, lsblk, lspci, acpi, dstat, sensors, lm-sensor, iotop, hwclock, iostat, free, vmstat, dmidecode, dstat, lpc, /proc/meminfo, /proc/cpuinfo, mcelog, menú BIOS/UEFI…
  • Sistema: sar, systemctl, lsof, sysdig, ionice, nice, renice, …

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar