7 Εντολές dmesg για την αντιμετώπιση προβλημάτων και τη συλλογή πληροφοριών συστημάτων Linux


Η εντολή «dmesg» εμφανίζει τα μηνύματα από την προσωρινή μνήμη δακτυλίου του πυρήνα. Ένα σύστημα περνά πολλαπλά επίπεδα εκτέλεσης από όπου μπορούμε να λάβουμε πολλές πληροφορίες όπως αρχιτεκτονική συστήματος, επεξεργαστής, συνδεδεμένη συσκευή, μνήμη RAM κ.λπ. Όταν ο υπολογιστής εκκινείται, ένας πυρήνας (πυρήνας ενός λειτουργικού συστήματος) φορτώνεται στη μνήμη. Κατά τη διάρκεια αυτής της περιόδου εμφανίζεται ένας αριθμός μηνυμάτων όπου μπορούμε να δούμε συσκευές υλικού που ανιχνεύονται από τον πυρήνα.

Διαβάστε επίσης: 10 εντολές Linux για συλλογή πληροφοριών συστήματος και υλικού

Τα μηνύματα είναι πολύ σημαντικά όσον αφορά τον σκοπό της διάγνωσης σε περίπτωση βλάβης της συσκευής. Όταν συνδέουμε ή αποσυνδέουμε συσκευή υλικού στο σύστημα, με τη βοήθεια της εντολής dmesg γνωρίζουμε εν κινήσει ανιχνευμένες ή αποσυνδεδεμένες πληροφορίες. Η εντολή dmesg είναι διαθέσιμη στα περισσότερα λειτουργικά συστήματα που βασίζονται σε Linux και Unix.

Ας ρίξουμε λίγο φως στο πιο διάσημο εργαλείο που ονομάζεται εντολή «dmesg» με τα πρακτικά τους παραδείγματα όπως συζητούνται παρακάτω. Η ακριβής σύνταξη του dmesg έχει ως εξής.

# dmseg [options...]

1. Καταχωρίστε όλα τα φορτωμένα προγράμματα οδήγησης στον πυρήνα

Μπορούμε να χρησιμοποιήσουμε εργαλεία χειρισμού κειμένου, π.χ. 'περισσότερα', 'ουρά', 'λιγότερο' ή 'grep με την εντολή dmesg. Καθώς η έξοδος του αρχείου καταγραφής dmesg δεν χωράει σε μία σελίδα, η χρήση της εντολής dmesg με περισσότερο ή λιγότερο σωλήνα θα εμφανίσει αρχεία καταγραφής σε μία μόνο σελίδα.

[ ~]# dmesg | more
[ ~]# dmesg | less
Δείγμα εξόδου
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.11.0-13-generic () (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 17:26:33 UTC 2013 
(Ubuntu 3.11.0-13.20-generic 3.11.6)
[    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
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007dc08bff] usable
[    0.000000] BIOS-e820: [mem 0x000000007dc08c00-0x000000007dc5cbff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x000000007dc5cc00-0x000000007dc5ebff] ACPI data
[    0.000000] BIOS-e820: [mem 0x000000007dc5ec00-0x000000007fffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fed003ff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed20000-0x00000000fed9ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000feefffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffb00000-0x00000000ffffffff] reserved
[    0.000000] NX (Execute Disable) protection: active
.....

Διαβάστε επίσης: Διαχειριστείτε τα αρχεία Linux αποτελεσματικά χρησιμοποιώντας εντολές κεφάλι, ουρά και γάτα

2. Καταχωρίστε όλες τις συσκευές που εντοπίστηκαν

Για να ανακαλύψετε ποιοι σκληροί δίσκοι έχουν εντοπιστεί από τον πυρήνα, μπορείτε να αναζητήσετε τη λέξη-κλειδί sda μαζί με το grep, όπως φαίνεται παρακάτω.

[ ~]# dmesg | grep sda

[    1.280971] sd 2:0:0:0: [sda] 488281250 512-byte logical blocks: (250 GB/232 GiB)
[    1.281014] sd 2:0:0:0: [sda] Write Protect is off
[    1.281016] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
[    1.281039] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    1.359585]  sda: sda1 sda2 < sda5 sda6 sda7 sda8 >
[    1.360052] sd 2:0:0:0: [sda] Attached SCSI disk
[    2.347887] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
[   22.928440] Adding 3905532k swap on /dev/sda6.  Priority:-1 extents:1 across:3905532k FS
[   23.950543] EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro
[   24.134016] EXT4-fs (sda5): mounted filesystem with ordered data mode. Opts: (null)
[   24.330762] EXT4-fs (sda7): mounted filesystem with ordered data mode. Opts: (null)
[   24.561015] EXT4-fs (sda8): mounted filesystem with ordered data mode. Opts: (null)

ΣΗΜΕΙΩΣΗ: Ο πρώτος σκληρός δίσκος SATA sda, ο sdb είναι ο δεύτερος σκληρός δίσκος SATA και ούτω καθεξής. Αναζητήστε με «hda» ή «hdb» στην περίπτωση του σκληρού δίσκου IDE.

3. Εκτυπώστε μόνο τις πρώτες 20 γραμμές εξόδου

Το «κεφάλι» μαζί με το dmesg θα εμφανίζουν γραμμές εκκίνησης, δηλαδή «dmesg | head -20’ θα εκτυπώσει μόνο 20 γραμμές από το σημείο εκκίνησης.

[ ~]# dmesg | head  -20

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.11.0-13-generic () (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 17:26:33 UTC 2013 (Ubuntu 3.11.0-13.20-generic 3.11.6)
[    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
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007dc08bff] usable
[    0.000000] BIOS-e820: [mem 0x000000007dc08c00-0x000000007dc5cbff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x000000007dc5cc00-0x000000007dc5ebff] ACPI data
[    0.000000] BIOS-e820: [mem 0x000000007dc5ec00-0x000000007fffffff] reserved

4. Εκτυπώστε μόνο τις τελευταίες 20 γραμμές εξόδου

Η «ουρά» μαζί με την εντολή dmesg θα εκτυπώσει μόνο 20 τελευταίες γραμμές, αυτό είναι χρήσιμο σε περίπτωση που εισάγουμε αφαιρούμενη συσκευή.

[ ~]# dmesg | tail -20

parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]
ppdev: user-space parallel port driver
EXT4-fs (sda1): mounted filesystem with ordered data mode
Adding 2097144k swap on /dev/sda2.  Priority:-1 extents:1 across:2097144k
readahead-disable-service: delaying service auditd
ip_tables: (C) 2000-2006 Netfilter Core Team
nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
NET: Registered protocol family 10
lo: Disabled Privacy Extensions
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Slow work thread pool: Starting up
Slow work thread pool: Ready
FS-Cache: Loaded
CacheFiles: Loaded
CacheFiles: Security denies permission to nominate security context: error -95
eth0: no IPv6 routers present
type=1305 audit(1398268784.593:18630): audit_enabled=0 old=1 auid=4294967295 ses=4294967295 res=1
readahead-collector: starting delayed service auditd
readahead-collector: sorting
readahead-collector: finished

5. Αναζήτηση συσκευής ή συγκεκριμένης συμβολοσειράς που εντοπίστηκε

Είναι δύσκολο να αναζητήσετε συγκεκριμένη συμβολοσειρά λόγω του μήκους της εξόδου dmesg. Επομένως, φιλτράρετε τις γραμμές με συμβολοσειρές όπως 'usb' 'dma' 'tty' και 'μνήμη ' κ.λπ. Η επιλογή '-i' καθοδηγεί την εντολή grep για να αγνοήσει την κεφαλαία (κεφαλαία ή πεζά γράμματα).

[ log]# dmesg | grep -i usb
[ log]# dmesg | grep -i dma
[ log]# dmesg | grep -i tty
[ log]# dmesg | grep -i memory
Δείγμα εξόδου
[    0.000000] Scanning 1 areas for low memory corruption
[    0.000000] initial memory mapped: [mem 0x00000000-0x01ffffff]
[    0.000000] Base memory trampoline at [c009b000] 9b000 size 16384
[    0.000000] init_memory_mapping: [mem 0x00000000-0x000fffff]
[    0.000000] init_memory_mapping: [mem 0x37800000-0x379fffff]
[    0.000000] init_memory_mapping: [mem 0x34000000-0x377fffff]
[    0.000000] init_memory_mapping: [mem 0x00100000-0x33ffffff]
[    0.000000] init_memory_mapping: [mem 0x37a00000-0x37bfdfff]
[    0.000000] Early memory node ranges
[    0.000000] PM: Registered nosave memory: [mem 0x0009f000-0x000effff]
[    0.000000] PM: Registered nosave memory: [mem 0x000f0000-0x000fffff]
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[    0.000000] Memory: 2003288K/2059928K available (6352K kernel code, 607K rwdata, 2640K rodata, 880K init, 908K bss, 56640K reserved, 1146920K highmem)
[    0.000000] virtual kernel memory layout:
[    0.004291] Initializing cgroup subsys memory
[    0.004609] Freeing SMP alternatives memory: 28K (c1a3e000 - c1a45000)
[    0.899622] Freeing initrd memory: 23616K (f51d0000 - f68e0000)
[    0.899813] Scanning for low memory corruption every 60 seconds
[    0.946323] agpgart-intel 0000:00:00.0: detected 32768K stolen memory
[    1.360318] Freeing unused kernel memory: 880K (c1962000 - c1a3e000)
[    1.429066] [drm] Memory usable by graphics device = 2048M

6. Διαγράψτε τα αρχεία καταγραφής buffer dmesg

Ναι, μπορούμε να διαγράψουμε τα αρχεία καταγραφής dmesg εάν απαιτείται με την παρακάτω εντολή. Θα διαγράψει τα αρχεία καταγραφής μηνυμάτων του buffer dmesg ring μέχρι να εκτελέσετε την παρακάτω εντολή. Ωστόσο, μπορείτε να προβάλετε αρχεία καταγραφής που είναι αποθηκευμένα σε αρχεία «/var/log/dmesg». Εάν συνδέσετε οποιαδήποτε συσκευή θα δημιουργήσει έξοδο dmesg.

[ log]# dmesg -c

7. Παρακολούθηση dmesg σε πραγματικό χρόνο

Κάποια διανομή επιτρέπει την εντολή 'tail -f /var/log/dmesg' καθώς και για παρακολούθηση dmesg σε πραγματικό χρόνο.

[ log]# watch "dmesg | tail -20"

Συμπέρασμα: Η εντολή dmesg είναι χρήσιμη καθώς το dmesg καταγράφει όλες τις αλλαγές του συστήματος που έγιναν ή συμβαίνουν σε πραγματικό χρόνο. Όπως πάντα, μπορείτε να man dmesg για να λάβετε περισσότερες πληροφορίες.