尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

KVM虚拟化入门:virt-manager图形化管理虚拟机实战指南

KVM虚拟化入门:virt-manager图形化管理虚拟机实战指南 看到这个标题我先跟各位对个暗号你搜出来的“KVM”到底是哪个KVM有人搜“KVM显示器共享器”那是硬件切换器有人搜“linux kvm网络详解”那才是我们搞虚拟化的内核模块。这两种东西中文缩写一模一样实际完全是两个赛道。本文要聊的是后者——Linux内核级虚拟化方案KVM以及它最常用的图形界面管理工具virt-manager。你做服务器虚拟化、搭测试环境、甚至给新系统做安装验证这套组合都能派上大用场。写这篇文章就是因为后台经常有人问“装了KVM但是不会用”或者“图形界面根本调不出来”我把实际部署中踩过的坑、验证过的参数选择都整理出来希望能帮刚入门虚拟化的朋友少走弯路。1. 先分清你搜到的“KVM”是不是同一个东西1.1 硬件KVM切换器与虚拟化KVM的区别很多新手第一次接触“KVM”这个词是从公司机房里的“KVM切换器”开始的——一台设备带一个显示器、一套键盘鼠标能切换控制多台物理服务器。这种硬件KVM解决的是“机房空间有限不想给每台服务器都配显示器键盘”的问题本质上是个物理切换开关。而虚拟化领域的KVM全称是Kernel-based Virtual Machine是Linux内核自带的一个虚拟化模块。2007年合并进主线内核之后Linux本身就变成了一个虚拟机监控器Hypervisor你可以在上面跑Windows、跑各种Linux发行版、甚至跑BSD系统。这两种KVM的共性是“一台设备管多台机器”但前者管的是物理机器后者管的是虚拟机技术栈完全不同。我建议你在继续往下看之前先确认自己在搜的到底是哪一种。如果你的场景是“显示器共享器”“8K视频切换”这类那你需要的是硬件KVM切换器本文内容不适用如果你是要在服务器上创建虚拟机、给服务器做系统、搭测试环境那恭喜你来对地方了。1.2 部署KVM前的硬件门槛KVM的优势在于它不需要额外的hypervisor层直接利用CPU的虚拟化指令扩展所以对硬件有一个硬性要求CPU必须支持硬件虚拟化技术。Intel叫VT-xAMD叫SVM/V。绝大多数近十年生产的服务器CPU、甚至消费级桌面CPU都支持但有些低功耗U或者老平台可能没开需要在BIOS里确认一下。在装系统之前可以先跑一条命令看看CPU支不支持grep -E (vmx|svm) /proc/cpuinfo如果有输出说明CPU已经暴露了虚拟化指令如果没有输出进BIOS找Intel Virtualization Technology或SVM Mode选项把它打开。另外你的宿主机内存建议至少要8GB硬盘建议用SSD或者至少是转速高一点的机械盘。为什么因为虚拟机是吃内存大户你给每台虚拟机分配2G内存宿主自己再跑系统4G内存根本不够看而磁盘性能直接决定虚拟机里系统响应快不快机械盘跑虚拟机我实测体验很差开机都要好几分钟。2. 从零开始安装KVM图形管理环境的分步实操2.1 安装宿主机上的KVM核心组件我以最常见的Ubuntu 24.04和CentOS/RHEL系为例分别说。首先是Ubuntu/Debian系的命令sudo apt update sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinstCentOS/RHEL系则是sudo dnf install -y virt virt-install libvirt-client bridge-utils装完之后把libvirtd服务启动并设为开机自启sudo systemctl enable --now libvirtd sudo systemctl status libvirtd这里有个容易踩的坑安装时漏掉bridge-utils。很多教程都默认你知道网桥要额外装结果你没装后面建桥接网络的时候怎么都起不来。所以我把bridge-utils单独拎出来强调它提供brctl命令管理Linux网桥必需。2.2 安装图形管理端virt-managerKVM本身是内核模块没有界面需要一个前端工具来管理。命令行工具virsh当然能用但图形界面下的体验完全不同——对新手来说virt-manager是最直观的选择。它是Red Hat主导开发的虚拟机图形管理工具通过libvirt API跟KVM通信。安装命令同样很简单# Ubuntu/Debian sudo apt install -y virt-manager # RHEL/CentOS sudo dnf install -y virt-manager装完之后有一个很关键的权限问题如果你直接用普通用户运行virt-manager会发现连不上QEMU/KVM提示“Permission denied”或者“unable to connect to libvirt”。这是因为libvirt的socket默认只允许root和libvirt组用户访问。解决办法是把你的账号加进libvirt组sudo usermod -aG libvirt $USER然后重新登录一次让组权限生效。这一步我最初搞的时候没注意折腾了半小时后来发现就是差在用户组上。2.3 验证安装是否成功装完别急着建虚拟机先跑几个命令确认一切正常# 查看libvirt服务状态 systemctl status libvirtd # 列出当前所有虚拟机刚装完应该是空的 sudo virsh list --all # 查看支持的虚拟化技术 sudo virsh version然后在终端敲 virt-manager看能不能正常打开图形窗口。如果能打开在“连接”列表里应该能看到“QEMU/KVM”这一项双击就能连上。如果你是在一台没有桌面环境的服务器上操作也可以把virt-manager跑在本地工作站上通过SSH远程连接宿主机。virt-manager新建连接时选择“QEMU/KVM用户会话”或“QEMU/KVM系统连接”勾选“通过SSH连接”填上宿主机的IP和用户名它会自动在后台用SSH隧道跟libvirt通信。这个方式对“服务器装好系统之后没有显示器”的场景特别管用我帮客户部署虚拟化环境时经常这么干。3. virt-manager创建虚拟机的完整流程与关键参数3.1 创建前的准备工作打开virt-manager并连上宿主机之后先别急着点“新建虚拟机”。我建议你先做两件事一是准备操作系统的ISO镜像二是确认存储池。存储池可以理解成虚拟机磁盘文件的存放目录。默认情况下libvirt会自动创建/var/lib/libvirt/images这个目录作为默认存储池。你可以用图形界面的“编辑-连接详情-存储”来查看也可以额外添加一个目录作为存储池比如挂在数据盘上的某个路径。我个人的习惯是把虚拟机磁盘放在独立的数据盘上系统盘就留给宿主OS这样虚拟机读写不会把宿主系统盘撑爆做快照和备份也更灵活。ISO镜像怎么放最简单的做法是把ISO文件直接拷到/var/lib/libvirt/images目录下或者任意目录都行创建虚拟机时手动选择路径。注意权限问题如果ISO放在root家目录或/root下virt-manager可能没权限读取建议放到/var/lib/libvirt/images或者给文件加上其他用户可读权限。3.2 创建虚拟机的分步操作点击virt-manager主界面左上角的“创建新虚拟机”按钮会弹出一个向导按下面的思路操作第一步选择虚拟化方式。默认就是“本地安装介质ISO镜像或光盘”能识别到KVM就说明当前连接正常如果显示“不支持虚拟化”或者只能选QEMU不带KVM多半是之前说的CPU虚拟化没开。第二步选择ISO镜像。浏览选中你的系统ISO文件。这里有个细节界面上会让选“操作系统类型和版本”如果你选的系统版本不在下拉列表里选一个最接近的即可影响不大。但别不代表“不填”它会影响虚拟机默认的固件类型和设备配置。第三步分配内存和CPU。这个要看你的宿主机资源来定。纯净的Ubuntu Server或Debian最小安装1核2G就能跑带桌面环境的系统建议2核4G起步Windows 10/11建议至少4核8G不然装系统过程会很痛苦。CPU配置界面上有“拓扑”选项默认就行不要手动去改插槽数改不对反而性能下降。第四步创建磁盘镜像。建议保持默认的“为虚拟机创建磁盘镜像”容量先给个20G到40G。镜像格式默认是qcow2这是KVM最常用的格式特点是支持写时复制和快照文件初始很小随着虚拟机写入量增长而增长。千万别在这步选“raw”除非你很明确自己在干什么——raw格式不支持快照管理起来受限很多。第五步也是最关键的一步在“向导即将完成之前自定义配置”这个复选框上打勾。很多人会跳过这步直接点完成结果装系统时机型默认配置可能有问题后期还要关掉虚拟机重新改。我强烈建议每次都勾选然后点“完成”进入详细的硬件配置界面。在自定义配置界面里重点检查几项引导菜单确认安装介质CDROM排在硬盘前面否则会直接从空硬盘启动导致“No bootable device”。显示协议默认VNC终端本地操作没问题。如果你远程连接注意VNC默认只监听127.0.0.1需要把“地址”改成0.0.0.0或通过SSH隧道访问否则你从外面连不上VNC端口。网卡默认是virtio模型Linux系统没问题如果是装Windows后面要装virtio驱动才能识别网卡这个下面细说。电源和ACPI保持默认开启不然虚拟机无法正常关机重启。3.3 安装系统时的交互细节配置好之后点击“开始安装”virt-manager会自动打开一个VNC窗口显示虚拟机的显示输出像操作一台真实电脑一样操作虚拟机。这里有个新手容易疑惑的点virt-manager窗口里鼠标“卡住了”怎么办其实是鼠标被虚拟机捕获了按CtrlAlt组合键就能释放鼠标回到宿主机。这是一个高频问题很多人第一次用不知道怎么退出。装Windows系统时virt-manager默认的virtio磁盘和网卡在安装阶段是无法识别的会直接报“找不到磁盘驱动器”。解决办法是下载virtio-win驱动ISOFedora项目维护的Windows VirtIO驱动镜像在创建虚拟机时将驱动ISO挂载到虚拟光驱里。安装Windows时到了选择磁盘的界面点“加载驱动程序”指向驱动ISO里的合适目录等磁盘识别出来后再继续。我第一次给Windows虚拟机装系统时就在这里卡住了装了两次才明白是virtio驱动的问题。如果你不想麻烦也可以在自定义配置里把磁盘总线改成SATA网卡改成e1000这样Windows原生就能识别但性能和高级特性会打折扣。对测试环境倒是无妨。3.4 性能参数实测建议参数怎么选我先给个常用的参考表场景CPU内存磁盘显卡模型网络模型测试Linux服务器1核1-2G20G qcow2VGAvirtio日常桌面Linux2核4G40G qcow2QXLvirtioWindows 10/114核8G80G qcow2qxl/virtiovirtio需驱动数据库/高IO应用4核以上8G以上独立盘raw或qcow2VGAvirtio 多队列这里要单独说一下CPU模式。virt-manager默认的CPU模式是“hypervisor-default”性能不够好。如果你追求性能建议在CPU配置里把“型号”改成“host-passthrough”意思是虚拟机直接使用宿主机物理CPU的全部特性。用host-passthrough模式虚拟机里跑性能测试损耗极小默认模式可能会损失10%到20%的性能。代价是虚拟机迁移到另一台不同CPU型号的宿主机时可能不兼容但如果你只在一台机器上跑不用纠结这点。4. 网络管理NAT、桥接与新建网络实操4.1 默认NAT网络的运行机制装完KVM后libvirt会自动创建一个叫“default”的NAT网络负责给虚拟机提供网络。在这套机制下宿主机上会多出一个叫virbr0的虚拟网桥地址默认是192.168.122.1然后由dnsmasq进程为虚拟机分配IP网段通常是192.168.122.0/24。NAT模式的特点是虚拟机可以主动访问外网但外界访问不到虚拟机除非你在宿主机上做端口转发。这对测试环境很友好安全、不用跟现有网络抢IP。你在virt-manager的“编辑-连接详情-虚拟网络”里能看到这个default网络状态是“活跃”。4.2 在virt-manager里新建一个自定义网络“kvm中如何新建一个网络”是出现频率很高的搜索词。默认NAT网络够用但有些场景确实需要额外建网络比如你想把一组虚拟机组成一个隔离的内部网络或者想用不同的网段区分业务。在virt-manager里新建网络的方式很直观打开“编辑-连接详情”切到“虚拟网络”选项卡点左下角的加号。向导会让你填网络名称、网段、DHCP地址范围等。比如我建一个网段192.168.150.0/24的内部网络不启用DHCP专门给一组做集群测试的虚拟机关联使用这样它们之间可以互通又跟外部网络隔离。还有个技巧如果只是想让两台虚拟机之间通信也可以直接创建一个“隔离”类型网络不勾选NAT转发。这样虚拟机之间能互访但出不了宿主机适合做内网渗透测试、私有集群演练这类场景。4.3 生产环境必学的Linux网桥桥接模式NAT模式虽然方便但在生产环境里有个明显的短板外界访问虚拟机不方便端口转发配置繁琐。如果你希望虚拟机像一台独立的物理服务器一样直接使用局域网IP就要用桥接模式。桥接的做法是创建一个Linux网桥把宿主机的物理网卡“塞”进这个桥里虚拟机通过这个桥对外通信。在Ubuntu 24.04上如果你用NetPlan管理网络可以在/etc/netplan/目录下建一个新配置文件network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no bridges: br0: interfaces: [eth0] dhcp4: yes parameters: forward-delay: 0 stp: false然后执行sudo netplan apply。如果物理网卡原来用的是DHCP重启网络后br0会拿到原来eth0的地址。操作完检查一下ip addr确认virbr0和br0不冲突再在virt-manager创建虚拟机时网络选择里就会多出一个“br0”选项选它之后虚拟机就像直连局域网一样能从路由器DHCP直接拿IP。这里必须提醒一句如果你是通过SSH远程操作的宿主机配置桥接时千万别把物理网卡断开导致网络中断。稳妥的做法是在本地控制台或者IPMI管理口下操作或者先配置好再一次性apply。我之前干过一次直接在远处的服务器上调桥接网卡从eth0移到br0的瞬间SSH立刻断掉根本没机会把新配置apply完整最后只能让机房同事帮忙重启机器。现在我都学乖了动手前先在本地准备一套应急恢复方案比如配置里保留一个备用网口。4.4 网络故障排查三件套虚拟机网络出问题时不要慌按这个顺序排查第一步看宿主机的桥和网卡状态ip addr看看br0和virbr0是否都处于UP状态。第二步看虚拟机的网卡配置在virt-manager预览虚拟机XML确认interface type和source bridge/network设置正确。第三步看虚拟机的IP地址NAT模式下虚拟机如果拿不到IP大概率是dnsmasq服务异常重启libvirtd试试sudo systemctl restart libvirtd。很多情况下问题出在宿主机防火墙拦截了转发包。如果你的虚拟机NAT模式下只能访问宿主机、访问不了外网检查iptables/nftables的FORWARD链是否放行了libvirt规则。Ubuntu的ufw默认策略可能阻止转发流量执行sudo ufw allow in on virbr0加一条规则能解决大部分奇怪问题。5. 虚拟机装系统常见大坑图形界面调不出的排查实录5.1 先分清图形界面在哪一层“达梦调不出图形界面”“openeuler安装图形界面”“麒麟图形界面root登录”这类搜索词背后其实是同一类问题虚拟机虽然启动了但你自己需要访问的图形界面出不来。排查之前先分清是这个“图形界面”到底属于哪一层第一层宿主机上virt-manager打不开或连不上虚拟机——问题在HOST端。第二层虚拟机的VNC/Spice控制台黑屏或花屏——问题在虚拟机显示输出这一层。第三层虚拟机内部某个应用比如达梦数据库的安装程序弹不出图形窗口——问题出在虚拟机里的X11/DISPLAY环境。这三层的排查思路完全不同很多人混在一起浪费了大量时间。我遇到过最典型的情况是在一台KVM虚拟机上安装达梦数据库安装程序执行后没有任何窗口弹出进程在那里干跑。用ps检查发现进程还在就是界面出不来。这类GUI应用的常见原因是DISPLAY环境变量没有正确设置或者X11认证不通过。在虚拟机里的图形终端上执行echo $DISPLAY能输出:0或:0.0就说明环境变量没问题如果输出空执行export DISPLAY:0再把应用拉起。如果还是不行用xhost 临时放行一下认证很多时候就能解决。国产数据库和办公软件在国产Linux系统上装图形界面时这套排查思路是一模一样的。5.2 虚拟机内系统图形界面装不上或起不来的处理装openEuler这类系统时安装界面默认是有图形向导的但有些服务器版镜像默认不带桌面组件。如果你装完系统发现只有命令行可以通过命令补装图形界面openEuler上执行sudo dnf groupinstall Server with GUI然后设置默认启动到图形模式sudo systemctl set-default graphical.target sudo reboot银河麒麟这类桌面系统在KVM虚拟机里装好后如果root用户登录不进去通常是因为登录界面对root用户做了限制。修改/etc/gdm/custom.conf这类登录管理器配置在[security]段加上AllowRoottrue然后重启显示管理器一般就能解决。这是正常系统管理操作但也要注意KVM虚拟机里显卡模型对桌面流畅度影响很大装银河麒麟这类带桌面特效的系统时建议把显卡模型从默认的VGA改成QXLQXL在图形界面上支持的分辨率和刷新率都要好用得多实际操作手感完全是两个级别。5.3 virt-manager打不开或连不上的排查顺序如果宿主机上启动virt-manager就报错多半是连不上的问题。按下面步骤排查查看libvirtd是否在运行systemctl status libvirtd没运行就启动它。确认当前用户有没有权限把用户加进libvirt组重新登录。检查是不是远程连接语法问题如果通过SSH连接确认宿主机IP和用户名无误。看日志journalctl -u libvirtd -f任何连接异常日志都会打在这里。我最常遇到的情况是用户装完KVM后重启机器然后发现virt-manager连不上一看libvirtd服务没设置开机自启。所以装好之后我习惯立刻执行systemctl enable --now libvirtd顺便把virtlogd也一起管好。5.4 常见问题速查表现象原因解决办法virt-manager提示无法连接libvirt服务未启动或用户无权限systemctl start libvirtdusermod -aG libvirt $USERCPU不支持虚拟化或无法启用KVMBIOS未开启VT-x/SVM重启进BIOS开启虚拟化指令虚拟机控制台黑屏显卡模型或VNC监听地址不对换成QXL/SpiceVNC地址改0.0.0.0虚拟机拿不到IPdnsmasq异常或NAT网卡配置错误重启libvirtd检查网络XML安装Windows找不到磁盘virtio驱动缺失挂载virtio-win ISO并安装驱动虚拟机内GUI应用不弹窗DISPLAY变量未设置或X11认证失败export DISPLAY:0xhost 鼠标被虚拟机捕获无法退出标准VNC捕获机制按CtrlAlt释放鼠标图形界面卡顿严重显卡模型不匹配或内存不足改用QXL模型增加虚拟机内存6. 进阶心得图形界面和命令行怎么配合才顺手6.1 哪些操作用图形界面哪些用命令行virt-manager虽然好用但真要管大量虚拟机命令行反而更高效。我的习惯是这样的创建和修改虚拟机配置、查看显示输出这类“单台操作”用virt-manager批量操作、脚本化任务、状态查询用virsh。两者通过libvirt协同工作并不冲突。几个高频的virsh命令分享出来# 列出所有虚拟机 virsh list --all # 启动/关闭/强制关闭 virsh start vm-name virsh shutdown vm-name virsh destroy vm-name # 创建快照 virsh snapshot-create-as vm-name snap1 第一次快照 # 查看虚拟机VNC端口 virsh vncdisplay vm-name6.2 快照、克隆和迁移图形界面也能做virt-manager的“管理快照”功能很直观打开虚拟机窗口点击菜单“视图-快照”就能列出虚拟机当前所有快照并创建新快照。平时做测试前打个快照试坏了直接从快照恢复比重新装系统省太多事情了。克隆虚拟机也很方便右键虚拟机列表中的名称选择“克隆”指定新名称和磁盘存储位置就能复制出一台新虚拟机。需要注意克隆时虚拟机的网卡MAC地址会重新分配避免两台虚拟机IP一样。如果发生冲突在新虚拟机里改一下网卡配置就行。工具链它还支持克隆时选择“克隆磁盘镜像”还是“链接克隆”链接克隆更省空间但依赖原镜像生产环境慎用链接克隆。6.3 给初学者的几条实用建议第一给虚拟机命名时前加主机名前缀比如web01、db01、test-k8s-01避免时间一长分不清哪台是干嘛的。第二重要的虚拟机在创建完成后立刻打一个初始快照后面出问题能快速回滚。第三定期检查宿主机的磁盘空间qcow2镜像会一直膨胀加上快照和备份磁盘说满就满。最后千万别在生产环境里删快照文件来“释放空间”——正确方式是通过virt-manager或virsh等libvirt接口删除直接删文件会导致虚拟机磁盘元数据损坏这个坑我见过不止一次了。这个系列的内容可以往下延展的方向还有很多比如GPU直通把物理显卡直接给虚拟机用、SR-IOV网络虚拟化、基于Ceph的分布式存储后端、虚拟机在线迁移等等。图形界面只是KVM的第一层台阶真正好玩的东西在爬过这层之后才会逐渐展开。
返回列表