ハードリンクを理解する

ハードリンクを理解する

ホームディレクトリにファイルを作成しました。

touch demo
echo "This is demo" > demo

/tmpにハードリンクを作成しました

ln /home/leo/demo demoLink

今、inodeをチェックすると

ls -ltri demoLink

元のファイルと同じ inode 番号が表示されています。それは理解できます。しかし、ハード リンクのファイル タイプは標準です。これは標準ファイルなのでしょうか? 元のファイルとどう違うのでしょうか? ファイルは匿名のデータ ブロブであると読みました。では、これら 2 つのファイルは同じデータを指しているのでしょうか? ハード リンクと元のファイルのファイル サイズは同じですか?

答え1

ハード リンクは実際には「リンク」ではありません。同じファイル inode への 1 番目、2 番目、3 番目、N 番目のハード リンクはすべて互いに等しくなります。「元のエントリ」と「ハード リンク」に違いはありません。

たとえば、file1 を作成し、同じファイル inode にハード リンク file2 を追加した場合、特定の inode へのどのリンクがオリジナルであるかを確認する方法はありません。

つまり

cryo@CryoNest:~ $ touch file1

cryo@CryoNest:~ $ ls -il file*
9505656 -rw-r--r-- 1 cryo cryo 0 кві  8 20:24 file1

cryo@CryoNest:~ $ ln file1 file2

cryo@CryoNest:~ $ ls -il file*
9505656 -rw-r--r-- 2 cryo cryo 0 кві  8 20:24 file1
9505656 -rw-r--r-- 2 cryo cryo 0 кві  8 20:24 file2

cryo@CryoNest:~ $ rm file1

cryo@CryoNest:~ $ ls -il file*
9505656 -rw-r--r-- 1 cryo cryo 0 кві  8 20:24 file2

cryo@CryoNest:~ $ ln file2 file1

cryo@CryoNest:~ $ ls -il file*
9505656 -rw-r--r-- 2 cryo cryo 0 кві  8 20:24 file1
9505656 -rw-r--r-- 2 cryo cryo 0 кві  8 20:24 file2

ご覧のとおり、inode 番号 (9505656) と inode に格納されているすべての属性は、すべてのハード リンクで同じです。サイズ、日付、モードなどが含まれます。

3 番目のフィールドに注目してください。これは inode へのリンクの数です。このフィールドは、ファイル (実際にはハード リンクのディレクトリ エントリの 1 つ) を「削除」してもスペースの使用量が変わらないという「不可解な」状況を理解するために使用できます :)

指定されたファイルのすべてのハードリンクを検索したい場合は、「find」ツールに「-inum」オプションがあります。

cryo@CryoNest:~ $ ln file1 tmp/file3

cryo@CryoNest:~ $ find . -maxdepth 2 -inum 9505656 -ls
  9505656  0 -rw-r--r--   2 cryo  cryo     0 кві  8 20:24 ./tmp/file3
  9505656  0 -rw-r--r--   2 cryo  cryo     0 кві  8 20:24 ./file1

関連情報