Jak korzystać z polecenia dmesg w systemie Linux

Photo of author

By maciekx

Polecenie dmesg otwiera drzwi do fascynującego świata procesów uruchamiania systemu Linux. Umożliwia przeglądanie i monitorowanie komunikatów dotyczących urządzeń oraz sterowników z lokalnego bufora pierścieniowego jądra, pełniąc rolę „przyjaciela w poszukiwaniu błędów”.

Jak działa bufor pierścienia w systemie Linux

W systemach Linux i pokrewnych, proces uruchamiania składa się z dwóch odrębnych faz, które zachodzą, gdy komputer jest włączany.

Inicjalizacja systemu (poprzez BIOS, UEFI, MBR i GRUB) prowadzi do momentu, w którym jądro jest ładowane do pamięci i łączy się z początkowym ramdyskiem (initrd lub initramfs), a następnie uruchamiane jest systemd.

Następnie procesy startowe przejmują kontrolę, finalizując inicjalizację systemu operacyjnego. Na bardzo wczesnym etapie, kiedy demony rejestrujące, takie jak syslogd czy rsyslogd, jeszcze nie działają, jądro wykorzystuje bufor pierścieniowy jako miejsce do przechowywania komunikatów.

Bufor pierścieniowy to wydzielona przestrzeń w pamięci, w której przechowywane są wiadomości. Jego konstrukcja jest prosta i ma stałą wielkość. Gdy bufor się zapełni, nowe wiadomości zastępują najstarsze. Można go sobie wyobrazić jako „bufor kołowy”.

W buforze pierścieniowym jądra gromadzone są informacje, takie jak komunikaty dotyczące inicjalizacji sterowników, wiadomości sprzętowe oraz komunikaty z modułów jądra. Z racji tego, że zawiera on komunikaty startowe niskiego poziomu, jest to doskonałe miejsce do analizy problemów z uruchamianiem lub sprzętem.

Nie zapomnij jednak zabrać ze sobą dmesg.

Co to jest polecenie dmesg

Polecenie dmesg umożliwia przeglądanie komunikatów zgromadzonych w buforze pierścieniowym. Domyślnie, aby użyć dmesg, potrzebne jest uprawnienie sudo.

sudo dmesg

Wszystkie komunikaty w buforze pierścieniowym będą wyświetlane w terminalu.

Wynik jest dość obszerny, więc warto użyć less, aby to przefiltrować:

sudo dmesg | less

Teraz możesz przewijać komunikaty, szukając tych, które Cię interesują.

Możesz skorzystać z opcji wyszukiwania w less, aby znaleźć i podświetlić interesujące Cię hasła, naciskając klawisz ukośnika „/”.

Jak usunąć konieczność używania sudo

Jeśli chcesz zredukować potrzebę używania sudo za każdym razem przy dmesg, możesz to osiągnąć za pomocą poniższego polecenia. Należy jednak pamiętać, że pozwala to każdemu użytkownikowi na komputerze na dostęp do dmesg bez uprawnień sudo.

sudo sysctl -w kernel.dmesg_restrict=0

Wymuszanie kolorowego wyjścia

Domyślnie dmesg może być skonfigurowany do wyświetlania wyników w kolorze. W przypadku, gdyby tak nie było, możesz wymusić kolorowe wyjście, stosując opcję -L.

sudo dmesg -L

Aby dmesg zawsze prezentował kolorowe wyjście, użyj tego polecenia:

sudo dmesg --color=always

Znaczniki czasu w przyjaznym formacie

W domyślnej konfiguracji dmesg używa notacji czasowej w sekundach oraz nanosekundach od momentu uruchomienia jądra. Aby wyświetlić je w bardziej przejrzystym formacie, można skorzystać z opcji -H.

sudo dmesg -H

To polecenie wykonuje dwie rzeczy.

Wynik jest automatycznie przesyłany do less. Znaczniki czasu są prezentowane z dokładnością do minuty. Wiadomości, które pojawiły się w danej minucie, są oznaczone sekundami i nanosekundami od początku tej minuty.

Czytelne dla ludzi znaczniki czasu

Jeśli nie potrzebujesz precyzyjnych nanosekund, ale chciałbyś, aby znaczniki czasu były prostsze w odczycie, użyj opcji -T (czytelny dla ludzi). (To może być mylące. -H oznacza „ludzki” format, podczas gdy -T to „czytelny dla ludzi”.)

sudo dmesg -T

Wyniki są prezentowane jako standardowe daty i godziny, ale rozdzielczość jest ograniczona do minut.

Wszystkie zdarzenia, które miały miejsce w danej minucie, będą miały ten sam znacznik czasu. Jeśli interesuje Cię jedynie kolejność zdarzeń, to wystarczy. Zauważ, że powracasz do wiersza poleceń po wykonaniu tej opcji, ponieważ nie uruchamia ona automatycznie less.

Obserwacja zdarzeń na żywo

Aby na bieżąco śledzić wiadomości w buforze pierścieniowym jądra, użyj opcji –follow (obserwuj komunikaty). Może to brzmieć nieco dziwnie. Jeśli bufor pierścieniowy jest wykorzystywany do przechowywania komunikatów ze zdarzeń podczas uruchamiania, to jak mogą do niego docierać nowe wiadomości, gdy komputer jest już uruchomiony?

Każda zmiana sprzętu podłączonego do komputera generuje komunikaty w buforze pierścieniowym jądra. Aktualizując lub dodając moduł jądra, zauważysz komunikaty dotyczące tych zmian. Podłączając dysk USB lub podłączając czy odłączając urządzenie Bluetooth, komunikaty dmesg będą się pojawiać. Nawet sprzęt wirtualny generuje nowe wiadomości w buforze pierścieniowym. Uruchomienie maszyny wirtualnej również spowoduje, że nowe informacje pojawią się w buforze.

sudo dmesg --follow

Warto zauważyć, że nie wrócisz do wiersza poleceń. Kiedy pojawiają się nowe komunikaty, dmesg wyświetla je na dole okna terminala.

Podłączenie dysku CD-ROM jest także traktowane jako zmiana, ponieważ jego zawartość jest włączana do systemu plików.

Aby zakończyć obserwację w czasie rzeczywistym, naciśnij Ctrl + C.

Pobieranie ostatnich dziesięciu komunikatów

Możesz użyć polecenia tail aby pobrać dziesięć ostatnich komunikatów z bufora pierścieniowego jądra. Oczywiście można uzyskać dowolną liczbę wiadomości, dziesięć to tylko przykład.

sudo dmesg | tail -10

Ostatnie dziesięć komunikatów zostanie pobranych i wyświetlonych w terminalu.

Wyszukiwanie konkretnych terminów

Możesz przekierować wyjście z dmesg do grep aby wyszukać konkretne frazy lub wzorce. W tym przypadku używamy opcji -i (ignoruj wielkość liter), co oznacza, że wyniki będą zawierały zarówno „usb”, jak i „USB”, oraz inne kombinacje wielkości liter.

sudo dmesg | grep -i usb

Wyniki wyszukiwania będą wyświetlane niezależnie od wielkości liter.

Możemy również wyodrębnić komunikaty, które dotyczą pierwszego dysku SCSI oznaczonego sda. (W rzeczywistości sda jest obecnie używane także dla pierwszego dysku SATA oraz dla dysków USB.)

sudo dmesg | grep -i sda

Wszystkie komunikaty odnoszące się do sda będą wyświetlane w terminalu.

Aby grep mógł wyszukiwać wiele terminów jednocześnie, można użyć opcji -E (rozszerzone wyrażenia regularne). Wyszukiwane hasła powinny być umieszczone w cudzysłowach, oddzielone pionową kreską „|”:

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

Wszystkie komunikaty, które zawierają którekolwiek z wyszukiwanych terminów, będą wyświetlane w terminalu.

Wykorzystanie poziomów logów

Każdy komunikat w buforze pierścieniowym jądra ma przypisany poziom, który określa jego ważność. Poziomy są następujące:

emerg: System jest bezużyteczny.
alert: wymaga natychmiastowego działania.
crit: Warunki krytyczne.
err: Warunki błędu.
warn: Warunki ostrzegawcze.
notice: Stan normalny, ale istotny.
info: Informacyjne.
debug: Komunikaty na poziomie debugowania.

Możemy skonfigurować dmesg, aby wyodrębnił komunikaty na określonym poziomie, używając opcji -l (level) oraz podając nazwę poziomu jako argument:

sudo dmesg -l info

Wszystkie wyświetlane komunikaty są informacyjne. Nie zawierają błędów ani ostrzeżeń, a jedynie przydatne powiadomienia.

Możemy połączyć dwa lub więcej poziomów w jednym poleceniu, aby uzyskać komunikaty z różnych poziomów:

sudo dmesg -l debug,notice

Wyjście z dmesg będzie zawierać mieszankę komunikatów z wszystkich określonych poziomów:

Kategorie komunikatów

Wiadomości dmesg są organizowane w kategorie zwane „ułatwieniami”. Oto lista kategorii:

kern: komunikaty jądra.
user: wiadomości na poziomie użytkownika.
mail: system pocztowy.
daemon: komunikaty dotyczące demonów systemowych.
auth: wiadomości związane z bezpieczeństwem/autoryzacją.
syslog: komunikaty wewnętrzne syslogd.
lpr: podsystem drukowania.
news: komunikaty systemu wiadomości sieciowych.

Możemy poprosić dmesg o przefiltrowanie wyjścia, aby pokazać tylko komunikaty z określonej kategorii. W tym celu używamy opcji -f (facility):

sudo dmesg -f daemon

Wyniki wyświetlą wszystkie komunikaty związane z demonami.

Podobnie jak w przypadku poziomów, możemy również poprosić dmesg o pokazanie komunikatów z więcej niż jednej kategorii jednocześnie:

sudo dmesg -f syslog,daemon

Wyjście będzie zawierać komunikaty zarówno z poziomu syslog, jak i demonów.

Łączenie kategorii i poziomów

Opcja -x (decode) powoduje, że dmesg wyświetla kategorię i poziom jako czytelne dla ludzi przedrostki każdej linii.

sudo dmesg -x

Kategoria i poziom będą wyświetlane na początku każdej linii:

Pierwsza sekcja to wiadomość z kategorii „kernel” z poziomem „notice”. Druga sekcja to wiadomość z kategorii „kernel” z poziomem „info”.

Dlaczego to jest ważne?

Ostatecznie chodzi o identyfikację błędów.

Jeśli napotykasz problemy z nierozpoznawanym lub nieprawidłowo działającym sprzętem, dmesg może pomóc w zdiagnozowaniu problemu.

Korzystaj z dmesg, przeglądając komunikaty od najwyższego poziomu do najniższego, aby znaleźć błędy lub ostrzeżenia związane z sprzętem, które mogą być przyczyną problemów.
Szukaj wzmiankowania odpowiednich obiektów, aby sprawdzić, czy zawierają użyteczne informacje.
Użyj dmesg w połączeniu z grep, aby wyszukiwać ciągi powiązane, takie jak producent lub numer modelu.
Możesz także użyć grep do przeszukiwania ogólnych terminów, jak „gpu”, „pamięć”, czy „awaria”, „niepowodzenie” lub „problem”.
Skorzystaj z opcji –follow, aby obserwować wiadomości dmesg w czasie rzeczywistym.

Powodzenia w poszukiwaniu!


newsblog.pl