QEMU 安装 Windows ARM

实验环境

Windows on ARM

更新日志

2023.1.2 更新
建议在构建镜像的时候用 uup.rg-adguard,那个可以移除安装限制,可以有效避免 TPM 问题(因为还不会怎么模拟 TPM)
或者自己手动修改镜像


2024.5.5 更新
下面的操作中,你可以将 Dism++ 整个文件放到 virtio-win.iso 内,在安装完磁盘驱动的时候(或提前注入后),按 Shift + F10 呼出 CMD,然后定位到 Dism++ARM64.exe 所在的位置并打开
随后使用 DiskPart 与 Dism++ 分别创建分区与安装系统,安装完后使用 Dism++ 的“驱动管理”,选择 virtio-win.iso 的根目录即可自动安装驱动
不知道如何使用 DiskPart 可以参阅 UEFI 使用 DISM 命令安装系统章节中 #操作磁盘 的部分


准备工作

QEMU 最新版
QEMU 的安装位置需要记牢,在安装程序会出现,后面需要用到

QEMU 安装路径

UEFI 固件
下载文件名开头为 edk2.git-aarch64 的文件,并用 7-Zip 等解压缩工具多次解压,直至提取出 QEMU_EFI.fd 和 vars-template-pflash.raw 这两个文件
VirtIO ARM64 驱动光盘

QEMU_EFI.fd 和 vars-template-pflash.raw


如果你觉得从以上的站点下载解压文件太麻烦,可以直接到我的 OneDrive 站点下载打包好的所需文件(不一定为最新,系统镜像单独发放,只有 Windows 10 22H2 与 Windows 11 23H2,已去安装校验及集成 .NET3.5,未作精简)
OneDrive


配置环境变量

按下 Windows 徽标键+R,输入 SystemPropertiesAdvanced 并回车
点击“环境变量”

环境变量 1

在“系统变量(S)”里找到名为“Path”的项并双击,点击旁边的“新建(N)”,最后在矩形框中输入 QEMU 的安装目录

环境变量 2
然后全部点击“确定”即可

创建硬盘文件

按下 Windows 徽标键+Q,输入 CMD,并右键选择“以管理员身份运行”

CMD

然后输入以下命令

1
qemu-img.exe create -f 硬盘格式 <自定义存放路径\文件名.硬盘格式> <容量大小><单位>

比如我的存放位置为 E:\QEMU\ARM,文件名为 OS,硬盘格式为 qcow2(可选的有还 raw、host_device、qcow、cow、vdi、vmdk、vpc、cloop、img),容量大小为 60GB(单位有 K、M、G、T、P、E)
那么我的命令如下(需要区分大小写,而且路径和文件名不要有空格,用下划线 _ 代替

1
qemu-img.exe create -f qcow2 E:\QEMU\ARM\OS.qcow2 60G

没有别的提示就代表成功了

创建硬盘文件

最后,将 QEMU_EFI.fd、vars-template-pflash.raw 这两个文件一并复制到存放位置

总的文件大概如下图

文件总数

启动系统

在存放的目录(我的是 E:\QEMU\ARM)下新建文本文档,命名为 start.cmd,并编辑内容【<>里的内容(包括引号)是需要自行修改的内容,你可以将脚本的编码通过记事本改为 ANSI,这样 cmd 内提示的中文报错就不会乱码】

1
2
3
4
5
6
7
8
9
qemu-system-aarch64.exe -M virt,virtualization=true -cpu cortex-<CPU 型号> -smp <CPU 核心数> -m <运行内存大小> ^
-device qemu-xhci -device usb-kbd -device usb-tablet ^
-drive file=<"硬盘文件路径\文件名.qcow2">,if=virtio ^
-nic user,model=virtio ^
-device virtio-gpu-pci ^
-drive file=<"系统镜像路径\文件名.iso">,media=cdrom,if=none,id=cdrom -device usb-storage,drive=cdrom ^
-drive file=<"virtio-win 所在路径\virtio-win 的名称.iso">,media=cdrom,if=none,id=cdrom1 -device usb-storage,drive=cdrom1 ^
-bios QEMU_EFI.fd -device ramfb ^
-drive file=vars-template-pflash.raw,if=pflash,index=1,format=raw

比如我的 CPU 型号为 a76(可选的还有 a72,a57 和 a53,亦或者是其它,但最近几个版本的 QEMU 就只能选 a76 了)
CPU 核心数量为 4,运行内存大小为 6144MiB
硬盘文件、系统镜像和 virtio-win 镜像命名为 Image.iso,OS.qcow2 和 virtio-win.iso
(若 start.cmd 与前面几个文件在同一目录下就不需要指定目录,直接填写名称即可)
那么我的命令如下(需要区分大小写,而且路径和文件名不要有空格,用下划线 _ 代替,或者在收尾添加英文引号: "

1
2
3
4
5
6
7
8
9
qemu-system-aarch64.exe -M virt,virtualization=true -cpu cortex-a76 -smp 4 -m 6144 ^
-device qemu-xhci -device usb-kbd -device usb-tablet ^
-drive file=OS.qcow2,if=virtio ^
-nic user,model=virtio ^
-device virtio-gpu-pci ^
-drive file=Image.iso,media=cdrom,if=none,id=cdrom -device usb-storage,drive=cdrom ^
-drive file=virtio-win.iso,media=cdrom,if=none,id=cdrom1 -device usb-storage,drive=cdrom1 ^
-bios QEMU_EFI.fd -device ramfb ^
-drive file=vars-template-pflash.raw,if=pflash,index=1,format=raw

保存后双击运行,如果正常会是这样,可以进入到 TinaoCore Logo 的引导页

启动 Windows


若有如下报错为正常,无需理会
第一个是未指定 vars-template-pflash.raw 的格式(已在文中更新代码,故不会出现该报错),第二个不知道有什么用(反正不影响.jpg

报错 1

但或者是这种找不到文件的报错,则需要自己在文件名前加上路径

报错 2


然后就这样漫长的等待,就会进入到 Windows 安装程序页(按下 Ctrl+ Alt+G 即可将鼠标脱离虚拟机)

Windows 安装程序

安装系统

在选择磁盘的时候,点击“加载驱动程序(L)”

加载驱动程序

选择“浏览(B)”

浏览

选择 virtio-win 光驱

选择 virtio-win 光驱

找到名为“viostor”的文件夹,选择里面“w11”文件夹下的“ARM64”文件夹(如果安装的是 Windows 10 则选择 w10)

选择 virtio 驱动

选择驱动程序,然后点击“下一页(N)”,这样就可以正常安装系统了

选择驱动

最后进入无尽的等待…

复制文件

x86 转译 AArch64 性能会有所下降(不止一点点,再加上 QEMU 是软件模拟),所以安装时间会比普通的虚拟机要长不知道多少倍(
*记得开启“鼠标经过时捕获”(“Grab On Hover”)或“捕获输入”(“Grab Input”)

鼠标经过时捕获

从进入安装程序到准备就绪,花了近一个半小时(
没什么意外的话,可能这个要转 114514h(悲
(而且鉴于无法联网,且硬盘驱动都要自己加载,所以这个过程跳过也没啥问题()

准备就绪


这里不得不说一下 CPU 才 1.0Ghz 属实吝啬,不过不难看出它真的在动了(
有需要的话可以自己搜一下 QEMU 配置 CPU

CPU 信息

当我把 QEMU 升级之后之后就被识别出是虚拟机力(无慈悲

CPU 信息 2


按下 Shift + F10 打开 CMD 窗口,并输入以下命令

1
OOBE\MSOOBE

然后就会跳过那漫长的准备就绪阶段

命令(卡一下才会自动重启)

下一阶段

再等待亿会,就可以进入 OOBE 了

OOBE

由于暂时没有网卡驱动,且 Windows 11 要求联网才能继续,所以需要跳过联网激活验证(Windows 10 可跳过该步骤)
按下 Shift + F10 打开 CMD 窗口,并输入以下命令

1
OOBE\BypassNRO

(如果这期间 OOBE 仍要求联网,可以打开 CMD 窗口,输入 explorer 并打开,然后再按网卡驱动的方式安装网卡驱动)

命令

等待一会,系统会自动重启,然后就可以继续正常安装了

请稍等

可能你会遇到“为什么我的电脑重启了?”这个提示,无需理会,点击“下一步(N)”即可

为什么我的电脑重启了?

接着就可以按照正常方式继续安装了


若无法跳过账户登录或只能登录到工作账户

如果发现只能登录到工作账户的话可以按 Ctrl + Shift + F3 跳过 OOBE
然后在计算机管理里启用 Administrator 或新建其它管理员账户,然后以管理员身份运行 cmd 并输入命令

1
xcopy "%SystemRoot%\System32\svchost.exe" "%SystemRoot%\System32\oobe\audit.exe" /X

完成后重启虚拟机即可
(可能有风险,建议备份源文件到桌面,命令 xcopy "%SystemRoot%\System32\oobe\audit.exe" "%Public%\Desktop\Backup" /X


一切都开始好起来力)

此操作可能需要几分钟

进入桌面

网卡驱动

右键“开始菜单”按钮,选择“Windows PowerShell(管理员)”(或者在 CMD 窗口输入 powershell 也可以)
然后在命令框中输入以下命令并重启

1
bcdedit /set testsigning on

开启测试模式

在文件资源管理器里打开 virtio-win 光驱,然后定位到 \NetKVM\w11\ARM64(如果是 Windows 10 就选择 w10 文件夹)
右键类型为“安装信息”的 netkvm 文件,选择“安装”

安装 netkvm

在弹出的 UAC 窗口中选择“是”

UAC

等待一会,就提示安装完成

安装完成

再等一会就有网络了

这是最后在里面运行 Dism++ ARM64 的效果(启动速度和运行效率会比 x64 转译 ARM64 快许多)

运行软件

后话

  1. 光驱
    如果你后面不需要光驱了可以把
    -drive file=<"系统镜像路径\文件名.iso">,media=cdrom,if=none,id=cdrom -device usb-storage,drive=cdrom ^

    -drive file=<"virtio-win 所在路径\virtio-win.iso">,media=cdrom,if=none,id=cdrom1 -device usb-storage,drive=cdrom1 ^
    这两行代码删除

  2. 性能
    因为没有显卡驱动以及其它的驱动,在 QEMU 模拟 Windows ARM 性能会大打折扣,整个过程会非常漫长,建议将文件存放在 SSD 内
    或许你可以试试将 -device virtio-gpu添加到 start.cmd 内,然后在虚拟机工具栏 – “视图(V)” 里选择 virtio-GPU,但或许更糟糕(

  1. 对应驱动
    文章内仅模拟了所需的硬件及网卡,其它的硬件需要自行查询
    镜像内其它驱动的大致意思如下:[3]
    NetKVM/: Virtio 网络驱动
    viostor/: Virtio 块驱动
    vioscsi/: Virtio SCSI 驱动
    viorng/: Virtio RNG 驱动
    vioser/: Virtio 串口驱动
    Balloon/: Virtio 内存气球驱动
    qxl/: 用于 Windows 7 及之前版本的 QXL 显卡驱动. (virtio-win-0.1.103-1 和之后版本会创建)
    qxldod/: 用于 Windows 8 及之后版本的 QXL 显卡驱动. (virtio-win-0.1.103-2 和之后版本会创建)
    pvpanic/: QEMU pvpanic 设备驱动 (virtio-win-0.1.103-2 和之后版本会创建)
    guest-agent/: QEMU Guest Agent 32bit 和 64bit 安装包
    qemupciserial/: QEMU PCI 串口设备驱动
    vfd: 用于 Windows XP 下的 VFD 软驱镜像

  2. 优化
    如果真的很慢可以看看 BetaWiki 给出的解决方案(不一定 100% 有效)
    以及关闭 Microsoft Defender 防病毒等

1
2
3
4
5
6
7
8
9
10
11
sc stop "Spooler"
sc config "Spooler" start= disabled
sc stop "WSearch"
sc config "WSearch" start= disabled
REM Disable Automatic Defragmentation
schtasks /Delete /TN "\Microsoft\Windows\Defrag\ScheduledDefrag" /F
REM Disable Pagefile
wmic computersystem set AutomaticManagedPagefile=FALSE
wmic pagefileset delete
REM Disable Hibernation
powercfg -h off
  1. 传输文件
    在物理机内添加共享文件夹,权限改成 Everyone 并允许读取写入(如果你怕会被其它人截取则在映射网络驱动器时需要输入物理机的系统账户以登录到共享文件夹),然后在虚拟机内映射网络驱动器即可

  2. 其它
    你可以使用 Dism++ 手动添加所有驱动到 install.wim 和 boot.wim,这样在安装过程中就不用这么麻烦
    或者将 Dism++ 等工具放在 Image.iso 或 virtio-win.iso 里,这样可以在 Windows Setup 环境下解决问题

参考文献

  1. BetaWorld Wiki(由此改编)
  2. 封面:BetaWorld Wiki
  3. 51CTO 博客——党志强