Bez względu na to, co robisz, masz initramfs
. Bez tego nie można się obejść - jest to jedyny narzucony system plików. Z kernel.org :
Co to jest rootfs?
Rootfs
jest specjalną instancją ramfs
(lub tmpfs
, jeśli jest włączona), która
zawsze występuje w systemach 2.6. Nie można odmontowaćrootfs
z mniej więcej tego samego powodu, dla którego nie można zabić procesu inicjowania; zamiast specjalnego kodu do sprawdzania i obsługi pustej listy, jądro jest mniejsze i prostsze, aby upewnić się, że niektóre listy nie będą puste.
Większość systemów po prostu montuje inny system plików rootfs
i ignoruje go. Ilość miejsca, które zajmuje pusta instancja ramfs, jest niewielka.
Jeśli * CONFIG_TMPFS * jest włączony, rootfs
użyje tmpfs
zamiast ramfs
niego domyślnie. Aby wymusić ramfs
, dodaj "rootfstype=ramfs"
do wiersza poleceń jądra.
Co to jest initramfs?
Wszystkie jądra Linuksa 2.6 zawierają"cpio"
archiwum w formaciegzip, do którego jest wyodrębniane rootfs
po uruchomieniu jądra. Po rozpakowaniu jądro sprawdza, czyrootfs
zawiera plik"init"
, a jeśli tak, to wykonuje go jako PID 1. Jeśli zostanie znaleziony,init
procestenjest odpowiedzialny za podniesienie systemu do końca, w tym zlokalizowanie i zamontowanie prawdziwego urządzenia root ( Jeśli w ogóle). Jeślipowyodrębnieniuosadzonegoarchiwumrootfs
nie zawierainit
programucpio
, jądro przejdzie do starszego kodu w celu zlokalizowania i zamontowania partycji głównej, a następnie wykona jakiś wariant/sbin/init
z tego.
Wszystko to różni się od starego initrd na kilka sposobów:
Stary initrd był zawsze osobnym plikiem, podczas gdy archiwum initramfs jest połączone z obrazem jądra Linuksa. (Katalog linux - * / usr poświęcony jest generowaniu tego archiwum podczas kompilacji).
Stary plik initrd był obrazem systemu plików spakowanym gzipem (w pewnym formacie pliku, takim jak ext2, który wymagał sterownika wbudowanego w jądro), podczas gdy nowe archiwum initramfs jest spakowanym gzip archiwum cpio (podobnie jak tar tylko prościej, patrz cpio (1) oraz Documentation / early-userspace / buffer-format.txt). Kod wyodrębniania cpio jądra jest nie tylko bardzo mały, ale także __init tekst i dane, które można usunąć podczas procesu uruchamiania.
Program uruchamiany przez stary initrd (który nazywał się / initrd, not / init) wykonał trochę instalacji, a następnie wrócił do jądra, podczas gdy program init z initramfs nie powinien wrócić do jądra. (Jeśli / init musi przekazać kontrolę, może przełączyć się na / z nowym urządzeniem root i uruchomić inny program init. Zobacz narzędzie switch_root poniżej.)
Podczas przełączania innego urządzenia root, initrd pivot_root, a następnie podłącza ramdysk. Ale initramfs to rootfs: nie można ani rootfs przestawić_ roota, ani odmontować go. Zamiast tego usuń wszystko z rootfów, aby zwolnić miejsce (znajdź -xdev / -exec rm '{}' ';'), zamontuj rootfsy z nowym rootem (cd / newmount; mount --move. /; Chroot.), dołącz stdin / stdout / stderr do nowego / dev / console i uruchom nową init.
Ponieważ jest to wyjątkowo persnickety proces (i polega na usuwaniu poleceń przed ich uruchomieniem), pakiet klibc wprowadził program pomocniczy (utils / run_init.c), aby zrobić to wszystko za Ciebie. Większość innych pakietów (takich jak busybox) nazwała tę komendę „switch_root”.
Wypełnianie initramfs:
Proces budowania jądra 2.6 zawsze tworzy spakowane archiwum initramfs w formacie cpio i łączy je z wynikowym plikiem binarnym jądra. Domyślnie to archiwum jest puste (zużywa 134 bajty na x86).
Opcji konfiguracyjnej CONFIG_INITRAMFS_SOURCE (w Ustawieniach ogólnych w menuconfig i mieszkaniu w usr / Kconfig) można użyć do określenia źródła dla archiwum initramfs, które zostanie automatycznie włączone do wynikowego pliku binarnego. Ta opcja może wskazywać na istniejące spakowane gzip archiwum cpio, katalog zawierający pliki do zarchiwizowania lub specyfikację pliku tekstowego, na przykład w następującym przykładzie:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Uruchom „usr / gen_init_cpio” (po kompilacji jądra), aby otrzymać komunikat o użytkowaniu dokumentujący powyższy format pliku.
Jedną z zalet pliku konfiguracyjnego jest to, że dostęp do konta root nie jest wymagany do ustawiania uprawnień ani tworzenia węzłów urządzeń w nowym archiwum. (Zauważ, że te dwa przykładowe wpisy „file” spodziewają się znaleźć pliki o nazwach „init.sh” i „busybox” w katalogu o nazwie „initramfs”, w katalogu linux-2.6. *. Aby uzyskać więcej informacji, zobacz Dokumentacja / wczesna przestrzeń użytkownika / README więcej szczegółów.)
Jądro nie zależy od zewnętrznych narzędzi CPIO. Jeśli podasz katalog zamiast pliku konfiguracyjnego, infrastruktura kompilacji jądra utworzy plik konfiguracyjny z tego katalogu (usr / Makefile wywołuje skrypty / gen_initramfs_list.sh), i przechodzi do spakowania tego katalogu za pomocą pliku konfiguracyjnego (poprzez przekazanie go do usr / gen_init_cpio, który jest tworzony z usr / gen_init_cpio.c). Kod tworzenia cpio jądra w czasie kompilacji jest całkowicie samowystarczalny, a ekstraktor czasu rozruchu jądra jest (oczywiście) samowystarczalny.