LINUX

11 comandos dmesg de Linux para imprimir el búfer de anillo del kernel

A veces subestimamos la existencia de registros. Para el administrador del sistema, los registros son importantes. Desde el registro, podemos analizar qué causa un error. dmesg es un comando que imprime mensajes del kernel en su pantalla. Dmesg imprime sus datos leyendo el búfer de anillo del kernel.

Los datos pueden ser información sobre el procesador, el disco duro, la impresora, el teclado, la memoria y los controladores. Dado que dmesg lee todos los mensajes del búfer de anillo del kernel, que es un dato en tiempo real, los mensajes de salida pueden ser mensajes largos.

Cómo ejecutar dmesg

Puedes escribir dmesg en tu consola. Aquí hay una impresión de muestra de dmesg sin ningún parámetro.

$ dmesg

Salida de muestra:

[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.8.0-31-generic (buildd@aatxe) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) ) #46-Ubuntu SMP Tue Sep 10 19:56:49 UTC 2013 (Ubuntu 3.8.0-31.46-generic 3.8.13.8)
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] NSC Geode by NSC
[ 0.000000] Cyrix CyrixInstead
[ 0.000000] Centaur CentaurHauls
[ 0.000000] Transmeta GenuineTMx86
[ 0.000000] Transmeta TransmetaCPU
[ 0.000000] UMC UMC UMC UMC

La salida de dmesg se divide en 3 partes.

  • Hora : esto le muestra el número de segundos desde el momento del arranque. Si encuentra 20.091730. Significa que el mensaje se crea 20 segundos después del inicio.
  • Nombre del dispositivo : esto te muestra el nombre del dispositivo
  • Mensajes: este es el mensaje real. A partir de aquí, podemos analizar lo que sucedió.

Por que necesitamos dmesg

Aquí hay un ejemplo real en mi computadora. Tuve este error al abrir el navegador Chrome.

Error de Chrome

Cuando reviso a través de dmesg, recibí este mensaje.

error de cromo dmesg

Ahora me queda claro que la causa del error fue Memoria insuficiente. Sucedió cuando intenté abrir más de 15 pestañas. Entonces, la próxima vez, seré consciente de que no debo abrir más de 15 pestañas.

1) Uso de dmesg con el signo de tubería (|)

Correr dmesg sin parámetro producirá mensajes largos. Para que sea más fácil de leer, combinarlo con el signo de tubería (|). He aquí algunos ejemplos.

Imprimir salida dmesg por página

$ dmesg | less

Salida de muestra:

[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.8.0-31-generic (buildd@aatxe) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) ) #46-Ubuntu SMP Tue Sep 10 19:56:49 UTC 2013 (Ubuntu 3.8.0-31.46-generic 3.8.13.8)
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] NSC Geode by NSC
[ 0.000000] Cyrix CyrixInstead
[ 0.000000] Centaur CentaurHauls
[ 0.000000] Transmeta GenuineTMx86
[ 0.000000] Transmeta TransmetaCPU
[ 0.000000] UMC UMC UMC UMC

Imprimir información relacionada con eth

$ dmesg | grep eth

Salida de muestra:

[ 1.972418] e1000 0000:00:03.0 eth0: (PCI:33MHz:32-bit) 08:00:27:d2:c1:16
[ 1.972430] e1000 0000:00:03.0 eth0: Intel(R) PRO/1000 Network Connection
[ 18.867656] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 21.733138] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[ 21.737967] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 21.738052] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

Imprimir información relacionada con USB

$ dmesg | grep usb

Salida de muestra:

[ 0.131874] ACPI: bus type usb registered
[ 0.131910] usbcore: registered new interface driver usbfs
[ 0.131921] usbcore: registered new interface driver hub
[ 0.131955] usbcore: registered new device driver usb
[ 1.091722] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
[ 1.091727] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.091730] usb usb1: Product: OHCI Host Controller
[ 1.091731] usb usb1: Manufacturer: Linux 3.8.0-31-generic ohci_hcd
[ 1.091733] usb usb1: SerialNumber: 0000:00:06.0

Tenga en cuenta que el comando grep es distingue mayúsculas y minúsculas. es decir, del ejemplo anterior, «usb» y «USB» dan resultados diferentes. Para ignorar la función que distingue entre mayúsculas y minúsculas, utilice -i parámetro después del comando grep. Compare esta salida de comando con la carcasa USB anterior.

$ dmesg | grep -i usb

Salida de muestra:

[ 0.131874] ACPI: bus type usb registered
[ 0.131910] usbcore: registered new interface driver usbfs
[ 0.131921] usbcore: registered new interface driver hub
[ 0.131955] usbcore: registered new device driver usb
[ 0.997759] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 0.997783] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 0.997929] ohci_hcd 0000:00:06.0: new USB bus registered, assigned bus number 1
[ 1.091722] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
[ 1.091727] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.091730] usb usb1: Product: OHCI Host Controller
[ 1.091731] usb usb1: Manufacturer: Linux 3.8.0-31-generic ohci_hcd
[ 1.091733] usb usb1: SerialNumber: 0000:00:06.0
[ 1.091856] hub 1-0:1.0: USB hub found
[ 1.093110] uhci_hcd: USB Universal Host Controller Interface driver

2) Imprima con tiempo legible por humanos

De forma predeterminada, la marca de tiempo de la salida de dmesg no es legible por humanos. Para hacerlo legible por humanos, puede usar – -parámetro de tiempo.

$ dmesg  - -ctime

Salida de muestra:

[Tue Dec 10 16:34:33 2013]  131MB HIGHMEM disponible.
[Tue Dec 10 16:34:33 2013] 891MB LOWMEM disponible.
[Tue Dec 10 16:34:33 2013] RAM baja mapeada: 0 - 37bfe000
[Tue Dec 10 16:34:33 2013] RAM baja: 0 - 37bfe000
[Tue Dec 10 16:34:33 2013] Rangos de zona:
[Tue Dec 10 16:34:33 2013] DMA [mem 0x00010000-0x00ffffff]
[Tue Dec 10 16:34:33 2013] Normal [mem 0x01000000-0x37bfdfff]
[Tue Dec 10 16:34:33 2013] HighMem [mem 0x37bfe000-0x3ffeffff]
[Tue Dec 10 16:34:33 2013] Inicio de zona móvil para cada nodo
[Tue Dec 10 16:34:33 2013] Rangos de nodos de memoria tempranos
[Tue Dec 10 16:34:33 2013] nodo 0: [mem 0x00010000-0x0009efff]
[Tue Dec 10 16:34:33 2013] nodo 0: [mem 0x00100000-0x3ffeffff

Please notice that -ctime parameter may not accurate IF you do SUSPEND/RESUME.

3) dmesg is not showing the timestamp in the output

This is one of the common problems faced by linux admins and users who are working on unix-like-operating-systems. Here we can see in the below output where the timestamps are not being shown in dmesg output.

$ dmesg
IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready
bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter if
you need this.
Netfilter messages via NETLINK v0.30.
ip_set: protocol 6

In such case, we can use the below command to find if the timestamps are enabled.

$ cat /sys/module/printk/parameters/time
N

Here it shows the timestamps are not enabled for this. We can use the below command to enable the same.

$ echo Y > /sys/module/printk/parameters/time
$ cat /sys/module/printk/parameters/time
Y

After enabling the timestamps, Now dmesg will display the timestamps too as follows:

$dmesg | tail -15
[ 49.834670] IPv6: ADDRCONF (NETDEV_UP): enp0s3: el enlace no está listo
[ 49.839367] e1000: enp0s3 NIC Link está arriba 1000 Mbps Full Duplex, Control de flujo: RX
[ 49.843175] IPv6: ADDRCONF (NETDEV_UP): enp0s3: el enlace no está listo
[ 49.843198] IPv6: ADDRCONF (NETDEV_CHANGE): enp0s3: el enlace está listo
[ 50.373814] puente: el filtrado automático a través de arp / ip / ip6tables ha quedado obsoleto.  Actualice sus scripts para cargar br_netfilter si lo necesita.
[ 50.562062] Mensajes de Netfilter a través de NETLINK v0.30.
[ 50.589251] ip_set: protocolo 6

4) No imprima la marca de tiempo

Si no desea ver la marca de tiempo, puede usar -t parámetro

$ dmesg -t

Salida de muestra:

Bluetooth: Core ver 2.16
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Bluetooth: BNEP filters: protocol multicast
Bluetooth: BNEP socket layer initialized

5) Mostrar lista de instalaciones

dmesg también puede imprimir mensajes de una categoría o instalación en particular. Para cumplir con este propósito, utilice – parámetro de instalación

$ dmesg --facility=daemon

Salida de muestra:

[ 1.325619] udevd[95]: starting version 175
[ 18.946799] udevd[446]: starting version 175

Esa opción imprimirá mensajes desde el demonio del sistema. solamente.

Las instalaciones de registro compatibles son:

kern - kernel messages
user - random user-level messages
mail - mail system
daemon - system daemons
auth - security/authorization messages
syslog - messages generated internally by syslogd
lpr - line printer subsystem
news - network news subsystemt

6) Nivel de registro de impresión

dmesg también puede imprimir el registro según el nivel. Para imprimir un resultado como este, use – -nivel parámetro

$ dmesg - -level=err

Salida de muestra:

[ 0.000000] tsc: Fast TSC calibration failed
[ 19.595760] piix4_smbus 0000:00:07.0: SMBus base address uninitialized - upgrade BIOS or use force_addr=0xaddr

Esta opción solo imprimirá mensajes de error.

Los niveles admitidos son:

emerg - system is unusable
alert - action must be taken immediately
crit - critical conditions
err - error conditions
warn - warning conditions
notice - normal but significant condition
info - informational
debug - debug-level messages

7) Número de instalación y nivel de decodificación (prioridad)

Puede poner información sobre la instalación y el número de nivel sin uso –facility o –level parámetro. Usar -X parámetro para decodificar la instalación y el número de nivel en prefijos legibles por humanos.

$ dmesg -x

Salida de muestra:

kern :debug : [ 0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
kern :info : [ 0.000000] e820: last_pfn = 0x3fff0 max_arch_pfn = 0x1000000
kern :debug : [ 0.000000] MTRR default type: uncachable
kern :debug : [ 0.000000] MTRR variable ranges disabled:
kern :info : [ 0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
kern :info : [ 0.000000] CPU MTRRs all blank - virtualized system.

8) Borrar salida dmesg

Si necesita borrar el mensaje del búfer de anillo, puede usar -c parámetro

$ dmesg -c

Este parámetro producirá una salida dmesg y luego lo eliminará. Tú debe tener privilegio de root para realizar esta acción. De lo contrario, tendrá un mensaje de error como este:

pungki@dev-machine:~$ dmesg -c
dmesg: klogctl failed: Operation not permitted

Si esta usando -C parámetro (mayúscula C), los registros se eliminarán inmediatamente. Este parámetro también necesita privilegios de root.

$ dmesg -C

¿Está realmente borrado?

Si borra accidentalmente los registros con los parámetros -co -C, esto no eliminará realmente los registros. Todavía puede ver los registros accediendo al archivo /var/log/kern.log o / var / log / dmesg

9) Visualización de la salida deseada usando cabeza y cola con tubo símbolo

Por ejemplo, hemos insertado un dispositivo extraíble o realizado cambios en cualquier volumen de disco. En tales casos, podemos comprobar las últimas entradas de dmesg utilizando el cola mando.

$ dmesg | tail -15

El comando anterior producirá las últimas 15 líneas del registro dmesg. A continuación, encontrará el resultado de muestra utilizando el comando anterior. Tenga en cuenta que aquí se muestran los últimos cambios ocurridos en mi máquina personal.

$ dmesg | tail -15
[ 49.834670] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
[ 49.839367] e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[ 49.843175] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
[ 49.843198] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready
[ 50.373814] bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter if you need this.
[ 50.562062] Netfilter messages via NETLINK v0.30.
[ 50.589251] ip_set: protocol 6

Del mismo modo, podemos utilizar el cabeza comando para encontrar las primeras líneas de dmesg log. Esto será útil para encontrar los cambios que ocurrieron justo después de arrancar.

$ dmesg | head -15

Usando el cola -f opción podemos monitorear continuamente el registro de dmesg para detectar nuevas entradas. Se recomienda mantener siempre una pestaña abierta para dmesg y haga los cambios en otras pestañas simultáneamente y siga revisando el registro de dmesg para ver si hay errores.

$tail -f /var/log/dmesg

El comando anterior seguirá mostrando las últimas entradas de registro de / var / log / dmesg.

10) Incrementar dmesg tamaño del búfer

Asignar un tamaño de búfer suficiente es muy importante para asegurarse de que no estamos perdiendo ningún mensaje que deba grabarse en dmesg registros.

log_buf_len=

Podemos agregar el parámetro anterior en / etc / default / grub para asignar el tamaño de búfer deseado a dmesg de la siguiente manera:

$vi /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet log_buf_lenn=5M"

Después de realizar los cambios anteriores, tenemos que volver a generar el archivo grub.conf de la siguiente manera:

$grub2-mkconfig --output=/boot/grub2/grub.conf

11) Encuentra dmesg de la sesión anterior

Siempre que iniciemos / reiniciemos la máquina Linux, se creará un nuevo dmesg bajo / var / log como un archivo de registro dmesg

dmesg los registros de sesiones anteriores se rotan en el mismo camino (/ var / log). Podemos encontrar los mensajes de arranque de la última sesión en este archivo de registro.

/var/log/dmesg.old

Podemos verificar los detalles del archivo de registro usando gato , cabeza o cola

Cosas importantes para recordar dmesg

Existe la idea errónea de que dmesg se lee desde / var / log / dmesg, lo cual no es cierto.

En realidad, dmesg lee de búfer de anillo del núcleo y da los últimos mensajes de él. Dmesg escribe los mensajes de arranque en / varlog / dmesg.

Mejores prácticas

Utilice siempre dmesg con – hora o -T opción para leer los tiempos en formatos legibles por humanos, lo que facilita la comprensión.

Terminando

Dmesg puede ser útil para diagnosticar problemas relacionados con el sistema. dmesg registra todos los mensajes desde que se inicia la máquina. Dmesg también registra todos los cambios del sistema que ocurren en tiempo real. Este es uno de los comandos de Linux que debe conocer el administrador del sistema. Como siempre, puede escribir «man dmesg» para obtener información más detallada.

Publicaciones relacionadas

Deja una respuesta

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

Botón volver arriba
Cerrar