Dowiedz się, jakie urządzenie / dev / root reprezentuje w systemie Linux?

17

W systemie Linux istnieje /dev/rootwęzeł urządzenia. Będzie to takie samo urządzenie blokowe, jak inny węzeł urządzenia /dev/sdaX. Jak /dev/rootw tej sytuacji mogę przejść do „rzeczywistego” węzła urządzenia, aby pokazać użytkownikowi rozsądną nazwę urządzenia?

Na przykład może wystąpić taka sytuacja podczas analizowania /proc/mounts.

Szukam rozwiązań, które mogłyby działać ze skryptu powłoki / python, ale nie C.

kdt
źródło
sprawdziłeś tutaj? linux-diag.sourceforge.net/Sysfsutils.html Zaleca sposób wysłania zapytania do jądra na temat podłączonych urządzeń wszelkiego rodzaju, nie jestem pewien, czy jest to, czego szukasz!

Odpowiedzi:

14

Analizuj root=parametr od /proc/cmdline.

Ignacio Vazquez-Abrams
źródło
Wow, reakcje błyskawic :-)
1
O wiele bezpieczniejsze niż dereferencjowanie dowiązania symbolicznego. +1 :)
Tim Post
1
Działa to na trzech dystrybucjach (fc14, rhel5, ubuntu 11.04), na które patrzyłem, z niewielkim zastrzeżeniem, że istnieje dodatkowy krok, aby poradzić sobie z argumentami typu root = UUID =.
kdt
Interesuje mnie, dlaczego jest to bezpieczniejsze niż rozwiązanie readlink, czy ktoś mógłby to rozwinąć?
opello
readlink nie zawsze działa, pracuję teraz nad tym problemem i znalazłem użytkownika, którego system nie pokazuje żadnych wyników z: readlink / dev / root - co spowodowało usterkę w programie, nad którym pracuję, dlatego przyjechałem do tego wątku. Prawidłowym testem jest najpierw: readlink / dev / root, a jeśli null, znajdź go w / proc / cmdline, ale parsowanie / proc / cmdline nie jest tak łatwe jak lepsze rozwiązanie, więc będę szukał dalej.
Lizardx,
12

W systemach, na które patrzyłem, /dev/rootjest dowiązanie symboliczne do rzeczywistego urządzenia, więc readlink /dev/root(lub readlink -f /dev/rootjeśli chcesz uzyskać pełną ścieżkę), zrobi to.

cjm
źródło
Lub po prostu ls -l /dev/root- krótszy do pisania :)
rozcietrzewiacz
@jankes, ale musisz przeanalizować dane wyjściowe ls(poprosił o coś do użycia w skrypcie).
cjm
Ach, przepraszam - przeoczyłem to.
rozcietrzewiacz
Nie - na mojej maszynie RHEL5 na pewno nie jest to dowiązanie symboliczne, chociaż na maszynie FC14 lub ubuntu 11.04 jest.
kdt
1
Nie działa na archlinuxie.
g33kz0r
7

Cóż, /dev/rootto tylko symboliczne łącze do prawdziwego urządzenia, dzięki któremu możesz readlink(2)dowiedzieć się, gdzie wskazuje program, lub readlink(1)zrobić to samo ze skryptu powłoki.

TomH
źródło
Nie. Nie działa na archlinuxie
g33kz0r
Również nie w Debianie, openSUSE, CentOS (lista niekompletna) :(
pevik
Dodaj ubuntu do listy.
Lizardx
3

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.

Lizardx
źródło
2

Może czegoś mi brakuje, ale co z:

mount|grep ' / '|cut -d' ' -f 1
g33kz0r
źródło