ディレクトリのハードリンクは、複数の方法でファイルシステムを破壊します
ループを作成できます
ディレクトリへのハードリンクは、それ自体の親にリンクでき、ファイルシステムループを作成します。たとえば、これらのコマンドはバックリンクでループを作成できますl
。
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
ディレクトリループのあるファイルシステムの深さは無限です:
cd /tmp/a/b/l/b/l/b/l/b/l/b
このようなディレクトリ構造を走査するときに無限ループを回避することはやや困難です(たとえば、POSIXではfind
これを回避する必要があります)。
この種のハードリンクを含むファイルシステムは、ツリーではありません。ツリーは、定義上、ループを含んではならないためです。
親ディレクトリの曖昧さを解消します
ファイルシステムループでは、複数の親ディレクトリが存在します。
cd /tmp/a/b
cd /tmp/a/b/l/b
最初の場合、/tmp/a
はの親ディレクトリです/tmp/a/b
。
2番目の場合、/tmp/a/b/l
はの親ディレクトリです/tmp/a/b/l/b
。これはと同じ/tmp/a/b
です。
そのため、2つの親ディレクトリがあります。
ファイルを増やす
ファイルは、シンボリックリンクを解決した後、パスによって識別されます。そう
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
異なるファイルです。
さらに多くのファイルのパスがあります。もちろん、iノード数の点では同じです。ただし、ループを明示的に予期していない場合は、それを確認する理由はありません。
ディレクトリハードリンクは、子ディレクトリ、または任意の深さの子でも親でもないディレクトリを指すこともできます。この場合、リンクの子であるファイルは、2つのパスで識別される2つのファイルに複製されます。
あなたの例
$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar
ディレクトリへのソフトリンクはどのように機能しますか?
ソフトリンクやソフトリンクされたディレクトリループを含む可能性のあるパスは、ファイルを識別して開くためだけによく使用されます。通常の線形パスとして使用できます。
しかし、パスを使用してファイルを比較する場合、他の状況もあります。この場合、パス内のシンボリックリンクを最初に解決し、それを最小値に変換し、一般的なパスを作成する表現に一般的に同意することができます。
ソフトリンクはすべて、リンクなしのパスに展開できるため、これは可能です。パス内のすべてのソフトリンクでこれを実行すると、残りのパスはツリーの一部になり、パスは常に明確になります。
このコマンドreadlink
は、パスを正規のパスに解決できます。
$ readlink -f /some/symlinked/path
ソフトリンクはファイルシステムが使用するものとは異なります
ソフトリンクはファイルシステム内のリンクとは異なるため、すべての問題を引き起こすことはできません。ハードリンクと区別でき、必要に応じてシンボリックリンクのないパスに解決できます。
ある意味では、シンボリックリンクを追加しても基本的なファイルシステム構造は変更されません-維持されますが、アプリケーション層のような構造が追加されます。
からman readlink
:
NAME
readlink - print resolved symbolic links or canonical
file names
SYNOPSIS
readlink [OPTION]... FILE...
DESCRIPTION
Print value of a symbolic link or canonical file name
-f, --canonicalize
canonicalize by following every symlink in
every component of the given name recursively;
all but the last component must exist
[ ... ]