Un indicador de terminal estilizado en una computadora portátil Linux.

El dmesgcomando le permite mirar dentro del mundo oculto de los procesos de inicio de Linux. Revise y supervise los mensajes de controladores y dispositivos de hardware desde el búfer de anillo del núcleo con "el amigo del buscador de fallas".

Cómo funciona el búfer de anillo de Linux

En las computadoras Linux y similares a Unix, el inicio y el arranque son dos fases distintas de la secuencia de eventos que tienen lugar cuando la computadora está encendida.

Los procesos de arranque ( BIOS o UEFIMBR y GRUB ) llevan la inicialización del sistema hasta el punto en que el kernel se carga en la memoria y se conecta al ramdisk inicial ( initrd o initramfs ), y se inicia systemd.

Los procesos de inicio y luego recoger el testigo y completar la inicialización del sistema operativo. En las primeras etapas de la inicialización, los demonios de registro como syslogd o rsyslogd aún no están en funcionamiento. Para evitar perder mensajes de error y advertencias notables de esta fase de inicialización, el núcleo contiene un búfer de anillo que utiliza como almacén de mensajes.

Un búfer de anillo es un espacio de memoria reservado para mensajes. Es de diseño simple y de tamaño fijo. Cuando está lleno, los mensajes más nuevos sobrescriben los mensajes más antiguos. Conceptualmente, se puede pensar en un " búfer circular ".

El búfer de anillo del kernel almacena información como los mensajes de inicialización de los controladores de dispositivos, mensajes del hardware y mensajes de los módulos del kernel. Debido a que contiene estos mensajes de inicio de bajo nivel, el búfer de anillo es un buen lugar para iniciar una investigación sobre errores de hardware u otros problemas de inicio.

Pero no vayas con las manos vacías. Llévate  dmesgcontigo.

El comando dmesg

El dmesgcomando le permite revisar los mensajes que están almacenados en el búfer de anilloDe forma predeterminada, debe usar sudopara usar dmesg.

sudo dmesg

sudo dmesg en una ventana de terminal

Todos los mensajes del búfer circular se muestran en la ventana del terminal.

Salida de sudo dmesg en una ventana de terminal

Eso fue un diluvio. Obviamente, lo que tenemos que hacer es la tubería a través de less:

sudo dmesg | Menos

sudo dmesg |  menos en una ventana de terminal

Ahora podemos desplazarnos por los mensajes en busca de elementos de interés.

Salida dmesg en menos en una ventana de terminal

Puede usar la función de búsqueda lesspara ubicar y resaltar elementos y términos que le interesan. Inicie la función de búsqueda presionando la tecla de barra diagonal “/” en less.

Eliminando la necesidad de sudo

Si desea evitar tener que usar sudocada vez que usa dmesg, puede usar este comando. Pero tenga en cuenta: permite que cualquier persona con una cuenta de usuario use su computadora dmesgsin tener que usarla sudo.

sudo sysctl -w kernel.dmesg_restrict = 0

sudo sysctl -w kernel.dmesg_restrict = 0 en una ventana de terminal

Forzar la salida de color

De forma predeterminada, dmesgprobablemente se configurará para producir una salida en color. Si no es así, puede indicarle dmesgque coloree su salida usando la -Lopción (color).

sudo dmesg -L

sudo dmesg -L en una ventana de terminal

Para forzar dmesgque siempre esté predeterminado en una pantalla coloreada, use este comando:

sudo dmesg --color = siempre

sudo dmesg --color = siempre en una ventana de terminal

Marcas de tiempo humanas

De forma predeterminada, dmesguse una notación de marca de tiempo de segundos y nanosegundos desde que se inició el kernel. Para que esto se represente en un formato más amigable para los humanos, use la -Hopción (humano).

sudo dmesg -H

sudo dmesg -H en una ventana de terminal

Esto hace que sucedan dos cosas.

salida de sudo dmesg -H en una ventana de terminal

  • La salida se muestra automáticamente en formato less.
  • Las marcas de tiempo muestran una marca de tiempo con la fecha y la hora, con una resolución de minutos. Los mensajes que ocurrieron en cada minuto están etiquetados con los segundos y nanosegundos desde el inicio de ese minuto.

Marcas de tiempo legibles por humanos

Si no necesita una precisión de nanosegundos, pero desea que las marcas de tiempo sean más fáciles de leer que las predeterminadas, utilice la -Topción (legible por humanos). (Es un poco confuso. -HEs la opción "humana", -Tes la opción "legible por humanos").

sudo dmesg -T

sudo dmesg -T en una ventana de terminal

Las marcas de tiempo se representan como fechas y horas estándar, pero la resolución se reduce a un minuto.

salida de sudo dmesg -T en una ventana de terminal

Todo lo que sucedió en un solo minuto tiene la misma marca de tiempo. Si lo único que le preocupa es la secuencia de eventos, esto es suficiente. Además, tenga en cuenta que lo devuelven al símbolo del sistema. Esta opción no se invoca automáticamente less.

Ver eventos en vivo

Para ver los mensajes a medida que llegan al búfer de anillo del kernel, use la --follow opción (esperar mensajes). Esa frase puede parecer un poco extraña. Si el búfer de anillo se usa para almacenar mensajes de eventos que tienen lugar durante la secuencia de inicio, ¿cómo pueden llegar los mensajes en vivo al búfer de anillo una vez que la computadora está en funcionamiento?

Cualquier cosa que provoque un cambio en el hardware conectado a su computadora hará que los mensajes se envíen al búfer de anillo del kernel. Actualice o agregue un módulo del kernel y verá mensajes de búfer en anillo sobre esos cambios. Si conecta una unidad USB o conecta o desconecta un dispositivo Bluetooth, verá mensajes en la dmesgsalida. Incluso el hardware virtual hará que aparezcan nuevos mensajes en el búfer de anillo. Encienda una máquina virtual y verá que llega nueva información al búfer de anillo.

sudo dmesg --seguir

sudo dmesg: siga en una ventana de terminal

Tenga en cuenta que no volverá a la línea de comandos. Cuando aparecen nuevos mensajes, se muestran dmesg en la parte inferior de la ventana del terminal.

Salida de sudo dmesg --follow na terminal window

Incluso montar un disco CD-ROM se considera un cambio, porque ha insertado el contenido del disco CD-ROM en el árbol de directorios.

Mensajes de búfer de anillo dmesg como resultado de montar un disco CD-ROM

Para salir de la transmisión en tiempo real, presione Ctrl+C.

Recuperar los últimos diez mensajes

Utilice el comando tail para recuperar los últimos diez mensajes del búfer de anillo del kernel. Por supuesto, puede recuperar cualquier número de mensajes. Diez es solo nuestro ejemplo.

sudo dmesg | último -10

sudo dmesg |  último -10 en una ventana de terminal

Los últimos diez mensajes se recuperan y se enumeran en la ventana del terminal.

Salida de sudo dmsesg |  tail -10 en una ventana de terminal

Búsqueda de términos específicos

Canalice la salida de a dmesgtravés grep para buscar cadenas o patrones particularesAquí estamos usando la -iopción (ignorar mayúsculas y minúsculas) para que no se tenga en cuenta el caso de cadenas coincidentes. nuestros resultados incluirán "usb" y "USB" y cualquier otra combinación de minúsculas y mayúsculas.

sudo dmesg | grep -i usb

sudo dmesg |  grep -i usb en una ventana de terminal

Los resultados de búsqueda resaltados están en mayúsculas y minúsculas.

Resultados de búsqueda que muestran resultados en mayúsculas y minúsculas en una ventana de terminal

Podemos aislar los mensajes que contienen referencias al primer disco duro SCSI del sistema sda(En realidad, sdatambién se usa hoy en día para el primer disco duro SATA y para unidades USB).

sudo dmesg | grep -i sda

sudo dmesg |  grep -i sda en una ventana de terminal

Todos los mensajes que mencionan sdase recuperan y se enumeran en la ventana del terminal.

salida de sudo dmesg |  grep -i sda en una ventana de terminal

Para realizar una grepbúsqueda de varios términos a la vez, use la -Eopción (extender expresión regular). Debe proporcionar los términos de búsqueda dentro de una cadena entre comillas con barra vertical "|" delimitadores entre los términos de búsqueda:

sudo dmesg | grep -E "memoria | tty | dma"

sudo dmesg |  grep -E "memoria | tty | dma" en una ventana de terminal

Cualquier mensaje que mencione alguno de los términos de búsqueda se muestra en la ventana del terminal.

salida de sudo dmesg |  grep -E "memoria | tty | dma" en una ventana de terminal

Usar niveles de registro

Cada mensaje registrado en el búfer circular del kernel tiene un nivel adjunto. El nivel representa la importancia de la información en el mensaje. Los niveles son:

  • emerg : el sistema no se puede utilizar.
  • alerta : Se deben tomar medidas de inmediato.
  • crit : condiciones críticas.
  • err : condiciones de error.
  • advertir : Condiciones de advertencia.
  • aviso : Condición normal pero significativa.
  • info : Informativo.
  • debug : mensajes de nivel de depuración.

Podemos dmesgextraer mensajes que coincidan con un nivel en particular usando la -lopción (nivel) y pasando el nombre del nivel como un parámetro de línea de comando. Para ver solo mensajes de nivel "informativo", use este comando:

sudo dmesg -l info

sudo dmesg -l info en una ventana de terminal

Todos los mensajes que se enumeran son mensajes informativos. No contienen errores ni advertencias, solo notificaciones útiles.

Salida de sudo dmesg -l info en una ventana de terminal

Combine dos o más niveles de registro en un comando para recuperar mensajes de varios niveles de registro:

sudo dmesg -l debug, Notice

sudo dmesg -l debug, aviso en una ventana de terminal

La salida de dmesges una combinación de mensajes de cada nivel de registro:

Salida de sudo dmesg -l debug, aviso en una ventana de terminal

Las categorías de instalaciones

Los dmesgmensajes se agrupan en categorías denominadas "instalaciones". La lista de instalaciones es:

  • kern : mensajes del kernel.
  • usuario : mensajes a nivel de usuario.
  • mail : sistema de correo.
  • daemon : demonios del sistema.
  • auth : mensajes de seguridad / autorización.
  • syslog : mensajes internos de syslogd.
  • lpr : subsistema de impresora de línea.
  • noticias : subsistema de noticias de la red.

Podemos solicitar dmesgfiltrar su salida para mostrar solo mensajes en una instalación específica. Para hacerlo, debemos usar la -fopción (facilidad):

sudo dmesg -f demonio

sudo dmesg -f daemon en una ventana de terminal

dmesg enumera todos los mensajes relacionados con los demonios en la ventana de terminal.

salida de sudo dmesg -f daemon en una ventana de terminal

Como hicimos con los niveles, podemos pedir dmesgque se muestren los mensajes de más de una instalación a la vez:

sudo dmesg -f syslog, demonio

sudo dmesg -f syslog, demonio en una ventana de terminal

El resultado es una combinación de mensajes de registro de syslog y daemon.

salida de sudo dmesg -f syslog, daemon en una ventana de terminal

Combinando instalación y nivel

La -xopción (decodificar) hace que se dmesgmuestre la instalación y el nivel como prefijos legibles por humanos para cada línea.

sudo dmesg -x

sudo dmesg -x en una ventana de terminal

La instalación y el nivel se pueden ver al inicio de cada línea:

Salida de sudo dmesg -x en una ventana de terminal

La primera sección resaltada es un mensaje de la función "kernel" con un nivel de "aviso". La segunda sección resaltada es un mensaje de la función "kernel" con un nivel de "información".

Eso es genial, pero ¿por qué?

En pocas palabras, búsqueda de fallas.

Si tiene problemas con una pieza de hardware que no se reconoce o no se comporta correctamente, dmesgpuede arrojar algo de luz sobre el problema.

  • Úselo dmesgpara revisar los mensajes desde el nivel más alto hasta cada nivel más bajo, en busca de errores o advertencias que mencionen el elemento de hardware o que puedan tener relación con el problema.
  • Úselo dmesgpara buscar cualquier mención de la instalación apropiada  para ver si contienen información útil.
  • Tubería dmesga través grepy busque relacionados cuerdas o identificadores como fabricante del producto o números de modelo.
  • Tubería dmesga través grepy el aspecto de los términos genéricos como “GPU” o “almacenamiento”, o términos tales como “fracaso”, “no” o “no”.
  • Utilice la --followopción y vea los dmesgmensajes en tiempo real.

Feliz cacería.