フォルダがマウントされたリモートファイルシステムかどうかを確認します


44

特定のフォルダーがシェルスクリプト内のマウントされたリモート(nfs)ファイルシステムにあるかどうかを確認する最良の方法(信頼性、移植性など)は何ですか?

次のようなコマンドを探しています。

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

回答:


34

以下のようステファンは言う「と普遍的なUnixの答えはありません」。

私の質問に私が見つけた最良の解決策:

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

ファイルシステムのタイプを返します。例:nfsまたはext3

この-Tオプション標準はないため、他のUnix / Linuxシステムでは動作しない可能性があります...

以下のGillesのコメントによると:「これは、組み込みLinux以外で動作しますが、BusyBox、* BSDなどでは動作しません。」


1
これは、非組み込みLinuxで機能しますが、BusyBox、* BSDなどでは機能しません。それで十分かどうかはあなた次第です。
ジル 'SO-悪であるのをやめる'

使用する代わりに表示し/etc/mtabたり結果を表示したりmountするdfこともできます。
TNW

1
@TNWまたは/proc/mounts
laebshade

1
どうやら、どちらもmount、も/etc/mtab、でもない/proc/mounts...標準装備されていないので、そこに見つけることができるかについての保証はありません
Totor

1
OSX 10.8では動作しません。-Tここでは異なる意味を持っているため、
DavAlPi

13

GNUを使用できますstat

%m マウントポイントを見つけます。

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

%T (ファイルシステムモードで)ファイルシステムの名前を確認します。

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

したがって/usr/src/linux、私のシステムでは、にマウントされ/usr/src、ファイルシステムタイプがのファイルシステムに格納されていることがわかりますreiserfs

man stat詳細なリファレンスについても参照してください。これは非常に用途のgrep | awk広いコマンドであり、ファイルに関する情報が必要で、病みつきになりたくない場合にほぼ常に役立ちます。


私のバージョンにstatは(Debian Squeeze、coreutils 8.5を使用する)%mオプションがありません--format。したがって、このソリューションはあまり信頼性が高くないと思います。
トーター

私はそれを信じていませんでしたが、coreutils 8.5と8.13(debian wheezy)の違い​​はあなたが正しいと言います。非常に驚いたと
思い

1
変更履歴のcoreutilsから:2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file。それはほぼ3年前です。Debianにはまだこれがないのは驚くべきことです。
frostschutz

Debian Squeezeが2011-02-06にリリースされたとしても、このcoreutilsが変更される前の2010-08-06 に凍結されました...可能であれば、「標準」ソリューションを探しています。
トーター

それは、古いstatで機能する場合は、ファイルシステムの%Tコマンドを使用できます。それも機能せず、使用しているstatのバージョンが必要な情報を提供しない場合は、厄介なソリューションに戻ります。
frostschutz

4

mount -l、、またはを使用してgrep、問題のディレクトリを参照する行を見つけます。sedawk


それ/my/path/to/the/directoryが実際にマウントポイントから何か/my/pathがあなたの答えであると理解するのは複雑に見えます。たぶん、あなたはについてのいくつかの詳細を与えることができgrepsedawkあなたは(完全な答えを)提案するコマンド?。
トーター

mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'システム上のすべてのnfsマウントポイントのリストが表示されます。
アンディシュルマン14年

これはstatと組み合わせることができますmount | fgrep "`stat --printf=" on %m type" /var/log/`". The 。mount`コマンドは、すべてのマウントポイントを<device> on <mountpoint> type <type>形式で出力します。これを理解stat --printfするために、on <mountpoint> typeパーツを生成しました。
–MSalters

多くのローカルおよびリモートファイルシステムマウントタイプがあります。それらすべてのマップを作成するのは難しいかもしれません。(たとえば、drvfsはローカルですか、それともリモートですか?)
Erik Aronesty

はい。ただし、nfsについて具体的に尋ねる質問:「マウントされたリモート(nfs)ファイルシステム」
jayhendren

2

残念ながら、それに対する普遍的なUnixの答えはありません。

特定のファイルに対してできることの1つ/a/b/c/dは、パスをたどることです。

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

...そしてstat(2)st_dev変更まで各レベルでa を行います。そうすれば、マウントポイントの場所がわかります。次に、ファイルシステムタイプを見つけるため/etc/mtabに、またはその出力でそのマウントポイントの正規パスmountを検索できます。次に、何がリモートで何がリモートであるかを見つけることは、特にヒューズタイプの場合には注意が必要です。たとえば、nfscifsfuse.sshfsfuse.davfs明白ですが、何について例えばfuse.gvfs-fuse-daemonまたはfuse.avfsdその両方のネットワークと非ネットワークファイルを持つことができますか?


さて、ここでnfsを使用しています(私の質問を編集しました)。についてstat(2)は、C関数を参照していると思いますが、シェルを使用しています。しかし、st_devメジャーとマイナーのデバイスIDを参照し、シェルコマンド(Linuxは、特定の?ということである)stat(1)(非標準)を持つ%t%Tして--format、それぞれメジャー番号とマイナー番号のオプション、しかし、それは常に(ローカルおよびNFSを「0」を返します)。Debian SqueezeとLennyを試しました。
トーター

--file-systemオプションを使用して、または使用せずにこれを試行していますか?
frostschutz

@frostschutzなし。と共に使用すると、別の意味があり--file-systemます。
トーター

2

df(1)の「-l」は、ローカル以外のファイルシステムではエラーで失敗するため、この動作を使用して、ファイルシステムがリモートであるかどうかを確認できます。

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

ただし、この-lオプションは標準ではありません


これは答えではありません
-Totor

@Totorどうして?確かに、df失敗する他のあらゆる種類の理由があり、それだけではあまり良い答えではありませんが、質問に答えようとしているので、なぜ「答えではない」と呼ぶのかわかりません。
テルドン

@terdon同意します。私は十分に注意深く読みませんでした。これを指摘していただきありがとうございます。編集して投票します。:)
トーター

これは基本的に、Linuxで確実に動作する唯一の方法です。
エリックアロネスティ

1

df /path/pathマウントポイントがそうでないと言うなら、それはマウントポイントであるとあなたに言うでしょう/


1
質問はリモートマウントポイントを参照しています。
トーター

1

ただやる

df /me/path/to/folder

最初のフィールド(ファイルシステム)の形式がhost:/ pathの場合、それはNFSであることがわかります


0

df -tLinuxおよびdf -TBSDシステムで使用できます。

man dfから:

-t、-type = TYPE

タイプTYPEのファイルシステムにリストを制限する

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

かなりいい。ただし、残念ながら、POSIX / SUSでは-tオプションの意味異なります。そのため、このオプションを使用すると、ツール/ UNIXの異なるバージョンで一貫性のない結果が得られる場合があります。
トーター

-2

私は個人的に使用しますmountpoint(Linuxで非常にポータブルです!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

またはshowmount、実際にNFS共有(nfs-commonパッケージの一部)をマウントするシステムにインストールする必要があります:

NAME
       showmount - show mount information for an NFS server

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

別のオプションは次のようなものです:

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

1
mountpointマウントポイントがリモートの場合、ユーティリティはあなたを教えてくれありません。さらに、リモートファイルシステムはNFSファイルシステムに限定されません。最後に、mountpoint標準ではありません(このリストにはありません)。
トーター

LinuxとNFSのツールを具体的にリクエストしましたmountpointが、この場合は標準です。
マラト

とにかくこれは私の最初のポイントに答えません。
トーター

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.