SLES15 と openSUSE 15 では KVMの仮想マシンの Raw フォーマットが違う

openSUSE Leap 15.x と SUSE Linux Enterprise 15(SLES15) では、KVM 仮想ディスクイメージに raw フォーマットを選んだ際、スパースファイル形式なのか、スパースなしファイルなのかが違っていた、と言う話。

SLES15.x では、ディスクイメージフォーマットに raw 形式を選ぶと、スパースファイルが作られます。

openSUSE Leap 15.x では raw フォーマットを指定すると、ノン・スパースファイルが作られます。

なお、両方とも、デフォルトでは qcow2 が仮想ディスクイメージの形式です。


-- qcow2 と raw フォーマットの違い

qcow2 は openSUSE/SLES では、KVM のデフォルトファイルフォーマットです。指定したサイズより小さなサイズでファイルが作られ、ファイルの書き込みがあると、仮想ディスクイメージが指定のファイルサイズになるまで拡張します。当初のディスク容量を節約でき、スナップショットなどの高い機能を持っています。半面、サイズ拡張の際のオーバーヘッドが大きく一般的にはパフォーマンスが出にくいと言われます。

raw フォーマットは、ls コマンドで、見た目と実サイズが同じ非スパースの raw フォーマットと、表示上のサイズより実占有量が少ないスパースファイル raw 形式の二種類があります。スパースファイルは表示上1Gバイトあるデータベースファイルなんだけど、まだ使い始めたばかりだから実際にデータがあるのは100Mbしかないんですよ、と言った場合、ディスク上の実占有量は 100 Mb しかない、感覚的には、圧縮ファイルみたいに「空欄」を飛ばしたようなファイルです。パフォーマンスでは、非スパースファイルの方がフラグメントが少なくオーバーヘッドがなくて性能が出ます。

私は XEN 仮想化から入ったので raw 形式の非スパース形式が慣れていて好みです。スパースファイルや qcow2 形式は性能に問題がありそうだし、使い続けて拡張して膨れ上がり、気が付かないウチにディスクの容量不足になった、なんてトラブルには会いたくありません。


-- openSUSE Leap 15 と SLES15 で raw 形式の仮想ディスクイメージを指定する

virt-manager で Create virtual machine を実行すると、ウィザード形式でそのまま進めると、Proposal に指定されたOSテンプレートに従った qcow2 ファイルで作られてしまいます。ファイル名を指定しないと、 os_name.qcow2 というファイルが自動作成されてしまいます。

そこで、プロポーザルに従わないで、ファイル名を指定して、例えば "myvm.root.raw" 20Gb などと拡張子を変えて指定して進めます。

ウィザードの最後に "Finish" を押すところで "Customize configuration before install" のチェックを入れて、"Finish" すると、サマリ画面が出てきます。

SLES15 と openSUSE 15 では KVMの仮想マシンの Raw フォーマットが違う_a0056607_23071274.png

このサマリ画面で、仮想マシンの微調整ができます。

Virtio.Disk の "Advanced options" を開くと Storage Format が "qcow2" になっているはずなので、ここを "raw" にすれば、仮想イメージは raw フォーマットで作成されます。

SLES15 と openSUSE 15 では KVMの仮想マシンの Raw フォーマットが違う_a0056607_23075011.png

ところが、この raw フォーマットは openSUSE Leap では非スパースファイルSLES ではスパースファイルだったのです。

openSUSE Leap 15 では、随分仮想イメージの作成に時間がかかるな、と怪しんでいたのですが openSUSE Leap で raw 形式を選ぶと非スパースファイルなので、Null 埋めするため時間がかかるのですが、スパースファイルを使う SLES では瞬発で瞬時に仮想イメージが作られる訳です。

わたしの好みは、これが解ってしまった以上、非スパースファイルを使う openSUSE Leap の方が好きです。


-- qemu-img コマンドでファイルシステムを確認する

# qemu-img info myvm.img

を実行します。

openSUSE Leap 15 で非スパースファイルの場合、virtual size と disk size の値が同じです。

opensuse15:~ # qemu-img info /var/lib/libvirt/images/vm01/vm01.disk0.raw
image: /var/lib/libvirt/images/vm01/vm01.disk0.raw
file format: raw
virtual size: 20 GiB (21478375424 bytes)
disk size: 20 GiB
opensuse15:~ #

SLES15 ではスパースファイルを使っているため、ls で見たサイズと、実際のディスクサイズは異なります。

sles15:~ # ls /var/lib/libvirt/images/zm001/zm001.disk1.raw -lh
-rw------- 1 qemu qemu 26G Jun 20 17:22 /var/lib/libvirt/images/zm001/zm001.disk1.raw
sles15:~ # qemu-img info /var/lib/libvirt/images/zm001/zm001.disk1.raw
image: /var/lib/libvirt/images/zm001/zm001.disk1.raw
file format: raw
virtual size: 25G (26847870976 bytes)
disk size: 21G
sles15:~ #

SLES15 で qemu-image create してみたら、一瞬で終了し、disk size : 0 のファイルが作られました。ls で確認すると、見かけ上は指定サイズになっています。

あまり、スパース形式の raw ファイルって意味ないような気がします。SLES 的には将来性と可用性のある qcow2 を使え、というのが方針なのでしょう。

sles15:~ # qemu-img create -f raw vmimg.system.raw 4G
Formatting 'vmimg.system.raw', fmt=raw size=4294967296
sles15:~ # ls vmimg.system.raw -lh
-rw-r--r-- 1 root root 4.0G Jun 20 18:24 vmimg.system.raw
sles15:~ # qemu-img info vmimg.system.raw
image: vmimg.system.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 0
sles15:~ #

-- SLES15 でパフォーマンス優先の仮想マシンイメージを作るには dd で

openSUSE Leap では、仮想イメージを作るには、virt-manager の Advanced options から、ストレージフォーマットを raw にすれば、非スパースファイルで作られますが、ウィザードから作成の時に時間がかかります。ここが怪しくて、余り openSUSE Leap の KVM は好きになれなかった。

しかしこれは正しい。なぜなら、パーティションの空き容量を考慮せず仮想イメージを作ってしまうと、運用中に実容量を食いつくして仮想マシンの動作に影響が出てしまうのです。突然ハングアップしたり、怪しい動作をしてしまうとかですね。たまにそういう経験をしていたのですが、原因はパーティションを食いつくして virt-create 中にハングアップしたり、動作不良してしまう事を何度か経験しています。qcow2 でも同じ現象があるかもしれません。

SLES15 では dd コマンドで null 埋めしたファイルを仮想イメージとして事前に作っておくのが良さそうです。勿論めんどうで時間がかかりますがパフォーマンスや仮想マシンの信頼性は高くなります。

sles15:/ssd/test # dd if=/dev/zero of=vmimg.system.raw bs=1024M count=10
10+0 records in
10+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 48.7019 s, 220 MB/s
sles15:/ssd/test # qemu-img info vmimg.system.raw
image: vmimg.system.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 10G
sles15:/ssd/test #


ちなみに、非スパースファイルをコピーすると、コピー先にはスパースファイルになってしまう様です。これを避けるためには cp コマンドには、"--sparse=always” オプションを付けます。

# cp --sparse=always source_file new_file
# rsync --sparse source_file new_file

-- まとめ

仮想環境の設計はまだまだ奥が深いものです。同じ SUSE のディストリビューションである openSUSE Leap 15 と SUSE Linux Enterprise 15 でも、virt-manager のチューニングには違いがある事が解りました。他のディストリビューションでも、コマンドやツールのチューニングに違いがある可能性があります。

仮想環境はベアメタルとは違い、メモリやCPUのコア数、仮想ディスクのサイズや数は自由度が高いのです。できるだけコンパクトに高速に使いたいのなら、システムドライブは SSD や SAS-Raid などの高速デバイス上にコンパクトで非スパース raw 形式で作って、高速性が要求されないけれど将来性を考えたバックアップ用ドライブやアーカイブ、遅くても容量が要求されるファイルサーバーなどの場合は、安価で遅い大容量の SATA-HDD上の qcow2 にするか、SATA-iSCSI NAS などの外部ドライブを使うなどの設計の工夫が求められます。

また、仮想化されるシステムが Linux か Windows かによって、仮想イメージのフォーマットやサイズ、配置などに工夫が要ります。

なぜ、openSUSE Leap と SLES で違いがあるのかはマニュアルやリリースノートには見つかりませんでした。




by islandcenter | 2021-06-20 23:36 | SUSE | Comments(0)