简介:面向希望在Windows环境中零安装体验Linux的初学者、教学演示者与轻量测试用户,这套Qume迷你虚拟机把精简虚拟机程序与LiveCD系统映像打包在一起,解压后运行启动脚本即可进入图形桌面,不必安装也无需重启,适合快速尝鲜、临时演示以及在低配置机器上做简单操作。压缩包共14个文件,整体约48.45MB,主要由可执行程序与批处理启动脚本、ISO系统映像、虚拟BIOS和显卡固件等二进制文件,以及说明文档、网页资料和动态链接库组成,分别承担运行引导、设备模拟、操作提示与资料查阅等用途,体积虽小但组成完整。目前已有926人学习下载。读者可借助附带的英文说明和使用文档了解内存、光驱、网络等启动参数,并通过快捷键释放鼠标、调整显示分辨率与网络设置,在Windows 98至2003等旧平台上快速搭建一个可用的Linux体验环境,用于熟悉Linux桌面与基础操作。
1. 五十兆的 Linux 虚拟机,装之前先把「够不够用」算清楚
第一次拿到 Qume 这个只有 50M 的 Linux 虚拟机,我把它当成一个裁剪脚本,直接复制到虚拟机目录里双击启动。屏幕黑了整整两分钟:不是镜像坏了,而是宿主机的 KVM 没有启用,QEMU 退回纯软件模拟,一个 50M 的系统运行起来像十年前的笔记本一样慢。装轻量 Linux 虚拟机时这种情况特别常见:镜像小到让人放松警惕,反而忽略 CPU 虚拟化、/dev/kvm权限、镜像格式这几件真正决定体验的事。Qume 适合需要在本地快速拉起一个干净 Linux 环境做验证的人:写脚本、测编译、跑一次性任务,用完删掉也不觉得可惜;也适合宿主机内存紧张、开不动完整发行版虚拟机的场景。装不好会怎样?开机卡死、网络不通、镜像被写坏,基本几分钟内就能全部遇到。
2. 环境准备与版本选型:CPU 虚拟化、KVM 权限和 QEMU 装哪个包
Qume 本身只有 50M,但它不是「双击就能跑」的绿色软件,它依赖宿主机提供硬件虚拟化能力。这一章要解决的是三个前置问题:宿主机到底支不支持、QEMU 装哪个包、文件放在哪儿。这三件事任何一件没做对,后面所有参数都白调。我一般会把这一章当成一次性的环境检查,做完记在笔记里,下次换机器直接照着跑一遍。
2.1 用三条命令确认宿主机能不能跑
先不要急着下载镜像,先在宿主机上确认三件事:CPU 是否暴露虚拟化指令集、内核模块是否加载、当前用户有没有权限访问/dev/kvm。这三条命令在 Debian、Ubuntu、RHEL、openEuler 上通用。
# 1. 看 CPU 是否带 vmx(Intel)或 svm(AMD),输出大于 0 才算支持 grep -Eoc '(vmx|svm)' /proc/cpuinfo # 2. 看 KVM 内核模块是否已经加载,正常应能看到 kvm_intel 或 kvm_amd lsmod | grep kvm # 3. 看设备节点存不存在、权限是什么,正常是 crw-rw---- root kvm ls -l /dev/kvm # 4. 看当前用户是否在 kvm 组里 id第一条输出0,说明虚拟化在 BIOS/UEFI 里被关掉了,或者这台机器本身就是虚拟机且没有开启嵌套虚拟化,这时候只能退回软件模拟(-accel tcg),能跑但会慢一个数量级。第二条没有任何输出,说明模块没加载,常见原因是 BIOS 里虚拟化开关没开,或者内核参数里带了kvm-intel.enable=0之类的限制。第三条如果提示「没有那个文件或目录」,那么模块加载失败,先回头查第二条。
第四条最容易被跳过。/dev/kvm默认属主是root、属组是kvm,普通用户不在这个组里,QEMU 启动时就会报Could not access KVM kernel module: Permission denied并自动降级到软件模拟。表现出来的现象是「能开机但慢得离谱」,很多人误以为是 Qume 镜像本身重,其实只是权限没给。
# 把当前用户加入 kvm 组,需要重新登录或 newgrp 才生效 sudo usermod -aG kvm "$USER" # 不想退出登录的话,用 newgrp 临时切换当前 shell 的组 newgrp kvm # 验证:应该能直接读到设备节点,不报权限错误 test -r /dev/kvm && test -w /dev/kvm && echo "kvm ok"usermod -aG里的-a千万别丢,丢了会把用户从其他附加组里踢出去,这是血泪经验。newgrp只对当前终端生效,新开的终端还是要重新登录。
提示:如果你在容器里跑 Qume,
/dev/kvm需要显式透传进去,并且宿主机本身要支持嵌套虚拟化,否则同样会退回软件模拟。
2.2 QEMU 装哪个包,版本怎么选
Qume 的镜像格式是 qcow2,能跑它的虚拟化软件不止一个,但最省事的是 QEMU:不需要额外内核、不需要图形化管理端,一条命令就能起。装包这件事上我的建议很明确:不要自己编译最新版,用发行版仓库里仍在维护的稳定包。理由很实际:自编译的 QEMU 依赖版本一升级就容易出现链接问题,而你只是想跑一个 50M 的 Linux 虚拟机,犯不上。
不同发行版的包名不一样,这是新手第一个卡点:
| 发行版系 | 需要装的包 | 说明 |
|---|---|---|
| Debian / Ubuntu | qemu-system-x86、qemu-utils | qemu-utils提供qemu-img,管镜像必备 |
| RHEL / CentOS Stream / openEuler | qemu-kvm、qemu-img | 部分仓库把工具拆分到独立包 |
| Arch 系 | qemu-full或qemu-base | qemu-base够用,qemu-img已包含 |
# Debian / Ubuntu 系 sudo apt update sudo apt install -y qemu-system-x86 qemu-utils # RHEL / openEuler 系 sudo dnf install -y qemu-kvm qemu-img # 装完确认版本和可执行文件路径 qemu-system-x86_64 --version qemu-img --version装完先看qemu-system-x86_64 --version能不能正常输出版本号。如果提示找不到命令,多半是包名不对或者装在/usr/libexec下没有进 PATH,用command -v或rpm -ql、dpkg -L查一下文件落到哪了。
版本取舍上还有一个细节:老发行版仓库里的 QEMU 对virtio-blk、virtio-net的支持可能不完整,直接后果是启动命令里写了if=virtio却识别不到磁盘。判断方法很简单,跑到第 3 章启动那一步时如果 guest 里lsblk看不到vda,基本就是这个问题。这种情况有两个选择:换成if=ide或if=scsi先跑通,或者升级到发行版仍在维护的版本。我一般选后者,因为 virtio 带来的 I/O 提升在轻量系统上感知很明显。
2.3 目录规划:镜像、快照、日志分开放
50M 的镜像本身不占地方,但 qcow2 是写时复制格式,guest 里每写一个字节,文件就会长大。跑一阵子之后镜像变成几百兆甚至几个 G 是常事。再加上快照和日志,最好一开始就把目录分开。
# 建一个独立目录,镜像、快照、日志各占一层 mkdir -p ~/qume/{images,snapshots,logs} # 后续启动时把这些路径都用绝对路径写进命令里,避免切目录后找不到文件为什么强调绝对路径?因为-drive file=./xxx.qcow2这种写法依赖当前工作目录,一旦你在别的目录里执行启动脚本,QEMU 会直接报找不到磁盘文件,而错误信息往往被-nographic的串口输出盖住,让你误以为镜像坏了。我现在的习惯是写一个小启动脚本,脚本里所有路径都是绝对路径,cd到哪儿都不影响。
另外,qcow2 的元数据在异常断电或强杀进程时可能损坏,所以要给qemu-img check留出使用空间。如果宿主机的文件系统对fallocate支持不好(比如某些网络挂载盘),qcow2 的预分配会退化成写零,启动时会卡很久,这种情况换到本地磁盘就正常了。
3. 镜像落盘与首次开机:qemu-system-x86_64 的参数逐个拆
环境验完,接下来是真正把它跑起来。这一章的节奏是:先确认拿到手的 Qume 镜像没坏,再一条一条拆启动参数,最后讲串口控制台怎么进出。第一次启动失败是常态,关键是能看懂报错指向哪一段。
3.1 用 qemu-img info 和 sha256 先给镜像做体检
镜像拿到手,第一件事不是启动,是确认它是什么格式、多大、有没有快照链。qcow2 和 raw 的差别很大:raw 是裸镜像,qemu-img resize之后必须自己处理分区表;qcow2 是带元数据的,能直接打快照、能压缩、能扩容。用错命令会把镜像写坏。
# 看镜像格式、虚拟大小、实际占用、是否带快照 qemu-img info ~/qume/images/qume-linux-50m.qcow2 # 校验完整性,把输出的哈希和源站给的值比对 sha256sum ~/qume/images/qume-linux-50m.qcow2qemu-img info的输出里有几个字段值得逐一看:
file format:必须是qcow2。如果显示raw,说明你拿到的是裸镜像,后面所有qemu-img snapshot的命令都不能用。virtual size:这是 guest 看到的磁盘大小,通常比disk size大很多。50M 指的是文件实际占用,不是 guest 的可用空间。disk size:文件真实占用。如果它比预期大出好几倍,说明这个镜像已经被跑过并写入了数据,不是全新状态。Snapshot list:如果这里已经有快照,说明镜像被人用过,后续做扩容时要特别小心,内部快照和resize一起用容易出问题。
sha256sum这一步看着啰嗦,但镜像传输中断导致后半段是零字节的情况真不少见,现象是 QEMU 能启动但 guest 内核 panic。花十几秒校验,比后面排查半天划算。
提示:校验值对不上就不要凑合启动。qcow2 的元数据损坏后,guest 写入可能进一步破坏文件,
qemu-img check也未必救得回来。
3.2 启动命令:六个参数决定它是飞快还是慢如蜗牛
下面这条是我平常用的启动命令,先贴出来,再逐行拆。你可以直接复制,把路径换成自己的。
qemu-system-x86_64 \ -enable-kvm \ -machine q35 \ -cpu host \ -smp 2 \ -m 512 \ -drive file=/home/you/qume/images/qume-linux-50m.qcow2,if=virtio,format=qcow2,cache=writeback \ -netdev user,id=net0,hostfwd=tcp:127.0.0.1:2222-:22 \ -device virtio-net-pci,netdev=net0 \ -rtc base=utc,clock=host \ -nographic逐个参数说清楚,因为它们是最常被抄错的地方:
-enable-kvm:开启硬件加速。这是性能的分水岭,缺了它 Qume 会慢到让人怀疑镜像有问题。前提是 2.1 里那几条检查全过。-machine q35:模拟 Intel Q35 芯片组,支持 PCIe,对 virtio 设备更友好。老写法-machine pc也能跑,但 virtio 的兼容性差一些。-cpu host:把宿主机 CPU 特性直通给 guest。如果不写,QEMU 会给一个很保守的默认 CPU 模型,某些需要特定指令集的程序会报 illegal instruction。-smp 2:给 guest 两个 vCPU。50M 的系统一般用不到更多,给多了反而增加调度开销。宿主机核数少的时候给 1 就行。-m 512:512M 内存。这个值不是越大越好,轻量系统 256M 就能跑,512M 是比较舒服的余量。低于 256M 时某些内核会在启动阶段 OOM。-drive ...,if=virtio,format=qcow2,cache=writeback:这块拆开讲。if=virtio指定虚拟磁盘总线,性能最好;format=qcow2显式声明格式,这一项一定要写,否则 QEMU 会去猜格式,猜错就可能把镜像当 raw 写坏;cache=writeback让宿主机页缓存接管写入,速度快,代价是宿主机异常断电时可能丢数据。-netdev user,...和-device virtio-net-pci,...:一对,前者定义后端网络,后者定义 guest 看到的网卡。hostfwd=tcp:127.0.0.1:2222-:22把宿主机的 2222 端口转发到 guest 的 22 端口,注意这里写的是127.0.0.1,只有本机能连,第 4 章会专门讲这个限制。-rtc base=utc,clock=host:让 guest 时钟跟随宿主机。不写的话 guest 时间可能偏几个小时,apt之类的操作会因为证书时间校验失败而报错。-nographic:不开图形窗口,把串口输出直接重定向到当前终端。这是跑轻量 Linux 虚拟机最舒服的方式,也省掉了 X11 转发的一堆麻烦。
如果 2.2 里提到的 virtio 兼容问题真的出现,把if=virtio换成if=ide先跑通,进去之后再回头查驱动。这是典型的「先让它亮起来,再让它跑得快」。
3.3 串口控制台:怎么进去、怎么退出、怎么正常关机
-nographic模式下,终端就是 guest 的串口控制台。开机日志会一行行刷出来,看到login:就说明启动完成。默认账号密码要看镜像说明,Qume 这类轻量镜像一般是root加空密码或者固定密码。
进去之后最容易被卡住的不是登录,是退出。很多人下意识按Ctrl+C,结果这个信号被传给了 guest,运气不好会把正在跑的命令打断。正确的退出方式是:
# 先按 Ctrl-A,松开,再按 X,QEMU 直接退出 # 如果想进 QEMU 自己的监视器(monitor),按 Ctrl-A 再按 C这个Ctrl-A是 QEMU 在-nographic模式下的转义前缀,所有控制指令都以它开头。记不住的话还有另一种写法,把监视器和串口分开:
# mon:stdio 表示监视器走标准输入输出,串口单独暴露 qemu-system-x86_64 \ -enable-kvm -m 512 \ -drive file=/home/you/qume/images/qume-linux-50m.qcow2,if=virtio,format=qcow2 \ -serial mon:stdio -nographic关机也有讲究。在 guest 里执行poweroff是最稳的,等终端打出reboot: Power down之后 QEMU 会自己退出。如果卡住不动,先按Ctrl-A再按X。最不该做的事是在宿主机上kill -9QEMU 进程,cache=writeback模式下,页缓存里还有一堆没落盘的块,强杀很可能让 qcow2 的元数据和实际数据对不上。真遇到了,用qemu-img check查一遍:
# 检查镜像一致性,只读模式,不改动文件 qemu-img check ~/qume/images/qume-linux-50m.qcow2 # 如果报出可修复的错误,加 -r leaks 只修复泄漏的簇,相对安全 qemu-img check -r leaks ~/qume/images/qume-linux-50m.qcow2-r后面的策略要慎选,all会尝试修复所有错误,但修复过程本身也可能改坏数据。我的做法是先备份一份镜像副本,再在副本上修,修好了再替换。
4. 网络与存储配置:hostfwd 端口转发、桥接和 qcow2 扩容
能登录只是第一步,真正让它变得有用的是网络和磁盘。这一章解决三个具体问题:本机怎么 ssh 进去、局域网里其他机器怎么访问、磁盘写满了怎么扩。这三件事在轻量 Linux 虚拟机上踩坑率极高,因为默认配置都是「最小可用」,不是「够用」。
4.1 user 模式网络:hostfwd 默认只听 127.0.0.1
上一章的启动命令里写了hostfwd=tcp:127.0.0.1:2222-:22,很多人配完之后发现自己电脑能 ssh,同事的电脑连不上,以为是防火墙问题,其实是这一行写死了回环地址。
# 只允许本机访问,最安全,日常开发够用 -netdev user,id=net0,hostfwd=tcp:127.0.0.1:2222-:22 # 允许局域网访问,注意这会把端口暴露出去 -netdev user,id=net0,hostfwd=tcp:0.0.0.0:2222-:22 # 连宿主机的监听地址都不写,等价于监听所有地址,谨慎使用 -netdev user,id=net0,hostfwd=tcp::2222-:22hostfwd的格式是协议:监听地址:宿主机端口- guest地址:guest端口。中间那个-是分隔符,不是减号,写错位置会直接报语法错误。guest 地址留空表示由 QEMU 自己决定,一般是 10.0.2.15。
连上去之后还有两个细节要注意。第一,user 模式网络下 guest 是拿不到真实局域网 IP 的,它看到的是 QEMU 内置的 NAT,网关固定是10.0.2.2,DNS 是10.0.2.3。第二,guest 主动往外发起的连接没问题,外部主动连 guest 只能靠hostfwd一条条映射,映射 22 就只能 ssh,想跑 Web 服务得再加一条hostfwd=tcp:127.0.0.1:8080-:80。
# 多条端口映射用逗号接在同一个 hostfwd 后面 -netdev user,id=net0,hostfwd=tcp:127.0.0.1:2222-:22,hostfwd=tcp:127.0.0.1:8080-:80注意:
0.0.0.0监听意味着同网段任何人都能连,轻量镜像的默认密码通常很弱,暴露前先改密码或者干脆只监听回环。
4.2 桥接网络:让 guest 拿到局域网真实 IP
需要 guest 被局域网其他机器直接访问时,user 模式就不够用了,得走桥接。桥接的原理是在宿主机上建一个网桥,把物理网卡挂上去,再用qemu-bridge-helper给 QEMU 分配 tap 设备。
# 1. 安装桥接工具(Debian/Ubuntu) sudo apt install -y bridge-utils # 2. 建网桥并把物理网卡挂上去,网卡名按实际改(ip link 查看) sudo ip link add name br0 type bridge sudo ip link set br0 up sudo ip link set enp3s0 master br0 # 3. 给网桥配地址(如果是 DHCP,用 dhclient br0) sudo ip addr add 192.168.1.50/24 dev br0 sudo ip route add default via 192.168.1.1 # 4. 允许 QEMU 使用 br0,写进 helper 的配置文件 echo "allow br0" | sudo tee /etc/qemu/bridge.conf sudo chmod 0644 /etc/qemu/bridge.conf第 4 步是最常漏的一步。qemu-bridge-helper出于安全考虑默认不允许任何网桥,不加allow br0就会报failed to create bridge或者Operation not permitted。另外这个文件权限必须是 0644 且属主 root,权限放宽会直接拒绝加载。
启动参数相应改成:
# 用 tap 后端替代 user 后端 qemu-system-x86_64 \ -enable-kvm -m 512 \ -drive file=/home/you/qume/images/qume-linux-50m.qcow2,if=virtio,format=qcow2 \ -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \ -device virtio-net-pci,netdev=net0 \ -nographicscript=no,downscript=no表示不让 QEMU 调用外部脚本去配置 tap 设备,因为网桥已经提前建好了。如果你的环境需要动态配置,去掉这两项并写好脚本也行,但调试成本会高不少。
guest 内部还得配地址。轻量镜像一般用 ifupdown,配置文件在/etc/network/interfaces:
# /etc/network/interfaces 片段,网卡名按 guest 内 ip link 的结果改 auto eth0 iface eth0 inet static address 192.168.1.60 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1如果你的 Qume 里用的是 systemd-networkd 或 netplan,改对应的.network或.yaml文件,内容逻辑一样:地址、掩码、网关、DNS 四件套。改完systemctl restart networking或者重启 guest 生效。
4.3 磁盘写满:resize、growpart、resize2fs 三步走
50M 的镜像,guest 里可用空间通常也就几百兆,装两个包就满了。扩容分宿主机和 guest 两步,少一步都不生效。
# 第一步:宿主机上给 qcow2 加 8G,必须在虚拟机关机状态下做 qemu-img resize ~/qume/images/qume-linux-50m.qcow2 +8G # 确认虚拟大小变了 qemu-img info ~/qume/images/qume-linux-50m.qcow2+8G的加号表示在原有基础上增加,不带加号则是设置成绝对值,写错会把镜像缩小——qcow2 缩小是允许的,但 guest 里超出新大小的数据会直接丢失。
第二步进 guest,把分区表扩到新容量:
# 查看磁盘和分区现状,确认设备名(一般是 vda、vda1) lsblk sudo growpart /dev/vda 1 # 如果是 ext4 文件系统 sudo resize2fs /dev/vda1 # 如果是 xfs sudo xfs_growfs / # 确认容量已经变了 df -h /三步里最容易漏的是growpart。只做qemu-img resize,lsblk里vda变大了但vda1没变,df自然也看不出变化,很多人到这儿就以为扩容失败了。growpart有些精简系统里没预装,用apt install cloud-guest-utils或者dnf install cloud-utils-growpart补上。
4.4 快照与瘦身:qemu-img snapshot 和 convert -c
轻量虚拟机的优势之一是可以随便折腾,折腾坏了回滚就行。qcow2 支持内部快照,命令很简单,但时机很重要。
# 打快照,建议虚拟机关机后做,运行中做需要配合 monitor 的 savevm qemu-img snapshot -c baseline ~/qume/images/qume-linux-50m.qcow2 # 列出所有快照 qemu-img snapshot -l ~/qume/images/qume-linux-50m.qcow2 # 回滚到某个快照 qemu-img snapshot -a baseline ~/qume/images/qume-linux-50m.qcow2 # 删除快照释放空间 qemu-img snapshot -d baseline ~/qume/images/qume-linux-50m.qcow2-c是创建,-a是应用(回滚),-d是删除。回滚之后 guest 里那段时间的改动全部丢失,包括你刚写好的配置文件,所以打快照的时机应该是「配置完成、验证通过」之后,不是「准备开始折腾」之前。
用久了镜像会越来越胖,因为 qcow2 只增不减。瘦身用convert重写一遍:
# 转成新的 qcow2 并压缩,-c 表示压缩数据簇 qemu-img convert -O qcow2 -c \ ~/qume/images/qume-linux-50m.qcow2 \ ~/qume/images/qume-linux-50m-slim.qcow2注意convert出来的是新文件,不带任何快照,原来的快照链全丢。所以正确顺序是先确认不需要回滚了,再 convert,然后删掉旧文件。另外-c压缩会增加 CPU 开销,读取频繁的场景感知会明显,日常用可以不加。
5. 避坑与排查:五条装 Qume 时最常翻车的记录
下面这五条都是我自己踩过或者帮别人定位过的,按「开机 → 网络 → 存储」的顺序排。每条都写清楚现象、原因、解决,遇到问题时按顺序对号入座就行。
5.1 开机阶段:慢得离谱和黑屏卡住
第一条:能启动但慢到无法使用
现象:QEMU 进程起来了,串口日志一行行往外爬,登录要等好几分钟,进去之后敲命令有明显延迟。
原因:-enable-kvm没生效,QEMU 静默降级到 TCG 软件模拟。触发原因有三种——BIOS 里虚拟化没开、/dev/kvm权限不够、宿主机本身是虚拟机且没开嵌套虚拟化。
解决:按 2.1 的三条命令逐项排查。权限问题用usermod -aG kvm加组后重新登录;BIOS 问题只能重启进固件设置开Intel VT-x或AMD-V;嵌套虚拟化需要在宿主机上给这层虚拟机开启对应特性。排查完之后在启动命令里显式写上-accel kvm而不是-enable-kvm,这样 KVM 不可用时 QEMU 会直接报错退出,而不是悄悄降级——这个改动让我少走了很多弯路。
第二条:-nographic启动后黑屏,没有任何输出
现象:命令执行后终端一片空白,按回车也没反应,但ps能看到 QEMU 进程活着。
原因:镜像的引导方式和控制台不匹配。-nographic是把串口重定向到终端,如果镜像默认只往 VGA 输出、串口没配置console=ttyS0,那终端上自然什么都没有。
解决:先确认镜像支持串口控制台。临时办法是去掉-nographic,改用-display curses或者直接开图形窗口,看到画面就说明镜像本身没问题。长期办法是在 guest 的引导参数里加console=ttyS0,115200,或者在镜像内配置好串口 getty。改引导参数可以在启动时进 GRUB 编辑,也可以挂载镜像修改/etc/default/grub后重新生成配置。
5.2 网络阶段:连不上和时通时不通
第三条:hostfwd配了但局域网连不上
现象:宿主机ssh -p 2222 user@127.0.0.1正常,同网段另一台机器连同一端口超时。
原因:hostfwd写的是tcp:127.0.0.1:2222-:22,只监听回环地址。QEMU 的默认行为就是绑定127.0.0.1,这是安全设计,不是 bug。
解决:把监听地址改成0.0.0.0,或者干脆留空(hostfwd=tcp::2222-:22)。改之前先想清楚这个端口暴露给谁,轻量镜像的默认口令往往很弱,暴露前至少改掉 root 密码、关掉密码登录只留密钥。另外宿主机若有防火墙,还要放行对应端口,firewall-cmd --add-port=2222/tcp或者ufw allow 2222/tcp。
第四条:guest 里能 ping 通 IP,但域名解析失败
现象:ping 10.0.2.2正常,ping任何域名都报unknown host。
原因:user 模式网络的 DNS 由 QEMU 内置的10.0.2.3提供,如果 guest 的/etc/resolv.conf是空的,或者被别的管理工具覆盖了,解析就失败。
解决:往/etc/resolv.conf里写nameserver 10.0.2.3。如果是桥接模式,就写宿主机的实际 DNS 或者上游 DNS。注意很多系统上resolv.conf会被systemd-resolved或者 NetworkManager 覆盖,改完重启网络又变回去,这种情况要改的是上层配置而不是这个文件本身。验证方法很直接:cat /etc/resolv.conf看一眼有没有被改回去。
5.3 存储阶段:扩容不生效和镜像损坏
第五条:qemu-img resize之后df没变化
现象:宿主机上qemu-img info显示 virtual size 已经变大,进 guest 之后lsblk里vda也变大了,但df -h还是原来的容量。
原因:只扩了虚拟磁盘,没扩分区表和文件系统。这是三个独立层次:块设备、分区、文件系统,缺一层都不生效。
解决:按 4.3 的顺序走一遍growpart加resize2fs。如果growpart报NOCHANGE,说明分区已经占满整个磁盘,直接跳到resize2fs。如果报unable to satisfy partition requirements,多半是分区表类型问题,MBR 分区表有 2T 上限,超过就得转 GPT。
还有一条要单独说:镜像损坏。现象是启动时报qcow2: Image is corrupted或者 guest 内核 panic。原因通常是宿主机被强制断电、或者用kill -9杀了 QEMU 进程,cache=writeback下页缓存没来得及落盘。解决分两步:先qemu-img check看错误类型,leaks类错误可以-r leaks修,corrupted类错误修复风险高,先复制一份镜像再在副本上尝试。真正靠谱的做法是预防——用poweroff正常关机,或者把cache=writeback换成cache=none牺牲一点性能换一致性。
6. 装完怎么验证跑通:一条从开机到 ssh 的检查链
装完不等于跑通。我现在的习惯是每次搭完环境都走一遍固定检查链,任何一环不通就不往下走。这套检查在 Qume 上尤其有用,因为它太小了,出问题时日志量也少,很容易漏掉关键信息。
检查链一共五环,按顺序做:
| 环节 | 检查命令 | 通过标准 |
|---|---|---|
| 硬件加速 | qemu-system-x86_64 -accel kvm -version | 不报 KVM 相关错误 |
| 镜像完整性 | qemu-img check 镜像路径 | 输出No errors were found |
| 开机 | 启动后看串口日志 | 出现login:提示符 |
| 网络 | ssh -p 2222 user@127.0.0.1 | 能登录并执行uname -a |
| 存储 | guest 内df -h / | 容量符合预期,不是初始值 |
前两环可以在启动前做,后面三环必须在运行中做。嫌一条条敲麻烦的话,把前两环写成一个脚本:
#!/usr/bin/env bash # 启动前自检:加速可用性 + 镜像完整性 set -u IMG="$HOME/qume/images/qume-linux-50m.qcow2" # 检查 KVM 设备是否可读写 if [ ! -r /dev/kvm ] || [ ! -w /dev/kvm ]; then echo "FAIL: /dev/kvm 不可读写,检查 kvm 组和权限" exit 1 fi # 检查镜像格式是否真的是 qcow2 FMT=$(qemu-img info --output=json "$IMG" | grep -o '"format": "[^"]*"' | cut -d'"' -f4) if [ "$FMT" != "qcow2" ]; then echo "FAIL: 镜像格式是 $FMT,不是 qcow2" exit 1 fi # 检查镜像一致性,-q 只输出错误 if ! qemu-img check -q "$IMG"; then echo "FAIL: 镜像存在一致性错误,先备份再修复" exit 1 fi echo "PASS: 启动前自检通过"脚本里三个判断对应三件最容易出问题的事:设备权限、格式误判、镜像损坏。--output=json是为了让格式字段能被稳定提取,比解析人类可读输出靠谱。set -u保证变量没定义时直接报错退出,避免空字符串被当成路径传下去。
后三环没法脚本化,但有个小技巧能省时间:启动时把串口日志同时落到文件,-nographic后面接2>&1 | tee ~/qume/logs/boot.log。这样开机失败时不用重跑,直接翻日志找第一个error或panic,比盯着终端滚屏靠谱得多。
验证通过之后,把启动命令固化成脚本,参数注释写清楚,下次换机器直接改路径就能复用。从那以后我每次装这类轻量虚拟机,都强制走一遍这五环检查——不是不信任自己的手速,是这五十兆的系统太容易被当成「随便跑跑」,而恰恰是它,让我在权限和镜像格式上栽过最多的跟头。希望帮到你。
本文还有配套的精品资源,点击获取