ハードリンクが元のリンクと同じスペースを占めるように見えるのはなぜですか?

ハードリンクが元のリンクと同じスペースを占めるように見えるのはなぜですか?

良いQ&Aをありがとうございます。このページ、今リンクを理解しました。同じインデックスノードを異なる名前で参照するハードリンクが表示され、コピーは異なる名前を持つ別の「ノード」です。また、ソフトリンクは元のファイル名とパスをインデックスノードとして持つため、ファイルが移動するとリンクが切断されます。

そこで、いくつかのファイル(以下「saluton_mondo.cpp」)を使って学んだ内容をテストし、ハードリンクとソフトリンクとコピーを作成しました。

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

しかし、ハードリンクが元のリンクと同じサイズであり、論理的にコピーと同じサイズであることは恥ずかしいです。ハードリンクとソースファイルが同じinodeを共有し、データを持ち、ファイル名だけが異なる場合、ハードリンクは205バイトではなく名前と同じスペースしか占有しませんか?それとも返される元のファイルのサイズですかls -lh?しかし、ファイル名がどのくらいのスペースを占めるのか、どうすればわかりますか?ここハードリンクにはサイズがないと出てきます。ファイル名は元のファイル名で保存されますか?ハードリンクのファイル名はどこに保存されますか?

ベストアンサー1

ファイルは、データが見つかる場所へのポインターのリストを含むメタデータを含むinodeです。

ファイルにアクセスするには、次のことが必要です。協会ディレクトリ(ディレクトリをフォルダではなく電話ディレクトリと見なす)に保存します。つまり、複数のディレクトリの 1 つに 1 つ以上のエントリを追加して、名前このファイルで。

これらすべてのリンク、ファイル名は同じファイルを指します。そのうちのオリジナルはなく、残りはリンクだけです。どちらもディレクトリツリー内の同じファイル(同じinode)へのアクセスポイントです。ファイルサイズ(lstatシステムコール)を取得するときにinodeに保存されている情報(上記のメタデータ)を検索しており、ファイル名とファイルを参照するために使用するリンクは重要ではありません。

対照的に、シンボリックリンクは、コンテンツが次のような別のファイル(別のinode)です。ターゲットファイルに。他のファイルと同様に、これらのシンボリックリンクは、ユーザーがアクセスできるようにディレクトリ(名前が必要)に接続する必要があります。また、シンボリックリンクへのリンクが複数ある場合があります。つまり、シンボリックリンクに複数の名前を付けることができます(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。つまり、ファイルを削除するのではなく、そのファイルが参照するディレクトリからリンクを解除することです。ファイルは、そのファイルのエントリがある最後のディレクトリから接続が解除されるとすぐに削除されます(開いているプロセスがない限り)。

おすすめ記事