Powinno to prawdopodobnie zostać zaktualizowane, ponieważ wiele podanych tutaj informacji jest mylących i mogło nigdy nie być całkowicie poprawnych.
https://bootlin.com/blog/find-root-device/
W przypadku punktu / mount powiedziano ci, że odpowiada / dev / root, co nie jest prawdziwym urządzeniem, którego szukasz.
Oczywiście, możesz spojrzeć na wiersz komend jądra i zobaczyć, na którym początkowym systemie plików root polecił Linux uruchomić (parametr root):
$ cat / proc / cmdline mem = 512M konsoli = root ttyS2,115200n8 = / dev / mmcblk0p2 rw rootwait
Nie oznacza to jednak, że widzisz bieżące urządzenie root. Wiele systemów Linux uruchamia się na pośrednich systemach plików root (takich jak initramdisks i initramfs), które są po prostu używane do uzyskania dostępu do ostatniego.
Jedną z rzeczy, które to wskazuje, jest to, że rzecz w / proc / cmdline niekoniecznie musi być faktycznym rootem urządzenia końcowego, na którym faktycznie działa.
To ludzie z busybox, o których, jak przypuszczam, wiedzą, o czym mówią, jeśli chodzi o sytuacje rozruchowe.
https://www.linuxquestions.org/questions/slackware-14/slackware-current-dev-root-688189/page2.html
Drugim przydatnym zasobem, który znalazłem, jest bardzo stary wątek Slackware dotyczący pytania / dev / root, z epoki tego wątku widzimy, że wszystkie warianty były zawsze obecne, ale uważam, że „większość” dystrybucji używała symbolicznych metoda linku, ale był to prosty przełącznik kompilacji jądra, mógł go stworzyć, lub go nie zrobić, jeśli poprawnie zrozumiałem plakaty, to znaczy przełącz go w jedną stronę, a readlink / dev / root zgłasza prawdziwą nazwę urządzenia, przełącza drugi i tak nie jest.
Ponieważ głównym tematem tego wątku było pozbywanie się / dev / root, musieli dowiedzieć się, co to właściwie jest, co go tworzy itp., Co oznacza, że musieli go zrozumieć, aby się go pozbyć.
gnashly dobrze to wytłumaczył:
/ dev / root to ogólne urządzenie, którego można używać w fstab. Można również użyć „rootfs”. Robienie tego oferuje pewną zaletę, ponieważ pozwala być mniej konkretnym. Mam na myśli to, że jeśli partycja root znajduje się na dysku zewnętrznym, nie zawsze może być wyświetlana jako to samo urządzenie i pomyślne jej zainstalowanie, ponieważ / wymagałoby zmiany fstab w celu dopasowania do właściwego urządzenia. Użycie / dev / root zawsze będzie pasowało do dowolnego urządzenia określonego w parametrach rozruchowych jądra od lilo lub grub.
/ dev / root zawsze był obecny jako wirtualny punkt montowania, nawet jeśli go nigdy nie widziałeś. Podobnie jak rootfs (porównaj to ze specjalnymi urządzeniami wirtualnymi, takimi jak proc i tmpfs, które nie mają poprzedzających / dev)
/ dev / root jest urządzeniem wirtualnym, takim jak „proc” lub / dev / tcp ”. Dla tych rzeczy nie ma węzła urządzenia w / dev - jest już w jądrze jako urządzenie wirtualne.
To wyjaśnia, dlaczego dowiązanie symboliczne niekoniecznie istnieje. Dziwi mnie, że nigdy wcześniej nie dotykałem tego problemu, ponieważ utrzymuję niektóre programy, które muszą znać te informacje, ale lepiej późno niż wcale.
Wierzę, że niektóre z proponowanych tu rozwiązań „często” będą działać i prawdopodobnie są tym, co zrobię, ale nie są one prawdziwym prawdziwym rozwiązaniem problemu, który, jak zauważył autor busybox, jest znacznie bardziej skomplikowany do wdrożenia w bardzo solidny sposób.
[AKTUALIZACJA:} Po uzyskaniu pewnych danych testowych użytkownika, korzystam z metody montowania, która wydaje się być w porządku przynajmniej w niektórych przypadkach. / Proc / cmdline nie był użyteczny, ponieważ istnieje zbyt wiele wariantów. W pierwszym przykładzie zobaczysz starą metodę. Jest to coraz mniej powszechne, ponieważ zdecydowanie odradza się go używać (oryginalna składnia typu / dev / sdx [0-9]), ponieważ ścieżki te mogą się zmieniać dynamicznie (zamień kolejność dysków, wstaw nowy dysk itp. I nagle / dev / sda1 staje się / dev / sdb1).
root=/dev/sda1
root=UUID=5a25cf4a-9772-40cd-b527-62848d4bdfda
root=LABEL=random string
root=PARTUUID=a2079bfb-02
VS bardzo czysty i łatwy do przeanalizowania:
mount
/dev/sda1 on / type ext4 (rw,noatime,data=ordered)
W przypadku cmdline zobaczysz, że jedynym wariantem, który jest właściwą „odpowiedzią” w teorii, jest pierwszy, przestarzały, ponieważ nie powinieneś odnosić roota do ruchomego celu, takiego jak / dev / sdxy
Następne dwa wymagają wykonania dodatkowej akcji uzyskania linku symbolicznego z tego łańcucha w / dev / disk / by-uuid lub / dev / disk / by-label
Ten ostatni wymaga, jak sądzę, użycia parted -l, aby znaleźć to, na co wskazuje ten rozstanie.
To tylko warianty, które znam i widziałem, mogą być też inne, na przykład GPTID.
Rozwiązaniem, którego używam jest:
najpierw sprawdź, czy / dev / root jest dowiązaniem symbolicznym. Jeśli tak, sprawdź, czy nie jest to / dev / disk / by-uuid lub by-label, jeśli tak, musisz wykonać drugi krok przetwarzania, aby uzyskać ostatnią prawdziwą ścieżkę. Zależy od używanego narzędzia.
Jeśli nic nie masz, to idź na wierzchowca i zobacz, jak to jest. Jako ostatni przypadek rezerwowy, którego nie używam, ponieważ podane argumenty niekoniecznie będące rzeczywistą partycją lub danym urządzeniem są wystarczająco dobre, że mogę odrzucić to rozwiązanie dla mojego programu. mount nie jest w pełni niezawodnym rozwiązaniem i jestem pewien, że biorąc pod uwagę wystarczającą liczbę próbek, łatwo byłoby znaleźć przypadki, w których w ogóle nie jest to właściwe, ale uważam, że te dwa przypadki obejmują „większość” użytkowników, co jest wszystkim, czego potrzebuję.
Najlepszym, najczystszym i najbardziej niezawodnym rozwiązaniem byłoby, aby jądro zawsze tworzyło łącze symboliczne, które nie zaszkodziłoby nic ani nikomu, i nazywało je dobrym, ale tak nie działało w prawdziwym świecie. .
Nie uważam żadnego z nich za „dobre lub solidne”, ale opcja montowania wydaje się spełniać „wystarczająco dobre”, a jeśli naprawdę solidne rozwiązanie jest wymagane, użyj rzeczy zalecanych przez busyboksa.