È possibile mettere root in LVM senza usare initrd?


12

Ho appena impostato un sistema di base Gentoo (il che significa che posso avviare e accedere e fare cose con esso ora). La mia partizione di root è in un gruppo virtuale LVM2 (con una /bootpartizione separata ). Per fare il boot ho bisogno di passare i parametri seguenti al kernel:

root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm

Apparentemente sta usando un ramdisk iniziale per fare qualcosa (immagino caricando le cose LVM) prima di montare root. C'è un modo in cui posso inserire questo codice nel kernel stesso in modo che non sia necessario initrd? In caso contrario, come posso creare l'inizrd da solo?

Potrebbe essere utile aggiungere che avevo provato a compilare il kernel per root non LVM, senza initrd e ha funzionato perfettamente. Quindi ho provato a mettere tutto sotto LVM e non sono riuscito ad avviare la macchina (suppongo che non possa gestire le cose LVM). Quindi ho usato lo genkernelstrumento con l' --lvmopzione e crea il kernel funzionante e initrd che sto attualmente usando.

Ora voglio saltare genkernele fare tutto da solo, preferibilmente senza initrd in modo che la macchina si avvii un po 'più velocemente (non ho bisogno della flessibilità comunque).


Un initrd potrebbe avere un piccolo effetto sui tempi di avvio, ma non influirà sulle prestazioni del tuo sistema una volta che è attivo e funzionante.
Kristof Provost,

oh sì, in realtà intendevo il tempo di avvio, modificato
phunehehe,

Risposte:


6

Risposta semplice: No. Se vuoi LVM hai bisogno di un initrd.

Ma come altri hanno già detto: i LVM non rallentano il sistema o non fanno nulla di male in un altro modo, ti permettono solo di creare un ambiente che consenta al kernel di caricarsi e fare il suo lavoro.

Initrd consente il caricamento del kernel: se il kernel si trova su un'unità LVM, è necessario stabilire l'intero ambiente LVM prima di poter caricare il file binario che contiene il kernel.

Controlla la voce di Wikipedia su initrd che spiega cosa fa initrd e perché ne hai bisogno.

Un'altra nota: vedo il punto nel voler fare le cose da soli, ma puoi sporcarti le mani anche con genkernel. Usa genkernel --menuconfig all e puoi praticamente impostare tutto come se volessi compilare il tuo kernel completamente senza il supporto degli strumenti, genkernel aggiunge semplicemente make bzImage, make moduli e make modules_install linee per te e fa quelle brutte cose di initrd.

Puoi ovviamente creare tu stesso initrd come è delineato qui per initramfs o qui per initrd .


Bene, grazie per la conferma, ma ti manca la parte "In caso contrario, come posso creare l'inizrd da solo?"
phunehehe,

Ho aggiunto alcune informazioni e ho unito la mia altra risposta in questa.
tante

8
Una correzione minore: initrd non è usato per caricare il kernel : il kernel è caricato dal bootloader (GRUB, LILO, qualunque cosa); initrd è un tipo di ram-disk che fornisce il filesystem di root iniziale. Dovrebbe contenere tutti i file binari (ad es. Moduli del kernel, programmi di supporto dello spazio utente) necessari per rendere effettivamente operativo il sistema. Questo è il motivo per cui è necessario per un root LVM: il sottosistema LVM deve essere inizializzato e la sua inizializzazione è troppo complessa per essere convenientemente eseguita solo con i parametri di avvio del kernel; pertanto, lo linuxrcscript in initrd esegue questa attività.
Riccardo Murri,

Hai ovviamente ragione, ero un po 'sciatto con il mio fraseggio.
tante il

2
Impossibile eseguire l'upgrade a causa di un errore piuttosto grave nella risposta (initrd non consente il caricamento del kernel).
wzzrd,

5

modifica: ho appena realizzato che stai provando ad avviare LVM, non ho mai installato un LVM, non ne ho mai avuto bisogno, quindi probabilmente l'approccio qui potrebbe non funzionare

Ecco le regole di base che devi fare per creare un kernel senza initrd (dalla memoria, non mi ricordavo esattamente):

  1. Ricompila il tuo kernel, assicurati di averlo integrato nel kernel (IMPORTANTE: non come modulo!):

    1. driver della scheda madre e driver del disco rigido (entrambi sotto Device Drivers)
    2. driver per file system per /, /etc/*e /lib/modules/*(sotto File systems)

    Fondamentalmente, il kernel deve essere in grado di montare il filesystem di root, leggere / etc / fstab, caricare altri moduli driver (se necessario) e montare altri filesystem non root per completare il resto del processo di avvio. Se si ha un processo di avvio più coinvolto, ad esempio l'avvio di rete, è necessario incorporare anche questi driver.

  2. Disabilita initrd dal kernel "Installazione generale> File system RAM iniziale e supporto disco RAM (initramfs / initrd)" aka CONFIG_BLK_DEV_INITRD = n.

  3. Modifica la configurazione di GRUB, non hai più bisogno di init = e realroot = e imposta root = in modo che punti al dispositivo del filesystem di root.

Penso sia tutto. Non dimenticare di conservare un kernel di backup e una buona copia di un Live CD avviabile, nel caso succeda qualcosa.

Cose che potrebbero andare storte: se hai compilato i driver sbagliati o se hai compilato i driver di base come modulo, il kernel non può leggere il filesystem. Riavviare con un kernel nuovo o con un Live CD e ricompilare un kernel con i driver corretti.

L'unica parte difficile è capire quale driver è rilevante per il tuo hardware. Puoi usare lspcie lshwper aiutare a identificare il tuo hardware. Se non hai già questi strumenti, allora emerge lshw pciutils.


+1 per menzionare il modulo integrato vs. il modulo nella compilazione del kernel.
anfetamachina

lsmodda un kernel in esecuzione è anche utile.
LawrenceC,

2

Sì, hai bisogno di un initrd. Ecco perché:

Il normale processo di avvio inizia con il bootloader, che conosce abbastanza bene il sistema per trovare il kernel ed eseguirlo. (GRUB2 è abbastanza intelligente da trovare un kernel che si trova su una partizione LVM2 o RAID, ma GRUB1 non lo è, quindi di solito si consiglia di creare / avviare una partizione separata con un layout semplificato.) Una volta caricato, il kernel ha bisogno per essere in grado di trovare il filesystem di root, in modo che possa avviare il processo di avvio. Tuttavia, LVM non può essere avviato senza essere attivato da alcuni strumenti di userspace, che esistono sul filesystem di root, che non possono essere caricati senza gli strumenti LVM, che esistono sul filesystem di root ...;)

Per interrompere questo ciclo, un initrd o initramfs è un filesystem compresso archiviato con il kernel (in / boot o all'interno del kernel stesso), che contiene appena un sistema Linux sufficiente per avviare servizi come LVM o MD o qualsiasi altra cosa tu vuoi. È un filesystem temporaneo e funge solo da filesystem di root abbastanza a lungo da poter caricare il vero root.

Per quanto riguarda il realizzarne uno, la maggior parte della documentazione sull'argomento è incredibilmente obsoleta: lvm2create_initrd, ad esempio, non funziona più nemmeno su Gentoo. (Ho impostato la stessa cosa qualche mese fa e ho dovuto riscrivere lo script prima di ottenere da esso un initrd funzionante.) Creare i tuoi initramfs può essere divertente, ed è l'unico modo per ottenere un avvio assolutamente minimo processo (e scopri i dettagli su come si avvia Linux nel processo), ma è un sacco di lavoro.

La risposta breve: usa Dracut. È un nuovo framework che viene creato per generare un initramfs in modo prevalentemente automatizzato ed è in portage. La documentazione è un po 'scarsa, ma ce n'è abbastanza là fuori per capire le cose, ed è di gran lunga il modo più semplice per ottenere un solido initramfs e una radice LVM.


2

Sebbene non sia possibile non utilizzare una sorta di initrd, è possibile non utilizzare file initrd separati. (Non ho mai usato genkernel quindi non posso dare istruzioni per questo).

Ad esempio ho impostato l'opzione:

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

Dove /usr/src/initrd.contentsnel mio caso sembra (ho 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

Ed /usr/src/initè:

#!/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}

1

Sì.

Le complicazioni che derivano dalla creazione e dalla gestione di initrd sono rese discutibili se si installa e si utilizza grub2. Il wiki di grub2 http://grub.enbug.org/LVMandRAID descrive come puoi avere / boot su lvm con nient'altro che un insmod lvm in grub.cfg, il file di configurazione di grub, quindi non c'è bisogno di un initrd.

grub2 ora alla versione 1.98 ma ancora nel ramo sperimentale in gentoo. Tuttavia, può essere installato in un altro slot ed è perfettamente utilizzabile.

Godere!


ehi, che sembra davvero fantastico, devo provarlo!
phunehehe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.