labunix's blog

labunixのラボUnix

debian bookwormにKVMを入れてみる

■debian bookwormにKVMを入れてみる
 以下のときとあまり変わらないみたい

 debian stretchにKVMを導入する。
 https://labunix.hateblo.jp/entry/20180501/1525182562

$ lsb_release -d
No LSB modules are available.
Description:	Debian GNU/Linux 12 (bookworm)

■やり方は基本的に以下と同じ

 WheezyにQEMU-KVMを導入
 https://labunix.hateblo.jp/entry/20130716/1373901127

■メモリが64GBあるので、少々の融通は効くはず

$ free -g
               total        used        free      shared  buff/cache   available
Mem:              62           2          59           0           1          59
Swap:              0           0           0

■CPUはAMD系の8コア16スレッド

$ grep flags /proc/cpuinfo | awk '{for(a=1;a<=NF;a++){if($a ~ /vmx|svm/){print $a | "sort | uniq -c"}}}'
     16 svm
     16 svm_lock

■KVMを入れる

$ sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-daemon virtinst bridge-utils libosinfo-bin

$ lsmod | grep kvm
kvm_amd               155648  0
kvm                  1146880  1 kvm_amd
irqbypass              16384  1 kvm
ccp                   118784  1 kvm_amd

■有線LANをブリッジに変更

$ ls /sys/class/net/
enp2s0  lo

 https://orcacore.com/network-bridge-configuration-debian-12-linux/

$ sudo sed -e 's/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/X.X.X.X/' /etc/network/interfaces.d/br0
## static ip config file for br0 ##
auto br0
iface br0 inet static
	address X.X.X.X
	broadcast X.X.X.X
	netmask X.X.X.X
	gateway X.X.X.X
	# If the resolvconf package is installed, you should not edit 
        # the resolv.conf configuration file manually. Set name server here
        #dns-nameservers X.X.X.X
        # If you have muliple interfaces such as enp2s0 and enp2s1
        # bridge_ports  enp2s0
	bridge_ports enp2s0
	bridge_stp off       # disable Spanning Tree Protocol
        bridge_waitport 0    # no delay before a port becomes available
        bridge_fd 0          # no forwarding delay

$ sudo systemctl restart networking

$ ls /sys/class/net/
br0  enp2s0  lo

$ sudo brctl show | sed -e 's/\.[0-9a-f]*/.XXXXXXXXXXX/'
bridge name	bridge id		STP enabled	interfaces
br0		8000.XXXXXXXXXXX	no		enp2s0

$ sudo bridge link
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 5 

■システムの再起動を行い、既存のenp2s0の設定がbr0に変わったことを確認

$ virsh list
 Id   名前   状態
-------------------

■ネットワーク仮想化のオーバヘッド対応のためにvhost-netを有効化

$ apt-file search vhost_net | grep "$(uname -r)"
linux-image-6.1.0-13-amd64: /lib/modules/6.1.0-13-amd64/kernel/drivers/vhost/vhost_net.ko
linux-image-6.1.0-13-amd64-dbg: /usr/lib/debug/lib/modules/6.1.0-13-amd64/kernel/drivers/vhost/vhost_net.ko
linux-image-6.1.0-13-amd64-unsigned: /lib/modules/6.1.0-13-amd64/kernel/drivers/vhost/vhost_net.ko

$ lsmod | grep vhost
vhost_net              36864  0
tun                    61440  1 vhost_net
vhost                  57344  1 vhost_net
vhost_iotlb            16384  1 vhost
tap                    28672  1 vhost_net

$ echo vhost_net | sudo tee -a /etc/modules >/dev/null

■virshコマンド実行のためにグループ権限を追加

$ sudo gpasswd libvirt -a labunix
$ sudo gpasswd libvirt-qemu -a labunix
$ exit

$ id | awk -F "[ ,]" '{for(a=1;a<=NF;a++){if($a ~ /libvirt/){print $a}}}'
122(libvirt)
64055(libvirt-qemu)

■netinstallのISOイメージファイルを配置

$ wget "http://ftp.jaist.ac.jp/debian-cd/current/amd64/iso-cd/debian-$(cat /etc/debian_version).0-amd64-netinst.iso"
$ sudo mkdir /var/lib/libvirt/images
$ sudo mv -i debian-12.2.0-amd64-netinst.iso /var/lib/libvirt/images/
$ sudo chown -R libvirt-qemu:libvirt /var/lib/libvirt/images/
$ env LANG=C ls -l --time-style='+%Y/%m/%d-%H:%M:%S' /var/lib/libvirt/images/
total 643076
-rw-r--r-- 1 libvirt-qemu libvirt 658505728 2023/10/07-21:04:58 debian-12.2.0-amd64-netinst.iso

■virt-managerを起動して普段どおりにゲストOSをインストール。
 4コア、16GBメモリ、ディスク80GBを割り当て
 インストールが終わったら今回はシャットダウン

$ apt-file search bin/virt-manager
virt-manager: /usr/bin/virt-manager 

$ sudo apt-get install -y virt-manager

$ virt-manager

$ echo $((1024*16))
16384

■xmlファイルを読んで関連を探す。
 選択項目をピックアップすると、
 4vcpu、16GBメモリ、ホストのブリッジからNWを構成し、ディスクはqcow2で80GB。

$ sudo awk '/vcpu|type arch|memory|device=|source bridge/' /etc/libvirt/qemu/kvm-debian12.xml 
  <memory unit='KiB'>16777216</memory>
  <vcpu placement='static'>4</vcpu>
    <type arch='x86_64' machine='pc-q35-7.2'>hvm</type>
    <disk type='file' device='disk'>
    <disk type='file' device='cdrom'>
      <source bridge='br0'/>

$ sudo find /var/lib/libvirt/ -type f -name "*.qcow2" -exec ls -lh --time-style='+%Y/%m/%d-%H:%M:%S' {} +
-rw------- 1 libvirt-qemu libvirt-qemu 81G 2023/11/02-22:52:06 /var/lib/libvirt/images/kvm-debian12.qcow2

■ゲストOSのその他の構成ファイルは以下。

$ sudo find /var/lib/libvirt/ /etc/libvirt -type f
/var/lib/libvirt/images/debian-12.2.0-amd64-netinst.iso
/var/lib/libvirt/images/kvm-debian12.qcow2
/var/lib/libvirt/qemu/domain-2-kvm-debian12/master-key.aes
/etc/libvirt/virtlockd.conf
/etc/libvirt/qemu-lockd.conf
/etc/libvirt/qemu/networks/default.xml
/etc/libvirt/qemu/kvm-debian12.xml
/etc/libvirt/libxl.conf
/etc/libvirt/qemu.conf
/etc/libvirt/virtlogd.conf
/etc/libvirt/nwfilter/no-ipv6-multicast.xml
/etc/libvirt/nwfilter/qemu-announce-self-rarp.xml
/etc/libvirt/nwfilter/no-ip-spoofing.xml
/etc/libvirt/nwfilter/no-ip-multicast.xml
/etc/libvirt/nwfilter/allow-dhcp-server.xml
/etc/libvirt/nwfilter/allow-dhcpv6.xml
/etc/libvirt/nwfilter/allow-ipv6.xml
/etc/libvirt/nwfilter/no-other-rarp-traffic.xml
/etc/libvirt/nwfilter/no-other-l2-traffic.xml
/etc/libvirt/nwfilter/qemu-announce-self.xml
/etc/libvirt/nwfilter/allow-ipv4.xml
/etc/libvirt/nwfilter/allow-incoming-ipv4.xml
/etc/libvirt/nwfilter/clean-traffic.xml
/etc/libvirt/nwfilter/allow-dhcpv6-server.xml
/etc/libvirt/nwfilter/allow-arp.xml
/etc/libvirt/nwfilter/no-mac-spoofing.xml
/etc/libvirt/nwfilter/no-ipv6-spoofing.xml
/etc/libvirt/nwfilter/no-arp-ip-spoofing.xml
/etc/libvirt/nwfilter/allow-incoming-ipv6.xml
/etc/libvirt/nwfilter/no-arp-spoofing.xml
/etc/libvirt/nwfilter/no-arp-mac-spoofing.xml
/etc/libvirt/nwfilter/allow-dhcp.xml
/etc/libvirt/nwfilter/clean-traffic-gateway.xml
/etc/libvirt/nwfilter/no-mac-broadcast.xml
/etc/libvirt/libvirt.conf
/etc/libvirt/qemu-sanlock.conf
/etc/libvirt/storage/default.xml
/etc/libvirt/lxc.conf
/etc/libvirt/libxl-lockd.conf
/etc/libvirt/libxl-sanlock.conf
/etc/libvirt/libvirt-admin.conf
/etc/libvirt/libvirtd.conf

■virshで管理できていることを確認

$ env LANG=C virsh -c qemu:///system list --all
 Id   Name           State
-------------------------------
 -    kvm-debian12   shut off

$ export LIBVIRT_DEFAULT_URI="qemu:///system"
$ env LANG=C virsh  list --all
 Id   Name           State
-------------------------------
 -    kvm-debian12   shut off

■ログインしたユーザに適用されるように設定

$ echo '#!/bin/bash' | sudo tee /etc/profile.d/kvm.sh > /dev/null
$ echo 'export LIBVIRT_DEFAULT_URI="qemu:///system"' | sudo tee -a /etc/profile.d/kvm.sh > /dev/null

$ grep uri_default /etc/libvirt/libvirt.conf
# (@uri_default also prevents probing of the hypervisor driver).
#uri_default = "qemu:///system"

■今回は下記のコメントアウトの調査をスキップする

$ grep "_r[ow]_\|_group" /etc/libvirt/libvirtd.conf
#unix_sock_group = "libvirt"
#unix_sock_ro_perms = "0777"
#unix_sock_rw_perms = "0770"
# If the unix_sock_rw_perms are changed you may wish to enable

■シリアルポートがなければvirt-managerから追加

$ virsh dumpxml kvm-debian12 | grep console
    <console type='pty' tty='/dev/pts/3'>
    </console>

■ssh経由でgrubにシリアルコンソールの設定をして「virsh console」が使えるようにする

$ virsh start kvm-debian12
ドメイン 'kvm-debian12' が開始しました

$ ssh kvm-debian12
$ su
# grep CMDLINE /etc/default/grub 
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# grep CMDLINE /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX="console=pty3 console=ttyS0,115200n8"

# export PATH=/sbin:$PATH

# grub-update 
# shutdown -r now && exit

$ virsh console kvm-debian12
ドメイン 'kvm-debian12' に接続しました
エスケープ文字は ^] です (Ctrl + ])

Debian GNU/Linux 12 kvm-debian12 ttyS0

kvm-debian12 login: 

$ cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-6.1.0-13-amd64 root=UUID=1068c18a-63f6-4ee4-b75f-d02a675215e8 ro console=tty0 console=ttyS0,115200n8 quiet

■今回は「/var」にあまり空きが無いので、ディスクイメージを「/home」に移動する

$ sudo grep kvm-debian12.qcow2 /etc/libvirt/qemu/kvm-debian12.xml
      <source file='/var/lib/libvirt/images/kvm-debian12.qcow2'/>

$ sudo ls -ld /var/lib/libvirt/images/
drwx--x--x 3 root root 4096 112 22:16 /var/lib/libvirt/images/

$ sudo mkdir /home/kvm/kvm-debian12

$ sudo ls -ld /home/kvm/kvm-debian12
drwxr-xr-x 2 root root 4096 112 23:45 /home/kvm/kvm-debian12

$ sudo mv /var/lib/libvirt/images/kvm-debian12.qcow2 /home/kvm/kvm-debian12/

$ sudo virsh edit kvm-debian12
ドメイン 'kvm-debian12' XML 設定が編集されました。

$ sudo grep kvm-debian12.qcow2 /etc/libvirt/qemu/kvm-debian12.xml
      <source file='/home/kvm/kvm-debian12/kvm-debian12.qcow2'/>

■そういえばもう一台の物理のCPUってIntelの8コアだった気が。。。

$  grep flags /proc/cpuinfo | awk '{for(a=1;a<=NF;a++){if($a ~ /vmx|svm/){print $a | "sort | uniq -c"}}}'
      8 vmx

■8コアに変更する
 ※仮想マシンは一度shutdownする

 debian stretchのKVMで仮想マシンのCPU、メモリ、NICの増設とディスクの拡張をしてみた。
 https://labunix.hateblo.jp/entry/20180502/1525262971

$ sudo virsh setvcpus kvm-debian12 8 --config --maximum
$ sudo virsh setvcpus kvm-debian12 8 --config
$ sudo virsh dumpxml kvm-debian12 | awk '/vcpu/'
  <vcpu placement='static'>8</vcpu>

$ sudo virsh dominfo kvm-debian12 | awk '/CPU/'
CPU:            8

$ virsh start kvm-debian12
$ virsh console kvm-debian12
$ grep flags /proc/cpuinfo | awk '{for(a=1;a<=NF;a++){if($a ~ /vmx|svm/){print $a | "sort | uniq -c"}}}'down -h now'
      8 svm

■ホストが起動したときに自動起動するように設定

$ sudo virsh autostart kvm-debian12
ドメイン 'kvm-debian12' は自動起動としてマークされています

■自動起動を解除するには。。。

$ sudo virsh autostart --disable  kvm-debian12
ドメイン 'kvm-debian12' の自動起動マークが解除されました