Przechwytywanie błędów

Istnieje kilka metod przechwytywania błędów - jedne bardziej, drugie mniej skuteczne - każda z nich ma swoje zalety i wady. Najpopularniejszą metodą jest użycie sysklogd - demona, który zapisuje informacje wypisywane przez jądro systemu do pliku logowania (plikiem tym może być /var/log/messages lub /var/log/kern.log - zależy od konfiguracji sysklogd w naszej dystrybucji). Zaletą tej metody jest to, że w praktycznie każdej dystrybucji sysklogd jest dostępny domyślnie i nie trzeba go konfigurować. Do wad należy zaliczyć to, że jest on uruchamiany bardzo późno podczas procesu startu systemu (i bardzo wcześnie wyłączany podczas jego zamykania), co bardzo często uniemożliwia przechwycenie błędu występującego we wczesnej fazie uruchamiania systemu, lub późnej fazie jego zamykania.

W metodzie, którą możemy nazwać „tradycyjną”, wykorzystujemy kartkę papieru i coś do pisania… Jest ona bardzo czasochłonna i nikt jej nie lubi, ze względu na to, że można popełnić wiele błędów podczas przepisywania wszystkich literek i cyferek. Czasami treść błędu ucieka nam z ekranu i niewiele możemy na to poradzić, poza uruchomieniem systemu z parametrem „vga=1”, dzięki temu będziemy mieli konsolę w rozdzielczości 80 kolumn na 50 linii. Niestety przy „ciekawszych” błędach 50 linijek może się okazać niewystarczającą ilością. Zamiast przepisywać treść błędu, możemy go po prostu sfotografować i umieścić taki „zrzut ekranu” na naszym www (warto zmniejszyć rozdzielczość do np. 1024x768 i zmienić skalę kolorów na skalę szarości, zdjęcie będzie trochę mniejsze). Nie powinniśmy wysyłać zdjęć na LKML w załącznikach, ponieważ najczęściej są za duże (LKML ma ograniczoną wielkość listu do 100KB).

3.1 Konsola szeregowa

Metoda przechwytywania błędów za pomocą konsoli szeregowej ma jedną zasadniczą wadę - wymaga użycia dwóch komputerów. Łączymy je za pomocą kabla szeregowego podpiętego pod jeden z portów COM (najczęściej COM1). Na początku musimy skonfigurować konsole szeregową w jądrze

Device Drivers --->
Character devices --->
Serial drivers --->
<*> 8250/16550 and compatible serial support
[*] Console on 8250/16550 and compatible serial port

Następnie dopisujemy do /boot/grub/menu.lst
serial —unit=0 —speed=115200 —word=8 —parity=no —stop=1 terminal —timeout=5 serial console
oraz
console=ttyS0,115200n8 console=tty0
do parametrów z jakimi uruchamiamy jądro.
Wskazówki zamieszczone poniżej są specyficzne dla dystrybucji Fedora, w innych dystrybucjach wykonanie poniższych kroków może nie być potrzebne. Edytujemy plik /etc/sysconfig/init i zmiennej BOOTUP nadajemy wartość „serial”. Następnie w pliku /etc/sysconfig/kudzu włączamy tryb „SAFE=yes” a w pliku /etc/securetty dopisujemy „ttyS0”.

Teraz w pliku /etc/inittab dopisujemy linijkę
S1:23:respawn:/sbin/mgetty -L ttyS0 115200 vt100
(musimy mieć zainstalowany pakiet mgetty).

Opisane powyżej czynności warto przeprowadzić na obu komputerach - konsola szeregowa zawsze może się przydać. Jeśli jej nie potrzebujemy, wystarczy że zrobimy komentarz przed parametrami ją włączającymi.

Na komputerze, który będzie służył do przechwytywania danych uruchamiamy program
# minicom -o -C log.txt
Prawdopodobnie otrzymamy błąd „Device /dev/modem/ acces failed: (..)”, aby temu zaradzić wystarczy utworzyć dowiązanie symboliczne do ttyS0
# ln -s /dev/ttyS0 /dev/modem
Pamiętaj o ustawieniu odpowiednich parametrów transmisji!
Więcej informacji na temat konfiguracji konsoli szeregowej możemy znaleźć w pliku Documentation/serial-console.txt

3.2 Konsola sieciowa

Największą wadą tej metody przechwytywania błędów (tak jak w przypadku konsoli szeregowej) jest to, że wymaga użycia dwóch komputerów. Z kolei niewątpliwą zaletą jest to, że komputery mogą być w znacznej odległości od siebie - nie ogranicza nas długość kabla szeregowego. Trochę mniejszą wadą konsoli sieciowej jest to, że zaczyna działać dopiero po uruchomieniu sieci, więc nie będzie się nadawała do przechwytywania wszystkich błędów.

(Niestety konsola sieciowa działa tylko na kartach Ethernet.)
Konfigurację zaczynamy od wybrania jednej opcji podczas konfiguracji jądra

Device Drivers --->
Network device support --->
<*>    Network console logging support (EXPERIMENTAL)

Następnie do parametrów jądra dodajemy linijkę podobną do poniższej
netconsole=1.001.861.291|4444#1.001.861.291|4444/eth0,2.001.861.291|6666#2.001.861.291|6666/00:14:38:C3:3F:C4

Pierwsze trzy parametry dotyczą komputera, z którego będziemy przechwytywać dane:
4444 - oznacza port na którym będą one wysyłane
192.168.100.1 - adres IP interfejsu
eth0 - interfejs przez który będziemy wysyłać dane
Kolejne trzy parametry odnoszą się do komputera na którym będziemy przechwytywać błąd:
6666 - port na którym będziemy nasłuchiwać
192.168.100.2 - adres IP interfejsu, który będzie odbierał dane
00:14:38:C3:3F:C4 - MAC adres karty, która będzie odbierać dane
Następnie na komputerze, który posłuży nam do przechwytywania błędów uruchamiamy np.
program netcat http://netcat.sourceforge.net/
# netcat -u -l -p 6666

Użyteczne informacje na temat konsoli sieciowej można znaleźć w Documentation/networking/netconsole.txt

Krótkie wskazówki:
• zapoznaj się z poleceniem dmesg
• znajdź plik w którym twoja ulubiona dystrybucja przechowuje logi jądra

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-Share Alike 2.5 License.