Open12

KVMをほぼ知識のない状態から使っていく

astkastk

https://ubuntu.com/blog/kvm-hyphervisor
を参考にとりあえず使ってみる。

作業環境

Ubuntuがインストールされている機材の上にVMを立てる。操作は同一ネットワーク上のmacOSから行う。雑に描くと以下のようになる。

[macOS(tailmoon)] --ssh--> [Ubuntu(datacat): has [VM x n] ]
astkastk

とりあえずコマンドを流し込んで動かしてみる。

sudo apt -y install bridge-utils cpu-checker libvirt-clients libvirt-daemon qemu qemu-kvm
kvm-ok
# INFO: /dev/kvm exists
# KVM acceleration can be used

sudo virt-install --name ubuntu-guest --os-variant ubuntu20.04 \
  --vcpus 2 --ram 2048 \
  --location http://ftp.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/ \
  --network bridge=virbr0,model=virtio \
  --graphics none \
  --extra-args='console=ttyS0,115200n8 serial'

動いた。

asataka@datacat:~$ virsh list
 Id   Name           State
------------------------------
 2    ubuntu-guest   running

asataka@datacat:~$ virsh console ubuntu-guest 
Connected to domain ubuntu-guest
Escape character is ^]

asataka@datacat:~$ virsh restart 2
error: unknown command: 'restart'
asataka@datacat:~$ virsh start 2
error: failed to get domain '2'

asataka@datacat:~$ virsh shutdown 2
Domain 2 is being shutdown

asataka@datacat:~$ virsh list
 Id   Name   State
--------------------

asataka@datacat:~$ virsh list -a
error: unexpected data '-a'
asataka@datacat:~$ virsh list --all
 Id   Name           State
-------------------------------
 -    ubuntu-guest   shut off

asataka@datacat:~$ virsh start 2
error: failed to get domain '2'

asataka@datacat:~$ virsh start ubuntu-guest
Domain ubuntu-guest started

asataka@datacat:~$ virsh console ubuntu-guest 
Connected to domain ubuntu-guest
Escape character is ^]

どうやらコンソールは使えない様子。
SSHをインストール時に入れているのでSSH接続を試みる。

asataka@datacat:~$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface
_gateway                 ether   24:a2:e1:e9:8f:b2   C                     eno1
10.0.1.3                 ether   58:40:4e:e4:c5:8a   C                     eno1
10.0.1.2                 ether   a8:60:b6:21:3c:1e   C                     eno1
10.0.1.7                 ether   3a:13:25:ef:c6:a9   C                     eno1
192.168.122.214          ether   52:54:00:d6:d9:9c   C                     virbr0

virbr0 というlibvirtっぽい感じのインタフェースにアドレスが振られている。というか virt-install 時にオプションで指定していた。これが対象のVMで使われているかを確認したい。

asataka@datacat:~$ virsh dominfo ubuntu-guest 
Id:             3
Name:           ubuntu-guest
UUID:           bb0a559c-2f00-4702-a648-90e3fe7ba95c
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       6.3s
Max memory:     2097152 KiB
Used memory:    2097152 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: apparmor
Security DOI:   0
Security label: libvirt-bb0a559c-2f00-4702-a648-90e3fe7ba95c (enforcing)

ネットワークの情報は virsh dominfo ではなく virsh domiflist で見られるらしい。

asataka@datacat:~$ virsh domiflist ubuntu-guest 
 Interface   Type     Source   Model    MAC
-----------------------------------------------------------
 vnet0       bridge   virbr0   virtio   52:54:00:d6:d9:9c

MACアドレスとインタフェース名(Source)が一致しているので arp で調べたアドレスで接続してみる。

asataka@datacat:~$ ssh 192.168.122.214
The authenticity of host '192.168.122.214 (192.168.122.214)' can't be established.
ECDSA key fingerprint is SHA256:dvfXyQofthOhnzplurIc/VOcm4mUjdvVU0kt4S3foZQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.122.214' (ECDSA) to the list of known hosts.
asataka@192.168.122.214's password: 
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-91-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

asataka@du20a:~$

無事接続できた。

https://qiita.com/hana_shin/items/3fc67e2e6132bd534932 が参考になった。

astkastk

コンソールはVMに入って有効化する必要があるらしい(https://askubuntu.com/a/979981)。

ttySは /dev 以下に番号違いで大量にあるがとりあえず参考元と同様 ttyS0 を使う。

ls /dev/ttyS0 # ある
sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service

これで無事 virsh console vm1 できた。

astkastk

C と C.UTF-8 と English の違いがわからない。

astkastk

こまごまとしたコマンドを見ていき、逆引き的に使えるようにしたい。といってもほぼリファレンスの抜粋になると思われる。

リファレンス

用語

  • domain: vm それぞれを指す
  • node: ホスト
  • guest: ?
astkastk

名前を変えたい

ubuntu-guest は長いので vm1 としたい。

domrename でできる。inactive にする必要がある。shutdown で止めればOK。

virsh shutdown ubuntu-guest
virsh list --all # 確認
virsh domrename ubuntu-guest vm1
virsh list --all # 名前が変わる
virsh start vm1

dominfo したところ domrename すると id が変わるっぽい(?)。

astkastk

リソース割り当てを変えたい

メモリには [setmaxmem](https://libvirt.org/manpages/virsh.html#setmaxmem) を使う。setmem の方はよくわからないがおそらく動的割り当てではなく静的に割当させる設定だと思う。

CPU数は setvcpus を使う。setvcpu だとホットプラグするかどうかの設定になる。--config --maximum を指定すると次回起動時のホットプラグの最大数が指定される。動的に割り当てられた方がいい気がするのでなんとなくこれにしてみる。

virsh setmaxmem vm1 6G
virsh setvcpus vm1 4 --config --maximum
astkastk

ディスク容量を拡張したい

リファレンスを読むと storage pool と volume という選択肢らしいものがあるがどう違うのか。ChatGPTによるとstorage poolの中にvolumeがあるという感じらしい。そもそも今の vm1 のボリュームはどうなっているのか。

astk@datacat:~$ virsh pool-list
 Name      State    Autostart
-------------------------------
 default   active   yes

astk@datacat:~$ virsh vol-list default
 Name                   Path
----------------------------------------------------------------------
 ubuntu-guest-1.qcow2   /var/lib/libvirt/images/ubuntu-guest-1.qcow2
 ubuntu-guest.qcow2     /var/lib/libvirt/images/ubuntu-guest.qcow2
 ubuntu-guest2.qcow2    /var/lib/libvirt/images/ubuntu-guest2.qcow2

astk@datacat:~$ virsh vol-info --pool default ubuntu-guest2.qcow2
Name:           ubuntu-guest2.qcow2
Type:           file
Capacity:       25.00 GiB
Allocation:     4.65 GiB

なんとなくわかった。ちなみに ubuntu-guest-* なものがいくつかあるのは何度か作り直したからだ。domainとvolumeを繋げている設定はどこにあるんだろう。

xmlのデータを見るしかないらしい。見るとボリュームのファイルパスがあるので qemu-img resize すればディスクの大きさは拡張される。

virsh dumpxml vm1 | grep 'source file'
#      <source file='/var/lib/libvirt/images/ubuntu-guest2.qcow2' index='1'/>
virsh shutdown vm1
sudo qemu-img resize /var/lib/libvirt/images/ubuntu-guest2.qcow2 +100G
virsh start vm1

あとはゲストOS内からパーティションとfsサイズの設定をする。適当なVMなのでオンラインで雑にやる。

astk@vm1:~$ sudo parted /dev/vda 'print free'
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 134GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type      File system  Flags
        1024B   1049kB  1048kB            Free Space
 1      1049kB  538MB   537MB   primary   fat32        boot
        538MB   539MB   1048kB            Free Space
 2      539MB   26.8GB  26.3GB  extended
 5      539MB   26.8GB  26.3GB  logical   ext4
        26.8GB  134GB   107GB             Free Space 

astk@vm1:~$ sudo parted /dev/vda 'resizepart 2 100%'
Warning: Partition /dev/vda2 is being used. Are you sure you want to continue?
Yes/No? yes
End?  [26.8GB]? 100%
Information: You may need to update /etc/fstab.

astk@vm1:~$ sudo parted /dev/vda 'resizepart 5 100%'
Warning: Partition /dev/vda5 is being used. Are you sure you want to continue?
Yes/No? yes
End?  [26.8GB]? 100%
Information: You may need to update /etc/fstab.

astk@vm1:~$ resize2fs /dev/vda5

astk@vm1:~$ df -h /dev/vda5
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda5       123G  3.2G  114G   3% /
astk@vm1:~$

20G→120G程度に拡張された(単位系のせいか少し大きい)。

astkastk

ホスト外(自宅内ネットワーク)にインタフェースを露出させたい

VS Codeでsshしたいので。

astkastk

名前解決したい(ホストから)

https://libvirt.org/nss.html を利用するとホストからゲストのdomain名でアドレスを弾けるようになる。libvirt-nss を入れて /etc/nsswitch.conflibvirt を足せばOK。

sudo apt install libnss-libvirt
vi /etc/nsswitch.conf
cat /etc/nsswitch.conf | grep libvirt
# hosts:          files ... dns mymachines libvirt

これで pingssh が通るようになる。

astk@datacat:~$ ping vm1
PING vm1 (192.168.122.237) 56(84) bytes of data.
64 bytes from 192.168.122.237 (192.168.122.237): icmp_seq=1 ttl=64 time=0.315 ms
:

astk@datacat:~$ ssh vm1
astk@vm1's password:
: