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

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

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

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

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

(BTW, во время моего изучения кода Ubuntu initrd, я заметил, что есть некоторая специальная поддержка 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
# 
1
задан 21 September 2015 в 18:51

6 ответов

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

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

#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions force_load netconsole

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

update-initramfs -u

, чтобы обновить initrd из нового ядра.

3
ответ дан 23 May 2018 в 17:17
  • 1
    Но нет ли более простого способа просто добавить имя модуля в /conf/modules? Где я должен использовать его для того, чтобы update-initramfs -u использовал его? – imz -- Ivan Zakharyaschev 23 November 2015 в 13:38

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

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

#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions force_load netconsole

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

update-initramfs -u

, чтобы обновить initrd из нового ядра.

3
ответ дан 23 May 2018 в 17:17

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

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

#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions force_load netconsole

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

update-initramfs -u

, чтобы обновить initrd из нового ядра.

3
ответ дан 23 May 2018 в 17:17

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

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

#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions force_load netconsole

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

update-initramfs -u

, чтобы обновить initrd из нового ядра.

3
ответ дан 23 May 2018 в 17:17

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

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

#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions force_load netconsole

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

update-initramfs -u

, чтобы обновить initrd из нового ядра.

3
ответ дан 23 May 2018 в 17:17

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

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

#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions force_load netconsole

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

update-initramfs -u

, чтобы обновить initrd из нового ядра.

3
ответ дан 23 May 2018 в 17:17

Другие вопросы по тегам:

Похожие вопросы: