Comment remplir le répertoire / dev lors de la construction de mon propre initrd?

9

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/modulesqui é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 -kdans 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 Controllerdit qu'il utilise ahcicomme module.
  • Quand je l'exécute, modprobe -v ahciil se plaint beaucoup de "symbole inconnu: ata_some_stuff", mais après cela, il renvoie quelque chose comme SCSI Subsystem initialized, ATA-6: VBOX HARDDISKet Direct-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?

Carlito
la source

Réponses:

12

Bien que la réponse de Gilles soit correcte, c'est de la vieille école :-). Un autre élément à noter (plus un nitpick sur la terminologie qu'autre chose) est que le guide auquel vous avez lié est des instructions sur la façon de créer un initramfs, pas un initrd. Les deux sont similaires et servent le même objectif, mais sont différents dans la façon dont l'image est stockée et chargée.

Quoi qu'il en soit, la réponse à votre question est vraiment très simple.

  1. Activer devtmpfsdans le noyau ( CONFIG_DEVTMPFS=y)
  2. Exécuter mount -t devtmpfs none /devcomme la toute première chose dans votre initscript.

C'est ça. Les devtmpfs se rempliront /devcomme udev. Vous ne même pas besoin de préremplir /dev(dans l'image initramfs) avec les bases comme null, zeroou console.

Patrick
la source
Merci pour votre commentaire. J'ai exécuté votre commande, et j'ai maintenant plus d'appareils, mais toujours pas de sda ​​ou hda à monter. Y a-t-il quelque chose que j'ai oublié de faire? J'utilise le noyau vmlinuz que j'ai obtenu du système live debians, dois-je en fait compiler le mien?
Carlito
@Carlito Ce noyau a-t-il activé devtmpfs (consultez le fichier de configuration)? Debian est récemment passée à devtmpfs.
Gilles 'SO- arrête d'être méchant'
@ Gilles Il n'y a pas de fichier de configuration fourni, mais j'ai chargé le noyau que j'ai obtenu de Debian, a déclaré le fichier de configuration 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é?
Carlito
@Carlito oui, si vous avez d'autres choses qui apparaissent /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écuter lspci -kdans 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) .
Patrick
1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功CONFIG_DEVTMPFS_MOUNT=yn'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"
Patrick
4

Udev se remplit /devautomatiquement 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 udevassez tôt dans votre séquence de démarrage. L'une des rares choses que vous devriez (devez?) Faire avant cela est mount /procet /sys. Après avoir démarré le démon, appelez udevadm trigger --action=add; udevadm settlepour 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 udevdbinaire, vous aurez besoin des autres parties de udevvotre initrd. Cela inclut les fichiers de configuration dans /etc/udev, la configuration de base dans /lib/udevainsi que les binaires d'assistance tels que scsi_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 udevdcomme tous les autres programmes de l'initrd. Cela ne supprime aucun appareil de /dev. Utilisez mount --move /dev /root/devpour déplacer le monté /devvers 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, /linuxrcdoit sortir, tandis que sur un initramfs, l'init /initdoit execpartir 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).

Gilles 'SO- arrête d'être méchant'
la source
Merci pour votre réponse. J'en suis venu à la conclusion que j'avais fait un initramfs au lieu d'un initrd. Mais j'utilise le noyau vmlinuz que j'ai obtenu du système debians live, dois-je réellement compiler mon propre noyau pour cela (donc je sais quels modules il y a pour charger les disques durs), ou y a-t-il une sorte de version minimale que je pourrais utiliser avec les modules de base ? Je vais probablement télécharger le dernier udev et essayer de le compiler et de l'exécuter.
Carlito
@Carlito Je recommande d'abord d'essayer avec le noyau Debian, car oublier un pilote nécessaire est une erreur courante lors de la compilation de votre propre noyau.
Gilles 'SO- arrête d'être méchant'
Mais comment pourrais-je en obtenir un? Je viens de copier le vmlinuz que j'ai trouvé dans le debian-businesscard.iso (probablement pas la meilleure idée). Dois-je simplement copier le noyau standard que j'ai obtenu depuis Ubuntu ou Debian, et tout le répertoire / lib / modules?
Carlito
@Carlito Vous aurez besoin d'au moins tous les modules nécessaires à votre matériel. Il peut être difficile de trouver tout ce dont vous avez besoin en parcourant la liste. La meilleure façon de savoir ce dont vous avez besoin est d'exécuter lsmodsur un système qui fonctionne. Commencez donc par tous, puis taillez intelligemment si vous avez besoin de gagner de l'espace.
Gilles 'SO- arrête d'être méchant'