Ich habe gerade ein Gentoo-Basissystem eingerichtet (was bedeutet, dass ich jetzt booten und mich anmelden und Sachen damit machen kann). Meine Root-Partition befindet sich in einer virtuellen LVM2-Gruppe (mit einer getrennten /boot
Partition). Zum Booten muss ich die folgenden Parameter an den Kernel übergeben:
root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm
Anscheinend wird eine anfängliche Ramdisk verwendet, um etwas zu tun (ich denke, die LVM-Dinge werden geladen), bevor root gemountet wird. Gibt es eine Möglichkeit, diesen Code in den Kernel selbst zu schreiben, so dass keine initrd benötigt wird? Wenn nicht, wie kann ich die initrd selbst machen?
Es könnte nützlich sein, hinzuzufügen, dass ich versucht habe, den Kernel für Nicht-LVM-Root ohne initrd zu kompilieren, und es hat einwandfrei funktioniert. Dann habe ich versucht, das Ganze unter LVM zu stellen und konnte die Maschine nicht zum Booten bringen (ich denke, sie kann nicht mit dem LVM-Zeug umgehen). Dann habe ich das genkernel
Tool mit der --lvm
Option verwendet und es erstellt den funktionierenden Kernel und die initrd, die ich gerade verwende.
Jetzt möchte ich überspringen genkernel
und alles alleine machen, am besten ohne initrd, damit die Maschine etwas schneller bootet (die Flexibilität brauche ich sowieso nicht).
Antworten:
Einfache Antwort: Nein. Wenn Sie LVM möchten, benötigen Sie eine initrd.
Aber wie andere bereits gesagt haben: LVMs verlangsamen Ihr System nicht und tun nichts Schlechtes auf andere Weise. Sie ermöglichen es Ihnen lediglich, eine Umgebung zu erstellen, in der Ihr Kernel geladen werden und seine Arbeit erledigen kann.
Die initrd ermöglicht das Laden Ihres Kernels: Befindet sich Ihr Kernel auf einem LVM-Laufwerk, muss die gesamte LVM-Umgebung eingerichtet werden, bevor die Binärdatei, die den Kernel enthält, geladen werden kann.
Schauen Sie sich den Wikipedia-Eintrag auf initrd an, in dem erklärt wird, was die initrd macht und warum Sie sie brauchen.
Noch eine Anmerkung: Ich sehe Ihren Sinn darin, Dinge selbst zu tun, aber Sie können sich sogar mit genkernel die Hände schmutzig machen. Verwenden Sie genkernel --menuconfig all und Sie können im Grunde alles so einstellen, als ob Sie Ihren Kernel komplett ohne Toolunterstützung erstellen würden. Genkernel fügt nur das make bzImage hinzu, erstellt Module und erstellt modules_install-Zeilen für Sie und erledigt diese unangenehmen initrd-Aufgaben.
Sie können die initrd natürlich selbst erstellen, wie hier für initramfs oder hier für initrd beschrieben .
quelle
linuxrc
Daher führt das Skript in initrd diese Aufgabe aus.edit: habe gerade festgestellt, dass Sie versuchen, mit LVM zu booten, ich habe noch nie eine LVM eingerichtet, brauchte sie nie, daher funktioniert der Ansatz hier möglicherweise nicht
Hier sind die Grundregeln, die Sie zum Erstellen eines initrd-losen Kernels benötigen (aus dem Speicher, an den ich mich nicht genau erinnere):
Kompilieren Sie Ihren Kernel neu und stellen Sie sicher, dass er in den Kernel integriert ist (WICHTIG: Nicht als Modul!):
Device Drivers
)/
,/etc/*
und/lib/modules/*
(unterFile systems
)Grundsätzlich muss der Kernel in der Lage sein, das Root-Dateisystem bereitzustellen, die Datei / etc / fstab zu lesen, andere Treibermodule zu laden (falls erforderlich) und andere Nicht-Root-Dateisysteme bereitzustellen, um den Rest des Bootvorgangs abzuschließen. Wenn Sie einen aufwendigeren Bootprozess haben, z. B. einen Netzwerk-Boot, müssen Sie diese Treiber ebenfalls einbauen.
Deaktivieren Sie initrd im Kernel "Allgemeines Setup> Unterstützung von RAM-Dateisystemen und RAM-Datenträgern (initramfs / initrd)", auch bekannt als CONFIG_BLK_DEV_INITRD = n.
Wenn Sie die GRUB-Konfiguration ändern, brauchen Sie nicht mehr init = und realroot = und setup root =, damit sie auf das Root-Dateisystemgerät verweist.
Ich denke, das ist alles. Vergessen Sie nicht, einen Backup-Kernel und eine gute Kopie einer bootfähigen Live-CD aufzubewahren, falls etwas passiert.
Dinge, die schief gehen könnten: Wenn Sie in den falschen Treibern kompiliert haben oder wenn Sie die Basistreiber als Modul kompilieren, kann der Kernel das Dateisystem nicht lesen. Starten Sie mit einem neuen Kernel oder mit einer Live-CD neu und kompilieren Sie einen Kernel mit den richtigen Treibern neu.
Die einzige Schwierigkeit besteht darin, herauszufinden, welcher Treiber für Ihre Hardware relevant ist. Sie können
lspci
und verwendenlshw
, um Ihre Hardware zu identifizieren. Wenn Sie diese Tools noch nicht haben, dannemerge lshw pciutils
.quelle
lsmod
von einem laufenden Kernel ist auch nützlich.Ja, du brauchst eine initrd. Hier ist der Grund:
Der normale Startvorgang beginnt mit dem Bootloader, der gerade genug über Ihr System weiß, um den Kernel zu finden und auszuführen. (GRUB2 ist intelligent genug, um einen Kernel zu finden, der sich auf einer LVM2- oder RAID-Partition befindet, GRUB1 jedoch nicht. Daher wird normalerweise empfohlen, dass Sie eine separate Partition mit einem vereinfachten Layout erstellen / starten.) Nach dem Laden benötigt der Kernel in der Lage zu sein, das Root-Dateisystem zu finden, damit es den Boot-Prozess starten kann. LVM kann jedoch nicht gestartet werden, ohne von einigen im Root-Dateisystem vorhandenen User-Space-Tools ausgelöst zu werden, die nicht ohne die im Root-Dateisystem vorhandenen LVM-Tools geladen werden können ...;)
Um diesen Zyklus zu unterbrechen, ist ein initrd oder initramfs ein komprimiertes Dateisystem, das im Kernel gespeichert ist (entweder in / boot oder im Kernel selbst) und das gerade genug Linux-Systeme enthält, um Dienste wie LVM oder MD oder was auch immer zu starten Sie wollen. Es ist ein temporäres Dateisystem und fungiert nur so lange als Root-Dateisystem, bis der eigentliche Root geladen ist.
Die meisten Dokumentationen zu diesem Thema sind erstaunlich veraltet - zum Beispiel funktioniert lvm2create_initrd unter Gentoo nicht mehr. (Ich habe dasselbe vor ein paar Monaten eingerichtet und musste das Skript fast neu schreiben, bevor ich eine funktionierende initrd daraus bekam.) Das Erstellen eigener initramfs kann Spaß machen, und es ist die einzige Möglichkeit, einen absolut minimalen Start zu erzielen prozessieren (und die Vor- und Nachteile des Bootens von Linux kennenlernen), aber es ist eine Menge Arbeit.
Die kurze Antwort: benutze Dracut. Es handelt sich um ein neues Framework, das zumeist automatisiert zum Generieren von Initramfs verwendet wird. Es ist in portage. Die Dokumentation ist ein bisschen spärlich, aber es gibt genug davon, um herauszufinden, und es ist bei weitem der einfachste Weg, ein solides Initramfs und ein LVM-Root zu erhalten.
quelle
Es ist zwar nicht möglich, irgendeine Art von initrd zu verwenden, es ist jedoch möglich, keine separaten initrd-Dateien zu verwenden. (Ich habe noch nie genkernel benutzt, daher kann ich keine Anleitung dafür geben).
Zum Beispiel habe ich die Option gesetzt:
Wo
/usr/src/initrd.contents
in meinem Fall sieht aus wie (ich habe LVM + tuxonice + fbsplash):Und
/usr/src/init
ist:quelle
Ja ist es.
Die Komplikationen, die durch das Erstellen und Verarbeiten von initrds entstehen, werden unwirksam, wenn Sie grub2 installieren und verwenden. Das grub2-Wiki http://grub.enbug.org/LVMandRAID beschreibt, wie Sie Ihr / boot auf lvm mit nichts anderem als einer insmod-lvm in grub.cfg, der grub-Konfigurationsdatei, haben können, daher ist keine initrd erforderlich.
grub2 jetzt in version 1.98 aber immer noch im experimentellen zweig in gentoo. Es kann jedoch in einem anderen Steckplatz installiert werden und ist perfekt verwendbar.
Genießen!
quelle