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

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

Настройка системы

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

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

. У меня есть раздел EXT2 для / boot и еще один раздел для / boot / efi ].

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

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

Внутри этой системы (или любой другой системы ubuntu, если на то пошло) я могу создать собственную запись в / 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 моей файловой системы подкачки изменится, или что-то еще. Я имею в виду, что все причины, по которым мы не создаем пользовательские записи для каждой ОС, также применимы и здесь.

Попытка решения

В идеале для этого следует использовать sudo update-grub , но даже с загруженным ключом шифрования или даже когда я нахожусь в зашифрованной системе, похоже, он его не находит. Этот журнал взят из аквариума .

$ 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 , я дополнительно получаю сообщение между вторым Найденным образом initrd и Найденным диспетчером загрузки Windows строки:

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

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

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

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

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

0
задан 15 May 2020 в 16:52

1 ответ

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

Что мы собираемся сделать, это загрузить скрипты grub из Ubuntu 19.04 для нашей Ubuntu 18.04.

  1. Загрузите 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.

 # У нас есть более специализированный обработчик ZFS с несколькими системами в 10_linux_zfs.
if [ -e "`dirname $(readlink -f $0)`/10_linux_zfs" ]; тогда
выход 0
  1. повторите шаги с 2) по 5) для 10_linux вместо 10_linux_zfs.
2
ответ дан 15 July 2020 в 19:20

Другие вопросы по тегам:

Похожие вопросы: