cow溢れ 2

とりあえず用語を決めてみる。


元データファイル = FixedImage(←ディスクイメージ(losetupするとブロックデバイスになる)
書き込み可能領域 = ShadowScreen(←ファイルシステム
書き込み可能領域に置く、差分データファイル = ShadowImage(←ディスクイメージ(losetupするとブロックデバイスになる)
元データに接続する空き領域ファイル = SparseImage(←ディスクイメージ(losetupするとブロックデバイスになる)


KNOPPIXは、たぶんこの問題は起こらない。Copy-on-Writeを「unionfs」を使ってファイルシステムレベルでやっているから。…試してないけど。
ファイルシステムレベルでやれば、書き込み可能領域がいっぱいになった所で「Disk Full」エラーを出せる。
VIVERは「cowloop」を使ってブロックデバイスレベルでやっているので、上のような悩ましいことになる。


確かにShadowScreenがいっぱいになればDiskFullエラーを出すのが筋。
が、DiskFullになっているのはShadowScreenであって、ShadowImageではない。
cowloopから見えるのはShadowImageとFixedImageだけなので、ShadowScreenのDiskFullを検出できない。ShadowScreenがDiskFullになっていても、ShadowImageへの書き込みは成功して、ShadowScreenに書き込むときに失敗する。(カーネルのキューにデータが溜っていって、そのうちメモリが足りなくなる)
unionfsでは、VIVERで言う所のShadowImage == ShadowScreenになっているので、unionfsから書き込み可能領域が見ていることになるので、書き込み可能領域のDisk Fullを検出できる。


おとなしくunionfsを使うのもアリではあるのだけど、unionfsは[id:viver:20060706]で、いろいろ問題アリ。cowloopも問題アリだけど。



ファイルシステムレベルで、ブロックデバイスレベルの差分保持をすれば良いのかな?自分で安定性の高いファイルシステムを作るなんて無理、ゼッタイ。
ん?ブロックデバイスレベルで、ブロックデバイスレベルの差分をファイルシステムレベルで保持しても良いのかな?…なんか意味不明になってきた…。




ShadowScreenに、使えるサイズいっぱいのディスクイメージを作成。128MB確保できたら、128MBのディスクイメージ。
これに差分を書き込んでいって、書き込めなくなったらDiskFull。む?cowloopを改造すれば良いということかな?
うむむ…これで良さそうな気がする。差分のデータ構造を作りなおせば良いのかな。
でもそんなに時間も技量も無いわけで…。来年の未踏で(笑