Part 3 - 服务器虚拟化部署

2023-06-11
11分钟阅读时长

【版本】

当前版本号v20241025

版本修改说明
v20241025增加常见问题4
v20241023优化常见问题3,3.2给出一些提示
v20240922改善部分容易出错的步骤
v20231012修改部分步骤,适配部分主机的网卡接口名称不一致。
v20231007修改常见问题1
v20230611换用 RockyLinux 8

任务3.1 KVM 的安装使用

【任务目的】

  • 掌握KVM的安装和使用

【任务环境】

  • Rockylinux 8
  • FinalShell

【任务资源】

  • cirros 磁盘文件。
  • vnc viewer

【任务步骤】

开启虚拟化嵌套

如果你使用的是VMWare Workstation Pro,仅需要勾选以下选项,请忽略步骤1-3。

  1. 启用虚拟化配置。使用管理员权限进入 Windows 系统的命令行
  • “Win+R”键可以快速调出运行窗口
  • 输入“cmd”、
  • 同时按下“Ctrl+Shift+ENter”键启动管理员权限的命令行窗口
  1. 在 Windows 的命令行窗口输入以下命令。
  • 修改以下D:\"Program Files (x86)"\Oracle\VirtualBox路径为你的 Virtualbox 安装路径。
d:
cd D:\"Program Files (x86)"\Oracle\VirtualBox

如果你安装在d盘,需要先输入 d: 切换到D盘,再运行 cd 命令 VirtualBox 的安装路径可以通过桌面的 VirtualBox 快捷方式打开

  • 执行以下命令启用你的虚拟机的虚拟化扩展特性。以下"Tmpl"需要修改为你的虚拟机名称。
VBoxManage.exe modifyvm "tmpl" --nested-hw-virt on
  1. 打开 Virtualbox,查看虚拟化选项是否已经启用。

复制任务1的虚拟机

  1. 复制任务1的虚拟机。

  2. 重新命名为kvm

  3. 选择完全复制。

  4. 选择“当前虚拟机状态”会丢失快照,而选择“全部”则会保留快照。

提升虚拟机CPU和内存配置

  1. 为了运行 KVM 虚拟机避免卡顿,修改虚拟机的处理器数量为2。内存为2G。
本实验是在名称为 kvm 虚拟机上完成,不是在tmpl 虚拟机上完成!

检查 CPU 是否支持虚拟化特性

  1. 启动kvm虚拟机,打开 FinalShell,使用 root 用户进行登录。

注意:复制出来的虚拟机不能和原来tmpl虚拟机同时启动,因为2台机IP地址一样,会造成冲突,导致SSH无法连接。

  1. 查看是否有内容输出
grep 'vmx\|svm\|lm' /proc/cpuinfo
  • 正常输出类似以下信息,如果有信息输出带有 vmx 或者 svm 字符(FinalShell 会标红色),就说明支持虚拟化指令;如果没有任何的输出,说明你的cpu不支持,将无法使用KVM虚拟机。
  • 一般英特尔(Intel)的 CPU 会有 vmx 字符输出;AMD 的 CPU 会有 svm 字符输出;lm(KVM仅支持x84_64平台,lm即64位)
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq monitor vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single tpr_shadow flexpriority fsgsbase avx2 invpcid rdseed clflushopt md_clear flush_l1d

加载 KVM 模块

  1. 确保BIOS里开启虚拟化功能,查看是否已加载KVM模块。
modprobe kvm
lsmod | grep kvm
  • 正常情况下输出以下信息,均属于正常输出。
kvm_intel             170086  0
kvm                   566340  1 kvm_intel
irqbypass              13503  1 kvm
kvm_amd             170086  0
kvm                   566340  1 kvm_amd
irqbypass              13503  1 kvm
kvm                   637289  0 
irqbypass              13503  1 kvm

网桥创建和设置

  1. 创建一个网桥(Net Bridge)名称为br0
sudo nmcli con add ifname br0 type bridge con-name br0
  1. 设置网桥br0的IP、掩码、网关、DNS等信息
sudo nmcli con mod br0 ipv4.addr 10.0.0.70/24
sudo nmcli con mod br0 ipv4.gateway 10.0.0.254
sudo nmcli con mod br0 ipv4.dns 223.5.5.5
sudo nmcli con mod br0 ipv4.method manual
  1. 查看虚拟机网卡名称,一般 Virtualbox 默认的是enp0s3, VMWare Workstation 默认的是ens33。
nmcli dev show|grep DEVICE
  • 正常会出现类似以下结果
GENERAL.DEVICE:                         enp0s3
GENERAL.DEVICE:                         lo

lo 是Linux 的回环(loop)网卡接口

或者使用ip a也可以查看网卡接口。

  1. 根据上面步骤获取到的网卡名称,禁用掉原有网卡。这一步会导致 Finalshell 无法连接,后续步骤可以在虚拟机窗口执行命令。
  • VirtualBox 默认网卡名是 enp0s3,可以执行以下命令禁用网卡。
sudo nmcli con down enp0s3
  • 如果你使用的是 VMWare Workstation Pro,默认的网卡名是ens33,可以执行以下命令禁用网卡。
sudo nmcli con down ens33
  1. 运行以下命令,创建一个与原有网卡同名设备桥接到网桥。
  • VirtualBox (默认网卡名是enp0s3)可以执行以下命令。
sudo nmcli con add type bridge-slave ifname enp0s3 master br0
sudo nmcli con up br0
  • VMWare Workstation Pro(默认网卡名是ens33)可以执行以下命令。
sudo nmcli con add type bridge-slave ifname ens33 master br0
sudo nmcli con up br0
  1. 重启网络服务。重启以后 FinalShell 应该能够正常连接虚拟机了。
nmcli con reload
  1. 查看此时的网络设备信息。
nmcli con show
  • 可以看到类似以下网络设备信息
NAME                 UUID                                  TYPE      DEVICE 
br0                  59b46c51-52ee-4a72-8254-fa06040e8488  bridge    br0     
bridge-slave-enp0s3  dee79b3f-ded3-4117-8f09-6e3d640d0a6b  ethernet  enp0s3 
enp0s3               67d1127a-53ca-48f4-aa82-a2f2766a2f19  ethernet  -- 
  1. 运行命令ip a查看网络状态,正常情况下,原来网卡(VirtualBox是enp0s3,VMWare 是 ens33)下不应该显示10.0.0.70的IP地址。

安装 KVM 和相关管理工具

  1. 安装 KVM 和相关管理工具
dnf -y install qemu-kvm  libvirt   virt-manager virt-install  virt-viewer virt-top
  1. 查看包是否安装成功。
rpm -q qemu-kvm  libvirt virt-manager virt-install  virt-viewer virt-top
  • 正常会输出类似以下内容
qemu-kvm-6.2.0-32.module+el8.8.0+1279+230c2115.x86_64
libvirt-8.0.0-19.module+el8.8.0+1279+230c2115.x86_64
virt-manager-3.2.0-4.el8.noarch
virt-install-3.2.0-4.el8.noarch
virt-viewer-9.0-12.el8.x86_64
virt-top-1.0.8-37.el8.x86_64
  1. 启用 libvirtd 服务。
systemctl enable libvirtd
systemctl start libvirtd
systemctl status libvirtd

libvirt是目前使用最为广泛的对 KVM 虚拟机进行管理的工具和API。 libvirtd 是服务器端 libvirt 的后台服务进程。

  1. 检查 KVM 是否安装成功。运行以下命令查看虚拟机系统列表。
virsh -c qemu:///system list
  • 正常情况会返回
Id    Name                         State
----------------------------------------------------

新建 KVM 虚拟机

  1. 新建一个目录用于保存 KVM 虚拟机文件,并开放授权访问。
mkdir /kvm-images
chmod 777 /kvm-images
  1. 进入/kvm-images目录,上传cirros-0.4.0-x86_64-disk.img镜像文件。
cd  /kvm-images
rz

rz 命令用于上传文件,如果没有可以用以下命令安装

dnf install lrzsz -y
  1. 修改cirros-0.4.0-x86_64-disk.img镜像文件权限。
chmod 777 /kvm-images/cirros-0.4.0-x86_64-disk.img

CirrOS 是一个迷你的 Linux 镜像,启动非常快,通常用于虚拟机测试。

  1. 使用KVM 创建一个虚拟机。
sudo virt-install --connect=qemu:///system --name=cirros --ram=64 --vcpus=1 --disk path=/kvm-images/cirros-0.4.0-x86_64-disk.img,format=qcow2 --import --bridge=br0  --vnc --vncport=5920 --vnclisten=0.0.0.0 --check path_in_use=off

命令解析:–name=虚拟机名称 –ram=内存大小 –vcpus=虚拟处理器核数 –disk path=虚拟磁盘地址 format=磁盘格式 –bridge=连接的网桥 –vncport=VNC的连接端口 –vnclisten=VNC监听地址

创建过程中如果出现“ERROR unsupported format character ‘�’ (0xffffffe7) at index 47”,请忽略,这是软件的bug,不会影响创建的结果。

  1. 使用命令查看cirros虚拟机的状态。
sudo virsh list --all
  1. 如果cirros虚拟机的状态为关闭,可以使用以下命令启动。
sudo virsh start cirros
  1. 使用以下命令查看cirros虚拟机的VNC服务器进程端口5920是否有信息输出。
sudo dnf install net-tools -y
netstat -tulpn|grep 5920

防火墙设置

  1. 查询5920端口的开启状态。开启为yes,未开启为no。
sudo firewall-cmd --query-port=5920/tcp
  1. 开启5920端口的访问权限。
sudo firewall-cmd --zone=public --add-port=5920/tcp --permanent
  1. 重启防火墙让端口设置生效。
sudo systemctl restart firewalld
  1. 再次查询5920 端口是否开启(自行完成命令)。

VNC 连接

  1. 在宿主机 Windows 系统安装 VNC Viewer,过程略。

  2. 打开 VNC Viewer, 输入10.0.0.70:5920(注意这里的英文的冒号!)进行连接。

  3. 在 VNC Viewer 使用以下账号登录cirros虚拟机。

用户名:cirros
密码:gocubsgo
  1. 修改cirros网卡设置。注意以下命令是在 VNC Viewer 下执行。
sudo vi /etc/network/interfaces
  1. 修改网卡配置。注意以下命令是在 VNC Viewer 下执行。
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 10.0.0.71
netmask 255.255.255.0
gateway 10.0.0.254
  1. 重启网卡。注意以下命令是在 VNC Viewer 下执行。
sudo ifdown eth0 & sudo ifup eth0
  1. 回到 Finalshell,在宿主机tmpl输入以下内容,测试能否连通cirros
ping 10.0.0.71

提示:ping命令可以使用 Ctrl+C 组合键来中止。

  • 正常连通应该有类似以下信息返回
PING 10.0.0.71 (10.0.0.71) 56(84) bytes of data.
64 bytes from 10.0.0.71: icmp_seq=1 ttl=64 time=1.52 ms
64 bytes from 10.0.0.71: icmp_seq=2 ttl=64 time=0.883 ms
  • 无法连通情况会返回如下消息
From 10.0.0.71 icmp_seq=1 Destination Host Unreachable
  1. Finalshell 使用 ssh 命令连接cirros,并使用以上 cirros账号进行登录。
ssh cirros@10.0.0.71
  1. Finalshell登录进入cirros虚拟机以后输入以下命令。请替换以下输出内容为你的学号和姓名拼音。
echo 你的学号和姓名拼音
  1. Finalshell输入以下命令,退出cirros
exit
  1. Finalshell输入以下命令,关闭cirros
virsh shutdown cirros
  1. Finalshell输入以下命令,查看cirros状态。
virsh list --all
  1. 编辑cirros内存为 128 MB。
sudo virsh edit cirros
  • 找到以下2行内容,这是cirros的内存配置,把标签内的数字修改为 131072(容量128MB=128*1024KB),并保存。
<memory unit='KiB'>65536</memory>
<currentMemory unit='KiB'>65536</currentMemory>
  1. 中止 cirros 让配置生效。
sudo virsh destroy cirros
  1. 启动cirros

  2. 查看虚拟机资源分配情况。

sudo virsh dominfo cirros
  1. 查看虚拟机资源当前使用情况。
sudo virt-top

可以用Ctrl-C中断界面

【任务名称】任务3.2 新建 KVM 虚拟机

【任务目的】

  • 掌握KVM的安装和使用

【任务环境】

  • Rockylinux 8
  • FinalShell

【任务资源】

  • cirros 磁盘文件。
  • vnc viewer

【任务要求】

  1. 使用cirros-0.4.0-x86_64-disk.img镜像,在tmpl主机上新建一个 KVM 虚拟机 cirros2 主机。创建命令参考3.1 新建KVM 虚拟机
  2. cirros2 配置如下。
CPU:1核
内存:64MB
IP:10.0.0.72
vnc连接端口:5902
网络:桥接到br0
  1. 启动cirros2主机,并使用vnc viewer连接该主机。
  2. tmpl主机能够 ping 到cirros2主机,而且能够通过 SSH 连接该主机。
  3. 使用sudo virt-top命令查看cirros2主机资源使用情况。

【常用命令】

nmcli 网络管理命令

  • 查看网络连接配置集合
 nmcli con show
  • 查看网络连接配置重新加载生效
 nmcli con reload
  • 连接配置禁用
nmcli con down 连接名称
  • 连接配置启用
nmcli con up 连接名称

virsh 虚拟机操作命令

  • 查看正在运行的 KVM 的虚拟机
virsh list
  • 查看所有状态的 KVM 的虚拟机
virsh list --all
  • 启动 KVM 虚拟机
virsh start 虚拟机名
  • 正常关闭 KVM 虚拟机
virsh shutdown 虚拟机名
  • 立即中止 KVM 虚拟机(相当于断电)
virsh destroy 虚拟机名
  • 移除 KVM 虚拟机
virsh undefine 虚拟机名
  • 编辑 KVM 虚拟机配置
virsh edit 虚拟机名
  • 重启虚拟机
virsh reboot 虚拟机名
  • 虚拟机随宿主机启动
virsh autostart 虚拟机名

【常见问题】

1. cirros 虚拟机无法正常启动,提示not syncing: I0-APIC + timer doesn't work的错误。

答: 解决方法一:通过修改 cirros 虚拟机的参数禁用 APIC 检查

  • (1)关闭 cirros
virsh destroy cirros
  • (2)进入 virsh 虚拟机命令客户端。
virsh

  • (3)编辑cirros虚拟机配置
edit cirros
  • (4)此时已经使用 vi 打开了cirros虚拟机配置文件。找到以下内容,把其中内容进行注释。
  • 找到以下这段配置内容
  <features>
    <acpi/>
    <apic/>
  </features>
  • 注释掉<acpi/><apic/>标签
  <features>
    <!--
	<acpi/>
    <apic/>
	-->
  </features>
  • (5)保存并退出编辑。exit命令可以退出virsh客户端。
exit
  • (6)重新启动cirros 虚拟机。
virsh start cirros

解决方法二:通过修改内核启动参数,跳过 APIC 检查。

  • (1)重新启动cirros
virsh destroy cirros
virsh start cirros
  • (2)使用 VNC 连接10.0.0.70:5920
  • (3)在进入 grub 引导界面后,不断按下Esc键,随即会跳转到内核参数编辑界面。
  • (4)进入内核参数编辑界面,按下e键进行编辑。
  • (5)按方向键下,选中kernel,按下e键进行编辑。
  • (6)在现有参数基础上加上以下参数(参数要有空格隔开),禁止系统进行时间检查和 APIC检查。编辑完按下Enter
 no_timer_check noapic

  • (7)按下b键重新启动,应该可以进入到 cirros 系统登录界面。

  • (8)进入 cirros 系统以后,编辑内核启动参数,实现以后每次启动都禁用时间检查。

sudo vi /boot/grub/menu.lst

  • (9)进入 cirros 系统以后,编辑内核启动参数,实现以后每次启动都禁用时间检查。
sudo vi /boot/grub/menu.lst
  • 找到console=XXXX字样,在后面加上以下参数,并保存。
 no_timer_check noapic

  • (10)编辑网络检查的启动脚本S40network
sudo vi /etc/init.d/S40network
  • 在第9行开头加入#注释,减少 DHCP 获取时间。

  • (11)重启 cirros
sudo reboot

2. 使用 ping 命令无法连通 KVM 虚拟机 cirros,ping 10.0.0.71失败。

答:

  • (1)首先查看 cirros 的状态是否为running
virsh list --all
  • (2)使用 VNC 进入 cirros,查看 IP 是否为 10.0.0.71。
ip addr
  • (3)在CentOS上重启 cirros。
virsh reboot cirros

3. VMWare 开启嵌套虚拟化失败,提示类似此平台不支持虚拟化的Intel VT-X/EPT 或 AMD-V消息或者模块HV启动失败

答:这是因为 VMWare Workstation 和微软 Windows上的 Hyper-V 不兼容导致的,需要关闭 Windows 的 Hyper-V 功能。

  • (1)在控制面板->程序-启用或关闭Windows功能 下,取消以下选项
    • Hyper-V
    • 虚拟机平台
    • 适用于 Linux的 Windows 子系统
    • Windows 虚拟机监控程序平台
    • Windows沙盒

  • (2)按下WIN+R组合键打开“运行”,然后输入services.msc回车。在 Windows 的服务禁用 Hyper-V服务。

  • (3)在 Windows 搜索框输入cmd,使用以管理员身份运行 CMD ,并执行以下命令彻底关闭 Hyper-V。

bcdedit /set hypervisorlaunchtype off

  • (4)在Windows 搜索框输入安全中心,进入设备安全性,关闭内核完整性

  • (5)重启电脑。

4. 部分CPU是 AMD 的电脑在启动 Cirros 的时候会失败,Cirros 停留在“ehci-pci 0000:00:04.7:irg 11,io mem xfebf1000”,或者日志显示“qemu warning: host doesn’t support requested feature: CPUID.80000001H:ECX.svm [bit 2]”

答:这是由于虚拟化没有把 AMD CPU 的特性传给KVM虚拟机,导致KVM虚拟机缺少CPU特性无法成功启动。可以开通 CPU 透传模式(passthrough),把CPU特性传递到KVM虚拟机。

  • (1)关闭Cirros
virsh destroy cirros
  • (2)编辑Cirros
virsh edit cirros
  • (3)找到这一行进行编辑,把 cpu 的 mode 修改为host-passthrough
<cpu mode="host-model"   >
  • 修改为
<cpu mode="host-passthrough"   >

5. 查看 KVM 虚拟机状态时提示“错误:获得域 ‘cirros’ 失败”

答:这是因为你的当前用户没有权限查看该虚拟机,需要提升权限。

sudo virsh list --all

6. 虚拟机经常提示类似“kernel:watchdog: BUG: soft lockup - CPU#0 stuck for 21s! [swapper/0:0]”

答:这是由于VirtualBox 或者 VMWare 使用了微软的Hyper-V技术导致出现的bug。需要关闭Hyper-V,请参考常见问题3的方法,关闭Hyper-V。

扫码或长按识别访问