resticとRustとCACHEDIR.TAG

古いHDDをUSB外付けケースに入れてバックアップ用に利用しているのですが、rsyncを使ったバックアップやmacのTimeMachineが遅くなるので、最近はrestic を使っています。

resticを使っていて感じたメリットをいくつか紹介しておきます。

  • 効率性
    • ファイルをそのままコピーするのではなくgitのようにパックして圧縮して保存するので小さいファイルを大量に作らないしディスクスペースも節約できる。
    • ファイルの更新日時のようなメタデータを利用しているので、差分バックアップするときに遅いHDDからの読み込みを最小限で済ませられるし、mac側の変化があったファイルのスキャンも高速
  • クロスプラットフォーム
    • リポジトリを暗号化するので、exFATの非暗号化ディスクを使えば、macで取得したバックアップの中にあるファイルをWindowsLinuxから救出できる

S3をストレージに使えるくらいなので、HDDの速度が初回バックアップの書き込み時間以外には全く問題にならないくらい高速です。

さて、最近Uvが話題になって触っていたのでRustのプロジェクトを何度かビルドしていたのですが、resticを動かすと差分バックアップでtargetディレクトリがバックアップされているのに気づきました。そして何かいい除外パターンが無いかなとtargetディレクトリを眺めたときに見つけたのが CACHEDIR.TAG ファイルです。調べてみたところ、まさにバックアップから除外するディレクトリを指定するためのファイルのようです。 ~/.cargo/git~/.cargo/registry にも CACHEDIR.TAG が入っているので、Rustの世界では広く普及しているみたいです。

Cache Directory Tagging Specification – Bryan Ford's Home Page

そしてResticもbackupコマンドの --exclude-caches オプションを指定したら自動でこのファイルを見つけてバックアップから除外してくれていました。

Backing up — restic 0.16.4 documentation

そして uv も2日前にvenv作成時にvenvディレクトリ内に CACHEDIR.TAG を作るようになっていました。

Tag created venvs as a cache dir to avoid most of in-project venv downsides · Issue #1648 · astral-sh/uv · GitHub

私はすでに .venv~/.cargo もバックアップ除外パターンに入れてしまっていたのですが、除外パターンというのは設定をミスると必要なファイルのバックアップが取れなくなったりするものなので、CACHEDIR.TAGはどんどん活用していこうと思います。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。