バックアップが面倒だなと思った。実際にバックアップなんてあまり真面目にやってない。
無駄に容量食ってない? という疑念が頭を離れないのでやる気がしないのですね。
じゃあ、変更しそうなファイルだけを人間が選択してバックアップ?
それはなんか違う。
dump/restoreの差分の扱いもなんか違うように思う。ワタシは再現するのに必要なファイルだけをバックアップしたい。
rpmのデータベースを見て、変更・追加されたファイルだけをtarにまとめておけばいいじゃん。というわけで少し手を動かして書いてみた。
- deltadump.py
- python deltadump.py –f /tmp/root.tar.gz –d /
Usage: deltadump.py [options] deltadump.py: backup([file for file in allfiles if not in rpm_db]) Options: --version show program's version number and exit -h, --help show this help message and exit -f FILENAME, --file=FILENAME output tar filename(MUST SET) -d DIRNAME, --dir=DIRNAME backup directory(MUST SET) -X, --cross-filesystem cross filesystem -t, --skip-timestamp skip timestamp -s, --skip-socket skip socket/pipe --hash compare hash value --ignore=IGNORE ignore dir("," separated) -D, --skip-new-directory skip new directory
ハッシュ値(SHA-256)の比較は時間がかかるので、デフォルトではサイズしか見ていません。ファイルサイズもハッシュ値もprelinkが邪魔なんですが、prelink -uして元に戻したファイルを比較してます。prelinkは遅いしnekovmなど誤検出してしまうものがあるため、設定ファイルのブラックリストを解析しつつゴニョゴニョと汚くやっているのは皆様の参考になるかどうか…。
–skip-new-directoryは、rpmのspecファイルを書くときに、ディレクトリを書かずにファイル名だけを記述する場合が多いんですね。そうするとrpmは勝手にディレクトリを掘る。rpmdbに入っていないので放っておくと追加されてしまうが、必要ないということであれば指定して下さい。
うちのFedora11の/の使用量は5.6GBくらいですが、これでやってみると、80MBくらいになりました。非圧縮でも350MBくらい。/homeは別の(仮想)ディスクになってて除外されるんで、それもあるかもしれない。
真面目に使うにはリストアの部分も書かなければならない。rpm -qaの結果と照らし合わせて、足りなければ追加でインストールするとか。そのへんは今後の課題のところに置いておこう。
今できるファイルのリストを見てみると、/etc以下の自分が書き換えた覚えのあるファイルの他に、alternativeが使うシンボリックリンク、自動生成されるファイル、キャッシュ関連、gconf関係のファイル、selinux関係のファイルなど、バックアップしなくても良さそうなものも残ってますね。こういうのもブラックリストに入れておこうかな。
非圧縮のサイズですが、でかい順に見ると、以下のような感じ。
- /usr/share/icons/oxygen/icon-theme.cache (95MB)
- /usr/lib/locale/locale-archive (81MB)
- /usr/share/ibus-pinyin/engine/py.db (70MB)
- /etc/gconf以下 (70MB)
- /usr/share/icons/crystalsvg/icon-theme.cache (25MB)
これらはどれも勝手に自動生成されるものであって、バックアップしたいファイルではない。どでかいアイコンキャッシュなんてバックアップしたい奴がどこにいる!
まだまだ修行が必要、ということでしょうね。
それにしてもこれら以外の5GB以上はrpmでインストールできるファイルなので、復元するのにyumコマンドひとつあれば済むためバックアップは不要。システム全体(/homeを除く)のフルバックアップ相当のデータが100MBを切るとなると、ちょっとバックアップを続けようという気持ちが出てくる。
その他、気になった点。
- Pythonのfnmatchやglobは「{a,b}」の形式には対応してないんですね
- subprocessモジュールは最初は嫌だったが、意外と使いやすい
- CentOS 5系のPython 2.4にos.path.relpathがないときはどうしようかと思った
- os.path.relpath(“/usr”, “/”)が”../usr”になると分かった時もどうしようかと思った
- rpmdbの各ファイルのハッシュ値は昔はMD5だったような気がするが、今はSHA-1を飛び越えてSHA-256になっていた。わお!
- prelinkには速やかに死んで欲しい
- 最初このプログラムはカッコ良く書こうと思ったが、だんだん汚くなってしまった。我が身の力量のなさを感じる