GRUB не видит LUKS2-корень или btrfs-подтом из-за нехватки модулей: в core image загрузчика нет cryptodisk, luks2, lvm и btrfs, а в параметрах ядра не указан корень. Включи GRUB_ENABLE_CRYPTODISK=y в /etc/default/grub, добавь модули в grub-install, пропиши root=/dev/mapper/arch-root и rootflags=subvol=@, перегенерируй grub.cfg. После этого загрузка заработает.
GRUB работает в два этапа. В ESP вшит компактный core image с базовыми модулями. Дальше загрузчик читает /boot/grub/grub.cfg и подгружает остальное. Если /boot лежит внутри LUKS2-контейнера, поверх которого развёрнуты LVM и btrfs, для чтения конфига нужны модули cryptodisk, luks2, lvm, btrfs и crypto. В core image по умолчанию их нет. Отсюда симптомы:
error: disk 'lvmid/...' not found: grub.cfg ссылается на логический том по lvmid, но том недоступен. LUKS не разблокирован или модуль lvm не загружен.error: unknown filesystem: GRUB не распознал файловую систему на разделе.Важный момент: если /boot вынесен на отдельный незашифрованный раздел, GRUB справляется без всякого крипто. Проблема появляется только когда /boot находится внутри зашифрованного корня. Дальше речь только о таком варианте.
Посмотри на раскладку дисков:
lsblk -f
Цепочка выглядит так: раздел с типом crypto_LUKS, поверх него lvm, внутри логический том с btrfs. Если /boot не отдельный раздел, а каталог внутри этого тома, значит, GRUB обязан разблокировать LUKS до чтения конфига. Именно для этого нужен cryptodisk. Если же в выводе виден отдельный раздел с типом vfat или ext4, смонтированный в /boot, то вся настройка ниже не нужна: GRUB читает /boot напрямую.
Открой /etc/default/grub и добавь строку:
GRUB_ENABLE_CRYPTODISK=y
Эта опция заставляет grub-mkconfig добавить в grub.cfg поиск зашифрованных дисков. Без неё GRUB даже не попытается разблокировать LUKS. После правки перегенерируй конфиг:
grub-mkconfig -o /boot/grub/grub.cfg
Пароль GRUB спросит ещё до появления меню, потому что сам grub.cfg лежит на зашифрованном диске. Это отдельный запрос, не путай его с запросом initramfs, который появится позже.
Мало разблокировать диск, ядру нужно сказать, где корень. Пропиши в /etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="root=/dev/mapper/arch-root rw"
Если корень на btrfs, добавь подтом и тип файловой системы:
GRUB_CMDLINE_LINUX_DEFAULT="root=/dev/mapper/arch-root rw rootflags=subvol=@ rootfstype=btrfs"
Разбор параметров:
root=/dev/mapper/arch-root: путь к логическому тому. arch-root значит группа томов arch, том root. Если имена другие, подставь свои. Раскладка из гайда установка Arch с LVM использует именно такие имена.rootflags=subvol=@: имя подтома, на который смонтирован корень. Посмотри строку для / в /etc/fstab, там будет subvol=.... Типовая раскладка подтомов описана в установке Arch на btrfs со снимками.rootfstype=btrfs: страховка, чтобы ядро не гадало по содержимому диска.Вместо /dev/mapper/arch-root можно указать root=UUID=<uuid логического тома>. UUID показывает lsblk -f в строке тома. Такой вариант переживает переименование группы томов.
Параметры попадут в grub.cfg только после перегенерации:
grub-mkconfig -o /boot/grub/grub.cfg
Обычно grub-install сам определяет нужные модули через grub-probe. На зашифрованном btrfs он иногда промахивается. Тогда вшей модули принудительно:
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --modules="btrfs cryptodisk luks2 lvm"
grub-mkconfig -o /boot/grub/grub.cfg
Флаг --modules добавляет модули прямо в core image, поэтому они доступны с самого старта. Он дополняет стандартный набор, а не заменяет его. После переустановки обязательно перегенерируй grub.cfg, иначе изменения не подхватятся.
Есть и второй способ: прописать модули в /etc/default/grub:
GRUB_PRELOAD_MODULES="btrfs cryptodisk luks2 lvm"
Эффект тот же, но модули подгружаются из /boot/grub/x86_64-efi, а не вшиваются в core image. Если ESP маленькая, этот вариант удобнее.
Проверь, что GRUB понимает твой /boot:
grub-probe --target=fs /boot
Команда должна вернуть btrfs. Ошибка значит, что GRUB не умеет читать эту файловую систему.
GRUB разблокировал LUKS и передал управление ядру. Дальше ядро должно снова разблокировать корень, теперь уже через initramfs. Если в initramfs нет нужных хуков, загрузка зависнет на этапе ожидания устройства.
Открой /etc/mkinitcpio.conf. Для systemd-стиля:
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole sd-encrypt lvm2 filesystems fsck)
Для классического busybox:
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)
sd-encrypt (или encrypt) разблокирует LUKS, lvm2 активирует логические тома. Без них ядро не найдёт корень, даже если GRUB всё сделал правильно. Стили хуков не смешиваются: если в начале списка стоит systemd, используй sd-encrypt, если udev и block, тогда encrypt.
После правки пересобери образы:
mkinitcpio -P
Проверь, что хуки попали в образ:
lsinitcpio /boot/initramfs-linux.img | grep -E "sd-encrypt|lvm2"
Если строк нет, хуки не подключились, ищи опечатку в HOOKS.
Если система не грузится, а хочется понять, на каком этапе затык, зайди в командную строку GRUB. В меню нажми c. Дальше:
cryptomount -a
ls
cryptomount -a пробует разблокировать все зашифрованные диски и спросит пароль. ls покажет доступные устройства: (crypto0), (lv/arch/root) и другие. Если после cryptomount том виден, модули на месте, а проблема в параметрах ядра или конфиге.
Для конкретного диска укажи его UUID:
cryptomount -u 1234abcd-5678-ef90-1234-5678abcdef90
UUID берётся из lsblk -f или cryptsetup luksDump.
Можно загрузиться вручную, не дожидаясь починки:
set root=(lv/arch/root)
linux /@/boot/vmlinuz-linux root=/dev/mapper/arch-root rw rootflags=subvol=@
initrd /@/boot/initramfs-linux.img
boot
Путь /@/boot/... верен, когда /boot лежит внутри подтома @. При другой раскладке подставь свой путь.
LUKS2 умеет вырабатывать ключ двумя алгоритмами: PBKDF2 и Argon2. Старые версии GRUB понимали только PBKDF2. Если пароль верный, а GRUB пишет invalid passphrase, проверь алгоритм:
cryptsetup luksDump /dev/nvme0n1p2
В секции Keyslots будет видно, какой PBKDF используется. Современный GRUB 2.12 поддерживает Argon2id, поэтому на свежем Arch проблема редкая. Версию загрузчика смотри так:
grub-install --version
При переносе системы на другое железо или в другую ОС имей в виду. Перевести ключ на PBKDF2 можно так:
cryptsetup luksConvertKey --pbkdf pbkdf2 /dev/nvme0n1p2
Команда спросит текущий пароль и перепишет ключ. Про управление ключами и keyfile подробнее в статье смена паролей LUKS2 и keyfile.
Да. Первый запрос от GRUB: загрузчик разблокирует диск, чтобы прочитать /boot. Второй от initramfs: ядро монтирует корень. Два независимых механизма, оба обязательны при такой схеме. Убрать второй запрос можно, если вынести /boot на отдельный раздел, тогда cryptodisk GRUB не понадобится.
grub.cfg ссылается на логический том по lvmid, но на момент чтения конфига том недоступен. Причины две: LUKS не разблокирован или модуль lvm не загружен. Лечится GRUB_ENABLE_CRYPTODISK=y и переустановкой GRUB с модулями luks2 и lvm.
Да. systemd-boot умеет разблокировать LUKS2 через sd-encrypt, а ядро можно грузить напрямую через EFISTUB или UKI. Переход описан в статье смена загрузчика с GRUB на systemd-boot, а прямая загрузка ядра в загрузке ядра через EFISTUB и UKI.
Не обязателен. GRUB читает /boot внутри LUKS2+btrfs, если вшить модули. Но отдельный /boot упрощает жизнь: не нужен cryptodisk, нет двойного запроса пароля, проще чинить систему с live-USB. Минус один: обновления ядра требуют перегенерации grub.cfg, иначе новый образ не появится в меню.
Посмотри строку для / в /etc/fstab, там будет subvol=.... Либо выполни btrfs subvolume list / и найди подтом, смонтированный в корень.
GRUB не видит LUKS2-корень или btrfs-подтом из-за нехватки модулей и неправильных параметров ядра. Три шага решают проблему: GRUB_ENABLE_CRYPTODISK=y в /etc/default/grub, модули luks2, lvm и btrfs в grub-install, root=/dev/mapper/arch-root с rootflags=subvol=@ в параметрах ядра. Не забудь перегенерировать grub.cfg после каждой правки и пересобрать initramfs с хуками sd-encrypt и lvm2. Если сомневаешься, где затык, проверь разблокировку через cryptomount -a прямо из меню GRUB.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии