KVM虚拟化:(三)KVM环境构建与虚拟机创建初探

admin 2022年08月15日 1,151次浏览

1、编译和安装KVM

1.1、下载KVM源代码

KVM 作为 Linux kernel 中的一个 module 而存在,是从 Linux 2.6.20 版本开始被完全正式加入内核的主干开发和正式发布代码中。所以,只需要下载 2.6.20 及以后版本 Linux kernel 代码即可编译和使用KVM

下载最新KVM源代码,主要有以下3种方式:

1.2、配置kvm

对 KVM 或 Linux 内核配置时常用的一些配置命令解释

  • make config: 基于文本的最为传统也是最为枯燥的一种配置方式,但是它可以适用于任何情况之下。这种方式会为每一个内核支持的特性向用户提问,如果用户回答 “y”,则把特性编译进内核;回答 “m”,则把特性作为模块进行编译;回答 “n”,则表示不对该特性提供支持;输入 “?” 则显示该选项的帮助信息,如果在配置过程中因为失误而给了错误的回答,就只能按 “Ctrl+c” 强行退出然后重新配置了
  • make oldconfig: make oldconfig 和 make config 类似,但是它的作用是在现有的内核设置文件基础上建立一个新的设置文件,只会向用户提供有关新内核特性的问题。在新内核升级的过程中,make oldconfig 非常有用,用户将现有的配置文件 .config 复制到新内核的源码中,执行 make oldconfig,此时,用户只需要回答那些针对新增特性的问题
  • make silentoldconfig: 和上面 make oldconfig 一样,只是额外悄悄地更新选项的依赖关系
  • make olddefconfig: 和上面 make silentoldconfig 一样,但不需要手动交互,而是对新选项以其默认值配置
  • make menuconfig: 基于终端的一种配置方式,提供了文本模式的图形用户界面,用户可以通过移动光标来浏览所支持的各种特性。使用这种配置方式时,系统中必须安装 ncurses 库,否则会显示 “Unable to find the ncurses libraries” 的错误提示
  • make xconfig: 基于 X Window 的一种配置方式,提供了漂亮的配置窗口,不过只能在 X Server 上运行 X 桌面应用程序时使用。它依赖于 QT,如果系统中没有安装 Q T库,则会出现 “Unable to find any QT installation” 的错误提示
  • make gconfig: 与 make xconfig 类似,不同的是 make gconfig 依赖于 GTK 库
  • make defconfig: 按照内核代码中提供的默认配置文件对内核进行配置(在 Intel x86-64 平台上,默认配置为 arch/x86/configs/x86_64_defconfig),生成 .config 文件可以用作初始化配置,然后再使用 make menuconfig 进行定制化配置。
  • make allyesconfig: 尽可能多地使用 “y” 输入设置内核选项值,生成的配置中包含了全部的内核特性
  • make allnoconfig: 除必需的选项外,其他选项一律不选(常用于嵌入式 Linux 系统的编译)
  • make allmodconfig: 尽可能多地使用 “m” 输入设置内核选项值来生成配置文件
  • make localmodconfig: 会执行 lsmod 命令查看当前系统中加载了哪些模块 ,并最终将原来的 .config 中不需要的模块去掉,仅保留前面 lsmod 命令查出来的那些模块,从而简化了内核的配置过程

下面使用 make menuconfig 来选择 KVM 相关的配置(系统中需要安装好 ncurses-devel 包)

  • 安装 ncurses-devel 包

    [root@localhost kvm-5.20-2]# yum -y install ncurses-devel
    
  • 升级 gcc 版本

    在 centos7.9 中,自带的是 gcc-4.8.5,不满足编译器的最低版本,因此需要通过源码包,手动编译、安装 gcc,这里我使用到的包及版本:gcc-10.4.0、gmp-6.2.1、mpc-1.2.1、mpfr-4.1.0

    依赖包安装:进入源码包文件夹,执行 ./configure && make && make install 安装即可(必须先安装 gmp),下面的代码,只用于 gcc 的编译安装

    # 添加环境变量
    [root@localhost ~]# export LD_LIBRARY_PATH=/soft/mpfr-4.1.0/src/.libs/:$LD_LIBRARY_PATH
    # 编译安装64位版本的 gcc
    [root@localhost gcc-10.4.0]# ./configure --disable-multilib && make && make install
    

    gcc 在经过漫长的编译安装完成后 反正我跑了160分钟左右 就可以进行 kvm 的安装了

  • 选择 KVM 相关的配置

    [root@localhost kvm-5.20-2]# make menuconfig
    

    在弹出来的对话框中,选择【Virtualization】,然后进入子菜单,选择对应的硬件平台(这里我选择的 Intel 的平台),然后选择【save】保存,然后会需要你输入一个文件名称,默认就可以了

    在生成的 .config 文件中,确认几个关键参数是否为以下值

    CONFIG_HAVE_KVM=y
    CONFIG_HAVE_KVM_IRQCHIP=y
    CONFIG_HAVE_KVM_EVENTFD=y
    CONFIG_KVM_MMIO=y
    CONFIG_KVM_ASYNC_PF=y
    CONFIG_HAVE_KVM_MSI=y
    CONFIG_VIRTUALIZATION=y
    CONFIG_KVM=m
    CONFIG_KVM_INTEL=m
    # CONFIG_KVM_AMD is not set
    
  • 安装依赖包

    如果出现一下错误,需要安装依赖包

    • scripts/sign-file.c:25:10: 致命错误:openssl/opensslv.h:没有那个文件或目录
  • gelf.h:No such file or directory

    [root@localhost kvm-5.20-2]# yum install openssl-devel elfutils-libelf-devel -y
  • 编译KVM

    在对 KVM 源代码进行了配置之后,编译 KVM 就是一件比较容易的事情了。它的编译过程完全是一个普通 Linux 内核编译的过程,需要经过编译 kernel、编译 bzImage 和编译 module 等3个步骤。编译 bzImage 这一步不是必需的

    • 编译 kernel make vmlinux

    • 编译 bzImage make bzImage

  • 编译内核模块 make modules

    通过以上三个步骤,kvm 的编译工作就算完成了,其实以上三步可以使用 make all 命令一次完成,只是使用三个步骤可以更好的了解编译过程

  • 安装kvm

    KVM 的安装包括两个步骤:安装 module,安装 kernel 与 initramfs

    • 安装module

      通过 make modules_install 命令可以将编译好的 module 安装到相应的目录中,默认情况下 module 被安装到 /lib/modules/$kernel_version/kernel 目录中。安装完毕后,可以核实 kvm 模块的安装情况

      [root@localhost kvm-5.20-2]# ls -al /lib/modules/5.19.0/kernel/arch/x86/kvm/
      -rw-r--r--. 1 root root  893086 8月  14 22:42 kvm-intel.ko
      -rw-r--r--. 1 root root 2270198 8月  14 22:42 kvm.ko
      
    • 安装kernel和initramfs

      • 安装 kernel 和 initramfs,使用命令 make install

        安装完毕后,查看安装情况

        [root@localhost kvm-5.20-2]# ls /boot | grep 5.19
        initramfs-5.19.0.img
        System.map-5.19.0
        vmlinuz-5.19.0
        

        除了在 /boot 目录下生成以上文件,在 /boot/grub2/grub.cfg 文件中,也会添加相应的启动选项。现在重启计算机,从刚才编译的 kernel 引导系统

      • 进入系统后,确认内核版本

        [root@localhost ~]# uname -r
        5.19.0
        
      • 查看模块加载情况

        [root@localhost ~]# lsmod | grep kvm
        kvm_intel             364544  0 
        kvm                  1155072  1 kvm_intel
        irqbypass              16384  1 kvm
        

        如果系统没有自动加载,可以使用手动加载

        [root@localhost ~]# modprobe kvm
        [root@localhost ~]# modprobe kvm_intel
        

        确认 KVM 相关的模块加载成功后,检查 /dev/kvm 这个文件,它是 kvm 内核模块提供给用户空间的 QEMU 程序使用的一个控制接口,它提供了客户机(Guest)操作系统运行所需要的模拟和实际的硬件设备环境

        [root@localhost ~]#  ls -l /dev/kvm
        crw-rw-rw-+ 1 root kvm 10, 232 8月  16 22:54 /dev/kvm
        

2、编译和安装QEMU

除了在内核空间的 KVM 模块之外,在用户空间需要 QEMU 来模拟所需要的 CPU 和设备模型,以及启动客户机进程,这样才有了一个完整的 KVM 运行环境

通常情况下,直接运行源码目录中的 configure 文件进行配置即可,如果需要帮助,可以使用 ./configure --help 命令,其中 --target-list 参数用于指定 QEMU 对客户机架构的支持

# 安装相关开发包
[root@localhost ~]# yum install epel-release -y
[root@localhost ~]# yum install glib2-devel pixman-devel SDL2 SDL2-devel -y 
## 由于是在centos7上面安装centos8的包,所以需要添加--skip-broken参数,否则会安装失败
[root@localhost ~]# yum install libstdc++-devel-8.5.0-3.el8.x86_64.rpm --skip-broken -y

# 安装re2c
## 将libmpfr中的libs目录添加进环境变量
[root@localhost re2c-3.0]# export LD_LIBRARY_PATH=/soft/mpfr-4.1.0/src/.libs/:/soft/kvm/gcc-10.4.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/:$LD_LIBRARY_PATH
## 安装re2c
[root@localhost re2c-3.0]# ./configure && make && make install

# 安装ninja
[root@localhost ninja-1.11.0]# ./configure.py --bootstrap
[root@localhost ninja-1.11.0]# cp ninja /usr/bin/

# 编译安装QEMU
## 编译时,指定使用gcc高版本
[root@localhost qemu-7.1.0-rc2]# ./configure --target-list=x86_64-softmmu --cc=/usr/local/bin/gcc
[root@localhost qemu-7.1.0-rc2]# make && make install

3、RHEL9中安装KVM环境

在 RHEL 9 中,我们在安装系统的时候,可以选择安装虚拟化环境,如果时在现有系统上启用虚拟化,那么就需要单独安装相应的软件包组,虚拟化使用到的软件包组包括:Virtualization-Tools、 Virtualization-Client、Virtualization- Hypervisor、Virtualization-Platform

  • 安装虚拟化环境

    [root@kvm-rocky9 ~]# yum groupinstall "Virtualization Tools" "Virtualization Client" "Virtualization Hypervisor" "Virtualization Platform" -y
    
  • 启用虚拟化

    [root@kvm-rocky9 ~]# systemctl start libvirtd
    [root@kvm-rocky9 ~]# systemctl enable libvirtd
    Created symlink /etc/systemd/system/multi-user.target.wants/libvirtd.service → /usr/lib/systemd/system/libvirtd.service.
    Created symlink /etc/systemd/system/sockets.target.wants/libvirtd.socket → /usr/lib/systemd/system/libvirtd.socket.
    Created symlink /etc/systemd/system/sockets.target.wants/libvirtd-ro.socket → /usr/lib/systemd/system/libvirtd-ro.socket.
    
    
  • 虚拟化功能验证

    我们可以通过检查 CPU 的特性,来查看虚拟化功能是否正常(查看是否包含 vmxsvm 特性)

    [root@kvm-rocky9 ~]# egrep '(vmx|svm)' /proc/cpuinfo
    flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat umip md_clear arch_capabilities
    
    ...
    

4、Debian安装KVM

  • 安装虚拟化环境

    在 Debian 系统中,KVM 涉及到的软件包包括:

    • libvirt-daemon-system:该软件包提供 libvirtd 守护程序,用于管理宿主机所运行的虚拟机,并在宿主机启动时启动所需的客户机

    • libvirt-clients:该软件包提供了 virsh 命令行工具,用于控制 libvirtd 管理的客户机

    • virtinst:该软件包提供 virt-install,允许从命令行创建虚拟机

    • virt-manager:图形化创建和管理虚拟机的工具

    • virt-viewer:用于访问 VM 的图形控制台

    root@kvm-debian12:~# apt-get install libvirt-clients libvirt-daemon-system qemu-kvm virtinst virt-manager virt-viewer -y
    
  • 启动虚拟化

    root@kvm-debian12:~# systemctl start libvirtd
    root@kvm-debian12:~# systemctl enable libvirtd
    
  • 虚拟化功能验证

    root@kvm-debian12:~# egrep '(vmx|svm)' /proc/cpuinfo
    flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat umip md_clear arch_capabilities
    ...
    

5、创建客户机

5.1、使用qemu-system创建客户机

安装客户机(Guest)之前,我们需要创建一个镜像文件或者磁盘分区等,来存储客户机中的系统和文件

  • 首先使用 qemu-img 工具创建一个镜像文件

    创建一个50GB,raw格式,名为centos7.img的镜像文件

    [root@localhost vm_host]# qemu-img create -f raw centos7.img 50G
    Formatting 'centos7.img', fmt=raw size=53687091200
    

    这里虽然是创建了一个50GB的镜像文件,但是不会立即分配全部空间,而是按需用多少分多少,最大容量不会超过 50GB,如果想在创建时,就把空间全部分配完,可以添加 -o preallocation=full 参数

  • 启动虚拟机

    [root@localhost vm_host]# qemu-system-x86_64 -enable-kvm -m 2G -smp 2 -boot once=d -cdrom /mnt/CentOS-7-x86_64-DVD-2009.iso centos7.img
    

    参数解释:

    -enable-kvm: 开启 KVM 支持

    -m: 给虚拟机分配内存大小,这里分配 2G 内存

    -smp: 给虚拟机分配的 vCPU 数量,这里分配 2 个 CPU

    -boot: 选择启动类型, once=d 是指定系统的启动顺序为首次光驱,以后再使用默认启动项

    -cdrom:** 使用 *.iso 文件作为 cdrom 安装镜像

5.2、使用virt-install创建虚拟机

5.2.1、virt-install简介

virt-install 命令行工具为虚拟客户机的安装提供了一个便捷易用的方式,它也是用 libvirt API 来创建 KVM、Xen、LXC 等各种类型的客户机,同时,它也为 virt-manager 的图形界面创建客户机提供了安装系统的 API。virt-install 工具使用文本模式的串口控制台和 VNC(或 SPICE)图形接口,可以支持基于文本模式和图形界面的客户机装。virt-install 中使用到的安装介质(如光盘、ISO 文件)可以存放在本地系统上,也可以存放在远程的 NFS、HTTP、FTP 服务器上。virt-install 支持本地的客户机系统,也可以通过 “–connect URI” (或 “-c URI” )参数来支持在远程宿主机中安装客户机。使用 virt-install 中的一些选项( –initrd-inject–extra-args 等)和 Kickstart 文件,可以实现无人值守的自动化安装客户机系统

5.1.2、virt-install安装与使用

  • 安装virt-install

    [root@kvm user]# yum install virt-install -y
    
  • 使用语法

    virt-install --name NAME --vcpus N --memory MB --disk SIZE --cdrom /PATH/ISO-FILE
    

    常用参数

    • –name NAME:客户机名称

    • –memory MEMORY:客户机内存大小(MiB)

    • –vcpus VCPUS:vCPU数量

    • –cdrom CDROM:光驱安装介质

    • –location LOCATION:安装源,例如:nfs:host:/path,http://host/path,ftp://host/path

    • –import:在已有的磁盘镜像中构建客户机

    • –livecd:将光驱介质视为 Live CD

    • –boot BOOT:配置客户机引导设置,例如:-boot hd,cdrom,menu=on

    • –disk DISK:指定存储的各种选项

      例如:

      –disk size=10 (在默认位置创建 10GiB 镜像)
      –disk /my/existing/disk,cache=none
      –disk device=cdrom,bus=scsi

    更多参数,请使用 virt-install --help 命令查询

  • 使用示例

    [root@kvm user]# virt-install --name centos7_2 \
                                  --vcpus 2 \
                                  --memory 2048 \
                                  --disk size=20 \
                                  --cdrom /iso/CentOS-7-x86_64-DVD-2009.iso \
                                  --os-variant rhel7 \
                                  --network network:default
    
    开始安装......
    正在分配 'centos7_2.qcow2'                                           |  20 GB  00:00:02
    域安装仍在进行。您可以重新连接到控制台以便完成安装进程。