web-dev-qa-db-fra.com

Comment charger un module dans initrd?

Je souhaite explicitement charger un module (par exemple, netconsole) au cours de l'étape initrd, de la même manière que /etc/modules dans la procédure de démarrage du système principal.

Tout d’abord, j’ai vérifié que l’initrd de mon système contenait déjà le module souhaité (voir l’Annexe).

J'ai examiné /initrd.img (qui est une archive compressée de cpio, donc pour y jeter un coup d'œil rapide, j'ai écrit zcat /initrd.img > initrd.cpio et y est entré avec mc). J'ai recherché tous les invocations de modprobe parmi les scripts et j'ai découvert que les modules répertoriés dans /conf/modules (/ est la racine d'initrd ici) sont automatiquement chargés par la fonction load_modules() de /scripts/functions (appelée par /init).

Mais quel serait l'outil standard dans le système Ubuntu pour mettre à jour /conf/modules de l'initrd?

(En passant, lors de mon étude du code de l'initrd d'Ubuntu, j'ai remarqué qu'il y avait un support particulier pour netconsole dans le script /init, que je pourrais faire fonctionner pour mes besoins, mais de toute façon, ma question est plus générale, pour tout autre module personnalisé.)

Appendice

Comme je l’ai dit plus haut: d’abord, j’ai vérifié que l’initrd de mon système contenait déjà le module souhaité (à savoir, netconsole). C'est ainsi:

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

Et aussi j'ai vérifié qu'il contient déjà le pilote réseau nécessaire:

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

J'ai découvert comment ajouter des modules à l'initrd dans Ubuntu 14.04. J'ai ajouté les noms des modules à/etc/initramfs-tools/modules. Cela a ajouté les modules au fichier initrd. N'oubliez pas de mettre à jour le fichier initrd (update-initramfs -u) après avoir modifié le fichier/etc/initramfs-tools/modules.

12
Matthew Wolf

Ubuntu utilise initramfs-tools (voir man initramfs-tools pour une introduction) pour gérer la création de initrd.

Pour ajouter un module netconsole dans initrd et forcer son chargement, créez un fichier dans/etc/initramfs-tools/hooks (c'est-à-dire/etc/initramfs-tools/hooks/netconsole) avec le contenu suivant:

 #!/bin/sh 
 PREREQ = "" 
 prereqs () 
 {
 echo "$ PREREQ" 
} 
 
 cas $ 1 dans 
 conditions préalables) 
 conditions préalables 
 sortie 0 
 ;; 
 esac 
 
. /usr/share/initramfs-tools/hook-functions

force_load netconsole 

et le rendre exécutable. Puis lancez:

update-initramfs -u

mettre à jour l'initrd du noyau le plus récent.

3
user448115