KVMをほぼ知識のない状態から使っていく
を参考にとりあえず使ってみる。
作業環境
Ubuntuがインストールされている機材の上にVMを立てる。操作は同一ネットワーク上のmacOSから行う。雑に描くと以下のようになる。
[macOS(tailmoon)] --ssh--> [Ubuntu(datacat): has [VM x n] ]
とりあえずコマンドを流し込んで動かしてみる。
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 が参考になった。
コンソールは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
できた。
C と C.UTF-8 と English の違いがわからない。
こまごまとしたコマンドを見ていき、逆引き的に使えるようにしたい。といってもほぼリファレンスの抜粋になると思われる。
リファレンス
- 公式(?)
- その他
用語
- domain: vm それぞれを指す
- node: ホスト
- guest: ?
名前を変えたい
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 が変わるっぽい(?)。
リソース割り当てを変えたい
メモリには [setmaxmem](https://libvirt.org/manpages/virsh.html#setmaxmem)
を使う。setmem
の方はよくわからないがおそらく動的割り当てではなく静的に割当させる設定だと思う。
CPU数は setvcpus
を使う。setvcpu
だとホットプラグするかどうかの設定になる。--config --maximum
を指定すると次回起動時のホットプラグの最大数が指定される。動的に割り当てられた方がいい気がするのでなんとなくこれにしてみる。
virsh setmaxmem vm1 6G
virsh setvcpus vm1 4 --config --maximum
ディスク容量を拡張したい
リファレンスを読むと 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程度に拡張された(単位系のせいか少し大きい)。
ホスト外(自宅内ネットワーク)にインタフェースを露出させたい
VS Codeでsshしたいので。
名前解決したい(ホストから)
https://libvirt.org/nss.html を利用するとホストからゲストのdomain名でアドレスを弾けるようになる。libvirt-nss を入れて /etc/nsswitch.conf
に libvirt
を足せばOK。
sudo apt install libnss-libvirt
vi /etc/nsswitch.conf
cat /etc/nsswitch.conf | grep libvirt
# hosts: files ... dns mymachines libvirt
これで ping
や ssh
が通るようになる。
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:
: