一、KVM 环境准备
对下面的三台物理机各虚拟化一台16核64G的虚拟机
物理机1:192.168.10.10 ==> 虚拟机1:192.168.10.100
物理机2:192.168.10.11 ==> 虚拟机2:192.168.10.101
物理机3:192.168.10.12 ==> 虚拟机3:192.168.10.102
- 检查 CPU 是否支持虚拟化 执行以下命令,如果有输出(如
vmx或svm),说明支持虚拟化:
bash
egrep -c '(vmx|svm)' /proc/cpuinfo
- 安装 KVM 及相关依赖 使用
yum安装 KVM 核心组件、管理工具virt-install和网桥工具:
shell
# 配置清华大学yum源
[root@worker1 yum.repos.d]# vim /etc/yum.repo.d/openeuler.repo
[openeuler]
name=openEuler 22.03 LTS
baseurl=https://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-22.03-LTS/OS/x86_64/
enabled=1
gpgcheck=0
sslverify=0
bash
# 安装KVM虚拟化核心组件
# qemu: KVM虚拟化核心软件
# libvirt: 虚拟机管理守护进程和工具
# virt-install: 命令行创建虚拟机的工具
# bridge-utils: 网络桥接管理工具
yum install -y qemu libvirt virt-install bridge-utils
# 启动libvirtd服务
systemctl start libvirtd
# 设置libvirtd开机自启
systemctl enable libvirtd
# 将当前用户加入libvirt组,避免每次使用sudo
usermod -a -G libvirt $(whoami)
newgrp libvirt
# 验证libvirtd服务状态
systemctl status libvirtd
二、配置桥接网络(每台物理机)
查看网络接口信息
bash
ip addr show
# 记录使用的网络接口名(如ens33、eth0、eno1等)
配置桥接网络
使用 NetworkManager 配置桥接网络
第一步:检查当前网络连接状态
bash
# 查看当前活动的连接
nmcli connection show --active
# 查看所有连接
nmcli connection show
第二步:创建桥接连接
先创建桥接连接
-
物理机1
shellsudo nmcli connection add type bridge con-name br0 ifname br0 \ ipv4.method manual \ ipv4.address 192.168.10.10/24 \ ipv4.gateway 192.168.10.254 \ ipv4.dns 8.8.8.8 \ bridge.stp no \ connection.autoconnect yes -
物理机2
shellsudo nmcli connection add type bridge con-name br0 ifname br0 \ ipv4.method manual \ ipv4.address 192.168.10.11/24 \ ipv4.gateway 192.168.10.254 \ ipv4.dns 8.8.8.8 \ bridge.stp no \ connection.autoconnect yes -
物理机3
shellsudo nmcli connection add type bridge con-name br0 ifname br0 \ ipv4.method manual \ ipv4.address 192.168.10.12/24 \ ipv4.gateway 192.168.10.254 \ ipv4.dns 8.8.8.8 \ bridge.stp no \ connection.autoconnect yes
修改 eno1 配置,设置为桥接从属
shell
sudo nmcli connection modify eno1 connection.slave-type bridge connection.master br0
先激活桥接
shell
sudo nmcli connection up br0
激活 eno1(作为桥接端口)
shell
sudo nmcli connection up eno1
验证桥接状态
shell
# 检查桥接状态
nmcli connection show --active
ip addr show br0
ip addr show eno1
三、准备 openEuler 22.03 LTS 镜像
将镜像放置到合适位置
shell
sudo mkdir -p /data/image
openEuler 22.03 LTS
四、创建虚拟机磁盘
首先需要确保挂载虚拟机磁盘的 /data/image 或者是 /home/data/image 路径有250G 的空闲磁盘
shell
# 使用下面的命令进行查看(在物理机上执行)
[root@worker1 ~]# df -hT /data/image
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/root xfs 557G 116G 442G 21% /
[root@worker3 ~]# df -hT /home/data/image
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/home xfs 484G 72G 413G 15% /home
在三台物理机上分别执行:
物理机1:
bash
qemu-img create -f qcow2 /data/image/test-worker1.qcow2 250G
chmod 755 /data/image/
chown root:root /data/image/
chmod 644 /data/image/openEuler 22.03 LTS
物理机2:
bash
qemu-img create -f qcow2 /data/image/test-worker2.qcow2 250G
chmod 755 /data/image/
chown root:root /data/image/
chmod 644 /data/image/openEuler 22.03 LTS
物理机3:
bash
qemu-img create -f qcow2 /home/data/image/test-worker3.qcow2 250G
chmod 755 /home/data/image/
chown root:root /home/data/image/
chmod 644 /home/data/image/openEuler 22.03 LTS
五、创建虚拟机
参数详解:
-
--name test-worker1:指定虚拟机名称为 test-worker1
-
--vcpus 16:分配16个虚拟 CPU 核心给虚拟机
-
--memory 65536:分配 64G 内存给虚拟机
-
--disk path=/data/image/test-worker1.qcow2,size=200,format=qcow2
-
path:磁盘镜像文件路径
-
size:磁盘容量
-
format:磁盘格式
-
-
--network bridge=br0:将虚拟机连接到物理机的桥接网络 br0
-
--graphics vnc,listen=0.0.0.0:表示允许所有的 IP 地址连接至 VNC 服务
-
--cdrom /data/image/openEuler 22.03 LTS:挂载光盘镜像作为虚拟光驱,用于安装操作系统
-
--video cirrus 指定虚拟显卡类型为 Cirrus Logic GD5446,兼容传统图形界面
-
--noautoconsole:创建虚拟机后不自动连接至控制台,需要通过 virsh 或者 VNC 客户端访问
物理机1(创建vm1):
bash
virt-install \
--name test-worker1 \
--vcpus 16 \
--memory 65536 \
--disk path=/data/image/test-worker1.qcow2,size=250,format=qcow2 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--cdrom /data/image/openEuler 22.03 LTS \
--video cirrus \
--noautoconsole
物理机2(创建vm2):
bash
virt-install \
--name test-worker2 \
--vcpus 16 \
--memory 65536 \
--disk path=/data/image/test-worker2.qcow2,size=250,format=qcow2 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--cdrom /data/image/openEuler 22.03 LTS \
--video cirrus \
--noautoconsole
物理机3(创建vm3):
bash
virt-install \
--name test-worker3 \
--vcpus 16 \
--memory 65536 \
--disk path=/data/image/test-worker3.qcow2,size=250,format=qcow2 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--cdrom /data/image/openEuler 22.03 LTS \
--video cirrus \
--noautoconsole
六、虚拟机操作系统安装
查看VNC连接信息
通过 VNC 登录 IP:5900
在操作系统的网络配置部分
shell
# 下面以 test-worker3 举例
# IP 地址应该与宿主机同网段(桥接模式)
192.168.10.102
# 子网掩码为 24
255.255.255.0
# 网关设置为和物理机相同的网关
192.168.10.254
# DNS设置为和物理机相同的 dns
8.8.8.8
七、配置虚拟机静态IP
查看网络接口名称。
shell
ip addr
修改网络配置文件
编辑对应网卡的配置文件,例如 ens3:(以虚拟机3举例)
bash
# 首先确保连接是活跃且持久的
nmcli con show --active
# 修改连接配置
nmcli con mod "ens3" ipv4.addresses 192.168.10.102/24
nmcli con mod "ens3" ipv4.gateway 192.168.10.254
nmcli con mod "ens3" ipv4.dns 8.8.8.8
nmcli con mod "ens3" ipv4.method manual
# 关键步骤:将连接设置为开机自动启动
nmcli con mod "ens3" connection.autoconnect yes
# 重启网络连接使配置生效
nmcli con down "ens3"
nmcli con up "ens3"
关闭防火墙
shell
systemctl disable firewalld
systemctl stop firewalld
八、修改 SSH 配置允许密码登录
在虚拟机内部执行:
shell
# 修改配置允许密码认证和 root 登录
vim /etc/ssh/sshd_config
PasswordAuthentication yes
PermitRootLogin yes
shell
# 启动 SSH 服务
systemctl start sshd
systemctl enable sshd
配置主机名解析
shell
vim /etc/hosts
192.168.10.100 master1
192.168.10.101 master2
192.168.10.102 master3
九、网络互通验证
查看虚拟机IP地址
shell
# 在虚拟机内执行
ip addr show
# 或通过virsh查看
sudo virsh net-dhcp-leases default
测试网络互通
bash
# 在 test-worker1 上测试
ping 192.168.10.101
ping 192.168.10.102
# 在 test-worker2 上测试
ping 192.168.10.100
ping 192.168.10.102
# 在 test-worker3 上测试
ping 192.168.10.100
ping 192.168.10.101
十、常用管理命令
查看虚拟机状态
shell
virsh list --all
启动/关闭/重启虚拟机
shell
virsh start test-worker1
virsh shutdown test-worker1
virsh reboot test-worker1
查看虚拟机信息
bash
virsh dominfo test-worker1
进入虚拟机控制台
bash
svirsh console test-worker1
常用管理命令 (virsh) 安装完成后,你可以使用 virsh 命令管理虚拟机:
| 功能 | 命令 |
|---|---|
| 查看虚拟机列表 | virsh list --all |
| 连接/进入虚拟机控制台 | virsh console test-worker1 |
| 退出控制台 | 按 Ctrl + ] |
| 启动虚拟机 | virsh start test-worker1 |
| 关闭虚拟机 | virsh shutdown test-worker1 |
| 强制断电 | virsh destroy test-worker1 |
| 设置开机自启 | virsh autostart test-worker1 |
| 删除虚拟机 | virsh undefine test-worker1 |
| 重启虚拟机 | virsh reboot test-worker1 |
更换虚拟机磁盘存放位置
首先停止相关服务
shell
# 停止 libvirtd 服务
systemctl stop libvirtd
# 关闭虚拟机
virsh shutdown test-worker1
# 确认虚拟机关闭状态
virsh list --all
创建目标目录
shell
# 在 /home 下创建 data 目录
mkdir -p /home/data/image
# 设置正确的权限
chown -R root:root /home/data/
chmod 755 /home/data/
chmod 755 /home/data/image/
chown root:root /home/data/image/
chmod 644 /home/data/image/openEuler 22.03 LTS
移动数据文件
shell
# 移动镜像文件到新位置
mv /data/image/* /home/data/image/
# 验证文件完整性
ls -lh /home/data/image/
更新虚拟机配置
shell
# 编辑虚拟机配置
virsh edit test-worker1
# 修改磁盘路径:
# 将 <source file='/data/image/test-worker1.qcow2'/>
# 改为 <source file='/home/data/image/test-worker1.qcow2'/>
重启验证
shell
# 启动 libvirtd 服务
systemctl start libvirtd
# 启动虚拟机
virsh start test-worker1
# 检查虚拟机状态
virsh list --all
# 检查磁盘空间
df -h
后续资源配置修改方案
修改 CPU 数量
-
动态修改(需要虚拟机支持热插拔)
shellvirsh setvcpus test-worker1 20 --live -
永久修改(需要关机)
shell# 修改XML中的<vcpu>标签后重启生效 virsh edit test-worker1 <vcpu placement='static'>20</vcpu>
修改内存大小
-
动态修改(需要虚拟机支持 Balloon 驱动)
shellvirsh setmem test-worker1 81920 --live -
永久修改(需要关机)
shell# 修改<memory>和<currentMemory>标签后重启 virsh edit test-worker1 # <memory> 最大内存 <memory unit='KiB'>67108864</memory> # <currentMemory> 虚拟机运行可分配内存 <currentMemory unit='KiB'>67108864</currentMemory>
修改磁盘容量
-
扩容磁盘文件(需要关机)
shell# 增加100GB空间 qemu-img resize /data/image/test-worker1.qcow2 +100G -
虚拟机内分区调整
扩容后需在虚拟机内部使用
fdisk/parted和resize2fs(针对ext4)等工具扩展分区和文件系统。
KVM 虚拟机可视化平台管理
WebVirtMgr
- 特点:专为 KVM 设计的 Web 管理工具,非常轻量(基于 Python+Django)
- 部署方式:只需在一台服务器上安装,即可添加和管理其他 KVM 主机
- 功能 :
- 虚拟机创建、启动、关闭、暂停
- VNC/SPICE 控制台访问
- 硬件配置(CPU、内存、磁盘等)
- 快照管理
- 资源占用:约 100-200MB 内存
- 安装简易度:中等(需要配置 Nginx + Supervisor)
Cockpit + Machines 插件
- 特点:Red Hat 官方工具,系统集成度高
- 部署方式:每台 KVM 主机安装 Cockpit,通过一台主界面管理其他主机
- 功能 :
- 基础虚拟机操作
- 实时性能监控
- 存储和网络管理
- 多主机切换查看
- 资源占用:约 50-100MB 内存
- 安装简易度:简单(yum/dnf 直接安装)
bash
# CentOS/RHEL 安装
yum install cockpit cockpit-machines -y
systemctl enable --now cockpit.socket
# 访问 https://服务器IP:9090
Kimchi(基于 Cockpit)
- 特点:IBM 开发的 KVM 管理插件,比 WebVirtMgr 更简单
- 部署:作为 Cockpit 插件安装
- 功能:基础的虚拟机生命周期管理
- 资源占用:极低(作为插件运行)