Ich versuche etwas über initrd zu lernen. Ich habe dieses Tutorial befolgt , um meine eigene Initrd von Grund auf neu zu erstellen, und ich habe Busybox darauf installiert. Dann habe ich mit isolinux eine .iso daraus gemacht, damit ich sie in virtualbox testen kann. Es funktioniert super!
Ich habe die grundlegenden Befehle von Busybox, also wollte ich ein Dateisystem mounten. Das Verzeichnis / dev ist jedoch fast leer (kein sda), mit Ausnahme einiger Dateien, die ich im Anschluss an das Lernprogramm erstellt habe. Ich habe etwas über udev gelernt und ich denke, das ist was ich brauche. Ich bin mir jedoch nicht sicher, wie ich das anstellen soll.
Sollte ich einfach den neuesten Quellcode von udev holen, ihn kompilieren und zu meiner initrd hinzufügen? Und dann / bin / udev oder so etwas in meinem Init-Skript aufrufen? Oder gibt es eine andere / bessere Möglichkeit, das Verzeichnis / dev zu füllen?
Bearbeiten: Einige zusätzliche Informationen und Updates zu dem, was ich bereits getan habe.
- Ich teste alles in einer virtuellen Box. Ich habe gerade ubuntu minimal in der virtuellen Box installiert, eine ISO-Datei von meinem initrd erstellt und dann von der ISO in der virtuellen Box gestartet.
- Ich habe die vmlinuz verwendet
/lib/modules
, die auf einer debian-businesscard.iso vorhanden waren, und diese auf meine initrd kopiert, die ich erstellt habe, indem ich dem zuvor verlinkten Tutorial gefolgt bin. - Kernel hat
CONFIG_DEVTMPFS=y
- Einige Geräte werden in
/dev
tty0-tty63 und andere angezeigt, aber kein sda / hda. - Lief
lspci -k
in meinem aktuell laufenden Betriebssystem und in einer virtuellen Box, um zu überprüfen, welche Module verwendet werden.SATA Controller
sagt, es wirdahci
als Modul verwendet. - Wenn ich ausführen
modprobe -v ahci
es viel über „unbekanntes Symbol: ata_some_stuff“ beklagt, aber danach ist es wieder so etwas wieSCSI Subsystem initialized
,ATA-6: VBOX HARDDISK
undDirect-Access ATA VBOX HARDDISK
. Es wurden jedoch noch keine Festplattengeräte in gefunden/dev
.
Mein aktuelles /init/
Skript lautet wie folgt:
#!/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
Hat jemand eine Idee, was ich falsch mache und was ich stattdessen tun sollte?
CONFIG_DEVTMPFS=y
, aber ich bekomme immer noch keine SDA-Geräte. Ich denke, das liegt daran, dass ich keine Module geladen habe (lsmod gibt nichts zurück). Welche Module sollte ich laden, um die Dateisystemgeräte zu erhalten? Oder habe ich noch etwas vergessen?/dev
, nur nicht die Laufwerke, dann funktioniert devtmpfs und Sie vermissen wahrscheinlich das Festplattencontrollermodul (wie Sie vermutet haben). Leider können Sie nur feststellen, welchen Treiber / welches Modul Sie benötigen, indem Sie entweder die Informationen für jeden Treiber / jedes Modul in der Kernel-Konfiguration lesen oderlspci -k
in einem laufenden Linux-System ausführen (das Ihnen zeigt, welchen Kernel-Treiber die verschiedenen Komponenten Ihres Systems verwenden). .CONFIG_DEVTMPFS_MOUNT=y
hat keine Auswirkung auf initramfs. Aus dem Kernel-Hilfetext: "Diese Option wirkt sich nicht auf das Initramfs-basierte Booten aus. Hier muss das devtmpfs-Dateisystem immer manuell gemountet werden, nachdem das Rootfs gemountet wurde"Udev wird
/dev
automatisch basierend auf den in den Kernel geladenen Treibern und den von diesen Treibern erkannten Geräten gefüllt. Die Namen der Geräte und ihre Berechtigungen basieren auf einer Reihe von Regeln, die Administratoren optimieren können. Die meisten Linux-Systeme sollten udev verwenden. Die Ausnahme bilden Systeme (normalerweise eingebettet), bei denen die Hardwarekonfiguration zum Zeitpunkt der Systemeinrichtung bekannt ist und sich danach nicht mehr ändert.Normalerweise rufen Sie
udev
ziemlich früh in Ihrer Startsequenz an. Eines der wenigen Dinge, die Sie vorher tun sollten (müssen?), Ist mount/proc
und/sys
. Rufen Sieudevadm trigger --action=add; udevadm settle
nach dem Starten des Dämons auf, damit udev alle ausstehenden Ereignisse vom Kernel (trigger
) verarbeitet, und warten Sie, bis die Ereignisse verarbeitet sind, bevor Sie fortfahren (settle
). Anschließend können Sie das Gerät mit dem Root-Dateisystem suchen.Neben der
udevd
Binärdatei benötigen Sie die anderen Teile vonudev
auf Ihrer initrd. Dies umfasst Konfigurationsdateien in/etc/udev
, die Basiskonfiguration in/lib/udev
sowie Hilfsbinärdateien wiescsi_id
auch in/lib/udev
. Sie benötigen alle Programme, die nach udev-Regeln aufgerufen werden, die Sie in die initrd aufnehmen.Am Ende der initrd müssen Sie
udevd
wie jedes andere Programm von der initrd anhalten, bevor Sie die Steuerung auf die echte Root-Partition übertragen . Dadurch wird kein Gerät entfernt/dev
. Verwenden Siemount --move /dev /root/dev
diese Option , um die gemountete Datei/dev
an die echte Wurzel zu verschieben.Gentoo hat einen initramfs-Leitfaden und eine initramfs-Wiki-Seite, auf denen unter anderem udev erwähnt wird. Initramfs ist der moderne Nachfolger initrd ein cpio Archiv eher als ein Dateisystem - Bild, und mit einer anderen Prozess - Schnittstelle (auf einer Initrd,
/linuxrc
muss Ausgang, während auf einem Initramfs,/init
mußexec
die Init von der realen Wurzel); Die meisten Systeme haben heutzutage gewechselt (auch wenn die Datei möglicherweise noch initrd heißt).quelle
lsmod
auf einem funktionierenden System. Beginnen Sie also mit allen und beschneiden Sie sie intelligent, wenn Sie Platz sparen müssen.