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

Материал из Rosalab Wiki
Перейти к: навигация, поиск
(Новая страница: «Бывает, что ядро Linux падает с kernel oops или panic. К сожалению, при этом компоненты, отвечающие з…»)
 
м
 
(не показаны 3 промежуточные версии этого же участника)
Строка 19: Строка 19:
  
 
На машине "А" (т.е. на той, откуда передаётся лог):
 
На машине "А" (т.е. на той, откуда передаётся лог):
* лучше, если она будет подключена к сети по проводному соединению - на всякий случай;
+
* нужно подключние к сети по проводному соединению: с беспроводными netconsole не умеет работать;
 
* полезно включить вывод в лог ядра всех выводимых ядром сообщений, даже отладочных:
 
* полезно включить вывод в лог ядра всех выводимых ядром сообщений, даже отладочных:
 
<pre>
 
<pre>
 
dmesg -n 7
 
dmesg -n 7
 
</pre>
 
</pre>
* загрузить модуль ''netconsole'' с нужными параметрами:
+
 
 +
Или можно при загрузке системы задать параметр ядра ''ignore_loglevel''.
 +
 
 +
Также бывает полезно с помощью соотв. параметров загрузки включить отладочные режимы для тех подсистем ядра, которые хочется проанализировать, например:
 +
:*''drm.debug=0x06'', если отлаживаем графические драйверы;
 +
:*''no_console_suspend'', если отлаживаем suspend/resume.
 +
 
 +
* Загрузить модуль ''netconsole'' с нужными параметрами:
 
<pre>
 
<pre>
modprobe netconsole netconsole=@/<устройство>,<порт>@<ip_машины_Б>/[mac_адрес_сетевой_карты_на_машине_Б]
+
modprobe netconsole netconsole=@[ip_машины_А]/[<устройство>],<порт>@<ip_машины_Б>/[mac_адрес_сетевой_карты_на_машине_Б]
 
</pre>
 
</pre>
 
т.е., например:
 
т.е., например:
Строка 33: Строка 40:
 
</pre>
 
</pre>
  
Теперь всё, что выводится в лог ядра, будет отправлено на машину "Б", даже, если на "А" "упадёт" ядро (если, конечно, не будет сбоев в самой сетевой подсистеме ядра).
+
Или:
 +
 
 +
<pre>
 +
modprobe netconsole netconsole=@192.168.56.236/,12345@192.168.56.185/
 +
</pre>
 +
 
 +
В последнем случае важно '''не забыть завершающий слэш''', иначе модуль netconsole не поймёт, что ему передали, и не загрузится.
 +
 
 +
После того, как модуль netconsole загружен, всё, что выводится в лог ядра, будет отправлено на машину "Б", даже, если на "А" "упадёт" ядро (если, конечно, не будет сбоев в самой сетевой подсистеме ядра).
 +
 
 +
=== <div id="boot_time">Вывод лога по сети при загрузке системы</div> ===
 +
 
 +
''netconsole'' можно использовать и для этого, но тут есть несколько хитростей.
 +
 
 +
Во-первых, нужно использовать ядро, в которое netconsole встроен при сборке, а не собран как модуль: на ранних стадиях загрузки системы внешние модули ядра не подключить.
 +
 
 +
Во-вторых, в ядро должен быть встроен не только netconsole, но и используемый сетевой драйвер - по тем же причинам.
 +
 
 +
Для дистрибутивов ROSA Linux, основанных на платформе 2014.1, напр., ROSA R4 и R5, такое ядро можно взять отсюда (только для x86_64 на данный момент):
 +
* [http://file-store.rosalinux.ru/download/25a275c565fd242eca274f0991277d4ccc85ede6 kernel-nrj-desktop-3.14.31-1netconsole-1-1-rosa2014.1.x86_64.rpm]
 +
* [http://file-store.rosalinux.ru/download/e33c86202eeaa614e1a425ad682c33a35d50ef11 kernel-nrj-desktop-devel-3.14.31-1netconsole-1-1-rosa2014.1.x86_64.rpm]
 +
 
 +
В это ядро встроен netconsole, а также драйверы для нескольких часто встречающихся сетевых карт: e1000e, e1000, r8169, atl1c, atl1e.
 +
 
 +
На той машине, куда будет выводиться лог, действия те же, что и раньше:
 +
<pre>
 +
nc -l -u -p <номер_порта> > netconsole.log
 +
</pre>
 +
 
 +
На той машине, лог с которой нужно сохранить, нужно установить оба указанных выше пакета с ядром. Затем стоит перезагрузить систему, выбрать в меню загрузчика ядро "kernel-nrj-desktop-3.14.31-1netconsole" и добавить нужные опции ядру, как минимум:
 +
  ignore_loglevel netconsole=@<ip_откуда_отправлять>/,<номер_порта>@<IP_куда_отправлять>/
 +
 
 +
Кстати, с виртуальными машинами этот вариант может и не сработать. Впрочем, там нередко удобнее тот же лог загрузки выводить не по сети, а через serial console (связанную с вирт. COM-портом).

Текущая версия на 16:40, 6 февраля 2015

Бывает, что ядро 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

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

  • нужно подключние к сети по проводному соединению: с беспроводными netconsole не умеет работать;
  • полезно включить вывод в лог ядра всех выводимых ядром сообщений, даже отладочных:
dmesg -n 7

Или можно при загрузке системы задать параметр ядра ignore_loglevel.

Также бывает полезно с помощью соотв. параметров загрузки включить отладочные режимы для тех подсистем ядра, которые хочется проанализировать, например:

  • drm.debug=0x06, если отлаживаем графические драйверы;
  • no_console_suspend, если отлаживаем suspend/resume.
  • Загрузить модуль netconsole с нужными параметрами:
modprobe netconsole netconsole=@[ip_машины_А]/[<устройство>],<порт>@<ip_машины_Б>/[mac_адрес_сетевой_карты_на_машине_Б]

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

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

Или:

modprobe netconsole netconsole=@192.168.56.236/,12345@192.168.56.185/

В последнем случае важно не забыть завершающий слэш, иначе модуль netconsole не поймёт, что ему передали, и не загрузится.

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

Вывод лога по сети при загрузке системы

netconsole можно использовать и для этого, но тут есть несколько хитростей.

Во-первых, нужно использовать ядро, в которое netconsole встроен при сборке, а не собран как модуль: на ранних стадиях загрузки системы внешние модули ядра не подключить.

Во-вторых, в ядро должен быть встроен не только netconsole, но и используемый сетевой драйвер - по тем же причинам.

Для дистрибутивов ROSA Linux, основанных на платформе 2014.1, напр., ROSA R4 и R5, такое ядро можно взять отсюда (только для x86_64 на данный момент):

В это ядро встроен netconsole, а также драйверы для нескольких часто встречающихся сетевых карт: e1000e, e1000, r8169, atl1c, atl1e.

На той машине, куда будет выводиться лог, действия те же, что и раньше:

nc -l -u -p <номер_порта> > netconsole.log

На той машине, лог с которой нужно сохранить, нужно установить оба указанных выше пакета с ядром. Затем стоит перезагрузить систему, выбрать в меню загрузчика ядро "kernel-nrj-desktop-3.14.31-1netconsole" и добавить нужные опции ядру, как минимум:

 ignore_loglevel netconsole=@<ip_откуда_отправлять>/,<номер_порта>@<IP_куда_отправлять>/

Кстати, с виртуальными машинами этот вариант может и не сработать. Впрочем, там нередко удобнее тот же лог загрузки выводить не по сети, а через serial console (связанную с вирт. COM-портом).