最近需要在 X86_64 的 Windows 10 的机器上安装 arm64 指令集的银河麒麟 v10 操作系统,因此研究一下 QEMU 的使用方法。
简介
QEMU 是一款开源、跨平台的机器模拟器与虚拟机工具,核心两大能力:硬件模拟(全系统仿真) 和 用户态程序翻译,不需要依赖硬件虚拟化也能运行。
安装
Windows 安装
- 下载二进制安装包:https://qemu.weilnetz.de/w64/ ,下载
qemu‑w64‑setup‑xxxx.exe安装程序
- 安装,记住安装路径,默认:
C:\Program Files\qemu
- 把这个目录加到系统 PATH 环境变量(必须,否则 cmd 找不到 qemu‑xxx.exe)
- 关闭旧 cmd/PowerShell,新开终端验证
1
| qemu-system-aarch64.exe --version
|
Windows 模拟 arm64:需要额外下载QEMU_EFI.fd UEFI 固件文件。
使用
准备文件
- 下载** ARM64 UEFI 固件 QEMU_EFI.fd(edk2‑aarch64‑code.fd)**,ARM 虚拟机没有 BIOS,靠 EFI 固件引导。
- 下载 ARM64 系统 ISO 镜像(Ubuntu‑ARM64 / 银河麒麟 ARM64 等)
- 创建虚拟磁盘(cmd 执行)
1
| qemu-img create -f qcow2 kylin_arm64_disk.qcow2 60G
|
安装系统
安装 银河麒麟V10桌面版
把下面保存为 install.bat,修改路径为你本机真实路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @echo off qemu-system-aarch64 ^ -machine virt,gic-version=3 ^ -cpu cortex-a72 ^ -m 8192 ^ -smp 4 ^ -bios edk2-aarch64-code.fd ^ -device qemu-xhci,id=usbbus ^ -drive file=kylin_arm64_disk.qcow2,if=virtio,format=qcow2 ^ -cdrom Kylin-Desktop-V10-SP1-2503-Release-20250430-ARM64.iso ^ -device virtio-net-pci,netdev=net0 ^ -netdev user,id=net0 ^ -device usb-kbd,bus=usbbus.0 ^ -device usb-tablet,bus=usbbus.0 ^ -device virtio-gpu-pci,max_outputs=1 ^ -display sdl ^ -accel tcg,thread=multi,tb-size=512 ^ -serial stdio
|
参数说明:
-M virt:QEMU 标准 ARM 虚拟机板卡
-cpu cortex‑a72:模拟 ARMv8‑A CPU;也可以写max
-accel tcg,thread=multi:软件多线程翻译,x86 Windows 唯一可用加速选项virtio-win
-nic user:NAT 网络,虚拟机可访问外网
-bios:指定 aarch64 EFI 固件,**缺少直接黑屏无法启动
安装完成后,把命令里的 cdrom 那一行删掉,就是正常启动虚拟机脚本。
安装 银河麒麟V10服务器版
把下面保存为 install.bat,修改路径为你本机真实路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @echo off qemu-system-aarch64 ^ -machine virt,gic-version=3 ^ -cpu cortex-a72 ^ -m 8192 ^ -smp 4 ^ -bios edk2-aarch64-code.fd ^ -device qemu-xhci,id=usbbus ^ -drive file=kylin_arm64_disk.qcow2,if=virtio,format=qcow2 ^ -cdrom Kylin-Server-V10-SP3-2403-Release-20240426-ARM64.iso ^ -device virtio-net-pci,netdev=net0 ^ -netdev user,id=net0 ^ -device usb-kbd,bus=usbbus.0 ^ -device usb-tablet,bus=usbbus.0 ^ -device virtio-gpu ^ -accel tcg,thread=multi ^ -serial stdio
|
参数说明:
-M virt:QEMU 标准 ARM 虚拟机板卡
-cpu cortex‑a72:模拟 ARMv8‑A CPU;也可以写max
-accel tcg,thread=multi:软件多线程翻译,x86 Windows 唯一可用加速选项virtio-win
-nic user:NAT 网络,虚拟机可访问外网
-bios:指定 aarch64 EFI 固件,**缺少直接黑屏无法启动
安装完成后,把命令里的 cdrom 那一行删掉,就是正常启动虚拟机脚本。
启动系统
启动银河麒麟V10桌面版
把下面保存为 start_gui.bat,修改路径为你本机真实路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @echo off chcp 65001 >nul qemu-system-aarch64 ^ -machine virt,gic-version=3 ^ -cpu cortex-a72 ^ -m 8192 ^ -smp 4 ^ -bios edk2-aarch64-code.fd ^ -device qemu-xhci,id=usbbus ^ -drive file=kylin_arm64_disk.qcow2,if=virtio,format=qcow2 ^ -device virtio-net-pci,netdev=net0 ^ -netdev user,id=net0,hostfwd=tcp::2222-:22 ^ -device usb-kbd,bus=usbbus.0 ^ -device usb-tablet,bus=usbbus.0 ^ -device virtio-gpu-pci,max_outputs=1 ^ -display sdl ^ -accel tcg,thread=multi,tb-size=512 ^ -serial stdio
|
参数说明:
- 与安装脚本相比,主要删除了 cdrom 那一行
- -device virtio-gpu-pci,安装时使用的是 virtio-gpu,两者区别是: 底层 GPU 逻辑完全一样,只是总线类型不同。由于场景为
-machine virt(aarch64 virt 板子),推荐用 virtio-gpu-pci,麒麟 V10 ARM64 对 PCI 设备驱动识别更稳。
- -netdev user,id=net0,hostfwd=tcp::2222-:22,宿主机的 2222 端口映射虚拟机ssh 22 端口。
- -device e1000,netdev=net0, e1000 是模拟传统网卡,稳定性更好,避开部分 QEMU 版本 virtio-net + user netdev 的端口转发异常。
进入桌面后,设置默认启动目标:多用户字符模式,然后把下面保存为 start_nogui.bat,以便下次直接进入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @echo off chcp 65001 >nul qemu-system-aarch64 ^ -machine virt,gic-version=3 ^ -cpu cortex-a72 ^ -m 6144 ^ -smp 2,cores=2,threads=1 ^ -bios edk2-aarch64-code.fd ^ -drive file=kylin_arm64_disk.qcow2,if=virtio,format=qcow2 ^ -device virtio-net-pci,netdev=net0 ^ -netdev user,id=net0,hostfwd=tcp::2222-:22 ^ -accel tcg,thread=multi,tb-size=1024,one-insn-per-tb=off ^ -serial stdio ^ -no-reboot
|
启动银河麒麟V10服务器版
把下面保存为 start.bat,修改路径为你本机真实路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @echo off qemu-system-aarch64 ^ -machine virt,gic-version=3 ^ -cpu cortex-a72 ^ -m 8192 ^ -smp 4 ^ -bios edk2-aarch64-code.fd ^ -device qemu-xhci,id=usbbus ^ -drive file=kylin_arm64_disk.qcow2,if=virtio,format=qcow2 ^ -netdev user,id=net0,hostfwd=tcp::2222-:22 ^ -device e1000,netdev=net0 ^ -device usb-kbd,bus=usbbus.0 ^ -device usb-tablet,bus=usbbus.0 ^ -device virtio-gpu-pci ^ -accel tcg,thread=multi ^ -serial stdio
|
参数说明:
- 与安装脚本相比,主要删除了 cdrom 那一行
- -device virtio-gpu-pci,安装时使用的是 virtio-gpu,两者区别是: 底层 GPU 逻辑完全一样,只是总线类型不同。由于场景为
-machine virt(aarch64 virt 板子),推荐用 virtio-gpu-pci,麒麟 V10 ARM64 对 PCI 设备驱动识别更稳。
- -netdev user,id=net0,hostfwd=tcp::2222-:22,宿主机的 2222 端口映射虚拟机ssh 22 端口。
- -device e1000,netdev=net0, e1000 是模拟传统网卡,稳定性更好,避开部分 QEMU 版本 virtio-net + user netdev 的端口转发异常。
SSH访问
银河麒麟V10桌面版设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 1. 查看sshd状态 systemctl status sshd
# 如果没装,安装并启动 sudo apt-get install openssh-server -y sudo systemctl start sshd sudo systemctl enable --now ssh.service
# 2. 查看监听端口,确认sshd监听 22 ss -tlnp | grep sshd
# 3. 防火墙放行22端口(麒麟默认防火墙会拦截!这个是高频坑) sudo firewall-cmd --add-service=ssh --permanent sudo firewall-cmd --reload
|
原因是内核启动参数:security=kysec。
KYSEC 是银河麒麟 V10 内置安全模块,执行控制(exec control)开启强制模式时,只允许系统自带、带有 kysec 安全标记的 ELF 程序运行。
自编译的hello、上传的pi属于外来二进制,没有 kysec 安全标记,execve 直接返回 EACCES,bash 提示权限不够,和你现象完全吻合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| # 查看**当前正在生效**的内核启动参数
cat /proc/cmdline
# 修改/etc/default/grub,注释下行
GRUB_CMDLINE_LINUX_SECURITY="security=kysec"
# 更新grub,并重启 sudo update-grub reboot
# 持久软模式(重启虚拟机仍然保持 softmode) sudo setstatus softmode -p
# 编辑.bashrc文件 vim .bashrc
# 末尾增加 # 代理开关别名 alias proxy-on='export ALL_PROXY=socks5://127.0.0.1:7890;export HTTP_PROXY=http://127.0.0.1:7890;export HTTPS_PROXY=http://127.0.0.1:7890;export NO_PROXY=localhost,127.0.0.1,10.0.2.0/24;echo "✅ 代理已开启"' alias proxy-off='unset ALL_PROXY HTTP_PROXY HTTPS_PROXY;echo "❌ 代理已关闭"'
source .bashrc
# 查看公网 IP 的地理位置 curl ipinfo.io curl -s myip.ipip.net
|
银河麒麟V10服务器版设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 1. 查看sshd状态 systemctl status sshd
# 如果没装,安装并启动 sudo dnf install openssh-server -y sudo systemctl start sshd sudo systemctl enable sshd
# 2. 查看监听端口,确认sshd监听 22 ss -tlnp | grep sshd
# 3. 防火墙放行22端口(麒麟默认防火墙会拦截!这个是高频坑) sudo firewall-cmd --add-service=ssh --permanent sudo firewall-cmd --reload
|
1 2 3 4 5 6
| # 虚拟机内修改ssh配置允许root登录(测试用) sudo vi /etc/ssh/sshd_config # 修改: PermitRootLogin yes # 重启sshd sudo systemctl restart sshd
|
生产环境不建议 root 直接 ssh;你可以新建普通用户登录。
Nodejs安装
- 下载最新的Linux Arm64 Nodejs LTS版
- 解压 node-v24.21.0-linux-arm64.tar.xz 到 /opt/node
1 2
| sudo mkdir -p /opt/node sudo tar -Jxf node-v24.21.0-linux-arm64.tar.xz -C /opt/node --strip-components=1
|
1 2 3
| sudo vim /etc/profile # 文件末尾加入下列行,并保存 export PATH="/opt/node/bin:$PATH"
|
问题记录
虚拟机分辨率调整
启动麒麟v10桌面版系统,分辨率太低,只有640*480的解决方法:
1 2 3 4 5 6
| # 打开终端,查看显示器名称 xrandr
# 直接设置 1080P
xrandr --output Virtual-1 --mode 1920x1080
|
虚拟机启动太慢
1 2 3 4 5 6 7 8 9 10 11 12
| # 设置默认启动目标:多用户字符模式 sudo systemctl set-default multi-user.target
# 验证 systemctl get-default # 输出 multi-user.target 就是成功
reboot
# 恢复开机图形(以后需要桌面时) sudo systemctl set-default graphical.target reboot
|
参考链接
- qemu,by qemu.
- Running QEMU VMs on ARM64: UEFI Requirements,by Nikita Vakula.
- windows qemu 安装 arm 虚拟机,by 三希.
- 安装与配置麒麟V10操作系统,by huawei.