ArchLinux インストール覚書より始めたArchLinuxプロジェクト。btrfsにおけるスナップショットを整備しました。
この時点でスナップショットに手を出したのは、ちょっとした目論見がありましてですね。その話は別稿にて。
ディレクトリ構造の仕様
どうでもいい部分に関しては前例を踏襲した方がいい。というわけでSnapperを参考にします。この通りではなくて一捻りしますが。
(subvolid=5)
│
├─ @ : 使用中のルートファイルシステム
│ │
│ ├ usr
│ ├ bin
│ ├ ...
│ │
│ └ .snapshots : @のスナップショットの格納場所
│ │
│ ├ <年月日時分秒>.ss : @のスナップショット
│ ├ <年月日時分秒>.txt : スナップショットの注釈を格納するテキストファイル
│ ├ ...
│
├─ 他のサブボリューム
スナップショットとはサブボリュームであり、ディレクトリ構造で見ればファイルではなくてディレクトリですが、拡張子 .ss を付けます。これは注釈を残しておきたいと考えたからです。注釈の方は普通のテキストファイルとして拡張子 .txt を付けます。こいつと区別するために拡張子を付けときたいのでした。
ファイル名の方を番号ではなくて日時にしているのは、番号の計算とかそういう一手間を省きたかったからです。スクリプトを組むならどうにでもなりますが、最初は手でコマンドラインをいじる事になりますので、簡単な方法で取得できて、それなりに順番を表現できるファイル名にしたかったのでした。
そもそも最初からSnapper使えばいいじゃん、という意見は却下。仕事ならそれも検討しますけど、そもそも趣味全開で勉強を兼ねてやってる作業ですから。動作原理などを理解する為に、手作業で賄える範囲は可能な限り手作業で賄いたいのです。
作業
スナップショット格納場所 /.snapshots を作成
何の捻りもありません。
# mkdir /.snapshots
スナップショットを作る実験
btrfs のスナップショットについてはぐうぐる先生がこれでもかってくらい教えてくれますので、ここでは詳細は省略。
# fn=$(date +%Y%m%d%H%M%S)
# btrfs subvolume snapshot -r / /.snapshots/$fn.ss
Create a readonly snapshot of '/' in '/.snapshots/20170514202947.ss'
# echo test of snapshot >/.snapshots/$fn.txt
スナップショットを軽く確認
btrfs のサブボリュームとしてどう見えているかを調べてみます。
# btrfs subvolume list /
ID 258 gen 684 top level 5 path @
ID 266 gen 678 top level 258 path var/lib/machines
ID 267 gen 683 top level 258 path .snapshots/20170514202947.ss
きちんとサブボリュームになっているようです。
次に、書き込み禁止になっているかを調べてみます。
# echo test >/.snapshots/$fn.ss/test.txt
-bash: /.snapshots/20170514202947.ss/test.txt: Read-only file system
やった