virt-cloneがデフォルトでsparseファイルを作るのに気づかずにハマッた
Xenのイメージを別サーバにコピーしようとして、ls -lで表示されるサイズと、ls -sで表示されるサイズが異なる(dfは前者を元に計算された値が出る)のにひっかかった。virt-cloneで作成したためだった。(ちなみに、ls -lで表示されるファイルサイズは、clone元のイメージファイルより1バイト大きくなっていた)
環境はCentOS5.2で、カーネルは2.6.18-92.1.18.el5xen
virt-cloneから呼び出される CloneManager.pyのコードを見たら、(多分)デフォルトではsparseなファイルを作るらしい。
# # Now this Cloning method is reading and writing devices. # For future, there are many cloning methods (e.g. fork snapshot cmd). # def _do_duplicate(design): (中略) # # create sparse file # if a destination file exists and sparse flg is True, # this priority takes a existing file. # if os.path.exists(dst_dev) == False and design.clone_sparse == True: design.clone_bs = 4096 sparse_copy_mode = True fd = os.open(dst_dev, os.O_WRONLY | os.O_CREAT) os.lseek(fd, dst_siz, 0) os.write(fd, '\x00') os.close(fd) else: design.clone_bs = 1024*1024*10 sparse_copy_mode = False
すると、これをcompressionのオプション付きでscpで転送したら、途中で実サイズを越えたところから劇速になるのかと思ったら、そうはならなかった。
sparseの状態を保存するためにはGNU系のtarコマンドなどが使えるらしい。(cpコマンドなら--sparse=auto/always, tarコマンド --sparse を指定するようだ)
参考にさせていただいたサイト:sparse fileについて覚え書き - はまりにっき