Czy podczas uruchamiania ładowane jest całe jądro?

14

Przeczytałem ten popularny dokument IBM (widzę, że jest to często używane w Internecie), wyjaśniając funkcję początkowego dysku RAM.

Uderzyłem w ścianę, wyobrażając sobie, jak to działa.

W dokumencie jest napisane

Program ładujący, taki jak GRUB, identyfikuje jądro, które ma zostać załadowane, i kopiuje ten obraz jądra i wszelkie powiązane initrd do pamięci

Jestem już zdezorientowany: czy kopiuje całe jądro do pamięci czy tylko jego część? Jeśli całe jądro jest w pamięci, dlaczego potrzebujemy nawet początkowego dysku RAM?

Myślałem, że celem initrd jest mieć mały ogólny obraz jądra i initrd zainstaluje w nim odpowiednie moduły przed załadowaniem obrazu jądra. Ale jeśli całe jądro jest już w pamięci, dlaczego potrzebujemy initrd?

Przywołuje to również inną sprawę, która mnie dezorientuje - gdzie znajdują się moduły ładowane do jądra? Czy wszystkie moduły jądra są przechowywane w initrd?

użytkownik1028270
źródło
Tak. Całe jądro. I jego pierwsze rootfy. Ale jądra Linuksa nie używały initrd od wielu lat.
mikeserv
Właśnie to czytałem. Został w dużej mierze zastąpiony przez initramfs, prawda? I czy nadal jest podobny proces z initramfs, prawda?
user1028270,
1
został całkowicie zastąpiony dla wszystkich jąder od serii 2.6. Ale proces jest nieco podobny, z tym wyjątkiem, że initramfs nigdy nie jest odmontowany - zawsze jest obecny i zawsze jest również rootowany. Właściwie musisz zamontować nad nim roota. Korzyścią jest również brak konieczności emulacji osobnego urządzenia blokowego i podobnych.
mikeserv
Fajnie, przeczytam ten artykuł, do którego linkujesz. Więc moduły jądra są przechowywane w rootfach initramfs?
user1028270,
1
@edwardtorvalds - to wszystko obsługiwane jest udevzwykle i tak automatycznie.
mikeserv

Odpowiedzi:

17

Całe jądro jest ładowane do pamięci podczas rozruchu, zwykle razem z initramfsobecnie. (Nadal możliwe jest skonfigurowanie systemu do uruchamiania bez, initramfsale jest to niezwykłe na komputerach stacjonarnych i serwerach).

initramfs„S zadaniem jest zapewnienie funkcjonalności potrzebne do montażu«prawdziwego»systemu plików i kontynuowanie uruchamiania systemu. Dotyczy to modułów jądra, a także różnych plików binarnych: potrzebujesz przynajmniej udevsieci, i kmodktóry ładuje moduły.

Moduły można załadować do jądra później niż po prostu uruchomić, więc nie ma specjalnego przygotowania jądra przez initramfs. Mogą one być przechowywane w dowolnym miejscu: the initramfs, /lib/modulesna rzeczywistym systemie plików, w drzewie rozwoju jeśli opracowanie modułu ... The initramfstylko musi zawierać moduły, które są niezbędne do zamontowania głównego systemu plików (który zawiera resztę).

Stephen Kitt
źródło
OK, to ma dla mnie sens. Wydaje mi się, że łączyłem obraz jądra z używanym przez niego systemem plików, które oczywiście są całkowicie oddzielne.
user1028270,
5

Całe jądro (ale nie jego moduły) zostanie załadowane do pamięci. Jeśli istnieją moduły, których jądro będzie potrzebowało, zanim jakiekolwiek systemy plików będą dostępne (zazwyczaj oznacza to sterowniki systemów plików i ich urządzeń), wówczas moduły te będą w initramfs (w pamięci), a jądro załaduje je stamtąd. Inne moduły można załadować później z systemu plików.

Toby Speight
źródło
3

Jądro we współczesnych konfiguracjach Linuksa jest w dużej mierze oparte na modułach, tj. Właściwe jądro (ładowane podczas rozruchu do pamięci RAM) zawiera jedynie minimalną funkcjonalność, a cała reszta jest kompilowana jako moduły (ładowane w czasie wykonywania). Aby działało to nawet wtedy, gdy np. Urządzeniami lub systemami plików wymaganymi do rozruchu są moduły, a initramfsładowane jest jądro (jak sama nazwa wskazuje, jest to obszar pamięci RAM z prostym systemem plików, montowanym podczas rozruchu). Tymczasowy system plików jest zamontowany /i zawiera programy startowe oraz wymagane moduły. Po zakończeniu uruchamiania initramfsLinux wykonuje polecenie a pivot_root(8), przeszukując rzeczywistość /i podrzucając initramfszawartość.

Istotą tej złożoności jest to, że np. Dystrybucja może skompilować jedno jądro (minimalne jądro i pełny zestaw modułów), a po instalacji jądra stworzyć initramfsdostosowany do sprzętu i konfiguracji komputera docelowego. Wszystko to jest wymagane ze względu na ogromną różnorodność urządzeń i konfiguracji „komputerów osobistych”.

vonbrand
źródło
To nie robi pivot_root.
mikeserv