ところで、この Sparse Bundle Image とは一体なんだろうか?

404 Blog Not Found:Macの起動ディスクをフル(バックアップ|リストア)する最も簡単な方法
結論から言うと、
  1. USBバスパワー駆動の外付け2.5インチHDDを用意し、
  2. そこに Mac OS X をインストールして起動可能にした上で、
  3. (内蔵)起動ディスクを外付けHDD上の sparse bundle image にバックアップ

OS Xとディスクイメージ

その正体は、「分割された」「ディスクイメージ」。

およそディスクイメージを何らかの形でサポートしていないOSというのはないけれど、Macほどディスクイメージを活用しているOSはないように思われる。なにしろアプリケーションの配布にまで用いられているのだ。

例えば右のFirefoxの例では、アプリケーションフォルダにFirefoxアイコンをドラッグするだけでインストールが完了することが一目でわかる。そのアプリケーションフォルダも、わざわざ実際のアプリケーションフォルダーを開くことなく、隣にあるエイリアス(実際にはシンボリックリンク)にドラッグすればいい。圧縮にも対応しているのでzipやtar.(gz|bz2|xz)よりかさばるということもなく、そしてマウントはOSの機能として用意されているのでunzipやtarなどのユーティリティを動かす必要もない。

読み書き可能なディスクイメージ

とはいえ、ソフトウェアの配布にディスクイメージを使うのは、他のOSでもよく見られる。特にISOイメージはLinuxやFreeBSDなどのオープンソースOS配布の標準手段となっている。しかしこの場合のディスクイメージは、本来のCD-ROMやDVDと同じく読み込み専用なのが一般的だ。

ところがMacでは、読み込み専用のディスクイメージのみならず読み書き可能なディスクイメージもぞんぶんに活用されている。iDisk、Time Capsule、File Vault…これらはいずれも読み書き可能なディスクイメージで実現されている。

同様のディスクイメージ活用法として最もポピュラーなのは、VMWareやVirtual Boxといった仮想マシン実効環境の仮想ディスクだろう。仮想マシンのハードディスクは、それを実行するホストOS上の仮想ディスクとして実装されている。

それらを使ったことがある人はご存知のとおり、32GBの仮想ディスクがホストOS上でもはじめから32GBあるわけではない。仮想マシンが実際に使った分だけ大きくなっていくのだが、それでも仮想ディスクファイルというのは数GBオーダーになるのが普通で、バックアップがそれだけ大変になる。何が大変かというと、差分バックアップがずっとやりにくくなること。中身はほんのわずかしか変わっていないのに、変更は変更なのでrsyncなどを使っても結局ファイルを丸ごとコピーしているのと同じだけの時間がかかることになる。VMWareでは2GBごとに分割される仮想ディスクフォーマットがデフォルトになっているけど、2GBというのはext2のようにファイルサイズ制限があるファイルシステム上でも安全に仮想ディスクを扱うのには役にはたっても、差分バックアップするにはあまりに大きく、結局全部一からコピーするはめになる。

ディスクイメージを分割する

それを解決したのが、OS X v10.5 Leopardから導入された sparse bundle disk image 。Finder上では一つのファイルに見えるが、Terminal.appからlsしてみるとその正体がわかる。

% /bin/ls -alR@ ~/Desktop/test.sparsebundle
total 8
drwx--x--x@  6 dankogai  staff   204 Jul  3 20:30 .
	com.apple.FinderInfo	  32 
drwx------+ 37 dankogai  staff  1258 Jul  3 20:32 ..
-rw-------   1 dankogai  staff   499 Jul  3 20:30 Info.bckup
-rw-------   1 dankogai  staff   499 Jul  3 20:30 Info.plist
drwx--x--x  37 dankogai  staff  1258 Jul  3 20:30 bands
-rw-------   1 dankogai  staff     0 Jul  3 20:30 token

/Users/dankogai/Desktop/test.sparsebundle/bands:
total 244632
drwx--x--x  37 dankogai  staff     1258 Jul  3 20:30 .
drwx--x--x@  6 dankogai  staff      204 Jul  3 20:30 ..
	com.apple.FinderInfo	     32 
-rw-------   1 dankogai  staff  3297280 Jul  3 20:30 0
-rw-------   1 dankogai  staff    28672 Jul  3 20:31 169
-rw-------   1 dankogai  staff  8388608 Jul  3 20:31 19
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 1a
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 1b
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 1c
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 1d
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 1e
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 1e88
-rw-------   1 dankogai  staff    43008 Jul  3 20:30 1e89
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 1f
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 20
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 21
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 22
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 23
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 24
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 25
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 26
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 27
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 28
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 29
-rw-------   1 dankogai  staff  1921024 Jul  3 20:30 2a
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 3cf8
-rw-------   1 dankogai  staff    20480 Jul  3 20:30 3d09
-rw-------   1 dankogai  staff  8388608 Jul  3 20:31 b4
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 b5
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 b6
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 b7
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 b8
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 b9
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 ba
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 bb
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 bc
-rw-------   1 dankogai  staff  8388608 Jul  3 20:30 bd
-rw-------   1 dankogai  staff  1921024 Jul  3 20:30 be

これは作成したての空の sparse bundle の様子だが、8MiBごとに分割されている様子が見てとれる。未使用ブロックに対応するファイル(Apple用語ではband file)が存在しないことも。

この sparse bundle image は、ファイルの利便性とディレクトリの利便性を兼ね備えている。見た目は単一のファイルなので、これまでのディスクイメージと同じように扱えるし、しかし複数ファイルから構成されているのでrsyncで差分バックアップが取れる。さらに見ての通りHFS+でないと扱えないファイル名は内部的に使われていないので、FATなUSBメモリーにおいても、SMBサーバーにおいても、それどこかWebDAVサーバーにおいてすら、一旦マウントしてしまえばMacのローカルディスクのように扱えるのだ。

利用例その1:iSCSIの代わりに

今日日「ローカルディスクのように見えるネットワークディスク」、つまり「リモート占有ディスク」が欲しい場合、iSCSIを利用するのが一般的だ。NFSにしろCIFS(SMB)にしろAFPにしろWebDAVにしろ、ネットワークファイルシステムというのは、ローカルディスクに匹敵する帯域幅を持っていてもIOPSがずっと低い。そこで仮想SCSIデバイスをサーバーに用意して、これをローカルディスクのようにフォーマット(厳密にはnewfs)して使うというのがiSCSIなのだが、Mac OS Xは標準ではiSCSIに対応していない。

このように一応サードパーティー製のiSCSI Initiatorは存在し、そこそこ使えるのであるが、それよりもNAS上に sparse bundle image を置いてそれをマウントする方が利便性は遥かに高く、設定も容易だ。

この場合、「すでにマウントした image を別のMacでマウントしたら」という懸念が生ずるが、心配は無用。右のスクリーンショットのように、きちんと排他制御されている。

「使用中にサーバーがリブートされたらどうなる」か?その場合は確かにディスクイメージが破損する危険はあるが、その場合もDisk Utilityで本物のハードディスクと同じように修復をかけることができる。

ここまではiSCSIも同様なのだが、sparse bundle imageを使った場合、さらにディスク容量を後から変更できるというあまりにおいしいおまけが付く。iSCSIの場合これができるかどうかはサーバー側のiSCSI targetの実装にかかっているが、sparse bundle の場合は確実にこれができる。「小さく産んで大きく育てる」が可能なのだ。その逆、つまり縮小も、空き容量が十分あれば可能だ。

利用例その2:仮想マシン置き場に

具体的にはVMWareやVirtualBoxの仮想マシンを、その仮想ディスクごと sparse bundle image に入れて使う。仮想ディスクの中に仮想ディスクを入れるとはずいぶんと無駄に思われるかも知れないが、パフォーマンスペナルティがほとんどない上に、sparse bundle image を rsync することで、難しかった差分バックアップがいとも簡単に実現する。

そのまま rsync した場合
sending incremental file list
Ubuntu 64-bit.vmwarevm/
deleting Ubuntu 64-bit.vmwarevm/Ubuntu 64-bit.vmx.lck/M46775.lck
deleting Ubuntu 64-bit.vmwarevm/Ubuntu 64-bit.vmx.lck/
Ubuntu 64-bit.vmwarevm/Ubuntu 64-bit-s001.vmdk
  2023292928 100%   47.86MB/s    0:00:40 (xfer#1, to-check=201/203)
Ubuntu 64-bit.vmwarevm/Ubuntu 64-bit-s002.vmdk
  1470431232 100%   46.35MB/s    0:00:30 (xfer#2, to-check=200/203)
…
Ubuntu 64-bit.vmwarevm/appListCache/recentDocuments/
Ubuntu 64-bit.vmwarevm/appListCache/recentDocuments/recentDocuments.menudata
          20 100%    0.01kB/s    0:00:01 (xfer#188, to-check=1/203)

sent 7586416506 bytes  received 3621 bytes  45839396.54 bytes/sec
total size is 7585860643  speedup is 1.00
仮想マシンが入った sparse bundle image を rsync した場合
sending incremental file list
VMX.sparsebundle/
VMX.sparsebundle/bands/
VMX.sparsebundle/bands/114d
     8388608 100%   93.75MB/s    0:00:00 (xfer#1, to-check=7933/8273)
VMX.sparsebundle/bands/11b0
     8388608 100%   29.30MB/s    0:00:00 (xfer#2, to-check=7834/8273)
…
VMX.sparsebundle/bands/8ef
     8388608 100%    9.79MB/s    0:00:00 (xfer#130, to-check=1823/8273)
VMX.sparsebundle/bands/e8
     8388608 100%  117.19MB/s    0:00:00 (xfer#131, to-check=398/8273)

sent 1099143980 bytes  received 26929 bytes  21343124.45 bytes/sec
total size is 69325997030  speedup is 63.07

まとめ

sparse bundle image そのものはさほど高度が技術とは言い難い。イメージ分割そのものはVMWareもやっているのは前述のとおり。しかしそれがもたらす恩恵はあまりに大きい。他のOSでも是非実装してほしい。

なお、GUIの Disk Utility の代わりに CLI の hdiutilを使うとさらに細かい制御が可能だ。

Macをお使いの方は、ぜひ活用してほしい。Appleのソフトウェアだけに使わせておくにはあまりにおいしい機能なのだから。

Dan the Man with too Many Disks, Physical and Virtual