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について覚え書き - はまりにっき