Как добавить скрипт в initramfs с помощью dracut?

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

Я использую 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:

  1. Конфигурационные файлы Dracut: Эти файлы, расположенные в директории /etc/dracut.conf.d/, позволяют задавать различные параметры для процесса создания initramfs, включая включение дополнительных файлов и скриптов.

  2. Модули Dracut: Модули находятся в директории /usr/lib/dracut/modules.d/ и имеют возможность добавлять свои скрипты в initramfs. Создание кастомного модуля обеспечивает более гибкий и масштабируемый подход к настройке initramfs.

Пример

Рассмотрим ваш случай, когда необходимо поместить скрипт в фазу pre-mount. Вот как можно это сделать:

Подход с использованием --include

  1. Подготовка скрипта: Ваш скрипт, который вы хотите включить, может находиться в /etc/dracut.conf.d/tpm.sh.

    #!/usr/bin/env bash
    read -p 'Этот файл выполнится для инициализации TPM'
    exit 0
  2. Использование команды dracut: Вызовите команду Dracut, используя опцию --include.

    sudo dracut --include /etc/dracut.conf.d/tpm.sh /usr/lib/dracut/hooks/pre-mount/tpm.sh tpm.img

    Это действие скопирует ваш скрипт в директорию, откуда он сможет быть выполнен в фазе pre-mount.

Подход с использованием конфигурационного файла

  1. Создание конфигурационного файла: Создайте новый файл конфигурации в /etc/dracut.conf.d/tpm.conf со следующей строкой:

    install_items+=" /usr/lib/dracut/hooks/pre-mount/tpm.sh "
  2. Поместите скрипт в /usr/lib/dracut/hooks/pre-mount/tpm.sh, чтобы он автоматически включался в создаваемый initramfs.

Практическое применение

Создание модуля Dracut

Более структурированное и масштабируемое решение включает в себя создание модуля Dracut.

  1. Создание директории для модуля: В директории /usr/lib/dracut/modules.d/ создайте новый подкаталог, например, 90tpm.

  2. Скрипт module-setup.sh: Создайте файл module-setup.sh, который сообщит Dracut, когда и как запускать ваш скрипт:

    #! /bin/bash
    
    install () {
       inst_hook pre-mount 50 "$moddir/tpm.sh"
    }
  3. Разместите ваш скрипт tpm.sh в этой новой директории.

Этот подход позволяет включать скрипт в initramfs при вызове dracut без дополнительных параметров.

Заключение

Выбор подхода зависит от ваших потребностей и предпочтений. Использование модуля предоставляет больше гибкости и структурированности, особенно если вы планируете дальнейшее развитие или интеграцию в более сложные процессы. Dracut является мощным инструментом, и его возможности позволяют настраивать процесс загрузки под специфические требования. Успешное включение скрипта в initramfs требует тщательного следования инструкциям и понимания того, как разные фазы загрузочного процесса связаны между собой.

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

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