Dlaczego w niektórych systemach Linux główny system plików pojawia się jako / dev / root zamiast / dev / <real device node> w mtab?

11

Widziałem na różnych systemach Linux, w których zamiast rzeczywistego węzła urządzenia (na przykład /dev/sda1:), urządzenie root pojawia się jako /dev/root, lub zamiast prawdziwego systemu plików, mtabmówi, że jest to system plików o nazwie rootfs(który pojawia się jako prawdziwy system plików /proc/filesystems, ale nie ma kodu <linux-kernel-source-tree>/fs). Wprowadzono różne narzędzia do korzystania z niektórych atrybutów w celu określenia rzeczywistego węzła urządzenia głównego (takiego jak rdev i rootdev systemu operacyjnego Chromium). Nie mogę znaleźć logicznego wytłumaczenia tego innego niż przeczytanie gdzieś, że bardzo małe urządzenia wbudowane nie zawsze muszą mieć /devwęzeł urządzenia dla swojego urządzenia root. (Czy to prawda, a jeśli tak, czy to odpowiedź na moje pytanie?) Dlaczego czasami mtab mówi /dev/root(i myślę, że mogłem to zobaczyćrootdevraz) zamiast rzeczywistego węzła urządzenia i jak mogę sprawić, by zawsze mówił prawdziwy węzeł urządzenia? Jądro najpierw montuje urządzenie root zgodnie z rootparametrem w cmdline, a następnie init/systemdmontuje je ponownie zgodnie z fstab, prawda? Jeśli tak, to zakładam, że initutrzymuje mtab. Jeśli moja teoria jest poprawna, jak mogę initnapisać do prawdziwego węzła urządzenia głównego mtab? Zauważyłem, że /etc/mtabtak naprawdę jest to dowiązanie symboliczne /proc/mounts, co oznacza mtab, że jądro utrzymuje je. Jak więc skonfigurować / załączyć jądro, aby zamiast mówić, że ścieżka do węzła urządzeń głównych /dev/rootma mtabzawierać rzeczywisty węzeł urządzenia?

Pałka policjanta
źródło

Odpowiedzi:

4

Jest to ogólnie artefakt użycia initramfs.

Z dokumentacji jądra ( https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt )

Co to jest rootfs?

Rootfs to specjalna instancja ramfs (lub tmpfs, jeśli jest włączona), która zawsze występuje w systemach 2.6. Nie można odmontować rootfów z mniej więcej tego samego powodu, dla którego nie można zabić procesu init; 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 na rootfach i ignoruje go. Ilość miejsca, które zajmuje pusta instancja ramfs, jest niewielka.

Tak rootfsjest główny system plików, który został stworzony dla initramfs i nie można go odmontować.

Jeśli chodzi o /dev/root, jestem mniej pewny, ale jeśli dobrze pamiętam, /dev/rootjest tworzony poprawnie przy użyciu initrd (nie to samo co initramfs).

Patrick
źródło
mountdaje rootfs on / type rootfs (rw)dla initrd i /dev/root on / type ext2 (rw,relatime,block_validity,barrier,user_xattr)dla dysku twardego ext2 przy tej konfiguracji .
Ciro Santilli 30 病毒 审查 六四 事件 法轮功
/dev/rootjest używany przez niektóre implementacje initramfs, ale nie przez inne - w tych przypadkach nie jest to spowodowane jądrem. Gdy nie używa initramfs, wydaje się, że jest to wartość zastępcza używana przez jądro. (Być może można go jednak usunąć w późniejszej wersji jądra). stackoverflow.com/questions/37310046/…
sourcejedi
3

Gentoo ma łatkę, która właśnie to robi (zapewnia pokazanie prawdziwego urządzenia root). Można go znaleźć tutaj: https://lkml.org/lkml/2013/1/31/574

Milos Ivanovic
źródło
2

W systemie Linux, /dev/rootjeśli jest obecny, jest dowiązaniem symbolicznym do rzeczywistego urządzenia utworzonego w czasie uruchamiania.

Możesz użyć readlink /dev/rootlub, cat /proc/cmdlineaby zobaczyć rootparametr uruchomionego jądra, a tym samym znaleźć prawdziwe urządzenie za nim.

Od człowieka dracut(8)

Jednak, aby kontynuować udany rozruch, celem jest zlokalizowanie woluminu głównego i utworzenie dowiązania symbolicznego / dev / root wskazującego system plików.

Rui F. Ribeiro
źródło
Nie jestem do końca pewien, czy /dev/rootjest artefaktem dystrybucji opartych na RedHat.
Rui F Ribeiro
Cóż, mój Debian 8 nie ma /dev/root/. Na starym CentOS wydaje się, że jest to rzeczywisty węzeł urządzenia zamiast dowiązania symbolicznego.
ilkkachu
1
Cóż, w base-filesprzepisie OpenEmbedded jestfstab mowa o tym /dev/root, więc nie używają go tylko dystrybutorzy pochodzący z Red Hat.
ack