Czy można umieścić root w LVM bez użycia initrd?

12

Właśnie skonfigurowałem system podstawowy Gentoo (co oznacza, że ​​mogę teraz uruchamiać system, logować się i robić z nim różne rzeczy). Moja partycja root znajduje się w wirtualnej grupie LVM2 (z oddzielną /bootpartycją). Aby uruchomić, muszę przekazać poniższe parametry do jądra:

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

Najwyraźniej używa początkowego ramdysku, aby coś zrobić (chyba ładowanie rzeczy LVM) przed zamontowaniem roota. Czy istnieje sposób, w jaki mogę umieścić ten kod w samym jądrze, aby nie był potrzebny initrd? Jeśli nie, to jak sam mogę wykonać initrd?

Przydałoby się dodać, że próbowałem skompilować jądro dla roota innego niż LVM, bez initrd i działało to idealnie. Potem próbowałem umieścić całość pod LVM i nie udało mi się uruchomić maszyny (chyba nie radzi sobie z LVM). Następnie użyłem genkernelnarzędzia z --lvmopcją i tworzy ono działające jądro i initrd, którego aktualnie używam.

Teraz chcę pominąć genkerneli zrobić wszystko sam, najlepiej bez initrd, aby maszyna uruchomiła się nieco szybciej (i tak nie potrzebuję elastyczności).

phunehehe
źródło
Initrd może mieć niewielki wpływ na czasy rozruchu, ale nie wpłynie to na wydajność twojego systemu po jego uruchomieniu.
Kristof Provost
och tak, właściwie miałem na myśli czas uruchomienia, zredagowany
phunehehe

Odpowiedzi:

6

Prosta odpowiedź: nie. Jeśli chcesz LVM, potrzebujesz initrd.

Ale jak powiedzieli wcześniej inni: LVM nie spowalniają twojego systemu ani nie robią nic złego w inny sposób, po prostu pozwalają ci stworzyć środowisko, które pozwala na załadowanie jądra i wykonanie jego zadania.

Initrd pozwala na załadowanie twojego jądra: Jeśli twoje jądro znajduje się na dysku LVM, całe środowisko LVM musi zostać ustanowione przed załadowaniem pliku binarnego zawierającego jądro.

Sprawdź wpis w Wikipedii dotyczący initrd, który wyjaśnia, co robi initrd i dlaczego go potrzebujesz.

Kolejna uwaga: rozumiem, że Twoim celem jest robienie rzeczy samemu, ale możesz zabrudzić sobie ręce nawet za pomocą genkernela. Użyj genkernel - menuconfig wszystko, a wszystko możesz w zasadzie ustawić tak, jakbyś budował jądro całkowicie bez obsługi narzędzi, genkernel po prostu dodaje dla ciebie make bzImage, tworzy moduły i tworzy moduły module_install i robi te paskudne rzeczy initrd.

Możesz oczywiście zbudować initrd sam, jak opisano tutaj dla initramfs lub tutaj dla initrd .

tante
źródło
Cóż, dziękuję za potwierdzenie, ale brakuje ci części „Jeśli nie, to jak mogę sam zrobić initrd?”
phunehehe,
Dodano kilka informacji i połączyłem moją drugą odpowiedź w jedną.
tante
8
Drobna poprawka: initrd nie jest używany do ładowania jądra : jądro jest ładowane przez bootloader (GRUB, LILO, cokolwiek); initrd jest rodzajem dysku RAM, który zapewnia początkowy główny system plików. Powinien zawierać wszystkie pliki binarne (np. Moduły jądra, programy wspierające przestrzeń użytkownika) potrzebne do faktycznego uruchomienia systemu. Dlatego jest potrzebny dla katalogu głównego LVM: podsystem LVM musi zostać zainicjowany, a jego inicjalizacja jest zbyt złożona, aby można go było wygodnie wykonać przy użyciu samych parametrów rozruchowych jądra; dlatego linuxrcskrypt w initrd wykonuje to zadanie.
Riccardo Murri
Masz oczywiście rację, byłem trochę niechlujny z moim frazowaniem.
tante
2
Nie można głosować z powodu dość dużego błędu w odpowiedzi (initrd nie pozwala na załadowanie jądra).
wzzrd
5

edycja: właśnie zdałem sobie sprawę, że próbujesz uruchomić LVM, nigdy nie konfigurowałem LVM, nigdy ich nie potrzebowałem, więc prawdopodobnie podejście tutaj może nie działać

Oto podstawowe zasady, które musisz zrobić, aby utworzyć jądro bez initrd (z pamięci, nie pamiętałem dokładnie):

  1. Ponownie skompiluj jądro, upewnij się, że zostało wbudowane w jądro (WAŻNE: nie jako moduł!):

    1. sterownik płyty głównej i sterownik dysku twardego (oba poniżej Device Drivers)
    2. Sterownik dla systemu plików /, /etc/*i /lib/modules/*(pod File systems)

    Zasadniczo jądro musi być w stanie zamontować główny system plików, odczytać plik / etc / fstab, załadować inne moduły sterowników (jeśli to konieczne) i zamontować inne systemy plików niż root, aby ukończyć resztę procesu uruchamiania. Jeśli masz bardziej zaangażowany proces uruchamiania, np. Rozruch sieciowy, musisz również wbudować te sterowniki.

  2. Wyłącz initrd z jądra „Konfiguracja ogólna> Obsługa początkowych systemów plików RAM i obsługi dysków RAM (initramfs / initrd)”, czyli CONFIG_BLK_DEV_INITRD = n.

  3. Zmodyfikuj konfigurację GRUB, nie potrzebujesz już init = i realroot =, i ustaw root =, aby wskazywał na urządzenie z systemem plików root.

Myślę, że to wszystko. Nie zapomnij zachować kopii zapasowej jądra i dobrej kopii rozruchowej płyty CD na wypadek, gdyby coś się wydarzyło.

Rzeczy, które mogą pójść nie tak: jeśli skompilowałeś złe sterowniki lub skompilowałeś podstawowe sterowniki jako moduł, wówczas jądro nie może odczytać systemu plików. Uruchom ponownie ze świeżym jądrem lub Live CD i ponownie skompiluj jądro z odpowiednimi sterownikami.

Jedyną trudną częścią jest ustalenie, który sterownik jest odpowiedni dla twojego sprzętu. Możesz użyć lspcii, lshwaby pomóc zidentyfikować swój sprzęt. Jeśli nie masz tych narzędzi, to emerge lshw pciutils.

Lie Ryan
źródło
+1 za wzmiankę o wbudowanym vs. module w kompilacji jądra.
amfetamachina
lsmodz działającego jądra jest również przydatne.
LawrenceC
2

Tak, potrzebujesz initrd. Dlatego:

Normalny proces rozruchu rozpoczyna się od bootloadera, który wie wystarczająco dużo o twoim systemie, aby znaleźć jądro i uruchomić je. (GRUB2 jest wystarczająco inteligentny, aby znaleźć jądro, które znajduje się na partycji LVM2 lub RAID, ale GRUB1 nie, więc zwykle zaleca się utworzenie / rozruchu jako oddzielnej partycji o uproszczonym układzie). Po załadowaniu jądro potrzebuje aby znaleźć główny system plików, aby mógł rozpocząć proces rozruchu. Jednak LVM nie może się uruchomić bez uruchomienia przez niektóre narzędzia przestrzeni użytkownika, które istnieją w głównym systemie plików, których nie można załadować bez narzędzi LVM, które istnieją w głównym systemie plików ...;)

Aby przerwać ten cykl, initrd lub initramfs to skompresowany system plików przechowywany z jądrem (w / boot lub w samym jądrze), który zawiera tylko tyle systemu Linux, aby uruchomić usługi takie jak LVM lub MD lub cokolwiek innego chcesz. Jest to tymczasowy system plików i działa tylko jako główny system plików wystarczająco długo, aby załadować prawdziwy root.

Jeśli chodzi o tworzenie jednego, większość dokumentacji na ten temat jest zadziwiająco przestarzała - na przykład lvm2create_initrd nie działa już nawet w Gentoo. (Założyłem to samo kilka miesięcy temu i musiałem przepisać skrypt, zanim otrzymałem z niego działający initrd.) Tworzenie własnych initramfów może być zabawne i jest to jedyny sposób na uzyskanie absolutnie minimalnego rozruchu proces (i poznaj tajniki uruchamiania systemu Linux w tym procesie), ale jest to dużo pracy.

Krótka odpowiedź: użyj Dracuta. Jest to nowy framework, który jest tworzony w celu generowania initramfs w przeważnie zautomatyzowany sposób, i jest w Portage. Dokumentacja jest nieco rzadka, ale jest jej wystarczająco dużo, aby to rozgryźć, i jest to zdecydowanie najłatwiejszy sposób na uzyskanie solidnego initramfs i root LVM.

p-statyczny
źródło
2

Chociaż nie można nie używać żadnego rodzaju initrd, możliwe jest, aby nie używać osobnych plików initrd. (Nigdy nie korzystałem z genkernela, więc nie mogę dać instrukcji).

Na przykład ustawiłem opcję:

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

Gdzie /usr/src/initrd.contentsw moim przypadku wygląda (mam 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

I /usr/src/initjest:

#!/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
źródło
1

Tak to jest.

Komplikacje wynikające z tworzenia i obsługi initrds stają się dyskusyjne, jeśli zainstalujesz i użyjesz grub2. Wiki grub2 http://grub.enbug.org/LVMandRAID opisuje, w jaki sposób możesz mieć swój / boot na lvm bez niczego więcej niż insmod lvm w grub.cfg, pliku konfiguracyjnym grub, dlatego nie potrzebujesz initrd.

grub2 teraz w wersji 1.98, ale wciąż w gałęzi eksperymentalnej w Gentoo. Można go jednak zainstalować w innym gnieździe i jest doskonale użyteczny.

Cieszyć się!

chiguire
źródło
hej, to naprawdę wygląda świetnie, muszę spróbować!
phunehehe