Czasami system Linux ni stad ni zowąd wiesza się, wtedy jedynym wyjściem jest restart systemu nie pozostawiając śladu co było przyczyna problemu. Jest sposób by logi (printk) jądra systemu były wyświetlane dynamicznie na konsoli jak tylko jakieś się pojawiają w buforze jądra. Dzieki temu w momencie wystąpienia problemu zobaczymy ślad wywołania (call trace) i na jego podstawie będziemy mniej więcej mogli powiedzieć gdzie leży przyczyna.
Zeby wyświetlić aktualne logi kernela możemy wykonać komendę:
dmesg ... [ 6.784477] r8169 0000:02:00.0 enp2s0: link up [ 6.784500] IPv6: ADDRCONF(NETDEV_CHANGE): enp2s0: link becomes ready [ 18.457324] random: crng init done [ 20.704876] NFS: Registering the id_resolver key type [ 20.704880] Key type id_resolver registered [ 20.704880] Key type id_legacy registered [ 23.062071] tun: Universal TUN/TAP device driver, 1.6 ...
Jednak w momencie wystąpienia krytycznego błędu konsola jest zawieszona wiec nie wykonamy powyższej komendy ale zanim wystąpi problem możemy wymusić wyświetlanie logów na ekran. Dokonujemy tego poprzez ustawienie poziomu komunikatów wypisywanych na konsolę opcja dmesg -n. Przykładowo żeby wyświetlać wszystkie poziomy logów przekazujemy parametr:
dmesg -n 8
Ustawia to pierwsza opcje (console_loglevel) printk w procfs:
dmesg -n8 cat /proc/sys/kernel/printk 7 4 1 7 dmesg -n8 cat /proc/sys/kernel/printk 8 4 1 7
Dostępne poziomy jakie możemy ustawić:
#define KERN_EMERG "<0>" #define KERN_ALERT "<1>" #define KERN_CRIT "<2>" #define KERN_ERR "<3>" #define KERN_WARNING "<4>" #define KERN_NOTICE "<5>" #define KERN_INFO "<6>" #define KERN_DEBUG "<7>"
Przy czym wartość 8 wyświetli na konsoli komunikaty z dowolnym poziomem.
Po ustawieniu tego parametru i o ile mamy jakiś scenariusz który doprowadza do zawieszenia lub tez będziemy cierpliwie czekać aż problem się powtórzy, kernel pokaże ślad wywołania i na jego podstawie będziemy mogli robić dalsze rozpoznanie, naprawę lub tez zgłoszenie problemu na grupach dyskusyjnych.
Opisany sposób jest jednym z podstawowych możliwości debugu jądra jednak nie nie zawodnym gdyż czasami nawet ustawienie „console loglevel” nie gwarantuje wyświetlenia przyczyny problemu. Jednak Linux dostarcza inne bardziej pewne sposoby (linux kernel kdump) ale to już temat na inny artykuł.
Dodaj komentarz