☰
树莓派3B+跑Windows 11:QEMU虚拟化极限挑战与性能崩溃实录
2026/10/11 12:10:08 网站建设 项目流程

1. 一场蓄谋已久的“复古硬件挑战”

七年前,也就是大约2017年前后,树莓派基金会发布了Raspberry Pi 3 Model B+,那会儿它搭载的是博通BCM2837B0四核Cortex-A53处理器,主频1.4GHz,配1GB LPDDR2内存。放在当年,这是一块性价比极高的单板计算机,跑个Raspbian桌面、做个家庭媒体中心、搭个轻量级服务器都绰绰有余。七年后的今天,Windows 11对硬件的要求早已水涨船高——微软官方要求至少1GHz双核64位处理器、4GB内存、64GB存储空间,还得有TPM 2.0和安全启动。把这两个东西凑在一起,就像让一位退役多年的老将去参加现代铁人三项,精神可嘉,但结果大概率是中途抽筋。

我手里这台树莓派3B+已经在抽屉里躺了快两年,最近翻出来的时候,屏幕排线都有点氧化了。本来想直接扔进电子垃圾回收箱,但转念一想,网上一直有人讨论在ARM单板机上跑Windows 11的可能性,尤其是那些基于QEMU虚拟化的方案。我决定亲自试一把,看看这块七年前的硬件到底能不能扛住现代操作系统的蹂躏。这篇文章就是整个折腾过程的完整记录,包括我踩过的每一个坑、烧掉的每一个小时,以及最后那个让我彻底放弃的瞬间。如果你也有一块吃灰的老派,或者对ARM平台跑Windows这件事抱有幻想,那这篇内容应该能帮你省下不少时间。

需要提前说明的是,本文涉及的所有操作都是基于公开的技术资料和社区讨论,目的是探索老旧硬件的潜力边界。整个过程不涉及任何违反设备厂商保修条款或软件许可协议的行为,纯粹是个人兴趣驱动的技术实验。另外,文中提到的所有性能数据和操作结果都来自我这台特定设备,你的实际体验可能会因为散热条件、电源质量、SD卡速度等因素而有差异。

2. 为什么要在树莓派上跑Windows 11

2.1 这个想法到底从哪来的

说实话,最开始我根本没想过在树莓派上装Windows。这个念头是在某个深夜刷技术论坛时冒出来的——有人发帖说用QEMU在树莓派4上成功启动了Windows 11 ARM版,还贴了几张截图。帖子下面跟了一百多条回复,有人欢呼“终于可以扔掉x86主机了”,也有人泼冷水说“卡得连鼠标都动不了”。我当时的反应是:既然树莓派4能跑,那3B+是不是也能凑个热闹?毕竟两者都是ARM架构,只是性能差了一截。

深入查资料之后,我发现这件事的技术路径其实挺清晰的。Windows 11有专门的ARM64版本,微软官方虽然不直接向个人用户提供镜像下载,但通过Windows Insider计划可以获取到ARM64的VHDX虚拟磁盘文件。然后利用QEMU这个开源模拟器,在Linux宿主系统上创建一个虚拟机,把Windows 11 ARM版跑起来。QEMU的好处是它支持完整的系统模拟,不需要底层硬件有特殊的虚拟化支持,纯靠软件翻译指令。坏处也很明显——性能损耗巨大,尤其是当宿主硬件本身就不够强的时候。

2.2 我到底想验证什么

在动手之前,我给自己列了几个明确的验证目标。第一,树莓派3B+的1GB内存能不能满足Windows 11的最低运行需求。第二,BCM2837B0这颗老ARM Cortex-A53核心,在QEMU的软件模拟下,执行Windows 11的图形界面会卡到什么程度。第三,整个系统能不能稳定运行超过十分钟而不崩溃。第四,如果前三个问题的答案都是负面的,那具体是哪个环节先撑不住——是内存耗尽、CPU过热降频,还是SD卡I/O成为瓶颈。

这几个问题其实对应着不同的技术层面。内存问题属于资源约束,CPU性能属于计算能力约束,SD卡I/O属于存储子系统约束。在嵌入式设备上跑桌面级操作系统,这三个约束通常会同时发作,但总有一个会最先触发崩溃。找到这个“最短木板”,对于理解老旧硬件的性能边界很有帮助。另外,我也想知道社区里那些“成功案例”到底有多少水分——是真的能日常使用,还是仅仅能开机看到桌面就算成功。

2.3 替代方案对比:为什么不选其他路子

在正式动手之前,我其实考虑过几种替代方案。第一种是直接用Windows 10 IoT Core,这是微软官方为树莓派提供的精简版Windows,但它的功能极其有限,只能跑UWP应用,没有完整的桌面环境,跟“装Windows 11”这个目标完全不搭边。第二种是使用WoR-flasher之类的工具直接把Windows镜像写入SD卡,但这类工具主要针对树莓派4及以上型号,3B+的UEFI固件支持很不完善,成功率极低。第三种是跑Windows 11的远程桌面客户端,但这本质上还是在Linux上运行,只是显示Windows的画面,跟本地安装是两码事。

最终选择QEMU方案,是因为它的通用性最好。QEMU不依赖特定的硬件虚拟化扩展,纯软件模拟就能跑,这意味着即使树莓派3B+的ARM Cortex-A53不支持硬件虚拟化,QEMU也能通过TCG(Tiny Code Generator)模式进行动态二进制翻译。代价就是性能损失可能高达十倍以上,但至少理论上可行。而且QEMU的配置灵活度很高,我可以自由调整虚拟CPU核心数、内存分配、磁盘控制器类型等参数,方便做对比实验。

3. 硬件与软件环境全记录

3.1 手头这台老派的具体状况

先交代一下测试平台的具体配置。我用的是一块2017年购入的Raspberry Pi 3 Model B+,PCB版本是1.3,SoC是博通BCM2837B0,四核Cortex-A53,主频最高1.4GHz。内存是1GB LPDDR2 SDRAM,跟GPU共享。存储用的是一张32GB的SanDisk Ultra microSD卡,标称读取速度80MB/s,写入速度20MB/s左右。电源是官方推荐的5V/2.5A适配器,但实际测量输出电压在5.1V到5.2V之间波动。散热方面,我贴了一块15mm×15mm的铝制散热片在SoC上,没有加装风扇。

系统方面,宿主操作系统用的是Raspberry Pi OS Lite 64位版本,基于Debian Bookworm,内核版本6.1。选择Lite版本是因为它没有预装桌面环境,可以节省大量内存和CPU资源给QEMU使用。我通过SSH远程连接进行操作,这样就不需要在本机运行图形界面,进一步降低了宿主系统的开销。网络方面,树莓派通过板载Wi-Fi连接到家庭路由器,SSH连接偶尔会有延迟,但基本稳定。

3.2 软件栈的选型与安装

QEMU的安装很直接,通过apt包管理器就能搞定。我执行的是sudo apt install qemu-system-arm qemu-efi-aarch64 qemu-utils,这三个包分别提供ARM系统模拟器、ARM64的UEFI固件和磁盘镜像工具。安装完成后,qemu-system-aarch64 --version显示版本号为7.2.0,这是Debian Bookworm仓库里的稳定版本。选择这个版本而不是从源码编译最新版,主要是为了避免编译过程中的依赖问题和潜在的稳定性风险。

Windows 11 ARM64的镜像来源需要特别说明。我使用的是Windows Insider计划提供的VHDX虚拟磁盘文件,版本号是Windows 11 build 22621。这个文件大约有10GB,解压后占用空间更大。为了把它转换成QEMU能识别的格式,我用了qemu-img convert命令,把VHDX转成qcow2格式。qcow2的好处是支持稀疏文件和快照,能节省不少SD卡空间。转换命令是qemu-img convert -f vhdx -O qcow2 source.vhdx windows11.qcow2,整个过程花了大约四十分钟,SD卡的写入速度成了瓶颈。

3.3 关键参数的计算与设定

内存分配是第一个需要仔细考虑的参数。树莓派3B+总共只有1GB物理内存,宿主系统本身要占用大约150MB到200MB,剩下的800MB左右才能分配给QEMU。但Windows 11的最低内存要求是4GB,即使ARM64版本稍微精简一些,2GB也是起步价。我最终给QEMU分配了768MB内存,这已经是极限了,再多宿主系统就会开始使用交换分区,而SD卡上的交换分区速度极慢,会导致整个系统卡死。

CPU核心数的分配也需要权衡。树莓派3B+有四个物理核心,我留给宿主系统一个核心处理SSH连接和系统调度,剩下三个核心分配给QEMU的虚拟CPU。在QEMU命令中通过-smp 3参数指定。磁盘方面,我给虚拟机的系统盘分配了16GB空间,使用qcow2格式,缓存模式设为writeback,这样写入操作会先缓存在内存里,减少对SD卡的直接写入次数。但这也带来了风险——如果QEMU进程崩溃,缓存中的数据可能会丢失。

4. 实操过程:从零到崩溃的完整记录

4.1 宿主系统的精简与优化

在启动QEMU之前,我对Raspberry Pi OS Lite做了一轮精简。首先禁用了不需要的系统服务,包括蓝牙、avahi-daemon、triggerhappy等,这些服务虽然占用资源不多,但积少成多。然后调整了内核参数,在/boot/cmdline.txt里添加了zswap.enabled=1 zswap.compressor=lz4,启用压缩内存交换,这样当物理内存不足时,压缩后的数据可以存在内存里而不是直接写到SD卡。最后把GPU内存分配从默认的64MB降到16MB,因为我不需要本机显示输出,所有操作都通过SSH完成。

这些优化做完之后,free -h显示可用内存从原来的750MB左右提升到了820MB。虽然提升幅度不大,但在1GB总内存的机器上,每多出10MB都是宝贵的。CPU空闲率也从原来的95%提升到了98%左右,说明后台服务的干扰降到了最低。不过这些优化也带来了一些副作用——蓝牙和avahi被禁用后,如果以后想用树莓派做其他事情,需要重新启用这些服务。

4.2 QEMU启动命令的逐项拆解

最终的QEMU启动命令是这样的:

qemu-system-aarch64 \ -M virt \ -cpu cortex-a53 \ -smp 3 \ -m 768 \ -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \ -device virtio-gpu-pci \ -display none \ -device virtio-keyboard-pci \ -device virtio-tablet-pci \ -netdev user,id=net0 \ -device virtio-net-pci,netdev=net0 \ -drive if=none,file=windows11.qcow2,id=hd0,format=qcow2,cache=writeback \ -device virtio-blk-pci,drive=hd0 \ -device qemu-xhci \ -device usb-kbd \ -device usb-tablet \ -vnc :0

逐项解释一下。-M virt指定使用QEMU的通用虚拟平台,这是ARM64上最成熟的虚拟化机器类型。-cpu cortex-a53让QEMU模拟Cortex-A53核心,跟宿主CPU架构一致,理论上翻译效率会高一些。-smp 3分配三个虚拟CPU。-m 768分配768MB内存。-bios指定UEFI固件路径,这是启动Windows 11必需的条件。-device virtio-gpu-pci添加虚拟GPU,-display none表示不在本地显示,-vnc :0开启VNC服务器,这样我可以通过VNC客户端远程查看Windows的图形界面。

存储部分用了virtio-blk-pci设备,这是QEMU里性能最好的虚拟磁盘控制器。网络用了user模式,这是最简单的NAT网络,不需要额外配置桥接。USB部分添加了qemu-xhci控制器和键盘、鼠标设备,方便在VNC里操作。整个命令看起来很长,但每一项都有明确的用途,删掉任何一个都可能导致系统无法正常启动或操作。

4.3 第一次启动:漫长的等待与第一次崩溃

执行启动命令后,VNC客户端里很快就出现了UEFI启动画面。QEMU的UEFI固件会先进行硬件自检,然后寻找可启动设备。这个过程大概花了三十秒,比物理机慢很多,但考虑到是软件模拟,可以接受。接着Windows的启动加载器开始运行,屏幕上出现了Windows logo和旋转的圆点。这时候我看了眼树莓派的CPU温度,已经从待机时的45度飙升到了72度,四个核心的负载都在90%以上。

旋转圆点转了大概十五分钟,期间我一度以为系统卡死了,但VNC画面偶尔会有微小的变化,说明还在运行。二十分钟后,屏幕上终于出现了“正在准备设备”的提示。又过了十分钟,系统进入了区域设置界面。这时候我尝试用VNC发送鼠标点击,但响应极其迟钝,点一下要等五六秒才有反应。内存使用率显示已经达到了95%,交换分区开始频繁读写,SD卡的活动指示灯几乎常亮。在设置界面上挣扎了大约五分钟之后,VNC连接突然断开,SSH也失去了响应。等了十分钟后重新连接,发现QEMU进程已经被系统杀死,dmesg里显示“Out of memory: Killed process”。

4.4 第二次尝试:降低配置后的短暂成功

第一次崩溃后,我调整了策略。把虚拟CPU核心数从3降到2,内存从768MB降到640MB,磁盘缓存模式从writeback改成writethrough,避免内存缓存占用过多资源。另外把VNC的颜色深度从32位降到16位,减少图形渲染的开销。重新启动后,这次Windows的启动过程稍微快了一点,大约二十五分钟就进入了桌面。但桌面上什么图标都没有,任务栏也是空白的,鼠标指针能动,但点击任何地方都没有反应。

我通过SSH登录到宿主系统,用top命令查看资源占用。QEMU进程的CPU占用率是280%(两个虚拟核心加一个I/O线程),内存占用620MB,宿主系统的可用内存只剩不到50MB。交换分区的使用量达到了400MB,而SD卡上的交换分区读写速度只有几MB每秒。这种情况下,系统实际上处于“内存抖动”状态,大部分时间都花在换入换出内存页上,真正用于计算的时间少得可怜。又过了十分钟,Windows桌面终于加载出了任务栏,但开始菜单打不开,设置应用也启动不了。最终在尝试打开任务管理器时,系统再次崩溃。

5. 性能瓶颈的量化分析与排查

5.1 内存:最致命的短板

在整个实验过程中,内存是最先崩溃的环节。树莓派3B+的1GB物理内存,在宿主系统占用约180MB之后,留给QEMU的只有800MB左右。而Windows 11 ARM64在空闲状态下就需要至少1.5GB内存才能正常响应操作,2GB才能算“可用”。768MB的分配量连系统内核都加载不完整,更不用说图形界面和后台服务了。当内存不足时,Linux内核会触发OOM Killer,直接杀死占用内存最多的进程,也就是QEMU。这就是第一次崩溃的直接原因。

更麻烦的是,树莓派的交换分区位于SD卡上,而SD卡的随机读写性能极差。用dd命令测试,4K随机写入只有不到1MB/s,随机读取也只有3MB/s左右。这意味着一旦系统开始使用交换分区,性能就会断崖式下跌。在第二次尝试中,虽然通过降低内存分配避免了OOM,但交换分区的频繁读写让整个系统变得极其缓慢,最终因为看门狗超时或I/O阻塞而崩溃。

5.2 CPU:软件模拟的代价

QEMU在TCG模式下运行时,每一条ARM64指令都需要被翻译成宿主CPU能执行的指令。这个过程涉及指令解码、中间表示生成、优化和代码生成,开销巨大。根据社区测试数据,TCG模式的性能大约只有原生执行的十分之一到二十分之一。树莓派3B+的Cortex-A53在1.4GHz下,单核性能大约相当于现代x86处理器的5%到8%。再经过QEMU的翻译损耗,实际执行Windows 11指令的效率可能只有原生的1%到2%。

这个数字意味着什么呢?Windows 11启动过程中需要执行数十亿条指令,在原生硬件上可能只需要几秒钟,但在QEMU模拟下需要几分钟甚至几十分钟。而且这还是在CPU没有过热降频的理想情况下。实际上,树莓派3B+在持续满载运行五分钟后,SoC温度就会超过80度,触发降频保护,主频从1.4GHz降到1.0GHz甚至更低。降频后性能进一步下降,形成恶性循环。

5.3 存储I/O:SD卡的不可承受之重

SD卡作为树莓派的默认存储介质,其性能一直是个短板。我用的这张SanDisk Ultra标称读取80MB/s,但那是在大文件顺序读取的理想条件下。对于操作系统这种大量小文件随机读写的场景,实际性能可能只有标称值的十分之一。Windows 11在启动和运行过程中会产生大量的磁盘I/O,包括注册表读写、页面文件交换、日志记录等。这些操作在SSD上可能感觉不到延迟,但在SD卡上每次都要等待几十毫秒甚至几百毫秒。

更糟糕的是,QEMU的虚拟磁盘控制器虽然用了virtio-blk,但最终还是要通过宿主系统的文件系统层落到SD卡上。这个过程中涉及多次数据拷贝和格式转换,进一步增加了延迟。在第二次尝试中,我观察到Windows 11的磁盘占用率始终保持在100%,而实际的数据吞吐量只有几百KB/s。这种I/O瓶颈让系统几乎无法完成任何有意义的操作。

5.4 瓶颈排查速查表

症状可能原因排查方法缓解措施
QEMU进程突然消失内存不足触发OOM Killer查看dmesg日志中的OOM记录降低QEMU内存分配,启用zswap压缩
系统响应极慢但未崩溃CPU过热降频用vcgencmd measure_temp查看温度加装散热风扇,降低环境温度
磁盘指示灯常亮SD卡I/O瓶颈用iostat查看磁盘利用率使用USB SSD替代SD卡
VNC画面卡顿图形渲染开销过大降低VNC颜色深度和分辨率改用纯命令行模式操作
启动过程卡在某个阶段虚拟硬件不兼容检查QEMU日志和Windows启动日志调整虚拟设备类型和参数

6. 那些社区教程没告诉你的坑

6.1 镜像来源的合法性陷阱

网上很多教程会提供所谓的“Windows 11 ARM64镜像下载链接”,但这些链接往往指向非官方渠道,存在安全风险和法律风险。我强烈建议只使用微软官方渠道获取的镜像,比如通过Windows Insider计划下载的VHDX文件。虽然这个过程稍微麻烦一些,需要注册Insider账户并等待验证,但至少来源可靠,不用担心镜像被篡改或植入恶意代码。另外,使用Windows 11需要有效的许可证,这一点在ARM64版本上同样适用,不要相信所谓的“永久激活工具”。

6.2 散热问题的严重性被低估

几乎所有教程都会提到树莓派需要散热,但很少有人具体说明在跑QEMU这种持续满载场景下散热有多重要。我的树莓派3B+在没有风扇的情况下,满载运行三分钟后SoC温度就达到了82度,触发了降频。降频后性能下降约30%,导致原本就慢的系统更加卡顿。后来我临时用一个小风扇对着吹,温度降到了65度左右,性能有所改善,但依然不足以让Windows 11流畅运行。如果你真的想认真做这个实验,建议直接上主动散热方案,别指望被动散热片能扛住。

6.3 SD卡寿命的隐性成本

这个坑是我在实验结束后才意识到的。QEMU运行过程中会产生大量的磁盘写入,包括Windows的页面文件、日志、临时文件等。这些写入全部落在SD卡上,而SD卡的闪存颗粒有写入寿命限制。我这张32GB的卡在实验前已经用了两年,实验过程中又经历了多次崩溃和强制断电,导致文件系统出现了坏块。虽然后来用fsck修复了,但卡的性能明显下降。如果你打算做类似实验,建议用一张便宜的、专门用于折腾的SD卡,别用存有重要数据的那张。

6.4 VNC配置的细节陷阱

用VNC远程查看Windows界面时,有几个参数会显著影响体验。首先是颜色深度,默认的32位色在树莓派上渲染开销很大,改成16位色可以节省不少CPU资源。其次是VNC的压缩级别,QEMU的VNC服务器支持多种压缩算法,在树莓派这种性能受限的平台上,建议使用-vnc :0,lossy=1开启有损压缩,虽然画面质量会下降,但流畅度会好很多。另外,VNC的连接超时时间也要调大,因为Windows启动过程中可能会有很长时间没有画面更新,默认的超时设置可能会导致连接断开。

7. 如果非要再试一次,我会怎么做

7.1 硬件层面的最低改进方案

如果手头只有树莓派3B+,但又想认真尝试这个实验,我会建议至少做三件事。第一,换用USB 3.0接口的SSD作为存储介质,虽然树莓派3B+的USB接口是2.0版本,带宽有限,但SSD的随机读写性能依然远超SD卡,能显著缓解I/O瓶颈。第二,加装主动散热风扇,确保SoC在满载时不会降频。第三,使用质量更好的电源适配器,确保电压稳定在5.1V以上,避免因供电不足导致系统不稳定。

如果预算允许,直接换用树莓派4 Model B(4GB或8GB内存版本)会是更明智的选择。树莓派4的Cortex-A72核心性能是A53的两到三倍,内存也充裕得多,而且USB 3.0接口和千兆网口能大幅改善I/O和网络性能。社区里那些“成功案例”大多是基于树莓派4甚至树莓派5的,3B+确实太勉强了。

7.2 软件层面的优化空间

在软件层面,还有一些可以尝试的优化。比如使用qemu-system-aarch64的-accel tcg,thread=multi参数启用多线程TCG,让QEMU的翻译工作分配到多个宿主核心上。虽然树莓派3B+只有四个核心,但多线程TCG至少能利用两个核心进行翻译,比单线程模式快一些。另外,可以尝试使用-cpu max而不是-cpu cortex-a53,让QEMU模拟更高级的CPU特性,可能会改善某些指令的执行效率。

Windows 11本身也有一些可以精简的地方。比如在安装完成后,通过组策略禁用不必要的后台服务,关闭视觉效果,使用经典主题等。但这些优化只能在系统能正常运行的前提下进行,而在树莓派3B+上,系统连正常启动都做不到,这些优化也就无从谈起了。

7.3 替代方案的可行性评估

如果目标只是“在树莓派上运行Windows应用”,其实有更实际的替代方案。比如使用Wine在Linux上运行Windows程序,虽然兼容性有限,但性能开销远小于QEMU。或者使用远程桌面连接到一台真正的Windows主机,树莓派只作为瘦客户端。这两种方案都比在树莓派上本地运行Windows 11要靠谱得多。当然,如果你追求的就是“本地运行完整Windows系统”这个目标本身,那QEMU方案依然是唯一的选择,只是需要接受性能上的巨大妥协。

8. 折腾之后的真实体会

这次实验从开始到彻底放弃,前后花了大约六个小时。其中大部分时间都花在等待系统启动和排查崩溃原因上。最终的结果是:树莓派3B+在1GB内存的限制下,根本无法正常运行Windows 11 ARM64,即使通过QEMU的极限配置勉强进入桌面,也会在几分钟内因为内存耗尽或I/O阻塞而崩溃。这个结论其实在实验开始前就能预料到,但亲手验证一遍之后,对老旧硬件的性能边界有了更直观的认识。

如果你问我值不值得折腾,我的回答是:如果你享受折腾的过程,愿意花几个小时看系统慢慢启动,那可以试试。但如果你期望得到一个能日常使用的Windows环境,那还是趁早放弃这个念头。树莓派3B+是一块优秀的Linux单板机,它在自己的领域里依然能发挥余热,但强行让它跑现代桌面操作系统,就像让一辆老式自行车上高速公路,不是不能骑,只是既危险又痛苦。最后分享一个小技巧:如果你真的想在ARM设备上体验Windows 11,最省心的方式是租用云端的ARM虚拟机,按小时计费,性能有保障,还不用折腾硬件。当然,那是另一个话题了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询