Вывод лога ядра по сети с помощью netconsole

Материал из Rosalab Wiki
Версия от 10:52, 22 сентября 2014; Euspectre (обсуждение | вклад) (Новая страница: «Бывает, что ядро Linux падает с kernel oops или panic. К сожалению, при этом компоненты, отвечающие з…»)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Это снимок страницы. Он включает старые, но не удалённые версии шаблонов и изображений.
Перейти к: навигация, поиск

Бывает, что ядро Linux падает с kernel oops или panic. К сожалению, при этом компоненты, отвечающие за сохранение лога ядра на диске, нередко "умирают" первыми. Информация о том, что именно произошло и где (oops info, backtrace, ...) теряется, за исключением той части, которая выводится при этом на экран.

Можно настроить вывод лога ядра на другую машину по serial-соединению (например, через COM-порт). Удобно для виртуальных машин, но для реальных - не всегда.

Вместо этого можно использовать модуль ядра "netconsole" для вывода лога ядра по сети по протоколу UDP. Для ROSA Desktop Fresh он поставляется вместе с ядром как загружаемый модуль. Подробное описание этого компонента - в файле netconsole.txt в документации по ядру. Ниже - типовой сценарий использования.

Допустим, есть 2 машины, "А" и "Б" и логи ядра с первой нужно передать на вторую, допустим, на порт 12345.

Последовательность действий такая.

На машине "Б" (т.е. на принимающей стороне):

  • если используется firewall - открыть выбранный порт (12345) для доступа с машины "А";
  • запустить netcat или что-то аналогичное, что будет сохранять полученные данные в файл, например:
nc -l -u -p 12345 > netconsole.log

Если на машине "Б" - MS Windows, можно использовать этот вариант netcat

На машине "А" (т.е. на той, откуда передаётся лог):

  • лучше, если она будет подключена к сети по проводному соединению - на всякий случай;
  • полезно включить вывод в лог ядра всех выводимых ядром сообщений, даже отладочных:
dmesg -n 7
  • загрузить модуль netconsole с нужными параметрами:
modprobe netconsole netconsole=@/<устройство>,<порт>@<ip_машины_Б>/[mac_адрес_сетевой_карты_на_машине_Б]

т.е., например:

modprobe netconsole netconsole=@/eth0,12345@192.168.56.185/c6:2e:79:26:35:6b

Теперь всё, что выводится в лог ядра, будет отправлено на машину "Б", даже, если на "А" "упадёт" ядро (если, конечно, не будет сбоев в самой сетевой подсистеме ядра).