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.