Ubuntu самопроизвольно перезагружается? Проблема в обновлениях безопасности ядра.
На одном из наших ( Wissance, wissance.com ) серверов я стал замечать, что в случайные моменты времени сервер недоступен по сети (ssh, http и т.п.). Сам сервер обслуживает несколько Web-приложений и на перезапуск уходит внушительное время (ок. 5-10 мин), что для приложений работающих в режиме 24/7 просто недопустимо. Данная головная боль отравляла мне жизнь в течение продолжительного времени. Но все-таки я смог решить ее.
Первоначально я проверил состояние CPU (lm-sensors), оперативной памяти (memtester) и дисков (hdparm, badblocks, smart, smartctl, iostat, mdstat), но каждый раз я получал информацию о том, что с оборудованием все ОК, вот, например, вывод температуры:
Анализ файлов логов в папке /var/log не позволил обнаружить причины перезапуска (если, что то искал как grep -rnw /var/log -e reboot ). Далее я решил проверить в какие моменты времени происходит перезагрузка, чтобы определить наличие/отсутствие какого-либо заданного периода и т.п. Ниже представлен сжатый результат вывода информации о перезагрузках, полученных в результате выполнения команды last reboot :
reboot system boot 4.15.0-140-gener Fri Mar 26 19:41 still running
reboot system boot 4.15.0-139-gener Tue Mar 23 14:29 still running
reboot system boot 4.15.0-137-gener Sat Mar 20 11:10 still running
reboot system boot 4.15.0-136-gener Sat Mar 13 04:26 still running
reboot system boot 4.15.0-136-gener Tue Mar 9 07:16 still running
reboot system boot 4.15.0-136-gener Wed Mar 3 11:46 still running
В этом выводе меня насторожило изменение версии ядра системы, т.е. по каким-то причинам происходит изменение версии ядра. Это может означать лишь то, что происходит установка обновлений, значит все, что нам нужно сделать это вырубить автоматические апдэйты системы. Тут на всякий случай я сделал следующее:
1. Зафиксировал версию ядра системы
для этого выполним команду sudo apt-mark hold (но как выяснилось, апдэйты текущей версии будут приводить к перезагрузке, поэтому вариант зафиксировать версию и подождать выхода последних апдейтов, либо использовать альтернативный вариант по ссылке, приведенной ниже):
Узнать причину перезагрузки Ubuntu Server
Сервер с операционной системой Ubuntu Server 16 ушёл в перезагрузку. Да-да, не самая новая ОС. Анализ логов не дал понимания, что-же произошло. Как узнать причину перезагрузки?
Большая часть советов из Интернет не дала нужного результата, но потом, парочка статей подсказала где искать. В Oracle Linux есть сервис kdump , который в директорию /var/crash сохраняет аварийный дамп памяти и dmesg. В Ubuntu Server такой службы нет. Однако, где-то же Oracle Linux берёт dmesg даже после аварийного отключения питания сервера, где-то же эти данные есть.
Про pstore
Мы не первые у кого сервер не смог скинуть в файлы лога информацию об аварийном завершении работы. Ещё в доисторические времена у серверов выходили из строя диски, память, отключалось питание. Специально для нас в Linux была сделана такая штука как pstore — Persistent STORagE file system. Основная идея — сохранять лог ошибок где-то в энергонезависимой памяти. И отдельно от дисков. Для сохранения такой информации могут использоваться разные хранилища: — это ACPI ERST и UEFI.
ERST (Error Record Serialization Table) — это механизм, указанный в спецификации ACPI (Advanced Configuration and Power Interface), который позволяет сохранять и извлекать информацию об аппаратных ошибках в энергонезависимое место (например, во флэш-память). Такой механизм обычно реализован в серверных платформах.
Не обычных старых компьютерах есть только одно место с энергонезависимой памятью — это часы реального времени, но там мало места, логи не сбросишь. Но более новые ПК (и сервера) могут иметь память в UEFI.
Выбор куда писать ошибки (ERST или UEFI) можно настроить при конфигурировании ядра. По умолчанию в Ubuntu Server используется ERST, но это не точно.
Ищем ошибки
В любом случае, если ваш сервер реализует механизм pstore, то хранилище в Debian-подобных системах после загрузки монтируется в /sys/fs/pstore.
При хранении дампов в ERST можно увидеть такую картину:
# ls -al /sys/fs/pstore
total 0
drwxr-x— 2 root root 0 Jul 28 11:35 .
drwxr-xr-x 9 root root 0 Jul 28 11:35 ..
-r—r—r— 1 root root 17711 Jul 28 11:35 dmesg-erst-6990001317951307777
-r—r—r— 1 root root 17755 Jul 28 11:35 dmesg-erst-6990001317951307778
При хранении дампов в UEFI картина немного другая:
# ls -al /sys/fs/pstore
total 0
drwxr-x— 2 root root 0 May 9 09:50 .
drwxr-xr-x 7 root root 0 May 9 09:50 ..
-r—r—r— 1 root root 1610 May 9 09:49 dmesg-efi-155741337601001
-r—r—r— 1 root root 1778 May 9 09:49 dmesg-efi-155741337602001
Вывод данных может и отличаться, здесь приведены примеры для Oracle Linux. В примере ниже он будет немного другой, для Ubuntu Server 16, но это и не принципиально.
Читаем dmesg
Итак, Ubuntu Server 16 аварийно перезагрузился. В логах ничего нет. Смотрим pstore.