/etc/crypttab не обновляется в initramfs

Вопрос или проблема

У меня новая установка Ubuntu 22.04 с полной шифрацией диска (LUKS) и ZFS, выбранная из опций установщика Ubuntu.

Мне нужно внести некоторые изменения в /etc/crypttab, чтобы разблокировка моих дисков происходила автоматически (роскошная автоматическая разблокировка USB), но изменения, которые я вношу в /etc/crypttab, не сохраняются в initramfs.

Что я делаю:

  • Редактирую /etc/crypttab
  • Запускаю update-initramfs -u
  • Перезагружаю машину в систему, которая запрашивает пароль LUKS (initramfs)
  • Проверяю содержимое /etc/, но crypttab отсутствует.

Я неправильно понимаю, как это работает? Мне нужно сохранить некоторую версию crypttab в загрузчике, но это не срабатывает.

Есть ли подсказки о том, что я делаю неправильно?

Я здесь, потому что столкнулся с той же проблемой, нашел этот вопрос через Google и хочу добавить некоторую информацию. Я пытаюсь автоматически разблокировать диск LUKS, не вводя пароль.

Сначала я отредактировал /etc/crypttab и изменил его запись на следующую:

sda3_crypt UUID=2d661ff8-d6a8-49c9-ae96-4d6e234bffe2 /dev/zero luks,discard,keyfile-size=32      

Затем я добавил новый ключ, используя следующую команду:

sudo cryptsetup luksAddKey --new-keyfile-size 32 /dev/sda3 /dev/zero

Наконец, я запустил update-initramfs, который выдал следующий вывод:

$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.0.0-2-amd64
cryptsetup: WARNING: sda3_crypt: key file /dev/zero has insecure ownership, see 
    /usr/share/doc/cryptsetup/README.Debian.gz.
cryptsetup: WARNING: Skipping root target sda3_crypt: uses a key file

Это уже показалось подозрительным, но я все равно перезагрузил. К сожалению, эти действия сделали систему не загружаемой:

Gave up waiting for suspend/resume device
Gave up waiting for root file system device: Common problems:
 - Boot args (cat /proc/cmdline)
   - Check rootdelay= (did the system wait long enough?)
 - Missing modules (cat /proc/modules; ls /dev)
ALERT! /dev/mapper/legend--vg-root does not exist. Dropping to a shell!


BusyBox v1.35.0 (Debian 1: 1.135.0-2) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs) cat /etc/crypttab
cat: can't open '/etc/crypttab': No such file or directory

Я смог успешно загрузить систему снова, введя следующие команды в приглашении BusyBox:

cryptsetup luksOpen --key-file /dev/zero --keyfile-size 32 /dev/sda3 sda3_crypt
exit

Тем не менее, оригинальный вопрос остается: почему /etc/crypttab недоступен в initramfs?

Обновление

После дополнительного исследования я наконец могу ответить на исходный вопрос: /etc/crypttab отсутствует в initramfs, потому что скрипт разблокировки по умолчанию не использует это расположение; вместо этого он использует /cryptroot/crypttab.

Чтобы сделать /etc/crypttab доступным как /cryptroot/crypttab в initramfs, создайте следующий скрипт в каталоге /etc/initramfs-tools/hooks и сделайте его исполняемым:

#!/bin/sh
cp /etc/crypttab "${DESTDIR}/cryptroot/crypttab"
exit 0

Наконец, стоит отметить, что использование автоматической разблокировки LUKS-устройств с пустыми паролями подрывает цель шифрования. Это так же небезопасно, как и отсутствие шифрования вообще.

Вместо того чтобы запускать sudo update-initramfs -u, запустите sudo update-initramfs -c -k all

Я столкнулся с этой проблемой после добавления нового диска nvme и его шифрования.

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

Мой зашифрованный раздел был на sda3, но поскольку я скопировал данные из предыдущей конфигурации с другой схемой разделов, мой /etc/crypttab выглядел так:

sda6_crypt UUID={uuid] none luks,discard

Похоже, что когда генерируется образ initramfs (как при установке нового ядра, так и при других обновлениях), несоответствие между именами в /etc/crypttab и фактическим разделом вызывает ошибку (которую, естественно, я не увидел), так что файл в initramfs (расположенный по адресу /cryptroot/crypttab) оказался пустым (0 байт). Эта нехватка файла и вызывает зависание процесса загрузки. Исправив /etc/crypttab на:

sda3_crypt UUID={uuid} none luks,discard

проблема решена. Конечно, если ваш initramfs уже поврежден, его нужно регенерировать:

sudo update-initramfs -u

Но будущие обновления должны пройти нормально.

Для меня (поскольку я уже сталкивался с проблемами) я сделал двойную проверку. (Это была Ubuntu 20.04, но ответ актуален и для 22.04)

После update-initramfs -c -k all я создал mkdir /tmp/x; cd /tmp/x; unmkinitramfs -v /boot/initrd.img-$(uname -r) . и проверил /tmp/x/main/cryptroot/crypttab. Он был пустым.

Решение для меня заключалось в редактировании /etc/cryptsetup-initramfs/conf-hook и создании шаблона ключевого файла. Моя окончательная конфигурация была:
KEYFILE_PATTERN=/etc/cryptsetup-keys.d/*.key в conf-hook и myroot UUID="8481c1f8-91d4-469d-9132-12d3948f503a" /etc/cryptsetup-keys.d/root.key luks,discard в /etc/crypttab. Ключ, без окончания новой строки, конечно, находился в /etc/cryptsetuyp-keys.d/root.key.

После этого, разархивировав initramfs, я увидел main/cryptroot/crypttab, который выглядел нормальным, и ключевой файл (с новым именем) был скопирован в main/cryptroot/keyfiles/myroot.key (“myroot” соответствует тому, что было в crypttab initramfs).

На моей системе (Ubuntu 22.04) все прошло, как ожидалось, когда я запустил следующие команды после редактирования /etc/crypttab:

sudo systemctl daemon-reload
sudo systemctl restart cryptsetup.target

Т.е. после добавления строки в crypttab я теперь вижу:

  • новое расшифрованное устройство в /dev/mapper/
  • изменения также сохраняются после перезагрузки

apt-get install cryptsetup-initramfs

По каким-то причинам на моей установке /usr/sbin/cryptsetup был присутствующим, но dpkg -S показал, что он не принадлежит никакому пакету (возможно, его установил установщик Live?). Но без cryptsetup-initramfs, mkinitramfs и update-initramfs не установят cryptsetup в initrd.

Спасибо всем за очень полезные ответы. Я недавно обновился до Ubuntu 24.04 и сломал свою загрузку. После дня и половины попыток исправить это, я решил создать резервную копию и перейти на Mint 22. Я столкнулся с той же проблемой, повторно используя свою схему разделов из Ubuntu до 24.x.

После чтения этого поста и нескольких попыток я обнаружил, что добавление опции ‘initramfs’ в файл crypttab для моего загрузочного раздела позволило update-initramsfs включить записи, необходимые для правильной загрузки с запросом на разблокировку дисков.

Это сработало для Linux Mint 22. Завтра я снова попытаюсь для Ubuntu 24.04 на моем резервном диске, чтобы увидеть, сработает ли это и там. Я верю, что должно, так как Mint основан на Ubuntu.

Ответ или решение

Почему /etc/crypttab не обновляется в initramfs?

При работе с системой, использующей полное шифрование дисков на базе LUKS и файловую систему ZFS, пользователи иногда сталкиваются с проблемой, когда изменения, внесенные в файл /etc/crypttab, не отражаются в образе initramfs после выполнения команды update-initramfs -u. Это может вызвать сложности при автоматическом разблокировке зашифрованных дисков при загрузке системы.

Что такое /etc/crypttab и как он используется

Файл /etc/crypttab содержит информацию о зашифрованных потока данных (разделах), включая UUID зашифрованного устройства и путь к ключевым файлам. Этот файл имеет жизненно важное значение, когда ваша система загружается и требует разблокировку зашифрованного диска.

При генерации initramfs система не просто копирует файлы с основного раздела, а использует скрипты и конфигурации для настройки и подготовки образа файловой системы для загрузчика. Важно отметить, что в некоторых реализациях механизм разблокировки использует файл /cryptroot/crypttab в initramfs, а не ваш стандартный /etc/crypttab.

Почему изменения не отображаются

Существует несколько возможных причин, по которым изменения не сохраняются:

  1. Неправильный синтаксис в /etc/crypttab: Убедитесь, что записи в этом файле имеют правильный формат. Неверно указанные UUID или опции могут мешать корректной генерации initramfs. Например, когда вы заменили UUID на неверный в предыдущем примере, это могло привести к созданию пустого /cryptroot/crypttab.

  2. Необходимость дополнительных пакетов: Убедитесь, что пакет cryptsetup-initramfs установлен. Без него команды и скрипты, необходимые для конфигурации обновления initramfs, могут не работать должным образом.

  3. Не обновлена конфигурация: После внесения изменений в /etc/crypttab, стоит выполнять не только update-initramfs -u, но и systemctl daemon-reload, чтобы убедиться, что изменения применяются к системным службам.

  4. Использование незащищенных ключевых файлов: Проблемы с безопасностью ключевого файла могут привести к игнорированию этой настройки. Например, использование /dev/zero как ключа может вызвать предупреждения при генерации initramfs.

Решения проблемы

  1. Создание хука для копирования /etc/crypttab: Если требуется сохранить /etc/crypttab под другим именем, создайте хук в директории /etc/initramfs-tools/hooks:

    #!/bin/sh
    cp /etc/crypttab "${DESTDIR}/cryptroot/crypttab"
    exit 0

    Не забудьте сделать скрипт исполняемым с помощью команды chmod +x.

  2. Корректировка конфигурации: Обратите внимание на формат записей в вашем /etc/crypttab. Например:

    sda3_crypt UUID=2d661ff8-d6a8-49c9-ae96-4d6e234bffe2 none luks,discard
  3. Проверка initramfs: После обновления initramfs проверьте, что необходимые файлы присутствуют в образе. Для этого можно использовать:

    mkdir /tmp/x; cd /tmp/x; unmkinitramfs -v /boot/initrd.img-$(uname -r) .

    Найдите cryptroot/crypttab в созданной директории для проверки его правильности.

  4. Выявление ошибок: Если система не загружается, переходите в режим восстановлении и вручную разблокируйте нужные устройства, используя cryptsetup luksOpen, как было сделано в вашем примере.

Заключение

Если вы столкнулись с проблемами в процессе обновления initramfs или с доступом к зашифрованным разделам, важно внимательно следить за изменениями в конфигурации, а также за тем, что указано в /etc/crypttab. Использование несекретных ключевых файлов и правильный синтаксис записи – ключевые факторы к успешной разблокировке. Рекомендуется также делать резервные копии и не пренебрегать безопасностью при работе с шифрованием.

Оцените материал
Добавить комментарий

Капча загружается...