Unter Linux gibt es einen /dev/root
Geräteknoten. Dies ist das gleiche Blockgerät wie ein anderer Geräteknoten /dev/sdaX
. Wie kann ich /dev/root
in 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.
Antworten:
Analysieren Sie den
root=
Parameter von/proc/cmdline
.quelle
Auf den Systemen, die ich angeschaut habe,
/dev/root
befindet sich ein Symlink zum realen Gerät, alsoreadlink /dev/root
(oderreadlink -f /dev/root
wenn Sie den vollen Pfad wollen), wird es tun.quelle
ls -l /dev/root
- kürzer zuls
(er hat nach etwas gefragt, das in einem Skript verwendet werden soll).Nun, es
/dev/root
handelt sich nur um eine symbolische Verknüpfung zum realen Gerät, mit der Siereadlink(2)
herausfinden können, wo es auf ein Programm verweist, oderreadlink(1)
dasselbe in einem Shell-Skript ausführen können .quelle
Vielleicht fehlt mir etwas, aber was ist mit:
quelle
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/
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:
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).
VS die sehr sauber und einfach zu analysieren:
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.
quelle