Вопрос или проблема
Я использую dracut для создания initramfs, чтобы протестировать скрипт для создания ключа в TPM-чипе. Пока этот скрипт является просто тестовым, чтобы я мог увидеть, правильно ли я создал initramfs:
#!/usr/bin/env bash
#
read -p 'Этот файл будет выполнен для инициализации TPM'
exit 0
Я хочу включить этот скрипт в фазу загрузки перед монтированием. Я следовал ответу на вопрос «Как написать стартовый скрипт перед монтированием?» на этом форуме, изменив его по мере необходимости, но когда я перечисляю содержимое файла образа, мои скрипты там отсутствуют. Я также пробовал использовать опции dracut –include и –install, но либо получаю ошибку, либо, если нет, скрипты отсутствуют в initramfs. Я назвал свой файл tpm.img и разместил его в директории /boot. При загрузке компьютера я нажимаю ‘e’, чтобы изменить строку grub, и изменяю команду initrdefi, чтобы она указывала на мой tpm.img. Конечно, мой скрипт не запускается, потому что он не присутствует в initramfs. Я не уверен, что понимаю раздел “Внедрение пользовательских файлов” в руководстве dracut:
https://mirrors.edge.kernel.org/pub/linux/utils/boot/dracut/dracut.html
Мне не удалось найти примеры файлов конфигурации dracut или командных файлов dracut, которые показывают полный путь к модулю, который нужно включить. Пожалуйста, помогите мне понять, почему мой скрипт не включается в initramfs.
Спасибо! Джефф
У меня получилось с --include
. Предположим, вы разместили ваш пользовательский скрипт в /etc/dracut.conf.d/tpm.sh
, тогда вы можете сделать следующее:
sudo dracut --include /etc/dracut.conf.d/tpm.sh /usr/lib/dracut/hooks/pre-mount/tpm.sh tpm.img
Файл там:
$ sudo lsinitrd tpm.img | grep -F tpm.sh
Аргументы: --include '/etc/dracut.conf.d/tpm.sh' '/usr/lib/dracut/hooks/pre-mount/tpm.sh'
-rw-rw-r-- 1 root root 80 Apr 5 17:22 usr/lib/dracut/hooks/pre-mount/tpm.sh
К сожалению, насколько я знаю, нет эквивалентного файла конфигурации для параметра командной строки --include
. Существует install_items
, который является эквивалентом для --install
. Эта опция принимает только один путь, так как путь в initramfs такой же, как и в основной файловой системе. Поэтому вам нужно поместить ваш скрипт в /usr/lib/dracut/hooks/pre-mount/tpm.sh
. Затем вы можете создать /etc/dracut.conf.d/tpm.conf
:
install_items+=" /usr/lib/dracut/hooks/pre-mount/tpm.sh "
Это приведет к тому, что все будущие автоматически создаваемые образы initramfs будут включать скрипт, например, при обновлении вашего ядра.
Еще один вариант — создание “модуля” в /usr/lib/dracut/modules.d
. Внутри этого каталога вы можете создать отдельный каталог 90tpm
и поместить ваш tpm.sh
внутрь. Вам также нужно добавить специальный скрипт под названием module-setup.sh
, функция install
которого будет вызываться dracut
во время сборки. Простой module-setup.sh
может выглядеть так:
#! /bin/bash
install () { inst_hook pre-mount 50 "$moddir/tpm.sh"; }
Затем вы можете вызывать dracut
без дополнительных аргументов или файлов конфигурации:
[~]$ ls -l /usr/lib/dracut/modules.d/90tpm
total 8
-rwxr-xr-x. 1 root root 70 Jun 4 01:57 module-setup.sh
-rwxr-xr-x. 1 root root 80 Jun 4 01:46 tpm.sh
[~]$ sudo dracut test.img
[~]$ sudo lsinitrd test.img | grep tpm
tpm
-rwxr-xr-x 1 root root 80 Apr 5 17:22 usr/lib/dracut/hooks/pre-mount/50-tpm.sh
Ответ или решение
Чтобы включить пользовательский скрипт в initramfs, создаваемый с помощью Dracut, необходимо разобраться в работе этого инструмента и особенностях его настройки. Dracut является утилитой для генерации initramfs на операционных системах Linux. Initramfs представляется как временная файловая система, которая загружается в памяти при старте ядра Linux и выполняет необходимые операции для последующей загрузки основной файловой системы.
Теоретическая основа
Dracut работает на основе модульной архитектуры, где каждый модуль добавляет в initramfs определённые файлы и скрипты. Основной путь интеграции пользовательских скриптов в initramfs с Dracut — это добавление ваших скриптов в соответствующую часть процесса загрузки через конфигурационные файлы или создание пользовательского модуля.
Основные элементы конфигурации Dracut:
-
Конфигурационные файлы Dracut: Эти файлы, расположенные в директории
/etc/dracut.conf.d/
, позволяют задавать различные параметры для процесса создания initramfs, включая включение дополнительных файлов и скриптов. -
Модули Dracut: Модули находятся в директории
/usr/lib/dracut/modules.d/
и имеют возможность добавлять свои скрипты в initramfs. Создание кастомного модуля обеспечивает более гибкий и масштабируемый подход к настройке initramfs.
Пример
Рассмотрим ваш случай, когда необходимо поместить скрипт в фазу pre-mount. Вот как можно это сделать:
Подход с использованием --include
-
Подготовка скрипта: Ваш скрипт, который вы хотите включить, может находиться в
/etc/dracut.conf.d/tpm.sh
.#!/usr/bin/env bash read -p 'Этот файл выполнится для инициализации TPM' exit 0
-
Использование команды
dracut
: Вызовите команду Dracut, используя опцию--include
.sudo dracut --include /etc/dracut.conf.d/tpm.sh /usr/lib/dracut/hooks/pre-mount/tpm.sh tpm.img
Это действие скопирует ваш скрипт в директорию, откуда он сможет быть выполнен в фазе pre-mount.
Подход с использованием конфигурационного файла
-
Создание конфигурационного файла: Создайте новый файл конфигурации в
/etc/dracut.conf.d/tpm.conf
со следующей строкой:install_items+=" /usr/lib/dracut/hooks/pre-mount/tpm.sh "
-
Поместите скрипт в
/usr/lib/dracut/hooks/pre-mount/tpm.sh
, чтобы он автоматически включался в создаваемый initramfs.
Практическое применение
Создание модуля Dracut
Более структурированное и масштабируемое решение включает в себя создание модуля Dracut.
-
Создание директории для модуля: В директории
/usr/lib/dracut/modules.d/
создайте новый подкаталог, например,90tpm
. -
Скрипт
module-setup.sh
: Создайте файлmodule-setup.sh
, который сообщит Dracut, когда и как запускать ваш скрипт:#! /bin/bash install () { inst_hook pre-mount 50 "$moddir/tpm.sh" }
-
Разместите ваш скрипт
tpm.sh
в этой новой директории.
Этот подход позволяет включать скрипт в initramfs при вызове dracut
без дополнительных параметров.
Заключение
Выбор подхода зависит от ваших потребностей и предпочтений. Использование модуля предоставляет больше гибкости и структурированности, особенно если вы планируете дальнейшее развитие или интеграцию в более сложные процессы. Dracut является мощным инструментом, и его возможности позволяют настраивать процесс загрузки под специфические требования. Успешное включение скрипта в initramfs требует тщательного следования инструкциям и понимания того, как разные фазы загрузочного процесса связаны между собой.