Как в Ubuntu 24.04.4 добавить поддержку опции 'tpm-with-pin' в cryptsetup?

Здравствуйте. Я пытаюсь настроить LUKS-шифрование корневого раздела с использованием TPM + PIN. В /etc/crypttab добавил опцию tpm2-with-pin=yes и пересобрал initramfs, но при загрузке cryptsetup выдаёт предупреждение, что опция tpm2-with-pin неизвестна. Ранее TPM вообще не работал (даже без PIN), однако после установки патча <a href="https://github.com/wmcelderry/systemd_with_tpm2/tree/main" rel="nofollow">https://github.com/wmcelderry/systemd_with_tpm2/tr...</a> TPM стал работать без PIN. Мне обязательно нужно включить работу через TPM+PIN. Пожалуйста, не предлагайте использовать dracut — с ним у меня не работает гибернация.
  • 19 апреля 2026 г. 13:01
Ответы на вопрос 1
Коротко — причина в том, что предупреждение идёт от бинарника 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 и перезагрузиться.
Похожие вопросы