Несколько из обслуживаемых мною серверов внезапно с небольшим интервалом времени попадали в kernel panic. Очень хотелось узнать почему, но серверы находятся в датацентрах в разных точках планеты и физически увидеть это нереально. Если попросить подключить kvm, то время простоя сервера будет недопустимо большим. В результате я стал искать возможность сохранения лога dmesg на диск или еще куда-нибудь, чтобы увидеть на что заругалось ядро….
В результате поисков я наткнулся на информацию о kexec kdump и netconsole. Первое сохраняет дамп оперативки, что мне не подходит. А вот netconsole оказалась намного интереснее. Это стандартный модуль ядра, дающий возможность отсылать сообщения ядра по сети в виде обычного текста по сети.
При загрузке модуля в параметрах задается на какой хост и на какой порт и через какой интерфейс отсылать сообщения.
modprobe netconsole netconsole="1234@192.168.88.246/eth0,6665@
192.168.88.250/aa:bb:cc:dd:ee:ff"
где
- 1234 — исходящий порт
- 192.168.88.246 — адрес интерфейса с которого слать
- eth0 — интерфейс через который слать
- 6665 — порт назначения
- 192.168.88.250 — адрес сервера куда мы логи шлем
- aa:bb:cc:ff:ee:ff — mac-адрес сервера назначения. Если не указывать, то он выставится в ff:ff:ff:ff:ff:ff, что будет соответствовать широковещательному сообщению.
Некоторые из параметров можно пропускать:
modprobe netconsole netconsole="@/,514@192.168.88.250/"
Проблемы с которыми я столкнулся
1. Если сервер назначения находится не в одной подсети с нашим сервером, то нужно указывать не его mac-адрес, а mac ближайшего к нам маршрутизатора, через который идет маршрут до сервера назначения. Иначе пакет не уйдет куда надо и мы ничего не увидим.
2. Я несколько часов мучался и не знал почему же у меня сообщения не отсылаются =). В результате почитал официальную документацию и узнал, что по умолчанию в ядре уровень логирования в консоль низкий и шлются только сообщения о чрезвычайных событиях. А я же проверял на подключении/отключении флешки. Для изменения уровня логирования нужно скомандовать
dmesg -n 8
Если 8 не подходит, то 7 точно подойдет =). В разных дистрибутивах были разные цифры. Я не копался в эту сторону, так что не знаю чем это обусловлено.
З.Ы. Чтобы вызвать kernel panic вручную, нужно выполнить
echo "c" > /proc/sysrq-trigger