【版本】
当前版本号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。
- 启用虚拟化配置。使用管理员权限进入 Windows 系统的命令行
- “Win+R”键可以快速调出运行窗口
- 输入“cmd”、
- 同时按下“Ctrl+Shift+ENter”键启动管理员权限的命令行窗口
- 在 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
- 打开 Virtualbox,查看虚拟化选项是否已经启用。
复制任务1的虚拟机
复制任务1的虚拟机。
重新命名为
kvm
。选择完全复制。
选择“当前虚拟机状态”会丢失快照,而选择“全部”则会保留快照。
提升虚拟机CPU和内存配置
- 为了运行 KVM 虚拟机避免卡顿,修改虚拟机的处理器数量为2。内存为2G。
检查 CPU 是否支持虚拟化特性
- 启动
kvm
虚拟机,打开 FinalShell,使用 root 用户进行登录。
注意:复制出来的虚拟机不能和原来tmpl虚拟机同时启动,因为2台机IP地址一样,会造成冲突,导致SSH无法连接。
- 查看是否有内容输出
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 模块
- 确保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
网桥创建和设置
- 创建一个网桥(Net Bridge)名称为
br0
。
sudo nmcli con add ifname br0 type bridge con-name br0
- 设置网桥
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
- 查看虚拟机网卡名称,一般 Virtualbox 默认的是enp0s3, VMWare Workstation 默认的是ens33。
nmcli dev show|grep DEVICE
- 正常会出现类似以下结果
GENERAL.DEVICE: enp0s3
GENERAL.DEVICE: lo
lo 是Linux 的回环(loop)网卡接口
或者使用ip a
也可以查看网卡接口。
- 根据上面步骤获取到的网卡名称,禁用掉原有网卡。这一步会导致 Finalshell 无法连接,后续步骤可以在虚拟机窗口执行命令。
- VirtualBox 默认网卡名是 enp0s3,可以执行以下命令禁用网卡。
sudo nmcli con down enp0s3
- 如果你使用的是 VMWare Workstation Pro,默认的网卡名是ens33,可以执行以下命令禁用网卡。
sudo nmcli con down ens33
- 运行以下命令,创建一个与原有网卡同名设备桥接到网桥。
- 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
- 重启网络服务。重启以后 FinalShell 应该能够正常连接虚拟机了。
nmcli con reload
- 查看此时的网络设备信息。
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 --
- 运行命令
ip a
查看网络状态,正常情况下,原来网卡(VirtualBox是enp0s3,VMWare 是 ens33)下不应该显示10.0.0.70
的IP地址。
安装 KVM 和相关管理工具
- 安装 KVM 和相关管理工具
dnf -y install qemu-kvm libvirt virt-manager virt-install virt-viewer virt-top
- 查看包是否安装成功。
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
- 启用 libvirtd 服务。
systemctl enable libvirtd
systemctl start libvirtd
systemctl status libvirtd
libvirt是目前使用最为广泛的对 KVM 虚拟机进行管理的工具和API。 libvirtd 是服务器端 libvirt 的后台服务进程。
- 检查 KVM 是否安装成功。运行以下命令查看虚拟机系统列表。
virsh -c qemu:///system list
- 正常情况会返回
Id Name State
----------------------------------------------------
新建 KVM 虚拟机
- 新建一个目录用于保存 KVM 虚拟机文件,并开放授权访问。
mkdir /kvm-images
chmod 777 /kvm-images
- 进入
/kvm-images
目录,上传cirros-0.4.0-x86_64-disk.img
镜像文件。
cd /kvm-images
rz
rz 命令用于上传文件,如果没有可以用以下命令安装
dnf install lrzsz -y
- 修改
cirros-0.4.0-x86_64-disk.img
镜像文件权限。
chmod 777 /kvm-images/cirros-0.4.0-x86_64-disk.img
CirrOS 是一个迷你的 Linux 镜像,启动非常快,通常用于虚拟机测试。
- 使用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,不会影响创建的结果。
- 使用命令查看
cirros
虚拟机的状态。
sudo virsh list --all
- 如果
cirros
虚拟机的状态为关闭,可以使用以下命令启动。
sudo virsh start cirros
- 使用以下命令查看
cirros
虚拟机的VNC服务器进程端口5920
是否有信息输出。
sudo dnf install net-tools -y
netstat -tulpn|grep 5920
防火墙设置
- 查询5920端口的开启状态。开启为yes,未开启为no。
sudo firewall-cmd --query-port=5920/tcp
- 开启
5920
端口的访问权限。
sudo firewall-cmd --zone=public --add-port=5920/tcp --permanent
- 重启防火墙让端口设置生效。
sudo systemctl restart firewalld
- 再次查询5920 端口是否开启(自行完成命令)。
VNC 连接
在宿主机 Windows 系统安装 VNC Viewer,过程略。
打开 VNC Viewer, 输入
10.0.0.70:5920
(注意这里的英文的冒号!)进行连接。在 VNC Viewer 使用以下账号登录
cirros
虚拟机。
用户名:cirros
密码:gocubsgo
- 修改
cirros
网卡设置。注意以下命令是在 VNC Viewer 下执行。
sudo vi /etc/network/interfaces
- 修改网卡配置。注意以下命令是在 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
- 重启网卡。注意以下命令是在 VNC Viewer 下执行。
sudo ifdown eth0 & sudo ifup eth0
- 回到
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
- 在
Finalshell
使用 ssh 命令连接cirros
,并使用以上 cirros账号进行登录。
ssh cirros@10.0.0.71
- 在
Finalshell
登录进入cirros
虚拟机以后输入以下命令。请替换以下输出内容为你的学号和姓名拼音。
echo 你的学号和姓名拼音
- 在
Finalshell
输入以下命令,退出cirros
。
exit
- 在
Finalshell
输入以下命令,关闭cirros
。
virsh shutdown cirros
- 在
Finalshell
输入以下命令,查看cirros
状态。
virsh list --all
- 编辑
cirros
内存为 128 MB。
sudo virsh edit cirros
- 找到以下2行内容,这是cirros的内存配置,把标签内的数字修改为 131072(容量128MB=128*1024KB),并保存。
<memory unit='KiB'>65536</memory>
<currentMemory unit='KiB'>65536</currentMemory>
- 中止 cirros 让配置生效。
sudo virsh destroy cirros
启动
cirros
。查看虚拟机资源分配情况。
sudo virsh dominfo cirros
- 查看虚拟机资源当前使用情况。
sudo virt-top
可以用
Ctrl-C
中断界面
【任务名称】任务3.2 新建 KVM 虚拟机
【任务目的】
- 掌握KVM的安装和使用
【任务环境】
- Rockylinux 8
- FinalShell
【任务资源】
- cirros 磁盘文件。
- vnc viewer
【任务要求】
- 使用
cirros-0.4.0-x86_64-disk.img
镜像,在tmpl
主机上新建一个 KVM 虚拟机cirros2
主机。创建命令参考3.1 新建KVM 虚拟机 cirros2
配置如下。
CPU:1核
内存:64MB
IP:10.0.0.72
vnc连接端口:5902
网络:桥接到br0
- 启动
cirros2
主机,并使用vnc viewer
连接该主机。 tmpl
主机能够 ping 到cirros2
主机,而且能够通过 SSH 连接该主机。- 使用
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。