KVM虚拟化:RHEL9 KVM基础使用

admin 2023年05月30日 555次浏览

1、启用虚拟化

1.1、安装软件包

  • 安装虚拟化hypervisor软件包

    ~]# dnf install qemu-kvm libvirt virt-install virt-viewer -y
    
  • 启动虚拟化服务

    ~]# for drv in qemu network nodedev nwfilter secret storage interface; do systemctl start virt${drv}d{,-ro,-admin}.socket; done
    

1.2、验证安装结果

~]# virt-host-validate
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking if device /dev/kvm exists                                   : PASS
  QEMU: Checking if device /dev/kvm is accessible                            : PASS
  QEMU: Checking if device /dev/vhost-net exists                             : PASS
  QEMU: Checking if device /dev/net/tun exists                               : PASS
  QEMU: Checking for cgroup 'cpu' controller support                         : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
  QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
  QEMU: Checking for cgroup 'memory' controller support                      : PASS
  QEMU: Checking for cgroup 'devices' controller support                     : PASS
  QEMU: Checking for cgroup 'blkio' controller support                       : PASS
  QEMU: Checking for device assignment IOMMU support                         : PASS
  QEMU: Checking if IOMMU is enabled by kernel                               : PASS
  QEMU: Checking for secure guest support                                    : WARN (Unknown if this platform has Secure Guest support)
  • 如果所有 virt-host-validate 检查返回 PASS 值,则说明系统已准备好创建虚拟机;如果有任何检查返回 FAIL 值,请按照显示的说明来修复问题

  • 如果主机 CPU 不支持 KVM 虚拟化,virt-host-validate 会输出: QEMU: Checking for hardware virtualization: FAIL (Only emulated CPUs are available,performance will be significantly limited)

2、创建虚拟机

使用 virt-install 命令创建虚拟机,常用参数如下:

  • –name:虚拟机名称
  • –vcpus:CPU 数量
  • –memory:内存大小
  • –disk:存储的类型和大小
  • –location(–cdrom):OS 安装源的类型和位置
  • –os-variant:系统版本,可以通过 --osinfo list 参数查询
  • –network:配置网络接口
  • –autostart:开机自动启动客户机
  • –import :在已有的磁盘镜像中构建客户机

使用 virt-install --help 查看更多详细信息

2.1、使用iso文件安装

~]# virt-install \
--name demo-guest1 \
--vcpus 4 \
--memory 4096 \
--disk /data/test-vm1.qcow2,size=100 \
--os-variant rocky9.0 \
--location=/iso/Rocky-9.1-x86_64-dvd.iso

2.2、使用现有磁盘镜像创建虚拟机

使用该方法创建虚拟机,可以跳过系统安装,而是使用磁盘中的现有系统

~]# virt-install \
--import \
--name demo-guest1 \
--vcpus 4 \
--memory 4096 \
--disk /data/test-vm1.qcow2 \
--osinfo rocky9.0

2.3、使用远程资源配合KS文件自动安装

~]# virt-install \
--name demo-guest2 \
--vcpus 4 \
--memory 4096 \
--disk size=100 \
--os-variant rocky9.0
--location http://10.10.10.1/rocky9/ \
--extra-args="inst.ks=http://10.10.10.1/ksfile/rocky9/ks-minimal.cfg console=tty0"

2.4、在远端主机上创建虚拟机

~]# virt-install \
--connect qemu+ssh://root@10.0.0.1/system \
--name demo-guest3 \
--vcpus 4 \
--memory 4096 \
--disk size=100 \
--os-variant rocky9.0
--location=/iso/Rocky-9.1-x86_64-dvd.iso \
--graphics none \
--extra-args='console=tty0'

3、管理虚拟机

3.1、启动虚拟机

# 本地虚拟机
virsh start VM-NAME
# 远程虚拟机
virsh -c qemu+ssh://root@HOST-IP/system start VM-NAME

3.2、关闭虚拟机

virsh shutdown VM-NAME
virsh -c qemu+ssh://root@HOST-IP/system shutdown VM-NAME

3.3、强制关闭虚拟机

virsh destroy VM-NAME
virsh -c qemu+ssh://root@HOST-IP/system destroy VM-NAME

3.4、自动开启虚拟机

virsh autostart VM-NAME
virsh -c qemu+ssh://root@HOST-IP/system autostart VM-NAME

4、连接虚拟机

此处仅介绍使用 virt-viewer 连接到虚拟机

virt-viewer VM-NAME
virt-viewer --direct --connect qemu+ssh://root@HOST-IP/system VM-NAME

为了方便,可以通过给远程主机配置别名来进行访问,例如将 qemu+ssh://root@10.10.10.1/system 命名为 test-host

# 配置别名访问
~]# vim /etc/libvirt/libvirt.conf
uri_aliases = [
  "test-host=qemu+ssh://root@10.10.10.1/system",
]

# 使用别名远程执行命令
~]# virsh -c mian list
root@10.10.10.1's password:
 Id   名称          状态
-----------------------------
 1    demo-guest1   running

5、删除虚拟机

删除虚拟机的先决条件:

  • 备份虚拟机中的重要数据

  • 关闭虚拟机

  • 确保没有其他虚拟机使用相同的关联的存储

virsh undefine VM-NAME --storage STORAGE --nvram
# --storage:删除关联的存储卷,可以通过domblklist查看
# --nvram:删除nvram文件

示例:

删除虚拟机:demo-guest1

# 通过domblklist查看对应存储文件
~]# virsh domblklist --domain demo-guest1
 目标   源
------------------------------
 vda    /data/test-vm1.qcow2
 sda    -
 
# 删除虚拟机
~]# virsh undefine demo-guest1 --storage vda --nvram
Domain 'demo-guest1' has been undefined
已删除卷 'vda'(/data/test-vm1.qcow2)。

6、查看虚拟机信息

6.1、查看正在运行的虚拟机

~]# virsh list
 Id   名称          状态
-----------------------------
 1    demo-guest1   running

6.2、查看所有虚拟机列表

~]# virsh list --all
 Id   名称          状态
-----------------------------
 1    demo-guest1   running
 -    rocky9        关闭
 -    windows10     关闭
 -    windows11     关闭

6.3、查看指定虚拟机信息

~]# virsh dominfo demo-guest1
Id:             1
名称:       demo-guest1
UUID:           82394689-9fa9-4d09-bb90-97e2c74bb6e6
OS 类型:    hvm
状态:       running
CPU:          4
CPU 时间:   20.5s
最大内存: 4194304 KiB
使用的内存: 4194304 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

6.4、查看虚拟机的XML配置文件

~]#  virsh dumpxml demo-guest1
<domain type='kvm' id='1'>
  <name>demo-guest1</name>
  <uuid>82394689-9fa9-4d09-bb90-97e2c74bb6e6</uuid>
  ......

6.5、查看虚拟机存储

 ~]# virsh domblklist --domain demo-guest1
 目标   源
------------------------------
 vda    /data/test-vm1.qcow2

6.6、查看虚拟机文件系统及挂载点

~]# virsh domfsinfo demo-guest1
 Mountpoint   名称   类型   目标
----------------------------------
 /            dm-0   xfs    vda
 /boot        vda1   xfs    vda
 /home        dm-2   xfs    vda

6.7、查看虚拟机vCPU信息

~]# virsh vcpuinfo demo-guest1
VCPU:           0
CPU:            0
状态:       running
CPU 时间:   11.0s
CPU关系:      yyyyyyyyyyyyyyyyyyyyyyyyyyyy
......

6.8、查看主机上的所有虚拟网络接口

~]# virsh net-list --all
 名称      状态   自动开始   持久
-----------------------------------
 default   活动   是         是

~]# virsh net-info default
名称:       default
UUID:       212884e5-a25f-441b-810d-dd867xxxxxxx
活跃:       是
持久:       是
自动启动:    是
桥接:       virbr0

7、保存和恢复虚拟机

保存虚拟机会将其内存和设备状态保存到主机的磁盘中,并立即停止虚拟机进程。该操作可以保存处于运行状态或暂停状态的虚拟机,在恢复后,虚拟机将返回到停止前的状态

这个过程释放了主机系统中的 RAM 和 CPU 资源以交换磁盘空间,这样可提高主机系统的性能。当虚拟机被恢复时,因为不需要引导客户机操作系统,也避免使用较长的启动周期

7.1、保存虚拟机状态

~]# virsh managedsave demo-guest1
libvirt 已保存域 'demo-guest1' 的状态

保存的虚拟机文件默认位于 /var/lib/libvirt/qemu/save 目录中

 ~]# ls /var/lib/libvirt/qemu/save
demo-guest1.save

7.2、查看已保存的虚拟机

~]# virsh list --managed-save --all
 Id   名称          状态
----------------------------
 -    demo-guest1   已保存
 -    rocky9        关闭

7.3、恢复已保存的虚拟机

~]# virsh start demo-guest1
Domain 'demo-guest1' started

8、克隆虚拟机

克隆虚拟机会复制源虚拟机及其磁盘镜像的 XML 配置,并对配置进行修改以确保新虚拟机的唯一性。这包括更改虚拟机的名称,并确保它使用磁盘镜像克隆。存储在克隆的虚拟磁盘上的数据与源虚拟机是一致的

这个过程比创建新虚拟机要快,并使用客户端操作系统安装它,并可用于快速生成带有特定配置和内容的虚拟机

8.1、创建虚拟机模板

使用 virt-sysprep 创建虚拟机模板,用于自动克隆虚拟机

  • 先决条件

    • 宿主机已经安装virt-sysprep

      ~]# dnf install /usr/bin/virt-sysprep -y
      
    • 用作模板的虚拟机已经关闭

    • 知道源虚拟机磁盘镜像的位置和虚拟机磁盘镜像文件的拥有者

  • 创建虚拟机模板

    ~]# cp /data/demo-guest1.qcow2 /data/demo-template.qcow2
    ~]# virt-sysprep -a /data/demo-template.qcow2
    [   0.0] Examining the guest ...
    [   3.7] Performing "abrt-data" ...
    [   3.7] Performing "backup-files" ...
    ......
    

8.2、克隆虚拟机

8.2.1、使用模板克隆

使用 demo-guest1 的本地虚拟机 ,创建 demo-guest1-clone 虚拟机,位置与原始虚拟机磁盘镜像相同的位置,使用相同的数据创建 demo-guest1-clone.qcow2 磁盘镜像

# 克隆
~]# virt-clone --original demo-guest1 --auto-clone
正在分配 'demo-guest1-clone.qcow2'                                       1% [-                                                         ]    0 B/s | 1.5 GB  --:--:-- 正在分配 'demo-guest1-clone.qcow2'                                                                                                                | 1.5 GB  00:00:00 ...

成功克隆 'demo-guest1-clone'。

# 查看虚拟机
~]# virsh list --all
 Id   名称                状态
--------------------------------
 -    demo-guest1         关闭
 -    demo-guest1-clone   关闭
 
# 查看镜像文件
 ~]# ls -lah /data/
-rw-------   1 root root 1.6G  5月 30 17:12 demo-guest1-clone.qcow2
-rw-------   1 root root 1.6G  5月 30 17:08 demo-guest1.qcow2
-rw-------   1 root root 1.6G  5月 30 17:11 demo-template.qcow2

8.2.2、手动克隆

~]# virt-clone -o demo-guest1 -n demo-guest2 -f /data/demo-guest2.qcow2
正在分配 'demo-guest2.qcow2'                                             1% [-                                                         ]    0 B/s | 1.5 GB  --:--:-- 正在分配 'demo-guest2.qcow2'                                                                                                                      | 1.5 GB  00:00:00 ...

成功克隆 'demo-guest2'。

# 查看虚拟机
~]# virsh list --all
 Id   名称          状态
--------------------------
 -    demo-guest1   关闭
 -    demo-guest2   关闭

# 查看镜像文件
~]# ls -lah /data
-rw-------   1 root root 1.6G  5月 30 17:25 demo-guest1.qcow2
-rw-------   1 root root 1.6G  5月 30 17:33 demo-guest2.qcow2
-rw-------   1 root root 1.6G  5月 30 17:11 demo-template.qcow2