Controlla se la cartella è un filesystem remoto montato


44

Qual è il modo migliore (affidabile, portatile, ecc.) Per verificare se una determinata cartella si trova su un filesystem remoto (nfs) montato all'interno di uno script di shell?

Sto cercando un comando simile a:

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

Risposte:


34

Come dice Stephane "non esiste una risposta universale a Unix".

La migliore soluzione che ho trovato alla mia domanda:

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

restituirà il tipo di filesystem, ad esempio: nfso ext3.

L' -Topzione non è standard , quindi potrebbe non funzionare su altri sistemi Unix / Linux ...

Secondo il commento di Gilles di seguito: "Funziona su qualsiasi Linux non incorporato, ma non su BusyBox, * BSD, ecc."


1
Funziona su qualsiasi Linux non incorporato, ma non su BusyBox, * BSD, ecc. Sta a te decidere se è abbastanza buono.
Gilles 'SO- smetti di essere malvagio' il

La visualizzazione /etc/mtabo i risultati mountanziché utilizzare dfpotrebbero essere utili in alcuni casi.
TNW,

1
@TNW o anche/proc/mounts
laebshade,

1
Apparentemente, né mount, né /etc/mtab, nemmeno /proc/mountssono standard quindi non c'è garanzia su cosa si possa trovare lì ...
Totor,

1
Questo non funziona su OSX 10.8 poiché qui -Tha un significato diverso
DavAlPi il

13

Puoi usare GNU stat.

%m per scoprire il mountpoint.

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

%T (in modalità file system) per scoprire il nome del file system.

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

Quindi sai che /usr/src/linux, sul mio sistema, è memorizzato in un filesystem che è montato /usr/srce ha il tipo di filesystem reiserfs.

Fare riferimento anche man statper ulteriori riferimenti. È un comando molto versatile, utile quasi sempre quando hai bisogno di informazioni sui file e non vuoi tornare al grep | awkreparto.


La mia versione di statnon ha l' %mopzione per --format(usando Debian Squeeze, coreutils 8.5). Quindi, suppongo che questa soluzione non sia molto affidabile.
Totor

Non ci credevo, ma la differenza tra coreutils 8.5 e 8.13 (debian wheezy) dice che hai ragione, però. Considerami molto sorpreso :) La compressione è troppo vecchia :( err, troppo stabile
frostschutz

1
dalle coreutils Changelog: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Sono passati quasi 3 anni. Incredibile che Debian non abbia ancora questo.
frostschutz,

Anche se Debian Squeeze è stato rilasciato il 06/02/2011, è stato congelato il 06-08-2010, prima che questo coreutils cambi ... Sto piuttosto cercando una soluzione "standard" possibile, se possibile.
Totor

Bene, potresti semplicemente usare il comando% T del file system, se funziona nella vecchia stat. Se neanche questo funziona e la tua versione di stat non fornisce le informazioni di cui hai bisogno, torna alle soluzioni scomode che è.
frostschutz,

4

mount -le utilizzare grep, sedoppure awkper trovare la riga che fa riferimento alla directory in questione.


Sembra complicato capire che in /my/path/to/the/directoryrealtà è qualcosa dal mountpoint /my/pathcon la tua risposta. Forse si può dare qualche dettaglio in più sul grep, sed, awkcomandi suggerire (una risposta completa) ?.
Totor

mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'dovrebbe darti un elenco di tutti i mountpoint di nfs sul sistema.
Andy Shulman,

Questo può essere combinato con il mount | fgrep "`stat --printf=" on %m type" /var/log/`". The comando stat: mount` stamperà tutti i punti di mount, nel <device> on <mountpoint> type <type>formato. Per grep questo, ho stat --printfgenerato la on <mountpoint> typeparte.
Salmi

ci sono molti tipi di montaggio del filesystem locale e remoto. avere una mappa di tutti loro può essere una sfida. (ad esempio drvfs è locale o remoto?)
Erik Aronesty il

Sì, ma la domanda si pone specificamente su nfs: "montato filesystem remoto (nfs)"
jayhendren,

2

Sfortunatamente, non esiste una risposta universale a Unix.

Una cosa che puoi fare, per un dato file /a/b/c/dè percorrere il percorso:

  • / A / b / c /.
  • / A / b / c / ..
  • /a/b/c/../ ..
  • ...

... e fai un stat(2)a ogni livello, fino a quando le st_devmodifiche. Quindi saprai dove si trova il punto di montaggio. Quindi puoi cercare il percorso canonico di quel punto di mount all'interno /etc/mtabo nell'output di mountper scoprire il tipo di file system. Quindi scoprire cosa è remoto e cosa non lo sarà sarà difficile soprattutto per quelli di tipo a miccia. Per esempio, nfs, cifs, fuse.sshfs, fuse.davfssono evidenti, ma per quanto riguarda per esempio fuse.gvfs-fuse-daemono fuse.avfsdche possono avere entrambe le file di rete e non in rete?


Bene, sto usando nfs qui (modificato la mia domanda). Per quanto riguarda stat(2), penso che stai facendo riferimento alla funzione C, ma sto usando shell. Tuttavia, st_devfa riferimento all'ID dispositivo principale e secondario (è specifico di Linux?) E il comando shell stat(1)ha (non standard) %te %Tcon le --formatopzioni per i numeri rispettivamente maggiore e minore, ma restituisce sempre "0" (local e nfs ). Ho provato Debian Squeeze e Lenny.
Totor

Ci stai provando con o senza l' --file-systemopzione?
frostschutz,

@frostschutz Without. Ha un altro significato se utilizzato con --file-system.
Totor

2

Il "-l" a df (1) fallirà con un errore sui filesystem non locali, quindi puoi usare questo comportamento per sapere se il filesystem è remoto:

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

Tuttavia, l' -lopzione non è standard .


Questa non è una risposta
Totor,

@Totor perché no? Certo, ci sono dfmolti altri motivi per cui fallirebbe e questo da solo rende questa una risposta non molto buona, ma sta cercando di rispondere alla domanda, quindi non vedo perché la chiameresti "non una risposta".
terdon

@terdon sono d'accordo. Non ho letto abbastanza attentamente. Grazie per averlo sottolineato. Modificherò e voterò. :)
Totor,

Questo è fondamentalmente l'unico che funziona in modo affidabile su Linux.
Erik Aronesty,

1

df /pathti dirà che /pathè un mount point se dice che il mount point non lo è /.


1
La domanda si riferisce a un punto di montaggio remoto .
Totor,

1

Basta fare

df /me/path/to/folder

Se il primo campo (il filesystem) è nel formato host: / percorso allora sai che è NFS


0

È possibile utilizzare i df -tsistemi Linux e df -TBSD.

Da man df :

-t, --type = TYPE

limitare l'elenco ai file system di tipo TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi

Molto carino. Tuttavia, e sfortunatamente, l' -topzione ha un significato diverso in POSIX / SUS. Pertanto, l'utilizzo di questa opzione può fornire risultati incoerenti in diverse versioni sullo strumento / UNIX.
Totor,

-2

Personalmente userei mountpoint(molto portatile su Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

o showmountche è praticamente necessario installare su qualsiasi sistema che effettivamente monta NFScondivisioni (parte del nfs-commonpacchetto):

NAME
       showmount - show mount information for an NFS server

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

Un'altra opzione sarebbe qualcosa del tipo:

$ mount -l -t nfs | grep 'my mount point'

1
L' mountpointutilità non ti dice se il punto di montaggio è remoto. Inoltre, i filesystem remoti non si limitano ai filesystem NFS. Infine, mountpointnon è standard (non in questo elenco ).
Totor

hai specificamente richiesto uno strumento su Linux e NFS, mountpointin questo caso è standard.
malat,

Questo non risponde comunque al mio primo punto.
Totor

-3
find . -type d -name nfs -exec mountpoint {} \; | grep not

controllerà tutte le cartelle denominate 'nfs' se sono montate


OP non sta cercando cartelle denominate nfs.
codeforester
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.