Centos7部署与配置KVM服务

服务简介

KVM全称Kernel-based Virtual Machine,是一种开源的虚拟化技术,集成于Linux内核中,允许Linux将自身转变为一个虚拟机监控程序(hypervisor),从而在单一主机上运行多个隔离的虚拟环境,每个虚拟环境都有自己的私有虚拟化硬件(如CPU、内存、网络接口等)。
最初由以色列的初创公司Qumranet开发,并自Linux 2.6.20版本起成为Linux内核的一部分。

服务部署

安装前检查

硬件环境

  • CPU支持虚拟化
  • 主板支持虚拟化

虚拟化技术包括 Intel VT(Virtualization Technology)或 AMD-V(AMD Virtualization)等。

安装环境

  • 操作系统:Centos 7.9
  • 内核版本:3.10.0-1160.yd7.x86_64
  • 安装用户:root
  • 安装工具:yum

安装检查

  • 检查CPU是否支持虚拟化
# 命令返回的数字大于0,说明CPU支持虚拟化技术
grep -E -c '(vmx|svm)' /proc/cpuinfo
  • 检查KVM是否已加载
# 是否加载表示KVM虚拟化功能是否启用,有kvm相关输出则表明已加载
lsmod | grep kvm
  • 加载KVM
# 如果上一步检查kvm未加载,则执行该命令进行加载
modprobe -a kvm kvm_intel kvm_amd kvmgt

模块说明:

  • kvm:必需,提供基本的虚拟化支持。
  • kvm_intel:推荐,为Intel提供硬件辅助虚拟化支持及性能。
  • kvm_amd:推荐,为AMD提供硬件辅助虚拟化支持及性能。
  • kvmgt:推荐,提供对Intel Graphics Technology(GT)的直通支持,允许虚拟机直接访问宿主机的Intel集成GPU,提升图形化性能。

如果某个模块因为某些原因(比如硬件不支持)无法加载,modprobe通常会静默失败,不会影响其他模块的加载。

软件安装

1 安装kvm

yum install qemu-kvm qemu-img libvirt libvirt-python libvirt-client virt-install virt-viewer -y

组件说明:

  • qemu-kvm:提供 KVM 模块和用户空间工具,是 KVM 虚拟化的核心组件。
  • qemu-img: QEMU 磁盘映像管理工具,用于创建、转换和修改虚拟机使用的磁盘映像文件。
  • libvirt:一个开源的API、守护进程和工具集合,用于管理虚拟化平台。
  • libvirt-python:libvirt库的Python绑定,允许使用Python语言来编写脚本和程序,以管理和操作虚拟机。
  • libvirt-client:提供客户端 API 和与 libvirt 服务器交互的库,包括 virsh 命令行工具。
  • virt-install:一个命令行工具,用于创建新的虚拟机,允许用户指定虚拟机的各种参数,如名称、内存大小、虚拟CPU数量、磁盘镜像和网络配置等。
  • virt-viewer:一个图形界面工具,用于显示虚拟机的图形控制台。

2 安装桥接工具

用于创建和管理网络桥接的工具,以实现虚拟机的外部连接。

yum install bridge-utils -y

3 安装虚机镜像文件编辑工具

用于访问和修改虚拟机的磁盘镜像,libguestfs-tools 允许在宿主机上直接读写虚拟机的磁盘映像文件,无需启动虚拟机,这在某些维护、故障排查场景下非常有用。

yum install libguestfs-tools -y

4 启动libvirt并设置开机自启

# 启动 libvirtd
systemctl start libvirtd
# 添加 libvirtd 开机自启
systemctl enable libvirtd

5 验证kvm环境可用性

virt-host-validate 是一个专门用于验证 KVM 虚拟化主机配置的工具,由 libvirt-client 软件包提供,与其他检查方法相比,它提供了更加详尽的检查项。

# 所有检查项都 PASS,则说明 KVM 环境配置正确,可以创建虚拟机,如果存在检查项 FAIL,则需要根据提示进行修复
[root@donkey ~]# 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
  ...

配置桥接网络

KVM虚拟机实际是支持多种网络模式,如 桥接、NAT、Host-Only 等,默认是使用桥接网络模式,该模式下,虚拟机可以像物理机一样直接连接到网络上,拥有独立的IP地址,适用于需要让虚拟机对外提供服务,如Web服务或FTP服务等。

在centos7系统上,网络服务管理既可以使用network,也可以使用NetworkManager,因为本篇为较新的7.9版本,所以采用NetworkManager进行管理,如果是7较早的版本,则推荐采用network来进行桥接网络的创建(因为7早期版本NetworkManager对网桥功能支持并不好)。

1 确定要绑定的网口设备

这里使用 lshw 命令来查看本机的网口设备情况,确定要桥接网络要绑定的网口是哪个,例如这里选择 enp1s0 网口。

[root@donkey ~]# lshw -c network -businfo
Bus info          Device      Class          Description
========================================================
pci@0000:01:00.0  enp1s0      network        I211 Gigabit Network Connection
pci@0000:02:00.0  enp2s0      network        I211 Gigabit Network Connection
pci@0000:03:00.0  enp3s0      network        I211 Gigabit Network Connection
pci@0000:04:00.0  enp4s0      network        I211 Gigabit Network Connection
                  virbr0-nic  network        Ethernet interface
                  docker0     network        Ethernet interface

输出中可以看出本机有enp1s0-enp4s0 四个物理网口,每个网口设备都有唯一的PCI地址。

2 创建桥接网络

对应步骤1确定的网口,使用 brctl 命令创建一个名称为 br0 的网桥。

brctl  addbr  br0       # 创建桥接网络br0
brctl  addif  br0 enp2s0  # 把br0和enp2s0网卡绑定,让物理网卡流量能够通过网桥传递
brctl  stp   br0 on     # 开启stp协议,防止网络环路(loop)的产生

补充:对应的删除操作

brctl delif br0 enp2s0    # 解除与物理网卡绑定
ifconfig br0 down       # 关闭桥接网络br0, 否则无法删除
brctl delbr br0         # 删除桥接网络br0

【注意】如果是通过ssh等远程方式连接服务器,在操作网桥和物理网卡绑定操作时,注意不能选择当前连接正在使用的物理网卡,否则当前连接网络会被重置中断。

3 创建网桥配置

对应确定的网口 enp2s0,创建对应的桥接网络配置文件 /etc/sysconfig/network-scripts/ifcfg-br0。方便起见,可以直接拷贝 enp2s0 的配置文件进行修改,如下示例。

[root@donkey ~]# more /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge # 指定网络接口类型为桥接
BOOTPROTO=static # 设置为手动配置静态IP地址
DEVICE=br0
IPADDR=192.168.1.112 # 绑定物理网卡的IP地址
NETMASK=255.255.255.0 #或者 PREFIX=24
ONBOOT=yes

4 修改绑定网络设备配置

创建桥接网络配置后,绑定的网卡设备配置也要同步进行修改,注意修改前先进行备份。

# 备份绑定网卡设备
cp /etc/sysconfig/network-scripts/ifcfg-enp2s0 /etc/sysconfig/network-scripts/ifcfg-enp2s0.bak
# 绑定网卡设备修改后示例
[root@donkey ~]# more /etc/sysconfig/network-scripts/ifcfg-enp2s0
TYPE=Ethernet
BOOTPROTO=none # 设置为none或直接移除,确保不分配IP地址
NAME=enp2s0
DEVICE=enp2s0
BRIDGE=br0 # 表示将网卡桥接到br0网桥上
ONBOOT=yes

5 重启网络服务

systemctl restart NetworkManager

【注意】如果重启网络服务时提示 Device unmanaged or not available for activatio 错误,说明修改的网络设备非 NetworkManager 所纳管,可能是 network 所纳管的,所以要重启 network 服务。

6 检查配置效果

  • 使用 ifconfig 检查

正确配置情况下, 在 ifconfig 输出中只有 br0 有IP, enp1s0 这个网口是没有IP的。

[root@donkey ~]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.112  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::8e1c:daff:fe46:1102  prefixlen 64  scopeid 0x20<link>
        ether 8c:1c:da:46:11:02  txqueuelen 1000  (Ethernet)
        RX packets 89  bytes 8868 (8.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19  bytes 2120 (2.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 8c:1c:da:46:11:02  txqueuelen 1000  (Ethernet)
        RX packets 797673429  bytes 1149242532871 (1.0 TiB)
        RX errors 0  dropped 43  overruns 1656  frame 0
        TX packets 559644770  bytes 719560422108 (670.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xd0800000-d081ffff
...
  • 使用 brctl 检查

在没有创建虚拟机时,会显示只绑定 enp2s0,运行虚机如果有指定bridge=br0, 就会多一个vnet0网卡。

[root@donkey ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.8c1cda461102       yes             enp2s0
                                                        vnet0

创建虚拟机

KVM支持通过图形界面和命令行界面创建虚拟机,以下使用命令行创建centos7虚拟机为例。

从ISO源创建虚拟机

virt-install \
--name centos7 \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/centos7.img,size=20 \
--os-variant centos7.0 \
--cdrom /path/to/CentOS-7-x86_64-Minimal-1708.iso \
--network bridge=br0,model=virtio \
--graphics none \
--console pty,target_type=serial

参数说明:

  • name:指定虚拟机名称,需全局唯一,示例名称为 centos7。
  • memory:指定虚拟机内存大小,单位为MB,示例为给虚拟机分配2048M内存,即2G。
  • vcpus: 指定虚拟CPU个数及相关配置,示例为配置2个虚拟CPU。
  • disk: 指定虚拟机的磁盘配置,如大小、格式、缓存模式等,示例为创建一个20G的镜像磁盘文件,文件目录为/var/lib/libvirt/images。
  • os-variant: 指定要安装的操作系统变体,示例指定的操作系统变体为centos7.0。
  • cdrom: 指定安装光盘的ISO镜像文件,示例为使用 /path/to/CentOS-7-x86_64-Minimal-1708.iso 作为安装介质。
  • network: 指定网络接口的类型,如bridge、network、user等,示例里指定虚拟机使用名为br0的网桥,然后网络接口模型为virtio(virtio是一种高性能的虚拟化网络接口)。
  • graphics: 指定虚拟机的图形显示接口,如vnc、spice等,示例为不使用图形界面。
  • console: 将虚拟机的控制台连接到当前终端,示例为使用串行控制台进行交互。

从IMG文件创建虚拟机

virt-install \
--virt-type kvm \
--name centos7 \
--vcpus 2 \
--ram 4096 \
--graphics spice,listen=0.0.0.0 \
--noautoconsole \
--disk format=qcow2,path=/opt/kvm/images/centos7.img,bus=virtio \
--network bridge=br0,model=virtio \
--os-variant linux \
--boot hd

参数说明:

  • virt-type:指定虚拟化类型,示例为KVM。
  • ram:为虚拟机分配4096MB(即4GB)的内存。
  • graphics:配置虚拟机使用SPICE服务器作为图形显示,并监听所有IP地址(0.0.0.0表示监听所有网络接口),允许远程连接。
  • disk: 创建一个磁盘镜像用于虚拟机,指定磁盘格式为qcow2,镜像文件存储在/opt/kvm/images/centos7.img路径下,磁盘总线类型为virtio。
  • boot:设置虚拟机的启动顺序,示例表示从硬盘(hd)启动。

验证虚拟机服务

使用 virsh list 查看创建虚拟机状态,running 表示状态正常。

[root@donkey ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 1     centos7                        running

至此,KVM虚拟机服务创建成功。

posted @ 2024-04-18 18:13  505donkey  阅读(810)  评论(0)    收藏  举报