Ядра пропали из меню GRUB после обновления — виноват не сам загрузчик, а grub.cfg, который перестал соответствовать содержимому /boot: записи ссылаются на файлы, которых там нет. Чинится одной командой — grub-mkconfig -o /boot/grub/grub.cfg, а если и она не помогла — переустановкой ядра или самого GRUB.
GRUB не сканирует диск при каждой загрузке — он читает готовый файл /boot/grub/grub.cfg. Пока файлы ядра на месте, записи работают даже после обновления: они ссылаются на стабильные пути /vmlinuz-linux и /initramfs-linux.img. Проблема появляется, когда обновление не доехало до /boot — ESP переполнена, раздел не смонтирован, файлы не записались. Тогда записи ведут в пустоту, и меню становится пустым. Пересборка конфига — первый шаг диагностики.
Типичный случай. mkinitcpio пересобирает initramfs автоматически через хук pacman, а вот grub-mkconfig никто за тебя не запустит. Конфиг остался от прошлой сборки и не видит текущее содержимое /boot — пересобери его и проверь, что записи появились.
В Arch два популярных расклада: ESP в /boot или ESP в /efi с отдельным /boot. Если в fstab прописано одно, а смонтировано другое — ядра и grub.cfg разъезжаются по разным файловым системам. GRUB ищет vmlinuz рядом с grub.cfg, не находит и рисует пустое меню. Проверь fstab и findmnt /boot.
Пропали не только ядра Arch, но и Windows? Тогда дело в os-prober. Начиная с GRUB 2.06 он отключён по умолчанию: в /etc/default/grub стоит GRUB_DISABLE_OS_PROBER=true. Ставишь пакет os-prober, меняешь значение на false, пересобираешь конфиг — и чужие системы возвращаются в меню. Разбор — в статье «Windows пропала из GRUB».
ESP на FAT32 обычно маленький — 100–512 МБ. Старые ядра копятся, места не хватает, pacman падает с ошибкой записи, и свежий vmlinuz-linux не доезжает до /boot. grub-mkconfig честно генерирует записи для файлов, которых нет. Проверка — df -h /boot.
Прежде чем чинить конфиг, убедись, что сами ядра существуют.
ls /boot
В выводе должны быть vmlinuz-linux и initramfs-linux.img. Если стоит несколько ядер — по файлу на каждое. Нет файлов — ядро не установилось, и дело не в конфиге.
cat /boot/grub/grub.cfg | grep -A2 menuentry
Нашёл записи с vmlinuz-linux — конфиг в порядке, проблема глубже. Пусто или одни заголовки без команд — конфиг старый или битый. Заодно проверь, где лежит grub.cfg: ls /efi/GRUB или ls /boot/grub.
Пошагово, без паники:
Утилита проходит по скриптам в /etc/grub.d/. Главный — 10_linux: он ищет ядра в /boot, собирает записи меню и пишет их в grub.cfg. Учитываются и настройки из /etc/default/grub — например, GRUB_PRELOAD_MODULES, модули для подгрузки до чтения файловой системы. Если записи не появляются — смотри вывод grub-mkconfig: он почти всегда называет причину.
Конфиг пересобрался, записи на месте, а меню всё равно пустое или система не грузится — копаем глубже.
Если в /boot пусто или файлы битые, верни ядро на место:
pacman -S linux
mkinitcpio -P
grub-mkconfig -o /boot/grub/grub.cfg
Первая ставит ядро заново, вторая пересобирает initramfs, третья — конфиг. Подробности — на странице mkinitcpio в ArchWiki.
Если конфиг генерируется, а загрузчик всё равно не видит ядра — сломан сам GRUB: битые модули, кривая запись в NVRAM, повреждённый grubx64.efi. Нужна полная переустановка через grub-install и grub-mkconfig. Пошаговый ремонт из live-окружения — в статье «Переустановка GRUB после поломки».
Пара привычек, и меню больше не будет пустеть:
После обновления в меню только старые ядра, новые не появляются. Что делать?
Пересобери конфиг: grub-mkconfig -o /boot/grub/grub.cfg. GRUB не добавляет записи сам — он читает готовый файл.
Пропали и Arch, и Windows из меню.
Включи os-prober: установи пакет os-prober, поставь GRUB_DISABLE_OS_PROBER=false в /etc/default/grub и пересобери конфиг.
grub-mkconfig ругается на «failed to get canonical path».
Запускай команду из загруженной системы, а не из chroot. В live-окружении используй arch-chroot.
В /boot вообще нет vmlinuz-linux.
Ядро не установилось. Верни его: pacman -S linux, затем mkinitcpio -P и grub-mkconfig -o /boot/grub/grub.cfg.
ESP переполнен, pacman не может записать ядро.
Почисти старые ядра: paccache -rk1 удалит все версии, кроме последней.
Ядра не пропадают бесследно. В девяти случаях из десяти виноват устаревший grub.cfg, который никто не пересобрал после обновления. Три команды — mkinitcpio -P, grub-mkconfig -o /boot/grub/grub.cfg и перезагрузка — решают проблему за пару минут. Не помогло — переустанови ядро, а затем и сам GRUB. Главное правило: обновил ядро — пересобери конфиг.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии