实验环境
Windows on ARM
关于如何获取Windows on ARM的系统镜像,可以阅读:使用UUP构建Windows镜像。
QEMU
首先下载最新版QEMU。
QEMU的安装位置需要记牢,在安装程序会出现,后面需要用到。
UEFI固件
下载文件名开头为edk2.git-aarch64
的文件,并用7-Zip等解压缩工具多次解压,直至提取出QEMU_EFI.fd
和vars-template-pflash.raw
这两个文件。
VirtIO ARM64驱动光盘
配置环境变量
按下 Windows徽标键+R,输入SystemPropertiesAdvanced
并回车
点击“环境变量”。
在“系统变量(S)”里找到名为“Path”的项并双击,点击旁边的“新建(N)”,最后在矩形框中输入QEMU的安装目录。
然后全部点击“确定”即可。
创建硬盘文件
以管理员身份运行cmd,输入以下命令。
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)
那么我的命令如下(需要区分大小写,而且路径和文件名不要有空格,用下划线_代替)
qemu-img.exe create -f qcow2 E:\QEMU\ARM\OS.qcow2 60G
没有别的提示就代表成功了
最后,将QEMU_EFI.fd
、vars-template-pflash.raw
这两个文件一并复制到存放位置。
启动系统
在存放的目录(我的是E:\QEMU\ARM)下新建文本文档,命名为start.cmd
,并编辑内容。
chcp 65001
,这样cmd内提示的中文报错就不会乱码。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 ^
-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,亦或者是其它)
CPU核心数量为4,运行内存大小为4096MiB,硬盘文件、系统镜像和virtio-win镜像命名分别为Image.iso
、OS.qcow2
和virtio-win-0.1.225.iso
(若start.cmd
与前面几个文件在同一目录下就不需要指定目录,直接填写名称即可)
那么我的命令如下(需要区分大小写,而且路径和文件名不要有空格,用下划线_代替,或者在收尾添加英文引号: "
)
qemu-system-aarch64.exe -M virt,virtualization=true -cpu cortex-a76 -smp 4 -m 4096 ^
-device qemu-xhci -device usb-kbd -device usb-tablet ^
-drive file=OS.qcow2,if=virtio ^
-nic user,model=virtio ^
-drive file=Image.iso,media=cdrom,if=none,id=cdrom -device usb-storage,drive=cdrom ^
-drive file=virtio-win-0.1.225.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的引导页。
若有如下报错为正常,无需理会第一个是未指定vars-template-pflash.raw
的格式(已在文中更新代码,故不会出现该报错),第二个不知道有什么用。(反正不影响.jpg
但或者是这种找不到文件的报错,则需要自己在文件名前加上路径。
安装系统
然后就这样漫长的等待,就会进入到Windows安装程序页。
在选择磁盘的时候,点击“加载驱动程序(L)”。
选择“浏览(B)”。
选择virtio-win光驱。
找到名为“viostor”的文件夹,选择里面“w11”文件夹下的“ARM64”文件夹。(如果安装的是 Windows10则选择w10)
选择驱动程序,然后点击“下一页(N)”,这样就可以正常安装系统了。
最后进入无尽的等待…
记得开启“鼠标经过时捕获”(“Grab On Hover”)或“捕获输入”(“Grab Input”)。
从进入安装程序到准备就绪,花了近一个半小时(没什么意外的话,可能这个要转114514h(悲(而且鉴于无法联网,且硬盘驱动都要自己加载,所以这个过程跳过也没啥问题()
这里不得不说一下CPU默认才1.0GHz属实吝啬,不过不难看出它真的在动了(
有需要的话可以自己搜一下“QEMU配置CPU”
当我把QEMU升级之后之后就被识别出是虚拟机力(无慈悲
按下Shift+F10打开CMD窗口,并输入以下命令
OOBE\MSOOBE
然后就会跳过那漫长的准备就绪阶段。
再等待亿会,就可以进入OOBE了。
由于暂时没有网卡驱动,且Windows 11要求联网才能继续,所以需要跳过联网激活验证。(Windows 10可跳过该步骤)
按下Shift+F10打开CMD窗口,并输入以下命令
OOBE\BypassNRO
explorer
并打开,然后再按网卡驱动的方式安装网卡驱动。等待一会,系统会自动重启,然后就可以继续正常安装了。
可能你会遇到“为什么我的电脑重启了?”这个提示,无需理会,点击“下一步(N)”即可。
接着就可以按照正常方式继续安装了。
一切都开始好起来力)
网卡驱动
以管理员身份启动PowerShell然后在命令框中输入以下命令并重启。
bcdedit /set testsigning on
打开virtio-win光驱,然后定位到\NetKVM\w11\ARM64(如果是Windows 10 就选择w10文件夹)右键类型为“安装信息”的netkvm.inf
文件,选择“安装”。
在弹出的UAC窗口中选择“是”,等待一会,提示安装完成,再等一会就有网络了。
这是最后在里面运行Dism++ ARM64的效果。(启动速度和运行效率会比x86转译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 on ARM性能会大打折扣,整个过程会非常漫长,建议将文件存放在SSD内。
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的32位和64位安装包
- qemupciserial/:QEMU PCI串口设备驱动
- *.vfd:用于Windows XP下的VFD软驱镜像
4. 如果运行真的很慢,可以看看BetaWiki给出的解决方案。(不一定100%有效)
以管理员身份打开CMD,粘贴以下命令
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