QEMU使用教程

最近需要在 X86_64 的 Windows 10 的机器上安装 arm64 指令集的银河麒麟 v10 操作系统,因此研究一下 QEMU 的使用方法。

简介

QEMU 是一款开源、跨平台的机器模拟器与虚拟机工具,核心两大能力:硬件模拟(全系统仿真) 和 用户态程序翻译,不需要依赖硬件虚拟化也能运行。

安装

Windows 安装

  1. 下载二进制安装包:https://qemu.weilnetz.de/w64/ ,下载qemu‑w64‑setup‑xxxx.exe安装程序
  2. 安装,记住安装路径,默认:C:\Program Files\qemu
  3. 把这个目录加到系统 PATH 环境变量(必须,否则 cmd 找不到 qemu‑xxx.exe)
  4. 关闭旧 cmd/PowerShell,新开终端验证
1
qemu-system-aarch64.exe --version

Windows 模拟 arm64:需要额外下载QEMU_EFI.fd UEFI 固件文件。

使用

准备文件

  1. 下载** ARM64 UEFI 固件 QEMU_EFI.fd(edk2‑aarch64‑code.fd)**,ARM 虚拟机没有 BIOS,靠 EFI 固件引导。
  2. 下载 ARM64 系统 ISO 镜像(Ubuntu‑ARM64 / 银河麒麟 ARM64 等)
  3. 创建虚拟磁盘(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
@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桌面版

把下面保存为 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桌面版

把下面保存为 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服务器版设置

  • 确认 ssh 服务是否就绪
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
  • 解禁 root 直接 ssh 登录
1
2
3
4
5
6
# 虚拟机内修改ssh配置允许root登录(测试用)
sudo vi /etc/ssh/sshd_config
# 修改:
PermitRootLogin yes
# 重启sshd
sudo systemctl restart sshd

生产环境不建议 root 直接 ssh;你可以新建普通用户登录。

银河麒麟V10桌面版设置

  • 确认 ssh 服务是否就绪
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
  • ssh 访问无法执行可执行程序的问题

原因是内核启动参数: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

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
  • 将 node 路径永久加入系统 PATH
1
2
3
sudo vim /etc/profile
# 文件末尾加入下列行,并保存
export PATH="/opt/node/bin:$PATH"
  • 验证
1
2
node -v
npm -v

问题记录

虚拟机分辨率调整

启动麒麟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

参考链接

  1. qemu,by qemu.
  2. Running QEMU VMs on ARM64: UEFI Requirements,by Nikita Vakula.
  3. windows qemu 安装 arm 虚拟机,by 三希.
  4. 安装与配置麒麟V10操作系统,by huawei.