Finden Sie heraus, welches Gerät / dev / root unter Linux darstellt.

17

Unter Linux gibt es einen /dev/rootGeräteknoten. Dies ist das gleiche Blockgerät wie ein anderer Geräteknoten /dev/sdaX. Wie kann ich /dev/rootin dieser Situation auf den "echten" Geräteknoten auflösen , damit ich einem Benutzer einen sinnvollen Gerätenamen anzeigen kann?

Diese Situation kann beispielsweise beim Parsen auftreten /proc/mounts.

Ich suche nach Lösungen, die von einem Shell- / Python-Skript aber nicht von C funktionieren würden.

kdt
quelle
Hast du hier nachgesehen? linux-diag.sourceforge.net/Sysfsutils.html Es empfiehlt Möglichkeit , den Kernel über angeschlossene Geräte aller Art abfragen, nicht sicher, ob seine , was Sie suchen!

Antworten:

14

Analysieren Sie den root=Parameter von /proc/cmdline.

Ignacio Vazquez-Abrams
quelle
Wow,
1
So viel sicherer als eine symbolische Verknüpfung zu dereferenzieren. +1 :)
Tim Post
1
Dies funktioniert auf den drei Distributionen (fc14, rhel5, ubuntu 11.04), die ich mir angesehen habe, mit der leichten Einschränkung, dass ein zusätzlicher Schritt erforderlich ist, um mit Argumenten vom Typ root = UUID = umzugehen.
kdt
Ich bin daran interessiert, warum dies sicherer ist als die Readlink-Lösung. Könnte das jemand erläutern?
Opello
readlink funktioniert nicht immer, ich arbeite gerade an diesem Problem und habe einen Benutzer gefunden, dessen System keine Ergebnisse anzeigt von: readlink / dev / root - das hat einen Fehler in dem Programm ausgelöst, an dem ich arbeite, weshalb ich gekommen bin zu diesem Thread. Der richtige Test ist zuerst zu machen: readlink / dev / root, dann, wenn null, finde es in / proc / cmdline, aber das Parsen von / proc / cmdline ist nicht so einfach wie eine bessere Lösung, also werde ich weiter suchen.
Lizardx
12

Auf den Systemen, die ich angeschaut habe, /dev/rootbefindet sich ein Symlink zum realen Gerät, also readlink /dev/root(oder readlink -f /dev/rootwenn Sie den vollen Pfad wollen), wird es tun.

cjm
quelle
Oder einfach ls -l /dev/root- kürzer zu
schreiben
@jankes, aber dann musst du die Ausgabe von analysieren ls(er hat nach etwas gefragt, das in einem Skript verwendet werden soll).
cjm
Ah, tut mir leid - habe das übersehen.
Rozcietrzewiacz
Nein - auf meinem RHEL5-Rechner ist es definitiv kein Symlink, obwohl es auf einem FC14- oder Ubuntu 11.04-Rechner ist.
kdt
1
Funktioniert nicht unter Archlinux.
g33kz0r
7

Nun, es /dev/roothandelt sich nur um eine symbolische Verknüpfung zum realen Gerät, mit der Sie readlink(2)herausfinden können, wo es auf ein Programm verweist, oder readlink(1)dasselbe in einem Shell-Skript ausführen können .

TomH
quelle
Funktioniert nicht auf Archlinux
g33kz0r
Ebenfalls nicht auf Debian, openSUSE, CentOS (unvollständige Liste) :(
pevik
Fügen Sie der Liste Ubuntu hinzu.
Lizardx
2

Vielleicht fehlt mir etwas, aber was ist mit:

mount|grep ' / '|cut -d' ' -f 1
g33kz0r
quelle
2

Dies sollte wahrscheinlich aktualisiert werden, da viele der hier gegebenen Informationen irreführend sind und möglicherweise nie vollständig korrekt waren.

https://bootlin.com/blog/find-root-device/

Für den / mount-Punkt wird Ihnen lediglich mitgeteilt, dass er / dev / root entspricht, was nicht das richtige Gerät ist, das Sie suchen.

Natürlich können Sie in der Kernel-Befehlszeile nachsehen, auf welchem ​​ursprünglichen Root-Dateisystem Linux zum Booten angewiesen wurde (root-Parameter):

$ cat / proc / cmdline mem = 512M console = ttyS2,115200n8 root = / dev / mmcblk0p2 rw rootwait

Dies bedeutet jedoch nicht, dass Sie das aktuelle Root-Gerät sehen. Viele Linux-Systeme booten auf zwischengeschalteten Root-Dateisystemen (wie initramdisks und initramfs), die nur für den Zugriff auf das letzte verwendet werden.

Eine Sache, auf die dies hinweist, war, dass das Ding in / proc / cmdline nicht unbedingt das eigentliche Endgerät ist, auf dem Root-Benutzer tatsächlich leben.

Das ist von den Busybox-Leuten, von denen ich annehme, dass sie wissen, wovon sie reden, wenn es um Boot-Situationen geht.

https://www.linuxquestions.org/questions/slackware-14/slackware-current-dev-root-688189/page2.html

Die zweite nützliche Ressource, die ich gefunden habe, ist ein sehr alter Slackware-Thread über die Frage von / dev / root. Ab dem Alter dieses Threads können wir sehen, dass alle Varianten immer vorhanden waren, aber ich glaube, dass die meisten Distributionen die Symbolik verwendeten Link-Methode, aber das war ein einfacher Kernel-Kompilierungs-Schalter, es könnte einen machen oder keinen machen, wenn ich die Poster richtig verstehe, das heißt, es in eine Richtung wechseln, und readlink / dev / root meldet den realen Gerätenamen und schaltet ihn um der andere, und das tut es nicht.

Da das Hauptthema dieses Threads war, wie man / dev / root loswird, mussten sie sich damit befassen, was es eigentlich ist, was es ausmacht usw. Das heißt, sie mussten es verstehen, um es loszuwerden.

knifflig erklärt es gut:

/ dev / root ist ein generisches Gerät, das in der fstab verwendet werden kann. Man kann auch 'rootfs' verwenden. Dies bietet den Vorteil, dass Sie weniger spezifisch sind. Ich meine, wenn sich die Root-Partition auf einem externen Laufwerk befindet, wird sie möglicherweise nicht immer als dasselbe Gerät angezeigt und kann erfolgreich gemountet werden, da / die fstab geändert werden muss, um dem richtigen Gerät zu entsprechen. Mit / dev / root wird immer das Gerät gefunden, das in den Kernel-Boot-Parametern von lilo oder grub angegeben ist.

/ dev / root war immer als virtueller Einhängepunkt vorhanden, auch wenn Sie ihn nie gesehen haben. Auch rootfs (vergleiche dies mit den speziellen virtuellen Geräten wie proc und tmpfs, die kein vorheriges / dev haben)

/ dev / root ist ein virtuelles Gerät wie 'proc' oder / dev / tcp '. Es gibt keinen Geräteknoten in / dev für diese Dinge - er ist bereits als virtuelles Gerät im Kernel.

Dies erklärt, warum ein symbolischer Link nicht unbedingt existiert. Ich bin überrascht, dass ich dieses Problem noch nie zuvor angetroffen habe, da ich einige Programme verwalte, die diese Informationen benötigen, aber besser spät als nie.

Ich glaube, einige der hier angebotenen Lösungen werden "oft" funktionieren und sind wahrscheinlich das, was ich tun werde, aber sie sind nicht die eigentliche wahre Lösung für das Problem, das, wie der Autor der Busybox bemerkte, in einer sehr komplizierten Weise zu implementieren ist robuste Weise.

[UPDATE:} Nachdem ich einige Benutzertestdaten erhalten habe, gehe ich zur Mount-Methode über, die zumindest in einigen Fällen in Ordnung zu sein schien. Die / proc / cmdline war nicht nützlich, da es zu viele Varianten gibt. Im ersten Beispiel sehen Sie die alte Methode. Dies kommt immer seltener vor, da von der Verwendung dringend abgeraten wird (die ursprüngliche Syntax vom Typ / dev / sdx [0-9]), da sich diese Pfade dynamisch ändern können (Plattenreihenfolge tauschen, neue Platte einlegen usw. und plötzlich / dev / sda1 wird zu / dev / sdb1).

root=/dev/sda1
root=UUID=5a25cf4a-9772-40cd-b527-62848d4bdfda
root=LABEL=random string
root=PARTUUID=a2079bfb-02

VS die sehr sauber und einfach zu analysieren:

mount
/dev/sda1 on / type ext4 (rw,noatime,data=ordered)

Im Fall von cmdline werden Sie sehen, dass die einzige Variante, die in der Theorie die richtige 'Antwort' ist, die erste, veraltete Variante ist, da Sie nicht root auf ein sich bewegendes Ziel wie / dev / sdxy verweisen sollten

Bei den nächsten beiden Schritten muss die symbolische Verknüpfung aus dieser Zeichenfolge entweder in / dev / disk / by-uuid oder / dev / disk / by-label abgerufen werden

Das letzte setzt voraus, dass ich glaube, dass ich parted -l verwende, um herauszufinden, auf was diese ID zeigt.

Das sind nur die Varianten, die ich kenne und die ich gesehen habe. Es könnte auch andere geben, wie zum Beispiel GPTID.

Also die Lösung, die ich benutze, ist diese:

Überprüfen Sie zunächst, ob / dev / root eine symbolische Verknüpfung ist. Wenn dies der Fall ist, überprüfen Sie, ob es sich nicht um / dev / disk / by-uuid oder by-label handelt. Wenn dies der Fall ist, müssen Sie einen zweiten Verarbeitungsschritt ausführen, um den letzten tatsächlichen Pfad abzurufen. Hängt vom verwendeten Tool ab.

Wenn Sie nichts haben, gehen Sie zum Mount und sehen Sie, wie das ist. Ein letzter Fall, den ich nicht benutze, weil die Argumente, die dagegen angeführt werden, nicht unbedingt die tatsächliche Partition oder das betreffende Gerät sind, gut genug sind, um diese Lösung für mein Programm abzulehnen. mount ist keine robuste Lösung, und ich bin mir sicher, dass es bei genügend Beispielen leicht ist, Fälle zu finden, in denen es überhaupt nicht richtig ist, aber ich glaube, dass diese beiden Fälle die meisten Benutzer abdecken, was alles ist, was ich brauche.

Die schönste, sauberste und zuverlässigste Lösung wäre gewesen, wenn der Kernel immer nur die symbolische Verknüpfung hergestellt hätte, die weder irgendetwas noch irgendjemanden geschadet hätte, und sie als gut bezeichnet hätte, aber in der realen Welt hat das nicht funktioniert. .

Ich betrachte keine dieser Lösungen als "gut oder robust", aber die Mount-Option scheint die "gut genug" zu erfüllen, und wenn die wirklich robuste Lösung erforderlich ist, verwenden Sie das von busybox empfohlene Material.

Lizardx
quelle