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 

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.”


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.


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.


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?


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 .


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 /.


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


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

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'

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


OP nie szuka folderów o nazwie nfs.
codeforester
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.