Главная » Администрирование Linux и FreeBSD » Kernel panic — not syncing: Attempted to kill init — причины и восстановление

Kernel panic — not syncing: Attempted to kill init — причины и восстановление

Сообщение Kernel panic - not syncing: Attempted to kill init! означает, что первый процесс системы (PID 1, сегодня это systemd) завершился или упал. Без PID 1 работать дальше нельзя, и ядро останавливается. Сам по себе этот текст не называет причину: он говорит только, что init погиб. Причину ищут в строках выше на экране и в коде exitcode.

Чаще всего к панике приводят битый или отсутствующий initramfs после обновления ядра, неверный параметр root=, повреждённая корневая файловая система, сломанные системные библиотеки и ошибки в настройке SELinux.

Самый быстрый путь восстановления: загрузить предыдущее ядро из меню GRUB, а затем пересобрать initramfs и проверить параметры загрузки. Если старое ядро тоже не грузится, загружаемся с live- или rescue-образа, делаем chroot в систему и чиним оттуда. Ниже по шагам для Debian 12/13, Ubuntu 24.04 и AlmaLinux / Rocky Linux 9 и 10.

Как читать сообщение

Полная строка обычно выглядит так (примерно):

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100

Код — это статус завершения процесса в формате wait():

  • 0x00000100 — init завершился с кодом 1: ошибка при старте, часто из-за SELinux или невозможности смонтировать корень.
  • 0x00007f00 — код 127: не найден исполняемый файл init или нужная ему библиотека.
  • 0x0000000b — init убит сигналом 11 (SIGSEGV): битые библиотеки, glibc, несовместимые бинарники.
  • 0x00000009 — сигнал 9 (SIGKILL), иногда из-за нехватки памяти при загрузке.

Обязательно прокрутите вывод выше паники (Shift+PgUp работает не везде; на сервере удобнее смотреть через IPMI или serial console). Строки вроде Failed to load SELinux policy, Cannot open root device, error while loading shared libraries сразу указывают на причину.

Причины и решения: таблица

Симптом перед паникойПричинаРешение
Паника сразу после обновления ядра, старое ядро грузитсяБитый или недособранный initramfs, нехватка места в /bootОсвободить /boot, пересобрать initramfs (update-initramfs / dracut)
VFS: Unable to mount root fs, Cannot open root deviceНеверный root= или UUID после замены диска, клонирования, переносаСверить blkid с параметрами ядра и /etc/fstab
Ошибки ext4 или XFS, корень смонтирован только для чтенияПовреждённая файловая системаfsck / xfs_repair из rescue-режима
Failed to load SELinux policy, exitcode=0x00000100Ошибка в /etc/selinux/config или удалённая политикаЗагрузка с enforcing=0, исправить конфиг, перемаркировка
error while loading shared libraries, exitcode=0x0000000bПрерванное обновление, удалённые файлы в /usr/lib, подмена glibcchroot, переустановка пакетов libc6 / glibc, systemd
exitcode=0x00007f00Нет /sbin/init или неверный init=Проверить параметры ядра, переустановить systemd-sysv (Debian) или systemd (RHEL)

Шаг 1. Загрузить предыдущее ядро в GRUB2

Если меню GRUB не показывается, удерживайте Shift (BIOS) или нажимайте Esc (UEFI) сразу после POST.

  • Debian и Ubuntu: пункт «Advanced options for Debian/Ubuntu», в нём список ядер. Выберите предыдущую версию.
  • AlmaLinux / Rocky: ядра перечислены прямо в главном меню, сверху самое новое. Выберите строку ниже.

Если старое ядро загрузилось, проблема почти наверняка в новом ядре или его initramfs — переходите к шагу 4 без rescue-образа.

Шаг 2. Временно изменить параметры загрузки

В меню GRUB выберите пункт и нажмите e. Найдите строку, которая начинается с linux (в RHEL-системах linux или linuxefi), и допишите в конец нужный параметр. Загрузка — Ctrl+X или F10. Изменения действуют один раз.

ПараметрЧто делаетГде работает
systemd.unit=rescue.targetОднопользовательский режим, корень смонтированВсе с systemd
systemd.unit=emergency.targetМинимальная оболочка, корень только для чтенияВсе с systemd
enforcing=0SELinux в режиме permissive на эту загрузкуAlmaLinux / Rocky
rd.breakОстановка в initramfs до переключения на корень (/sysroot)dracut: AlmaLinux / Rocky
break=premountОболочка в initramfs перед монтированием корняinitramfs-tools: Debian / Ubuntu
init=/bin/bashОболочка вместо systemd, корень только для чтенияВсе; последнее средство

Если систему удаётся поднять в rescue.target, все исправления ниже выполняются прямо в ней, без chroot.

Шаг 3. Rescue- или live-образ и chroot

Когда не грузится ни одно ядро, нужна внешняя система той же архитектуры: Debian Live, Ubuntu Desktop или установочный ISO AlmaLinux / Rocky.

AlmaLinux / Rocky Linux

Загрузитесь с ISO, выберите Troubleshooting → Rescue a AlmaLinux system (у Rocky аналогично), затем вариант 1) Continue. Rescue-режим найдёт систему и смонтирует её в /mnt/sysroot. Дальше:

chroot /mnt/sysroot

Debian и Ubuntu с live-образа

lsblk -f
# если корень на LVM или RAID:
vgchange -ay
mdadm --assemble --scan

mount /dev/sda2 /mnt                 # корень
mount /dev/sda1 /mnt/boot/efi        # ESP при UEFI
# отдельный /boot, если есть: mount /dev/... /mnt/boot
for d in dev proc sys run; do mount --rbind /$d /mnt/$d; done
chroot /mnt /bin/bash

Имена разделов подставьте свои: смотрите вывод lsblk -f. Если корень на программном RAID, подробности сборки массивов есть в статье Диски после RAID.

Шаг 4. Пересобрать initramfs

Сначала проверьте место в /boot. Переполненный /boot — частая причина недособранного initramfs:

df -h /boot
ls -lh /boot

Debian и Ubuntu

dpkg --configure -a
update-initramfs -u -k all
update-grub

Файлы: /boot/vmlinuz-ВЕРСИЯ и /boot/initrd.img-ВЕРСИЯ. Лишние старые ядра удаляются через apt autoremove --purge.

AlmaLinux / Rocky Linux

dracut -f --regenerate-all
grubby --info=ALL

Файлы: /boot/vmlinuz-ВЕРСИЯ и /boot/initramfs-ВЕРСИЯ.img, записи меню — в /boot/loader/entries/ (формат BLS). Пересобрать только одно ядро: dracut -f /boot/initramfs-ВЕРСИЯ.img ВЕРСИЯ. В chroot команда uname -r покажет ядро live-системы, поэтому версию берите из имени файла в /boot.

Если в initramfs не попал драйвер контроллера (типично после переноса ВМ или смены RAID-контроллера), в RHEL-ветке пересоберите с --no-hostonly, чтобы включить все драйверы.

Шаг 5. Проверить root= и fstab

blkid
cat /proc/cmdline        # в загруженной системе
cat /etc/fstab

UUID корня в параметрах ядра и в /etc/fstab должен совпадать с выводом blkid. Где править:

  • Debian / Ubuntu: root= генерирует update-grub по смонтированному корню. Дополнительные параметры — в GRUB_CMDLINE_LINUX файла /etc/default/grub, затем update-grub.
  • AlmaLinux / Rocky: grubby --update-kernel=ALL --args="root=UUID=...". Проверка: grubby --info=DEFAULT.

Шаг 6. Проверить файловую систему

Проверку делают на отмонтированном разделе, то есть из rescue- или live-системы до chroot.

# ext4 (по умолчанию в Debian и Ubuntu)
fsck -f /dev/sda2

# XFS (по умолчанию в AlmaLinux / Rocky)
xfs_repair /dev/mapper/almalinux-root

Если xfs_repair просит сначала смонтировать раздел, чтобы проиграть журнал, — сделайте это и отмонтируйте. Ключ -L (обнуление журнала) используйте только когда монтирование невозможно: он может потерять последние изменения. Сразу после проверки посмотрите на здоровье диска — см. Проверка и восстановление дисков в Linux.

Шаг 7. Переустановить ядро и системные пакеты

Debian и Ubuntu

apt install --reinstall linux-image-amd64        # Debian
apt install --reinstall linux-image-generic      # Ubuntu
apt install --reinstall libc6 systemd systemd-sysv

AlmaLinux / Rocky Linux

dnf reinstall kernel-core
dnf reinstall glibc systemd
rpm -Va --nofiles --nodigest      # проверка зависимостей
rpm -V glibc systemd              # проверка файлов пакетов

Для сети в chroot скопируйте DNS: cp /etc/resolv.conf /mnt/etc/resolv.conf до входа в chroot (на Ubuntu это может быть ссылка — тогда замените её временно).

SELinux: случай автора и как правильно сегодня

Исходная заметка описывала конкретный случай на CentOS 6 (ядро 2.6.32-504). Паника Attempted to kill init появилась после того, как на сервере отключили SELinux и перезагрузили его. Автор лечил так: в GRUB нажимал e, в конец строки kernel дописывал selinux=0, загружался клавишей b. После загрузки добавлял selinux=0 в строки ядер в /etc/grub.conf — обычно для последнего и предыдущего ядра. Тогда это рабочий приём: CentOS 6 давно не поддерживается, но причина та же — init не смог корректно разобраться с конфигурацией SELinux.

Типичные ошибки, которые и сегодня приводят к панике или зависанию на старте:

  • опечатка в /etc/selinux/config, например SELINUX=disable вместо disabled;
  • правка не той строки: изменён SELINUXTYPE= вместо SELINUX=, и systemd не находит политику;
  • удалён пакет политики selinux-policy-targeted.

Как восстановиться на AlmaLinux / Rocky 9 и 10:

  1. В GRUB добавьте к строке linux параметр enforcing=0 и загрузитесь.
  2. Исправьте /etc/selinux/config: SELINUX=enforcing (или временно permissive) и SELINUXTYPE=targeted.
  3. Если SELinux долго был выключен, файлы созданы без меток. Запланируйте перемаркировку: fixfiles -F onboot (или touch /.autorelabel) и перезагрузитесь. Перемаркировка большого диска идёт долго — это нормально.

Почему не отключать SELinux целиком. Это частый совет из интернета, но он убирает важный слой защиты: при взломе сайта или сервиса процесс получает доступ ко всему, что разрешено его пользователю. В RHEL 9 и производных отключение через SELINUX=disabled в конфиге уже не выключает SELinux полностью, а отключить его можно только параметром ядра selinux=0. Если сервис не работает из-за SELinux, переведите систему в permissive, посмотрите отказы в /var/log/audit/audit.log (ausearch -m AVC -ts recent) и поправьте метки или булевы переключатели.

В Debian и Ubuntu SELinux по умолчанию не используется (в Ubuntu работает AppArmor), поэтому эта причина там почти не встречается.

Проверка результата

uname -r                         # загружено нужное ядро
systemctl --failed               # нет упавших юнитов
journalctl -b -p err             # ошибки текущей загрузки
journalctl -b -1 -p err          # ошибки прошлой загрузки (если журнал постоянный)
getenforce                       # на AlmaLinux: Enforcing

Перезагрузитесь ещё раз в ядро по умолчанию, не выбирая его вручную. Если всё работает, восстановление закончено. Чтобы подобное не повторялось, держите в /boot место минимум под два-три ядра, не прерывайте обновление ядра и имейте на сервере консоль через IPMI или KVM провайдера.

Документация: Using SELinux (RHEL 9), параметры ядра (kernel.org).

Частые вопросы

Чем «Attempted to kill init» отличается от «VFS: Unable to mount root fs»?

Вторая паника случается раньше: ядро вообще не может смонтировать корень, обычно из-за отсутствия initramfs или драйвера диска. «Attempted to kill init» означает, что init уже запустился, но завершился. На практике причины пересекаются, и порядок проверки один: initramfs, root=, файловая система.

Старое ядро грузится, новое — нет. Можно так и оставить?

Временно — да, но лучше разобраться. Обычно достаточно пересобрать initramfs для нового ядра или переустановить пакет ядра. Если новое ядро не работает с вашим оборудованием, закрепите старое по умолчанию: в RHEL-ветке grubby --set-default, в Debian и Ubuntu — GRUB_DEFAULT в /etc/default/grub и update-grub.

Что делать, если меню GRUB не появляется?

Удерживайте Shift при загрузке в режиме BIOS или нажимайте Esc в режиме UEFI. Чтобы меню показывалось всегда, задайте GRUB_TIMEOUT_STYLE=menu и GRUB_TIMEOUT=5 в /etc/default/grub. В RHEL-ветке меню скрывается после успешной загрузки; вернуть его можно командой grub2-editenv - unset menu_auto_hide.

Паника случилась на виртуальной машине после переноса. Почему?

Чаще всего в initramfs нет драйвера нового дискового контроллера: была VirtIO, стала SATA или наоборот. Временно переключите тип диска ВМ на прежний, загрузитесь и пересоберите initramfs с нужными модулями (в AlmaLinux помогает dracut -f --no-hostonly). Второй вариант — изменились UUID дисков при конвертации образа.

Как получить текст паники, если он не помещается на экран?

Уберите из параметров ядра quiet и rhgb (или splash), чтобы видеть весь вывод. Для серверов настройте последовательную консоль (console=ttyS0,115200) и смотрите её через IPMI Serial-over-LAN. Для постоянного сбора дампов используйте kdump.