HalNiの雑記

備忘録を兼ねて。サーバマシンとかネットワークとか

openSUSE の Minimal Virtual Machine image を活用してみよう

の記事はopenSUSE Advent Calendar 2023 7日目の記事です。

openSUSEダウンロードサイトには、様々なタイプのファイルがあります。
blog.geeko.jp

その中で、仮想マシンの用のイメージ "Minimal Virtual Machine" が存在します

openSUSE Leap 15.5 - Get openSUSE

Minimal Virtual Machineにも種類があり、x86環境では以下が選択できます。

  • KVM and Xen image
     KVMXenで使用可能な qcow2形式のイメージ
  • MS Hyper-V iamge
     Hyper-Vで使用可能な vhdx形式のイメージ
  • VMware image
     ESXi/VMware playerで使用可能な vmdk形式のイメージ
  • Cloud image
     OpenstakやKVMのcloud-init環境で使用可能な qcow2形式のイメージ

今回はこの中で KVM and Xen image にフォーカスを当てたいと思います。

ダウンロードサイト上のファイルサイズが KVM and XEN image (250.4 MiB) となっており小っさ!っとなりますが、
これはKVM and Xen image がスパース形式のqcow2ファイルで提供されているためです。

KVM and Xen image (以後KVMイメージ)の実容量は 約300MBですが、論理容量は24GB あります。

halni@SUSE-MZ32:~> ls -lsh openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
251M -rw-r--r-- 1 root root 251M Nov  1 02:45 openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2

halni@SUSE-MZ32:~> qemu-img info openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
...(略)...
virtual size: 24 GiB (25769803776 bytes)     ★ 論理容量
disk size: 250 MiB     ★ 実際のファイルサイズ
...(略)...
halni@SUSE-MZ32:~>

ゲスト側からはしっかり24GB分確認できます。

localhost:~ # fdisk -l
Disk /dev/vda: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 2032C12E-B8C7-437F-832D-60AEE47BC452

Device     Start      End  Sectors Size Type
/dev/vda1   2048     6143     4096   2M BIOS boot
/dev/vda2   6144    73727    67584  33M EFI System
/dev/vda3  73728 50331614 50257887  24G Linux filesystem
localhost:~ # df -h | grep /$
/dev/vda3        24G  599M   23G   3% /     ★ / に24GB割り当てられている
localhost:~ # df -h | grep /$

ダウンロードしたKVMイメージは、KVMゲスト(仮想マシン)にアタッチすることで使用できます。
virt-managerやcockpit-machines、virt-install 等からゲストを新規作成して、KVMイメージを指定するだけでOK!
virt-install を使用して作成する場合はこんな感じ。

virt-install --name test --memory 4096 --vcpus 4 --disk KVMイメージのパス --import --os-variant opensuse15.5 --noautoconsole

halni@SUSE-MZ32:~> sudo virt-install --name SUSE-image-kvm --memory 4096 --vcpus 2 --disk /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2 --import --os-variant opensuse15.5 --noautoconsole

Starting install...
Creating domain...                                                                               |    0 B  00:00:00
Domain creation completed.
halni@SUSE-MZ32:~> sudo virsh list --all | grep SUSE-image
 76   SUSE-image-kvm           running
halni@SUSE-MZ32:~>

作成後、ゲストはKVMイメージを読んで立ち上がります

初回起動時の設定画面が立ち上がる

キーボードレイアウト、タイムゾーン、rootパスワードを設定するだけで立ち上がります。
この初回設定ウィザードには、jeos-firstboot が使用されています。

localhost:~ # systemctl status jeos-firstboot
● jeos-firstboot.service - SUSE JeOS First Boot Wizard
     Loaded: loaded (/usr/lib/systemd/system/jeos-firstboot.service; enabled; vendor preset: disabled)
     Active: active (exited) since Tue 2023-12-05 12:12:50 UTC; 1 day 15h ago

github.com

因みにKVMイメージにはシリアルコンソール設定が投入されているため、ホスト側からvirsh consoleで接続することも可能です。

halni@SUSE-MZ32:~> sudo virsh console SUSE-image-kvm
Connected to domain 'SUSE-image-kvm'
Escape character is ^] (Ctrl + ])

localhost login: root
Password:
Last login: Thu Dec  5 11:55:09 on tty1
Have a lot of fun...
localhost:~ # cat /etc/default/grub
...(略)...
GRUB_CMDLINE_LINUX_DEFAULT="rw systemd.show_status=1 console=ttyS0,115200 console=tty0 quiet"  ★シリアルコンソール設定が投入されている
...(略)...


先ほどこのKVMイメージがスパース形式のqcow2ファイルと書きましたが、
スパース形式のため、ゲスト側でディスク領域を使用した分qcow2ファイルは肥大化していきます。

halni@SUSE-MZ32:~> qemu-img info /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
...(略)...
virtual size: 24 GiB (25769803776 bytes)
disk size: 506 MiB
...(略)...

★ ゲスト側でディスクにファイル書き込み
localhost:~ # df -h | grep /$
/dev/vda3        24G  590M   23G   3% /
localhost:~ # dd if=/dev/zero of=/root/1G.img bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.70161 s, 631 MB/s
localhost:~ # df -h | grep /$
/dev/vda3        24G  1.6G   22G   7% /
localhost:~ #

★ qcow2ファイルの実容量が増えている
halni@SUSE-MZ32:~> qemu-img info /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
...(略)...
virtual size: 24 GiB (25769803776 bytes)
disk size: 1.32 GiB
...(略)...

ゲスト側でファイルを削除しても、ホスト側から見てqcow2イメージの実容量が小さくなることはありません。

実容量を小さくしたい場合、qcow2イメージを圧縮することで小さくすることができます。

qemu-img -c -O qcow2 圧縮したいqcow2ファイル 圧縮後のqcow2ファイル名

localhost:~ # df -h | grep /$
/dev/vda3        24G  5.6G   18G  24% /
localhost:~ # rm 5G.img
localhost:~ # df -h | grep /$
/dev/vda3        24G  595M   23G   3% /     ★ ゲスト側の使用量が500MB程度

halni@SUSE-MZ32:~> ls -lsh /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
5.4G -rw-r--r-- 1 root root 5.4G Dec  7 20:53 /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
halni@SUSE-MZ32:~> qemu-img info /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
...(略)...
virtual size: 24 GiB (25769803776 bytes)
disk size: 5.35 GiB     ★ 実容量は5GB程度消費している
...(略)...
halni@SUSE-MZ32:~> sudo qemu-img convert -c -O qcow2 /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2 /mn
t/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen-shrink.qcow2
halni@SUSE-MZ32:~>
halni@SUSE-MZ32:~> ls -lsh /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen-shrink.qcow2
252M -rw-r--r-- 1 root root 252M Dec  7 20:55 /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen-shrink.qcow2
halni@SUSE-MZ32:~> qemu-img info /mnt/vm/openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen-shrink.qcow2
...(略)...
virtual size: 24 GiB (25769803776 bytes)
disk size: 252 MiB     ★ 実容量を圧縮できた
...(略)...
halni@SUSE-MZ32:~>

元々5GB程度まで肥大化していたqcow2イメージを、200MB程度まで小さくすることができました。