Wie kann ich überprüfen, ob /my/dir
sich auf derselben Partition befindet wie /
?
Dies dient zur Integration in ein Skript. Bindungshalterungen sollten korrekt gehandhabt werden. POSIX-kompatible Lösungen sind willkommen.
shell-script
mount
Totor
quelle
quelle
Antworten:
Sie können dies mit stat überprüfen:
Zeigt Ihnen die Gerätenummer und den Ort an, an dem Ihr Verzeichnis bereitgestellt wurde.
quelle
stat
Shell-Befehl ist nicht POSIX ...Der folgende Befehl gibt einen eindeutigen Namen für den Einhängepunkt an, der die Datei enthält
$file
:Dies funktioniert auf jedem POSIX- System. Die
-P
Option legt ein vorhersehbares Format fest. Das erste Feld der zweiten Zeile ist der "Dateisystemname". Um zu überprüfen, ob sich zwei Dateien unter demselben Einhängepunkt befinden:Oder, um einige Prozessaufrufe zu speichern:
Einige Betriebssysteme können Leerzeichen in Datenträgernamen enthalten.
df
In diesem Fall gibt es keine absolut zuverlässige Methode zum Parsen der Ausgabe.Unter der Haube können Sie das Dateisystem, das eine Datei enthält, anhand des von zurückgegebenen
st_dev
Felds identifizierenstat
. Es gibt keine tragbare Möglichkeit, dies über ein Shell-Skript zu tun. Einige Systeme haben einstat
Dienstprogramm, aber die Syntax variiert:stat
meldet Cygwin oder andere Systeme mit GNU-Coreutils dasst_dev
Feld beim Aufrufen alsstat -c %D -- "$file"
.stat
die mit GNU-Coreutils kompatibel ist. Andere habenstat
ohne die%c
Option; Sie können verwendenstat -t -- "$file" | awk '{print $8}'
, dies funktioniert jedoch nur, wenn der Dateiname kein Leerzeichen enthält oderstat -t -- "$file" | awk 'END {print $(NF-8)}'
mit beliebigen Dateinamen, jedoch nicht mit zukünftigen Hinzufügungen von Feldern zurstat
Ausgabe zurechtkommt.stat
Nutzen, der dies erfordertstat -f %d -- "$file"
.stat
Dienstprogramm.Wenn Perl verfügbar ist, können Sie verwenden
und um den Vergleich zu machen:
Beachten Sie, dass es einige Eckfälle gibt, in denen das gewünschte Ergebnis nicht klar ist. Zum Beispiel mit Linux Bind Mounts, nach
mount --bind /foo /bar
,/foo
und/bar
werden als das gleiche Dateisystem sein. Es ist immer möglich, dass sich die beiden Dateien tatsächlich auf demselben Gerät befinden, aber Sie werden es nie erfahren: Wenn sich die Dateien beispielsweise auf zwei verschiedenen Netzwerk-Mounts befinden, kann der Client nicht feststellen, ob der Server unterschiedliche Dateisysteme exportiert.Wenn es sich bei den Dateien um Verzeichnisse handelt und Sie darauf schreiben können, besteht eine andere Methode darin, eine temporäre Datei zu erstellen und zu versuchen, eine feste Verknüpfung herzustellen. Dieser meldet ein negatives Ergebnis für alle Linux-Bindungs-Mounts.
quelle
df
nicht gibt immer die Gerätenamen, aber irgendwann einen symbolischen Link , um es wie/dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4
machtdf
nicht zuverlässig. Die einzige zuverlässige Option ist bisher die Verwendung einerstat
Lösung auf Basis.df
des Geräts ist die Übereinstimmung zwischen den beiden Aufrufen konsistent, sodass ein Vergleich in Ordnung ist.df
Bericht/dev/sda6
und/dev/disk/by-uuid/ca09b...
beide beziehen sich auf dasselbe Gerät, aber unterschiedliche Mountpunkte. Der Zeichenfolgenvergleichstest schlägt offensichtlich fehl, wenn versucht wird, Dateien von jedem Einhängepunkt zu verwenden.mount /dev/sda6 /mnt1
gefolgt vonmount /dev/sda6 /mnt2
Arbeiten wie ein Zauber.cat /proc/mounts
ist gut damit. Jedoch ist es , da nur Wheezy , die/dev/disk/by-uuid/ca09b...
in gezeigt wird ,df
wie die Vorrichtung für das Root - Dateisystem. Weitere Versuche, es über diesen Simlink oder dieUUID=ca09b...
Mount-Syntax zu mounten, zeigen nichts anderes als/dev/sda6
indf
(Ich weiß nicht, wie ich reproduzieren soll, was es während des Startvorgangs getan hat, aber das ist hier nicht das Problem).Funktioniert mit einer beliebigen Anzahl von Pfaden.
quelle
df
ist nicht immer eine gute Idee .$6
), nicht den Gerätenamen ($1
), also sollte das kein Problem sein.Die beste narrensichere Lösung in POSIX ist der Vergleich der Geräte-IDs der Dateien, die von der Funktion stat (2) bereitgestellt werden .
Perl hat eine ähnliche Stat Funktion wie Gilles wies darauf hin :
Der "POSIX-Weg" besteht jedoch darin, ein C-Programm wie das folgende zu verwenden:
Welcher Quellcode lautet wie folgt:
Wenn die Geräte-IDs beider Dateien gleich sind, werden sie auf demselben Dateisystem gehostet. In diesem Fall geben die obigen Befehle 0 zurück (ansonsten ein anderer Wert). Überprüfen Sie mit
echo $?
.Dies funktioniert gut mit Bindungs-Mounts, aber wahrscheinlich nicht mit Netzwerk-Mounts.
quelle