Dowiedziałem się, że jeśli wybiorę jffs
lub sd
jako system plików (i nie initramfs
), rozmiar jądra będzie bardzo mały (1,4 MB w porównaniu z tym, initramfs
który wynosi 3,4 MB). Oznacza to, że initramfs
zajmuje dużo miejsca. Więc jeśli mogę, całkowicie go usunę, a więc będę miał bardzo małe jądro, czego chcę.
Podstawowe pytanie, które pojawia się w moim umyśle, brzmi: dlaczego potrzebuję initramfs
? Czy jądro Linuksa nie może zostać uruchomione bez początkowego systemu plików?
Moja aplikacja końcowa wykona tylko obliczenia i komunikację - w ogóle nie będzie pamięci. Więc system operacyjny bez systemu plików ma sens - przynajmniej dla mojej aplikacji.
/root
- to wszystko. Jedyną rzeczą, którą robi inaczej, jestswitch_root
jednak to, że pod warunkiem zachowania odpowiednich środków ostrożności przy niektórych załadowanych modułach jądra, można to zrobić w dowolnym momencie. Initramfs jest niczym więcej niż obrazem dysku - wypełnionym lub nie, jest tam. I nigdy nie jesteś bez niego - w końcu to Twój korzeń. Myślę, że nie powinna to być tajemnica i nie podoba mi się niepotrzebne zamieszanie wokół niej.Odpowiedzi:
Wzrost rozmiaru posiadania initramfs nie jest spowodowany sterownikiem ramfs (to tylko kilka KB, i tak jest potrzebne do innych rzeczy), ale samym initramfs. Initramfs zawiera programy niezbędne do złożenia i zamontowania prawdziwego systemu plików root.
Initramfs znacznie ułatwia, aw niektórych przypadkach umożliwia (np. Szyfrowanie
/
), uruchomienie systemu. Zdecydowanie zaleca się trzymanie go na sprzęcie typu PC z dużą ilością urządzeń peryferyjnych z możliwością podłączenia podczas pracy. Z drugiej strony sensowne jest uruchamianie urządzenia osadzonego bez żadnych initramfs, z jądrem obsługującym konkretną konfigurację sprzętową, dla której został zbudowany.Jądro oczywiście wymaga rozruchu do systemu plików: musi istnieć sposób załadowania dowolnej aplikacji, którą chcesz uruchomić. Jeśli nie zamierzasz nic uruchamiać, równie dobrze możesz wyłączyć maszynę.
Jeśli nie chcesz używać initramfs, po prostu powiedz swojemu programowi ładującemu, aby go nie przekazywał. Oczywiście nie dołączaj też jednego z danych wyjściowych kompilacji jądra - jak to się dzieje, jeśli w ogóle zależy od architektury i programu ładującego: na przykład
vmlinux
ibzImage
nie włączaj initramfs (odpowiednio jądro surowe i skompresowane ), aleuImage
(dla U-Boot) pakuje zarówno jądro, jak i initramfs, jeśli taki istnieje.(Technicznie, jak zauważa mikeserv , zawsze jest initramfs - ale domyślnie jest to puste, 134-bajtowe archiwum. To, co widzisz i czego chcesz się pozbyć, to „prawdziwe”, niepuste initramfy utworzone przez proces kompilacji i zawierający narzędzia, które są następnie używane do montowania głównego systemu plików).
Pamiętaj, że initramfs może być rozsądnym sposobem na stworzenie systemu pojedynczej aplikacji bez trwałych danych: włóż całą aplikację do initramfs, uruchom ją i zachowaj. Ułatwia to uporządkowanie trwałego magazynu lub obrazu rozruchowego (wszystko czego potrzebujesz to jądro i initramfs, które można spakować). Istnieją jednak wady tego podejścia: wszystkie dane w initramfs będą trwale przechowywane w pamięci RAM i nie można łatwo modyfikować plików w obrazie rozruchowym, należy odbudować archiwum.
źródło
Z BAEL :
...
...
Inne źródło www.kernel.org
Oprócz tego istnieje wiele systemów Linux, które lubią routery, które nie używają initramfs.
źródło
Potrzebujesz initramfs do bardziej skomplikowanych konfiguracji, takich jak rozruch sieciowy, lvm lub raid, ponieważ wymagają one narzędzi trybu użytkownika do skonfigurowania dostępu do root fs. W przypadku prostej, konwencjonalnej partycji na dysku, o ile masz wbudowane sterowniki dyskowe w jądrze i określasz argument root według ścieżki urządzenia zamiast UUID, możesz zrobić to bez initramfs. Oczywiście ścieżka urządzenia może ulec zmianie, w zależności od podłączonych urządzeń typu plug and play (tj. Usb), a nawet po prostu losowych różnic czasowych, dlatego prawie wszyscy używają uuids i initramfs dla niezawodności.
źródło
To stare pytanie, ale nadal nie wydaje się, że ma akceptowaną odpowiedź, więc wyrzucę to tutaj (nie jestem tutaj ekspertem, staram się to sobie wymyślić).
Od https://www.kernel.org/doc/Documentation/early-userspace/README (do samego końca, który mówi, że nie był aktualizowany od 2004 r.)
Co do tego, co jest warte, uważam, że urządzenia / dystrybucje takie jak Raspberry Pi itp. Nie używają initramfs; w niektórych przypadkach jądro znajduje się na partycji głównej (montowanej przez bootloader, który ma wymagane moduły fs). W innych przypadkach, gdy jądro znajduje się np. na
/boot
partycji, dostęp do initramfs na tej samej partycji można uzyskać bezpośrednio przed zamontowaniem rootfs jak inni stwierdzili.W niektórych przypadkach initramfs mogą być wbudowane w ten sam plik co jądro, ale nie zawsze tak jest. (a) wydaje się dość wyraźnie stwierdzać, że w niektórych przypadkach initramfs nie jest konieczne.
źródło
Uważam, że następujące wyjaśnienie bardziej jasne,
źródło
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
(lubtmpfs
, 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żyjetmpfs
zamiastramfs
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ębnianerootfs
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:
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:
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.
źródło
do_mounts.c
szczególnościprepare_namespace
, w którejsaved_root_name
jest zapełnianyroot=
argumentem wiersza poleceń.