При загрузке системы с rootfs на шифрованном разделе пароль для раздела запрашивается 2 раза - в initrd и systemd-cryptsetup. При этом выдаются сообщения об ошибках: systemctl status systemd-cryptsetup@luks\\x2dad3c41f2\\x2db10b\\x2d7747\\x2d9b85\\x2d75ca94ff948c.service × systemd-cryptsetup@luks\x2dad3c41f2\x2db10b\x2d7747\x2d9b85\x2d75ca94ff948c.service - Cryptography Setup for luks-ad3c41f2-b10b-7747-9b85-75ca94ff948c Loaded: loaded (/etc/crypttab; generated) Active: failed (Result: exit-code) since Thu 2022-06-23 18:06:10 +04; 2min 46s ago Docs: man:crypttab(5) man:systemd-cryptsetup-generator(8) man:systemd-cryptsetup@.service(8) Process: 2566 ExecStart=/lib/systemd/systemd-cryptsetup attach luks-ad3c41f2-b10b-7747-9b85-75ca94ff948c /dev/disk/by-uuid/ad3c41f2-b10b-7747-9b85-75ca94ff948c none luks (code=exited, status=1/FAILURE) Main PID: 2566 (code=exited, status=1/FAILURE) CPU: 2.660s июн 23 18:06:03 host-232 systemd[1]: Starting Cryptography Setup for luks-ad3c41f2-b10b-7747-9b85-75ca94ff948c... июн 23 18:06:07 host-232 systemd-cryptsetup[2566]: Set cipher aes, mode cbc-essiv:sha256, key size 256 bits for device /dev/disk/by-uuid/ad3c41f2-b10b-7747-9b85-75ca94ff948c. июн 23 18:06:10 host-232 systemd-cryptsetup[2566]: Cannot use device /dev/disk/by-uuid/ad3c41f2-b10b-7747-9b85-75ca94ff948c which is in use (already mapped or mounted). июн 23 18:06:10 host-232 systemd-cryptsetup[2566]: Failed to activate with specified passphrase: Device or resource busy июн 23 18:06:10 host-232 systemd[1]: systemd-cryptsetup@luks\x2dad3c41f2\x2db10b\x2d7747\x2d9b85\x2d75ca94ff948c.service: Main process exited, code=exited, status=1/FAILURE июн 23 18:06:10 host-232 systemd[1]: systemd-cryptsetup@luks\x2dad3c41f2\x2db10b\x2d7747\x2d9b85\x2d75ca94ff948c.service: Failed with result 'exit-code'. июн 23 18:06:10 host-232 systemd[1]: Failed to start Cryptography Setup for luks-ad3c41f2-b10b-7747-9b85-75ca94ff948c. июн 23 18:06:10 host-232 systemd[1]: systemd-cryptsetup@luks\x2dad3c41f2\x2db10b\x2d7747\x2d9b85\x2d75ca94ff948c.service: Consumed 2.660s CPU time. Шифрованный раздел уже расшифрован и нормально работает: cryptsetup status sda1-luks /dev/mapper/sda1-luks is active and is in use. type: LUKS1 cipher: aes-cbc-essiv:sha256 keysize: 256 bits key location: dm-crypt device: /dev/sda1 sector size: 512 offset: 4096 sectors size: 20957184 sectors mode: read/write Причина проблемы в том, что systemd-cryptsetup берёт имя раздела из /etc/crypttab, а /lib/uevent/handlers/085-luks формирует это же имя самостоятельно: https://git.altlinux.org/gears/m/make-initrd.git?p=make-initrd.git;a=blob;f=make-initrd/features/luks/data/lib/uevent/handlers/085-luks;h=31497678ad2b9b7b707e5c44815d6cc471da4191;hb=0d6ef409151970d3daecb858ef6c762971d82ee0#l191 Для обхода проблемы можно добавить файл /etc/crypttab в initrd и прочитать имя раздела из него.
make-initrd не использует /etc/crypttab. Его нужно его этому учить.
ОК. Я сделал реализацию. Правда она неполная. Нет поддержки PKCS11, FIDO2, TPM2 поскольку их поддержки нет в cryptsetup. Их поддержка реализована только в systemd.
(Ответ для Alexey Gladkov на комментарий #2) > ОК. Я сделал реализацию. Правда она неполная. Нет поддержки PKCS11, FIDO2, > TPM2 поскольку их поддержки нет в cryptsetup. Их поддержка реализована > только в systemd. Спасибо! Где можно взять новый make-initrd, чтобы потестировать эту реализацию?
make-initrd-2.27.0-alt1 -> sisyphus: Wed Jul 06 2022 Alexey Gladkov <legion@altlinux.ru> 2.27.0-alt1 - New version (2.27.0). - Feature luks: + Add crypttab support (ALT#43056). + Try to remember the uuid of the luks device and automatically add it to crypttab. + Use luks.keys if the file is already in the initramfs (ALT#42987). - Feature kickstart: + Use /proc/devices to detect sd and virtblk block devices. - Feature locales: + Read system-wide locales. - Utilities: + initrd-ls: Fix infinite loop when unpacking zstd. + initrd-put: Add option to exclude files by pattern. + initrd-scanmod: module must satisfy all the rules from the ruleset. + mkinitrd-make-initrd: Fixed misprint, make-initrd can be found now. + make-initrd: Enforce absolute path in TMPDIR (ALT#42322). - Misc: + Check bzip2 library as the last chance for detection if there is no bzip2.pc.
Created attachment 11063 [details] Лог работы 085-luks версии 2.27.0-alt1
Протестировал make-initrd-2.27.0-alt1: Прописал добавление файлов: initrd.mk ... PUT_FILES += /etc/keys/luks.key PUT_FILES += /etc/luks.keys Создал /etc/keys/luks.key: dd if=/dev/random of=/etc/keys/luks.key iflag=fullblock bs=512c count=1 chmod go-r /etc/keys/luks.key cryptsetup luksAddKey $(awk 'BEGIN { FS="\t" } { print $2 }' /etc/crypttab) /etc/keys/luks.key Ввёл пароль. Создал /etc/luks.keys, содержащий: /etc/keys/luks.key make-initrd [00:00:15] Image is saved as /boot/initrd-5.15.52-std-def-alt1.img После перезагрузки пароль ввел 2 раза: в GRUB и systemd-cryptsetup При загрузке выдано: 085-luks: /dev/sda2: trying to find the keyfile in the '/etc/luks.keys'. 085-luks: Found keyfile '/etc/keys/luks.key' for 'sda2' encrypted partition. 085-luks: sda2-luks (upon /dev/sda2) activated successfully. systemd-cryptsetup выдаёт сообщения об ошибке: systemctl --failed UNIT LOAD ACTIVE SUB DESCRIPTION ● systemd-cryptsetup@luks\x2d0a2cd49b\x2d6e6f\x2dba4c\x2d8626\x2d101394557ac2.service loaded failed failed Cryptography Setup for luks-0a2cd49b-6e6f-ba4c-8626-101394557ac2 Добавил /etc/crypttab явно: initrd.mk ... PUT_FILES += /etc/crypttab Разобрал initrd-5.15.52-std-def-alt1.img, убедился, что /etc/crypttab в нём есть. systemd-cryptsetup выдаёт то же сообщения об ошибке. Проблема осталась. Получил лог работы 085-luks
Если в initrd не добавлять файл /etc/luks.keys, то проблема не проявляется. Но тогда приходится вводить пароль вручную при работе initrd.
Нужно использовать либо старый luks.keys, либо новый crypttab. Если хочется использовать crypttab, то руками его класть ненужно. Если этот конфиг уже есть в системе в /etc, то make-initrd сам его найдёт и добавит. Так сделано потому что в crypttab могут быть прописаны ключи, которые нужно добавить в образ.
Created attachment 11064 [details] Лог 085-luks при использовании только crypttab
Протестировал использование только /etc/crypttab: Удалил /etc/luks.keys Прописал /etc/keys/luks.key в /etc/crypttab cat crypttab luks-0a2cd49b-6e6f-ba4c-8626-101394557ac2 UUID=0a2cd49b-6e6f-ba4c-8626-101394557ac2 /etc/keys/luks.key luks Оставил в initrd.mk добавление только 1 файла: PUT_FILES += /etc/keys/luks.key make-initrd Выдано сообщение: 085-luks: luks keyfile does not exist: /etc/keys/luks.key Пришлось вводить пароль вручную. Разобрал initrd-5.15.52-std-def-alt1.img, убедился, что /etc/keys/luks.key в нём есть. systemd-cryptsetup не выдаёт сообщений об ошибках. Проявилась другая проблема: при чтении имени /etc/keys/luks.key из /etc/crypttab пароль не работает. Приложен лог 085-luks при использовании только crypttab
Да, это опечатка.
Попробуйте с вот этой версией: https://github.com/osboot/make-initrd/blob/master/features/luks/data/lib/uevent/handlers/085-luks
> Проявилась другая проблема: при чтении имени /etc/keys/luks.key из /etc/crypttab > пароль не работает. Поясните пожалуйста. Я не понимаю.
(Ответ для Alexey Gladkov на комментарий #13) > > Проявилась другая проблема: при чтении имени /etc/keys/luks.key из /etc/crypttab > > пароль не работает. > > Поясните пожалуйста. Я не понимаю. Если rootfs на шифрованном разделе, то в initrd хотелось бы сделать 2 действия: 1. Найти в initrd пароль от шифрованного раздела, чтобы не спрашивать этот пароль у пользователя, и расшифровать раздел. 2. Взять имя для шифрованного из /etc/crypttab, чтобы systemd-cryptsetup не спрашивал у пользователя пароль от раздела и не выдавал сообщения об ошибке при попытке расшифровать уже расшифрованный раздел. Наблюдались проблемы: Если 1 выполняется с использованием имени файла с паролем из /etc/luks.keys, то 2 не выполняется. (https://bugzilla.altlinux.org/show_bug.cgi?id=43056#c6). Если попытаться выполнить 1 с использованием имени файла с паролем из /etc/crypttab, то файл не удаётся найти, хотя он есть, и 1 не выполняется. Это я пытался сказать фразой: "при чтении имени /etc/keys/luks.key из /etc/crypttab пароль не работает."
> 2. Взять имя для шифрованного из /etc/crypttab ... Хотел написать: "Взять имя для шифрованного раздела из /etc/crypttab"
(Ответ для Alexey Gladkov на комментарий #12) > Попробуйте с вот этой версией: > > https://github.com/osboot/make-initrd/blob/master/features/luks/data/lib/ > uevent/handlers/085-luks Да, с этой версией успешно читает из /etc/crypttab и имя раздела и имя файла с паролем. Это то, что нужно. Спасибо! Соберите, пожалуйста, в Сизиф.
make-initrd-2.27.1-alt1 -> sisyphus: Fri Jul 08 2022 Alexey Gladkov <legion@altlinux.ru> 2.27.1-alt1 - New version (2.27.1). - Feature luks: + Fix typo and use keyfile if exists (ALT#43056). + Add more documentation.