于2022年6月12日重新编辑。
本文测试环境:优麒麟22.04
KVM: Kernel-based Virtual Machine,基于内核(内核内建)的虚拟机,需要芯片支持并开启虚拟化技术(英特尔的 VT 扩展或者 AMD 的 AMD-V 扩展)。KVM 内核模块本身只能提供 CPU 和内存的虚拟化,必须结合 QEMU 才能构成一个完整的虚拟化技术。
QEMU: 是一个通用的开源机器模拟器和虚拟器,由 Fabrice Bellard 编写,是一个完整的可以单独运行的开源软件。它可以独立模拟出整台计算机,包括 CPU,内存,IO 设备,因此也可以在没有 KVM 模块的情况下独立运行,只是性能比较低。而 QEMU+KVM 则可以通过 KVM 模块提供的虚拟化技术,从而提高 CPU 和内存的性能,并为计算机模拟提供加速功能。
$ LC_ALL=C lscpu | grep Virtualization
Virtualization: VT-x
或者:
$ grep -Eoc '(vmx|svm)' /proc/cpuinfo #或者 egrep -c '(vmx|svm)' /proc/cpuinfo
16
如果输出一个大于零的数字(即CPU核心数),表示CPU支持硬件虚拟化;输出0,表示CPU不支持硬件虚拟化,尝试重启进入BIOS设置中启用VT技术。
$ kvm-ok #如果提示无此命令,通过sudo apt install cpu-checker 来安装
INFO: /dev/kvm exists
KVM acceleration can be used
通常,需要安装 qemu
模拟软件,qemu 实用程序 qemu-utils
,qemu-kvm
模块。
sudo apt install qemu qemu-utils qemu-kvm
注意:新的 qemu 版本已经集成了 qemu-kvm 模块。
libvirt-daemon-system
包来将libvirt守护程序作为系统服务运行的配置文件。libvirt-daemon-system
时会自动安装此包。virt-manager
时会自动安装此包。sudo apt install libvirt-daemon-system virt-manager
ovmf:虚拟机的UEFI 固件,安装后方可是虚拟机系统从uefi启动。
sudo apt install ovmf
bridge-utils :用于配置以太网桥的命令行工具。
sudo apt install bridge-utils
客户机安装完成后,需要为其设置网络接口,以便和主机网络,客户机之间的网络通信。而linux系统安装时就需要使用网络通信,因此得提前设置客户机的网络连接。
KVM 客户机网络连接有两种方式:
终端输入sudo virt-manager
或者在开始菜单点击"虚拟系统管理器",打开virt-manager图形界面。
点击"编辑"-“连接详情”,进入网络配置界面,并选择虚拟网络,这里默认有一个default的NAT网络连接,设备名为virbr0,网段为192.168.122.0/24。
可以点击下方的加号来创建一个新的网络连接,这里我们创建一个名为network的网络连接,forward to 选择"任意物理设备"(将创建一个网卡设备virbr1),网段为192.168.100.0/24,设置好DHCP,点击完成即可配置成功。下一步在虚拟机安装过程中可以设置为这个网络连接方式。
$ virsh net-list --all #查看网络连接列表
Name State Autostart Persistent
--------------------------------------------
default active yes yes
network active yes yes
如果我们需要修改default网络连接的配置,可以使用如下命令
$ sudo vim /etc/libvirt/qemu/networks/default.xml #不知道在哪的话用sudo find / -name default.xml来查找
这里一般需要用到brctl网桥配置命令,而brctl网桥配置命令需安装bridge-utils软件包。
$ sudo apt install bridge-utils
语法:brctl [命令选项]
命令选项:
addbr add bridge
delbr delete bridge
addif add interface to bridge
delif delete interface from bridge
hairpin {on|off} turn hairpin on/off
setageing
配置语句:
$ sudo brctl addbr virbr2 #创建virbr2网桥
$ sudo brctl addif virbr2 enp2s0 #将网络接口(物理网卡)绑定到virbr2网桥
$ sudo ifconfig enp2s0 0.0.0.0 #物理网卡作为网桥的端口,运行于混杂模式,且工作于链路层,顾不需IP。
$ sudo ifconfig virbr2 192.168.0.1 [netmask 255.255.255.0] #给网桥设置网络,子网掩码默认可不设置
$ sudo ifconfig virbr2 up #启动网桥,也可以在上一句设置网络的后面加上up选项来合并执行
虚拟机安装可以通过virt-manager图形化工具安装,也可通过qemu-img命令来安装。
终端输入sudo virt-manager
或者在开始菜单点击"虚拟系统管理器",打开virt-manager图形界面。
3) 输入虚拟机内存,cpu核心数(不能大于主机核心数),点击前进
4) 选择磁盘镜像(虚拟机安装也要有虚拟的磁盘吧),这里我们创建一个40G的磁盘,点击前进
注意:这里默认的磁盘镜像路径是/var/lib/libirt/images/*.qcow2, 而如果我们需要使用一个已经创建好的磁盘镜像或者需要自定义磁盘镜像的存储位置,则可以选择“选择或创建自定义存储”
如果不懂如何选择网络,可能要补习一下虚拟机网络的几种模式(NAT,网桥,only_host)的知识了。
若提示“连接到图形控制台出错:Error opening Spice console, SpiceClientGtk missing”的错误,可试着通过如下命令解决:
hollowman@hollowman-F117:~$ apt search SpiceClientGtk
正在排序... 完成
全文搜索... 完成
gir1.2-spiceclientgtk-3.0/focal 0.37-2fakesync1 amd64
GTK3 widget for SPICE clients (GObject-Introspection)
hollowman@hollowman-F117:~$ sudo apt install gir1.2-spiceclientgtk-3.0
1) 创建虚拟机磁盘镜像
$ qemu-img create -f qcow2 diskname.qcow2 40G
$ ll -h diskname.qcow2 #查看镜像在主机系统上的大小,虽然有40G磁盘,但因为没有数据,实际只占用196K
-rwxrwxrwx 1 hollowman hollowman 196K 11月 24 13:30 diskname.qcow2*
2) 安装虚拟机(virt-install命令)
a. 从ISO镜像中创建虚拟机:
# virt-install --name 客户机实例名 --memory 内存大小 --vcpus cpu核心数 --disk path=磁盘镜像路径 --cdrom=安装介质路径 --network 网络接口 --cdrom=安装介质路径
#例如:
$ virt-install --name rhel8 --memory 2048 --vcpus 2 --disk path=./rhel8.qcow2 --cdrom=/media/hollowman/软件/ISO/rhel-8.0-x86_64-linuxprobe.com.iso --network bridge=virbr1
b. 用已有的qcow磁盘镜像创建虚拟机
# virt-install --name 客户机实例名 --memory 内存大小 --vcpus cpu核心数 --disk path=磁盘镜像路径 --network 网络接口 --import
# 例如:
sudo virt-install --name openEuler2109 --memory 2048 --vcpus 2 --disk path=./openEuler-21.09-x86_64.qcow2 --network bridge=virbr1 --import
virt-install有关选项说明可通过命令查看:
$ virt-install help #下面为部分摘抄
通用选项:
-n NAME, --name NAME 客户机实例名称
--memory MEMORY 客户机内存大小. 例如:--memory 1024 (in MiB)
--vcpus VCPUS 客户机cpu核心数(不大于主机核心数). 如:--vcpus 5
安装方法选项:
--cdrom CDROM 光驱安装介质
--import 在已有的磁盘镜像中构建客户机
OS options:
--os-variant OS_VARIANT 指定操作系统类型。例如:rhl8.0 ,可通过'osinfo-query'命令来查看所有操作系统类型
设备选项:
--disk DISK 指定存储的各种选项。例如:--disk size=10 (在默认位置创建 10GiB 镜像)
-w NETWORK, --network NETWORK 配置客户机网络接口。例如:--network bridge=mybr0
如果通过virt-manager图形化界面来创建一个40G的磁盘镜像时,发现在主机上的存储空间却是40G,这么大的占用空间,是不是有强迫症?我们可以通过命令压缩来进行处理。
如下,我们查看virt-manager创建的磁盘镜像信息:
$ qemu-img info rhel8.qcow2 #查看磁盘镜像信息
image: rhel8.qcow2
file format: qcow2
virtual size: 40 GiB (42949672960 bytes) #虚拟磁盘大小
disk size: 196 KiB #此为镜像实际占用空间
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
$ ll -h rhel8.qcow2 #查看镜像在主机系统上的存储空间(这是通过virt-manager创建的磁盘)
-rwxrwxrwx 1 hollowman hollowman 40G 11月 24 13:48 rhel8.qcow2*
输入压缩命令:
$ qemu-img convert -O qcow2 rhel8.qcow2 rhel8_new.qcow2
$ ll -h rhel8_new.qcow2
-rwxrwxrwx 1 hollowman hollowman 196K 11月 24 13:52 rhel8_new.qcow2*
可以发现,存储空间变回196K了。
qcow2本质上是一个虚拟的磁盘镜像,因此可在主机系统中通过挂载磁盘镜像分区的方式来读取该磁盘镜像分区的内容(如果是虚拟机磁盘,则需要在关闭虚拟机的情况下操作)。为减少篇幅,将挂载qcow2磁盘镜像单独创建了一篇文章,想要了解的点击ubuntu2004挂载qcow2磁盘镜像阅读。
查看并修改配置文件/etc/libvirt/qemu.conf
,找到 # user = "root"
这一行并将注释去掉,重启libvirtd服务
$ sudo vim /etc/libvirt/qemu.conf #修改下面这一行
user = "root"
$ systemctl restart libvirtd
sudo apt install spice-client-gtk gir1.2-spiceclientgtk-3.0