2017年8月24日木曜日

ハードリンクの参照カウント数を考慮してくれる du コマンド が欲しい。 (Windows環境で)

結論

Sysinternals の Du (disk usage) は、
NTFS上での ハードリンクの参照カウント数 を考慮したうえで ディスクの使用量を算出してくれる。

経緯

  • dumpfs 系 のバックアップコマンド (たとえば、mdumpfs) を使うと、NTFSのハードリンク機能を駆使し、ディスク領域を極力消費せずに、各バックアップ断面のスナップショットを取ることができる。
  • たとえば、未変更のファイルに対して3回バックアップ (スナップショット) を取った場合、バックアップ結果のファイルは3つできるが、それらのディスク上の実体は共有されており、実際には ファイル1つ分のディスク領域しか消費しない。
    (参照カウントが 3 のファイルが、1つ存在する状態)
  • しかし、Windows上の一般的なツール (エクスプローラ他) は、NTFS上のハードリンクの参照カウントを考慮しない
    (上記の3回バックアップの例の場合ならば、同じサイズのファイルがディスク上に3つとも存在し、ファイル3つ分のディスク領域を消費しているかのように報告する)
  • なお、本家(unix、linux環境) の du コマンドは、ハードリンクの参照カウントを考慮しているようである。
    (参考: ハードリンクがある場合の du によるディスク消費量表示の注意 - 学習する機械、学習しない人間)
  • いわゆる Win32 port の du コマンド をいくつか試してみたが、ハードリンクの参照カウントを考慮してしているものは、ほとんどなかった。
    冒頭で掲示した Sysinternals版 の du コマンド は、数少ない例外である。

補足

上記の 「Sysinternals版 の du コマンド」は、「Size」と「Size on disk」(= ディスク上のサイズ) の両方をレポートしてくれるが、
「空のディレクトリ」の「Size on disk」については
1ディレクトリあたり「4,096 bytes」
とレポートしているように見える。
※「4,096 bytes」というのは、対象NTFSボリュームの クラスタサイズ (アロケーションユニットサイズ) だと思われる。

NTFSの内部構造については詳しくないのだが、空ディレクトリ1つ 4KB は大きすぎる気がする(*1) ので、別途調査予定。
*1 … MFT (Master File Table) の1レコード分である、1KB で収まるのではないか?


関連記事

0 件のコメント :

コメントを投稿