J'essaie d'apprendre des choses sur initrd. J'ai suivi ce tutoriel pour créer mon propre initrd à partir de zéro, et j'ai installé busybox dessus. Ensuite, j'en ai fait un .iso avec isolinux, afin de pouvoir le tester dans virtualbox. Ça marche super!
J'ai les commandes de base de busybox, donc je voulais monter un système de fichiers. Mais le répertoire / dev est presque vide (pas de sda), à l'exception de certains fichiers que j'ai créés en suivant le tutoriel. J'ai appris sur udev et je pense que c'est ce dont j'ai besoin. Cependant, je ne sais pas trop comment procéder.
Dois-je simplement récupérer le dernier code source d'udev, le compiler et l'ajouter à mon initrd? Et puis appelez / bin / udev ou quelque chose comme ça dans mon script init? Ou existe-t-il une autre / meilleure façon de remplir le répertoire / dev?
Edit: Quelques informations supplémentaires et mises à jour sur ce que j'ai déjà fait.
- Je teste tout en boîte virtuelle. J'ai juste installé ubuntu minimal dans une boîte virtuelle, créé un .iso à partir de mon initrd, puis démarré à partir de l'iso dans virtualbox.
- J'ai utilisé le vmlinuz et
/lib/modules
qui étaient présents sur un debian-businesscard.iso et les ai copiés sur mon initrd que j'ai créé en suivant le tutoriel que j'ai lié plus tôt. - Le noyau a
CONFIG_DEVTMPFS=y
- Certains appareils apparaissent
/dev
, comme tty0-tty63 et d'autres, mais pas de sda / hda. - J'ai couru
lspci -k
dans mon système d'exploitation en cours d'exécution et dans une boîte virtuelle pour vérifier quels modules sont utilisés.SATA Controller
dit qu'il utiliseahci
comme module. - Quand je l'exécute,
modprobe -v ahci
il se plaint beaucoup de "symbole inconnu: ata_some_stuff", mais après cela, il renvoie quelque chose commeSCSI Subsystem initialized
,ATA-6: VBOX HARDDISK
etDirect-Access ATA VBOX HARDDISK
. Cependant, aucun périphérique de disque dur n'a encore été trouvé/dev
.
Mon /init/
script actuel est le suivant:
#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login
Quelqu'un a-t-il une idée de ce que je fais mal et de ce que je devrais faire à la place?
CONFIG_DEVTMPFS=y
, mais je n'ai toujours pas de périphérique sda. Je pense que c'est parce que je n'ai chargé aucun module (lsmod ne renvoie rien). Quels modules dois-je charger pour obtenir les périphériques du système de fichiers? Ou y a-t-il autre chose que j'ai oublié?/dev
, juste pas les lecteurs, alors devtmpfs fonctionne et vous manquez probablement le module de contrôleur de disque (comme vous l'avez deviné). Malheureusement, la seule façon de savoir de quel pilote / module vous avez besoin est de lire les informations de chacun dans la configuration du noyau, ou d'exécuterlspci -k
dans un système Linux en cours d'exécution (qui vous montrera quel pilote de noyau les différents composants de votre système utilisent) .CONFIG_DEVTMPFS_MOUNT=y
n'a aucun effet sur initramfs. Depuis le texte d'aide du noyau: "Cette option n'affecte pas le démarrage basé sur initramfs, ici le système de fichiers devtmpfs doit toujours être monté manuellement après le montage de rootfs"Udev se remplit
/dev
automatiquement en fonction des pilotes chargés dans le noyau et des périphériques détectés par ces pilotes. Les noms des périphériques et leurs autorisations sont basés sur un ensemble de règles que les administrateurs peuvent affiner. La plupart des systèmes Linux devraient utiliser udev; l'exception concerne les systèmes (généralement intégrés) dont la configuration matérielle est connue au moment de la configuration du système et ne changera pas par la suite.Vous appelez généralement
udev
assez tôt dans votre séquence de démarrage. L'une des rares choses que vous devriez (devez?) Faire avant cela est mount/proc
et/sys
. Après avoir démarré le démon, appelezudevadm trigger --action=add; udevadm settle
pour que udev traite tous les événements en attente du noyau (trigger
) et attendez que les événements soient traités avant de continuer (settle
). Vous pouvez ensuite rechercher le périphérique contenant le système de fichiers racine.Outre le
udevd
binaire, vous aurez besoin des autres parties deudev
votre initrd. Cela inclut les fichiers de configuration dans/etc/udev
, la configuration de base dans/lib/udev
ainsi que les binaires d'assistance tels quescsi_id
également dans/lib/udev
. Vous avez besoin de tous les programmes appelés à partir des règles udev que vous incluez dans initrd.À la fin de l'initrd, avant de transférer le contrôle vers la vraie partition racine, vous devrez arrêter
udevd
comme tous les autres programmes de l'initrd. Cela ne supprime aucun appareil de/dev
. Utilisezmount --move /dev /root/dev
pour déplacer le monté/dev
vers la racine réelle.Gentoo a un guide initramfs et une page wiki initramfs qui mentionnent entre autres udev. Initramfs est le successeur moderne d'initrd, utilisant une archive cpio plutôt qu'une image de système de fichiers, et avec une interface de processus différente (sur un initrd,
/linuxrc
doit sortir, tandis que sur un initramfs, l'init/init
doitexec
partir de la racine réelle); la plupart des systèmes ont changé ces jours-ci (même si le fichier peut encore être appelé initrd).la source
lsmod
sur un système qui fonctionne. Commencez donc par tous, puis taillez intelligemment si vous avez besoin de gagner de l'espace.