Dlaczego initramfs montuje główny system plików tylko do odczytu


12

Jaki jest powód montowania głównego systemu plików row initramfs (i initrd).

Na przykład przewodnik initramfs Gentoo montuje główny system plików za pomocą:

mount -o ro /dev/sda1 /mnt/root

Dlaczego nie następujące?

mount -o rw /dev/sda1 /mnt/root

Widzę, że istnieje prawdopodobnie dobry powód (i prawdopodobnie dotyczy switchroot), jednak wydaje się, że nie jest nigdzie udokumentowany.

Odpowiedzi:


19

Ramdysku (initrd) jest zazwyczaj wersja głównego systemu plików zawierających tylko to, co jest potrzebne do zamontowania rzeczywistego głównego systemu plików i rękę od startu do niego okrojoną.

Initrd istnieje, ponieważ we współczesnych systemach moduł ładujący nie może być wystarczająco inteligentny, aby niezawodnie znaleźć główny system plików. Jest tak wiele możliwości dla tak małego programu, jak program ładujący. Zastanów się nad rootem NFS, niestandardowymi kartami RAID itp. Moduł ładujący musi wykonywać swoją pracę tylko przy użyciu systemu BIOS plus dowolny kod, który można wcisnąć w sektor rozruchowy.

Initrd dostaje przechowywane gdzieś boot loader można znaleźć, i to na tyle mała, że dodatkowy kawałek przestrzeni, którą zajmuje z reguły nie przeszkadzają nikomu. (W małych systemach osadzonych zwykle nie ma „prawdziwego” katalogu głównego, tylko initrd.)

Initrd jest cenny: jego zawartość musi być zachowana w każdych warunkach, ponieważ jeśli initrd się zepsuje, system nie będzie mógł się uruchomić. Jednym z rozwiązań projektowych dokonanych przez jego projektantów w celu zapewnienia, że ​​moduł ładujący załaduje initrd tylko do odczytu. Istnieją również inne zasady, które działają w tym kierunku, takie jak w przypadku małych systemów, w których nie ma „prawdziwego” katalogu głównego, nadal montujesz osobno /tmp, /var/cachei takie do przechowywania rzeczy. Zmiana initrd jest wykonywana rzadko, a następnie powinna być wykonywana bardzo ostrożnie.

Wracając do zwykłego przypadku, gdy nie jest to prawdziwy główny system plików, to najpierw jest montowany tylko do odczytu, ponieważ initrd było. Następnie jest przechowywany tylko do odczytu tak długo, jak to możliwe, z tych samych powodów. Wszelkie zapisywanie w prawdziwym katalogu głównym, które należy wykonać, jest odkładane do momentu uruchomienia systemu, zgodnie z preferencjami, lub przynajmniej do późnej fazy uruchamiania, gdy preferencje te nie mogą być spełnione.

Najważniejszą rzeczą, która dzieje się w tej fazie tylko do odczytu, jest sprawdzenie, czy główny system plików jest sprawdzony, czy został odmontowany w sposób czysty. Jest to coś, co program ładujący mógłby zrobić zamiast pozostawić to initrd, ale co się stanie, jeśli główny system plików nie zostanie odmontowany w sposób czysty? Następnie musi zadzwonić, fsckaby sprawdzić i ewentualnie to naprawić. Więc, gdzie initrddostać fsck, jeśli był odpowiedzialny za tego kroku, zamiast czekać do przełączenia do „prawdziwego” root? Można powiedzieć, że musisz skopiować fsckdo initrdbudynku, ale teraz jest większy. A co więcej, co fsck skopiujesz? Systemy Linux regularnie używają kilkunastu różnych systemów plików. Czy kopiujesz tylko ten, który jest potrzebny dla prawdziwego roota w momencieinitrdjest tworzone? Czy przeskalujesz rozmiar initrd, kopiując do niego wszystkie dostępne fsck.fooprogramy, na wypadek, gdyby główny system plików został później migrowany do innego typu systemu plików i ktoś zapomniał przebudować initrd?

Architekci systemu rozruchowego Linux mądrze postanowili nie obciążać initrd tymi problemami. Delegowali sprawdzanie prawdziwego głównego systemu plików do prawdziwego głównego systemu plików, ponieważ jest on w lepszej sytuacji, aby to zrobić niż initrd.

Gdy proces rozruchu przebiegnie na tyle daleko, że można to zrobić bezpiecznie, initrd zostaje zamieniony spod prawdziwego katalogu głównego za pomocą pivot_root(8), a system plików jest ponownie zamontowany w trybie odczytu-zapisu.


4
Initramfs nie jest montowany tylko do odczytu; jądro rozpakowuje je do tmpfs do odczytu / zapisu zamontowanego jako /. Również pivot_root () jest używany w obecnie deprecjonowanym initrd, ale nie jest initramfs, z którego korzysta obecnie większość systemów (mimo że plik nadal ma nazwę initrd). Wraz z initrd pivot_root miał miejsce przed uruchomieniem / sbin / init, który przeszedł do fsck i ponownie zamontował r / w. W przypadku initramfs po prostu usuwa wszystkie pliki w initramfs, a następnie chroots do prawdziwego katalogu głównego i wykonuje polecenie / sbin / init.
psusi

0

Ponieważ podczas uruchamiania główny system plików jest zawsze początkowo montowany tylko do odczytu. Po zakończeniu różnych autotestów ponownie instaluje główny system plików jako odczyt / zapis i rozpoczyna montowanie innych systemów plików.


0

Jednym z powodów, o których mogę myśleć, jest zapobieganie jakiejś korupcji. Na przykład, możesz zamontować system plików ext4 jako ext2 (lub odwrotnie) i jest to bezpieczne w trybie ro, ale może powodować niezgodne zmiany formatu, jeśli zamontujesz rw z initram.

Aha, i jest jeszcze jeden powód: initramfs prawdopodobnie nie ma fsck, ale może być konieczne sprawdzenie systemu plików przed zamontowaniem go rw.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.