Ist es möglich, root in LVM zu setzen, ohne initrd zu verwenden?

12

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 /bootPartition). 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 genkernelTool mit der --lvmOption verwendet und es erstellt den funktionierenden Kernel und die initrd, die ich gerade verwende.

Jetzt möchte ich überspringen genkernelund alles alleine machen, am besten ohne initrd, damit die Maschine etwas schneller bootet (die Flexibilität brauche ich sowieso nicht).

phunehehe
quelle
Eine initrd kann sich geringfügig auf die Startzeiten auswirken, wirkt sich jedoch nicht auf die Leistung Ihres Systems aus, sobald es ausgeführt wird.
Kristof Provost
oh ja, ich meinte eigentlich boot time, bearbeitet
phunehehe 28.09.10

Antworten:

6

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 .

tante
quelle
Naja danke für die bestätigung, aber du verpasst den teil "wenn nicht, wie kann ich die initrd selber machen?"
Phunehehe
Fügte einige Informationen hinzu und fügte meine andere Antwort in diese ein.
Dienstag,
8
Eine kleine Korrektur: initrd wird nicht zum Laden des Kernels verwendet : Der Kernel wird vom Bootloader geladen (GRUB, LILO, was auch immer); initrd ist eine Art RAM-Disk, die das ursprüngliche Root-Dateisystem bereitstellt. Es sollte alle Binärdateien (z. B. Kernelmodule, Userspace-Unterstützungsprogramme) enthalten, die erforderlich sind, um das System tatsächlich betriebsbereit zu machen. Dies ist der Grund, warum es für ein LVM-Stammverzeichnis benötigt wird: Das LVM-Subsystem muss initialisiert werden und seine Initialisierung ist zu komplex, um bequem nur mit Kernel-Boot-Parametern durchgeführt zu werden. linuxrcDaher führt das Skript in initrd diese Aufgabe aus.
Riccardo Murri
Sie haben natürlich recht, ich war etwas schlampig mit meiner Formulierung.
Tante
2
Kann wegen eines ziemlich großen Antwortfehlers nicht upvoten (initrd erlaubt das Laden des Kernels nicht).
Wzzrd
5

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):

  1. Kompilieren Sie Ihren Kernel neu und stellen Sie sicher, dass er in den Kernel integriert ist (WICHTIG: Nicht als Modul!):

    1. Motherboard-Treiber und Festplatten-Treiber (beide unter Device Drivers)
    2. Dateisystem - Treiber /, /etc/*und /lib/modules/*(unter File 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.

  2. 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.

  3. 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 lspciund verwenden lshw, um Ihre Hardware zu identifizieren. Wenn Sie diese Tools noch nicht haben, dann emerge lshw pciutils.

Lüge Ryan
quelle
+1 für das Erwähnen von eingebautem vs. Modul in der Kernel-Kompilierung.
Amphetamachine
lsmodvon einem laufenden Kernel ist auch nützlich.
LawrenceC
2

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.

p-statisch
quelle
2

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:

CONFIG_INITRAMFS_SOURCE="/usr/src/initrd.contents"

Wo /usr/src/initrd.contentsin meinem Fall sieht aus wie (ich habe LVM + tuxonice + fbsplash):

dir /bin                                    0755 0 0
file    /bin/busybox                        /bin/busybox                        0755 0 0
file    /bin/lvm                        /sbin/lvm.static                    0755 0 0
dir /dev                                    0755 0 0
dir /dev/fb                                 0755 0 0
dir /dev/misc                               0755 0 0
dir /dev/vc                                 0755 0 0
nod /dev/console                                0600 0 0    c  5   1
nod /dev/null                               0600 0 0    c  1   3
nod /dev/snapshot                               0600 0 0    c 10 231
nod /dev/tty1                               0600 0 0    c  4   0
dir /etc                                    0755 0 0
dir /etc/splash                             0755 0 0
dir /etc/splash/natural_gentoo                      0755 0 0
dir /etc/splash/natural_gentoo/images                   0755 0 0
file    /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  0644 0 0
file    /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg 0644 0 0
file    /etc/splash/natural_gentoo/1680x1050.cfg        /etc/splash/natural_gentoo/1680x1050.cfg        0644 0 0
slink   /etc/splash/tuxonice                    /etc/splash/natural_gentoo              0755 0 0
file    /etc/splash/luxisri.ttf                 /etc/splash/luxisri.ttf                 0644 0 0
dir /lib64                                  0755 0 0
dir /lib64/splash                               0755 0 0
dir /lib64/splash/proc                          0755 0 0
dir /lib64/splash/sys                           0755 0 0
dir /proc                                   0755 0 0
dir /mnt                                    0755 0 0
dir /root                                   0770 0 0
dir /sbin                                   0755 0 0
file    /sbin/fbcondecor_helper                 /sbin/fbcondecor_helper                 0755 0 0
slink   /sbin/splash_helper                 /sbin/fbcondecor_helper                 0755 0 0
file    /sbin/tuxoniceui_fbsplash               /sbin/tuxoniceui_fbsplash               0755 0 0
file    /sbin/tuxoniceui_text                   /sbin/tuxoniceui_text                   0755 0 0
dir /sys                                    0755 0 0
file    /init                           /usr/src/init

Und /usr/src/initist:

#!/bin/busybox ash
local X ROOT RUNLEVEL INIT PARAM
# Preliminary stuff
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
/bin/lvm vgchange -ay picard-main

# Try to resume. This never returns if it succeeds
test -e /sys/power/tuxonice/do_resume && echo 1 > /sys/power/tuxonice/do_resume
#/bin/resume

# Parse the command line for relevant options.
INIT=/sbin/init
RESCUE=""
PARAM=" "
for X in `cat /proc/cmdline`
do
        case "$X" in
                root=*) ROOT=${X#root=} ;;
                [0-6Ss]) RUNLEVEL=${X} ;;
                init=*) INIT=${X#init=} ;;
                rescue) RESCUE="rescue" ;;
        splash=*) PARAM="${PARAM} ${X}" ;;
        consol=*) PARAM="${PARAM} ${X}" ;;
        esac
done

if [ x${RESCUE} = xrescue ]
then
        busybox ash
fi

# Mount and switch root.
mount -o ro ${ROOT} /mnt
umount -f /sys || umount -l /sys
umount -f /proc || umount -l /proc

exec switch_root /mnt ${INIT} ${RUNLEVEL} ${PARAM}
Maciej Piechotka
quelle
1

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!

chiguire
quelle
hey das sieht eigentlich toll aus, ich muss es ausprobieren!
Phunehehe