Как создать элемент меню grub2 с помощью update-grub fo r зашифрованной файловой системы zfs root? - proUbuntu
2 голосов
/ 14 мая

Я использую Ubuntu 18.04 на ZFS 0.8.4 и играю с шифрованием. Я хотел бы иметь элемент меню в grub, который позволяет мне загружаться с зашифрованным root.

System Setup

Галочка означает, что в grub есть соответствующая запись в меню.

  • aquarium/ds1/u18
    содержит мой ubuntu 18.04, а его точка монтирования установлена ​​на /
  • tank/ds1/u18
    скопировано из aquarium с подошвой разница в том, что ds1 зашифрован, а u18 наследует это свойство.
  • Windows 10 ✓
    Я надеюсь, что это не имеет ничего общего с моими проблемами.
  • /dev/nvme0n1p8
    Система в формате EXT4, которая все еще оттуда, когда я переключился на ZFS aquarium

У меня есть раздел EXT2 fo r /boot и другой r раздел fo r /boot/efi.

Ручные обходные пути

Когда я выбираю и редактирую запись aquarium, заменяя root=ZFS=aquarium/ds1/u18 на root=ZFS=tank/ds1/u18, я могу нормально загрузиться в initramfs, где мне предлагается ввести кодовую фразу r. После ввода кодовой фразы r я получаю свою систему должным образом.

Внутри этой системы (o r любая другая r ubuntu система fo r матовая r), я может создать настраиваемую запись в /etc/grub/40_custom.

menuentry "Encryptioned Magic 18.04" {
    linux /vmlinuz-5.3.0-51-generic root=ZFS=tank/ds1/u18 ro acpi_backlight=video resume=UUID-OF-SWAP-PARTITION
    initrd /initrd.img-5.3.0-51-generic
}

Я бы хотел избежать этого, потому что ручной ввод означает, что мне нужно изменить его, когда UUID моей файловой системы подкачки изменяется, o r что-то другое. Я имею в виду, что все причины, по которым мы не создаем пользовательские записи для r для каждой ОС, в основном также применимы здесь. с загруженным ключом шифрования o r, даже когда я нахожусь в зашифрованной системе, он, кажется, не находит его. Этот журнал ведется в aquarium.

$ sudo update-grub
Sourcing file `/etc/default/grub`
Generating grub configuration file ...
Found theme: /boot/grub/themes/poly-dark/theme.txt
Found linux image: /boot/vmlinuz-5.3.0-51-generic
Found initrd image: /boot/initrd.img-5.3.0-51-generic
Found linux image: /boot/vmlinuz-5.3.0-28-generic
Found initrd image: /boot/initrd.img-5.3.0-28-generic
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Found Ubuntu 18.04.4 LTS (18.04) on /dev/nvme0n1p8
Adding boot menu entry for EFI firmware configuration
done

Когда я запускаю ту же команду в зашифрованной системе tank, я дополнительно получаю сообщение между вторым Found initrd image и Found Windows Boot Manager строки:

device-mapper: reload ioctl on osprober-linux-nvme0n1p10   failed: Device or resource busy
Command failed

Упомянутый раздел nvme0n1p10 - это единственный раздел, в котором настроен пул tank с зашифрованным набором данных tank/ds1/u18.

Это же сообщение об ошибке r, похоже, возникает, когда r zfs использует раздел при запуске update-grub , поскольку он открывает его для r эксклюзивного доступа , нет matte r в какой системе я вошел. Такое поведение r является подтвержденной ошибкой в os-probe r, но они называют это

не на самом деле сбой, а просто выдачей ошибок во время os-probe r. Мы хотим очистить его (это cosmeti c).

Как я могу автоматически сгенерировать запись grub для r моего зашифрованного набора данных zfs?

1 Ответ

1 голос
/ 15 июля

В настоящее время это все еще открытая проблема в zfsonlinux / grub, но я опубликовал обходной путь там (и здесь) благодаря использованию github r tterpelle :

Что мы собираемся сделать, так это взять скрипты grub из Ubuntu 19.04 fo r ou r Ubuntu 18.04.

  1. Download grub-common_2.04-1ubuntu12_amd64.deb из https://packages.ubuntu.com/eoan/amd64/grub-common/download и извлеките его с помощью ar x grub-common_2.04-1ubuntu12_amd64.deb.

  2. Получите файл /etc/grub.d/10_linux_zfs из этого data.tar.xz. Я не знал правильного пути, поэтому просто сделал vim data.tar.xz, открыл файл, затем сделал :w 10_linux_zfs.

  3. Переместил его в /etc/grub.d

  4. Сделайте его исполняемым, иначе он не может быть запущен. sudo chmod +x /etc/grub.d/10_linux_zfs

  5. sudo update-grub

Этого достаточно для создания правильной записи. Но мы также хотим, чтобы не было никаких неправильных записей, поэтому мы должны заменить 10_linux таким же образом, потому что они добавили несколько строк, которые пропускают создание записей zfs.

   # We have a more specialized ZFS handler, with multiple system in 10_linux_zfs.
   if [ -e "`dirname $(readlink -f $0)`/10_linux_zfs" ]; then
     exit 0
повторите шаги с 2) по 5) fo r 10_linux вместо 10_linux_zfs.
...