gcc hogehoge.c -o hogehoge.c
あ、あ、あれぇ!?
というわけで、LVMのsnapshotがこのような事故を防げそうだということで、昨晩試してみた。とりあえず入れたのはFedora Core 3 test2。普通に入れると/とswapがLVMになるやつ。というかdevelopmentをrsyncで取ってきてCD-Rからのブートのときにlinux askmethodでそっちから入れて、「更新はありません」状態でインストールされたので昨日あたりのdevelopmentと言ったほうがいいのかな。
インストーラでボリュームを切るときに、まずLVMのボリュームグループを定義して、孤独な論理ボリュームを作りつつ1GBくらい残しておく。手動でやってsnapshot領域を残しとかないと意味がない。面倒だな。自動かつ最後にチェックするようにしといて、最後のチェックのところで縮めるほうがいいのかもしれない。一度自動で残りのない状態でインストールしてしまったので、swapを犠牲にしながらsnapshotを試してたんだけど、やばそうだった(笑)。resize2fsはマウントされてると駄目っぽいしね。
で、おもむろにlvcreate -s -L 512m -n snap2004100600 /dev/VolGroup00/LogVol00みたいにしてスナップショットを作る。オリジナルのボリュームに変更があるたびに、snapshotボリュームは8KB単位で消費されていく。lvdisplayでどのくらい消費してしまったかがわかる。消費し尽くすとsnapshotは機能しないのだろうと思うがまだそこまでは試していない。vgdisplayでボリュームグループにどのくらい空きがあるのかがわかるので、足りなくなったらlvremoveで消していけばいい。ということになっている。snapshotはリブートしても有効で、普通にマウントできるし、なかなか便利に使えそうだ。
しかし…lvremove固まるよ(笑)。普通にswapを消すとかはswapoff -aしてlvremoveしても問題なかったのだが、snapshotボリュームの削除がなぜかうまくいかなかった。ディスクはけっこう回っていたから、もしかして私が短気なだけで時間が経てば終わるのかもしれないが。最初にswapのsnapshotを作ってしまった(笑)のが悪かったのかなぁ。
使うsnapshotの容量はちょっと予測しづらいけど、/丸ごとのsnapshotを512MBで取ってしばらく作業していたらすぐに20%近く消費してしまったので、そのへんはいろいろ考えていく必要がある。とりあえず考えているのは、/varを別ボリュームに押しやり、noatimeでマウントすればその他丸ごとでも512MBあれば1〜2日は持つんじゃないかな、ということくらい。
だから、インストールのときに6GBくらい余らしといて、snapshotを作りつつ古いsnapshotをローテートっぽく消していく、といったスクリプトを2時間に1回くらいcronで回す運用にすればいいのではないかと思う。ノートPCでサスペンドすることを考えると12x512MBでも2時間単位で2〜3日前までは戻れる計算になる。snapshotが512MBでは足りなかったり余る傾向が強ければまたLVMの構成を変更すればいいだけだし。しかしこれやるとwrite系の処理が12倍遅くなるのかなぁ。最悪ケースで古い8KBブロックを12回コピーしてから処理するわけだからねぇ。複数のsnapshotをうまく扱ってくれるのかというのも試していないし、そのへんも検証が必要だ。
残る課題にはlvremoveが固まる問題もあって、これらが解決したらメインの環境をLVMに移行してsnapshot生活を満喫しようと思う。
最近はけっこう便利な世の中になってるのかなぁ。しかしぐぐって調べてても、なんでみんなこの機能をバックアップ中に状態をフリーズさせるために使うなんていうくだらない(失礼)用途で説明するんだろうか。そんなのもともと気休めだしさ。だってアプリ側でatomicな処理だと思っている最中にsnapshotを作ってしまったら、どちらにしろバックアップは中途半端な状態になる。テープ等へのバックアップとsnapshot作成で時間の長さは違うけど、どちらにしてもゼロにはならない。ボリュームのバックアップにはもともと厳密さは求められていない*はず*。DBとかのバックアップにはDBMS側がバックアップの手段を用意しているので、そっちを使うほうがいいよねぇ。
(追記) 2004-10-06 22:51
多重にsnapshotをとっておくのは問題なさそうだった。性能は、別として。あと、lvremoveが変なんじゃなくて、全体的に不安定になっていたようだ。あんまり変なことしないほうがいいのかな。