LINUX.ORG.RU

Загрузка gentoo, lvm over luks && efi/uefi

 , , , ,


0

2

История проста: вот и я докатился до регистрации на лоре, - это мой первый топик.

Вопрос досконально лопачу не первый день… даже неделю. Прошу помощи, ибо хочу осилить (ну могу, если уйду в отпуск и ничем другим заниматься не будет нужно. Да я не молод ;-)

И так, что имеем:

На стенде виртуалка, в ней пытаюсь провернуть такую махинацию:

Стенд запущен, а исходные:

1 bios_grub 2 boot, esp 3 lvm

Через losetup

привести к виду:

1 bios_grub 2 boot, esp 3 lvm over luks

Используемые инструменты:

genkernel, grub-mkconfig

PS: Кэп, я хочу быть уверен в старте с носителя в любой тачке: GPT, но уметь в MBR, EFI/UEFI

Спотыкаюсь о grub rescue> not found lvmid/blah-blah

Я понимаю, что есть insmod vs grub-mkimage; проблемы grub + luks1 vs luks2; uuid vs multipath vs label и много много всего.

Если не трудно, посодействуйте в формировании последовательного чек-листа для генты по данной задаче. Поясню мотивацию: стек носит прикладной характер и не всегда хватает соображалки словить себя на упущении.

Заранее спасибо

Не понял - раздел уже зашифрован или ещё нет? Lvmid после каких операций Grub не находит?

mxfm ()
Ответ на: комментарий от mxfm

genkernel –luks сделано в кофигах. devices нужен crypto target? А так, делаю по следующему

mkfs.blah-blah /dev/some-disk

mount /dev/some-disk /mnt

dd if=/dev/zero of=/mnt/tmp.img

losetup /dev/loop100500 /mnt/tmp.img

sfdisk -d /dev/vda | sfdisk /dev/loop100500

partx –update /dev/loop100500

vgextend vg /dev/loop100500p3

pvmove /dev/vda3 /dev/loop100500

vgreduce vg /dev/vda3

cryptsetup и по сути в обратном порядке.

boot живёт внутри vg на самом же диске три партиции: 1 это bios_grub для самого grub (емнип, он туда модули складывает); 2 esp, boot это /boot/efi в формате FAT32 3 это lvm который с /, который хочется упрятать в luks

Т.е. хотелка в boot GNU Linux/Gentoo on luks with crypted boot, using efi/uefi

Да, чуть не забыл.

Основной момент который сформулировать гуглу не могу: Вот в случае, когда отдельный boot, то можно распотрошить initramfs и найти бинарники, а grub то как чекнуть что он вообще распарсил что от него хотят? Варианты с grub.cfg и crypto_disk_enable не особо канает (это как понимаю для grub_image и добавить модули к core image)

У меня осоновная проблема (если «копнуть в корень неосиляторства») в том, что я не могу подсмотреть логи; не могу чекнуть конфиги, кроме как grub-install скрестив пальцы.

avg_user ()

В каком-то смысле: https://unix.stackexchange.com/a/263771 в том или ином виде так не работает. Официальные гайды у генты тоже самое предлогают. С начала было подозрение про useflags, конфиги… Перепробовал комбинации и сочетание комбинаций по вечерам после работы…. Когда результат не изменялся, то понял что нужно конкретно посмотреть в документации, но повторюсь тут прикладное и по сему каждый точит как хочет и «а у нас работает», - чек листов нет: понимания что именно нужно, тоже нет.

avg_user ()
Ответ на: комментарий от avg_user

-> https://blog.heckel.io/2017/05/28/creating-a-bios-gpt-and-uefi-gpt-grub-bootable-linux-system/

Loop sparse file

LOOPDEV=$(losetup –find –show test.img) partprobe ${LOOPDEV}

Mount EFI partition

MOUNTDIR=$(mktemp -d -t demoXXXXXX) mount ${LOOPDEV}p2 $MOUNTDIR

Create EFI boot image

apt-get install grub-efi-amd64-bin -y –force-yes

mkdir -p ${MOUNTDIR}/EFI/BOOT grub-mkimage
-d /usr/lib/grub/x86_64-efi
-o ${MOUNTDIR}/EFI/BOOT/bootx64.efi
-p /efi/boot
-O x86_64-efi
fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop
efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background
gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf

Create grub config

cat <<GRUBCFG > ${MOUNTDIR}/EFI/BOOT/grub.cfg search –label demoroot –set prefix # << Note again, this searches by the ‘demoroot’ label! configfile ($prefix)/boot/grub/grub.cfg GRUBCFG

Unmount and clean up

umount ${MOUNTDIR} losetup -d ${LOOPDEV}

У меня в голове логика: фиг с ним mkimage, я пользую install и mkconfig.

Другими словами, mkimage это только если ручками. Для повседневного должно работать mkconfig, но оно не работает. Что именно и почему… вообще как оно должно отработать!? я не понимаю. Написал на лор.

avg_user ()
Ответ на: комментарий от avg_user

-> типа всё необходимое для decrypt включается. Остаётся вопрос про crypt loop device

https://github.com/gentoo/genkernel/blob/369cfa98f72675a285ec98439e9054ab57b234c9/gen_configkernel.sh#L532

-> в genkernel uuid хотелось бы, но можно и /dev/disk/by-id-uuid

https://github.com/gentoo/genkernel/blob/369cfa98f72675a285ec98439e9054ab57b234c9/defaults/initrd.scripts#L2292

-> А вот это приятный бонус

https://github.com/gentoo/genkernel/blob/369cfa98f72675a285ec98439e9054ab57b234c9/defaults/initrd.scripts#L2306

-> Возможное решение

https://github.com/gentoo/genkernel/blob/369cfa98f72675a285ec98439e9054ab57b234c9/ChangeLog.old#L169

А именно: https://bugs.gentoo.org/419965

avg_user ()

Вобщем какая-то каша из непонятных инструкций. Предлагаю сделать по-простому: забэкапить данные, нормально за шифровать последний раздел с помощью стандартных нормальных команд.

mxfm ()
Ответ на: комментарий от avg_user

Я к тому, что если с каждым протирать вопрос ни к чему не приведёт: мне хочется услышать чьто tricks, а не «как это так работает?»

Дублтирую решаемую задачу. есть штатные инструменты в генте. Есть стенд с виртуалкой, есть офиц мануал… Задача в переносе группы томов с партиции в file-image,потом шифровать саму партицию. и вернуть в эту, уже, шифрованную партицию группу томов. Это всё на запущенной системе. и хочется потом сделать уверенный ребут и получить рабочую систему. а она не получается.

Бут в группе томов. схему разметки накопителя уже раза три если не четыре написал

avg_user ()

Судя по ошибке Grub не может найти часть своей установки, которая была ранее на lvm. Нужно заново установить Grub после переноса данных на тот loop. Причём это может быть какое то временное место, до тех пор пока не будет установлена целевая разметка основного диска, куда можно снова установить Grub.

Upd. Grub rescue> означает, что efi часть загружается, но раздел с модулями груб не доступен.

mxfm ()
Последнее исправление: mxfm (всего исправлений: 1)
Ответ на: комментарий от mxfm

дк да!) я понимаю это.

В общем убежал работать. там в баг трекере есть примеры рабочих настроек, в очередной раз по подбрасываю. мб что и выйдет. просто это всё так штучно и не быстро. Спасибо за ответы

avg_user ()

Используемые инструменты:

genkernel, grub-mkconfig

Судя по ошибке «grub rescue> not found lvmid/blah-blah» в список инструментов нужно включить grub-install. Mkconfig собственно создаёт конфиг, а не новую установку. Как я понял из описания схемы разметки при переносе данных на резервный носитель перемещается папка с grub, поэтому при загрузке эта папка не находится. Тут ниже есть коммент:

дк да!) я понимаю это.

и что делается для устранения этой проблемы? Только grub-mkconfig?

PS: Кэп, я хочу быть уверен в старте с носителя в любой тачке: GPT, но уметь в MBR, EFI/UEFI

GPT почти равносильно EFI/UEFI, с него и нужно начать. Нужно сначала разобраться как установить один загрузчик (grub-install -target x64_86), потом станет понятнее как ставить второй.

Я понимаю, что есть insmod vs grub-mkimage; проблемы grub + luks1 vs luks2; uuid vs multipath vs label и много много всего.

Это имеет далекое отношение к возникшей проблеме (см. выше в чём судя по представленной инфе она заключается). Проблема luks1 vs 2 решается на этапе шифрования диска cryptsetup. Luks2 сейчас частично поддерживается, чтобы не иметь гемора можно указать опцию cryptsetup –type luks1 для 100% совместимости с grub.

genkernel –luks сделано в кофигах. devices нужен crypto target?

Это всё хорошо, только это нужно для правильного initramfs, а загрузка до него не доходит.

1 это bios_grub для самого grub (емнип, он туда модули складывает)

Нет. bios_grub - это должен быть мини-раздел на 1 MiB, куда grub складывает загрузочный код для загрузки в режиме НЕ uefi. Наличие такого раздела - обязательная часть для установки вторичного grub (grub-install –target i386-pc), который запускается в старом (не UEFI режиме). Короче говоря, это нужно для загрузки «с MBR». Модули складываются не туда, а по умолчанию в /boot/grub/x64-86 и /boot/grub/i386-pc (смотря какой grub устанавливается).

Основной момент который сформулировать гуглу не могу: Вот в случае, когда отдельный boot, то можно распотрошить initramfs и найти бинарники, а grub то как чекнуть что он вообще распарсил что от него хотят? Варианты с grub.cfg и crypto_disk_enable не особо канает (это как понимаю для grub_image и добавить модули к core image)

Эммм.. может ты путаешь grub и initramfs? Grub работает так: UEFI прошивка (по-старому BIOS) загружает efi-файл grub (условно, первый этап загрузки в новой схеме), который находится как правило в /boot/efi/, затем efi-загрузчик ищет основную папку grub, где находятся модули в /boot/grub/{x86_64|i386-pc}. Если таковая папка находится на зашифрованном lvm разделе, то в efi файл grub внедряются модули для работы с ними (модули шифрования, модуль lvm и т.п). Далее с помощью модулей или без них загружается vmlinuz и initramfs.

Распотрошить initramfs можно - это почти всегда простой сжатый архив, но это нужно для решения проблем с ним, а не с grub.

Частично grub чекнуть можно добавив опцию -v в команду grub-install - будем показана дополнительная отладочная информация. Она помогает понять в чём заключается ошибка, если скрипт завершается с ошибкой. Впрочем, если будет ошибка установки grub, сообщение об ошибке всё равно появится. Собственно, нужно ориентироваться на выхлоп grub-install - если ошибки нет, то система должна грузиться (по крайней мере разработчики в рассылке grub утверждают именно так).

С начала было подозрение про useflags, конфиги

Когда я пару лет назад устанавливал gentoo, обнаружил, что нужен флаг device-mapper. Судя по этому (https://gitweb.gentoo.org/repo/gentoo.git/tree/sys-boot/grub/grub-2.06-r1.ebuild#n117) этот флаг точно нужен для lvm2.

Другими словами, mkimage это только если ручками. Для повседневного должно работать mkconfig

Я всегда работал с grub-install. Насколько я знаю, grub-mkimage собирает только основное ядро, а не полноценную установку. Эта команда нужна, чтобы точечно настроить компоненты ядра grub - например, добавить модули, которые grub-install считает не нужными (а почему так происходит? тогда это баг надо писать разработчикам). Короче говоря, надо попробовать работать с grub-install.

mxfm ()
Ответ на: комментарий от mxfm

Вроде вчитался.

Про последовательность загрузки осознаю.

В общем: про разницу grub-rescue> insmod cryptomodule -u и «modprobe» в курсе). Понимаю разницу между отдельным boot и шифрованным boot.

Про bois_grub ок. В свое время вывел рабочую схему и она меня устраивала, - просто сейчас хотел ее усложнить с шифрованием (как в принципе уже на запущенной системе или при загрузке mount это и так пользуюсь, - просто когда их пачки начинаешь задумываться).

Про режим отладки услышал.

Хорошо, - на деле постараюсь выкроить время позаниматься этим вопросом. Буду пробовать ту ссылку что из баг трекера (на сколько понимаю там схема с отдельным boot по офиц мануалу генты).

В целом, на гитхабе если в исходники genkernel пошукать, то видно что нужно доставить какие-то штуки (, например раньше в комментах genkernel.conf было явно сказано, ставь cryptosetup для работы luks, а сейчас то ли мэнтейнер поменялся то ли что…)

Про mkimage vs mkconfig, - я хотел изначально попробывать решить в корне проблему: нашпиговать grub модулями. Формально некий аналог initramfs)))))

Спасибо за подсказки, будем пробовать.

Вопрос: как можно получить список insmod, кроме как пытаться прописывать в конфигах grub? ну типа, как с initramfs. Вопрос пишу потому, что оно в бинарник собирает и с ходе не нашёл готового ответа: интернет завален рецептами «сделал так и оно сработало, - больше я не заморачивался» (это история про CRYPTO_DISK_ENABLE и CRYPTO_ENABLE_DISK, - в вики генты сказано про это, если кто ищёт который именно работает)

avg_user ()
Ответ на: комментарий от mxfm

Note: At the moment (2020-06-23) I see no option to embed the locale before decrypting.

Емнип, embed its use flag from using mkimage

https://wiki.gentoo.org/wiki/Security_Handbook/Full#Encrypted_.2Fboot_partition

LUKS2

GRUB 2.06 has limited support for LUKS2. See GRUB bug #55093.

Argon2id (cryptsetup default) and Argon2i PBKDFs are not supported, only PBKDF2 is.
grub-install does not support creating a core image that could be used for unlocking LUKS2. See the comments below or on grub-gitAUR for a workaround.

Use grub-install as described in the #Installation section. However, the generated EFI binary does not support LUKS2 and needs to be replaced.

https://wiki.archlinux.org/title/GRUB#Encrypted_/boot

Заочно резюмируя,

https://wiki.gentoo.org/wiki/Security_Handbook/Full#Encrypted_.2Fboot_partition and https://wiki.gentoo.org/wiki/Dm-crypt

and Luke! use them:

https://askubuntu.com/q/729673

Задолбался за день, думаю утром попробую. Заготовку-то сделал, - надо вертать в шифрованную партицию и прифигачить загрузчик.

ЗЫ: надеюсь это поможет ищущим.

ЗЗЫ: алсо, не проверил еще

avg_user ()
Ответ на: комментарий от avg_user

добится штатного insmod удалось через mkconfig, единственное поторопился. Наверное.

Ощущение, что зря я grub-install -v не сделал.

Тол и useflag embed не хватает, то ли UUID vs /path/to/root

Пытаемся дальше. Позже отпишусь

avg_user ()
Ответ на: комментарий от avg_user

–luks Includes support for Linux Unified Key Setup or LUKS. This will allow to use a device encrypted by LUKS which contains the root filesystem. On the bootloader, set that encrypted device as the value of crypt_root, and root shall be the unencrypted device LUKS creates ( i.e /dev/mapper/root will be path to mount, and proper boot parameters line will look, like this: GRUB_CMDLINE_LINUX=«… crypt_root=UUID=<crypto_LUKS uuid> root=/dev/mapper/root …»). –iscsi

root=<…> Specifies the device node of the root filesystem to mount. I.e. root=/dev/sda3, root=UUID=a1e5968c-bd1b-41ee-bf08-2d0ed376fa83.

crypt_root=<…> This specifies the device encrypted by LUKS, which contains the root filesystem to mount. Supports same syntax like root kernel command-line parameter from above. Note Will require that at least initramfs was built with –luks option set.

https://wiki.gentoo.org/wiki/Genkernel

avg_user ()
Ответ на: комментарий от avg_user

За параметры ядра надо браться после того как решена проблема с Grub. Сообщения о ненайденном пути или uuid - это похоже ошибки на этапе работы Grub.

mxfm ()
Ответ на: комментарий от mxfm

root real_root crypto_root Это пишется в параметры для сборки grub.cfg.

Сижу… по тихоньку читаю.

технологию загрузки понимаю) Спасибо

avg_user ()
Ответ на: комментарий от avg_user

Это не «параметры для сборки Grub.cfg», а параметры загрузки ядра, до которого дело не доходит из-за нерабочего Grub.

mxfm ()
Ответ на: комментарий от mxfm

Тэкс, что бы не забыть:

Картина такова

  1. https://www.funtoo.org/Encrypted_Root вариации с root/real_root/crypt_root бесполезны в случае if grub uncrypt boot partition;

  2. grub.cfg упорно формирует конфиг с lvmid, - если опустить подробности в корне импорты есть, а по скрипту ощущение что он не прописан и нужно экспеременировать;

3.1 https://serveradmin.ru/booting-from-hard-disk-error-entering-rescue-mode/

и 3.2 https://wiki.archlinux.org/title/GRUB#Encrypted_/boot

говорят о необходимости операции $ grub-mkimage -p /boot/grub -O x86_64-efi -c grub-pre.cfg -o /tmp/grubx64.efi luks2 part_gpt cryptodisk gcry_rijndael pbkdf2 gcry_sha256 ext2

Итого:

  1. готовим по классической boot + luks
  2. готовим … >>> lvm >>> luks, ибо скрипты формруемые конфигом не проспособлены для cryptmount и прочего (импорты прописываются, но толку от них без mkimage и => grub_rescue только по дефолту)$

PS: зы пока писал, неожиданно, LVM -> 83 а у cryptomount такого нема. По сему, вполне логично luks over LVM

avg_user ()
Ответ на: комментарий от avg_user

grub.cfg упорно формирует конфиг с lvmid, - если опустить подробности в корне импорты есть, а по скрипту ощущение что он не прописан и нужно экспеременировать;

Я пару лет назад написал свой grub.cfg и с тех пор не имел проблем. Там всего пара строчек кода, не понимаю зачем надеяться на какие-то утилиты, которые генерят нерабочий cfg файл …

говорят о необходимости операции $ grub-mkimage -p /boot/grub -O x86_64-efi -c grub-pre.cfg -o /tmp/grubx64.efi luks2 part_gpt cryptodisk gcry_rijndael pbkdf2 gcry_sha256 ext2

Я всегда использовал grub-install и его было достаточно. Так и не понял, зачем этот mkimage нужен в данной ситуации.

PS: зы пока писал, неожиданно, LVM -> 83 а у cryptomount такого нема. По сему, вполне логично luks over LVM

83 - это что? тип раздела в gparted? Почему выбор ограничивается LUKS over LVM, а не наоборот? Вообще-то, насколько я знаю из чтения большого количества тем разных форумов, как правило используется LVM over LUKS. Вот материал от арчевики (https://wiki.archlinux.org/title/Dm-crypt/Encrypting_an_entire_system#LVM_on_LUKS)

mxfm ()
Ответ на: комментарий от mxfm

Для себя можно, конечно и ручками, - я пологаюсь не на «а можно еще так», а «потому что так было нужно».

grub0mkimage потому как скрипты заточены под один функционал и по какой-то причине в более глубоуком стеке загрузке нужно перефигчить coreimage с своим блекжеком.

8e, да. простите опечатался, ну типа: cryptsetup для контейнеров шифрования, LVM для логических разделов, а grub для загрузки. Типа все эти проблемы могут быть связаны в «не стыковке точек соприкосновения» ввиду того .что конте1нер шифрования это контейнер шифрования всё что его ниже, контейнеру не важно) Как-то так. Простите, - тупо хочу идти отсыпаться

avg_user ()
Ответ на: комментарий от avg_user

Provides a script (buildkernel) to build a kernel suitable for booting from a USB key in UEFI mode, together with an integral initramfs. Automatically sets the necessary kernel configuration parameters, including the command line, and signs the resulting kernel if possible. Has a interactive and non-interactive (batch) mode. (Will be used later in the tutorial.) On installation, attempts to automatically configure the /etc/buildkernel.conf settings file (to set the two variables EFIPARTUUID and CRYPTPARTUUID, which must be assigned before buildkernel is run). Manpages for the script and the configuration file are provided. The underlying source is available on GitHub.

https://github.com/sakaki-/buildkernel

А так, на странице разработчика: 31 Oct 2020: sadly, due to legal obligations arising from a recent change in my ‘real world’ job, I must announce I am standing down as maintainer of this project with immediate effect. For the meantime, I will leave the repo up (for historical interest, and it may be of use to others); however, I plan no further updates, nor will I be accepting / actioning further pull requests or bug reports from this point. Email requests for support will also have to be politely declined, so, please treat this as an effective EOL notice.

For further details, please see my post here.

With sincere apologies, sakaki ><

avg_user ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей