Как загрузить модуль в initrd?

13

Я хочу явно загрузить модуль (скажем, netconsole) на этапе initrd, аналогично /etc/modulesпроцедуре запуска основной системы.

Сначала я проверил, что initrd в моей системе уже содержит нужный модуль (см. Приложение).

Я посмотрел /initrd.img(это сжатый архив cpio, так что для быстрого просмотра я сделал zcat /initrd.img > initrd.cpioи вошел в него mc). Я искал любые вызовы modprobeсреди сценариев и выяснил, что модули, перечисленные в /conf/modules(здесь /находится корень initrd), автоматически загружаются load_modules()функцией из /scripts/functions(вызываемой /init).

Но что будет стандартным инструментом в системе Ubuntu для обновления /conf/modulesinitrd?

(Кстати, во время изучения кода initrd в Ubuntu я заметил, что netconsoleв /initскрипте есть некоторая специальная поддержка , которую я мог бы сделать для своих нужд, но в любом случае мой вопрос более общий, касающийся любого другого пользовательского модуля. .)

аппендикс

Как я сказал выше: во-первых, я проверил, что initrd в моей системе уже содержит требуемый модуль (а именно, netconsole). Вот как:

# zcat /initrd.img | cpio --extract --verbose --list  | fgrep netconsole
-rw-r--r--   1 root     root        25372 Aug 31 20:59 lib/modules/3.19.0-28-generic/kernel/drivers/net/netconsole.ko
109504 blocks
# 

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

# ls -ld /sys/class/net/eth0/device/driver
lrwxrwxrwx 1 root root 0 Sep 21 15:34 /sys/class/net/eth0/device/driver -> ../../../../bus/pci/drivers/sky2
# zcat /initrd.img | cpio --extract --verbose --list  | fgrep sky2
-rw-r--r--   1 root     root        92948 Aug 31 20:49 lib/modules/3.19.0-28-generic/kernel/drivers/net/ethernet/marvell/sky2.ko
109504 blocks
# 
imz - Иван Захарящев
источник
3
Для дальнейшего использования, lsinitramfsвключено в initramfs-toolsделает примерно то же самое, что zcat /initrd.img ..команда, показанная здесь.
Timss

Ответы:

14

Я обнаружил, как добавлять модули в initrd в Ubuntu 14.04. Я добавил имена модулей в / etc / initramfs-tools / modules. Это добавило модули в файл initrd. Не забудьте обновить файл initrd (update-initramfs -u) после внесения изменений в / etc / initramfs-tools / modules.

Мэтью Вольф
источник
Как вы определяете имена модулей? Теперь мне нужно добавить модуль ahci.ko? Так что должно быть включено в этот файл?
сандун дхаммика
@sandundhammikaahci
Кен Шарп
3

Ubuntu использует initramfs-tools (для ознакомления смотрите man initramfs-tools) для создания initrd.

Чтобы добавить модуль netconsole в initrd и принудительно загрузить его, создайте файл в / etc / initramfs-tools / hooks (т.е. / etc / initramfs-tools / hooks / netconsole) с содержимым:

#! / Bin / ш
PREREQ = ""
PreReqs ()
{
   echo "$ PREREQ"
}

дело 1 в
PreReqs)
   PreReqs
   выход 0
   ;;
ESAC

, / USR / доли / initramfs-инструменты / Hook-функции

принудительная загрузка netconsole

и сделать его исполняемым. Затем запустите:

update-initramfs -u

обновить initrd новейшего ядра.


источник
1
Но разве нет простого способа добавить имя модуля /conf/modules? Где я должен положить его для того, update-initramfs -uчтобы использовать его?
imz - Иван Захарящев