Wie fülle ich das Verzeichnis / dev aus, wenn ich meine eigene initrd erstelle?

9

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 /devtty0-tty63 und andere angezeigt, aber kein sda / hda.
  • Lief lspci -kin meinem aktuell laufenden Betriebssystem und in einer virtuellen Box, um zu überprüfen, welche Module verwendet werden. SATA Controllersagt, es wird ahcials Modul verwendet.
  • Wenn ich ausführen modprobe -v ahcies viel über „unbekanntes Symbol: ata_some_stuff“ beklagt, aber danach ist es wieder so etwas wie SCSI Subsystem initialized, ATA-6: VBOX HARDDISKund Direct-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?

Carlito
quelle

Antworten:

12

Während Gilles 'Antwort richtig ist, ist es alte Schule :-). Ein weiterer wichtiger Punkt (mehr ein Trottel in der Terminologie als alles andere) ist die Anleitung, mit der Sie verlinkt sind, Anweisungen zum Erstellen eines Initramfs, nicht eines Initrd. Die beiden sind ähnlich und dienen demselben Zweck, unterscheiden sich jedoch darin, wie das Bild gespeichert und geladen wird.

Wie auch immer, die Antwort auf Ihre Frage ist wirklich sehr, sehr einfach.

  1. devtmpfsIm Kernel aktivieren ( CONFIG_DEVTMPFS=y)
  2. Führen Sie es mount -t devtmpfs none /devals erstes in Ihrem initSkript aus.

Das ist es. Die devtmpfs werden /devgenau wie udev gefüllt . Sie brauchen nicht einmal bestücken vor /dev(im initramfs Bild) mit den Grundlagen wie null, zerooder console.

Patrick
quelle
Vielen Dank für Ihren Kommentar. Ich habe Ihren Befehl ausgeführt und habe jetzt mehr Geräte, aber immer noch kein sda oder hda zum Mounten. Gibt es etwas, das ich vergessen habe zu tun? Ich verwende den vmlinuz-Kernel, den ich vom Debians-Live-System erhalten habe. Soll ich meinen eigenen kompilieren?
Carlito
@Carlito Hat dieser Kernel devtmpfs aktiviert (überprüfen Sie die Konfigurationsdatei)? Debian hat erst kürzlich zu devtmpfs gewechselt.
Gilles 'SO - hör auf böse zu sein'
@ Gilles Es wird keine Konfigurationsdatei mitgeliefert, aber ich habe den Kernel geladen, den ich von Debian erhalten habe, heißt es in der Konfigurationsdatei 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?
Carlito
@Carlito Ja, wenn andere Dinge auftauchen /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 oder lspci -kin einem laufenden Linux-System ausführen (das Ihnen zeigt, welchen Kernel-Treiber die verschiedenen Komponenten Ihres Systems verwenden). .
Patrick
1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功CONFIG_DEVTMPFS_MOUNT=yhat 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"
Patrick
4

Udev wird /devautomatisch 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 udevziemlich früh in Ihrer Startsequenz an. Eines der wenigen Dinge, die Sie vorher tun sollten (müssen?), Ist mount /procund /sys. Rufen Sie udevadm trigger --action=add; udevadm settlenach 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 udevdBinärdatei benötigen Sie die anderen Teile von udevauf Ihrer initrd. Dies umfasst Konfigurationsdateien in /etc/udev, die Basiskonfiguration in /lib/udevsowie Hilfsbinärdateien wie scsi_idauch 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 udevdwie 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 Sie mount --move /dev /root/devdiese Option , um die gemountete Datei /devan 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, /linuxrcmuss Ausgang, während auf einem Initramfs, /initmuß execdie Init von der realen Wurzel); Die meisten Systeme haben heutzutage gewechselt (auch wenn die Datei möglicherweise noch initrd heißt).

Gilles 'SO - hör auf böse zu sein'
quelle
Danke für deine Antwort. Ich kam zu dem Schluss, dass ich tatsächlich ein initramfs anstelle eines initrd gemacht habe. Aber ich benutze den vmlinuz-Kernel, den ich vom Debians-Live-System erhalten habe, sollte ich tatsächlich meinen eigenen Kernel dafür kompilieren (damit ich weiß, welche Module zum Laden von Festplatten vorhanden sind), oder gibt es eine Art Minimalversion, die ich mit den Basismodulen verwenden könnte ? Ich werde wahrscheinlich das neueste udev herunterladen und versuchen, es zu kompilieren und auszuführen.
Carlito
@Carlito Ich empfehle, es zuerst mit dem Debian-Kernel zu versuchen, da das Vergessen eines erforderlichen Treibers ein häufiger Fehler beim Kompilieren Ihres eigenen Kernels ist.
Gilles 'SO - hör auf böse zu sein'
Aber wie würde ich einen bekommen? Ich habe gerade das vmlinuz kopiert, das ich in der debian-businesscard.iso gefunden habe (wahrscheinlich nicht die beste Idee). Sollte ich nur den Standardkernel kopieren, den ich von Ubuntu oder Debian erhalten habe, und das gesamte Verzeichnis / lib / modules?
Carlito
@Carlito Sie benötigen mindestens alle Module, die für Ihre Hardware erforderlich sind. Es kann schwierig sein, beim Durchsuchen der Liste alles zu finden, was Sie benötigen. Der beste Weg, um herauszufinden, was Sie brauchen, ist die Ausführung lsmodauf einem funktionierenden System. Beginnen Sie also mit allen und beschneiden Sie sie intelligent, wenn Sie Platz sparen müssen.
Gilles 'SO - hör auf böse zu sein'