ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

KVM图形化安装实战:virt-manager远程管理无头服务器

KVM图形化安装实战:virt-manager远程管理无头服务器 1. 先把KVM这个概念捋清楚别一上来就装错东西1.1 搜索KVM安装的时候你到底在找哪一个KVM这个词确实容易串台。我身边不少做机房运维的朋友一听到KVM脑子里蹦出来的是机柜里那台带一排按钮、能切键盘鼠标显示器的切换器而另一拨折腾Linux虚拟化的说的KVM是Kernel-based Virtual Machine内核级虚拟化。这两个东西同名不同命搜出来的教程南辕北辙很多人装了半天发现自己装的跟想用的完全是两码事白白折腾一下午。所以动手之前先自我确认一句你要的是在Linux机器上跑虚拟机、给服务器装系统、做测试环境那这篇走的就是Kernel-based Virtual Machine这条路。这套方案的完整技术栈其实是三到四层叠起来的。最底下是KVM内核模块它自己不做完整的硬件模拟只是把CPU的虚拟化扩展能力Intel的VT-x、AMD的AMD-V暴露给用户态负责CPU和内存的虚拟化调度。中间是QEMU一个纯软件的设备模拟器负责模拟网卡、磁盘控制器、USB、显卡这些外围设备。KVM和QEMU配合起来才是一台能跑操作系统的完整虚拟机。再往上是libvirt它是一套管理API和守护进程把QEMU那些又臭又长的命令行参数封装成统一的接口virsh命令和图形界面都是通过它来操作虚拟机的。最上层才是virt-manager也就是我们要用的图形化管理工具。理解这个分层挺重要的因为后面出问题的时候你得知道往哪一层去查。图形界面点不动可能是virt-manager和libvirtd之间的连接问题虚拟机起不来报KVM is not available那是内核模块和CPU虚拟化那一层的事网络不通多半在QEMU的网卡模拟和宿主机网络配置上。分不清层排查就是无头苍蝇。1.2 图形化安装的两种理解以及它适合谁标题里图形化安装其实有两层意思我在实际操作里两种都用过得说清楚。第一种是用图形界面来安装和管理KVM虚拟机也就是装好libvirt和virt-manager之后通过点鼠标的方式创建虚拟机、挂载ISO、分配磁盘和网络全程不用敲virt-install那一长串参数。第二种是在安装虚拟机的过程中走图形化安装向导比如装Ubuntu、Windows的时候那个一步步点下去的安装界面通过SPICE或VNC协议把虚拟机的画面显示出来。这两个经常被混在一起说其实是两个独立的东西管理端是图形化的不代表客户机安装过程一定看得到画面反过来也一样。这篇内容我打算两个都覆盖。因为实际场景里很多人是拿一台没有显示器的服务器俗称无头服务器来做宿主机本地电脑装个virt-manager远程连过去管理虚拟机装系统的画面也能正常显示。这套组合拳我觉得是目前最省心、最不容易出错的路子比在服务器上硬装一个桌面环境要清爽得多也比全程命令行敲参数友好尤其适合刚开始接触虚拟化的朋友。那么什么样的人需要这套东西我的判断是这么几类手头有一台性能还行的Linux机器或者服务器想在上面跑几个隔离环境做测试的需要给裸机装系统但没有显示器、或者想批量复现某个系统安装过程的做开发需要一台干净的、随时能删掉重建的Linux或Windows环境的还有想学虚拟化、但不想一上来就啃KVM源码和QEMU文档的。如果你属于这几类下面的步骤基本可以照着抄。1.3 开始之前先明确硬件门槛和几个硬性前提KVM不是装上就能用的它对硬件有硬性要求这点必须先说不然装了发现跑不起来最打击积极性。第一个前提是CPU必须支持硬件虚拟化。Intel平台叫VT-xAMD平台叫AMD-V这是Intel和AMD各自实现的CPU虚拟化指令集扩展。近十年的主流服务器和桌面CPU基本都带但很多机器出厂时BIOS里是默认关闭的需要手动打开。这个开关通常藏在BIOS的Advanced或者CPU Configuration菜单里名字可能是Intel Virtualization Technology、VT-x、SVM Mode、AMD-V之类找到了改成Enabled就行。第二个前提是内存和磁盘要留够。KVM本身占用很小但虚拟机是实打实吃内存的。我一般建议宿主机至少留出每个虚拟机内存的两倍余量比如你想跑一个4GB内存的虚拟机宿主机最好有8GB以上可用。磁盘方面虚拟机的虚拟磁盘文件会随着使用不断增长做实验的话预留50GB以上的空闲空间比较稳妥用SSD体验会好很多。第三个是对内核版本的隐性要求。KVM从2.6.20就进主线内核了现在主流的发行版内核都远高于这个版本所以基本不用操心。但如果你的系统特别老或者用的是某些裁剪过度的嵌入式发行版那就得先确认一下。我后面用的例子主要以Ubuntu 24.04和Rocky Linux 9这两个为主其他Debian系、RHEL系的发行版命令基本通用差异我会单独标出来。2. 装之前的环境体检别省这一步2.1 用三条命令确认CPU虚拟化是否就绪体检这件事我踩过的坑告诉我千万别跳过。曾经有一次在一台二手工作站上装了半天虚拟机死活起不来最后查出来是BIOS里VT-x没开。所以每次拿到一台新机器我第一步就是确认虚拟化扩展到位了没有。最直接的是看CPU信息Linux下打开终端敲lscpu | grep -i virtualization如果输出里出现VT-x、AMD-V或者Virtualization: VT-x这类字样说明CPU支持且已经在操作系统里可见了。要是这条命令没输出先别急着下结论可能是CPU信息格式不同再用下面这条兜底egrep -c (vmx|svm) /proc/cpuinfovmx是Intel的虚拟化标志svm是AMD的。这条命令会返回一个数字只要大于0就说明硬件支持返回0才是真的不支持。我遇到过一次返回0的情况结果进BIOS一看VT-x被关了打开之后立马正常。如果你用的是Debian或者Ubuntu还有个更傻瓜的工具叫cpu-checker它会把KVM相关的几个条件一次性给你检查完sudo apt update sudo apt install -y cpu-checker sudo kvm-ok正常情况下会打印INFO: /dev/kvm exists KVM acceleration can be used看到这两行基本就是绿灯了。如果提示KVM acceleration cant be used它会顺便告诉你是缺了哪一环照着提示查就行。这个工具特别适合新手省得自己一条条对着猜。提示/dev/kvm这个设备节点很关键它是QEMU访问KVM内核模块的入口。如果这个文件不存在虚拟机就只能以纯软件模拟TCG模式运行速度会慢到让你怀疑人生。确认ls -l /dev/kvm存在且权限正确是后面一切顺利的基础。2.2 系统版本、软件源和更新策略环境确认完了接着处理系统本身。KVM相关的软件包都在各发行版的官方源里不需要额外添加第三方源这点比较省心。但有一点要注意先把系统更新到当前版本的最新状态尤其是内核相关的包。因为KVM、QEMU、libvirt三者之间有版本匹配关系混用太老的组件偶尔会出现兼容性小毛病。Ubuntu/Debian系sudo apt update sudo apt full-upgrade -yRHEL系Rocky、AlmaLinux、CentOS Streamsudo dnf update -y这里有个经验如果你用的是长期运行的服务器不建议为了装KVM就无脑全量升级内核因为升级内核可能需要重启而重启生产服务器是要排期的。这种情况下我会用--security或者只装必要组件的方式把影响面控制住。做法是先只装虚拟化组件观察没问题再考虑内核更新的窗口。另一个细节是universe仓库。Ubuntu上virt-manager这个图形工具在universe里如果你的系统默认没启用这个仓库装的时候会报找不到包。确认一下sudo add-apt-repository universe sudo apt updateRocky Linux的情况是virt-manager在AppStream或者EPEL里。默认AppStream一般就有如果报缺包装个EPEL基本能解决sudo dnf install -y epel-release这些准备工作看着琐碎但能帮你避开装到一半卡壳的尴尬。2.3 网络方案怎么选NAT、桥接还是macvtap网络这块是新手最容易懵的地方我单独拎出来讲。装KVM的时候网络方案选型会直接影响后面的使用体验所以我习惯在装之前就把方案定下来而不是等虚拟机建好了发现连不上再回头改。NAT模式是libvirt装好后默认就带的那张网名字叫default宿主机上会多出一个叫virbr0的虚拟网桥网段通常是192.168.122.0/24。虚拟机通过它做地址转换访问外网宿主机能访问虚拟机但同局域网里的其他机器访问不到虚拟机。适合做测试、装完系统只需要虚拟机自己能上网的场景配置最简单几乎不用管。桥接模式是把虚拟机的网卡直接“焊”到宿主机的物理网络上虚拟机会从你局域网的DHCP拿到一个跟宿主机同网段的IP对局域网其他机器来说它就是一台独立主机。适合需要对外提供服务、做集群实验的场景。代价是配置稍微麻烦而且配错有把宿主机网络搞断的风险这点我后面会专门讲。macvtap模式算是桥接的一种轻量替代性能不错但有个已知的别扭之处宿主机自己和macvtap虚拟机之间默认通信有问题。所以除非你有明确的性能诉求我一般不建议新手一上来就上macvtap。三种方案的对比整理成一张表选型的时候对着看方案宿主机与虚拟机互通局域网访问虚拟机配置难度典型场景NATdefault可以不可以需端口转发低测试环境、单机上外网桥接bridge可以可以中提供对外服务、集群实验macvtap默认受限可以中追求网络性能、少干预宿主机网络我的建议是不确定用哪种就先用默认的NAT把整套流程跑通等确实有对外暴露需求再切桥接。这样学习曲线平缓也不会因为网络配错把宿主机弄失联。3. 命令行把KVM组件装齐这是基础中的基础3.1 各发行版的核心软件包清单与作用图形化管理虽然好用但底层的组件必须先装齐virt-manager只是在这堆组件上的一个壳。这些包各管一段搞明白它们分别干什么后面出问题你能快速定位。我列一下常见包和它们的职责qemu-kvmRHEL系叫qemu-kvmDebian系现在也叫qemu-kvm或qemu-system-x86提供QEMU和KVM的对接是虚拟机的运行本体。libvirt-daemon-system/libvirtdlibvirt的守护进程和系统级配置管理虚拟机、网络、存储。libvirt-clients/libvirt-client提供virsh这套命令行工具。bridge-utils桥接网络需要的工具用NAT的话可以不装但桥接场景必备。virtinst/virt-install提供virt-install命令用命令行创建虚拟机时用。qemu-utils提供qemu-img等磁盘镜像管理工具。virt-manager图形化管理客户端。Ubuntu 24.04 / Debian 一套装下来sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients \ virtinst bridge-utils qemu-utils virt-managerRocky Linux 9 / AlmaLinux 9 / CentOS Stream 9sudo dnf install -y qemu-kvm libvirt libvirt-daemon-kvm \ virt-install virt-viewer virt-manager这里说一下virt-viewer它在RHEL系里经常和virt-manager一起装作用是单独打开虚拟机的显示窗口装系统的时候比在virt-manager大界面里点更清爽。Ubuntu上对应的是virt-viewer包一般会作为virt-manager的依赖装上。如果你的宿主机是无头的没有桌面环境那virt-manager其实可以不用装在服务器上本地电脑装一个就行具体我第4章讲。服务器上只要装到libvirt-daemon-system、libvirt-clients、qemu-kvm、virtinst这几样能跑起虚拟机和virsh就够了别在服务器上硬塞一整个桌面环境占空间又拖累系统。3.2 开启服务、做开机自启并验证包装完了服务得起来才能用。老版本RHEL和Ubuntu上管理的是libvirtd这个大守护进程新的系统里libvirt开始往模块化方向走拆成virtqemud、virtnetworkd这些细分的daemon但绝大多数发行版默认还是靠libvirtd统一拉起。保险起见先管libvirtdsudo systemctl enable --now libvirtd sudo systemctl status libvirtd看到active (running)就对了。Ubuntu 24.04上如果你同时装了libvirtd和模块化的socket可能会看到libvirtd.socket一般不影响正常使用virsh能连上就行。服务起来之后用virsh验证一下连接和默认网络virsh list --all virsh net-list --allvirsh list --all这时候会返回一张空表说明libvirt连上了只是还没有虚拟机。virsh net-list --all一般会看到一个名字叫default的网络状态可能是inactive未激活。把它启动起来并设置开机自启sudo virsh net-start default sudo virsh net-autostart default再敲一次virsh net-list状态变成active就正常了同时宿主机上会出现virbr0这块网卡。可以用ip addr show virbr0确认它拿到了192.168.122.1这个地址。还有个很好用但容易被忽略的体检命令专门用来检查宿主机是否满足虚拟化的各项要求virt-host-validate它会把CPU、内存、IOMMU、安全相关的一堆检查项列出来PASS的打勾WARN的提示你。比如它会提醒你IOMMU没开做设备直通才需要或者cgroup版本之类的。我一般装完必跑一遍心里有底。看到一堆PASS基本就可以放心往下走了。3.3 普通用户权限配置别什么都用root这里有个坑我替朋友填过好几次默认情况下普通用户用virsh或者virt-manager连的是qemu:///session这个用户级连接看到的虚拟机和系统级的qemu:///system不是一套。结果就是他在虚拟机管理界面里新建了一台机器换回命令行virsh list却看不到一脸懵。根因是权限没配好用了user session而不是system。正确做法是把当前用户加进libvirt和kvm这两个组sudo usermod -aG libvirt,kvm $USER加完要重新登录或者至少newgrp libvirt刷新一下组才生效。之后普通用户就能免sudo操作system级的libvirt了。Ubuntu上还有个额外步骤libvirt装了polkit规则一般sudo usermod之后配合重新登录就能用。如果还是提示权限不足检查一下/etc/libvirt/libvirtd.conf里有没有把auth_unix_ro和auth_unix_rw设置成none有些教程会这么改但我不建议这等于把门大开任何本地用户都能操作宿主机上的所有虚拟机安全性差。验证一下是否生效id | grep libvirt virsh -c qemu:///system list --all第二条命令如果不需要sudo就能正常返回表格权限就配好了。这一步做完后面无论是命令行还是图形界面都统一走qemu:///system不会再出现“两台不同的KVM”这种诡异现象。注意组权限的修改对已经登录的会话不生效。改完组之后不重新登录你会觉得改了没用其实是旧会话的凭据没刷新。这是新手最容易迷惑的点之一。4. 图形化管理工具本地装还是服务器装4.1 virt-manager的两种使用姿势和各自的适用场景到这一步底层已经通了接下来就是图形化这层怎么摆。我实际用下来有两种姿势各有各的好。第一种是在宿主机上直接装virt-manager。适合你的宿主机本身就有桌面环境或者是一台带显示器的台式机、工作站。装完之后直接在菜单里搜虚拟系统管理器Virtual Machine Manager打开就能用连接的就是本机的qemu:///system零配置。这种最简单推荐给用带屏机器的朋友。第二种是本地电脑装virt-manager远程管理无头服务器。这是我极力推荐给服务器用户的方式。你的服务器可能就一个SSH能进没桌面那完全没必要在上面硬装图形界面。你在自己常用的Windows、macOS或者Linux桌面机器上装一个virt-manager然后通过SSH连到服务器的libvirt去管理。图形界面跑在本地流畅服务器那边一点图形负担都没有。我为什么偏爱第二种因为它的画面显示是走SPICE或者VNC直连的配合SSH隧道加密比传统的X11转发整个virt-manager界面要顺畅得多。X11转发那种方式网络稍微抖动一下界面就卡成PPT而且每次连都得挂着一堆X11的包配置麻烦。而qemussh://这种连接方式virt-manager本地渲染界面、远程只拉取虚拟机列表和调用libvirt API虚拟机装系统的画面则通过一个自动建立的隧道传输体验好太多。4.2 本地virt-manager远程连接无头服务器手把手配假设你的服务器IP是192.168.1.100SSH用户是ops。本地机器以Linux桌面或Windows装好virt-manager为例这样操作先确认本地能SSH到服务器通常做一次密钥免密登录会更省心ssh-keygen -t ed25519 ssh-copy-id ops192.168.1.100然后在本地机器上如果装的是命令行版的virt-manager可以直接这样启动并连远程virt-manager -c qemussh://ops192.168.1.100/system如果你用的是图形界面那就打开virt-manager菜单栏File→Add Connection勾选Connect to remote host方法选SSH用户名填ops主机名填192.168.1.100然后点Connect。连上之后你在界面上看到的就是那台服务器的虚拟机资源新建、启停、看画面全都在这里完成。这里有个关键点服务器端的libvirtd用户要是ops能访问的。前面3.3节我们把ops加进了libvirt组那就没问题。但如果ops没有system libvirt权限连接会报权限错误。这时候要么给用户配组权限要么用qemussh://roothost/system这种不推荐直接用root要么配好polkit。另外一个坑服务器没有装virt-manager不代表连不上。远程连接时服务器端只需要libvirtd、qemu-kvm这些运行时的东西virt-manager纯客户端装在本地即可。这点很多人搞混以为服务器也得装一份。省下这个包服务器能清爽不少。提示如果连远程时报Cannot recv data: Connection reset by peer之类的错八成是服务器端的libvirtd没启动或者SSH用户的shell环境有问题。先ssh opshost systemctl status libvirtd确认一下服务状态。4.3 首次连接后要做的几件事存储池与连接确认连上之后先别急着建虚拟机有两件收尾工作做好后面省心。第一件是确认识别到的连接是system级。在virt-manager左侧列表里QEMU/KVM上面如果有个小箭头展开能看到system字样一般显示为QEMU/KVM默认就是system。双击它连接看到右侧显示主机名、内存、CPU等信息就对了。要是在列表里看到QEMU/KVM User session那就是连错级别了回去检查权限。第二件是存储池。libvirt有个default存储池默认路径通常是/var/lib/libvirt/images用来放虚拟机磁盘和ISO镜像。virsh pool-list --all能看它的状态。如果没激活用命令行建一下sudo virsh pool-define-as default dir --target /var/lib/libvirt/images sudo virsh pool-build default sudo virsh pool-start default sudo virsh pool-autostart default图形界面里对应在Edit→Connection Details→Storage标签页能看到default池绿色是激活状态。我习惯再单独建一个放ISO的池比如把ISO都丢到/var/lib/libvirt/images/iso/新建虚拟机选镜像的时候一眼就能找到不至于在一堆qcow2文件里翻。存储池和权限这两件小事的价值在于它们能让后续“新建虚拟机”这一步顺滑无比。否则你新建的时候发现镜像列表空空如也或者磁盘路径报权限拒绝又得回头折腾。5. 图形化界面新建虚拟机把系统装进去5.1 先建虚拟网络NAT和桥接各怎么配我建议在建虚拟机之前先把网络按你的需求准备好这样新建向导里直接选现成的网络干净利落。NAT网络基本不用建默认default就是。只要3.2节里你已经net-start并net-autostart了图形界面的网络列表里就能看到它直接选。桥接网络稍微多几步。先在宿主机上把物理网卡桥接起来。Ubuntu 24.04用netplan假设物理网卡是enp3s0编辑/etc/netplan/01-netcfg.yamlnetwork: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: false dhcp6: false bridges: br0: interfaces: [enp3s0] dhcp4: true parameters: stp: false forward-delay: 0这里最要紧的是物理网卡enp3s0下面不要再配IPIP要配到br0上。物理网卡只作为桥的成员接口。这是把宿主机网络搞断的头号原因——两边都留了IP网络路由一乱SSH当场就断。一定要用netplan try先试它会在120秒后自动回滚给你留退路sudo netplan try试通了再sudo netplan apply。配完ip addr应该能看到br0拿到了局域网IP而enp3s0只显示master br0。然后在libvirt里定义这个桥接网络存成br0.xmlnetwork namebr0/name forward modebridge/ bridge namebr0/ /network导入并启用sudo virsh net-define br0.xml sudo virsh net-start br0 sudo virsh net-autostart br0图形界面里Connection Details→Virtual Networks标签应该就能看到br0变成active了。注意桥接配置和生产网卡绑在一起改错可能失联。动手前最好有带外管理IPMI、串口能回得去或者在本地终端操作而不是SSH。RHEL系用nmcli或者/etc/sysconfig/network-scripts/下的ifcfg文件思路一致物理网卡挂到bridge上、IP配在bridge上。5.2 新建虚拟机向导逐项拆解每个选项背后的取舍打开virt-manager点左上角那个带加号的电脑图标或者File→New Virtual Machine向导就来了。我按步骤拆一下每一处都讲讲为什么这么选。第一步选安装来源。做全新系统安装就选Local install media (ISO image or CDROM)然后浏览选中你上传的ISO文件。virt-manager一般能自动识别出系统的类型和版本比如你挂Ubuntu 24.04的ISO它会自动把操作系统认成Ubuntu 24.04这个识别结果会用于后面的优化参数比如推荐的虚拟硬件、ACPI行为。如果没识别准手动在下拉里选对别让它默认成某个奇怪的通用值否则客户机可能需要额外驱动才能正常开机。第二步内存和CPU。内存给多少看客户机用途加宿主机的余量。跑一个纯命令行的Ubuntu Server测试机1GB到2GB够了跑图形界面的桌面版建议4GB起步Windows 10/11建议至少4GB到8GB低于4GB会卡得难受。CPU核数一般给2到4核除非宿主机核很多否则不建议一上来就给一半以上的核容易和宿主机抢资源。勾选Customize configuration before install这个选项我强烈建议勾上它会让你在建好之前进到一个细节配置界面可以顺手把磁盘总线改成virtio、网络模型改成virtio、加装virtio驱动ISO等等。不勾的话它会直接开装很多优化项就得装到一半再改很别扭。第三步磁盘。分配大小按需给qcow2格式的磁盘是精简置备的也就是你给40GB实际上文件大小会随数据增长不会一上来就占满40GB。所以放心给大一点40GB、60GB都行。磁盘总线记得用virtio性能比默认的IDE或SATA好一个台阶前提是客户机装了virtio驱动。Linux内核原生支持virtio没问题Windows需要额外挂载virtio-win驱动盘这个后面讲。第四步网络。下拉里选Virtual network default: NAT或者你建好的br0桥接。设备型号这里一定要从默认的e1000改成virtioe1000是模拟的Intel千兆网卡兼容性好但性能平庸virtio是半虚拟化网卡吞吐和延迟都强得多。Linux客户机原生支持Windows需要对应驱动。第五步在Customize configuration界面还可以顺手做几件事确认引导模式BIOS还是UEFI装某些新系统必须UEFI检查显示协议默认SPICE配合QXL或virtio-gpu看画面很流畅需要串口调试的可以加一个Serial设备。这些都确认完点Begin Installation虚拟机的画面窗口就弹出来了跟你坐在一台真机前装系统一模一样。5.3 通过虚拟机给服务器做系统以及装系统的实操细节有朋友问“通过KVM给服务器做系统”是什么操作我理解大致有两种含义我都说说。一种是用KVM虚拟机当作一个临时的Linux环境去做一些装机前的准备工作比如批量制作启动盘镜像、跑一些自动化脚本、准备PXE引导环境之类。因为虚拟机可以随时快照、回滚、删了重建折腾坏了不影响宿主机很适合做这种一次性、易出错的工作。另一种也是更直接的就是在KVM虚拟机里完整地装一遍服务器操作系统装好之后把这个磁盘镜像作为模板或者导出、克隆到别处使用。这在搭建标准化环境、复现问题、做培训环境时特别常见。具体到装系统的过程virt-manager弹出的那个窗口里操作跟真机无异。Ubuntu Server的安装向导是文字菜单式的方向键选、回车确认Ubuntu Desktop和Windows是图形化的鼠标键盘都能用。有几个细节值得提醒。首次启动顺序。虚拟机默认从硬盘启动第一次没有系统盘会自动回退到光驱引导一般不用手动干预。如果它没进安装界面在窗口里点进去按一下启动菜单键不同系统不一样比如SeaBIOS通常按EscUEFI按F2或者直接在virt-manager的Send Key菜单里发CtrlAltDelete重启看看引导顺序对不对。Windows虚拟机装virtio驱动。这是Windows客户机的必踩点。因为磁盘和网卡都用了virtioWindows安装程序一开始是认不到磁盘的会提示“找不到驱动器”。解决办法是在虚拟机配置里再加一个CDROM挂上virtio-win.iso这个镜像从官方渠道获取然后在Windows安装到“选择安装位置”那一步点“加载驱动程序”从virtio-win盘里选对应系统的vioscsi或viostor驱动目录装完后磁盘就出来了。网卡驱动同理装完系统后从virtio-win盘的NetKVM目录里装。这个过程第一次做会觉得麻烦做一次之后就有肌肉记忆了。内存和vCPU的热插拔。Linux客户机配合virtio-balloon和virtio驱动可以在不关机的情况下给虚拟机加内存前提是宿主机有富余。CPU热插拔支持得也不错但要注意客户机内核和配置得允许。日常实验用不上知道有这么回事就行。快照不是备份。装完系统、配好环境之后我习惯立刻打个快照virt-manager里点虚拟机详情→Snapshots→Add后面折腾坏了秒回滚。但一定要清楚快照和虚拟磁盘文件共用存储磁盘文件一旦损坏快照跟着一起完蛋它不能当备份用。真正的备份要么导出qcow2到别的存储要么用virsh dumpxml保存配置加上磁盘副本。装完之后图形界面里虚拟机条目会从“运行中”状态稳定下来你可以用virsh list在命令行确认它也在。NAT网络下虚拟机通过DHCP拿到192.168.122.x的地址宿主机直接ssh进去就行。桥接网络下虚拟机会从局域网DHCP拿到跟你同一网段的IP局域网任何机器都能访问。6. 常见问题速查与踩坑实录6.1 各类报错的原因与解决办法速查表KVM用久了你会发现大部分问题就那么几类我整理成对照表遇到问题先来这张表里对现象/报错可能原因排查与解决KVM is not available/ 无/dev/kvmBIOS未开启VT-x/AMD-V或CPU不支持进BIOS开虚拟化lsmod | grep kvm看模块是否加载kvm-ok检查Cannot access storage file ... Permission denied磁盘文件属主/权限不对libvirt以qemu用户访问磁盘放/var/lib/libvirt/images/下检查qemu用户对文件有读写权限SELinux/AppArmor策略virsh普通用户看不到自己建的虚拟机连的是qemu:///session而非qemu:///system用-c qemu:///system把用户加入libvirt组并重新登录虚拟机装好连不上网NATdefault网络未启动或防火墙拦截virsh net-list --all确认activeiptables/firewalld放行转发桥接后宿主机直接失联物理网卡和bridge都配了IP路由冲突物理网卡不配IPIP只配br0用netplan try留回滚虚拟机磁盘/网络性能差磁盘总线用了IDE/SATA网卡用了e1000改用virtio总线、virtio网卡确认客户机识别到virtio设备Windows安装时找不到磁盘未加载virtio存储驱动挂载virtio-win.iso安装界面手动加载驱动图形窗口卡顿、延迟大显示协议或显卡模型不合适SPICE配QXL/virtio-gpu远程连接走qemussh别整机X11转发虚拟机时间越走越偏时钟源和定时器设置不当客户机配chrony/ntp配置里把时钟设成localtime给Windows、utc给Linuxvirt-manager无法远程连接服务器libvirtd未启动或权限不足systemctl status libvirtd确认SSH用户有system级权限这张表覆盖了大概八九成的日常问题。用的时候有个小技巧报错信息里的关键词直接复制去查比整句去搜命中率高得多。libvirt和QEMU的报错往往写得很具体比如它明说“Permission denied on /path/to/file”那问题就在权限不用瞎猜。6.2 那些文档里不会写的实操心得最后分享几个我这些年攒下的、几乎是踩坑踩出来的经验常规教程里基本不提但能帮你省不少时间。第一无头服务器永远优先用qemussh的远程virt-manager别在服务器上装桌面。服务器装桌面环境一来占资源二来升级维护一堆图形包很烦三来服务器本来就不该干这个。远程管理的方式干净、安全虚拟机的图形画面照样看得到而且因为画面走的是独立隧道比在本机上X11转发整个管理界面流畅得多。这个决定会让你的服务器长期受益。第二宿主机唯一网卡做桥接要极其小心最好有带外管理。我见过不止一个人把生产服务器的唯一网卡桥接配错SSH瞬间断人又在异地只能等机房现场救援。桥接这操作本身没问题风险在于你没有回退通道。所以要么用netplan try这种带自动回滚的机制要么在本地终端操作要么确保有IPMI能远程回车。总之动手前先想好“万一断了我怎么回去”。第三性能敏感就用virtio兼容优先才用e1000和IDE。虚拟机的磁盘和网络virtio和传统模拟设备的性能差距是肉眼可见的尤其是磁盘IO。代价是Windows需要额外驱动。所以我的选择是Linux客户机一律virtioWindows装好驱动后也切virtio。只有在装系统的引导阶段、驱动还没加载时才临时用兼容设备装完再调优。第四qcow2给实验用raw或裸设备给性能用。qcow2支持快照、精简置备、压缩做实验、做开发环境极其方便磁盘文件还能随便拷来拷去。但如果是要跑数据库这种对磁盘IO极其敏感的负载qcow2有一层额外的元数据开销这时候可以考虑raw格式的磁盘文件或者更进一步用LVM逻辑卷直接做虚拟机磁盘。所以磁盘格式的选择要看你跑什么别一刀切。第五快照和备份是两码事务必分开对待。快照就存在你的磁盘文件旁边本质是“时间点标记”用来快速回滚备份是独立的副本用来灾难恢复。把快照当备份等磁盘文件损坏那天你会哭。我的做法是重要的虚拟机定期用qemu-img convert或者直接复制整份qcow2到别的存储宿主机再配个定时任务图个安心。第六定期跑一遍virt-host-validate。这个命令就像给宿主机做体检系统内核升级、装了新驱动、改了安全策略之后跑一下能提前发现隐患。我把它和virsh net-list、virsh list --all放在一起作为每次登上一台宿主机后的例行操作几十秒的事能避免很多临到用时才发现的问题。我在实际使用中发现把基础设施的这些细节一次做到位后面无论是要快速起几十个测试环境还是临时复现一个线上问题都从容得多。反之桥接配得迷迷糊糊、权限理得不清不楚每一次新建虚拟机都是一次新的踩坑。
返回列表