1. 动手前,先理清几个概念
看到“统信UOS KVM虚拟化”这个组合,很多新手第一反应是:KVM不是Linux内核自带的虚拟化模块吗,为什么还要写安装手册?其实关键在于“上手”这两个字。统信UOS虽然底层是Linux,但默认桌面环境、软件源、内核模块加载方式都做了定制,直接照搬Ubuntu或者CentOS的教程,大概率会卡在某个莫名其妙的细节上。
KVM全称是Kernel-based Virtual Machine,它把CPU的硬件虚拟化能力(Intel VT-x或AMD-V)直接暴露给虚拟机使用。但KVM本身只负责CPU和内存的虚拟化,光有它还不够,还需要QEMU模拟硬盘、网卡、显卡这些外设,还需要libvirt这个管理工具把底层细节封装成统一接口。所以严格来说,我们日常说的“装KVM”,其实是把KVM加QEMU加libvirt加virt-manager这一整套虚拟化栈装好。
这篇文章适合两类人:一是刚接触统信UOS、想在本地跑虚拟机做测试的开发者;二是公司内网部署了统信UOS服务器,需要在其上承载业务虚拟机的运维新手。我会从环境检查一直讲到虚拟机创建,每一步都附带命令、输出解读和避坑经验,保证你照着操作就能跑起来。
2. 环境准备与安装前检查
2.1 确认硬件虚拟化支持
这是整个安装流程里最重要的一步,没有之一。如果CPU不支持硬件虚拟化,KVM装了也是白装,虚拟机根本起不来。检查方法很简单,终端里执行:
lscpu | grep -E "Virtualization|虚拟化"如果是Intel平台,输出里会显示VT-x;AMD平台则显示AMD-V。如果这条命令没有任何输出,再试试:
grep -E -c "(vmx|svm)" /proc/cpuinfo返回数字大于0,说明支持。这里有个坑:很多服务器的BIOS里默认关闭了VT-x/AMD-V,导致系统里看不到虚拟化标志。如果遇到这种情况,需要重启进BIOS,在CPU配置里找到Intel Virtualization Technology或者SVM Mode,改成Enabled。
另外统信UOS既可以在物理机上安装,也可以作为虚拟机里的客户机系统。如果你是在虚拟机里再装KVM,这就是嵌套虚拟化场景。VMware Workstation和VirtualBox默认都支持嵌套虚拟化,但需要手动开启:VMware里是在虚拟机设置的处理器选项里勾选Virtualize Intel VT-x/EPT;VirtualBox则是要设置加速选项。不开启的话,统信UOS内部是感知不到硬件虚拟化支持的。
2.2 确认系统版本与内核模块
安装前先确认系统版本和内核,这决定了后面软件包的兼容性:
cat /etc/os-release uname -r统信UOS常见的有专业版、个人版和服务器版,桌面环境基于Deepin深度定制。我用的是统信UOS专业版(1050版本),内核5.10以上,KVM模块默认已经编译进内核。检查KVM相关模块是否加载:
lsmod | grep kvm正常会看到kvm_intel或kvm_amd两个模块,以及它们的依赖kvm模块。如果没有输出,先手动加载:
sudo modprobe kvm_intel # Intel平台 sudo modprobe kvm_amd # AMD平台加载后检查设备节点:
ls -l /dev/kvm正常情况下会显示crw-rw---- 1 root kvm 10, 232之类的内容。/dev/kvm节点存在,说明内核层面的虚拟化支持完全可用。
2.3 更新软件源与系统
统信UOS的软件源默认指向官方仓库,安装软件包之前建议先更新索引。注意,统信UOS的apt源可能会因为系统版本不同而有差异,更新前最好先备份一下源列表。
sudo apt update sudo apt upgrade -y这里提醒一下:如果是生产环境,升级前最好确认业务兼容性,别为了装KVM把系统内核给升级挂了。我的习惯是装虚拟化组件前先只做update,upgrade视情况决定。
3. 一步步完成KVM安装与配置
3.1 安装虚拟化软件包
统信UOS基于Debian体系,所以用apt安装。需要装的包分成三类:内核态支持、用户态管理工具、图形化管理界面。我推荐一次性装齐下面这些:
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager逐个解释一下这些包的作用:
qemu-kvm:QEMU的KVM版本,负责模拟外设并调用KVM加速。libvirt-daemon-system:libvirt守护进程及服务配置,是虚拟化管理的核心。libvirt-clients:virsh命令行管理工具。bridge-utils:网络桥接工具,后面创建桥接网络会用到。virtinst:virt-install命令行创建虚拟机的工具包。virt-manager:图形化管理工具,新手最常用。
如果你不希望装图形界面(比如服务器最小化安装),virt-manager可以跳过,但我建议新手先装上,毕竟图形界面能直观看到虚拟机的状态和虚拟硬件的配置。
3.2 启动libvirtd服务并设置开机自启
安装完成后,libvirtd服务不会自动启动,需要手动启用:
sudo systemctl enable --now libvirtd sudo systemctl status libvirtd看到active (running)就说明服务正常。这里有个细节:libvirtd默认以root权限运行,普通用户如果想管理虚拟机,需要把用户加入kvm和libvirt组:
sudo usermod -aG kvm,libvirt $USER修改完组权限后,一定要注销重新登录,或者直接重启一次系统,当前shell才能获取新的组权限。我见过不少新手在这里卡住,明明装好了但virsh list命令就是报权限错误,其实就是没重新登录。
3.3 验证安装结果
安装完成后,用virsh命令验证一下整体状态:
virsh list --all virsh versionvirsh list --all如果显示空的列表,说明还没有创建虚拟机,这是正常现象。virsh version会显示libvirt版本、QEMU版本和KVM支持情况。另外还可以查看默认网络配置:
virsh net-list --all正常情况下应该有一个名为default的NAT网络,状态为active。这是libvirt自动创建的虚拟网络,虚拟机可以通过它访问外网。如果default网络不存在或者没启动,执行:
virsh net-start default virsh net-autostart default这几条命令操作下来,KVM的基本安装就算完成了。但先别急着创建虚拟机,网络和存储是虚拟化里最容易出问题的两个环节,提前规划好能省掉后面一大半的麻烦。
4. 网络与存储规划
4.1 NAT网络 vs 桥接网络
虚拟机的网络模式直接决定了它能怎么被访问。libvirt安装后自带的default网络是NAT模式,虚拟机通过宿主机转发访问外部网络,外部网络无法直接访问虚拟机。这种模式适合虚拟机只需要上网、不需要被外部设备访问的场景,比如测试环境或者自己学习用。
如果虚拟机要对外提供服务,比如公司内部跑一个业务系统,其他机器需要直接访问虚拟机,那就得用桥接模式。桥接的核心思路是创建一个虚拟网桥,把宿主机物理网卡和虚拟机虚拟网卡桥接在一起,让虚拟机就像是局域网里的一台独立机器。
创建桥接网络有两种方式:一种是在/etc/network/interfaces里配置,统信UOS桌面版可能用的是NetworkManager,更简单的方式是用virsh net-define定义XML网络。不过对于新手,我强烈建议先用virt-manager图形界面创建虚拟网络,操作直观,不容易出错。
4.2 存储池的规划
存储这块,新手最容易犯的错误是直接把虚拟机磁盘镜像放在系统盘上,结果一段时间后磁盘空间爆掉。规划存储池时,至少要考虑两个问题:镜像放哪里、镜像格式用什么。
常用镜像格式有raw和qcow2两种。raw格式性能好但占空间,1GB的文件就是1GB;qcow2格式支持按需分配,文件占用的空间随着虚拟机的使用慢慢增长,还支持快照。新手没特殊需求的话,默认用qcow2就对了。
查看当前磁盘剩余空间:
df -h建议把虚拟机镜像放到一个独立的分区或者磁盘上,比如挂载到/data的第二个硬盘,这样即使系统盘出问题,虚拟机镜像也还在。创建存储池的命令:
sudo mkdir -p /data/kvm sudo virsh pool-define-as vmdata dir --target /data/kvm sudo virsh pool-build vmdata sudo virsh pool-start vmdata sudo virsh pool-autostart vmdata这里我踩过一次坑:如果/data/kvm目录所在分区的权限不对,或者使用了SELinux(统信UOS默认可能开启AppArmor),虚拟机创建时会出现权限异常。最省事的做法是把目录属主改成libvirt-qemu用户:
sudo chown -R libvirt-qemu:kvm /data/kvm当然,不同系统版本用户和组名可能略有差异,可以用cat /etc/passwd | grep qemu查看确认。
5. 创建你的第一台虚拟机
5.1 使用virt-manager图形化创建
装好virt-manager后,从应用菜单里找到虚拟系统管理器,或者命令行直接输入:
virt-manager打开主界面后,点击左上角的“新建虚拟机”按钮(一个灯泡图标)。创建向导会问几个关键选择,逐个说:
第一,虚拟机命名。建议用英文小写加连字符,比如uos-test-vm,命名清晰方便后期识别。
第二,安装介质选择。如果要用ISO镜像安装统信UOS或其他系统,选“本地安装介质”,浏览选择ISO文件。这里有个细节:virt-manager默认可能不认识统信UOS镜像,不用慌,系统类型里可以手动选择Generic Linux或者直接选Debian系。
第三,内存和CPU分配。新手最容易在这里犯两个错误:分配太少导致虚拟机卡顿,或者分配太多导致宿主机没资源。我的个人经验是,要装的系统如果是桌面版,至少给2GB内存和2核CPU;服务器版可以1GB内存起步。宿主机内存总共8GB的情况下,虚拟机最好别超过4GB。
第四,磁盘分配。默认会创建一个磁盘镜像,注意选择存储池和格式,建议给20GB以上空间,qcow2格式。
向导最后一步,确认配置后勾选“安装前自定义配置”。这一步很关键,因为默认配置里网卡选择的可能是纯桥接,如果你用的是NAT网络,需要在自定义配置里把网络改成defaultNAT网络。
5.2 通过命令行创建虚拟机
图形界面虽然直观,但生产环境里很多时候是命令行操作,所以这里也演示一下用virt-install创建的方式。先准备一个安装脚本:
sudo virt-install \ --name uos-vm \ --ram 2048 \ --vcpus 2 \ --disk path=/data/kvm/uos-vm.qcow2,size=20,format=qcow2 \ --os-variant generic \ --network network=default,model=virtio \ --graphics vnc \ --cdrom /home/user/iso/uos-desktop-20-amd64.iso这个命令的含义按顺序解读:--name指定虚拟机名字;--ram和--vcpus指定内存和CPU;--disk指定磁盘路径、大小和格式;--os-variant指定系统类型,generic是通用选项,也支持--os-variant list查看所有可选类型;--network指定网络类型;--cdrom指定ISO镜像路径。
执行后,virsh会创建虚拟机并等待安装。如果加了--graphics vnc,可以用VNC客户端连接看安装画面。连接前需要确认VNC端口:
virsh vncdisplay uos-vm输出类似127.0.0.1:0,意思是VNC运行在5900端口。用VNC客户端连接宿主机IP加端口号就行。注意默认只监听本机回环地址,远程连接需要配置防火墙或者把--graphics改成--graphics vnc,listen=0.0.0.0。
5.3 安装系统时的几个细节
在虚拟机的VNC安装界面里,有一个很容易被忽略的点:安装统信UOS时,如果ISO是第一版的镜像,部分驱动可能识别不到虚拟磁盘。解决方法是:在创建向导的磁盘配置文件里,把总线类型从默认的VirtIO改成SATA或者IDE。VirtIO驱动性能好,但老版本安装镜像里没有自带驱动就会认不出盘。等系统装完,再换回VirtIO可以让磁盘性能更好,不过这是进阶操作了。
还有一个坑是显示协议的选择。如果用Spice协议,画面流畅度和剪贴板共享都比VNC好,但如果用VNC客户端连接,向导里就得选VNC。这个选择只能在创建时设定,后期改会比较麻烦,所以建议考虑清楚。
6. 常见问题与排查技巧实录
6.1 虚拟机启动报错:CPU不支持或不兼容
现象:virt-manager里点击启动虚拟机,几秒钟后提示CPU类型不支持,或者直接报KVM entry failed错误。
排查思路:先用第一步的检查方法确认CPU虚拟化支持;如果确认支持,那就可能是在虚拟机配置里指定了特定的CPU模型,比如host-passthrough,而宿主机的BIOS版本或者其他配置导致不支持。简单粗暴的解决方法是编辑虚拟机XML:
virsh edit vm-name在<cpu>段里删除或者改成:
<cpu mode='host-model' check='partial'/>保存退出后重启虚拟机。
6.2 虚拟机无法访问外网
现象:虚拟机里ping不通外网IP,但宿主机网络正常。
排查顺序:一看虚拟机网卡是不是用的是NAT网络;二看default网络是不是active;三看宿主机防火墙。
最常见的原因是libvirt的NAT网络虽然启动了,但宿主机的IPv4转发功能没开启。严格来说libvirtd启动时应该已经自动打开了,但有些定制化的UOS系统还是需要手动确认:
sudo sysctl net.ipv4.ip_forward输出为0的话,执行:
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ipforward.conf sudo sysctl -p这个问题我遇到不下三次了,每次都是因为安装了第三方安全软件或者其他网络管理工具,把系统的转发配置改回了0。
6.3 virt-manager提示无法连接到libvirt
现象:启动virt-manager后提示“无法连接到libvirt,没有权限”。
原因:当前用户不在libvirt组里,或者刚刚加入了但没重新登录。解决方案前面提到过,注销重登或者重启。
如果重启后还是报这个错,检查下socket权限:
ls -l /var/run/libvirt/libvirt-sock正常情况下属主是root,属组是libvirt,权限为rwxr-xr-x。如果权限不对,重新安装libvirt-daemon-system就能恢复。
6.4 虚拟机迁移到其他宿主机后起不来
这个场景在办公环境里很常见:在台式机上创建的虚拟机,拷贝到笔记本上想继续用,结果启动时报disk格式错误或者找不到存储。排查思路是这样的:先检查镜像文件路径和存储池定义是否一致;如果是跨目录移动,直接修改虚拟机XML里的<source file='旧路径'/>为新路径即可。虚拟机的磁盘文件本身跟宿主机没有绑定,只要路径对了就能启动。
6.5 性能优化的几个实用建议
创建完虚拟机、看到系统正常跑起来,很多人就满意了。其实还有几个优化点能让虚拟机用起来更加顺滑:
- 半虚拟化驱动。统信UOS的客户机系统安装virtio驱动后,磁盘和网卡的性能会有显著提升。Debian系系统通常自带,但如果没有,手动安装。
- CPU模式改为
host-passthrough。这样虚拟机直接使用宿主机的CPU特性集,性能更接近物理机。缺点是虚拟机无法在配置不同的宿主机间动态迁移。 - 内存超分。如果多台虚拟机不是同时高负载,可以给它们分配的总内存超过宿主机物理内存。但一定要设置内存上限(hard limit),否则内存耗尽时系统会开始swap,性能急剧下降。
- 使用virsh console进入串口控制台。一般不装图形界面时,用
virsh console vm-name可以像物理机的串口一样直接进系统,比VNC更轻量。
7. 最后的经验之谈
我在这套环境上陆陆续续折腾了几个月,前前后后建了不下二十个虚拟机,踩过的坑写下来足够再凑一篇长文。最想强调的一点是:KVM虚拟化本身不复杂,复杂的是环境差异。统信UOS服务器版和桌面版在软件源、防火墙、内核模块加载策略上都有细微差别,网上的教程大多只针对其中一个版本,而你手上的机器可能是另一个版本。学会看报错日志、学会journalctl -u libvirtd查看服务日志、学会dmesg | grep kvm定位内核层面的问题,比记住任何一篇教程里的固定命令都重要。
另外一个小技巧:创建虚拟机时养成写注释的好习惯,用virsh desc vm-name '这是测试环境,IP是xx'记录虚拟机的用途和关键信息。等你攒了十几个虚拟机之后就会明白,命名规范和注释比想象中更重要,至少不会再出现对着vm-2发愁不知道它是什么系统的情况。