Klasörün bağlı bir uzak dosya sistemi olup olmadığını kontrol edin


43

Belirli bir klasörün bir kabuk betiğinde monte edilmiş bir uzak (nfs) dosya sisteminde olup olmadığını kontrol etmenin en iyi yolu (güvenilir, taşınabilir vb.) Nedir?

Şuna benzeyen bir komut arıyorum:

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

Yanıtlar:


34

As Stephane diyor "buna hayır evrensel Unix cevabı yoktur".

Soruma bulduğum en iyi çözüm:

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

dosya sistemi türünü döndürür, örneğin: nfsveya ext3.

Bu -Tseçenek standart değildir , bu nedenle diğer Unix / Linux sistemlerinde çalışmayabilir ...

Gilles'un aşağıdaki yorumuna göre : "Bu, gömülü olmayan Linux'larda çalışır, ancak BusyBox, * BSD, vb."


1
Bu, tümleşik olmayan Linux'larda çalışır, ancak BusyBox, * BSD, vb. Üzerinde çalışmaz. Bunun yeterince iyi olup olmadığına karar vermek size bağlıdır.
Gilles 'SO- kötülük olmayı'

Kullanım yerine görüntülemek /etc/mtabveya sonuçlarını görüntülemek bazı durumlarda daha iyi olabilir. mountdf
TNW

1
@TNW veya hatta/proc/mounts
laebshade

1
Görünüşe göre, ne mount, ne de standart /etc/mtabbile değil /proc/mounts, bu yüzden orada bulunabilecekleri konusunda hiçbir garanti yok ...
Totor

1
Bu OSX -T
10.8’de

13

GNU’yu kullanabilirsiniz stat.

%m Bağlantı noktasını bulmak için.

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

%T (dosya sistemi modunda) dosya sisteminin adını bulmak için.

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

Böylece /usr/src/linux, benim sistemimde, üzerine kurulu /usr/srcve dosya sistemi türünde bir dosya sisteminde depolandığını biliyorsunuz reiserfs.

Ayrıca man statdaha fazla referans için bakınız . Çok yönlü bir komuttur, neredeyse her zaman dosyalar hakkında bilgiye ihtiyaç duyduğunuzda ve grep | awkservise geri dönmek istemediğinizde yararlıdır.


Benim sürümüm (Debian Squeeze, coreutils 8.5 kullanarak) seçeneğim statyok . Yani, bu çözüm çok güvenilir değil sanırım. %m--format
Totor,

İnanmadım, ancak çekirdek 8 ve 8.13 arasındaki çekirdek farkları (debian wheezy) haklı olduğunu söylüyor. Beni çok şaşırttı düşünün :) sıkmak sadece çok eski :( err, çok kararlı
frostschutz

1
coreutils gelen changelog: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Neredeyse 3 yıl önceydi. Şaşırtıcı Debian hala buna sahip değil.
frostschutz

Debian Squeeze, 2011-02-06 tarihinde piyasaya sürülse bile , 2010-08-06 tarihinde dondurulmuş , bu çekirdekler değişmeden önce ... Mümkünse mümkün olan "standart" bir çözüm aramayı tercih ediyorum.
Totor,

Eğer eski stat ile çalışıyorsa, sadece% T dosya-sistemi komutunu kullanabilirsiniz. Bu da işe yaramazsa ve stat sürümünüz ihtiyacınız olan bilgiyi sağlamazsa, garip çözümlere geri dönersiniz.
frostschutz

4

mount -lve kullanımı grep, sedya da awksöz konusu dizine başvuran satırı bulmak için.


Bunun cevabınızla birlikte /my/path/to/the/directoryaslında başlangıç ​​noktasından bir şey olduğunu anlamak karmaşık görünüyor /my/path. Belki biraz daha ayrıntılı verebilir grep, sed, awksen (tam bir cevap) önermek komutları ?.
Totor,

mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'sistemdeki tüm nfs bağlantı noktalarının bir listesini vermelidir.
Andy Shulman

Bu, stat ile birleştirilebilir: mount | fgrep "`stat --printf=" on %m type" /var/log/`". The mount` komutu, tüm mount noktalarını <device> on <mountpoint> type <type>biçiminde basar . Bunu anlamak stat --printfiçin, on <mountpoint> typeparçayı ben oluşturdum .
MSalters,

Çok sayıda yerel ve uzak dosya sistemi bağlama türü vardır. hepsinin bir haritasına sahip olmak zor olabilir. (örneğin drvfs yerel mi yoksa uzak mı?)
Erik Aronesty

Evet, ancak soru özellikle nfs ile ilgili: "monte uzak (nfs) dosya sistemi"
jayhendren

2

Ne yazık ki, bunun için evrensel bir Unix cevabı yoktur.

Belirli bir dosya için yapabileceğiniz şeylerden biri /a/b/c/dyolu yürümek:

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

... değişinceye stat(2)kadar her seviyede bir a yapın st_dev. O zaman bağlama noktasının yerini bileceksiniz. Ardından , dosya sistemi türünü bulmak /etc/mtabiçin bu bağlama noktasının kurallı yolunu çıkışın içinde veya içinde mountbulabilirsiniz. Sonra neyin uzak olduğunu ve neyin olmayacağını özellikle sigorta tipi olanlar için zor olacağını keşfedin. Örneğin, nfs, cifs, fuse.sshfs, fuse.davfsortada, ama ne hakkında mesela fuse.gvfs-fuse-daemonya fuse.avfsdher iki ağ ve ağ dışı dosyaları olabilir?


Ben burada nfs kullanıyorum (sorumu düzenledi). Gelince stat(2), ben C fonksiyonunu refering, ancak ben kabuğu kullanıyorum düşünüyorum. Bununla birlikte, st_devbüyük ve küçük aygıt kimliğine atıfta bulunur (Linux belirli midir?) Ve shell komutunda stat(1)(standart dışı) %tve sırasıyla büyük ve küçük sayılar %Tiçin --formatseçenekler bulunur, ancak her zaman "0" (yerel ve nfs) döndürür. ). Debian Squeeze ve Lenny'yi denedim.
Totor,

Bu --file-systemseçeneği seçenekli veya seçeneksiz olarak mı deniyorsunuz ?
frostschutz

@frostschutz Olmadan. Kullanıldığı takdirde başka bir anlamı vardır --file-system.
Totor,

2

"-L" - df (1) yerel olmayan dosya sistemlerinde bir hatayla başarısız olur, bu nedenle dosya sisteminin uzak olup olmadığını bilmek için bu davranışı kullanabilirsiniz:

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

Ancak, -lseçenek standart değildir .


Bu bir cevap değil
Totor

@Totor neden olmasın? Kabul edilirse, neden dfbaşarısızlığa uğrayacağına dair başka birçok neden vardır ve bu tek başına bunu çok iyi bir cevap değildir, ancak soruyu cevaplamaya çalışıyor, bu yüzden neden "cevap değil" dediğini anlayamıyorum.
terdon

@ terdon Katılıyorum. Yeterince dikkatli okumadım. Bunu gösterdiğin için teşekkür ederim. Düzenleyeceğim ve oylayacağım. :)
Totor

Bu temelde linux üzerinde güvenilir bir şekilde çalışan tek kişidir.
Erik Aronesty

1

df /path/pathbağlama noktasının olmadığını söylerse bu bağlantı noktası olduğunu söyleyecektir /.


1
Bu soru uzak bir montaj noktasına işaret ediyor.
Totor,

1

Sadece yap

df /me/path/to/folder

İlk alan (Dosya Sistemi) format host: / path ise, NFS olduğunu bilirsiniz.


0

Sen kullanabilirsiniz df -tLinux ve df -TBSD sistemlerinde.

Gönderen adam df :

-t, --type = TİP

TYPE türündeki dosya sistemlerinde listeyi sınırlandır

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

Çok hoş. Bununla birlikte ve ne yazık ki, -tseçeneğin POSIX / SUS'ta farklı bir anlamı vardır. Bu nedenle, bu seçeneğin kullanılması, araç / UNIX'teki farklı sürümlerde tutarsız sonuçlar verebilir.
Totor,

-2

Şahsen kullanırdım mountpoint(Linux'ta çok taşınabilir!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

ya showmountda gerçekte NFShisse senetlerini bağlayan herhangi bir sisteme kurulması zorunludur ( nfs-commonpaketin bir parçası ):

NAME
       showmount - show mount information for an NFS server

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

Başka bir seçenek gibi bir şey olurdu:

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

1
Yardımcı mountpointprogram size bağlama noktasının uzak olup olmadığını söylemez. Ayrıca, uzak dosya sistemleri NFS dosya sistemleriyle sınırlı değildir. Son olarak, mountpointstandart değildir ( bu listede değil ).
Totor,

Özellikle Linux ve NFS için bir araç talep ettiniz mountpoint, bu durumda standart bir yöntemdir.
malat

Bu zaten ilk noktaya cevap vermiyor.
Totor

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

eğer monte edilmişlerse 'nfs' adlı tüm klasörleri kontrol edecek


OP adlı klasör aramıyor nfs.
codeforester
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.