Comando Dmesg stampa il buffer dei messaggi del kernel. Il comando Dmesg viene utilizzato principalmente per identificare i dispositivi guasti, i dispositivi hot plug come USB, gli errori dei dispositivi I/O.
Quando il sistema avvia i driver di dispositivo presenti nella configurazione del kernel con i dispositivi hardware pertinenti. In quel momento i driver e altri elementi con il kernel producono messaggi. Questi messaggi sono archiviati in un spazio buffer ridotto e sovrascritti ciascuno quando arrivano nuovi messaggi. La maggior parte delle distribuzioni Linux memorizza questi messaggi in /var/log/dmesg. Dmesg letto direttamente dal buffer dell'anello del kernel, non da /var/log/dmesg. Syslog per impostazione predefinita (dipende dalle distribuzioni Linux) o configurato per acquisire messaggi.
Negozi Dmesg messaggi del kernel durante l'avvio e dopo l'avvio. Dopo l'avvio, occasionalmente il kernel produce messaggi quando ci sono errori io, dispositivi collegati, ecc. Questi sono messaggi che vengono inviati anche alla console di sistema. L'output di Dmesg è spesso grande, può essere filtrato usando i comandi more, tail o grep.
Come usare il comando dmesg
Il comando Dmesg per impostazione predefinita stampa N numero di messaggi dal buffer dell'anello del kernel.
$ dmesg
Esempio di output:
[ 1.230638] kernel: Run /init as init process
[ 1.336492] kernel: scsi host0: Virtio SCSI HBA
[ 1.338612] kernel: scsi 0:0:0:0: Direct-Access QEMU QEMU HARDDISK 2.5+ PQ: 0 ANSI: 5
[ 1.338727] kernel: input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input4
[ 1.342266] kernel: input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input3
[ 1.345242] kernel: lpc_ich 0000:00:1f.0: I/O space for GPIO uninitialized
[ 1.346920] kernel: ahci 0000:00:1f.2: version 3.0
[ 1.350864] kernel: scsi host1: Virtio SCSI HBA
[ 1.358377] kernel: scsi host2: Virtio SCSI HBA
[ 1.359317] kernel: PCI Interrupt Link [GSIA] enabled at IRQ 16
[ 1.359718] kernel: scsi 1:0:1:2: Direct-Access QEMU QEMU HARDDISK 2.5+ PQ: 0 ANSI: 5
[ 1.361478] kernel: ahci 0000:00:1f.2: AHCI 0001.0000 32 slots 6 ports 1.5 Gbps 0x3f impl SATA mode
[ 1.363039] kernel: i801_smbus 0000:00:1f.3: SMBus using PCI interrupt
L'output di Dmesg è principalmente diviso in 3 parti:
- Tempo: Mostra il numero di secondi dall'avvio. Se trovi 20.091730. Significa che il messaggio viene creato 20 secondi dopo l'avvio.
- Nome_dispositivo: Mostra il nome del dispositivo
- Messaggi: Il messaggio vero e proprio. Da qui, possiamo analizzare cosa è successo.
1) Come leggere dmesg
Il comando Dmesg senza alcuna opzione produce un output di grandi dimensioni. Per semplificare la lettura, utilizzare il comando grep o less per filtrare l'output. Diamo un'occhiata ad alcuni esempi.
Stampa output dmesg per pagina
$ dmesg | less
Esempio di output:
[ 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
Stampa le informazioni relative a eth
$ dmesg | grep eth
Esempio di output:
[ 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
Stampa le informazioni relative all'USB
$ dmesg | grep usb
Esempio di output:
[ 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
Tieni presente che il comando grep è case-sensitive . cioè dall'esempio sopra "usb" e "USB" danno risultati diversi. Per ignorare la funzione di distinzione tra maiuscole e minuscole, utilizza il parametro -i dopo il comando grep . Confronta questo output di comando con la custodia USB sopra.
$ dmesg | grep -i usb
Esempio di output:
[ 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
Visualizzazione dell'output desiderato utilizzando testa/coda
Ad esempio, hai inserito un dispositivo rimovibile o hai apportato modifiche a qualsiasi volume del disco. Per controllare le ultime voci di dmesg utilizzando la coda comando.
Per visualizzare le ultime N righe del registro dmesg:
$ dmesg | tail -15
Allo stesso modo, per trovare le prime righe da dmesg log usa il comando head. Questo sarà utile per trovare le modifiche avvenute subito dopo l'avvio.
$ dmesg | head -15
Monitoraggio in tempo reale
Per il monitoraggio continuo in tempo reale usa l'opzione -f .
$ tail -f /var/log/dmesg
In alternativa, usa watch dmesg:
$ watch "dmesg | tail -15"
Alcuni sistemi Linux supportano l'utilizzo di dmesg -w, che attende nuovi messaggi.
2) Stampa in formato leggibile dall'uomo
Per stampare l'output di dmesg in un formato leggibile dall'uomo, usa l'opzione -H.
$ dmesg -H
3) Converti timestamp in formato data personalizzato
Per impostazione predefinita, il timestamp dall'output di dmesg non è leggibile dall'uomo. Per modificare il timestamp in un formato di data personalizzato, utilizzare l'opzione - -ctime o -T.
$ dmesg --ctime
Esempio di output:
[Tue Dec 10 16:34:33 2013] 131MB HIGHMEM available.
[Tue Dec 10 16:34:33 2013] 891MB LOWMEM available.
[Tue Dec 10 16:34:33 2013] mapped low ram: 0 - 37bfe000
[Tue Dec 10 16:34:33 2013] low ram: 0 - 37bfe000
[Tue Dec 10 16:34:33 2013] Zone ranges:
[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] Movable zone start for each node
[Tue Dec 10 16:34:33 2013] Early memory node ranges
[Tue Dec 10 16:34:33 2013] node 0: [mem 0x00010000-0x0009efff]
[Tue Dec 10 16:34:33 2013] node 0: [mem 0x00100000-0x3ffeffff
Puoi anche usare --time-format
Se timestamp non è abilitato quindi il comando dmesg potrebbe non mostrare il timestamp nell'output.
Per verificare che i timestamp siano abilitati o meno, apri il file /sys/module/printk/parameters/time:
$ cat /sys/module/printk/parameters/time
N
Se il contenuto del file è N, il timestamp non è abilitato. Puoi eseguire il comando seguente per abilitare il timestamp:
$ echo Y > /sys/module/printk/parameters/time
4) Cancella dmesg
Per cancellare i messaggi dal buffer dell'anello del kernel, usa l'opzione -C.
$ dmesg -C
Per cancellare il buffer dell'anello dopo aver stampato il suo contenuto, usa l'opzione -c.
$ dmesg -c
Anche se cancelli dmesg usando i parametri -c o -C, puoi comunque visualizzare i log in /var/log/kern.log o /var/log/dmesg.
5) Impedisci a Dmesg di accedere alla console
Per disabilitare la stampa dei messaggi sulla console usa l'opzione -D.
$ dmesg -D
Un'opzione alternativa consiste nell'usare -n 1 per impedire che tutti i messaggi, tranne quelli di emergenza (panico), vengano visualizzati sulla console.
Per abilitare la stampa dei messaggi sulla console usa -E.
$ dmesg -E
6) Visualizza messaggi specifici per struttura
Per stampare messaggi da una specifica categoria o struttura. Per raggiungere questo scopo, usa l'opzione --Facility.
Dall'esempio per stampare un messaggio specifico per la posta, digitare:
$ dmesg --facility=daemon
Strutture di registro supportate sono:
kern - messaggi del kernel
utente - messaggi casuali a livello di utente
posta - sistema di posta
demone - demoni di sistema
auth - messaggi di sicurezza/autorizzazione
syslog - messaggi generati internamente da syslogd
lpr - sottosistema della stampante di linea
notizie - sottosistema di notizie di rete
7) Stampa livello registro
Per stampare messaggi specifici a livello di registro, utilizzare l'opzione --level. Ad esempio, per stampare tutti i messaggi di avviso, eseguire il comando seguente:
$ dmesg --level=warn
Esempio di output:
[ 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
Livelli di registro supportati sono:
emerg - il sistema è inutilizzabile
avviso - l'azione deve essere intrapresa immediatamente
crit - condizioni critiche
err - condizioni di errore
avvertire - condizioni di avviso
avviso - condizione normale ma significativa
info - informativo
debug - messaggi a livello di debug
8) Visualizzazione della struttura e del livello in leggibile dall'uomo
Per stampare la struttura e il livello di registro in un formato leggibile dall'uomo, utilizzare l'opzione -x.
$ dmesg -x
Esempio di output:
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.
9) Stampa il messaggio del kernel
Per stampare messaggi specifici del kernel usa l'opzione -k.
$ dmesg -k
10) Ignora timestamp
Se non vuoi stampare il timestamp del kernel, usa l'opzione -t.
$ dmesg -t
Conclusione
Dmesg può essere molto utile per diagnosticare problemi relativi al sistema. In questo tutorial, abbiamo imparato come usare il comando dmesg in Linux.