Все об Arch Linux

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

normal.mod not found: причины и лечение

Сразу к делу: ошибка 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, и через десять минут система снова стартует.

Что такое normal.mod и зачем он GRUB?

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> и показывает ту самую ошибку.

Почему появляется ошибка normal.mod not found?

Частичное обновление пакета grub

Самая частая причина. Если ты обновил систему через pacman -Sy grub или прервал обновление на середине, на диске может оказаться новый core-образ и старые модули (или наоборот). Версии не совпадают, GRUB не находит модуль, который ожидает. Частичные обновления в Arch вообще запрещены, и эта ошибка один из типичных симптомов. Подробнее в статье «Частичное обновление pacman».

Повреждение /boot или переполнение ESP

Файловая система на /boot могла получить ошибки после жёсткого выключения, или раздел заполнился до отказа. Модули GRUB занимают немного, но если ESP переполнен (например, там лежат старые ядра и initramfs), запись новых файлов обрывается на середине. Проверь свободное место:

df -h /boot

ESP не была смонтирована при обновлении

Когда /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 пытается смотреть.

Как загрузить систему прямо из rescue?

Если модули на месте: insmod normal

Сначала проверь, что модули вообще существуют. Команда 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.

Как починить 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, иначе загрузчик запишется не туда.

Переустанови пакет grub

Внутри chroot переустанови пакет, чтобы вернуть все модули:

pacman -S grub --force

Флаг --force перезапишет файлы, даже если pacman считает пакет уже установленным. После этого проверь, что модуль на месте:

ls /boot/grub/x86_64-efi/normal.mod

Для BIOS-системы путь будет /boot/grub/i386-pc/normal.mod.

Переустанови GRUB на диск

Теперь запиши загрузчик заново. Для 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 и без прерывания. Частичное обновление чаще всего и даёт рассинхрон модулей.
  • Следи за свободным местом на ESP. Быстрая проверка: 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».

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

Ошибка появилась после обычного pacman -Syu. Что делать?

Скорее всего, обновление прервалось, или пакет grub обновился, а grub-install не был запущен заново. Загрузись с live-USB, переустанови пакет и прогони grub-install + grub-mkconfig. Процедура из раздела выше.

Чем отличается grub rescue> от grub>?

grub rescue> это аварийный режим, когда не загружен normal.mod. Доступны только базовые команды. grub> это обычная командная строка GRUB, она появляется после успешной загрузки модулей, например при нажатии c в меню. Полный разбор аварийного режима в статье «grub rescue: что делать».

Можно ли скопировать normal.mod с другой машины?

Технически можно, но версия модуля должна совпадать с версией core-образа, иначе GRUB откажется его загружать. Проще переустановить пакет: pacman -S grub --force сам положит все модули нужной версии.

Нужно ли переустанавливать весь Arch?

Нет. Проблема только в загрузчике. Переустановка пакета 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, и ошибка больше не вернётся.



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

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

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

Комментарии

Загрузка…

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

Telegram Max