Jak korzystać z polecenia dmesg w systemie Linux

Polecenie dmesg pozwala zajrzeć do ukrytego świata procesów uruchamiania Linuksa. Przeglądaj i monitoruj komunikaty o urządzeniach i sterownikach z własnego bufora pierścieniowego jądra za pomocą „przyjaciela wyszukiwarki błędów”.

Jak działa bufor pierścienia Linuksa

W komputerach z systemem Linux i Uniksopodobnym rozruch i uruchamianie to dwie odrębne fazy sekwencji zdarzeń, które mają miejsce, gdy komputer jest włączony.

Procesy rozruchowe (BIOS lub UEFI, MBR, i ŻARCIE) prowadzą inicjalizację systemu do punktu, w którym jądro jest ładowane do pamięci i podłączane do początkowego ramdysku (initrd lub initramfs), i systemd jest uruchomiony.

Następnie procesy startowe przejmują pałeczkę i kończą inicjalizację systemu operacyjnego. Na bardzo wczesnych etapach inicjalizacji demony rejestrujące, takie jak syslogd lub rsyslogd jeszcze nie działają. Aby uniknąć utraty ważnych komunikatów o błędach i ostrzeżeń z tej fazy inicjalizacji, jądro zawiera plik bufor pierścieniowy którego używa jako magazynu wiadomości.

Bufor pierścieniowy to przestrzeń pamięci zarezerwowana na wiadomości. Jest prosty w konstrukcji i ma stały rozmiar. Gdy jest pełny, nowsze wiadomości zastępują najstarsze wiadomości. Koncepcyjnie można to traktować jako „bufor kołowy. ”

Bufor pierścieniowy jądra przechowuje informacje, takie jak komunikaty inicjalizacji sterowników urządzeń, komunikaty ze sprzętu i komunikaty z modułów jądra. Ponieważ zawiera te niskopoziomowe komunikaty startowe, bufor pierścieniowy jest dobrym miejscem do rozpoczęcia badania błędów sprzętowych lub innych problemów z uruchamianiem.

Ale nie idź z pustymi rękami. Zabierz ze sobą dmesg.

Polecenie dmesg

Polecenie dmesg na to pozwala aby przejrzeć komunikaty przechowywane w buforze pierścieniowym. Domyślnie, aby użyć dmesg, musisz użyć sudo.

sudo dmesg

sudo dmesg w oknie terminala

Wszystkie wiadomości w buforze pierścieniowym są wyświetlane w oknie terminala.

Dane wyjściowe z sudo dmesg w oknie terminala

To był potop. Oczywiście musimy przepuścić to przez mniej:

sudo dmesg | less

sudo dmesg |  mniej w oknie terminala

Teraz możemy przewijać wiadomości szukając interesujących nas elementów.

dmesg w less w oknie terminala

Możesz użyć funkcji wyszukiwania w less, aby znaleźć i podświetlić interesujące Cię elementy i terminy. Uruchom funkcję wyszukiwania, naciskając klawisz ukośnika „/” w less.

Usunięcie potrzeby sudo

Jeśli chcesz uniknąć konieczności używania sudo za każdym razem, gdy używasz dmesg, możesz użyć tego polecenia. Ale bądź świadomy: pozwala każdemu, kto ma konto użytkownika na twoim komputerze, na używanie dmesg bez konieczności używania sudo.

sudo sysctl -w kernel.dmesg_restrict=0

sudo sysctl -w kernel.dmesg_restrict = 0 w oknie terminala

Wymuszanie drukowania w kolorze

Domyślnie dmesg zostanie prawdopodobnie skonfigurowany do tworzenia kolorowych wyników. Jeśli tak nie jest, możesz powiedzieć dmesg, aby pokolorował swoje wyjście za pomocą opcji -L (kolor).

sudo dmesg -L

sudo dmesg -L w oknie terminala

Aby wymusić na dmesg zawsze domyślne wyświetlanie kolorowego wyświetlacza, użyj tego polecenia:

sudo dmesg --color=always

sudo dmesg --color = zawsze w oknie terminala

Znaczniki czasu ludzi

Domyślnie dmesg używa notacji znacznika czasu w sekundach i nanosekund od czasu uruchomienia jądra. Aby renderować to w formacie bardziej przyjaznym dla człowieka, użyj opcji -H (człowiek).

sudo dmesg -H

sudo dmesg -H w oknie terminala

To powoduje dwie rzeczy.

wyjście z sudo dmesg -H w oknie terminala

Wynik jest automatycznie wyświetlany w mniej.
Znaczniki czasu przedstawiają znacznik czasu z datą i godziną z dokładnością do minuty. Wiadomości, które pojawiły się w każdej minucie, są oznaczone sekundami i nanosekundami od początku tej minuty.

Znaczniki czasu czytelne dla ludzi

Jeśli nie potrzebujesz dokładności w nanosekundach, ale chcesz, aby znaczniki czasu były łatwiejsze do odczytania niż domyślne, użyj opcji -T (czytelny dla człowieka). (To trochę zagmatwane. -H to opcja „ludzka”, -T opcja „czytelna dla człowieka”).

sudo dmesg -T

sudo dmesg -T w oknie terminala

Znaczniki czasu są renderowane jako standardowe daty i godziny, ale rozdzielczość jest obniżana do minuty.

wyjście z sudo dmesg -T w oknie terminala

Wszystko, co wydarzyło się w ciągu jednej minuty, ma ten sam znacznik czasu. Jeśli przeszkadza ci tylko kolejność wydarzeń, to wystarczy. Zwróć też uwagę, że jesteś zrzucany z powrotem w wierszu polecenia. Ta opcja nie wywołuje automatycznie less.

Oglądanie wydarzeń na żywo

Aby zobaczyć wiadomości przychodzące do bufora pierścieniowego jądra, użyj opcji –follow (czekaj na komunikaty). To zdanie może wydawać się trochę dziwne. Jeśli bufor pierścieniowy jest używany do przechowywania wiadomości ze zdarzeń, które mają miejsce podczas sekwencji startowej, w jaki sposób wiadomości na żywo mogą docierać do bufora pierścieniowego, gdy komputer jest już uruchomiony i działa?

Wszystko, co powoduje zmianę sprzętu podłączonego do komputera, spowoduje wysłanie wiadomości do bufora pierścieniowego jądra. Zaktualizuj lub dodaj moduł jądra, a zobaczysz komunikaty bufora pierścieniowego o tych zmianach. Jeśli podłączysz dysk USB lub podłączysz lub odłączysz urządzenie Bluetooth, zobaczysz komunikaty na wyjściu dmesg. Nawet sprzęt wirtualny spowoduje pojawienie się nowych wiadomości w buforze pierścieniowym. Uruchom maszynę wirtualną, a zobaczysz nowe informacje pojawiające się w buforze pierścieniowym.

sudo dmesg --follow

sudo dmesg - obserwuj w oknie terminala

Zauważ, że nie powrócisz do wiersza poleceń. Kiedy pojawiają się nowe wiadomości, są one wyświetlane przez dmesg na dole okna terminala.

Wyjście z sudo dmesg - podążaj za oknem terminala

Nawet zamontowanie dysku CD-ROM jest postrzegane jako zmiana, ponieważ przeszczepiłeś zawartość dysku CD-ROM do drzewa katalogów.

Komunikaty bufora pierścieniowego dmesg w wyniku zamontowania dysku CD-ROM

Aby wyjść z kanału w czasie rzeczywistym, naciśnij Ctrl + C.

Pobierz ostatnie dziesięć wiadomości

Użyj polecenia ogon aby pobrać ostatnie dziesięć komunikaty bufora pierścieniowego jądra. Oczywiście możesz pobrać dowolną liczbę wiadomości. Dziesięć to tylko nasz przykład.

sudo dmesg | last -10

sudo dmesg |  ostatnie -10 w oknie terminala

Ostatnie dziesięć wiadomości jest pobieranych i wyświetlanych w oknie terminala.

Dane wyjściowe z sudo dmsesg |  tail -10 w oknie terminala

Wyszukiwanie określonych terminów

Przekieruj wyjście z dmesg do grep aby wyszukać określone ciągi lub wzorce. Tutaj używamy opcji -i (ignoruj ​​wielkość liter), aby wielkość pasujących łańcuchów była pomijana. nasze wyniki będą zawierać „usb” i „USB” oraz dowolną inną kombinację małych i wielkich liter.

sudo dmesg | grep -i usb

sudo dmesg |  grep -i usb w oknie terminala

Wyróżnione wyniki wyszukiwania są zapisane wielkimi i małymi literami.

Wyniki wyszukiwania zawierające wielkie i małe litery w oknie terminala

Możemy wyodrębnić wiadomości, które zawierają odniesienia do pierwszego SCSI dysk twardy w systemie sda. (W rzeczywistości sda jest obecnie używany również dla pierwszy dysk twardy SATAi dla dysków USB.)

sudo dmesg | grep -i sda

sudo dmesg |  grep -i sda w oknie terminala

Wszystkie wiadomości, które wspominają o sda, są pobierane i wyświetlane w oknie terminala.

wyjście z sudo dmesg |  grep -i sda w oknie terminala

Aby grep wyszukał wiele terminów jednocześnie, użyj opcji -E (rozszerzenie wyrażenia regularnego). Musisz podać wyszukiwane hasła wewnątrz cudzysłowu z pionową kreską „|” separatory między wyszukiwanymi terminami:

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

sudo dmesg |  grep -E

Każda wiadomość, w której wspomina się którykolwiek z wyszukiwanych terminów, jest wyświetlana w oknie terminala.

wyjście z sudo dmesg |  grep -E

Korzystanie z poziomów dziennika

Każda wiadomość zapisana w buforze pierścieniowym jądra ma przypisany poziom. Poziom reprezentuje ważność informacji zawartych w wiadomości. Poziomy to:

emerg: System jest bezużyteczny.
alert: należy natychmiast podjąć działanie.
kryt: Warunki krytyczne.
err: warunki błędu.
warn: warunki ostrzegawcze.
uwaga: stan normalny, ale znaczący.
info: Informacyjne.
debug: komunikaty na poziomie debugowania.

Możemy sprawić, że dmesg wyodrębni wiadomości, które pasują do określonego poziomu, używając opcji -l (poziom) i przekazując nazwę poziomu jako parametr wiersza poleceń. Aby zobaczyć tylko komunikaty na poziomie „informacyjnym”, użyj tego polecenia:

sudo dmesg -l info

sudo dmesg -l info w oknie terminala

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

Wyjście z sudo dmesg -l info w oknie terminala

Połącz dwa lub więcej poziomów dziennika w jednym poleceniu, aby pobrać komunikaty z kilku poziomów dziennika:

sudo dmesg -l debug,notice

sudo dmesg -l debug, uwaga w oknie terminala

Dane wyjściowe z dmesg to mieszanka komunikatów z każdego poziomu dziennika:

Wyjście z sudo dmesg -l debug, informacja w oknie terminala

Kategorie obiektów

Wiadomości dmesg są pogrupowane w kategorie zwane „udogodnieniami”. Lista obiektów to:

kern: komunikaty jądra.
user: wiadomości na poziomie użytkownika.
mail: system pocztowy.
demon: demony systemowe.
auth: wiadomości dotyczące bezpieczeństwa / autoryzacji.
syslog: wewnętrzne komunikaty syslogd.
lpr: podsystem drukarki wierszowej.
news: podsystem wiadomości sieciowych.

Możemy poprosić dmesg, aby przefiltrował swoje wyjście, aby pokazać komunikaty tylko z określonego obiektu. Aby to zrobić, musimy użyć opcji -f (ułatwienie):

sudo dmesg -f daemon

sudo dmesg -f demon w oknie terminala

dmesg wyświetla wszystkie komunikaty dotyczące demonów w oknie terminala.

wyjście z demona sudo dmesg -f w oknie terminala

Tak jak zrobiliśmy z poziomami, możemy poprosić dmesg o wyświetlenie wiadomości z więcej niż jednego obiektu naraz:

sudo dmesg -f syslog, daemon

sudo dmesg -f syslog, demon w oknie terminala

Dane wyjściowe to połączenie komunikatów dziennika syslog i demona.

wyjście z sudo dmesg -f syslog, demon w oknie terminala

Połączenie obiektu i poziomu

Opcja -x (dekodowanie) sprawia, że ​​dmesg wyświetla obiekt i poziom jako czytelne dla człowieka przedrostki do każdej linii.

sudo dmesg -x

sudo dmesg -x w oknie terminala

Placówka i poziom można zobaczyć na początku każdej linii:

Wyjście z sudo dmesg -x w oknie terminala

Pierwsza podświetlona sekcja to wiadomość z narzędzia „jądro” z poziomem „powiadomienia”. Druga podświetlona sekcja to wiadomość z narzędzia „jądro” z poziomem „info”.

To świetnie, ale dlaczego?

Krótko mówiąc, znajdowanie błędów.

Jeśli masz problemy z nierozpoznawanym lub nieprawidłowym działaniem sprzętu, dmesg może rzucić trochę światła na problem.

Użyj dmesg, aby przejrzeć wiadomości od najwyższego poziomu do każdego niższego poziomu, szukając błędów lub ostrzeżeń, które wspominają o sprzęcie lub mogą mieć wpływ na problem.
Użyj dmesg, aby wyszukać jakiekolwiek wzmianki o odpowiednim obiekcie, aby sprawdzić, czy zawierają one przydatne informacje.
Przejedź dmesg przez grep i poszukaj powiązanych ciągów lub identyfikatorów, takich jak producent produktu lub numer modelu.
Prześlij dmesg przez grep i poszukaj ogólnych terminów, takich jak „gpu” lub „pamięć”, lub takich jak „awaria”, „niepowodzenie” lub „niemożność”.
Użyj opcji –follow i oglądaj wiadomości dmesg w czasie rzeczywistym.

Udanego polowania.