Вопрос или проблема
Цель состоит в том, чтобы grub разблокировал /dev/nvme0n1p3
, который содержит файл ключа для разблокировки 2 зашифрованных LUKS btrfs raid0 дисков. Если получится наладить работу, я создам инструмент, который можно будет использовать вместе с установщиками Linux для более простого выполнения этой задачи.
Я постоянно оказываюсь в командной строке grub rescue с сообщением:
No such device: 2d6983f7-c10e-4b1a-b182-24d6f2b2a6c0
error: unknown filesystem.
Итак, он не разблокирует мой LUKS. Это UUID /dev/mapper/cryptroot
и /dev/mapper/cryptroot2
(они разделяют его, так как это raid0). Не знаю, почему он отображается как первое, что пытается сделать grub. Первое, что я хочу, чтобы grub разблокировал, это 0df41a34-e267-491a-ac02-25758c26ec65
, то есть /dev/nvme0n1p3
(cryptkeys), чтобы разблокировать диски raid0. Вот что я сделал…
Настройка
2 nvme-диска.
- 2 NVMe-диска.
- Garuda Linux (основан на Arch).
- Grub 2.6 (поддерживает LUKS2).
- Вывод
blkid
:
/dev/loop1: TYPE="squashfs"
/dev/mapper/cryptroot2: UUID="2d6983f7-c10e-4b1a-b182-24d6f2b2a6c0" UUID_SUB="b2ee9dad-c9cb-4ec4-ae38-d28af19eb183" BLOCK_SIZE="4096" TYPE="btrfs"
/dev/nvme0n1p3: UUID="0df41a34-e267-491a-ac02-25758c26ec65" TYPE="crypto_LUKS" PARTUUID="a49f7cdb-cbb6-44cd-b1e4-00b61dd1f00d"
/dev/nvme0n1p1: LABEL_FATBOOT="NO_LABEL" LABEL="NO_LABEL" UUID="A5AC-81DA" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="b0def085-1288-b746-9d7d-961354131dbc"
/dev/nvme0n1p2: UUID="802edb34-f481-4adf-9f98-3a80028d7cec" TYPE="crypto_LUKS" PARTLABEL="root" PARTUUID="9b945709-b51b-1c46-8ee3-6f3ba74c5a5b"
/dev/sdb2: SEC_TYPE="msdos" LABEL_FATBOOT="MISO_EFI" LABEL="MISO_EFI" UUID="EFD7-7387" BLOCK_SIZE="512" TYPE="vfat"
/dev/sdb1: BLOCK_SIZE="2048" UUID="2021-08-09-16-03-00-00" LABEL="GARUDA_GNOME_SOARING_" TYPE="iso9660"
/dev/loop2: TYPE="squashfs"
/dev/loop0: TYPE="squashfs"
/dev/mapper/cryptroot: UUID="2d6983f7-c10e-4b1a-b182-24d6f2b2a6c0" UUID_SUB="ef6be59d-a4be-4d00-93c2-0084530bf929" BLOCK_SIZE="4096" TYPE="btrfs"
/dev/nvme1n1: UUID="53517d3d-a638-48b9-af4f-125114e4f0c6" TYPE="crypto_LUKS"
/dev/zram0: LABEL="zram0" UUID="aa36a4d8-690e-4f2a-bfc9-e2fad1db8efb" TYPE="swap"
/dev/loop3: TYPE="squashfs"
Процедуры
- Установил Garuda Linux на
/dev/nvme0n1
, что дало мне следующую схемудисков на первом диске. Затем я создал раздел ext4 (cryptkeys) в контейнере LUKS для хранения ключей и контейнер LUKS, охватывающий весь nvme1n1 для btrfs raid:
NAME FSTYPE FLAGS
nvme0n1
├─nvme0n1p1 fat32 boot,esp
├─nvme0n1p2 crypto_LUKS
│ └─cryptroot btrfs
└─nvme0n1p3 crypto_LUKS
└─cryptkeys ext4
nvme1n1 crypto_LUKS
└─
└─cryptroot2 btrfs
-
Разблокировал
nvme0n1p2
иnvme1n1
, монтируя на/mnt/cryptroot
. -
Для конвертации в raid0 на 2 диска выполнил:
btrfs device add /dev/mapper/cryptroot2 /mnt/cryptroot
btrfs balance start -dconvert=raid0 -mconvert=raid1 /mnt/cryptroot
- Создал новый файл ключа для LUKS и добавил его во все контейнеры LUKS, кроме того, который я назвал “cryptkeys”, то есть
/dev/nvme0n1p3
. Все контейнеры LUKS также могут быть разблокированы с помощью того же пароля.nvme0n1p3
был смонтирован на/mnt/cryptkeys
, и файл ключа был скопирован в него:
dd bs=512 count=4 if=/dev/random of=/mnt/cryptroot/crypto_keyfile.bin
chmod 600 /mnt/cryptkeys/crypto_keyfile.bin
cryptsetup luksAddKey /dev/nvme0n1p2 cryptkeys/crypto_keyfile.bin
cryptsetup luksAddKey /dev/nvme1n1 cryptkeys/crypto_keyfile.bin
- Смонтировал btrfs raid0 и вошел в новый Garuda через chroot:
mkdir /mnt/newroot
mount -o subvol=@,compress=zstd /dev/mapper/cryptroot newroot
for i in /dev /dev/pts /proc /sys /run; do sudo mount --bind $i /mnt/newroot$i; done
mount /dev/nvme0n1p1 newroot/boot/efi
mount --bind /sys/firmware/efi/efivars newroot/sys/firmware/efi/efivars
chroot /mnt/newroot
- Отредактировал
/etc/default/grub
так, чтобы было:
# GRUB boot loader configuration
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Garuda"
GRUB_CMDLINE_LINUX_DEFAULT="quiet cryptdevice2=/dev/disk/by-uuid/0df41a34-e267-491a-ac02-25758c26ec65:cryptkeys:allow-discards cryptdevice3=/dev/disk/by-uuid/802edb34-f481-4adf-9f98-3a80028d7cec:cryptroot:allow-discards cryptdevice=/dev/disk/by-uuid/53517d3d-a638-48b9-af4f-125114e4f0c6:cryptroot2:allow-discards root=/dev/mapper/cryptroot splash rd.udev.log_priority=3 vt.global_cursor_default=0 systemd.unified_cgroup_hierarchy=1 loglevel=3"
GRUB_CMDLINE_LINUX=""
# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos"
# Uncomment to enable booting from LUKS encrypted devices
#GRUB_ENABLE_CRYPTODISK=y
# Set to 'countdown' or 'hidden' to change timeout behavior,
# press ESC key to display menu.
GRUB_TIMEOUT_STYLE=menu
# Uncomment to use basic console
GRUB_TERMINAL_INPUT=console
# Uncomment to disable graphical terminal
#GRUB_TERMINAL_OUTPUT=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE=auto
# Uncomment to allow the kernel use the same resolution used by grub
GRUB_GFXPAYLOAD_LINUX=keep
# Uncomment if you want GRUB to pass to the Linux kernel the old parameter
# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx"
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY=true
# Uncomment and set to the desired menu colors. Used by normal and wallpaper
# modes only. Entries specified as foreground/background.
#GRUB_COLOR_NORMAL="light-blue/black"
#GRUB_COLOR_HIGHLIGHT="light-cyan/blue"
# Uncomment one of them for the gfx desired, a image background or a gfxtheme
#GRUB_BACKGROUND="/path/to/wallpaper"
GRUB_THEME="/usr/share/grub/themes/garuda/theme.txt"
# Uncomment to get a beep at GRUB start
#GRUB_INIT_TUNE="480 440 1"
# Uncomment to make GRUB remember the last selection. This requires
# setting 'GRUB_DEFAULT=saved' above.
#GRUB_SAVEDEFAULT=true
# Uncomment to disable submenus in boot menu
#GRUB_DISABLE_SUBMENU=y
GRUB_DISABLE_OS_PROBER=false
GRUB_DISABLE_OS_PROBER=false
GRUB_ENABLE_CRYPTODISK=y
- Копировал хуки:
# копия оригинального хука
cp /usr/lib/initcpio/install/encrypt /etc/initcpio/install/encrypt2
cp /usr/lib/initcpio/install/encrypt /etc/initcpio/install/encrypt3
cp /usr/lib/initcpio/hooks/encrypt /etc/initcpio/hooks/encrypt2
cp /usr/lib/initcpio/hooks/encrypt /etc/initcpio/hooks/encrypt3
# адаптация нового хука для использования других названий и чтобы не удалять файл ключа
sed -i "s/cryptdevice/cryptdevice2/" /etc/initcpio/hooks/encrypt2
sed -i "s/cryptdevice/cryptdevice3/" /etc/initcpio/hooks/encrypt3
sed -i "s/cryptkey/cryptkey2/" /etc/initcpio/hooks/encrypt2
sed -i "s/cryptkey/cryptkey3/" /etc/initcpio/hooks/encrypt3
sed -i "s/rm -f \${ckeyfile}//" /etc/initcpio/hooks/encrypt2
sed -i "s/rm -f \${ckeyfile}//" /etc/initcpio/hooks/encrypt3
- Добавил
encrypt2
иencrypt3
в/etc/mkinitcpio.conf
перед хукомencrypt
. Также указал файл ключей.mkinitcpio.conf
теперь:
# vim:set ft=sh
# MODULES
# Следующие модули загружаются перед запуском любых хуков
# Продвинутые пользователи могут захотеть указать все системные модули
# в этом массиве. Например:
# MODULES=(intel_agp i915 amdgpu radeon nouveau)
MODULES=(intel_agp i915 amdgpu radeon nouveau)
# BINARIES
# Это настройка включает любые дополнительные бинарные файлы,
# что пользователь может
# хотеть в CPIO образ. Это выполняется последним, поэтому он может быть использован для
#
# переопределения фактических бинарных файлов, включенных данным хуком.
# BINARIES анализируются на зависимости, так что вы можете безопасно игнорировать библиотеки
BINARIES=()
# FILES
# Эта настройка аналогична BINARIES выше, однако, файлы добавляются
# как есть и не анализируются каким-либо образом. Это полезно для конфигурационных файлов.
FILES="/crypto_keyfile.bin"
# HOOKS
# Это наиболее важная установка в этом файле. HOOKS управляют
# модулями и скриптами, добавляемыми в образ, и тем, что происходит во время загрузки.
# Порядок важен, и рекомендуется не изменять
# порядок добавления хуков. Запустите 'mkinitcpio -H <hook name>' для
# помощь по определенному хуку.
# 'base' _обязателен_, кроме случаев, когда вы точно знаете, что делаете.
# 'udev' _обязателен_ для автоматической загрузки модулей
# 'filesystems' _обязателен_, кроме случаев, когда вы указываете свои модули файловой системы в MODULES
# Примеры:
## Эта установка указывает все модули в настройке MODULES выше.
## Не нужно raid, lvm2 или зашифрованный root.
# HOOKS=(base)
#
## Этот набор будет автоматически определять все модули для вашей системы и должен
## работать как разумный пункт по умолчанию
# HOOKS=(base udev autodetect block filesystems)
#
## Этот набор создаст 'полный' образ, который поддерживает большинство систем.
## Автоопределение не выполняется.
# HOOKS=(base udev block filesystems)
#
## Этот набор собирает pata mdadm массив с зашифрованной корневой файловой системой.
## Примечание: см. 'mkinitcpio -H mdadm' для дополнительной информации о устройствах raid.
# HOOKS=(base udev block mdadm encrypt filesystems)
#
## Этот набор загружает группу томов lvm2 на usb-устройстве.
# HOOKS=(base udev block lvm2 filesystems)
#
## ПРИМЕЧАНИЕ: если у вас отдельный раздел /usr, вы ДОЛЖНЫ включить
# usr, fsck и shutdown хуки.
HOOKS="base udev encrypt autodetect modconf block keyboard keymap consolefont plymouth encrypt2 encrypt3 encrypt filesystems"
# COMPRESSION
# Используйте это для сжатия образа initramfs. По умолчанию используется zstd-сжатие.
# Используйте 'cat' для создания несжатого образа.
#COMPRESSION="zstd"
#COMPRESSION="gzip"
#COMPRESSION="bzip2"
#COMPRESSION="lzma"
#COMPRESSION="xz"
#COMPRESSION="lzop"
#COMPRESSION="lz4"
# COMPRESSION_OPTIONS
# Дополнительные параметры для компрессора
#COMPRESSION_OPTIONS=()
- Выполнил:
mkinitcpio -p linux-zen
# initramfs включает в себя ключ, поэтому только root должен иметь возможность его читать
chmod 600 /boot/initramfs-linux-fallback.img
chmod 600 /boot/initramfs-linux.img
- Изменил
/etc/crypttab
на:
# /etc/crypttab: отображение для зашифрованных разделов.
#
# Каждое отображенное устройство будет создано в /dev/mapper, поэтому ваш /etc/fstab
# должен использовать пути /dev/mapper/<name> для зашифрованных устройств.
#
# См. crypttab(5) для описываемого синтаксиса.
#
# ПРИМЕЧАНИЕ: Не указывайте здесь свой корневой (/) раздел, он должен быть настроен
# заранее initramfs (/etc/mkinitcpio.conf). То же относится
# к зашифрованному swap, который должен быть настроен с помощью mkinitcpio-openswap
# для поддержки возобновления.
#
# <name> <device> <password> <options>
cryptkeys UUID=0df41a34-e267-491a-ac02-25758c26ec65 /crypto_keyfile.bin luks,discard,nofail
- Изменил
/etc/fstab
на:
# <файловая система> <точка монтирования> <тип> <параметры> <дамп> <проход>
UUID=A5AC-81DA /boot/efi vfat umask=0077 0 2
/dev/mapper/cryptroot / btrfs subvol=/@,defaults,noatime,space_cache,autodefrag,compress=zstd 0 0
/dev/mapper/cryptroot /home btrfs subvol=/@home,defaults,noatime,space_cache,autodefrag,compress=zstd 0 0
/dev/mapper/cryptroot /root btrfs subvol=/@root,defaults,noatime,space_cache,autodefrag,compress=zstd 0 0
/dev/mapper/cryptroot /srv btrfs subvol=/@srv,defaults,noatime,space_cache,autodefrag,compress=zstd 0 0
/dev/mapper/cryptroot /var/cache btrfs subvol=/@cache,defaults,noatime,space_cache,autodefrag,compress=zstd 0 0
/dev/mapper/cryptroot /var/log btrfs subvol=/@log,defaults,noatime,space_cache,autodefrag,compress=zstd 0 0
/dev/mapper/cryptroot /var/tmp btrfs subvol=/@tmp,defaults,noatime,space_cache,autodefrag,compress=zstd 0 0
- Наконец, выполнил:
grub-mkconfig -o /boot/grub/grub.cfg
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Garuda --recheck
exit
reboot
Отступление: В несколько раз, когда я запускал grub-install
, значение --bootloader-id
было arch-grub
, прежде чем я изменил его на Garuda
. Я думаю, что это не имеет большого значения, кроме того, что теперь у меня есть дополнительные записи в меню загрузки, так как я не знаю, как от них избавиться. Это, вероятно, не имеет значения. Я получаю ошибку даже при выборе записи Garuda в меню загрузки EFI.
Примечание: Эти процедуры были адаптированы из этого блог поста. В чем разница, так это в отсутствии зашифрованного LUKS раздела загрузки и добавлении раздела cryptkeys вместо него.
Похоже, вы не разрешаете GRUB загружаться с зашифрованных LUKS устройств:
# Uncomment to enable booting from LUKS encrypted devices
#GRUB_ENABLE_CRYPTODISK=y
Я планирую сделать установку полного шифрования диска с помощью LUKS, LVM и btrfs. Насколько я понял, GRUB способен работать с LUKS1, но не с LUKS2.
Это может быть дальний выстрел, но вы должны проверить, создал ли установщик Garuda раздел LUKS2, и если это так, понизьте его до LUKS1. Удачи и делитесь результатами!
.
Ответ или решение
Уважаемый пользователь,
Подключение и инициализация LUKS (Linux Unified Key Setup)-зашифрованных и RAID0-совмещенных Btrfs разделов на этапах загрузки системы представляет собой сложную задачу, которая требует точной настройки различных компонентов системы. В вашей описанной ситуации, ключевая проблема заключается в том, чтобы заставить GRUB правильно разблокировать устройство /dev/nvme0n1p3
, содержащее ключевой файл, который в свою очередь предполагается использовать для разблокировки двух LUKS-зашифрованных дисков, работающих в режиме RAID0.
Теоретическая часть
GRUB и LUKS: GRUB, будучи загрузчиком, отвечает за начальную загрузку операционной системы и может быть сконфигурирован для разблокировки LUKS-томов. Для этого необходимо включить поддержку зашифрованных дисков в конфигурации GRUB. В вашем случае, важной строкой является GRUB_ENABLE_CRYPTODISK=y
. Это нужно для того, чтобы GRUB мог взаимодействовать с LUKS-томами до загрузки системы.
Типы LUKS: Важно учитывать, что GRUB имеет ограниченную поддержку LUKS2 по сравнению с LUKS1. Если ваши разделы использую LUKS2, возможно, GRUB не сможет правильно их распознать и разблокировать. В этом случае, после предварительной разблокировки, необходимо переключиться на использование ключевого файла, что позволяет операционной системе уже изнутри функционировать с этими томами.
RAID и Btrfs: Btrfs поддерживает программный RAID, что отвечает за распределение данных по нескольким устройствам, улучшая скорость и надежность (в случае других видов RAID). В вашем случае RAID0 разносит данные по двум дискам, однако он не обеспечивает избыточность, поэтому особое внимание должно быть посвящено корректному управлению ключевыми файлами и LUKS-механизмами для защиты данных.
Пример
Рассмотрим важные шаги, упомянутые в вашей ситуации:
-
Настройка ключевого файла: Вы создали ключевой файл и добавили его для всех LUKS томов. Это правильный подход для гарантии резервного доступа к данным без необходимости ввода пароля при каждом запуске.
-
Правильная конфигурация mkinitcpio: Правильный порядок и назначение hooks в конфигурации mkinitcpio также критически важен. Убедитесь, что порядок загрузки модулей учтен корректно и что файл ключа доступен непосредственно в процессе инициализации.
-
Конфигурация криптографических устройств в /etc/default/grub и /etc/crypttab: Убедитесь, что все устройства и соответствующие ключевые файлы правильно перечислены и доступны на этапе загрузки согласно измененной конфигурации.
Применение
-
Проверка версии LUKS: Убедитесь, что используемая версия LUKS в ваших зашифрованных томах совместима с GRUB. Если используется LUKS2, рассмотрите возможность переинициализации с LUKS1, если GRUB сталкивается с проблемами совместимости.
-
Пересмотрите загрузочные параметры: Настройка в /etc/default/grub должна включать строки для включения модулей и правильной идентификации файловых систем и криптографических ключей. Убедитесь, что GRUB_ENABLE_CRYPTODISK действительно включен и раскомментирован.
-
Использование правильного порядка для initramfs и восстановления конфигурации: Правильный порядок шагов в mkinitcpio и пребывание ключевого файла доступны на момент, необходимый для развертывания root и других файловых систем.
-
Тестирование и отладка: После внесения изменений, убедитесь в их применении с помощью обновления конфигурации GRUB (команда
grub-mkconfig
и повторная установка загрузчика) и изучите загрузочный процесс, чтобы выявить факторы, приводящие к падению в grub rescue prompt.
Следуя детализированным инструкциям и проверкам, вы можете обнаружить, что некоторые шаги должны быть переосмыслены или настроены для специфического оборудования, которое вы используете. Если проблемы продолжаются, возможно, стоит обратиться к сообществу дистрибутива Garuda или иным специалистам для получения более специфических инструкций или патчей.