Коротко — причина в том, что предупреждение идёт от бинарника cryptsetup, который запускается из initramfs на ранней стадии загрузки. Опция tpm2-with-pin у вас уже «обработалась» в systemd (прошивка/патч для systemd привёл к тому, что TPM работает без PIN), но сам cryptsetup, который присутствует в initramfs, эту опцию не распознаёт. Поэтому нужно сделать так, чтобы в раннем initramfs запускался cryptsetup/код, умеющий работать с TPM+PIN, либо заменить логику разблокировки на ту, которую вы хотите (но без dracut вы в основном двигаетесь в сторону обновления/замены cryptsetup в initramfs).
Что сделать — план действий с командами и объяснениями.
1) Диагностика — какой cryptsetup запускается в initramfs
- Посмотреть версию системного cryptsetup:
sudo cryptsetup --version
- Посмотреть, какая версия (и вообще — есть ли) cryptsetup внутри initramfs:
mkdir -p /tmp/initrd && cd /tmp/initrd
zcat /boot/initrd.img-$(uname -r) | cpio -idmv
./sbin/cryptsetup --version
Если внутри initramfs стоит более старая/непатченная версия, то именно она и выдаёт «unknown option».
2) Два рабочих варианта решения
Вариант A — поставить в initramfs версию cryptsetup, которая поддерживает tpm2-with-pin
- Скомпилировать/установить пакет cryptsetup с поддержкой TPM2 (или взять готовый .deb, если есть). Общая последовательность:
sudo apt update
sudo apt build-dep cryptsetup
apt source cryptsetup
# при необходимости примените ваши патчи/включите опции TPM2 в исходниках
cd cryptsetup-<версия>
dpkg-buildpackage -b -us -uc -j$(nproc)
sudo dpkg -i ../cryptsetup_*.deb
# либо установить скомпилированный бинарник в /usr/local и затем включить его в initramfs (см. ниже)
- Убедиться, что обновлённый бинарник попал в initramfs. Если вы не хотите/не можете заменить системный пакет, можно создать hook для initramfs-tools, который будет включать ваш скомпилированный /usr/local/sbin/cryptsetup в initramfs:
Создать файл /etc/initramfs-tools/hooks/cryptsetup-tpm с правами исполнение и содержимым (пример):
#!/bin/sh
PREREQ=""
prereqs() { echo "$PREREQ"; }
case $1 in
prereqs) prereqs; exit 0;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/local/sbin/cryptsetup /sbin/cryptsetup
# copy_exec автоматически захватит нужные библиотеки
sudo chmod +x /etc/initramfs-tools/hooks/cryptsetup-tpm
sudo update-initramfs -u -k all
После этого перезагрузитесь и проверьте, что в initramfs лежит нужный бинарник (повторите пункт 1).
Вариант B — сделать так, чтобы именно systemd (patched) разблокировал LUKS в initramfs
- Это сработает только если у вас есть реализация разблокировки через systemd на стадии initramfs (то есть соответствующие systemd бинарники/units/скрипты должны быть включены в initramfs). Обычно проще всё же заменить/обновить cryptsetup, как в варианте A. Если вы хотите идти по этому пути, вам надо:
- убедиться, что патч для systemd был применён и systemd-бинарники, реализующие tpm2-with-pin, попадают в initramfs;
- написать hook, который включает эти бинарники/units в initramfs (аналогично показанному выше);
Этот путь менее тривиален, потому что systemd в initramfs используется не всегда на Ubuntu + initramfs-tools по умолчанию.
3) Нюансы и полезные проверки
- Правильность имени опции: вы писали и tpm-with-pin, и tpm2-with-pin — убедитесь, что используете именно ту опцию, которую понимает ваша реализация (systemd или cryptsetup). Посмотрите документацию/исходники той реализации, которую вы патчили.
- После изменения initramfs всегда делайте sudo update-initramfs -u -k all и перезагрузку.
- Если при включении нового cryptsetup появляются ошибки о недостающих библиотеках — copy_exec в hook автоматически включает нужные .so. Если вы копируете вручную, перечислите зависимости через ldd и добавьте их.
- Если захотите, я могу помочь: пришлите выводы:
* sudo cryptsetup --version
* вывод ./sbin/cryptsetup --version после распаковки initrd (команды из диагностики)
* строку из /etc/crypttab, которую вы используете
Тогда я подскажу конкретно, что нужно собрать или какие файлы включить в initramfs.
Резюме: проблема не в /etc/crypttab — она в бинарнике cryptsetup/механизме разблокировки, который находится в initramfs и не знает опцию tpm2-with-pin. Решение — поместить в initramfs cryptsetup (или systemd-раскладку) с поддержкой TPM+PIN (либо собрать пакет и установить, либо добавить кастомный hook, копирующий нужный бинарник в initramfs), затем обновить initramfs и перезагрузиться.