Как автоматически запустить mkinitramfs на Debian после apt update для пакетов ядра?

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

Что я пытаюсь достичь, так это наличие зашифрованной корневой файловой системы на Raspberry Pi (с установленной Raspian Buster), которая разблокируется при загрузке через ssh. Я довольно далеко продвинулся, адаптировав учебное пособие для Kali linux и настроил это, по крайней мере, один раз, но это пока не выживает после обновлений ядра.

Одна из проблем заключается в том, что эта настройка использует initramfs, который указан в /boot/config.txt следующим образом:

initramfs initramfs.gz followkernel

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

mkinitramfs -o /boot/initramfs.gz 4.19.118-v7+

где 4.19.118-v7+ зависит от текущей версии ядра и типа используемого оборудования Raspberry Pi. Конечно, я хочу, чтобы это происходило автоматически всякий раз, когда apt upgrade устанавливает новое ядро.

И вот тут я застрял с двумя проблемами:

  • A) Где и как мне правильно внедрить этот процесс обновления?
  • B) Как мне определить правильную версию ядра для использования?

Что касается A), я узнал, что raspberrypi-kernel.postinst выполняет /etc/kernel/postinst.d/. Это, в свою очередь, вызывает /usr/sbin/update-initramfs, который в конечном итоге вызовет mkinitramfs. В чем я запутался, так это в этом коде в /usr/sbin/update-initramfs:

set_initramfs()
{
        initramfs="${BOOTDIR}/initrd.img-${version}"
}

Он определяет имя файла для initramfs. Такой файл никогда не создавался во время обновления, и я не уверен, на правильном ли я пути, так как википедия говорит, что схема init.rd была заменена схемой initramfs. Тем не менее, мне не удалось найти хорошую документацию, которая описывает, как должны происходить события после обновления модуля ядра. (Буду признателен за хорошие ссылки).

Так что мой вопрос:
Где лучше всего вставить скрипт, который выполняет команду mkinitramfs? Должен ли я модифицировать /etc/kernel/postinst.d/? Будет ли это решение стабильным в течение следующих нескольких версий Debian?

Что касается B), довольно легко получить доступные версии ядра с помощью:

> ls -l /lib/modules/ | awk -F" " '{print $9}'`

5.4.51+
5.4.51-v7+
5.4.51-v7l+
5.4.51-v8+

Но как мне автоматически выбрать правильную для текущего оборудования? Для Pi3B+ это будет 5.4.51-v7+. Есть ли способ определить это автоматически?

Большое спасибо за вашу помощь!

Похоже, что initramfs нужно активировать, установив INITRD=Yes в /etc/default/raspberrypi-kernel и добавить скрипт после обновления в /etc/initramfs/post-update.d/ для обновления /boot/config.txt, как предложено в Обновить intramfs после обновления ядра#608 .

Надеюсь, это сработает …

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

Автоматизация процесса обновления mkinitramfs на Debian после обновления пакетов ядра

Если вы стремитесь создать зашифрованную корневую файловую систему на Raspberry Pi с использованием Raspbian Buster и хотите автоматизировать процесс обновления initramfs после каждых обновлений ядра, обратите внимание на нижеприведенные рекомендации. Данная процедура включает корректное определение версии ядра и автоматическое вызов mkinitramfs через постинсталяционные скрипты.

A) Куда и как интегрировать процесс обновления?

  1. Включение и настройка initramfs:
    Первым шагом будет убедиться, что система поддерживает и генерирует initramfs. Для этого в файле /etc/default/raspberrypi-kernel необходимо установить параметр:

    INITRD=Yes
  2. Создание скрипта для обновления initramfs:
    Важно создать постобновочный скрипт, который будет запускаться после обновления ядра. Для этого:

    • Создайте новый файл в директории /etc/initramfs/post-update.d/, например, update-initramfs.sh:
      sudo nano /etc/initramfs/post-update.d/update-initramfs.sh
  3. Наполнение скрипта:
    В новом файле укажите следующий код:

    #!/bin/bash
    
    # Получаем версию текущего ядра
    kernel_version=$(uname -r)
    
    # Запускаем mkinitramfs для конкретной версии ядра
    mkinitramfs -o /boot/initramfs.gz $kernel_version
  4. Установка прав на выполнение:
    Не забудьте сделать новый скрипт исполняемым:

    sudo chmod +x /etc/initramfs/post-update.d/update-initramfs.sh

B) Как правильно определить версию ядра для использования?

Для определения версии ядра, подходящей для вашего оборудования (например, Raspberry Pi 3B+), вы можете использовать утилиты Bash, чтобы получить необходимую информацию. Согласно системе версии, используемой на Raspberry Pi, можно вывести актуальный результат при помощи:

# Определяем архитектуру
architecture=$(uname -m)

# Определяем основную версию
if [[ "$architecture" == "armv7l" ]]; then
    kernel_suffix="-v7+"
elif [[ "$architecture" == "aarch64" ]]; then
    kernel_suffix="-v8+"
else
    kernel_suffix=""
fi

# Формируем полное имя версии ядра подставляя текущую версию
kernel_version=$(uname -r)$kernel_suffix

Сводка

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

Если у вас есть дополнительные вопросы или необходима более подробная информация, не стесняйтесь обратиться за помощью.

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

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