Как я могу исключить модули с initramfs-tools?

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

В дистрибутивах, похожих на Debian, для автоматической генерации ramdisk используется initramfs-tools. Я нахожу только опции для добавления дополнительных модулей через initramfs.conf или /etc/initramfs-tools/modules. Но как мне заблокировать некоторые модули? Я определенно не хочу использовать список в initramfs.conf, который является разрешающим списком.

В Fedora есть конфигурационный файл, в который я могу добавить что-то вроде omit_drivers+=driver-a driver-b в конфигурацию dracut, чтобы избежать некоторых модулей. Тогда мне не нужно будет пересобирать ramdisk после обновления ядра/драйверов. Как я могу сделать то же самое в Debian/Ubuntu?

В общем для предотвращения загрузки модулей ядра во время загрузки имя модуля должно быть добавлено в конфигурационный файл для утилиты “modprobe” (для предотвращения загрузки модуля initrd в aka initramfs ramdisk следуйте тем же шагам, так как это представление локального состояния файловой системы, на которой вы работаете):

a) убедитесь, что модуль не настроен на загрузку ни в /etc/modprobe.conf, /etc/modprobe.d/, /etc/rc.modules, или /etc/sysconfig/modules/ перед внесением изменений ниже

b) разгрузите модуль $ modprobe -r module_name

c) заблокируйте модуль (это само по себе не предотвратит загрузку модуля, если он является обязательной или опциональной зависимостью другого модуля, так как некоторые модули ядра будут пытаться загружать опциональные модули по требованию, что мы уменьшаем на следующем шаге) $ echo "blacklist module_name" >> /etc/modprobe.d/local-dontload.conf

d) добавьте строку установки, которая просто вызывает /bin/false вместо установки модуля (то же самое можно достичь, используя /bin/true) $ echo "install module_name /bin/false" >> /etc/modprobe.d/local-dontload.conf

e) создайте резервную копию текущего initramfs (может потребоваться настроить используемые пути/имена) $ ORGIRD=/boot/initrd.img-$(uname -r); TOD="$(date +%m-%d-%H%M%S).bakup"; BKPIRD=${ORGIRD}.${TOD}; [[ -f "${ORGIRD}" ]] && { echo "делаю резервную копию initrd ${ORGIRD} в ${BKPIRD}"; cp ${ORGIRD} ${BKPIRD}; } || { echo "пропускаю резервное копирование, файл initrd не найден ${ORGIRD}"; }

f) если модуль ядра является частью initramfs (используйте lsinitrd ${ORGIRD} | grep module-name.ko для проверки), и вы используете прямой вызов dracut для его пересборки (начального образа ramdisk), вызовите его с параметром, исключающим модуль $ dracut --omit-drivers module_name -f

g) сделайте исключение модуля постоянным для dracut (добавив в конфигурацию dracut) `$ MODNAME=”module_name”; echo “omit_dracutmodules+=” $MODNAME “” >> /etc/dracut.conf.d/omit-$MODNAME.conf

h) если используете dracut-install с initramfs-tools вместо dracut для генерации ramdisk вызовите update-initramfs -k $(uname -r) -u

h) если используете grub, добавьте module_name.blacklist=1 rd.driver.blacklist=module_nameв строку GRUB_CMDLINE_LINUX_DEFAULT | GRUB_CMDLINE_LINUX в /etc/default/grub

i) вызовите update-grub для записи изменений в конфигурацию grub, позволяя загрузку с использованием нового ramdisk

ps.

пропуская модули dracut в процессе создания initramfs, вы теряете возможность включать их по запросу (поэтому лучше просто заблокировать и установить “фальшивку” для modprobe – тогда вы всегда сможете загрузить его сами)

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

Для того чтобы исключить модули при использовании initramfs-tools в Debian и его производных дистрибутивах, вы можете следовать следующим шагам. Поскольку нет прямого аналога метода, используемого в Dracut, мы должны прибегнуть к нескольким методам, чтобы добиться желаемого результата.

1. Подготовка к исключению модуля

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

  • /etc/modprobe.conf
  • /etc/modprobe.d/*
  • /etc/rc.modules
  • /etc/sysconfig/modules/*

2. Удаление (если необходимо) текущего модуля

Если модуль уже загружен в систему, его нужно удалить. Используйте команду:

sudo modprobe -r имя_модуля

3. Черный список для модуля

Чтобы добавить модуль в черный список, создайте файл конфигурации или измените существующий в директории modprobe.d.

echo "blacklist имя_модуля" | sudo tee -a /etc/modprobe.d/local-dontload.conf

4. Установка модуля для игнорирования

Для того чтобы модуль не загружался даже при его зависимости, нужно добавить установочный оператор, который будет вызывать /bin/false вместо загрузки модуля:

echo "install имя_модуля /bin/false" | sudo tee -a /etc/modprobe.d/local-dontload.conf

5. Резервное копирование текущего initramfs

Прежде чем вносить изменения в initramfs, рекомендуется сделать резервную копию:

ORGIRD=/boot/initrd.img-$(uname -r)
TOD="$(date +%m-%d-%H%M%S).bakup"
BKPIRD=${ORGIRD}.${TOD}

if [ -f "${ORGIRD}" ]; then
    echo "Создание резервной копии initrd ${ORGIRD} в ${BKPIRD}"
    cp ${ORGIRD} ${BKPIRD}
else
    echo "Резервное копирование пропущено, initrd не найден: ${ORGIRD}"
fi

6. Проверка модуля в initramfs

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

lsinitramfs ${ORGIRD} | grep имя_модуля.ko

7. Обновление initramfs

После внесения всех изменений вам нужно обновить initramfs, выполнив команду:

sudo update-initramfs -u

8. Обновление конфигурации GRUB (по необходимости)

Если вы также хотите добавить опции в GRUB для черного списка модуля, откройте файл /etc/default/grub и добавьте следующие параметры в строку GRUB_CMDLINE_LINUX_DEFAULT:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash модуль_name.blacklist=1"

После внесения изменений обновите конфигурацию GRUB:

sudo update-grub

Заключение

Приведенные шаги помогут вам исключить нежелательные модули из initramfs при использовании Debian/Ubuntu без необходимости производить постоянные изменения под каждое обновление ядра или модуля. Следуя всем предложенным шагам, вы можете управлять загрузкой модулей на вашем сервере или рабочей станции с максимальным удобством.

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

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