1. ホーム
  2. linux

ハードリンクをファイルサイズにカウントしていますか?

2023-09-28 05:56:51

質問

Unix タイムスタンプにちなんで名付けられたディレクトリを作成し、ハードリンク システム (rsync の --link-dest) を使用して増分バックアップを作成するバックアップ システムを持っており、通常、最初のバックアップは非常に大きくなり、その後のバックアップはその数分の1の大きさになります。

これは、私の現在のバックアップの出力です。

root@athos:/media/awesomeness_drive# du -sh lantea_home/*
31G lantea_home/1384197192
17M lantea_home/1384205953
17M lantea_home/1384205979
17M lantea_home/1384206056
17M lantea_home/1384206195
17M lantea_home/1384207349
3.1G    lantea_home/1384207678
14M lantea_home/1384208111
14M lantea_home/1384208128
16M lantea_home/1384232401
15G lantea_home/1384275601
43M lantea_home/1384318801

すべて正しいように見えますが、しかし、例えば最後のディレクトリを考えてみましょう。 lantea_home/1384318801 :

root@athos:/media/awesomeness_drive# du -sh lantea_home/1384318801/
28G lantea_home/1384318801/

一貫してこの挙動になるのですが、なぜ2回目のduコマンドでディレクトリが28Gと判断されるのでしょうか?

注意 -P と -L フラグを付けても出力は同じままです。

どのように解決するのですか?

ハードリンクは、同じファイル (その inode で表される) への実際の参照です。 元のファイルと、それを指すハード リンクの間に違いはありません。 どちらのファイルも同じステータスを持ちます。 両方 はこのファイルへの参照となります。 どちらかを削除すると、もう一方はそのままの状態で残ります。 最後のハードリンクを削除することだけが、最終的にファイルを削除し、ディスク スペースを解放することになります。

ですから、もしあなたが du を見た場合、他の場所に同じ内容を指すハードリンクがあっても気にしません。 単にすべてのファイルのサイズを数えて合計するだけです。 ハードリンクのみ 内の へのハードリンクは複数回カウントされません。 du はそれほど巧妙なのです (すべてのプログラムが必ずしもそうである必要はありません)。

ですから、事実上、ディレクトリ A には du のサイズが 28G で、ディレクトリ B のサイズが 29G であっても、それらを合わせても 30G しか占めません。 du に尋ねれば、その数字が返ってくるでしょう。

<イグ