initrd(4)

NAZWA
initrd - dysk RAM inicjowany przez program rozruchowy

KONFIGURACJA
/dev/initrd jest urządzeniem blokowym tylko do odczytu, z przypisanym numerem głównym 1 i numerem pobocznym 250. Zwykle /dev/initrd jest własnością root:disk z trybem 0400 (dostęp do odczytu tylko przez roota). Jeśli system Linux nie posiada utworzonego /dev/initrd, można to uczynić następującymi poleceniami:

    mknod -m 400 /dev/initrd b 1 250
    chown root:disk /dev/initrd

Aby korzystać z /dev/initrd, konieczne jest wkompilowanie bezpośrednio w jądro Linux obsługi „RAM disk” oraz „Initial RAM disk” (tj. CONFIG_BLK_DEV_RAM=y i CONFIG_BLK_DEV_INITRD=y). Gdy korzysta się z /dev/initrd, sterownik dysku RAM nie może być załadowany jako moduł.

OPIS
Specjalny plik /dev/initrd jest urządzeniem blokowym tylko do odczytu. Urządzenie jest dyskiem RAM, które jest inicjowane (np. ładowane) przez program rozruchowy przed uruchomieniem jądra. Jądro może następnie użyć zawartości /dev/initrd, w trakcie uruchamiania systemu, składającego się z dwóch faz.

W pierwszej fazie rozruchu, jądro uruchamia i montuje pierwotny główny system plików z zawartości /dev/initrd (np. dysku RAM zainicjowanego przez program rozruchowy). W drugiej fazie dodatkowe sterowniki i inne moduły są ładowane z zawartości urządzenia pierwotnego urządzenia głównego. Po załadowaniu dodatkowych modułów, montowany jest nowy główny system plików (tj. zwykły korzeń systemu plików) z innego urządzenia.

  Działania rozruchowe
Jeśli rozruch następuje z użyciem initrd, wygląda to następująco:

(1) Program rozruchowy ładuje do pamięci program jądra i zawartość /dev/initrd.

(2) Przy uruchomieniu jądra, jądro rozpakowuje i kopiuje zawartość urządzenia /dev/initrd do urządzenia /dev/ram0, a następnie zwalnia pamięć użytą przez /dev/initrd.

(3) Jądro montuje następnie do odczytu i zapisu urządzenie /dev/ram0 jako pierwotny główny system plików.

(4) Jeśli wskazany zwykły korzeń systemu plików jest również pierwotnym głównym systemem plików (np. /dev/ram0) to jądro pomija ostatni krok zwykłej sekwencji rozruchowej.

(5) Jeśli w pierwotnym głównym systemie plików obecny jest plik wykonywalny /linuxrc, to /linuxrc jest wykonywany z identyfikatorem użytkownika równym 0 (plik /linuxrc musi mieć ustawione uprawnienie do wykonania; plik /linuxrc może być dowolnym prawidłowym plikiem wykonywalnym, w tym skryptem powłoki).

(6) Jeśli /linuxrc nie jest wykonywany lub gdy /linuxrc się zakończy, montowany jest zwykły korzeń systemu plików (jeśli /linuxrc wyjdzie z jakimkolwiek systemem plików zamontowanym w pierwotnym głównym systemie plików, to zachowanie jądra jest NIEZDEFINIOWANE; zob rozdział UWAGI, aby zapoznać się z bieżącym zachowaniem jądra).

(7) Jeśli zwykły korzeń systemu plików posiada katalog /initrd, to urządzenie /dev/ram0 jest przemieszczane z / do /initrd. W innym przypadku, jeśli katalog /initrd nie istnieje, urządzenie /dev/ram0 jest odmontowywane (przy przemieszczaniu z / do /initrd, /dev/ram0 nie jest odmontowywane, zatem mogą pozostać procesy działające z /dev/ram0; jeśli katalog /initrd nie istnieje na zwykłym korzeniu systemu plików i pozostaną jakieś procesy działające z /dev/ram0, gdy /linuxrc wyjdzie, zachowanie jądra jest NIEZDEFINIOWANE; zob rozdział UWAGI, aby zapoznać się z bieżącym zachowaniem jądra).

(8) Na zwykłym korzeniu systemu plików dokonywana jest zwykła sekwencja rozruchowa (np. wywołanie /sbin/init).

  Opcje
Gdy korzysta się z initrd, wpływ na działanie w trakcie uruchomienia jądra, mają następujące opcje z programu rozruchowego:

initrd=nazwa-pliku
    Określa plik, z którego załadowana zostanie zawartość /dev/initrd. W przypadku LOADLIN jest to opcja wiersza poleceń. W LILO konieczne jest użycie tego polecenia w pliku konfiguracyjnym LILO /etc/lilo.config. Nazwa pliku podana w tej opcji będzie zwykle skompresowanym za pomocą gzip obrazem systemu plików.

noinitrd
    Opcja rozruchowa wyłącza rozruch składający się z dwóch faz. Jądro wykonuje zwykłą sekwencję rozruchową, jak gdyby /dev/initrd nie był zainicjowany. Dzięki tej opcji, zawartość /dev/initrd załadowana do pamięci przez program rozruchowy jest zachowywana. Opcja pozwala, aby zawartością /dev/initrd były dowolne dane, niekonieczne obraz systemu plików. Jednak urządzenie /dev/initrd jest tylko do odczytu i może być odczytane jedynie jednokrotnie po uruchomieniu systemu.

root=nazwa-urządzenia
    Określa urządzenie, które będzie służyło jako zwykły główny system plików. W przypadku LOADLIN jest to opcja wiersza poleceń. W LILO konieczne jest użycie tego polecenia w pliku konfiguracyjnym LILO /etc/lilo.config. Urządzenie podane w tej opcji musi być urządzeniem do zamontowania, posiadającym odpowiedni główny system plików.

  Zmienianie zwykłego głównego systemu plików
Domyślnie, w przypadku zwykłych głównych systemów plików, używane są ustawienia jądra (np. ustawione w pliku jądra za pomocą rdev(8) lub wkompilowane w plik jądra) lub opcje programu rozruchowego. W przypadku zwykłego głównego systemu plików montowanego jako NFS, konieczne jest użycie opcji rozruchowych nfs_root_name i nfs_root_addrs, aby przekazać ustawienia NFS. Więcej informacji o głównym systemie plików jako NFS znajduje się w pliku dokumentacji jądra Documentation/filesystems/nfs/nfsroot.rst. Więcej informacji o ustawieniach głównego systemu plików znajduje się też w dokumentacji LILO i LOADLIN.

Możliwe jest również, aby plik wykonywalny /linuxrc zmienił zwykłe urządzenie główne. Aby /linuxrc mógł zmienić zwykłe urządzenie główne, musi być zamontowany /proc. Po zamontowaniu /proc, /linuxrc zmienia zwykłe urządzenie główne zapisując do plików proc: /proc/sys/kernel/real-root-dev, /proc/sys/kernel/nfs-root-name oraz /proc/sys/kernel/nfs-root-addrs. W przypadku fizycznego urządzenia głównego, urządzenie główne jest zmieniane, przez zapisanie przez /linuxrc numeru urządzenia nowego korzenia systemu plików do pliku /proc/sys/kernel/real-root-dev. W przypadku głównego systemu plików na NFS, urządzenie główne jest zmieniane przez zapisanie przez /linuxrc ustawień NFS do plików /proc/sys/kernel/nfs-root-name oraz /proc/sys/kernel/nfs-root-addrs, a następnie zapisanie 0xff (np. numeru pseudourządzenia NFS) do pliku /proc/sys/kernel/real-root-dev. Przykładowo, poniższy wiersz polecenia powłoki zmieniłby zwykłe urządzenie główne na /dev/hdb1:

    echo 0x365 >/proc/sys/kernel/real-root-dev

W przykładzie dla NFS, poniższe wiersze poleceń powłoki zmieniłyby zwykłe urządzenie główne na katalog NFS /var/nfsroot na serwerze NFS sieci lokalnej, o numerze IP 193.8.232.7, dla systemu o numerze IP 193.8.232.2, o nazwie „idefix”:

    echo /var/nfsroot >/proc/sys/kernel/nfs-root-name
    echo 193.8.232.2:193.8.232.7::255.255.255.0:idefix \
        >/proc/sys/kernel/nfs-root-addrs
    echo 255 >/proc/sys/kernel/real-root-dev

Uwaga: Korzystanie z /proc/sys/kernel/real-root-dev do zmiany głównego systemu plików jest przestarzałe. Plik Documentation/admin-guide/initrd.rst w źródłach jądra Linux oraz podręczniki pivot_root(2) i pivot_root(8) opisują współczesne metody zmieniania głównego systemu plików.

  Użycie
Główną motywacją implementacji initrd było umożliwienie, aby konfiguracja jądra była modularna przy instalacji systemu.

Oto możliwy scenariusz instalacji systemu:

(1) Program rozruchowy jest uruchamiany z dyskietki lub innego nośnika z minimalnym jądrem (np. z obsługą /dev/ram, /dev/initrd oraz systemu plików ext2) i ładuje /dev/initrd ze spakowaną gzip wersją pierwotnego systemu plików.

(2) Plik wykonywalny /linuxrc określa, co jest wymagane do (1) zamontowania zwykłego głównego systemu plików (tj. typ urządzenia, sterowniki urządzenia, system plików) oraz (2) nośnika instalacyjny (np. płyta, sieć, taśma, ...). Może tego dokonać pytając użytkownika, sprawdzając samemu lub łącząc te dwa podejścia.

(3) Plik wykonywalny /linuxrc ładuje wymagane moduły dla początkowego głównego systemu plików.

(4) Plik wykonywalny /linuxrc tworzy i wypełnia główny system plików (na tym etapie zwykły główny system plików nie musi być jeszcze kompletny).

(5) Plik wykonywalny /linuxrc ustawia /proc/sys/kernel/real-root-dev, odmontowuje /proc, zwykły główny system plików i inne zamontowane przez niego systemy plików, a następnie kończy działanie.

(6) Następnie jądro montuje zwykły główny system plików.

(7) System plików jest teraz dostępny i kompletny, zatem można zainstalować program rozruchowy.

(8) Program rozruchowy jest konfigurowany do załadowania do /dev/initrd systemu plików, który ma zbiór modułów, których użyto do uruchomienia systemu (np. urządzenie /dev/ram0 może być zmodyfikowane, następnie odmontowane, a na końcu obraz jest zapisywany z /dev/ram0 do pliku).

(9) System jest teraz gotowy do rozruchu i mogą nastąpić dodatkowe zadania instalacyjne.

Kluczową rolą /dev/initrd w powyższym opisie jest korzystanie z danych konfiguracyjnych ze zwykłego działania systemu, bez konieczności: początkowego wyboru jądra, korzystania z przeładowanego jądra uniwersalnego lub rekompilacji jądra.

Drugi scenariusz występuje w przypadku instalacji, gdy Linux działa na systemach z różnymi konfiguracjami sprzętowymi, w jednolicie administrowanej sieci. W takich przypadkach, może być pożądane, aby korzystać z niewielkiego zbioru jąder (a najlepiej jednego) i minimalizować wielkość informacji konfiguracyjnych danego systemu. Wówczas odmienny może być tylko plik /linuxrc albo plik przez /linuxrc wykonywany.

Trzeci scenariusz to poręczniejsze dyski odzyskiwania. Ponieważ informacje takie jak położenie partycji głównego systemu plików nie są wymagane w czasie rozruchu, system załadowany z /dev/initrd może wyświetlić pytanie i/lub skorzystać z autowykrywania, ewentualnie sprawdzając je następnie.

W końcu, co nie mniej istotne, dystrybucje Linuksa na płytach mogą korzystać z initrd w celu łatwej instalacji z tego nośnika. Dystrybucja może użyć LOADLIN, aby bezpośrednio załadować /dev/initrd z płyty, bez konieczności korzystania z dyskietek. Dystrybucja może też korzystać z dyskietki rozruchowej LILO, a następnie załadować (poprzez bootstrap) większy dysk RAM za pomocą /dev/initrd z płyty.

PLIKI
/dev/initrd
/dev/ram0
/linuxrc
/initrd

UWAGI

•   W bieżącym jądrze, wszelkie systemy plików, które pozostaną zamontowane przy przeniesieniu /dev/ram0 z / do /initrd będą wciąż dostępne. Wpisy /proc/mounts nie są jednak aktualizowane.

•   W bieżącym jądrze, jeśli katalog /initrd nie istnieje, to /dev/ram0 nie zostanie w pełni odmontowane, jeśli /dev/ram0 jest używany przez jakikolwiek proces lub zamontowano w nim system plików. Jeśli /dev/ram0 nie jest w pełni odmontowane, to /dev/ram0 pozostanie w pamięci.

•   Użytkownicy /dev/initrd nie powinni polegać na zachowaniu opisanym w powyższych uwagach. Może się ono zmienić w kolejnych wersjach jądra Linux.

ZOBACZ TAKŻE
chown(1), mknod(1), ram(4), freeramdisk(8), rdev(8)

Documentation/admin-guide/initrd.rst w drzewie źródeł jądra Linux, dokumentacja LILO, dokumentacja LOADLIN, dokumentacja SYSLINUX

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.