Periksa apakah folder adalah sistem file jarak jauh yang terpasang


44

Apa cara terbaik (dapat diandalkan, portabel, dll.) Untuk memeriksa apakah folder yang diberikan ada pada sistem file remote yang terpasang (nfs) dalam skrip shell?

Saya mencari perintah yang akan terlihat seperti:

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

Jawaban:


34

Seperti yang dikatakan Stephane , "tidak ada jawaban Unix universal untuk itu".

Solusi terbaik yang saya temukan untuk pertanyaan saya:

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

akan mengembalikan tipe sistem file, misalnya: nfsatau ext3.

The -Tpilihan tidak standar , sehingga tidak mungkin bekerja pada sistem Unix / Linux lainnya ...

Menurut komentar Gilles di bawah ini: "Ini berfungsi pada Linux yang tidak tertanam, tetapi tidak pada BusyBox, * BSD, dll."


1
Ini berfungsi pada Linux yang tidak tertanam, tetapi tidak pada BusyBox, * BSD, dll. Terserah Anda untuk memutuskan apakah itu cukup baik.
Gilles 'SANGAT berhenti menjadi jahat'

Melihat /etc/mtabatau hasil mountdaripada menggunakan dfbisa dilakukan dalam beberapa kasus lagi.
TNW

1
@TNW atau bahkan/proc/mounts
laebshade

1
Tampaknya, tidak ada mount, atau /etc/mtabbahkan /proc/mountstidak standar sehingga tidak ada jaminan tentang apa yang dapat ditemukan di sana ...
Totor

1
Ini tidak berfungsi pada OSX 10.8 karena -Tmemiliki arti berbeda di sini
DavAlPi

13

Anda bisa menggunakan GNU stat.

%m untuk mengetahui titik mount.

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

%T (dalam mode sistem file) untuk mengetahui nama sistem file.

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

Dengan demikian, Anda tahu bahwa /usr/src/linux, di sistem saya, disimpan dalam sistem file yang di-mount /usr/srcdan memiliki tipe sistem file reiserfs.

Lihat juga man statuntuk referensi lebih lanjut. Ini adalah perintah yang sangat serbaguna, berguna hampir selalu ketika Anda membutuhkan info tentang file dan tidak ingin kembali ke grep | awkwardness.


Versi saya dari stattidak memiliki %mopsi untuk --format(menggunakan Debian Squeeze, coreutils 8.5). Jadi, saya kira solusi ini tidak terlalu bisa diandalkan.
Totor

Saya tidak percaya, tetapi perbedaan antara coreutils 8.5 dan 8.13 (debian wheezy) mengatakan Anda benar. Anggap saya sangat terkejut :) pemerasan terlalu lama :( err, terlalu stabil
frostschutz

1
dari coreutils changelog: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Itu hampir 3 tahun yang lalu. Luar biasa bahwa Debian masih belum memiliki ini.
frostschutz

Bahkan jika Debian Squeeze dirilis pada 2011-02-06, itu dibekukan pada 2010-08-06, sebelum coreutil ini berubah ... Saya lebih suka mencari solusi "standar" jika memungkinkan.
Totor

Nah, Anda bisa menggunakan perintah file-system% T, jika itu berfungsi di stat lama. Jika itu tidak berhasil dan versi stat Anda tidak memberikan informasi yang Anda butuhkan, kembalilah ke solusi canggung itu.
frostschutz

4

mount -ldan gunakan grep,, sedatau awkuntuk menemukan baris yang merujuk ke direktori yang dimaksud.


Tampaknya rumit untuk mengetahui bahwa /my/path/to/the/directorysebenarnya ada sesuatu dari mountpoint /my/pathdengan jawaban Anda. Mungkin Anda bisa memberikan beberapa rincian lebih lanjut tentang grep, sed, awkperintah Anda menyarankan (jawaban yang lengkap) ?.
Totor

mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'seharusnya memberi Anda daftar semua nfs mountpoints pada sistem.
Andy Shulman

Ini dapat dikombinasikan dengan mount | fgrep "`stat --printf=" on %m type" /var/log/`". The perintah stat: mount` akan mencetak semua titik mount, dalam <device> on <mountpoint> type <type>format. Untuk memahami ini, saya telah stat --printfmenghasilkan on <mountpoint> typebagian.
MSalters

ada banyak tipe mount filesystem lokal dan jarak jauh. memiliki peta semuanya mungkin menantang. (misalnya adalah drvfs lokal atau jauh?)
Erik Aronesty

Ya, tetapi pertanyaannya secara spesifik menanyakan tentang nfs: "filesystem yang dipasang di jarak jauh (nfs)"
jayhendren

2

Sayangnya, tidak ada jawaban Unix universal untuk itu.

Satu hal yang dapat Anda lakukan, untuk file yang diberikan /a/b/c/dadalah berjalan di jalan:

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

... dan lakukan stat(2)pada setiap level, hingga st_devperubahan. Maka Anda akan tahu di mana titik mount. Kemudian Anda dapat mencari jalur kanonik titik mount itu /etc/mtabatau dalam output mountuntuk mengetahui tipe sistem file. Kemudian mencari tahu apa yang jauh dan apa yang tidak akan menjadi rumit terutama untuk yang tipe sekering. Misalnya, nfs, cifs, fuse.sshfs, fuse.davfsyang jelas, tapi bagaimana misalnya fuse.gvfs-fuse-daemonatau fuse.avfsdyang dapat memiliki keduanya jaringan dan non-jaringan file?


Yah, saya menggunakan nfs di sini (mengedit pertanyaan saya). Adapun stat(2), saya pikir Anda merujuk fungsi C, tapi saya menggunakan shell. Namun, st_devmerujuk ke ID perangkat utama dan kecil (apakah itu spesifik untuk Linux?), Dan perintah shell stat(1)memiliki (non-standar) %tdan %Tdengan --formatopsi untuk masing-masing nomor besar dan kecil, tetapi selalu mengembalikan "0" (lokal dan nfs ). Saya mencoba pada Debian Squeeze dan Lenny.
Totor

Apakah Anda mencoba ini dengan atau tanpa --file-systemopsi?
frostschutz

@ frostschutz Tanpa. Ini memiliki arti lain jika digunakan bersama --file-system.
Totor

2

"-L" ke df (1) akan gagal dengan kesalahan pada sistem file non-lokal, sehingga Anda dapat menggunakan perilaku ini untuk mengetahui apakah sistem file jauh:

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

Namun, -lopsi ini tidak standar .


Ini bukan jawaban
Totor

@ Motor kenapa tidak? Memang, ada segala macam alasan lain mengapa dfgagal dan itu saja membuat ini bukan jawaban yang sangat baik, tetapi ia mencoba menjawab pertanyaan itu jadi saya tidak melihat mengapa Anda menyebutnya "bukan jawaban".
terdon

@terdon saya setuju. Saya tidak cukup membaca. Terima kasih telah menunjukkan ini. Saya akan mengedit dan memilih. :)
Totor

Ini pada dasarnya satu-satunya yang bekerja dengan andal di linux.
Erik Aronesty

1

df /pathakan memberi tahu Anda bahwa itu /pathadalah titik pemasangan jika dikatakan bahwa titik pemasangan bukan /.


1
Pertanyaannya mengacu pada titik pemasangan jarak jauh .
Totor

1

Kerjakan saja

df /me/path/to/folder

Jika bidang pertama (Filesystem) dalam format host: / path maka Anda tahu itu adalah NFS


0

Anda dapat menggunakan df -tdi Linux dan df -Tdi sistem BSD.

Dari man df :

-t, --type = TYPE

membatasi daftar ke sistem file tipe TYPE

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

Cukup bagus. Namun, dan sayangnya, -topsi tersebut memiliki arti berbeda dalam POSIX / SUS. Jadi, menggunakan opsi ini dapat memberikan hasil yang tidak konsisten dalam versi yang berbeda pada alat / UNIX.
Totor

-2

Saya pribadi akan menggunakan mountpoint(sangat portabel di Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

atau showmountyang cukup banyak harus diinstal pada sistem apa pun yang benar-benar me-mount NFSshare (bagian dari nfs-commonpaket):

NAME
       showmount - show mount information for an NFS server

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

Pilihan lain akan seperti:

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

1
The mountpointutilitas tidak memberitahu Anda jika mount point terpencil. Selain itu, sistem file jarak jauh tidak terbatas pada sistem file NFS. Akhirnya, mountpointtidak standar (tidak ada dalam daftar ini ).
Totor

Anda secara khusus meminta alat di linux dan NFS, mountpointadalah standar dalam hal ini.
malat

Ini tidak menjawab poin pertama saya.
Totor

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

akan memeriksa semua folder bernama 'nfs' jika sudah terpasang


OP tidak mencari folder dengan nama nfs.
codeforester
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.