ディレクトリ構造とファイルシステムの違いは何ですか?
Unix/Linux ディレクトリおよびファイルシステムは次のようになります。
次の2つのディレクトリは明らかにディレクトリを知っています。
/home/abc/xyzdir1 --is a directory
/home/abc/xyzdir2 -- is a directory
次の3つのサンプルは、ファイルシステムと言っています。
/proc -- is a file system
/ -- is a file system
/bin -- is a file system
上記のコードスニペットからファイルシステムとディレクトリを識別するにはどうすればよいですか?
人々はfile systemを慎重に使用していません。あなたの例では、パーティション全体(/
など)がこれらのディレクトリにマウントされているため、/bin
、/proc
、および/dev/sdb1
はファイルシステムであると言えます。私のArch Linuxシステムにはファイルシステムとして/bin
がないため、この例は完全ではありませんが...
% ls -lid /proc /home /boot /
2 drwxr-xr-x 17 root root 4096 Feb 24 12:12 //
2 drwxr-xr-x 4 root root 4096 May 16 14:29 /boot/
2 drwxr-xr-x 5 root root 4096 Mar 14 18:11 /home/
1 dr-xr-xr-x 116 root root 0 May 16 17:18 /proc/
Iノード番号2は、従来、ディスク上のファイルシステム全体の「ルート」iノードです(これは、フレーズの他の使用法です)。 /
、/boot
、および/home
はすべてiノード番号2を持ち、/proc
はカーネルによって完全に提示され、ディスク上に存在しないため、iノード1を持っています。これらのiノード番号は、ディスク上のファイルシステム全体、または仮想ファイルシステムがその名前を使用してマウントされていることを示しています。
「/home/abc/xyzdir1
is a directory」という文は、基本的にその名前を使用してディスク上のファイルシステムがマウントされていないことを意味します。ディレクトリで同じls -lid
コマンドを実行すると、次のようになります。
% ls -lid /home/bediger/src
3670039 drwxr-xr-x 29 bediger bediger 4096 May 17 19:57 /home/bediger/src/
Iノード番号3670039は、/home
にマウントされた(私のマシンに)ディスク上のファイルシステムで割り当てられたiノードです。
mount
コマンドを呼び出してファイルシステムを見つけることもできます。マウントされているすべてのファイルシステムとそれらがマウントされている場所が一覧表示されます。
私の見たところ、UNIXの意味でのファイルシステムは、ディレクトリツリー(ディレクトリ構造)を実装する方法であり、より正確には、UNIXファイルシステムAPIを実装する方法です。ルートファイルシステムは1つの特定の実装によって支えられており、マウントポイントディレクトリに入るときはいつでも、別の何かによって支えられたサブツリーに入ります。
インターフェースは常に同じですが、バックエンドに特定のディスクパーティションがある場合と、ストレージデバイスに書き込みを行わないプログラムがある場合があります。 proc
ファイルシステムは、カーネルの内部を公開するソフトウェアによってサポートされます。 tmpfs
はRAMに書き込むソフトウェアによってバックアップされ、他のファイルシステムはネットワークまたは他の場所に書き込む可能性があります。
UNIX以外の言葉で言うと、ファイルシステムはデータストレージを編成する方法の1つです。 ext4
、btrfs
、fat
、およびntfs
は、この意味ではファイルシステムですが、UNIXの意味でも、ファイルシステムAPIを実装しています。 proc
は、データストレージを整理しないため、このより制限されたパラダイム内のファイルシステムとして分類されません。
TL; DR:
ファイルシステムについて話している場合、ディレクトリの受け入れは明確ですが、ファイルシステムは、話している内容によって意味が異なる場合があります。
あなたの例では、リストされたすべてのパスはディレクトリですが、それらの一部のみがファイルシステムのマウントポイントでもあります。
df
コマンドを使用して、特定のファイルまたはディレクトリがどのファイルシステムであるかを知ることができます。また、ほとんどのUnixおよびLinuxの実装でmount
コマンドを使用して、マシンに存在するファイルシステムを把握できます。 、そのタイプとマウントポイント。例えば:
$ df /proc
Filesystem 1K-blocks Used Available Use% Mounted on
proc 0 0 0 - /proc
$ mount | grep -w /proc
/proc is a file system of type proc
ステートメント/bin
はファイルシステムが不明確であり、/bin
はほとんどの場合/
にマウントされます。
$ df -k /bin
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda5 206292664 180687360 15103212 93% /
$ mount | grep -w /
/dev/sda5 on / type ext4 (rw,errors=remount-ro)
パスがディレクトリであるかどうかを通知するコマンドが必要な場合は mountpoint(1) を使用します。
私にとっては
$ mountpoint /
/ is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint
$ mountpoint some-file
some-file is not a mountpoint
良いのは、終了ステータスが同じであることを示すため、次のようにスクリプトで使用できることです。
if mountpoint "$foo" >/dev/null; then
: do mountpoint stuff
Elif [ -d "$foo" ]; then
: do directory stuff
Elif [ -e "$foo" ]; then
: do file stuff
else
echo "$foo does not exist!" >/2
fi
最初に、ファイルシステムとディレクトリに関する想定の修正。ファイルシステムには、1つ以上のディレクトリが含まれています。あなたの例を使って、/proc
、/
および/bin
はディレクトリです。それらはそれ自体では「ファイルシステム」ではありませんが、それぞれのファイルシステムのルートである可能性があります。
ファイルシステムのマウントポイント(ルート)でもあるディレクトリを特定する場合は、次のように使用できます。
F="$PWD" # The directory to be tested
if test -d "$F"
then
echo "$F is a directory"
test "X$(stat --format '%m' "$F")" = "X$PWD" && echo "$F is a mountpoint"
fi