KVM虚拟化教程

环境检查

检查kvm环境

1
2
3
egrep -c '(vmx|svm)' /proc/cpuinfo # 检测CPU是否支持虚拟化,若大于0则支持
sudo apt install -y cpu-checker # 安装cpu-checker软件包检查kvm环境
kvm-ok # 运行kvm-ok命令检查,输出KVM acceleration can be used即为可用

软件包安装

ARCH系

1
2
sudo pacman -S qemu libvirt ovmf virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat
sudo pacman -S ebtables iptables
  • kvm 负责CPU和内存的虚拟化
  • qemu 向Guest OS模拟硬件(例如,CPU,网卡,磁盘,等)
  • ovmf 为虚拟机启用UEFI支持
  • libvirt 提供管理虚拟机和其它虚拟化功能的工具和API
  • virt-manager 是管理虚拟机的GUI
    安装libguestfs
    1
    paru -S libguestfs

Debian系

1
2
3
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils libguestfs-tools virt-viewer virt-manager virtinst
sudo apt install python3-libvirt
  • qemu-kvm:即qemu+kvm,kvm负责cpu和内存的虚拟化,而qemu负责IO设备,如网卡和磁盘等的虚拟化。
  • libvirt-daemon-system:KVM管理工具,为不同的虚拟机监视器提供了统一的接口。
  • libvirt-clients: 包含了一组用于与 libvirt 库交互的命令行工具,包括virsh、virt-install,virt-clone
    • virsh: 用于虚拟机的创建,启动,停止,迁移,克隆,配置文件管理等操作。
    • virt-install:用于GuestOS安装
    • virt-clone:用于虚拟机克隆
  • bridge-utils:配置网桥
  • libguestfs-tools:虚拟机镜像管理工具,包括virt-cat、virt-edit、virt-ls、virt-rescue
  • virt-viewer:用于虚拟机控制台
  • virt-manager:图形界面管理KVM虚拟化
  • virtinst: 命令行工具,包括virt-install、virt-clone、virt-manager等。
  • python3-libvirt:libvirt库的Python 绑定,在Python中使用 libvirt 的功能,包括对虚拟机、存储池、网络等资源的管理,以及对虚拟化宿主机的监控和控制。

启动libvirt服务

1
2
3
sudo systemctl start libvirtd.service
sudo systemctl enable libvirtd.service
sudo systemctl status libvirtd.service

检查kvm模块

1
2
3
$ lsmod  | grep kvm
kvm_intel 372736 5
kvm 1032192 1 kvm_intel

添加当前用户到 kvm和libvirt 组(可选)

修改组后,需要重新登录或注销再登录才能使更改生效。

方法一

1
2
3
4
sudo usermod -aG kvm $USER
sudo usermod -aG libvirt $(whoami)
id $(whoami) # 验证用户是否加入组中
uid=1001(gycx) gid=1001(gycx) groups=1001(gycx),108(kvm),138(libvirt)

方法二

1
sudo vim /etc/libvirt/libvirtd.conf

将UNIX域套接字组所有权设置为libvirt(第85行):

1
unix_sock_group = "libvirt"

设置R/W套接字的UNIX套接字权限(第102行):

1
unix_sock_rw_perms = "0770"  

将你的用户帐户添加到libvirt组:

1
2
sudo usermod -a -G libvirt $(whoami)  
newgrp libvirt

重启libvirt守护进程:

1
sudo systemctl restart libvirtd.service

启用嵌套虚拟化(可选)

  • 嵌套虚拟化功能使你可以在VM中运行虚拟机,通过启用内核模块为kvm_intel启用嵌套虚拟化:
    1
    2
    sudo modprobe -r kvm_intel 
    sudo modprobe kvm_intel nested=1
    要使此配置持久,请运行:
    1
    echo "options kvm-intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf 
    确认嵌套虚拟化设置为是:
    1
    2
    3
    4
    5
    systool -m kvm_intel -v | grep nested 
    nested = "Y"
    nested_early_check = "N"
    cat /sys/module/kvm_intel/parameters/nested
    Y

创建网桥(br0),配置同一网段

为实现从本机外访问该虚拟机必须将虚拟机的网卡映射至网桥。virbr0 网桥是 KVM 安装完成后自动创建的,仅做测试用途。

1
2
3
brctl show # 显示网桥信息
bridge name bridge id STP enabled interfaces
virbr0 8000.525400a882e2 yes virbr0-nic

通过如下内容在 /etc/netplan 目录下创建文件 01-netcfg.yaml 来新建网桥:
输入ifconfig确认当前网口设备、ip地址和mac地址,本案例中设备为eno2,ip地址填入addresses中,mac地址填入macaddress中
输入ip route得到默认via和metric,填入routes的via和metric中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
network:
ethernets:
eno2:
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces: [eno2]
dhcp4: false
addresses: [192.168.100.123/24]
macaddress: 7c:c2:55:4d:e1:e9
routes:
- to: default
via: 192.168.100.1
metric: 101
nameservers:
addresses: [223.5.5.5]
parameters:
stp: false
dhcp6: false
version: 2

应用网络配置

1
2
sudo netplan apply
ip add show

创建虚拟机(二选一)

  1. 图形化创建虚拟机
    运行virt-manager,启动图形化界面进行kvm虚拟机安装
    add connection——local install media——choose iso or CDROM install media——选择要安装的iso镜像点击choose volume——Forward——设置CPU和Memory点击Forward——点击enable storage for this virtual machine并点击create a disk image for the virtual machine选择硬盘大小点击Forward——选择网桥为br0点击Finish

  2. 终端创建虚拟机
    创建4c8g200G的虚拟机,磁盘为稀疏模式,格式为qcow2,总线类型为virtio。同启动一个串行终端打印输出

    1
    virt-install  --virt-type=kvm --name=win10   --vcpus=4  --memory=8192 --osinfo=win10 --cdrom=/var/lib/libvirt/images/win10.iso  --disk path=/var/lib/libvirt/images/win10.qcow2,size=200,format=qcow2,bus=virtio,sparse --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --force