Jak załadować moduł w initrd?

13

Chcę jawnie załadować moduł (powiedzmy netconsole) na etapie initrd, podobnie jak /etc/modulesw głównej procedurze uruchamiania systemu.

Najpierw sprawdziłem, czy initrd w moim systemie zawiera już poszukiwany moduł (patrz Dodatek).

Zajrzałem do /initrd.img(to jest skompresowane archiwum cpio, więc aby je szybko przejrzeć, zrobiłem to zcat /initrd.img > initrd.cpioi zajrzałem do niego mc). Szukałem wywołań modprobeskryptów i zorientowałem się, że moduły wymienione w /conf/modules(tutaj /jest katalog główny initrd) są automatycznie ładowane przez load_modules()funkcję z /scripts/functions(wywoływaną przez /init).

Ale jakie byłoby standardowe narzędzie w systemie Ubuntu do aktualizacji /conf/modulesinitrd?

(BTW, podczas studiowania kodu initrd Ubuntu, zauważyłem, że netconsolew /initskrypcie jest jakieś specjalne wsparcie , które mogę wykonać na moje potrzeby, ale i tak moje pytanie jest bardziej ogólne, dotyczące dowolnego innego niestandardowego modułu .)

dodatek

Jak powiedziałem powyżej: najpierw sprawdziłem, czy initrd w moim systemie zawiera już poszukiwany moduł (a mianowicie netconsole). Oto jak:

# 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
# 

A także sprawdziłem, że zawiera już potrzebny sterownik sieci:

# 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 - Ivan Zakharyaschev
źródło
3
Dla przyszłego odniesienia, lsinitramfszawarte w initramfs-toolsrobi mniej więcej to samo, co zcat /initrd.img ..zilustrowane tutaj polecenie.
timss 21.04.16

Odpowiedzi:

14

Odkryłem, jak dodawać moduły do ​​initrd w Ubuntu 14.04. Dodałem nazwy modułów do / etc / initramfs-tools / modules. To dodało moduły do ​​pliku initrd. Nie zapomnij zaktualizować pliku initrd (update-initramfs -u) po wprowadzeniu zmian w / etc / initramfs-tools / modules.

Matthew Wolf
źródło
Jak definiujesz nazwy modułów? Teraz muszę dodać moduł ahci.ko? Więc co powinno być zawarte w tym pliku?
sandun dhammika
@sandundhammikaahci
Ken Sharp
3

Ubuntu używa initramfs-tools (zobacz wprowadzenie do man initramfs-tools) do obsługi tworzenia initrd.

Aby dodać moduł netconsole w initrd i wymusić ładowanie, utwórz plik w / etc / initramfs-tools / hooks (tj. / Etc / initramfs-tools / hooks / netconsole) z zawartością:

#! / bin / sh
PREREQ = ""
prereqs ()
{
   echo „$ PREREQ”
}

skrzynka 1 $ w
wymagania wstępne)
   wymagania wstępne
   wyjście 0
   ;;
esac

. / usr / share / initramfs-tools / hook-functions

force_load netconsole

i uczynić go wykonywalnym. Następnie uruchomić:

update-initramfs -u

aby zaktualizować initrd najnowszego jądra.


źródło
1
Ale czy nie ma prostszego sposobu na dodanie nazwy modułu /conf/modules? Gdzie mam go umieścić, update-initramfs -uaby go użyć?
imz - Ivan Zachharyaschev