ファイルはメタデータを持つiノードであり、その中にデータの検索場所へのポインタのリストがあります。
ファイルにアクセスできるようにするには、ファイルをディレクトリにリンクする必要があります(ディレクトリをフォルダではなく電話ディレクトリと考えてください)。つまり、1つ以上のエントリを1つ以上のディレクトリに追加して、名前をそのファイルに関連付けます。
これらすべてのリンク、それらのファイル名は同じファイルを指します。オリジナルのリンクとリンクのリンクはありません。これらはすべて、ディレクトリツリー内の同じファイル(同じiノード)へのアクセスポイントです。ファイルのサイズ(lstat
システムコール)を取得すると、iノードに格納されている情報(上記のメタデータ)を取得します。どのファイル名、そのファイルを参照するためにどのリンクを使用しているかは関係ありません。
対照的に、シンボリックリンクは、コンテンツがターゲットファイルへのパスである別のファイル(別のiノード)です。他のファイルと同様に、これらのシンボリックリンクはディレクトリにリンクする必要があります(名前が必要です)。また、シンボリックリンクへのリンクを複数持つこともできます。つまり、シンボリックリンクに(1つまたは複数のディレクトリで)複数の名前を付けることができます。
$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a
ファイル番号10486707の上は通常のファイルです。現在のディレクトリ内の2つのエントリ(1つはname a
、もう1つはname b
)がリンクしています。リンクカウントが2であるため、現在のディレクトリまたは他のディレクトリにそのファイルの他の名前がないことがわかります。ファイル番号10502404は別のファイルで、今回はシンボリックタイプのファイルが現在のディレクトリに2回リンクされています。そのコンテンツ(ターゲット)は相対パス「a」です。
10502404が現在のディレクトリとは別のディレクトリにリンクされている場合、通常、アクセス方法に応じて異なるファイルを指します。
$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
2:
total 92
10608674 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar
ファイルには、それらをリンクするディレクトリ以外の名前は関連付けられていません。名前が使用するスペースは、これらのディレクトリのエントリであり、ディレクトリのファイルサイズ/ディスク使用量に含まれます。
ファイルを削除するシステムコールがであることに気付くでしょうunlink
。つまり、ファイルを削除せずに、参照先のディレクトリからリンクを解除します。特定のファイルへのエントリがあった最後のディレクトリからリンクを解除すると、そのファイルは破棄されます(プロセスがない限り)開いた)。
lstat
、サイズを取得するシステムコールにはカウントされないためです。