- Вопрос или проблема
- Ответ или решение
- 1. Подготовка к исключению модуля
- 2. Удаление (если необходимо) текущего модуля
- 3. Черный список для модуля
- 4. Установка модуля для игнорирования
- 5. Резервное копирование текущего initramfs
- 6. Проверка модуля в initramfs
- 7. Обновление initramfs
- 8. Обновление конфигурации GRUB (по необходимости)
- Заключение
Вопрос или проблема
В дистрибутивах, похожих на 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 без необходимости производить постоянные изменения под каждое обновление ядра или модуля. Следуя всем предложенным шагам, вы можете управлять загрузкой модулей на вашем сервере или рабочей станции с максимальным удобством.