Setup Kvm

March 23, 2019

1. 安装必需的包

sudo pacman -Syu
sudo pacman -S qemu libvirt dmidecode bridge-utils openbsd-netcat ebtables dnsmasq

然后启动 libvirtd 服务

sudo systemctl enable --now libvirtd

2. 一个问题

network 'default' is not active

那么把他启动就行了

sudo virsh net-start default

自动启动

sudo virsh net-autostart default

可选的功能:

1. 使用 Virtio 进行半虚拟化(Para-virtualization with Virtio)

  • 检测核心是否支持 VIRTIO
zgrep VIRTIO /proc/config.gz

如果支持的话,所有的选项应该都为 y 或者 m, 就像这样:

CONFIG_BLK_MQ_VIRTIO=y
CONFIG_VIRTIO_VSOCKETS=m
CONFIG_VIRTIO_VSOCKETS_COMMON=m
CONFIG_NET_9P_VIRTIO=m
CONFIG_VIRTIO_BLK=m
# CONFIG_VIRTIO_BLK_SCSI is not set
CONFIG_SCSI_VIRTIO=m
CONFIG_VIRTIO_NET=m
CONFIG_CAIF_VIRTIO=m
CONFIG_VIRTIO_CONSOLE=m
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_DRM_VIRTIO_GPU=m
CONFIG_VIRTIO=m
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_BALLOON=m
CONFIG_VIRTIO_INPUT=m
CONFIG_VIRTIO_MMIO=m
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
CONFIG_RPMSG_VIRTIO=m
CONFIG_CRYPTO_DEV_VIRTIO=m
  • 检测核心模块 (kernel modules) 是否已加载
lsmod | grep virtio

如果没有输出任何东西的话,表示没有加载这个 virtio 这个模块

这样加载模块

modprobe virtio

自动加载,添加到 /etc/modules-load.d/<module>.conf, <module> 替换为模块的名字

例如:

/etc/modules-load.d/virtio.conf

virtio
virtio-net
virtio-blk
virtio-scsi
virtio-balloon

还有一个 virtio-serial 会这样

modprobe: FATAL: Module virtio_serial not found in directory /lib/modules/4.19.75-1-lts

2. 嵌套虚拟化(Nested virtualization)

检查 kvm_intel 是否支持 nested

systool -m kvm_intel -v | grep nested

如果输出 nested = "Y", 就是已经开启了,否则需要执行以下命令

echo "options kvm_intel nested=1" | sudo tee -a /etc/modprobe.d/kvm_intel.conf
sudo modprobe -r kvm_intel
sudo modprobe kvm_intel

3. 使用 huge pages 改善性能

看了下,最新版的 Arch 是会自动开启的,检查是否有/dev/hugepages 这个目录。如果没有的话,需要手动创建并:

  • 使 kvm 组拥有 /dev/hugepages 的权限

    (Now we need the right permissions to use this directory. The default permission is root's uid and gid with 0755, but we want anyone in the kvm group to have access to hugepages.)

    添加到你的 /etc/fstab

hugetlbfs       /dev/hugepages  hugetlbfs       mode=1770,gid=78        0 0

这个 gid 应该是 kvm 组 的 id, 但是我的机器上它是 992, 所以应该用这个?

hugetlbfs       /dev/hugepages  hugetlbfs       mode=1770,gid=992        0 0
  • 然后重新挂载 /dev/hugepages
sudo umount /dev/hugepages
sudo mount /dev/hugepages

4. 使用libvirt 的图形化管理工具 virt-manager

sudo pacman -S virt-manager

See also