
別のサーバーに転送したいスパースな生の QEMU イメージがあります。次のqemu-img info
ようになります:
image: sparse.img
file format: raw
virtual size: 50G
disk size: 16G
次のように転送します:
rsync -azhP --sparse origin:/path/to/img/sparse.img .
現在、宛先サーバーには次のものがあります:
image: sparse.img
file format: raw
virtual size: 50G
disk size: 40G
ただし、virt-sparsify
コピーしたイメージを再度実行すると、次のようになります。
image: sparse.img
file format: raw
virtual size: 50G
disk size: 16G
両方のサーバーは XFS ファイルシステム上で CentOS 7.2 を実行しています。それで何が起こったのでしょうか?
アップデート:
さらに調査してみると、rsyncはスパースファイルをうまく処理できず、別のツールを使う方が良いという投稿がいくつか見つかりました。タールなど、スパース ファイルを転送します。
tar
転送後に を実行してrsync --inplace
、ファイルがエラーなく転送されたかどうかを確認できます。ここ。
別の解決提案された方法は、転送先に同じサイズの空のスパース ファイルを作成し、それを使用してrsync --inplace
実際のデータを転送するというものでした。
rsync --sparse
なぜこのように動作するのかを 実際に説明していないため、これを解決策として書きませんでした。
答え1
これは、送信元と送信先の間の FS の不一致によるものだと思います。
例を挙げて詳しく説明しましょう。スパース ファイルとは、ディスク上に空のブロック (つまり、0 でいっぱいのブロック) が割り当てられていないファイルのことです。FS 上のブロック サイズが小さいほど、そのようなブロックが見つかる可能性が高くなります。したがって、問題は、宛先のブロック サイズがソースよりも大きいことが原因である可能性があります。
私が知らない他の XFS パラメータがあるかもしれません。
答え2
私が見つけた最も効果的な解決策は、まず
virt-sparsify imagename
少し時間がかかります。これにより、、およびls -h
の両方で同じサイズを報告する、より小さいサイズのイメージが生成されます。ただし、イメージをマウントすると、正しいサイズが報告されます (そして、予想どおりに拡大します)。du -h
du -h --apparent-size
次に、そのイメージを rsync します。