QEMU虚拟化环境搭建与优化指南

发布于:2025-06-20 ⋅ 阅读:(17) ⋅ 点赞:(0)

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-windowsOpenVPN 等虚拟专用网络(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. 主要功能
  1. 虚拟网络接口

    • Tap-windows 在 Windows 上创建一个虚拟网卡(如 TAP-Windows Adapter V9),使计算机可以像连接物理网络一样接入 VPN。
    • 该虚拟网卡会获得一个 IP 地址(通常由 VPN 服务器分配)。
  2. 支持 VPN 协议

    • 主要用于 OpenVPN,但某些其他 VPN 软件(如 SoftEther VPN、WireGuard 的部分实现)也可能使用它。
  3. 隧道通信

    • 数据通过 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. 常见问题
  1. Tap-Windows Adapter 无法启动?

    • 检查驱动程序是否损坏(设备管理器中是否有黄色感叹号)。
    • 重新安装 Tap-windows 或更新 OpenVPN 客户端。
  2. 权限问题?

    • 需管理员权限安装/配置 TAP 设备。
  3. 与 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 管理网络配置。你需要根据具体情况决定修改此文件还是新建文件,以下是详细指导:
    1. 判断是否使用 cloud-init
  • 运行以下命令检查 cloud-init 是否管理网络:
sudo cloud-init status
  • 如果输出为 status: active,则网络由 cloud-init 动态生成,直接修改 50-cloud-init.yaml 可能无效(重启后会被覆盖)。

  • 如果输出为 status: disabled 或未安装 cloud-init,可以直接修改或新建配置。

    1. 推荐操作:新建优先级更高的配置文件
  • 无论 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

网站公告

今日签到

点亮在社区的每一天
去签到