Überprüfen Sie, ob es sich bei dem Ordner um ein bereitgestelltes Remote-Dateisystem handelt

43

Wie kann am besten (zuverlässig, portabel usw.) überprüft werden, ob sich ein bestimmter Ordner in einem bereitgestellten Remote-Dateisystem (nfs) in einem Shell-Skript befindet?

Ich suche einen Befehl, der so aussehen würde:

chk-remote-mountpoint /my/path/to/folder 
Totor
quelle

Antworten:

34

Wie Stephane sagt "es gibt keine universelle Unix-Antwort darauf".

Die beste Lösung, die ich zu meiner Frage gefunden habe:

df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'

gibt den Dateisystemtyp zurück, zum Beispiel: nfsoder ext3.

Die -TOption ist kein Standard , daher funktioniert sie möglicherweise nicht auf anderen Unix / Linux-Systemen ...

Nach Gilles 'Kommentar unten: "Dies funktioniert auf jedem nicht eingebetteten Linux, aber nicht auf BusyBox, * BSD usw."

Totor
quelle
1
Dies funktioniert auf jedem nicht eingebetteten Linux, aber nicht auf BusyBox, * BSD usw. Es liegt an Ihnen, zu entscheiden, ob das gut genug ist.
Gilles 'SO- hör auf böse zu sein'
Das Anzeigen /etc/mtaboder Anzeigen von Ergebnissen mountanstelle der Verwendung dfkann in einigen weiteren Fällen hilfreich sein.
TNW
1
@ TNW oder sogar/proc/mounts
Laebshade
1
Anscheinend sind weder mountnoch /etc/mtabnicht einmal /proc/mountsStandard, so gibt es keine Garantie dafür, was dort zu finden ist ...
Totor
1
Dies funktioniert unter OSX 10.8 nicht, da -Tes hier eine andere Bedeutung hat
DavAlPi
13

Sie könnten GNU verwenden stat.

%m um den Einhängepunkt herauszufinden.

$ stat --format=%m /usr/src/linux
/usr/src

%T (im Dateisystemmodus), um den Namen des Dateisystems herauszufinden.

$ stat --file-system --format=%T /usr/src/linux
reiserfs

So wissen Sie, dass /usr/src/linuxauf meinem System in einem Dateisystem gespeichert ist, das gemountet ist /usr/srcund den Dateisystemtyp hat reiserfs.

Siehe auch man statfür weitere Referenz. Es ist ein sehr vielseitiger Befehl, der fast immer nützlich ist, wenn Sie Informationen über Dateien benötigen und nicht auf grep | awkSchutz zurückgreifen möchten.

Frostschutz
quelle
Meine Version von stathat keine %mOption für --format(unter Verwendung von Debian Squeeze, Coreutils 8.5). Ich denke, diese Lösung ist nicht sehr zuverlässig.
Totor
Ich habe es nicht geglaubt, aber der Unterschied zwischen Coreutils 8.5 und 8.13 (debian wheezy) sagt, dass Sie Recht haben. Betrachten Sie mich als sehr überrascht :) Squeeze ist einfach zu alt :( ähm, zu stabil
Frostschutz
1
von den coreutils Changelog: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Das ist fast 3 Jahre her. Erstaunlich, dass Debian dies immer noch nicht hat.
Frostschutz
Auch wenn Debian Squeeze am 06.02.2011 veröffentlicht wurde, wurde es am 06.08.2010 eingefroren , bevor sich diese Kernfunktionen änderten ... Ich suche eher nach einer "Standard" -Lösung, die möglich ist, wenn möglich.
Totor
Nun, Sie könnten einfach den Dateisystem-Befehl% T verwenden, wenn dies in der alten Statistik funktioniert. Wenn das auch nicht funktioniert und Ihre Version von stat nicht die Informationen liefert, die Sie benötigen, kehren Sie zu den umständlichen Lösungen zurück.
Frostschutz
4

mount -lVerwenden Sie grep, sedoder awk, um die Zeile zu finden, die auf das betreffende Verzeichnis verweist.

Jayhendren
quelle
Es sieht kompliziert aus, mit Ihrer Antwort herauszufinden, dass dies /my/path/to/the/directorytatsächlich etwas vom Ausgangspunkt ist /my/path. Vielleicht können Sie einige weitere Details über das geben grep, sed, awkBefehle , die Sie vorschlagen (vollständige Antwort) ?.
Totor
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'sollte Ihnen eine Liste aller nfs-Mountpunkte auf dem System geben.
Andy Shulman
Dies kann mit dem mount | fgrep "`stat --printf=" on %m type" /var/log/`". The Befehl stat: mount kombiniert werden, um alle Einhängepunkte im <device> on <mountpoint> type <type>Format auszudrucken . Um dies zu begreifen, habe ich stat --printfdas on <mountpoint> typeTeil generiert .
MSalters
Es gibt viele Mount-Typen für lokale und ferne Dateisysteme. Eine Karte von allen zu haben, kann eine Herausforderung sein. (zum Beispiel ist drvfs lokal oder remote?)
Erik Aronesty
Ja, aber die Frage fragt speziell nach nfs: "Mounted Remote (NFS) Dateisystem"
Jayhendren
2

Leider gibt es keine universelle Unix-Antwort darauf.

Eine Sache, die Sie für eine bestimmte Datei tun können, /a/b/c/dist, den Pfad entlangzugehen:

  • /ABC/.
  • /ABC/..
  • /ABC/../..
  • ...

... und mach stat(2)auf jedem Level ein, bis sich das st_devändert. Dann wissen Sie, wo sich der Einhängepunkt befindet. Anschließend können Sie den kanonischen Pfad dieses Einhängepunkts in /etc/mtaboder in der Ausgabe von nachschlagen mount, um den Dateisystemtyp zu ermitteln. Dann herauszufinden, was entfernt ist und was nicht, wird besonders für sicherungsartige schwierig sein. Zum Beispiel nfs, cifs, fuse.sshfs, fuse.davfsliegen auf der Hand, aber was ist zum Beispiel fuse.gvfs-fuse-daemonoder fuse.avfsddass sowohl Netzwerk- als auch Nicht-Netzwerk - Dateien haben kann?

Stéphane Chazelas
quelle
Nun, ich benutze hier nfs (habe meine Frage bearbeitet). Was stat(2)denke ich, dass Sie die C - Funktion sich beziehen, aber ich bin mit Shell. st_devBezieht sich jedoch auf die Haupt- und Nebengeräte-ID (ist das Linux-spezifisch?) Und hat den Shell-Befehl stat(1)(nicht standardgemäß) %tund %Tmit den --formatOptionen für Haupt- und Nebennummern, gibt aber immer "0" zurück (local und nfs) ). Ich habe es mit Debian Squeeze und Lenny versucht.
Totor
Versuchen Sie dies mit oder ohne die --file-systemOption?
Frostschutz
@frostschutz Ohne. Es hat eine andere Bedeutung, wenn es mit verwendet wird --file-system.
Totor
2

"-L" bis "df (1)" schlagen bei nicht lokalen Dateisystemen fehl, sodass Sie anhand dieses Verhaltens feststellen können, ob das Dateisystem remote ist:

df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
   echo "local mount, do stuff"
fi

Die -lOption ist jedoch nicht Standard .

rsone1
quelle
Dies ist keine Antwort
Totor
@Totor warum nicht? Zugegeben, es gibt viele andere Gründe, warum dfdies fehlschlagen würde, und das allein macht dies zu einer nicht sehr guten Antwort, aber es wird versucht, die Frage zu beantworten, sodass ich nicht verstehe, warum Sie es "keine Antwort" nennen würden.
Terdon
@terdon Ich stimme zu. Ich habe nicht sorgfältig genug gelesen. Vielen Dank für diesen Hinweis. Ich werde bearbeiten und abstimmen. :)
Totor
Dies ist im Grunde die einzige, die zuverlässig unter Linux funktioniert.
Erik Aronesty
1

df /pathwird Ihnen sagen, dass /pathes sich um einen Mount-Punkt handelt, wenn der Mount-Punkt nicht angegeben ist /.

pgen
quelle
1
Die Frage bezieht sich auf einen Remote- Mount-Punkt.
Totor
1

Mach einfach

df /me/path/to/folder

Wenn das erste Feld (das Dateisystem) das Format host: / path hat, wissen Sie, dass es sich um NFS handelt

Udi
quelle
0

Sie können die df -tunter Linux und df -Tauf BSD-Systemen verwenden.

Vom mann df :

-t, --type = TYPE

Beschränken Sie die Auflistung auf Dateisysteme des Typs TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
Codeforester
quelle
Sehr schön. Leider hat die -tOption in POSIX / SUS jedoch eine andere Bedeutung . Daher kann die Verwendung dieser Option zu inkonsistenten Ergebnissen in verschiedenen Versionen des Tools / UNIX führen.
Totor
-2

Ich persönlich würde folgendes benutzen mountpoint(sehr portabel unter Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

oder showmountwas eigentlich erforderlich ist, um auf einem System installiert zu werden, das tatsächlich NFSFreigaben bereitstellt (Teil des nfs-commonPakets):

NAME
       showmount - show mount information for an NFS server

SYNOPSIS
       showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

Eine andere Möglichkeit wäre:

$ mount -l -t nfs | grep 'my mount point'
malat
quelle
1
Das mountpointDienstprogramm sagt Ihnen nicht, ob der Mount-Punkt entfernt ist. Darüber hinaus sind ferne Dateisysteme nicht auf NFS-Dateisysteme beschränkt. Schließlich mountpointist nicht Standard (nicht in dieser Liste ).
Totor
Sie haben speziell ein Tool für Linux und NFS angefordert, das mountpointist in diesem Fall Standard.
Malat
Dies beantwortet meinen ersten Punkt sowieso nicht.
Totor
-3
find . -type d -name nfs -exec mountpoint {} \; | grep not

überprüft alle Ordner mit dem Namen 'nfs', wenn sie gemountet sind

Dmitry Sherman
quelle
OP sucht nicht nach Ordnern mit dem Namen nfs.
Codeforester