Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

initramfs создан с другим ядром: что значит предупреждение

Предупреждение «Initramfs was created with a different kernel version than the currently running one» появляется, когда mkinitcpio собирает initramfs для ядра, которое не совпадает с загруженным. Чаще всего это значит: ядро обновилось, а initramfs остался от старой версии, либо /boot не был смонтирован во время обновления. Лечится одной командой: mkinitcpio -P.

Что значит «initramfs создан с другим ядром»

Initramfs это временная корневая файловая система, которую ядро загружает в память при старте. Внутри лежат модули и утилиты, нужные, чтобы смонтировать настоящий корень: драйверы дисков, поддержка LUKS, btrfs, сетевые модули. mkinitcpio собирает этот архив из модулей конкретного ядра, поэтому initramfs привязан к версии ядра.

Предупреждение о «другом ядре» mkinitcpio выводит, когда сравнивает версию загруженного ядра из uname -r с версией, для которой собирает образ. Если они не совпадают, ты получаешь предупреждение, а не ошибку: образ всё равно создастся, но для другого ядра. Загрузиться с таким образом можно, но часть модулей может не подойти, и система рискует не дойти до монтирования корня.

Почему появляется предупреждение

Ядро обновилось, но ты не перезагрузился

Самая частая ситуация. Ты обновил систему, pacman поставил новое ядро и пересобрал initramfs для него. Ты продолжаешь работать на старом ядре. При следующем запуске mkinitcpio, например при установке пакета с хуком, он увидит, что загруженное ядро старее того, для которого собирает образ.

/boot не был смонтирован во время обновления

Если ESP или отдельный /boot не смонтирован, pacman обновляет файлы ядра в /usr, но не может записать vmlinuz и initramfs в /boot. В итоге в /boot лежит initramfs от старого ядра, а в /usr/lib/modules модули нового. При следующей загрузке ядро подхватывает старый initramfs и может не найти нужные модули.

Прерванное обновление или даунгрейд

Обновление ядра прервалось на середине, и в /usr/lib/modules осталась неполная картина. Даунгрейд ядра тоже даёт рассинхрон: модули откатились, а initramfs остался от более новой версии.

Несколько установленных ядер

Если стоят linux и linux-lts, у каждого свой initramfs. Команда mkinitcpio -P пересобирает все пресеты, и предупреждение может появиться для ядра, которое сейчас не загружено. Это нормально. Про выбор ядра читай в статье «Какое ядро выбрать: linux, linux-lts, linux-zen, linux-hardened».

Что будет, если загрузиться с чужим initramfs

Ядро распакует образ в память и попробует выполнить init из него. Если модулей для твоего диска в образе нет, монтирование корня упадёт. Типичные симптомы: загрузка останавливается на сообщении «mount: unknown filesystem type», паника ядра с ошибкой «VFS: Unable to mount root fs» или падение в emergency mode. Иногда всё работает, если модули совместимы между версиями, но полагаться на это не стоит. Один раз система загрузится, а после следующего обновления упадёт, и ты будешь гадать, что сломалось.

Как проверить, для какого ядра собран initramfs

Сначала узнай версию загруженного ядра:

uname -r

Потом посмотри, какие версии модулей лежат в системе:

ls /usr/lib/modules/

Если в /usr/lib/modules/ есть каталог с версией, отличной от вывода uname -r, значит, загружено не самое свежее ядро. При нескольких установленных ядрах это нормально: каталогов будет несколько, и каждый initramfs собирается под свою версию. Теперь посмотри на сам initramfs:

ls -la /boot/initramfs-linux.img

Дата создания файла подскажет, когда его собирали. Если она старше даты обновления ядра, образ устарел. Внутрь образа можно заглянуть командой:

lsinitcpio /boot/initramfs-linux.img

Она покажет список файлов и версию ядра, для которой собран образ. Общая методика диагностики таких проблем разобрана в статье «Методика решения проблем в Arch Linux».

Как починить: mkinitcpio -P и другие способы

Самый простой способ пересобрать все initramfs для всех установленных ядер:

mkinitcpio -P

Команда читает пресеты из /etc/mkinitcpio.d/ и собирает образы для каждого ядра, найденного в /usr/lib/modules. После этого предупреждение исчезает.

Если нужно пересобрать образ только для конкретного ядра:

mkinitcpio -k 6.12.10-arch1-1 -p linux

Здесь -k задаёт версию ядра, -p имя пресета. Версию бери из вывода ls /usr/lib/modules/.

Если ты правил /etc/mkinitcpio.conf, например добавил хуки или модули, пересборка нужна и без обновления ядра: mkinitcpio -P применит новые настройки ко всем образам. Иначе изменения подхватятся только при следующем обновлении ядра, а до этого initramfs останется старым.

После пересборки перезагружайся. Если предупреждение появлялось из-за того, что /boot не был смонтирован, сначала смонтируй его и повтори mkinitcpio -P.

Что такое fallback initramfs и когда он нужен

В пресете /etc/mkinitcpio.d/linux.preset прописаны два образа: default_image и fallback_image. Обычно это initramfs-linux.img и initramfs-linux-fallback.img.

Default собирается с хуком autodetect: в образ попадают только модули, нужные для текущего железа. Fallback собирается без autodetect, поэтому в нём лежат почти все модули ядра. Он больше по размеру, но зато не зависит от того, какое железо было обнаружено при сборке.

Когда грузиться с fallback:

  • система не стартует с обычного initramfs: чёрный экран, паника ядра;
  • ты перенёс диск на другое железо, и autodetect не включил нужные драйверы;
  • обычный initramfs повреждён.

Выбрать fallback можно в меню GRUB: рядом с пунктом ядра обычно есть строка с суффиксом fallback. Если такой строки нет, нажми e на пункте ядра, найди строку initrd и замени путь на /initramfs-linux-fallback.img, потом Ctrl+X для загрузки. Подробнее про устройство initramfs и хуки читай в статье «mkinitcpio подробно: хуки и модули».

Поколения и откаты: почему старый initramfs возвращается

Если ты используешь btrfs-снапшоты или откаты системы, например через stormos или snapper, откат возвращает не только ядро, но и старый initramfs. После отката загруженное ядро может не совпадать с тем, для которого собран образ в снапшоте. Поэтому после любого отката пересобирай initramfs:

mkinitcpio -P

То же касается отката пакета ядра через pacman: модули откатились, а initramfs остался от новой версии. Перед откатом полезно запомнить версию текущего ядра командой uname -r. После отката сравни её с содержимым /usr/lib/modules. Если версии разошлись, пересборка обязательна. Про снапшоты при установке читай в статье «Установка Arch с btrfs-снапшотами».

Как предотвратить рассинхрон

Всегда монтируй ESP перед обновлением

Если /boot лежит на отдельном разделе, проверь перед обновлением:

mountpoint /boot

Если раздел не смонтирован, смонтируй его. Иначе pacman обновит ядро, но не запишет образы в /boot.

Проверяй образы после обновления

После обновления ядра сразу проверь, что образы свежие:

ls -la /boot/initramfs-linux.img

Pacman-хук для подстраховки

Можно повесить пересборку на событие post-transaction. Пример хука в /etc/pacman.d/hooks/:

[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = linux

[Action]
Description = Rebuilding initramfs
When = PostTransaction
Exec = /usr/bin/mkinitcpio -P

Тогда mkinitcpio -P выполнится автоматически после каждого обновления пакета linux. Если ядро вообще не обновилось, а предупреждение осталось, смотри статью «GRUB не видит ядра после обновления».

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

Предупреждение появилось, но система грузится нормально. Это опасно?

Нет, если образ собран для того же ядра, с которого ты грузишься. Предупреждение появляется и в безобидных случаях, например при пересборке образов для неактивного ядра. Но если initramfs реально устарел, при следующей загрузке система может не найти модули. Лучше пересобрать: mkinitcpio -P.

Чем fallback отличается от обычного initramfs?

Обычный initramfs собирается с хуком autodetect и содержит только модули для текущего железа. Fallback собирается без autodetect и содержит почти все модули ядра. Он больше, но грузится с любого железа. Используй его, если обычный образ не стартует.

После отката снапшота система не грузится. Что делать?

Откат вернул старый initramfs, который не совпадает с ядром. Загрузись с fallback, если он есть в меню, или с live-USB, сделай chroot и выполни mkinitcpio -P. После этого перезагружайся.

Нужно ли пересобирать initramfs вручную после каждого обновления ядра?

Нет. pacman сам запускает mkinitcpio через хуки при обновлении пакета linux. Вручную пересобирать нужно после откатов, ручных правок /etc/mkinitcpio.conf и в случаях, когда /boot не был смонтирован во время обновления.

mkinitcpio -P не помог. Что ещё проверить?

Убедись, что /boot смонтирован и в нём есть место. Проверь права на /boot и /usr/lib/modules. Если образ собирается, но система всё равно не грузится, загляни в журнал: journalctl -b -1 -p err. Возможно, проблема не в initramfs, а в параметрах ядра или в fstab.

Полезные ресурсы

Заключение

Предупреждение «initramfs создан с другим ядром» говорит об одном: образ initramfs и загруженное ядро разошлись. Проверь uname -r и ls /usr/lib/modules/, посмотри дату /boot/initramfs-linux.img и пересобери образы командой mkinitcpio -P. После откатов и обновлений с несмонтированным /boot пересборка обязательна. Fallback-образ пригодится, если обычный initramfs не стартует.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max