Claude Codeとファイルシステムスナップショット
#ai #zfs #btrfs
AI Coding Agentが余計なことをする例は枚挙に暇がない
コミットしてないファイルを破壊することもある
そこで、今回はファイルシステムのスナップショット機能を利用してファイルを保護しつつ安心してCoding Agentを使う
現在、多くのファイルシステムにはスナップショット機能が備わっている
zfs https://docs.oracle.com/cd/E24845_01/html/819-6260/gbciq.html
btrfs
https://blog.yamano.dev/posts/f2b79ad8a8f3d9f3e139c1fbebf39cf8/
うれしいことに、Claude CodeにはHooks機能があり、特定のタイミングでコマンドを実行できる
これらを組み合わせることで、任意のプロンプトを実行する前にコードを巻き戻せるようになる
btrfs
既存のディレクトリをbtrfs subvolumeにする
$ mv folder folder_backup
$ sudo btrfs subvolume create folder
$ sudo chown $USER folder
$ rsync -avh folder_backup/ folder
元ページではcpを使っていたが、dotFilesあたりの取り回しが面倒
from Converting directory into subvolume : r/btrfs
snapperでスナップショット操作する
$ CONFNAME=btrfssnapshottest
$ sudo snapper -c $CONFNAME create-config .
$ sudo snapper -c $CONFNAME set-config "NUMBER_LIMIT=300"
$ sudo snapper -c $CONFNAME set-config "ALLOW_USERS=windymelt"
$ sudo snapper -c $CONFNAME set-config "EMPTY_PRE_POST_MIN_AGE=10"
(sudo chown $USER .snapshots)
$ snapper --config $CONFNAME list
$ snapper --config $CONFNAME create --description "hogehoge" --cleanup-algorithm number
余談
$ snapper --config $CONFNAME create --command 'rm foobar' --description "Before and after rm"
復元先を探す
code:sh
λ snapper --config btrfssnapshottest list -t pre-post
前 # │ 後 # │ 前日付 │ 後日付 │ 説明 │ ユーザデータ
─────┼──────┼─────────────────────────────┼─────────────────────────────┼─────────────────────┼─────────────
1 │ 2 │ 2025年07月08日 00時52分46秒 │ 2025年07月08日 00時52分46秒 │ Before and after rm │
pre-postにこだわらなければ
code:sh
λ snapper --config btrfssnapshottest list
# │ 種類 │ 前 # │ 日付 │ ユーザ │ クリーンアップ │ 説明 │ ユーザデータ
──┼────────┼──────┼─────────────────────────────┼───────────┼────────────────┼─────────────────────┼─────────────
0 │ single │ │ │ root │ │ current │
1 │ pre │ │ 2025年07月08日 00時52分46秒 │ windymelt │ │ Before and after rm │
2 │ post │ 1 │ 2025年07月08日 00時52分46秒 │ windymelt │ │ Before and after rm │
スナップショット間の様子を見る
code:sh
λ snapper --config btrfssnapshottest status 1..2
-..... /home/windymelt/temp/btrfssnapshottest/foobar
code:sh
λ sudo snapper --config btrfssnapshottest -v undochange 1..2
作成:1 修正:0 削除:0
/home/windymelt/temp/btrfssnapshottest/foobar を作成しています
Claude Code Hooks
Hooks - Anthropic
Claude Code の Hooks で作業が終わった後にフォーマッターを実行する
code:json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash|Edit|MultiEdit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '\"AI BEF \\(.tool_name) - \\(.tool_input.command // \"n/a \")\"' | xargs -I {} snapper --config btrfssnapshottest create --description \"{}\" --cleanup-algorithm number"
}
]
}
]
}
}