Sprawdź, czy folder jest zamontowanym zdalnym systemem plików

44

Jaki jest najlepszy sposób (niezawodny, przenośny itp.), Aby sprawdzić, czy dany folder znajduje się w zamontowanym zdalnym systemie plików (nfs) w skrypcie powłoki?

Szukam polecenia, które wyglądałoby następująco:

chk-remote-mountpoint /my/path/to/folder 
Totor
źródło

Odpowiedzi:

34

Jak mówi Stephane „nie ma na to uniwersalnej odpowiedzi na Uniksa”.

Najlepsze rozwiązanie, jakie znalazłem w moim pytaniu:

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

zwróci typ systemu plików, na przykład: nfslub ext3.

Ta -Topcja nie jest standardowa , więc może nie działać na innych systemach Unix / Linux ...

Zgodnie z komentarzem Gillesa poniżej: „Działa to na każdym niewbudowanym Linuksie, ale nie na BusyBox, * BSD itp.”

Totor
źródło
1
Działa to na każdym niewbudowanym systemie Linux, ale nie na BusyBox, * BSD itp. Od Ciebie zależy, czy to wystarczy.
Gilles 'SO - przestań być zły'
Wyświetlanie /etc/mtablub wyniki mountzamiast używania dfmoże zrobić w kilku innych przypadkach.
TNW
1
@TNW lub nawet/proc/mounts
laebshade
1
Najwyraźniej ani mount, ani /etc/mtabnawet nie /proc/mountssą standardowe, więc nie ma gwarancji, co tam można znaleźć ...
Totor
1
To nie działa na OSX 10.8, ponieważ -Tma tutaj inne znaczenie
DavAlPi
13

Możesz użyć GNU stat.

%m znaleźć punkt montowania.

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

%T (w trybie systemu plików), aby znaleźć nazwę systemu plików.

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

W ten sposób wiesz, że /usr/src/linuxw moim systemie jest przechowywany w systemie plików, który jest zamontowany /usr/srci ma typ systemu plików reiserfs.

Zobacz także w celu man statuzyskania dalszych informacji. To bardzo wszechstronne polecenie, przydatne prawie zawsze, gdy potrzebujesz informacji o plikach i nie chcesz wracać do grep | awkczujności.

frostschutz
źródło
Moja wersja statnie ma %mopcji dla --format(używając Debian Squeeze, coreutils 8.5). Myślę, że to rozwiązanie nie jest bardzo niezawodne.
Totor
Nie wierzyłem w to, ale różnice między Coreutils 8.5 i 8.13 (debian wheezy) mówią, że masz rację. Uważaj mnie za bardzo zaskoczonego :) ściśnięcie jest po prostu za stare :( err, zbyt stabilne
frostschutz
1
z coreutils zmian: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. To prawie 3 lata temu. Zadziwiające, że Debian wciąż tego nie ma.
frostschutz
Nawet jeśli Debian Squeeze został wydany w dniu 2011-02-06, został zamrożony w dniu 2010-08-06, zanim zmieni się ten coreutils ... Raczej szukam „standardowego” rozwiązania, jeśli to możliwe.
Totor
Cóż, możesz po prostu użyć polecenia% T systemu plików, jeśli działa to w starej statystyce. Jeśli to też nie działa, a twoja wersja statystyk nie zawiera potrzebnych informacji, wróć do niezręcznych rozwiązań.
frostschutz
4

mount -li użyj grep, sedlub, awkaby znaleźć wiersz, który odnosi się do danego katalogu.

jayhendren
źródło
Trudno jest stwierdzić, że odpowiedź na to pytanie /my/path/to/the/directorypochodzi z punktu montowania /my/path. Być może można dać trochę więcej szczegółów o grep, sed, awkpolecenia, które sugerują (pełną odpowiedź) ?.
Totor
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'powinien dać ci listę wszystkich punktów montowania nfs w systemie.
Andy Shulman,
Można to połączyć z poleceniem stat: mount | fgrep "`stat --printf=" on %m type" /var/log/`". The mount`, aby wydrukować wszystkie punkty montowania, w <device> on <mountpoint> type <type>formacie. Aby grep to, stat --printfwygenerowałem on <mountpoint> typeczęść.
MSalters
istnieje wiele typów montowania lokalnego i zdalnego systemu plików. posiadanie mapy wszystkich z nich może być trudne. (na przykład czy drvfs jest lokalny czy zdalny?)
Erik Aronesty
Tak, ale pytanie dotyczy w szczególności nfs: „zamontowany zdalny system plików (nfs)”
jayhendren
2

Niestety nie ma na to uniwersalnej odpowiedzi na Uniksa.

Jedną rzeczą, którą możesz zrobić, dla danego pliku /a/b/c/djest przejście ścieżką:

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

... i rób stat(2)na każdym poziomie, aż do st_devzmian. Wtedy będziesz wiedział, gdzie jest punkt montowania. Następnie możesz wyszukać kanoniczną ścieżkę tego punktu montowania w /etc/mtablub na wyjściu, mountaby znaleźć typ systemu plików. Następnie sprawdzenie, co jest zdalne, a co nie, będzie trudne, szczególnie w przypadku bezpieczników. Na przykład nfs, cifs, fuse.sshfs, fuse.davfssą oczywiste, ale co na przykład fuse.gvfs-fuse-daemonlub fuse.avfsdktóre mogą mieć zarówno plików sieciowych i niesieciowych?

Stéphane Chazelas
źródło
Cóż, używam nfs tutaj (zredagowałem moje pytanie). Jeśli chodzi o stat(2), myślę, że odwołujesz się do funkcji C, ale używam powłoki. Jednak st_devodnosi się do dużych i małych identyfikator urządzenia (jest to specyficzne dla Linuksa?), A polecenie shell stat(1)ma (niestandardowa) %ti %Tz --formatopcji dla odpowiednio dużych i małych ilościach, ale zawsze zwraca wartość „0” (lokalny i NFS ). Próbowałem na Debian Squeeze i Lenny.
Totor
Próbujesz tego z --file-systemopcją lub bez ?
frostschutz
@frostschutz Without. Ma inne znaczenie, jeśli jest używany z --file-system.
Totor
2

„-L” do df (1) zakończy się niepowodzeniem z błędem w nielokalnych systemach plików, więc możesz użyć tego zachowania, aby wiedzieć, czy system plików jest zdalny:

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

Jednak -lopcja nie jest standardowa .

rsone1
źródło
To nie jest odpowiedź
Totor
@Toror dlaczego nie? To prawda, istnieje wiele innych powodów, dla których dfmiałoby się nie powieść, i to samo czyni z tego niezbyt dobrą odpowiedź, ale próbuje odpowiedzieć na pytanie, więc nie rozumiem, dlaczego nazwałbyś to „nie odpowiedzią”.
terdon
@terdon Zgadzam się. Nie przeczytałem wystarczająco uważnie. Dziękuję za zwrócenie na to uwagi. Zmienię i zagłosuję. :)
Totor
Jest to w zasadzie jedyny, który działa niezawodnie na systemie Linux.
Erik Aronesty
1

df /pathpowie ci, że /pathjest to punkt montowania, jeśli powie, że punkt montowania nie jest /.

pgen
źródło
1
Pytanie dotyczy zdalnego punktu montowania.
Totor
1

Po prostu zrób

df /me/path/to/folder

Jeśli pierwsze pole (system plików) ma format host: / ścieżka, to wiesz, że to NFS

Udi
źródło
0

Możesz używać df -tw systemie Linux i df -TBSD.

Od man df :

-t, --type = TYPE

ogranicz listę do systemów plików typu TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
codeforester
źródło
Nieźle. Niestety i niestety -topcja ta ma inne znaczenie w POSIX / SUS. Tak więc użycie tej opcji może zapewnić niespójne wyniki w różnych wersjach narzędzia / UNIX.
Totor
-2

Osobiście użyłbym mountpoint(bardzo przenośny w systemie Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

lub showmountktóry jest prawie wymagany do zainstalowania w dowolnym systemie, który faktycznie montuje NFSudziały (część nfs-commonpakietu):

NAME
       showmount - show mount information for an NFS server

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

Inną opcją byłoby coś takiego:

$ mount -l -t nfs | grep 'my mount point'
malat
źródło
1
mountpointNarzędzie nie powiedzieć, czy punkt montowania jest znikome. Ponadto zdalne systemy plików nie są ograniczone do systemów plików NFS. Wreszcie mountpointnie jest standardem (nie na tej liście ).
Totor
specjalnie poprosiłeś o narzędzie w systemie Linux i NFS, mountpointw tym przypadku jest to standard.
Malat
To i tak nie odpowiada mojej pierwszej uwadze.
Totor
-3
find . -type d -name nfs -exec mountpoint {} \; | grep not

sprawdzi wszystkie foldery o nazwie „nfs”, jeśli są zamontowane

Dmitry Sherman
źródło
OP nie szuka folderów o nazwie nfs.
codeforester