Сразу к делу: ошибка error: file '/boot/grub/x86_64-efi/normal.mod' not found (на BIOS-системах путь будет /boot/grub/i386-pc/normal.mod) значит, что GRUB загрузил свой core-образ, но не смог найти модуль normal.mod, который отвечает за чтение grub.cfg и показ меню. Лечится переустановкой пакета grub и повторным запуском grub-install из arch-chroot: загрузись с live-USB, и через десять минут система снова стартует.
GRUB устроен модульно. В boot-сектор или в ESP записывается только компактный core-образ: он умеет читать файловые системы и подгружать остальное. На BIOS-системах core.img лежит в зазоре между MBR и первым разделом, на UEFI это файл grubx64.efi в каталоге EFI/GRUB на ESP. Все остальные возможности вынесены в отдельные модули, которые лежат в каталоге /boot/grub/x86_64-efi (UEFI) или /boot/grub/i386-pc (BIOS).
normal.mod тут самый важный. Он реализует «нормальный» режим работы: читает grub.cfg, строит меню, обрабатывает команды вроде menuentry и submenu. Без него загрузчик умеет только то, что вшито в core-образ, а этого мало.
Модули подгружаются по требованию. Сначала core-образ загружает normal.mod, тот читает grub.cfg, а уже из конфига подтягиваются остальные модули: linux, initrd, драйверы файловых систем. Поэтому потеря одного normal.mod рушит всю цепочку загрузки, хотя остальные файлы могут лежать на месте.
Когда GRUB стартует, он смотрит на переменную prefix, путь к каталогу с модулями. По умолчанию это ($root)/boot/grub. Если по этому пути нет normal.mod, загрузчик падает в приглашение grub rescue> и показывает ту самую ошибку.
Самая частая причина. Если ты обновил систему через pacman -Sy grub или прервал обновление на середине, на диске может оказаться новый core-образ и старые модули (или наоборот). Версии не совпадают, GRUB не находит модуль, который ожидает. Частичные обновления в Arch вообще запрещены, и эта ошибка один из типичных симптомов. Подробнее в статье «Частичное обновление pacman».
Файловая система на /boot могла получить ошибки после жёсткого выключения, или раздел заполнился до отказа. Модули GRUB занимают немного, но если ESP переполнен (например, там лежат старые ядра и initramfs), запись новых файлов обрывается на середине. Проверь свободное место:
df -h /boot
Когда /boot отдельный раздел (ESP), а при обновлении пакета grub он не был смонтирован, pacman обновит файлы в пустой каталог на корневом разделе. Реальные модули на ESP останутся старыми. При следующей загрузке GRUB подтянет core-образ с ESP, а модули будет искать там же и не найдёт.
Иногда /boot копируют с другой машины или переносят вместе с диском. Если старая система была BIOS, а новая UEFI (или наоборот), каталог модулей не совпадает: i386-pc вместо x86_64-efi. GRUB ищет модули под свою архитектуру и не находит.
Каталог /boot/grub иногда чистят вручную, чтобы «освободить место», или переносят модули в другое место. GRUB об этом не знает: он ищет файлы строго по prefix. Если normal.mod нет по ожидаемому пути, появляется ошибка, даже когда вся остальная система в порядке. Типичный сценарий: удалил один «лишний» модуль, а загрузчик перестал стартовать.
Ты видишь приглашение grub rescue> и строку вроде:
error: file '/boot/grub/x86_64-efi/normal.mod' not found.
Ошибка бывает двух видов, и путь в сообщении подсказывает, какая у тебя система. /boot/grub/i386-pc/normal.mod ищет GRUB, установленный в режиме BIOS (Legacy). /boot/grub/x86_64-efi/normal.mod ищет UEFI-версия загрузчика. Если путь не совпадает с реальной схемой загрузки, это уже подсказка: конфиг достался от другой архитектуры.
Первым делом запиши точный текст ошибки и вспомни, какая у тебя схема загрузки: BIOS или UEFI. От этого зависят и путь к модулям, и команды для ремонта. Если не уверен, загляни в настройки прошивки: режим Legacy или UEFI указан в разделе загрузки.
Это значит, что core-образ загрузился и смонтировал корневой раздел, но каталог модулей пуст или указывает не туда. В grub rescue> доступен ограниченный набор команд: ls, set, insmod. Полноценное меню недоступно, потому что за него отвечает как раз normal.mod. Команда set без аргументов покажет текущие root и prefix: по ним сразу видно, куда GRUB пытается смотреть.
Сначала проверь, что модули вообще существуют. Команда ls без аргументов перечислит диски и разделы, например (hd0) (hd0,gpt1) (hd0,gpt2). Затем посмотри содержимое каталога модулей:
ls (hd0,gpt2)/boot/grub/x86_64-efi/
Если normal.mod в списке есть, укажи правильный корень и загрузи его вручную:
set root=(hd0,gpt2)
set prefix=($root)/boot/grub
insmod normal
normal
Номер раздела подставь из вывода ls: он покажет доступные разделы. Если разделов несколько и ты не уверен, какой из них корневой, перебирай их по очереди: ls (hd0,gpt1)/, ls (hd0,gpt2)/ и так далее. GRUB покажет содержимое, и ты найдёшь каталог boot с vmlinuz-linux. После normal GRUB прочитает grub.cfg и покажет обычное меню. Если меню не появилось, а ошибка осталась, значит, grub.cfg тоже повреждён или ссылается на несуществующие файлы.
Когда normal.mod отсутствует физически, загрузи ядро напрямую:
set root=(hd0,gpt2)
linux /vmlinuz-linux root=/dev/nvme0n1p2 rw
initrd /initramfs-linux.img
boot
Для BIOS-системы раздел указывается как (hd0,msdos2), а устройство /dev/sda2. Это способ «скорой помощи»: система загрузится один раз, дальше чини GRUB изнутри или с live-USB.
Это основной и надёжный способ. Загрузись с флешки Arch Linux, подключи интернет (dhcpcd для проводного, iwctl для Wi-Fi), затем:
lsblk
mount /dev/nvme0n1p2 /mnt # корень, подставь свой раздел
mount /dev/nvme0n1p1 /mnt/boot # ESP, если /boot отдельный раздел
arch-chroot /mnt
Проверь, что смонтировал правильные разделы: lsblk -f покажет метки и UUID. ESP легко перепутать, если на диске их несколько, например после экспериментов с dualboot.
Если /boot не отдельный раздел, а каталог на корне, ESP обычно смонтирована в /boot/efi или /efi. Смонтируй её в то же место внутри chroot и передай grub-install соответствующий --efi-directory, иначе загрузчик запишется не туда.
Внутри chroot переустанови пакет, чтобы вернуть все модули:
pacman -S grub --force
Флаг --force перезапишет файлы, даже если pacman считает пакет уже установленным. После этого проверь, что модуль на месте:
ls /boot/grub/x86_64-efi/normal.mod
Для BIOS-системы путь будет /boot/grub/i386-pc/normal.mod.
Теперь запиши загрузчик заново. Для UEFI:
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
Для BIOS (Legacy):
grub-install --target=i386-pc /dev/nvme0n1
В BIOS-варианте указывай диск целиком (nvme0n1, sda), а не раздел.
grub-mkconfig -o /boot/grub/grub.cfg
Если на диске есть Windows или вторая Linux-система, установи os-prober и перегенерируй конфиг ещё раз, иначе чужая ОС не появится в меню:
pacman -S os-prober
grub-mkconfig -o /boot/grub/grub.cfg
Выйди из chroot и перезагрузись:
exit
umount -R /mnt
reboot
Если после переустановки GRUB не видит корень из-за LUKS2 или btrfs, смотри статью «GRUB не видит LUKS2 и btrfs-корень». Общая методика переустановки загрузчика разобрана в статье «Переустановка GRUB после поломки».
Если меню пустое, хотя GRUB грузится, проверь, что в /boot лежат vmlinuz-linux и initramfs-linux.img. Их отсутствие лечится переустановкой ядра: pacman -S linux.
pacman -Syu, без -Sy и без прерывания. Частичное обновление чаще всего и даёт рассинхрон модулей.df -h /boot./boot смонтирован перед обновлением: mount | grep /boot./boot/grub вручную. Каталог модулей нужен загрузчику целиком, «почистить» его нельзя.grub.cfg перед экспериментами: cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak.grub.cfg перегенерируется автоматически через pacman-хук. Если хук сломан или отключён, конфиг устаревает. Проверяй время изменения файла: ls -l /boot/grub/grub.cfg./boot с другой машины всегда переустанавливай GRUB через grub-install и grub-mkconfig.Если загрузчик надоел, можно сменить его на systemd-boot: он проще, и модулей у него нет. Разбор в статье «Смена загрузчика с GRUB на systemd-boot».
Скорее всего, обновление прервалось, или пакет grub обновился, а grub-install не был запущен заново. Загрузись с live-USB, переустанови пакет и прогони grub-install + grub-mkconfig. Процедура из раздела выше.
grub rescue> это аварийный режим, когда не загружен normal.mod. Доступны только базовые команды. grub> это обычная командная строка GRUB, она появляется после успешной загрузки модулей, например при нажатии c в меню. Полный разбор аварийного режима в статье «grub rescue: что делать».
Технически можно, но версия модуля должна совпадать с версией core-образа, иначе GRUB откажется его загружать. Проще переустановить пакет: pacman -S grub --force сам положит все модули нужной версии.
Нет. Проблема только в загрузчике. Переустановка пакета grub и повторный grub-install полностью решают вопрос, файлы на разделах не трогаются.
Проверь, что /boot действительно смонтирован при загрузке (запись в /etc/fstab), и что grub-install писал в тот же раздел, с которого грузится система. Частая ошибка: установка GRUB на ESP, которую прошивка не использует. Загляни в порядок загрузки в BIOS/UEFI: если первым стоит другой диск или старая запись загрузчика, система стартует со старого GRUB.
Ошибка normal.mod not found не значит, что система сломана: это сигнал, что GRUB не нашёл свои модули. Причина почти всегда в рассинхроне версий после частичного обновления, переполненном или повреждённом /boot либо не смонтированной ESP. Лечение простое: загрузка с live-USB, arch-chroot, переустановка пакета grub и повторный grub-install с grub-mkconfig. После ремонта обновляй систему целиком и следи за свободным местом на ESP, и ошибка больше не вернётся.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии