W systemie Linux istnieje /dev/root
węzeł urządzenia. Będzie to takie samo urządzenie blokowe, jak inny węzeł urządzenia /dev/sdaX
. Jak /dev/root
w 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.
Odpowiedzi:
Analizuj
root=
parametr od/proc/cmdline
.źródło
W systemach, na które patrzyłem,
/dev/root
jest dowiązanie symboliczne do rzeczywistego urządzenia, więcreadlink /dev/root
(lubreadlink -f /dev/root
jeśli chcesz uzyskać pełną ścieżkę), zrobi to.źródło
ls -l /dev/root
- krótszy do pisania :)ls
(poprosił o coś do użycia w skrypcie).Cóż,
/dev/root
to tylko symboliczne łącze do prawdziwego urządzenia, dzięki któremu możeszreadlink(2)
dowiedzieć się, gdzie wskazuje program, lubreadlink(1)
zrobić to samo ze skryptu powłoki.źródło
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/
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ł:
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).
VS bardzo czysty i łatwy do przeanalizowania:
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.
źródło
Może czegoś mi brakuje, ale co z:
źródło