QEMU 虚拟化环境搭建与优化指南
1. 软件准备
1.1. 下载qemu-w64-setup-*.exe
- 地址:
https://qemu.weilnetz.de/w64/ - 验证文件完整性
- 确保脚本保存为 ANSI 或 GBK 编码(推荐使用 Notepad 等编辑器保存为 ANSI 编码)。
- verify-hash.bat:
@echo off
setlocal EnableDelayedExpansion
:: 设置 CMD 编码为 GBK 以正确显示中文
chcp 936 >nul
set "file_to_verify=qemu-w64-setup-20250422.exe"
set "hash_file=qemu-w64-setup-20250422.sha512"
echo 正在验证 %file_to_verify% 的 SHA-512 哈希值...
:: 检查文件和哈希文件是否存在
if not exist "%file_to_verify%" (
echo 错误:未找到 %file_to_verify%!
exit /b 1
)
if not exist "%hash_file%" (
echo 错误:未找到 %hash_file%!
exit /b 1
)
:: 计算文件的 SHA-512 哈希值
for /f "tokens=*" %%i in ('certutil -hashfile "%file_to_verify%" SHA512 ^| findstr /v "hash"') do set "computed_hash=%%i"
set "computed_hash=%computed_hash: =%"
:: 从 .sha512 文件中读取预期哈希值(只取第一个字段)
for /f "tokens=1" %%i in (%hash_file%) do set "expected_hash=%%i"
set "expected_hash=%expected_hash: =%"
:: 比较哈希值
if /i "!computed_hash!"=="!expected_hash!" (
echo 成功:%file_to_verify% 的哈希值与预期哈希值匹配。
) else (
echo 错误:哈希值不匹配!
echo 计算得到的哈希值:!computed_hash!
echo 预期的哈希值:!expected_hash!
)
endlocal
pause
- 执行结果
E:\software\qemu>test-hash.bat
正在验证 qemu-w64-setup-20250422.exe 的 SHA-512 哈希值...
成功:qemu-w64-setup-20250422.exe 的哈希值与预期哈希值匹配。
请按任意键继续. . .
1.2. Tap-windows
Tap-windows 是 OpenVPN 等虚拟专用网络(VPN)软件在 Windows 系统上使用的虚拟网络驱动程序,用于创建 TAP(网络隧道)设备,使计算机能够模拟一个虚拟网络接口,从而接入 VPN 网络。
https://github.com/OpenVPN/tap-windows6/releases/tag/9.27.0
http://swupdate.openvpn.net/community/releases/tap-windows-.exe
http://swupdate.openvpn.net/community/releases/tap-windows-.zip
http://build.openvpn.net/downloads/releases (browseable)
http://build.openvpn.net/downloads/releases(可浏览)
https://build.openvpn.net/downloads/releases/
1.2.1. 主要功能
虚拟网络接口:
- Tap-windows 在 Windows 上创建一个虚拟网卡(如
TAP-Windows Adapter V9
),使计算机可以像连接物理网络一样接入 VPN。 - 该虚拟网卡会获得一个 IP 地址(通常由 VPN 服务器分配)。
- Tap-windows 在 Windows 上创建一个虚拟网卡(如
支持 VPN 协议:
- 主要用于 OpenVPN,但某些其他 VPN 软件(如 SoftEther VPN、WireGuard 的部分实现)也可能使用它。
隧道通信:
- 数据通过 TAP 设备加密传输到 VPN 服务器,再转发到互联网或其他内网设备,实现安全通信。
1.2.2. 常见用途
- 企业远程办公:通过 OpenVPN 安全访问公司内网。
- 隐私保护:加密网络流量,防止监听。
- 绕过地域限制:访问受限制的网络资源。
1.2.3. 安装与配置
- Tap-windows 通常随 OpenVPN 客户端自动安装(如安装包中的
tap-windows-9.x.x.exe
)。 - 如果缺失,可从官方下载(OpenVPN 社区版 或 Tap-windows 项目)。
@import “images/qemu-01.png”
1.2.4. 常见问题
Tap-Windows Adapter 无法启动?
- 检查驱动程序是否损坏(设备管理器中是否有黄色感叹号)。
- 重新安装 Tap-windows 或更新 OpenVPN 客户端。
权限问题?
- 需管理员权限安装/配置 TAP 设备。
与 Hyper-V/WSL2 冲突?
- 某些虚拟化技术(如 Hyper-V)可能占用网络接口,导致 TAP 设备无法正常工作。
1.2.5. 替代方案
- TUN 模式(如 WireGuard):更轻量,但仅支持路由(三层)而非桥接(二层)。
- Wintun:WireGuard 官方推荐的高性能驱动,替代部分 TAP 功能。
如果需要 OpenVPN 的完整功能(如桥接模式),Tap-windows 仍是必要组件。
1.3. UEFI EDK2
URL:
- 1.https://github.com/tianocore/edk2/releases
- 2.https://packages.debian.org/sid/all/qemu-efi-aarch64/download
1.4. VIRTIO-WIN
- https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
2. 启用加速
2.1. 硬件要求
- CPU支持虚拟化(Intel VT-x / AMD-V )
- 在 BIOS/UEFI 中已启用虚拟化技术。
2.2. 功能依赖
需启用 Windows Hypervisor Platform 和 虚拟机平台 功能。
-方法1:通过图形界面
打开 控制面板 → 程序 → 启用或关闭 Windows 功能。
勾选以下两项:
☑ Windows Hypervisor Platform
☑ 虚拟机平台(可选,但推荐)
点击 确定,按提示重启系统。
-方法2:通过 PowerShell(管理员权限)
powershell
#启用 Windows Hypervisor Platform
Enable-WindowsOptionalFeature -Online -FeatureName HypervisorPlatform -NoRestart
#启用虚拟机平台(可选)
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart
#重启生效
Restart-Computer
2.3. 验证 WHPX 支持
在命令提示符中运行:
qemu-system-x86_64 -accel whpx -machine help
如果输出中包含 whpx 支持的机器类型(如 pc 或 q35),则表示 WHPX 可用。
若报错 whpx accelerator is not supported,请检查:
步骤 2 的功能是否已启用。
BIOS 中虚拟化是否开启(任务管理器 → 性能选项卡 → “虚拟化”状态)。
2.4. 检查 Windows Hyper-V 状态
如果你使用的是 Windows 系统,要确保 Hyper-V 和 Windows 沙箱功能没有同时启用,因为它们可能会产生冲突:
#以管理员身份运行 PowerShell
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
dism.exe /Online /Disable-Feature:Containers-DisposableClientVM
3. 创建虚拟机
3.1. 创建AMD64虚拟机
3.1.1. 创建脚本
qemu-system-x86_64 ^
-accel whpx ^
-m 2G ^
-smp 2 ^
-hda amd64_disk.qcow2 ^
-cdrom ubuntu-24.10-live-server-amd64.iso ^
-boot cd
3.1.2. 在命令行环境执行
E:\qemu\disks>qemu-system-x86_64 ^
More? -accel whpx ^
More? -m 2G ^
More? -smp 2 ^
More? -hda amd64_disk.qcow2 ^
More? -cdrom ubuntu-24.10-live-server-amd64.iso ^
More? -boot cd
WHPX: setting APIC emulation mode in the hypervisor
Windows Hypervisor Platform accelerator is operational
whpx: injection failed, MSI (0, 0) delivery: 0, dest_mode: 0, trigger mode: 0, vector: 0, lost (c0350005)
(qemu:14680): Gtk-WARNING **: 15:25:44.740: Could not load a pixbuf from /org/gtk/libgtk/theme/Adwaita/assets/bullet-symbolic.svg.
This may indicate that pixbuf loaders or the mime database could not be found.
E:\qemu\disks>
3.1.3. 因最小化安装需要补充安装的基础软件包
zgq@zgq:~$ sudo apt update && sudo apt install iputils-ping
zgq@zgq:~$ sudo apt update && sudo apt install nano
4. 优化配置
4.1. 用户模式网络(SLIRP)
QEMU 默认的用户模式网络(SLIRP)对 ICMP 流量的支持有限,导致无法 ping 通外部地址如 8.8.8.8,但 TCP/UDP 流量(如 apt` 下载)正常工作。
QEMU 的用户模式网络(User Networking)是通过 SLIRP(Socket Layer for Internet Reliable Protocol)实现的,它是一种在用户态实现的网络后端,用于为虚拟机提供网络访问功能。以下是关于 QEMU 用户模式网络 SLIRP 的详细说明:
- 基本原理
TCP/IP 协议栈:SLIRP 在 QEMU 内部实现了一整套 TCP/IP 协议栈,通过这个协议栈,虚拟机可以与宿主机及外部网络进行通信。
NAT 转发:SLIRP 使用 NAT(网络地址转换)技术,将虚拟机的网络流量伪装成宿主机的流量,从而实现虚拟机对外部网络的访问
优点
无需管理员权限:用户模式网络不需要 root 权限即可运行,这使得它在普通用户环境下非常方便使用。
配置简单:它是 QEMU 的默认网络后端,在没有指定其他网络参数的情况下,QEMU 会自动启用用户模式网络。
独立性好:虚拟机的网络完全由 QEMU 模拟实现,不依赖于宿主机上的网络工具组件,因此不会对宿主机的网络配置产生影响。
限制
性能较差:由于 SLIRP 在用户态解析网络报文,并且需要经过 QEMU 内部的协议栈处理,因此网络性能相对较低。
协议支持有限:SLIRP 不支持某些网络协议,例如 ICMP,因此虚拟机无法使用 ping 命令。
外部访问受限:默认情况下,外部网络无法直接访问虚拟机,虚拟机之间的通信也受到限制。
用户模式网络的特点:
4.1.1. 内部网络:虚拟机被分配到一个默认子网,通常是 10.0.2.0/24。
- 10.0.2.2:虚拟机看到的网关地址(即宿主机)。
- 10.0.2.3:通常用作 DNS 服务器或其他内部地址。
- 10.0.2.15:虚拟机默认分配的 IP 地址。
4.1.2. NAT 机制:虚拟机通过宿主机的网络地址转换(NAT)访问外部网络,但外部设备无法主动连接到虚拟机,除非配置了端口转发。
4.1.3. 网络行为:
虚拟机可以发起对外的连接,例如通过 HTTP/HTTPS 下载软件包(这解释了为什么你能安装 iputils-ping)。
但是,ICMP 流量(如 ping 使用的协议)在用户模式网络下支持有限。QEMU 的 SLIRP 无法正确处理对外部地址(如 8.8.8.8)的 ICMP 数据包,导致 ping 8.8.8.8 失败。
TCP/UDP 流量(如 apt 使用的 HTTP)正常工作。
4.1.4. 端口转发
qemu-system-x86_64 ^
-accel whpx ^
-m 2G ^
-smp 2 ^
-hda amd64_disk.qcow2 ^
-cdrom ubuntu-24.10-live-server-amd64.iso ^
-boot cd ^
-netdev user,id=net0,hostfwd=tcp::2222-:22 ^ # 端口转发规则
-device e1000,netdev=net0 # 使用 e1000 网卡
在宿主机上可以SSH连接创建的虚拟机
启动虚拟机并完成系统安装。
- 1.确保虚拟机内已启用 SSH 服务(Ubuntu Server 默认安装):
sudo systemctl enable --now ssh
- 2.从宿主机通过 SSH 访问虚拟机:
ssh -p 2222 username@localhost
username 替换为虚拟机内的用户名。
localhost 表示宿主机自身,2222 是转发的端口。
4.2. 桥接网络
4.2.1. 确认桥接网络配置
宿主机桥接状态:
打开 Windows 的 网络连接(ncpa.cpl),确认已存在一个“网络桥”(包含物理网卡和 TAP 设备)。
桥接后的网络相当于虚拟机和宿主机共享同一个物理网卡。
QEMU 启动参数:
qemu-system-x86_64 ^
-accel whpx ^
-m 2G ^
-smp 2 ^
-hda amd64_disk.qcow2 ^
-netdev tap,id=net0,ifname=MyTap,script=no,downscript=no ^ # 指定 TAP 设备
-device virtio-net-pci,netdev=net0 # 推荐使用 virtio 网卡
ifname=MyTap:需与宿主机 TAP 设备名称一致(默认可能为 tap0 或自定义名称)。
script=no:禁止 QEMU 自动配置网络(需手动设置)。
4.2.2. 虚拟机内配置网络
方法 1:动态获取 IP(DHCP)
如果宿主机所在网络有 DHCP 服务器,虚拟机通常会自动获取 IP:
# Ubuntu/Debian
sudo dhclient -v ens3 # ens3 是网卡名,根据实际修改
# 检查 IP
ip a show ens3
输出中应显示与宿主机同网段的 IP(如宿主机是 192.168.1.100,虚拟机可能获取 192.168.1.x)。
方法 2:手动设置静态 IP
- 在 Ubuntu 24.04 中,如果存在 /etc/netplan/50-cloud-init.yaml,说明系统使用了 cloud-init 管理网络配置。你需要根据具体情况决定修改此文件还是新建文件,以下是详细指导:
-
- 判断是否使用 cloud-init
- 运行以下命令检查 cloud-init 是否管理网络:
sudo cloud-init status
如果输出为 status: active,则网络由 cloud-init 动态生成,直接修改 50-cloud-init.yaml 可能无效(重启后会被覆盖)。
如果输出为 status: disabled 或未安装 cloud-init,可以直接修改或新建配置。
-
- 推荐操作:新建优先级更高的配置文件
无论 cloud-init 是否激活,最佳实践是新建一个优先级更高的配置文件(如 01-static.yaml),Netplan 会按数字顺序加载配置(数字小的优先):,修改为静态 IP(示例):
以 Ubuntu Server 为例:
编辑网络配置文件(使用 netplan):
sudo nano /etc/netplan/00-static.yaml
network:
ethernets:
ens3: # 网卡名,用 `ip a` 确认
dhcp4: no
addresses: [192.168.1.150/24] # 静态 IP 和子网掩码
gateway4: 192.168.1.1 # 网关(通常为路由器 IP)
nameservers:
addresses: [8.8.8.8, 1.1.1.1] # DNS
version: 2
4.3. 替换国内镜像源
替换步骤
4.3.1. 备份原始配置文件:
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
4.3.2. 编辑配置文件: 使用 nano(默认编辑器)或其他编辑器:
sudo nano /etc/apt/sources.list.d/ubuntu.sources
4.3.3. 替换内容: 清空文件内容,粘贴上述
假设系统是Ubuntu24.10(oracular)
Types: deb
URIs: http://mirrors.huaweicloud.com/ubuntu/
Suites: oracular oracular-updates oracular-backports oracular-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg