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ą /boot
partycją). 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 genkernel
narzędzia z --lvm
opcją i tworzy ono działające jądro i initrd, którego aktualnie używam.
Teraz chcę pominąć genkernel
i zrobić wszystko sam, najlepiej bez initrd, aby maszyna uruchomiła się nieco szybciej (i tak nie potrzebuję elastyczności).
Odpowiedzi:
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 .
źródło
linuxrc
skrypt w initrd wykonuje to zadanie.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):
Ponownie skompiluj jądro, upewnij się, że zostało wbudowane w jądro (WAŻNE: nie jako moduł!):
Device Drivers
)/
,/etc/*
i/lib/modules/*
(podFile 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.
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.
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ć
lspci
i,lshw
aby pomóc zidentyfikować swój sprzęt. Jeśli nie masz tych narzędzi, toemerge lshw pciutils
.źródło
lsmod
z działającego jądra jest również przydatne.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.
źródło
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ę:
Gdzie
/usr/src/initrd.contents
w moim przypadku wygląda (mam LVM + tuxonice + fbsplash):I
/usr/src/init
jest:źródło
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ę!
źródło