Comment charger un module dans initrd?

13

Je veux charger explicitement un module (disons netconsole) pendant la phase initrd, de la même manière que /etc/modulesdans la procédure de démarrage du système principal.

Tout d'abord, j'ai vérifié que l'initrd dans mon système contient déjà le module voulu (voir l'annexe).

J'ai examiné /initrd.img(qui est une archive compressée cpio, donc pour y jeter un coup d'œil, je l'ai fait zcat /initrd.img > initrd.cpioet je suis allé à l'intérieur avec mc). J'ai recherché toutes les invocations modprobeparmi les scripts, et j'ai compris que les modules répertoriés dans /conf/modules( /c'est la racine d'initrd ici) sont automatiquement chargés par la load_modules()fonction depuis /scripts/functions(appelé par /init).

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

(BTW, lors de mon étude du code de l'initrd d'Ubuntu, j'ai remarqué qu'il existe un support spécial pour netconsolele /initscript, que je pourrais faire fonctionner pour mes besoins, mais de toute façon, ma question est plus générale, concernant tout autre module personnalisé .)

appendice

Comme je l'ai dit ci-dessus: d'abord, j'ai vérifié que l'initrd dans mon système contient déjà le module voulu (à 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 j'ai également 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
# 
imz - Ivan Zakharyaschev
la source
3
Pour référence future, lsinitramfsinclus dans initramfs-toolsfait à peu près la même chose que la zcat /initrd.img ..commande illustrée ici.
timss

Réponses:

14

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 apporté des modifications à / etc / initramfs-tools / modules.

Matthew Wolf
la source
Comment définissez-vous les noms des modules? Maintenant, je dois ajouter le module ahci.ko? Que faut-il donc inclure dans ce fichier?
sandun dhammika
@sandundhammikaahci
Ken Sharp
3

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

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

#! / bin / sh
PREREQ = ""
prérequis ()
{
   écho "$ PREREQ"
}

cas 1 $ en
prérequis)
   prérequis
   sortie 0
   ;;
esac

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

force_load netconsole

et le rendre exécutable. Exécutez ensuite:

update-initramfs -u

pour mettre à jour l'initrd du dernier noyau.


la source
1
Mais n'y a-t-il pas un moyen plus simple d'ajouter simplement le nom du module à /conf/modules? Où dois-je le mettre pour l' update-initramfs -uutiliser?
imz - Ivan Zakharyaschev