KVM虚拟化解决方案系列之KVM部署篇(3-4)

我们在《KVM虚拟化解决方案系列之KVM架构篇》有讲到,KVM模块作为整个虚拟化环境的核心工作在内核空间,负责CPU和内存的调度。QEMU作为模拟器工作在用户空间,负责虚拟机I/O模拟,KVM虚拟机的创建和运行是一个内核态KVM模块和用户态QEMU程序相互配合的过程。这实际上就说明了,KVM虚拟化环境需要包括内核态KVM模块和用户态QEMU程序,理解这一点很重要,因为它是整个KVM虚拟化的基础。

KVM虚拟化=内核态KVM模块+用户态QEMU程序

宿主机操作系统搭建好了之后,这一章节才真正进入到KVM虚拟化环境部署,接下来我打算这么搞,我打算用一个表格来简要介绍在CentOS系统和Ubuntu系统下搭建KVM环境所需的软件、工具以及步骤,然后再展开搭建介绍,如图1所示。

在这里插入图片描述

图1. KVM虚拟化环境搭建

根据图1可以了解到,不管是CentOS系统还是Ubuntu系统,搭建KVM虚拟化环境都有两种方式,下面我就图1的内容做一个简单的收敛。

在CentOS系统

在方式1中,KVM虚拟化是一个kvm内核模块和一个qemu-kvm用户程序(qemu-kvm是修改过的QEMU)的组合,其中qemu-kvm是没有qemu-system-x86_64工具的,也就是说如果采用方式1搭建KVM虚拟化,只有qemu-img这个创建虚拟机磁盘的工具,还缺少创建虚拟机的工具。还需要安装基于libvirt套件的virt-install工具去创建虚拟机。有关libvirt套件内容会在后续章节介绍,这里不赘述。

在方式2中,KVM虚拟化是一个kvm内核模块和一个Qemu虚拟软件的组合。其中Qemu虚拟软件自带了qemu-img和qemu-system-x86_64工具。但是问题又来了,Qemu是独立于KVM的虚拟化软件,并不属于KVM的一部分,所以直接使用Qemu自带的qemu-system-x86_64去创建虚拟机会导致效率特别低,因为Qemu就是一个纯软件的虚拟化技术。不过这没关系,在技术层面这个问题已经被解决,在2012年以前,qemu-kvm是专门用于KVM的QEMU分支,在2012年的时候,这个分支并入了主流的QEMU了,从此之后要实现KVM虚拟化可以不需要特殊的qemu-kvm(你也可以继续使用,现在的CentOS就在用着),而只需要在通用的QEMU命令上增加“-enable-kvm”选项就等于是使用KVM功能了,是KVM驱动虚拟机了,也就是QEMU可以调用KVM内核了,这样效率就比Qemu高了,命令行如下所列.

[root@kvm01 ~]# qemu-system-x86_64 -enable-kvm -m 6G /root/lisq.img    # 选择KVM加速

在Ubuntu系统

在方式1中,KVM虚拟化是一个kvm内核模块和一个qemu-kvm用户程序(qemu-kvm是修改过的QEMU)的组合,其中qemu-kvm自带qemu-im和qemu-system-x86_64工具的,可以直接采用方式1搭建KVM虚拟化环境。注意,在qemu-kvm中,qemu-system-x86_64工具仍然需要添加“-enable-kvm”选项才能使用KVM驱动虚拟机。

在方式2中,这部分内容参考CentOS系统的方式2内容,方式1和方式2没有区别,qemu-system-x86_64工具都需要增加“-enable-kvm”选项,才能使用KMV驱动虚拟机。

3. KVM安装

从Linux 2.6.20版本开始,KVM被完全正式收录到Linux内核中,KVM作为Linux内核中的一个模块而存在,因此只要使用了Linux 2.6.20版本或高于Linux 2.6.20版本的Linux,在安装系统的时候,就已经加载了KVM模块,因此我们只需要在CLI命令行模式下启用KVM模块即可。

3.1. 在CentOS上安装KVM

第一步,查看是否加载了KVM模块

默认情况下,CentOS 7系统加载了KVM模块,可通过命令“lsmod | grep kvm”查看是否加载了KVM模块,如果已加载则无需启动KVM模块。如果没有加载则需要执行第二步。

[root@kvm01 ~]# lsmod | grep kvm               # 默认情况下,已经加载了KVM模块
kvm_intel             188740  0 
kvm                   637515  1 kvm_intel
irqbypass              13503  1 kvm

第二步,启用KVM模块

[root@kvm01 ~]# modprobe kvm                    # 加载kvm模块
[root@kvm01 ~]# modprobe kvm-intel              # 如果是AMD加载,加载kvm-amd
[root@kvm01 ~]# lsmod | grep kvm
kvm_intel             188740  0 
kvm                   637515  1 kvm_intel
irqbypass              13503  1 kvm

第三步,KVM加载成功,会创建/dev/kvm设备接口

[root@kvm01 ~]# ll /dev/kvm 
crw-rw-rw-+ 1 root kvm 10, 232 1018 10:51 /dev/kvm

3.2. 在Ubuntu上安装KVM

第一步,查看是否加载了KVM模块

默认情况下,Ubuntu系统也加载了KVM模块,可通过命令“lsmod | grep kvm”查看是否加载了KVM模块,如果已加载则无需启动KVM模块。如果没有加载则需要执行第二步。

root@kvm02:~# lsmod | grep kvm                      # 默认情况下,已经加载了KVM模块
kvm_intel             294912  0
kvm                   823296  1 kvm_intel

第二步,启用KVM模块

root@kvm02:~# modprobe kvm                             # 加载kvm模块
root@kvm02:~# modprobe kvm-intel                       # 如果是AMD加载,加载kvm-amd
root@kvm02:~# lsmod | grep kvm
kvm_intel             294912  0
kvm                   823296  1 kvm_intel

第三步,KVM加载成功,会创建/dev/kvm设备接口

root@kvm02:~# ls -l /dev/kvm 
crw-rw----+ 1 root kvm 10, 232 1018 11:32 /dev/kvm

4. QEMU安装

4.1. 在CentOS上安装QEMU

为了获得qemu-system-x86_64,采用方式2实现KVM虚拟化,QEMU采用源码安装方式。注意,在CentOS下,QEMU纯软件无法采用YUM安装,只能采用源码方式安装。采用源码方式安装会遇到很多坑,不同的qemu版本、不同的CentOS版本的坑各有不同,谁试谁知道。

第一步,QEMU源码下载

[root@kvm01 ~]# yum install qemu -y      # 使用yum方式安装发现没有rpm包,使用源码安装方式
[root@kvm01 ~]# wget https://download.qemu.org/qemu-4.0.0.tar.bz2        #下载源代码
[root@kvm01 ~]# tar xjvf qemu-4.0.0.tar.bz2                       #解压源代码

第二步,安装编译工具

这些编译工具将由qemu版本、CentOS版本共同决定,不同版本安装编译工具不同,可以使用检查命令“./configue”进行检查,缺什么编译工具就安装。但愿你的版本环境下所缺的工具都可以使用yum安装,否则你会采很多很多坑。

[root@kvm01 ~]# yum -y install gcc
[root@kvm01 ~]# yum -y install glib2-devel
[root@kvm01 ~]# yum -y install zlib-devel
[root@kvm01 ~]# yum -y install pixman-devel

第三步,检查依赖关系

[root@kvm01 ~]# cd qemu-4.0.0/
[root@kvm01 qemu-4.0.0]#./configure             # 检查当前的环境是否满足要安装软件的依赖关系

满足安装qemu-4.0.0软件的依赖关系之后显示如下所列内容:

[root@kvm01 qemu-4.0.0]# ./configure 
No C++ compiler available; disabling C++ specific optional code
Install prefix    /usr/local
BIOS directory    /usr/local/share/qemu
firmware path     /usr/local/share/qemu-firmware
binary directory  /usr/local/bin
library directory /usr/local/lib
module directory  /usr/local/lib/qemu
libexec directory /usr/local/libexec
include directory /usr/local/include
config directory  /usr/local/etc
local state directory   /usr/local/var
Manual directory  /usr/local/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /root/qemu-4.0.0
GIT binary        git
GIT submodules    
C compiler        cc
Host C compiler   cc
C++ compiler      
Objective-C compiler cc
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/include/pixman-1   -I$(SRC_PATH)/dtc/libfdt   -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include   -fPIE -DPIE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -std=gnu99  -Wendif-labels -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -Wno-missing-braces -I$(SRC_PATH)/capstone/include
LDFLAGS           -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g 
QEMU_LDFLAGS      -L$(BUILD_DIR)/dtc/libfdt 
make              make
install           install
python            python -B (2.7.5)
slirp support     internal 
smbd              /usr/sbin/smbd
module support    no
host CPU          x86_64
host big endian   no
target list       aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu hppa-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblazeel-softmmu microblaze-softmmu mips64el-softmmu mips64-softmmu mipsel-softmmu mips-softmmu moxie-softmmu nios2-softmmu or1k-softmmu ppc64-softmmu ppc-softmmu riscv32-softmmu riscv64-softmmu s390x-softmmu sh4eb-softmmu sh4-softmmu sparc64-softmmu sparc-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensaeb-softmmu xtensa-softmmu aarch64_be-linux-user aarch64-linux-user alpha-linux-user armeb-linux-user arm-linux-user cris-linux-user hppa-linux-user i386-linux-user m68k-linux-user microblazeel-linux-user microblaze-linux-user mips64el-linux-user mips64-linux-user mipsel-linux-user mips-linux-user mipsn32el-linux-user mipsn32-linux-user nios2-linux-user or1k-linux-user ppc64abi32-linux-user ppc64le-linux-user ppc64-linux-user ppc-linux-user riscv32-linux-user riscv64-linux-user s390x-linux-user sh4eb-linux-user sh4-linux-user sparc32plus-linux-user sparc64-linux-user sparc-linux-user tilegx-linux-user x86_64-linux-user xtensaeb-linux-user xtensa-linux-user
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
SDL support       no 
SDL image support no
GTK support       no 
GTK GL support    no
VTE support       no 
TLS priority      NORMAL
GNUTLS support    no
libgcrypt         no
nettle            no 
libtasn1          no
PAM               no
iconv support     yes
curses support    no
virgl support     no 
curl support      no
mingw32 support   no
Audio drivers      oss
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    no
Multipath support no
VNC support       yes
VNC SASL support  no
VNC JPEG support  no
VNC PNG support   no
xen support       no
brlapi support    no
bluez  support    no
Documentation     no
PIE               yes
vde support       no
netmap support    no
Linux AIO support no
ATTR/XATTR support yes
Install blobs     yes
KVM support       yes
HAX support       no
HVF support       no
WHPX support      no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
malloc trim support yes
RDMA support      no
PVRDMA support    no
fdt support       git
membarrier        no
preadv support    yes
fdatasync         yes
madvise           yes
posix_madvise     yes
posix_memalign    yes
libcap-ng support no
vhost-net support yes
vhost-crypto support yes
vhost-scsi support yes
vhost-vsock support yes
vhost-user support yes
Trace backends    log
spice support     no 
rbd support       no
xfsctl support    no
smartcard support no
libusb            no
usb net redir     no
OpenGL support    no
OpenGL dmabufs    no
libiscsi support  no
libnfs support    no
build guest agent yes
QGA VSS support   no
QGA w32 disk info no
QGA MSI support   no
seccomp support   no
coroutine backend ucontext
coroutine pool    yes
debug stack usage no
mutex debugging   no
crypto afalg      no
GlusterFS support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   no
TPM passthrough   
TPM emulator      
QOM debugging     yes
Live block migration yes
lzo support       no
snappy support    no
bzip2 support     no
lzfse support     no
NUMA host support no
libxml2           no
tcmalloc support  no
jemalloc support  no
avx2 optimization yes
replication support yes
VxHS block device no
bochs support     yes
cloop support     yes
dmg support       yes
qcow v1 support   yes
vdi support       yes
vvfat support     yes
qed support       yes
parallels support yes
sheepdog support  yes
capstone          internal
docker            no
libpmem support   no
libudev           no
default devices   yes

NOTE: cross-compilers enabled:  'cc' 'cc'

第四步,编译源码

[root@kvm01 qemu-4.0.0]# make                      # 要点时间,慢慢等

第五步,安装源码

[root@kvm01 qemu-4.0.0]# make install

安装结束之后,由于QEMU是用户空间的程序,安装之后不需要重启系统,就可以直接使用qemu-mig和qemu-system-x86_64。

4.2. 在Ubuntu上安装QEMU

根据图1可以知道,在Ubuntu系统上,采用YUM方式安装qemu-kvm即可获得qemu-img和qemu-system-x86_64,十分方便,本篇就采用这种安装方式。当然了,你也可以采用YUM方式直接安装qemu套件来获得qemu-img和qemu-system-x86_64,不建议采用源码方式安装qemu套件。

第一步,YUM安装qemu-kvm组件

root@kvm02:~# apt-get install qemu-kvm                       # 安装qemu-kvm组件

安装结束之后,由于QEMU是用户空间的程序,安装之后不需要重启系统,就可以直接使用qemu-mig和qemu-system-x86_64。注意,这里的qemu-system-x86_64工具虽然由qemu-kvm自带,使用该命令仍然需要添加“-enable-kvm”选项才能使KVM驱动虚拟机。

至此,CentOS和Ubuntu操作系统的KVM部署完成,接下来我们使用QEMU的qemu-img和qemu-system-x86_64这两个工具来创建虚拟机。

5. 安装虚拟机

在这里,我们使用qemu-img和qemu-system-x86_64这两个工具来创建、启动虚拟机,但是这两个工具后面还需要写很长一串参数,这样十分不友好,而且qemu-system-x86_64这个工具的效率十分低下,所以大部分人会采用其他工具来管理虚拟机,比如基于libvirt的virt-install工具等,有关libvirt等工具会在后续章节介绍。

在安装虚拟机之前,我们需要创建一个镜像文件或者磁盘分区,来存储虚拟机中的系统和文件,这就使用到了qemu-img工具。

5.1. 在CentOS上安装虚拟机

第一步,创建虚机镜像文件

使用命令“qemu-img”创建一个空白的虚拟机镜像,格式为raw,镜像名称为lisq.img,镜像大小为20G,如下所示:

[root@kvm01 ~]# qemu-img create -f raw lisq.img 20G
Formatting 'lisq.img', fmt=raw size=21474836480

-f选项用于指定镜像的格式,有raw和qcow2两种格式,甚至是VMware的vmdk、vdi、vhd等格式。qcow2格式是Qemu最常用的镜像格式,qcow2采用来写时复制技术来优化性能,这里我使用raw格式。lisq.img是镜像文件的名字,20G是镜像文件大小。

使用命令“ls”来查看一下lisq.img镜像的信息,如下所示:

[root@kvm01 ~]# ls -lh lisq.img             # 分配了20G空间
-rw-r--r--. 1 root root 20G 1019 14:51 lisq.img

使用命令“du -h”来查看lisq.img镜像的使用空间,如下所示:

[root@kvm01 ~]# du -h lisq.img           # 虽然分配了20G空间,但是当前还没有使用
0	lisq.img

第二步,上传操作系统

在本地电脑上安装WinSCP工具,WinSCP使用22端口上传,所以需要确保宿主机kvm01的SSH服务远程已打开,如图2所示。

在这里插入图片描述

图2. 使用WinSCP登录宿主机kvm01

登录成功之后,会显示如图3界面。其中界面左窗口是本地电脑的窗口,右窗口是宿主机kvm01的窗口。

在这里插入图片描述

图3. 成功登录宿主机kvm01

在左侧本地电脑窗口中,选择一个操作系统镜像,直接拉到右侧宿主机kvm01窗口中,上传操作系统镜像到宿主机kvm01,如图4所示。

在这里插入图片描述

图4. 上传操作系统ISO

上传完成之后,我们会看到右侧宿主机kvm01窗口显示上传的操作系统ISO,也可以通过“ls”查看,如下所示:

[root@kvm01 ~]# ll
总用量 3073856
-rw-------.   1 root root        1601 1015 17:56 anaconda-ks.cfg
-rw-r--r--.   1 root root        1649 1015 18:02 initial-setup-ks.cfg
-rw-r--r--.   1 root root 21474836480 1019 14:51 lisq.img
drwxr-xr-x. 113 lisq lisq       12288 1019 13:43 qemu-4.0.0
-rw-r--r--.   1 root root    75668251 424 2019 qemu-4.0.0.tar.bz2
-rw-r--r--.   1 root root  3071934464 98 09:38 ubuntu-20.04.3-desktop-amd64.iso

第三步,创建虚拟机

使用命令“qemu-system-x86_64”创建虚拟机,并安装刚才上传的操作系统ISO,如下所示:

[root@kvm01 ~]# qemu-system-x86_64 -enable-kvm -m 6G -smp 4 -boot once=d -cdrom ubuntu-20.04.3-desktop-amd64.iso lisq.img           # -enable-kvm是选择kvm模块,加速虚拟化效率 
WARNING: Image format was not specified for 'lisq.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
VNC server running on ::1:5900

-m 指定虚拟机内存大小,默认单位是 MB, -enable-kvm 使用 KVM 进行加速,-smp 4是指定虚拟机为对称多处理器结构并分配4个vCPU,-boot once=d是指定系统的启动顺序为首次光驱,以后再使用默认启动项(硬盘),-cdrom是分配虚拟机光驱。友情提示,虚拟机内存分配少于6G会很难受,6G是底线,否则这种基于VMware虚拟机模拟宿主机kvm01的实验就没法做下去了。

根据输出的信息,默认情况下,QEMU会启动一个VNC server端口(5900),可以使用vncviwer工具来连接到QEMU的VNC端口查看虚拟机。也就是说宿主机kvm01需要安装vncserver和vncviewer工具的软件包。

由于我们已经使用qemu-system-x86_64命令启动了虚拟机,要保持启动现状,就不能断,所以我们可以另外再启用一个Xshell登录界面来安装tigervnc-server和tigervnc这两个RPM软件包,如下所示:

[root@kvm01 ~]# yum install tigervnc-server
[root@kvm01 ~]# yum install tigervnc

第四步,连接到QEMU启动窗口

启动时提示,这里可以使用“vncviewer :5900”命令连接到QEMU启动的窗口。
本地连接方式:

在宿主机kvm01桌面上打开终端,使用“vncviewer :5900”命令连接到QEMU启动的窗口,如图5所示。

在这里插入图片描述

图5. 本地方式连接QEMU窗口

远程的方式:

如果你不想使用宿主机本地方式连接到QEMU窗口,而是想使用本地电脑远程连接到QEMU窗口,你可以这么操作,另外打开一个Xshell界面登录kmv01宿主机,通过使用命令“vncviewer :5900”连接到QEMU启动的窗口,如下所示。

[root@kvm01 ~]# vncviewer :5900

这个时候弹出如下对话框,告诉你要使用这种方式还需要安装Xmanager软件,点击“是”按钮,然后到Xmanager官网上根据法律要求下载试用版软件,如图6所示。

在这里插入图片描述

图6. 安装Xmanager软件

Xmanager试用版软件在本地电脑上安装,安装完成之后,就可以远程登录了,这里就不演示了。

注意,当你使用VMware虚拟机去模拟宿主机kvm的时候,不建议你采用远程方式去连接QEMU,效率极其低下。

第五步,安装操作系统

连接到QEMU窗口之后,虚拟机开始启动安装操作系统,如图7所示。

在这里插入图片描述

图7. 虚拟机启动安装系统

QEMU的虚拟机效率是在太低了,即便在qemu-system-x86_64工具增加“-enable-kvm”选项,即便虚拟机分配了6G内存,效率依然低下。按Crtl+C取消安装检测,加快安装速度,如图8所示。

在这里插入图片描述

图8. 取消安装检测

正在安装虚拟机操作系统,如图9所示。中间的安装过程省略,整个安装过程效率十分低下,差不多要三个半钟头。

在这里插入图片描述

图9. 系统安装过程

安装过程十分漫长,即便在qemu-system-x86_64工具增加“-enable-kvm”选项,即便虚拟机也分配了6G的内存了,磁盘也足够大,给我的感觉就是这个QEMU可能没有使用KVM硬件加速,导致效率十分低下,一套完整操作系统安装下来,没三四个钟头搞不定。为了验证这个想法,在QEMU窗口上,按组合键“Ctrl+Alt+2”切换到QEMU监视器窗口,执行“info kvm”命令来查看当前QEMU是否使用KVM,如图10所示。

在这里插入图片描述

图10. QEMU在使用KVM

结果显示kvm已经开启了,并且QEMU正在使用KVM,显示为“kvm support:enable”,因为我们在执行命令中接入了-enable-kvm了。那只能说明使用qemu-system管理工具的效率非常低下,只能说明这个问题了。另外也说明一个问题,我使用的是虚拟机环境演示宿主机,虚拟机嵌套虚拟机,效率更加低。所以有条件的小伙伴们最好使用物理宿主机来搭建环境。

第六步,重启虚拟机系统

在系统安装完成之后,需要重启虚拟机以使用新安装的系统,如图11所示。

在这里插入图片描述

图11. 重启虚拟机

和普通的Linux系统安装一样,安装完成之后,重启系统即可进入刚才安装的虚拟机操作系统,如图12所示,要求移除安装介质之后,按回车键就可以从硬盘里边启动操作系统。

在这里插入图片描述

图12. 需要删除安装介质才能启动

我们回到kvm01宿主机的Xshell界面,删除或者移除我们上传的操作系统,如下所示。

[root@kvm01 ~]# rm -rf ubuntu-20.04.3-desktop-amd64.iso

然后返回图11界面,按回车键继续重启,可以看到系统从硬盘启动,如图13所示。之所以要求移除安装介质,是因为我在创建虚拟机的时候,选择了“-boot once=d”这个命令,如果不使用这个命令,会直接从硬盘中启动。

在这里插入图片描述

图13. 从硬盘启动

启动过程太慢了,虚拟机6G的内存,启动的时间差不多半小时,等到吐血,终于等等虚拟机操作系统启动成功了,如图14所示。

在这里插入图片描述

图14. 虚拟机启动成功

虚拟机启动成功之后,我们在登录虚拟机,登录成功,如图15所示。

在这里插入图片描述

图15. 虚拟机登录成功

第七步,启动虚拟机

在安装好了虚拟机系统之后,就可以使用镜像文件来启动登录到自己安装的系统之中了,可以通过如下命令去启动一个虚拟机,如下所示:

[root@kvm01 ~]# qemu-system-x86_64 -enable-kvm -m 6G -smp 4 /root/lisq.img
VNC server running on ::1:5900

在宿主机kvm01上使用命令“vncviwer :5900”连接到QEMU窗口查看虚拟机的启动情况。

猜你喜欢

转载自blog.csdn.net/jianghu0755/article/details/129774984