web-dev-qa-db-ja.com

ディレクトリ構造とファイルシステム

ディレクトリ構造ファイルシステムの違いは何ですか?
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

上記のコードスニペットからファイルシステムディレクトリを識別するにはどうすればよいですか?

10
Premraj

人々は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コマンドを呼び出してファイルシステムを見つけることもできます。マウントされているすべてのファイルシステムとそれらがマウントされている場所が一覧表示されます。

8
Bruce Ediger

私の見たところ、UNIXの意味でのファイルシステムは、ディレクトリツリー(ディレクトリ構造)を実装する方法であり、より正確には、UNIXファイルシステムAPIを実装する方法です。ルートファイルシステムは1つの特定の実装によって支えられており、マウントポイントディレクトリに入るときはいつでも、別の何かによって支えられたサブツリーに入ります。

インターフェースは常に同じですが、バックエンドに特定のディスクパーティションがある場合と、ストレージデバイスに書き込みを行わないプログラムがある場合があります。 procファイルシステムは、カーネルの内部を公開するソフトウェアによってサポートされます。 tmpfsはRAMに書き込むソフトウェアによってバックアップされ、他のファイルシステムはネットワークまたは他の場所に書き込む可能性があります。

UNIX以外の言葉で言うと、ファイルシステムはデータストレージを編成する方法の1つです。 ext4btrfsfat、およびntfsは、この意味ではファイルシステムですが、UNIXの意味でも、ファイルシステムAPIを実装しています。 procは、データストレージを整理しないため、このより制限されたパラダイム内のファイルシステムとして分類されません。

TL; DR:

  • ディレクトリ構造/ツリー=フロントエンド
  • ファイルシステム=バックエンド
4
PSkocik

ファイルシステムについて話している場合、ディレクトリの受け入れは明確ですが、ファイルシステムは、話している内容によって意味が異なる場合があります。

あなたの例では、リストされたすべてのパスはディレクトリですが、それらの一部のみがファイルシステムのマウントポイントでもあります。

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)
2
jlliagre

パスがディレクトリであるかどうかを通知するコマンドが必要な場合は 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
Lucas

最初に、ファイルシステムとディレクトリに関する想定の修正。ファイルシステムには、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
1
roaima