Как вызвать и устранить Kernel panic в Linux

Представьте, что вы с удовольствием работаете в своей системе Linux, может быть, собираете пакет, обновляете систему или просто просматриваете что-то, и вдруг ваш экран зависает, а на нём появляется стена загадочного текста: «Kernel panic – not syncing: Attempted to kill init!»
Теперь, прежде чем вы начнёте потеть, давайте успокоимся и научимся понимать, моделировать и устранять панику ядра.
Что такое паника в ядре Linux?
Проще говоря, паника ядра — это мера безопасности, которую принимает ядро Linux, когда сталкивается с критической ошибкой, от которой не может безопасно восстановиться.
Ядро Linux — это основа вашей системы, которая управляет всем: от управления памятью и взаимодействия с устройствами до запуска ваших процессов. Когда в ядре что-то идёт не так — например, плохой драйвер обращается к недопустимой памяти или выходит из строя ключевой компонент, — ядро останавливается, чтобы избежать дальнейшего повреждения.
Представьте, что это аварийный тормоз в автомобиле: когда что-то идёт совсем не так, система резко жмёт на тормоз и останавливает всё.
Распространенные причины паники в ядре
Давайте рассмотрим типичные причины паники в ядре, которые чаще всего приводят к сбоям в работе вашей системы Linux:
- Неисправная оперативная память, перегрев процессора или выход из строя дисков — распространённые аппаратные проблемы, которые могут вызвать панику ядра из-за повреждения памяти, нестабильности системы или критических ошибок файловой системы, особенно во время загрузки.
- Установленные вручную или сторонние драйверы, которые не соответствуют текущей версии ядра, могут вызвать немедленную панику, особенно при загрузке с помощью таких инструментов, как modprobe.
- Повреждение критически важных файлов, таких как
/etc/fstab
,/sbin/init
, или сбой в работе образа initramfs может препятствовать правильной загрузке и привести к панике ядра. - Неправильные UUID, метки разделов или отсутствующие записи ядра/initramfs в GRUB могут нарушить процесс загрузки и вызвать панику ещё до загрузки ОС.
- Случайное удаление важных файлов, таких как
/sbin/init
или принудительное завершение работыPID 1
приведёт к невосстановимой панике, поскольку система потеряет свой основной процесс.
Как имитировать панику ядра (безопасно!)
ВНИМАНИЕ: не пытайтесь сделать это в рабочей системе. Всегда тестируйте на виртуальной машине (VirtualBox, KVM или QEMU) или в контейнере.
Вариант 1: вызвать панику ядра с помощью /proc/sysrq-trigger
Один из самых безопасных и контролируемых способов имитации паники ядра — использование интерфейса SysRq (Системный запрос), предоставляемого ядром Linux, который часто используется разработчиками и системными администраторами для отладки сценариев сбоя или тестирования политик восстановления системы, таких как автоматическая перезагрузка.
Интерфейс SysRq управляется через /proc/sys/kernel/sysrq, и для его включения выполните:
echo 1 | sudo tee /proc/sys/kernel/sysrq
Теперь, чтобы имитировать панику ядра, выполните следующие действия:
echo c | sudo tee /proc/sysrq-trigger
Как только вы выполните эту команду, ядро остановится, выдаст сообщение о сбое и заблокирует систему.
Вариант 2: вызвать панику ядра с помощью отладочного интерфейса
Другой безопасный способ имитировать панику ядра — использовать встроенный в Linux интерфейс SysRq или запустить его вручную с помощью модуля аварийной паники ядра, если он доступен.
Способ 1: используйте SysRq для запуска режима паники
Сначала убедитесь, что функция SysRq включена:
echo 1 > /proc/sys/kernel/sysrq
Затем вызовите панику, которая немедленно вызовет панику в ядре и приведёт к сбою системы. Это отличный способ протестировать поведение при панике или настроить автоматическую перезагрузку.
echo c > /proc/sysrq-trigger
Способ 2: Загрузите модуль аварийного ядра (если он доступен)
Некоторые ядра включают в себя модуль, специально предназначенный для запуска сбоев. Вы можете загрузить его с помощью:
sudo modprobe crash
После загрузки он может предоставлять дополнительные функции отладки в зависимости от конфигурации вашего ядра. Однако этот модуль поставляется не во всех дистрибутивах, и в целях безопасности он может быть отключен в рабочих ядрах.
Если modprobe crash
возвращает ошибку, возможно, модуль недоступен или не встроен в ваше ядро. Вы можете проверить с помощью:
modinfo crash
Как устранить панику ядра в Linux
Давайте рассмотрим пошаговый процесс диагностики и устранения паники ядра.
1. Перезагрузка и просмотр системных журналов
После сбоя ядра ваша система, скорее всего, полностью зависнет. Вам нужно будет перезагрузить компьютер вручную, нажав кнопку питания или воспользовавшись переключателем сброса.
После перезагрузки системы (или загрузки с Live-диска) в первую очередь проверьте системные журналы, чтобы определить, что вызвало сбой, с помощью следующей команды journalctl, которая покажет подробные журналы предыдущей загрузки, включая ошибки ядра и сбои в работе служб.
journalctl -xb
В качестве альтернативы проверьте буфер сообщений ядра и файлы журналов:
dmesg | less
или
cat /var/log/kern.log | less
Ищите строки с упоминанием panic
, segfault
, или kernel bug
. Обратите внимание на названия модулей, аппаратные ошибки или пути к файлам.
2. Загрузка более старой версии ядра
После обновления ядра система нередко начинает работать со сбоями из-за несовместимости драйверов или ошибки в сборке ядра. К счастью, в GRUB обычно установлено несколько версий ядра, что позволяет легко вернуться к предыдущей версии.
Чтобы загрузиться в более старую версию ядра, просто перезагрузите систему, нажмите Esc
в меню GRUB (если оно не появляется автоматически), выберите Дополнительные параметры для Ubuntu (или вашего дистрибутива) и выберите предыдущую версию ядра из списка — например, 5.15.0-92-generic
если более новая версия ядра 6.x
вызывает проблемы.
Определив стабильную версию ядра, вы можете установить ее по умолчанию, чтобы GRUB всегда автоматически загружал ее.
sudo apt install linux-image-<old-version> sudo grub-set-default 1 # установить старое ядро по умолчанию
Используйте grep menuentry /boot/grub/grub.cfg
для поиска точного названия нужной вам записи в ядре.
3. Перестройте Initramfs (начальную оперативную файловую систему)
initramfs (или initrd) — это небольшая временная корневая файловая система, загружаемая в память во время процесса загрузки, до монтирования реальной корневой файловой системы. Она содержит необходимые драйверы и инструменты для загрузки системы.
Если этот образ будет повреждён, несовместим с ядром или полностью отсутствует, ваша система может выйти из строя сразу после того, как GRUB передаст управление ядру.
Чтобы перестроить initramfs, загрузитесь с живого CD/USB-накопителя, если ваша система не запускается, и смонтируйте корневой раздел.
sudo update-initramfs -u -k all
Если вы хотите выполнить регенерацию только для текущего ядра:
sudo update-initramfs -c -k $(uname -r)
После восстановления перезагрузите свою систему.
sudo reboot
4. Восстановите файловую систему
Если в сообщениях о сбое ядра есть такие фразы, как «невозможно смонтировать корневую файловую систему» или «VFS: невозможно смонтировать корневую файловую систему», высока вероятность того, что ваша корневая или загрузочная файловая система повреждена, что может произойти из-за неправильного завершения работы, сбоев питания или ошибок на диске.
Чтобы восстановить файловую систему, используйте lsblk или fdisk для поиска корневого или загрузочного раздела Linux.
lsblk
Затем запустите fsck, чтобы восстановить файловую систему.
sudo fsck /dev/sda1
Замените /dev/sda1
на фактический корневой или загрузочный раздел.
5. Диагностика проблем с оборудованием
Иногда паника в ядре вовсе не связана с вашим программным обеспечением — это аппаратный сбой, который происходит незаметно. Ошибки в памяти и на диске, как известно, трудно обнаружить, пока они не нанесут реальный ущерб.
Используйте smartctl из пакета smartmontools, чтобы проверить состояние диска и статистику ошибок:
sudo smartctl -a /dev/sda
Ищите предупреждающие знаки, такие как Reallocated_Sector_Ct
(плохие сектора уже перемещены), Pending_Sector_Ct
(сектора, ожидающие перераспределения) или Current_Pending_Sector
(явный признак нестабильности).
Если какое-либо из этих значений увеличивается, это явный признак того, что ваш диск выходит из строя. Немедленно сделайте резервную копию данных и замените диск.
6. Исправьте загрузчик GRUB
Неправильно настроенный или повреждённый загрузчик GRUB часто является причиной сбоев ядра, особенно после обновления ядра, настройки двойной загрузки или изменения диска. Если GRUB не может правильно определить корневой раздел или образ initrd, система может не загрузиться и выдать ошибку.
Исправление GRUB с помощью Live CD или загрузочного USB-накопителя.
sudo mount /dev/sda1 /mnt sudo grub-install --root-directory=/mnt /dev/sda sudo update-grub
Убедитесь, что /etc/fstab
содержит правильные UUID, и вы можете проверить их с помощью:
blkid
Как предотвратить панику ядра (как профессионал)
Хотя паники в ядре не всегда можно избежать, особенно при выходе из строя оборудования, соблюдение нескольких разумных правил может значительно снизить вероятность возникновения таких ситуаций.
Вот как можно заранее защитить свою систему Linux от сбоев ядра:
- Не удаляйте и не изменяйте вручную критически важные для системы файлы.
- Никогда не обновляйте ядро на работающем производственном сервере, предварительно не протестировав его.
- Для обеспечения стабильности используйте ядра LTS (с долгосрочной поддержкой).
- Всегда устанавливайте как минимум две версии ядра.
- Используйте резервные копии (особенно для /boot, /etc и важных конфигураций).
- Включите автоматическое создание аварийных дампов с помощью kdump для записи журналов паники.
Бонус: автоматическая перезагрузка после сбоя
Чтобы избежать простоя зависшего компьютера в серверной, вы можете настроить ядро на автоматическую перезагрузку после сбоя.
Добавьте это в файл /etc/sysctl.conf
, чтобы система перезагружалась через 10 секунд после сбоя.
kernel.panic = 10
Примените это.
sudo sysctl -p
Заключение
Паника в ядре может показаться пугающей, особенно новичкам, но как только вы поймёте, что это такое и как к этому подступиться, это станет просто ещё одной головоломкой для Linux.
Главное — сохранять спокойствие, загрузиться в режиме восстановления или в режиме живой системы, собрать логи, определить, что изменилось (обновление ядра, аппаратный сбой, ошибка в конфигурации), и методично устранять неполадки.
А если вы действительно хотите стать Linux-ниндзя, попробуйте смоделировать панику в виртуальной лаборатории и попрактикуйтесь в восстановлении. Так становятся профессионалами.
Есть паническая история?
Вы когда-нибудь ломали свою систему Linux и восстанавливали ее из мертвых? Или, может быть, по ошибке вызывали панику? Поделитесь своей историей в комментариях — нам нравится слушать других исследователей Linux.
Редактор: AndreyEx