FreeBSDではman mount_nullfs
指摘した:
ファイルシステムの仮想コピーとシンボリックリンクの主な違いは次のとおりです。これ
getcwd(3)
機能はうまくいきます。元のファイルシステムに影響を与えることなく、仮想コピーに他のファイルシステムをマウントできます。仮想コピーのその他のデバイス番号は、次のコマンドで返されます。stat(2)
ただし、他の点ではソースと区別することはできません。
この詩の全体的な意味/意味は何ですか?
答え1
ファイルシステムの仮想コピーとシンボリックリンクの主な違いは次のとおりです。機能は
getcwd(3)
うまくいきます。仮想コピーでは
getcwd
シンボルでリンクされたディレクトリの動作は、かなりよく知られているトラップです。高度なUNIXプログラミング例えば(参照この問題注):シンボリックリンクの場合は対称ではありませんchdir
。getcwd
以下を使用してディレクトリを変更すると予想できます。chdir
、指定されたディレクトリに移動し、次を使用して現在のディレクトリを検索します。getcwd
、同じ値を返しますが、プロセスがシンボリックリンクを含むパスにディレクトリを変更することはありません。getcwd
すべてのシンボリックリンクを逆参照した後に得られたパスが返されます。ディレクトリを親ディレクトリに変更すると、シンボリックリンクを含むパスと参照解除されたパスのコンポーネント数が異なると、意図しない結果が生じる可能性があります。
元のファイルシステムに影響を与えることなく、他のファイルシステムを仮想コピーにマウントできます。
スティーブンの話を続けるはい/tmp/b
、影響を与えずにサブディレクトリに別のファイルシステムをマウントすることができ、サブディレクトリにファイルシステムをマウントする/some/dir
と、/tmp/a
そのファイルシステムも/some/dir
。
仮想コピーの別のデバイス番号を返します
stat(2)
が、それ以外は元のデバイスと区別することはできません。
つまり、stat
コピーまたはその下のすべてのファイルを実行すると、元とは異なるデバイス番号が返されますが、これが唯一の違いです。それ以外の場合は、同じ情報が返されますstat("/tmp/b/c", &buf)
。stat("/some/dir/c", &buf)
答え2
私の考えでは、彼らが意味するのは/tmp/a
シンボリックリンク/some/dir
であり、/tmp/b
nullfsをマウントすることです/some/dir
。
- その後は
chdir("/tmp/a")
戻っgetcwd()
てください/some/dir
。 - その後は
chdir("/tmp/b")
戻っgetcwd()
てください/tmp/b
。
前者はそれほど重要ではない間違った。単にシンボリックリンクとnullfsマウントには2つの異なる意味があります。
chdir()
シンボリックリンクは、ファイルが別のファイルとして表示される場合(ディレクトリハードリンクの代わりに)、ほとんどのシステムが呼び出す
Symlink処理は一部の人々の期待を破ることができますが(getcwd()
ここに示すように)nullfsマウント(またはLinuxのbinfsヒューズファイルシステムまたは一部の統合ファイルシステム)は他の人の期待を破ることができます。つまり、[ /tmp/b/x -ef /some/dir/x ]
同じファイルでも false を返す場合です。下にあるか、プロセスがパスを介して開かれfuser /tmp/b/x
ても何も返されません。/some/dir/x
Linuxバインドマウント(ファイルを異ならせない)は、他人の期待を破る可能性があります。たとえば、find -xdev
/du -x
トラバースマウントポイント、リンク数が1の同じファイルへの2つのリンク(ファイルシステムでループを生成する可能性があります)FreeBSDのnullfsは、これが発生するのを防ぎます。
ハードリンク(ファイルを別のパスに表示する最も古い技術)も、一部のユーザーの期待を破る可能性があります(たとえば、ディレクトリからファイルのリンクを解除すると、そのファイルは使用できなくなると予想されます)。
だから私は1つがより多くを言うことはありません。正しいここで他よりも。