はじめに
WindowsでVirtualboxを使って仮想環境を作成していたが、手間だったので、KVM/QEMUで簡易化ができるのではにないかと思い、実施する。
環境
構築
KVMのインストール
KVMをインストールする
$ sudo apt install -y libvirt-clients qemu-utils qemu-kvm libvirt-daemon libvirt-daemon-system
仮想環境が使用するイメージを作成
次に、cloud-initを使ってKVMで上で仮想環境を構築したいので、cloud-initで使用するcloudimgをダウンロードする。 https://cloud-images.ubuntu.com/releases/22.04/release/からcloudimgをダウンロードする。 保存先は/var/lib/libvirt/imagesとした。
#rootでログインして、ベースイメージのあるディレクトリへ移動 $ sudo -i # cd /var/lib/libvirt/images # curl -O https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img # ls ubuntu-22.04-server-cloudimg-amd64.img
次に仮想環境が使用するイメージを作成する。 ディスク容量は30Gとした。
# VMNAME=ubuntu22-vm1 ## qemu-imgで扱えるように拡張子の変換 # qemu-img create -F qcow2 -b ubuntu-22.04-server-cloudimg-amd64.img -f qcow2 $VMNAME.qcow2 30G Formatting 'id-vm1.qcow2', fmt=qcow2 size=53687091200 backing_file=ubuntu-20.04.1-server-cloudimg-amd64.img backing_fmt=qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16
作成された .qcow2 は ubuntu-*.qcow2 をベースとし、ベースからの差分が書き込まれていく。 ベースイメージ .img は絶対に移動/削除しないこと。
イメージのメタデータを確認するには qemu-img info を使う。
# qemu-img info $VMNAME.qcow2 image: ubuntu22-vm1.qcow2 file format: qcow2 virtual size: 30 GiB (32212254720 bytes) disk size: 196 KiB cluster_size: 65536 backing file: ubuntu-22.04-server-cloudimg-amd64.img backing file format: qcow2 Format specific information: compat: 1.1 compression type: zlib lazy refcounts: false refcount bits: 16 corrupt: false extended l2: false
作成したら root から抜けて一般ユーザ(ubuntu)に戻る。
# exit logout $
cloud-init用のuser-data/meta-dataの準備
cloud-init用のuser-data/meta-dataの準備する。 このイメージファイルにはcloud-initがインストールされており、外部から与えられたmeta-dataおよびuser-dataの設定に基いて、起動時にVMの各種初期化(ログインパスワードの設定、NICの設定、ファイルシステム設定、公開鍵の登録…など)を行うことができる。
# 作業用ディレクトリ作成 $ cd $ mkdir -p cloud-init $ cd cloud-init/
VMNAMEの変数をVM名に設定し、user-data/meta-dataを作成する下記コマンドを実行する。 VMNAMEの名前でディレクトリが作成され、cidata-(VM名).iso というISOイメージができる。 パスワードはubuntuとする。
#必要なライブラリをインストール $ sudo apt install -y genisoimage $ ( VMNAME=ubuntu22-vm1 mkdir -p $VMNAME pushd $VMNAME cat > user-data <<-EOS #cloud-config password: ubuntu chpasswd: {expire: False} ssh_pwauth: True EOS cat > meta-data <<-EOS instance-id: $VMNAME local-hostname: $VMNAME EOS genisoimage -output ../cidata-${VMNAME}.iso -volid cidata -joliet -rock user-data meta-data popd ) #出力 ~/cloud-init/ubuntu22-vm1 ~/cloud-init I: -input-charset not specified, using utf-8 (detected in locale settings) Total translation table size: 0 Total rockridge attributes bytes: 331 Total directory bytes: 0 Path table size(bytes): 10 Max brk space used 0 183 extents written (0 MB) ~/cloud-init
VMの作成と起動
$ cat > create-ubuntu22-vm1.sh << "EOF" #!/bin/bash # VM name VMNAME=ubuntu22-vm1 # # of vCPUs assigned to the VM VCPUS=2 # RAM size assigned to the VM RAMSIZE=4 # Unit: GB # VM image file name IMAGE_FILE=/var/lib/libvirt/images/${VMNAME}.qcow2 CIDATA_FILE=$PWD/cidata-${VMNAME}.iso if [ ! -r $CIDATA_FILE ]; then echo "error: $CIDATA_FILE not found" exit 1 fi if [ ! -r $IMAGE_FILE ]; then echo "error: $IMAGE_FILE not found" exit 2 fi sudo virt-install \ --name $VMNAME \ --ram $(($RAMSIZE * 1024)) \ --vcpus $VCPUS \ --arch x86_64 \ --os-type linux \ --os-variant ubuntu22.04 \ --virt-type qemu\ --file $IMAGE_FILE \ --cdrom $CIDATA_FILE \ --boot hd \ --network network:default \ --graphics none \ --serial pty \ --console pty \ --autostart --noreboot EOF
vCPUとメモリの設定は必要に応じて変える。
libvirt-qemuユーザーが/home/ubuntuディレクトリにアクセスできるようにするためには、以下のコマンドを実行する。
$ sudo setfacl -m u:libvirt-qemu:x /home/ubuntu
次に、シェルスクリプトの実行する。このシェルスクリプトではvirt-installコマンドを使用しているのでそれをインストールしてから、シェルスクリプトを実行する。
#ライブラリをインストール $ sudo apt install -y virt-manager #シェルスクリプト実行 $ bash ./create-ubuntu22-vm1.sh (数十分後) ubuntu22-vm1 login: ubuntu ←作成したIDを入力 Password: ←user-dataで指定したpasswordを入力 ubuntu@ubuntu22-vm1:~$ ←WSL2上の仮想環境にログインできた。
念のために、WSL2上から仮想環境を確認する。
$ virsh list Id Name State ------------------------------ 6 ubuntu22-vm1 running
無事に動作していそうである。
参考
トラブルシューティングメモ
#シェルスクリプト実行 $ bash ./create-ubuntu22-vm1.sh WARNING --os-type is deprecated and does nothing. Please stop using it. ERROR Host does not support domain type kvm for virtualization type 'hvm' with architecture 'x86_64'
シェルスクリプト時、上記のエラーを確認した。 hiro20180901.hatenablog.com
上記 を参考に、WSL2 で Nested VM が有効かどうか確認する。
$ ls -l /dev/kvm* crw-rw-r-- 1 root kvm 10, 232 Feb 26 07:33 /dev/kvm $ egrep -c '(vmx|svm)' /proc/cpuinfo 0 $ kvm-ok INFO: Your CPU does not support KVM extensions INFO: For more detailed results, you should run this as root HINT: sudo /usr/sbin/kvm-ok
CPUがKVMをサポートしていないようだ。
現在のPCで使用しているCPUが 11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz 2.61 GHz である。Intel CPUの場合、Intel® Virtualization Technology (VT-x)の機能があると、そのCPUが仮想化技術をサポートしているようである。
https://www.intel.co.jp/content/www/jp/ja/support/articles/000005486/processors.html を参考に、自分のCPUにIntel® Virtualization Technology (VT-x)があるかどうかをhttps://ark.intel.com/content/www/jp/ja/ark/products/208081/intel-core-i5-1145g7e-processor-8m-cache-up-to-4-10-ghz.html から確認したがサポートしているようだ。 そのことから、WSL2上ではkvm-okコマンドが正常に動作していないようである。