名前

hardlink - ファイルの複数コピーをリンクする

書式

hardlink [options] [directory|file]...

説明

hardlink は、 1 つのファイルに対する複数のコピーを、 ハードリンクかコピーオンライトのクローンに置き換えるものである。 これによってディスク容量を節約する。

hardlink は初めにファイルサイズのバイナリーツリーを生成し、 同一サイズのファイル同士の内容を比較する。 内容の比較にあたっては、 基本的な 2 つの方法がある。 memcmp 手法は、 ファイルのデータブロックを直接読み込んで、 比較を行う。 もう一つの手法は、 (SHA256 のような) チェックサムに基づくものである。 後者の場合、 各データブロックに対するチェックサムは Linux カーネル の暗号化 API によって算出される。 そしてそのチェックサム値はユーザー空間に保存されてファイル比較に用いられる。

各ファイルにおいては「イントロ」(intro) バッファー (32 バイト) もキャッシュされる。 このバッファーは比較手法からは独立して用いられ、 キャッシュサイズや IO サイズの要求に応える。 ファイルは処理時点から変化することが多々あるため、 データ操作を行う際に「イントロ」バッファーは、 データ内容の操作を大幅に削減する。

オプション

-h, --help

ヘルプを表示して終了する。

-V, --version

バージョンを表示して終了する。 1 つだけ指定された場合、 ハードリンクされたファイルをすべて表示する。 2 つ指定された場合は、 すべての比較も表示する。

-q, --quiet

非表示モード。 何も表示を行わない

-n, --dry-run

何も行わない。 発生する内容を表示するのみ。

-y, --method name

ファイル内容の比較方法を設定する。 現在サポートされている方法は sha256, sha1, crc32c, memcmp である。 デフォルトは sha256 であり、 Linux Crypto API が利用できない場合のデフォルトは memcmp である。 チェックサムに基づく方法は、 ゼロコピー方式により実装されている。 この場合、 ファイル内容はユーザー空間にはコピーされず、 計算処理はすべてカーネル内で行われる。

--reflink[=when]

ハードリンクではなく、 コピーオンライトのクローン (reflink として知られる) を生成する。 reflink されたファイルは、 ディスク上のデータのみを共有し、 ファイルモードや所有者は別となる。 これは --ignore-owner, --ignore-mode の両オプションともに用いることが推奨される。 このオプションには暗に --skip-reflinks の指定が含まれるため、すでにクローンされたファイルは無視する。

任意指定の引数 when には never, always, auto のいずれかが指定できる。 when 引数省略時のデフォルトは auto である。 その場合、hardlink はファイルシステムのチェックを行い、 BTRFS と XFS 上である場合にのみ reflink を利用する。 reflink の生成ができない場合はハードリンクとなる。 引数 always はファイルシステムの検出を無効としてハードリンクを用いる。 その場合には reflink のみが利用可能である。

--skip-reflinks

すでにクローンされたファイルを無視する。 このオプションは、 従来のハードリンク生成を行うために、 --reflink は指定せずに利用する。

-f, --respect-name

同じ名前 (ベース名) のファイルとだけリンクするようにする。 pf オプションでなく、 長いオプションを用いることが推奨される。 これは、 hardlink の他の実装では、 異なって解釈されるからである。

-p, --ignore-mode

モードが異なっていても、 ファイルのリンクと比較を行う。 その結果は予測できない場合がある。

-o, --ignore-owner

所有者情報 (ユーザーとグループ) が異なっていても、 ファイルのリンクと比較を行う。 その結果は予測できない場合がある。

-t, --ignore-time

修正時刻が異なっていても、 ファイルのリンクと比較を行う。 たいていの場合、 これが適切な動作になる。

-X, --respect-xattrs

同一の拡張属性を持つファイルに対してのみ、 リンクを生成する。

-m, --maximize

同じファイルの中で、 リンク数が最も多いファイルを選ぶ。

-M, --minimize

同じファイルの中で、 リンク数が最も少ないファイルを選ぶ。

-O, --keep-oldest

同じファイルの中で、 最も古い (修正時刻が古い) ファイルを選ぶ。 デフォルトは、 最も新しいファイルが選ばれる。 If --maximize--minimize を指定すると、 修正時刻よりもリンク数を優先して判断する。

-x, --exclude regex

比較やリンクを行わないように、 ファイルを除外する正規表現を指定する。

-i, --include regex

対象に含めるファイルを正規表現によって指定する。 --exclude が指定されていた場合は、 除外されるはずであったファイルが、 このオプションによって、 再度含まれることになる。 --exclude オプションがなく、 本オプションが指定された場合は、 パターンに一致するファイルのみが含まれることになる。

-s, --minimum-size size

処理にあたって、 ファイルの最小サイズを考慮する。 このデフォルト値は 1 であるため、 空のファイルはリンクされない。 引数 size の後ろには、 KiB (=1024), MiB (=1024*1024) のような乗数を表すサフィックスを付けることができる。 GiB, TiB, PiB, EiB, ZiB, YiB も同様に使える ("iB" を続けるのは任意であり、 たとえば、"K" は "KiB" と同じ意味である)。

-S, --maximum-size size

処理にあたって、 ファイルの最小サイズを考慮する。 このデフォルト値は 0 であり、 特別の意味として無制限を表す。 引数 size の後ろには、 KiB (=1024), MiB (=1024*1024) のような乗数を表すサフィックスを付けることができる。 GiB, TiB, PiB, EiB, ZiB, YiB も同様に使える ("iB" を続けるのは任意であり、 たとえば、"K" は "KiB" と同じ意味である)。

-b, --io-size size

ファイル内容を比較する際に用いられる read(2) または sendfile(2) のバッファーサイズ。 引数 size の後ろには KiB, MiB のような乗数を表すサフィックスをつけることができる。 "iB" を続けるのは任意であり、 たとえば "K" は "KiB" と同じ意味である。 memcmp 手法に対するデフォルトは 8KiB、 それ以外の手法に対するデフォルトは 1MiB である。 このバッファー用にプロセスメモリーを使用するのは memcmp 手法だけであり、 それ以外の手法ではゼロコピー方式が用いられ、 I/O 操作はカーネル内にて行われる。 このサイズ値は、 キャッシュされているコンテントチェックサムの数に合致するようにその都度変化する。

-r, --cache-size size

データ内容のチェックサムに対するキャッシュサイズ。 memcmp 手法以外はすべて、 各ファイルコンテントブロックに対するチェックサムを計算する (--io-size 参照)。 そのチェックサムは、 次の比較のためにキャッシュされる。 大容量のファイル、 あるいは同一サイズのファイルによる大量セットに対して、 このサイズが重要になる。 デフォルトは 10MiB である。

引数

hardlink の引数に複数ディレクトリを指定すると、 リンクを行うファイルの検索ディレクトリとして利用される。

バグ

元々の hardlink の実装では、 -f オプションを用いれば、 ファイルシステム間でのハードリンクを強制的に行っていた。 この機能を活用するのはまれであるため、 最新の hardlink では、 もうサポートされない。

hardlink は、 ファイルツリーが処理中に変更されることがない、ということを前提にしている。 ファイルツリーが変更されると、 処理結果は不定であり、 潜在的な危険となる。 たとえば、 通常ファイルがデバイスに置き換えられると、 hardlink はデバイスからの読み込みを行うことになる。 またパスを構成する一部がシンボリックリンクに置き換えられたり、 パーミッションが変更されたりすると、 セキュリティが低下する可能性がある。 ファイルツリーの変更中、 あるいは他ユーザーの処理中に harlink を実行してはならない。

作者

hardlink には複数の実装がある。 初期の実装は、 Fedora 配布向けの Jakub Jelinek 作のものである。 この実装は、 util-linux バージョン v2.34 から v2.36 において用いられてきた。 現在の実装は、 Julian Andres Klode 作による Debian バージョンをベースにしている。

バグ報告

バグ報告は、 以下にある issue トラッカーを利用すること。 <https://github.com/util-linux/util-linux/issues>.

入手方法

hardlink コマンドは util-linux パッケージの一部であり、 以下からダウンロードできる。 Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.