Предупреждение «Initramfs was created with a different kernel version than the currently running one» появляется, когда mkinitcpio собирает initramfs для ядра, которое не совпадает с загруженным. Чаще всего это значит: ядро обновилось, а initramfs остался от старой версии, либо /boot не был смонтирован во время обновления. Лечится одной командой: mkinitcpio -P.
Initramfs это временная корневая файловая система, которую ядро загружает в память при старте. Внутри лежат модули и утилиты, нужные, чтобы смонтировать настоящий корень: драйверы дисков, поддержка LUKS, btrfs, сетевые модули. mkinitcpio собирает этот архив из модулей конкретного ядра, поэтому initramfs привязан к версии ядра.
Предупреждение о «другом ядре» mkinitcpio выводит, когда сравнивает версию загруженного ядра из uname -r с версией, для которой собирает образ. Если они не совпадают, ты получаешь предупреждение, а не ошибку: образ всё равно создастся, но для другого ядра. Загрузиться с таким образом можно, но часть модулей может не подойти, и система рискует не дойти до монтирования корня.
Самая частая ситуация. Ты обновил систему, pacman поставил новое ядро и пересобрал initramfs для него. Ты продолжаешь работать на старом ядре. При следующем запуске mkinitcpio, например при установке пакета с хуком, он увидит, что загруженное ядро старее того, для которого собирает образ.
Если 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».
Ядро распакует образ в память и попробует выполнить init из него. Если модулей для твоего диска в образе нет, монтирование корня упадёт. Типичные симптомы: загрузка останавливается на сообщении «mount: unknown filesystem type», паника ядра с ошибкой «VFS: Unable to mount root fs» или падение в emergency mode. Иногда всё работает, если модули совместимы между версиями, но полагаться на это не стоит. Один раз система загрузится, а после следующего обновления упадёт, и ты будешь гадать, что сломалось.
Сначала узнай версию загруженного ядра:
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».
Самый простой способ пересобрать все 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.
В пресете /etc/mkinitcpio.d/linux.preset прописаны два образа: default_image и fallback_image. Обычно это initramfs-linux.img и initramfs-linux-fallback.img.
Default собирается с хуком autodetect: в образ попадают только модули, нужные для текущего железа. Fallback собирается без autodetect, поэтому в нём лежат почти все модули ядра. Он больше по размеру, но зато не зависит от того, какое железо было обнаружено при сборке.
Когда грузиться с fallback:
Выбрать fallback можно в меню GRUB: рядом с пунктом ядра обычно есть строка с суффиксом fallback. Если такой строки нет, нажми e на пункте ядра, найди строку initrd и замени путь на /initramfs-linux-fallback.img, потом Ctrl+X для загрузки. Подробнее про устройство initramfs и хуки читай в статье «mkinitcpio подробно: хуки и модули».
Если ты используешь btrfs-снапшоты или откаты системы, например через stormos или snapper, откат возвращает не только ядро, но и старый initramfs. После отката загруженное ядро может не совпадать с тем, для которого собран образ в снапшоте. Поэтому после любого отката пересобирай initramfs:
mkinitcpio -P
То же касается отката пакета ядра через pacman: модули откатились, а initramfs остался от новой версии. Перед откатом полезно запомнить версию текущего ядра командой uname -r. После отката сравни её с содержимым /usr/lib/modules. Если версии разошлись, пересборка обязательна. Про снапшоты при установке читай в статье «Установка Arch с btrfs-снапшотами».
Если /boot лежит на отдельном разделе, проверь перед обновлением:
mountpoint /boot
Если раздел не смонтирован, смонтируй его. Иначе pacman обновит ядро, но не запишет образы в /boot.
После обновления ядра сразу проверь, что образы свежие:
ls -la /boot/initramfs-linux.img
Можно повесить пересборку на событие 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.
Обычный initramfs собирается с хуком autodetect и содержит только модули для текущего железа. Fallback собирается без autodetect и содержит почти все модули ядра. Он больше, но грузится с любого железа. Используй его, если обычный образ не стартует.
Откат вернул старый initramfs, который не совпадает с ядром. Загрузись с fallback, если он есть в меню, или с live-USB, сделай chroot и выполни mkinitcpio -P. После этого перезагружайся.
Нет. pacman сам запускает mkinitcpio через хуки при обновлении пакета linux. Вручную пересобирать нужно после откатов, ручных правок /etc/mkinitcpio.conf и в случаях, когда /boot не был смонтирован во время обновления.
Убедись, что /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 не стартует.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии