使用 QEMU 启动 PolyOS Mobile
PolyOS ❤️ QEMU,本指南将引导您通过 QEMU 虚拟化工具启动 PolyOS Mobile。
QEMU 是一个广泛的支持开源的虚拟化软件,它可以在不同平台上模拟运行操作系统和应用程序。通过使用 QEMU ,您可以创建和管理虚拟机,运行不同硬件架构的操作系统,进行系统快照和实时迁移,并加速执行虚拟化任务,是启动 PolyOS Mobile 的理想选择。
概述
准备工作
在开始之前,为保证 PolyOS Mobile 的工作效率和使用体验,请确保您可以为 PolyOS Mobile 虚拟机分配、满足以下最小要求。
- CPU:4 核心、8 线程;
- 内存:8 Gib 内存;
- 系统:
- Ubuntu 20.04, 22.04
- Windows 10/11
我们在本文撰写过程中使用的测试环境为一台具有 i7-10700 CPU @ 2.90GHz,16 GiB 内存的物理机。
启动 PolyOS Moille 的步骤
我们只需要 3 个步骤即可在你的计算机上启动 PolyOS Mobile:
- 安装由 PolyOS 社区重新分发的 QEMU;
- 解压镜像;
- PolyOS Mobile,启动!
接下来我们将介绍如何在 Ubuntu 和 Windows 上的详细步骤。
QEMU 支持状态
特性 | Ubuntu | Windows |
---|---|---|
图形 | ✅ | ✅ |
音频 | ✅ | ✅ |
网络 | ✅ | ✅ |
鼠标 | ✅ | ✅ |
键盘 | ✅ | ✅ |
摄像头 | ✅ | 🔲 |
物理按键仿真 | ✅ | ✅ |
在 Ubuntu 上启动 PolyOS Mobile
本节内容在 Ubuntu 20.04 上经过测试,应在 21.04、21.10、22.04 等版本上可以正常工作。
在之后的代码案例中,请将/path/to
修改为您本地的安装路径。
安装 QEMU
PolyOS 社区为 Ubuntu 提供了 QEMU 预构建包,可以简单的通过 dpkg
包管理器来安装 PolyOS 社区重新分发的 QEMU。
- 点击下载
- curl
你可以点击下方的按钮直接获取 PolyOS 官方站点提供的 QEMU 预构建包。
下载 QEMU您可以使用 curl
命令从 PolyOS 官方站点下载 QEMU 预构建包:
curl --remote-name \
--location https://polyos.iscas.ac.cn/downloads/polyos-qemu-riscv64-7.1.0-1.x86_64.deb
现在,我们使用 dpkg
来安装 QEMU:
sudo dpkg -i /path/to/polyos-qemu-riscv64-7.1.0-1.x86_64.deb
QEMU 将被安装至 /opt/qemu-7.1.0
文件夹。
您需要确保一些额外的依赖已被正确安装:
sudo apt-get install libpixman-1-0 libepoxy0 libv4l-0 libpng16-16 \
libsdl2-2.0-0 libsdl2-image-2.0-0 libglib2.0-0 \
libasound2 libpulse0 osspd-alsa \
libusb-1.0-0 \
libncursesw5 \
libgtk-3-0 libgdk-pixbuf2.0-0 \
libx11-6
(可选)配置 QEMU 环境
您可以选择将 /opt/qemu-7.1.0
加入到您的环境变量中。
cat << EOF >> ~/.bashrc
export PATH=/opt/qemu-7.1.0/bin:$PATH
EOF
source ~/.bashrc
解压 PolyOS Mobile 镜像
在解压 PolyOS Mobile 的镜像文件之前,请确保您以获取了正确的 PolyOS Mobile 镜像,如果您没有获取到,请浏览 获取 PolyOS Mobile。
我们使用 tar
命令来解压 PolyOS Mobile 镜像文件:
tar -Jxvf /path/to/polyos-mobile-latest.img.tar.xz
镜像文件说明:
updater.img
:系统更新的镜像,主要包括一些用于系统更新的脚本和二进制文件。system.img
:只读的初始系统镜像,主要包括系统库。vendor.img
:hdf 驱动平台文件目录。userdata.img
:初始数据分区镜像,用于挂载/data
。kernel.img
: PolyOS Mobile 的二进制内核镜像。ramdisk.img
:boot
分区镜像。这是系统镜像的子集,将在内核挂载system.img
之前挂载,通常只包含一些二进制文件和初始化脚本。
启动 PolyOS Mobile
- 使用脚本启动
- manual
您可以选择直接使用一个初始化脚本来启动 PolyOS Mobile,该脚本附带在镜像文件中。
sh /path/to/qemu_riscv64_run_linux.sh
您同样可以选择使用手动调用 /opt/qemu-7.1.0/bin/qemu-system-riscv64
的方式来启动 PolyOS Mobile。
/opt/qemu-7.1.0/bin/qemu-system-riscv64 \
-machine virt \
-m 8096\
-smp 8 \
-drive if=none,file=./updater.img,format=raw,id=updater,index=3 \
-device virtio-blk-device,drive=updater \
-drive if=none,file=./system.img,format=raw,id=system,index=2 \
-device virtio-blk-device,drive=system \
-drive if=none,file=./vendor.img,format=raw,id=vendor,index=1 \
-device virtio-blk-device,drive=vendor \
-drive if=none,file=./userdata.img,format=raw,id=userdata,index=0 \
-device virtio-blk-device,drive=userdata \
-append "ip=dhcp loglevel=7 console=ttyS0,115200 init=init root=/dev/ram0 rw rootwait ohos.boot.hardware=riscv64_virt default_boot_device=10007000.virtio_mmio sn=8823456789 ohos.required_mount.system=/dev/block/vdb@/usr@ext4@ro,barrier=1@wait,required ohos.required_mount.vendor=/dev/block/vdc@/vendor@ext4@ro,barrier=1@wait,required ohos.required_mount.data=/dev/block/vdd@/data@ext4@nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc@wait,reservedsize=104857600" \
-kernel ./Image \
-initrd ./ramdisk.img \
-nographic \
-vga none \
-device virtio-gpu-pci,xres=550,yres=920,max_outputs=1,addr=08.0 \
-vnc :20 \
-device virtio-mouse-pci \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-pci,netdev=net0 \
-device virtio-camera-device,v4ldev=/dev/video0 \
-netdev bridge,id=net0 -device virtio-net-device,netdev=net0,mac=12:22:33:44:55:66\
-device virtio-keyboard-pci \
-device ac97 \
-k en-us \
-display gtk,gl=off
在 Windows 上启动 PolyOS Mobile
本节内容在 Windows 10 22H1 上经过测试,应当可以在之后 22H1 之后的构建版本及 Windows 11 上正常工作。
在之后的代码案例中,请将/path/to
修改为您本地的安装路径。
安装 QEMU
PolyOS 社区为 Window 提供了 QEMU 预构建包。
- 点击下载
- PowerShell
你可以点击下方的按钮直接获取 PolyOS 官方站点提供的 QEMU 预构建包。
下载 QEMU您可以使用 Invoke-WebRequest
从 PolyOS 官方站点下载 QEMU 预构建包:
$URL="https://polyos.iscas.ac.cn/downloads/polyos-qemu-riscv64-7.1.0-1.x86_64.exe"; `
Invoke-WebRequest -Uri $URL -OutFile $(Split-Path -Leaf $URL)
下载后,双击 .exe 文件直接以默认选项进行安装,QEMU 默认将被安装至 C:\Porgram Files\PolyOS QEMU
文件夹。
(可选)配置 QEMU 环境
您可以选择将 C:\Porgram Files\PolyOS QEMU
加入到您的环境变量中。
$env:Path = "C:\Porgram Files\PolyOS QEMU" + $env:Path
[Environment]::SetEnvironmentVariable("Path", $env:Path, "Machine")
如果上述代码在执行过程中报错,请确保您已经以管理员的身份运行 PowerShell,再重新执行该命令。
解压 PolyOS Mobile 镜像
在解压 PolyOS Mobile 的镜像文件之前,请确保您以获取了正确的 PolyOS Mobile 镜像,如果您没有获取到,请浏览 获取 PolyOS Mobile。
我们使用 tar
命令来解压 PolyOS Mobile 镜像文件:
tar -Jxvf /path/to/polyos-mobile-latest.img.tar.xz
如果您的电脑上没有 tar
命令,您可以通过安装 7-zip 或者其他解压软件来获取 tar
文件的解压支持。
启动 PolyOS Mobile
- 使用脚本启动
- manual
您可以选择直接使用一个初始化脚本来启动 PolyOS Mobile,该脚本附带在镜像文件中。
/path/to/qemu_riscv64_run_windows.ps1
如果上述脚本在执行过程中报错,有可能是因为您的系统禁止运行脚本。请确保您已经以管理员的身份运行 PowerShell,然后输入set-executionpolicy remotesigned
执行策略更改,再重新执行脚本。
您同样可以选择使用手动调用 C:\Porgram Files\PolyOS QEMU\bin\qemu-system-riscv64.exe
的方式来启动 PolyOS Mobile。
qemu-system-riscv64.exe \
-machine virt \
-m 8096\
-smp 8 \
-drive if=none,file=./updater.img,format=raw,id=updater,index=3 \
-device virtio-blk-device,drive=updater \
-drive if=none,file=./system.img,format=raw,id=system,index=2 \
-device virtio-blk-device,drive=system \
-drive if=none,file=./vendor.img,format=raw,id=vendor,index=1 \
-device virtio-blk-device,drive=vendor \
-drive if=none,file=./userdata.img,format=raw,id=userdata,index=0 \
-device virtio-blk-device,drive=userdata \
-append "ip=dhcp loglevel=7 console=ttyS0,115200 init=init root=/dev/ram0 rw rootwait ohos.boot.hardware=riscv64_virt default_boot_device=10007000.virtio_mmio sn=8823456789 ohos.required_mount.system=/dev/block/vdb@/usr@ext4@ro,barrier=1@wait,required ohos.required_mount.vendor=/dev/block/vdc@/vendor@ext4@ro,barrier=1@wait,required ohos.required_mount.data=/dev/block/vdd@/data@ext4@nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc@wait,reservedsize=104857600" \
-kernel ./Image \
-initrd ./ramdisk.img \
-nographic \
-vga none \
-device virtio-gpu-pci,xres=550,yres=920,max_outputs=1,addr=08.0 \
-vnc :20 \
-device virtio-mouse-pci \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-pci,netdev=net0 \
-device virtio-camera-device,v4ldev=/dev/video0 \
-netdev bridge,id=net0 -device virtio-net-device,netdev=net0,mac=12:22:33:44:55:66\
-device virtio-keyboard-pci \
-device ac97 \
-k en-us \
-display gtk,gl=off
在 Mac OS 上启动 PolyOS Mobile
本节内容在 Mac OS 13.5.1 M1上经过测试,应在其他版本上可以正常工作。
安装 QEMU
使用homebrew来直接安装qemu即可。关于homebrew,可以参考链接自行安装,不在本手册范围内。
brew install qemu
QEMU 将被安装至brew的文件夹。可以使用下面的命令查看brew的默认安装路径。
brew --prefix
这里,我们的qemu安装到了 /opt/homebrew/Cellar/qemu/8.1.0_1/
(可选)配置 QEMU 环境
您可以选择将 /opt/homebrew/Cellar/qemu/8.1.0_1/
加入到您的环境变量中。
cat << EOF >> ~/.bashrc
export PATH=/opt/homebrew/Cellar/qemu/8.1.0_1/bin:$PATH
EOF
source ~/.bashrc
解压 PolyOS Mobile 镜像
在解压 PolyOS Mobile 的镜像文件之前,请确保您以获取了正确的 PolyOS Mobile 镜像,如果您没有获取到,请浏览 获取 PolyOS Mobile。
我们使用 tar
命令来解压 PolyOS Mobile 镜像文件:
tar -Jxvf /path/to/polyos-mobile-latest.img.tar.xz
镜像文件说明:
updater.img
:系统更新的镜像,主要包括一些用于系统更新的脚本和二进制文件。system.img
:只读的初始系统镜像,主要包括系统库。vendor.img
:hdf 驱动平台文件目录。userdata.img
:初始数据分区镜像,用于挂载/data
。kernel.img
: PolyOS Mobile 的二进制内核镜像。ramdisk.img
:boot
分区镜像。这是系统镜像的子集,将在内核挂载system.img
之前挂载,通常只包含一些二进制文件和初始化脚本。
启动 PolyOS Mobile
- manual
您同样可以选择使用手动调用 /opt/homebrew/Cellar/qemu/8.1.0_1/bin/qemu-system-riscv64
的方式来启动 PolyOS Mobile。
将下面的脚本复制到新建的文件中并命名为qemu_riscv64_run_mac.sh
。
这里的cpus 和 memory 可以根据自己机器的配置自行调整。这个脚本和Linux的启动脚本有些许不同,不可直接用Linux的启动脚本。
cpus=4
memory="4096M"
image_path=$PWD
sudo /opt/homebrew/Cellar/qemu/8.1.0_1/bin/qemu-system-riscv64 \
-name PolyOS-Mobile \
-machine virt \
-m ${memory} \
-smp ${cpus} \
-no-reboot \
-netdev user,id=net0 \
-device virtio-net-device,netdev=net0,mac=12:22:33:44:55:66 \
-drive if=none,file=${image_path}/updater.img,format=raw,id=updater,index=3 \
-device virtio-blk-device,drive=updater \
-drive if=none,file=${image_path}/system.img,format=raw,id=system,index=2 \
-device virtio-blk-device,drive=system \
-drive if=none,file=${image_path}/vendor.img,format=raw,id=vendor,index=1 \
-device virtio-blk-device,drive=vendor \
-drive if=none,file=${image_path}/userdata.img,format=raw,id=userdata,index=0 \
-device virtio-blk-device,drive=userdata \
-append "loglevel=1 console=ttyS0,115200 init=init root=/dev/ram0 rw rootwait ohos.boot.hardware=riscv64_virt default_boot_device=10007000.virtio_mmio sn=8823456789 ohos.required_mount.system=/dev/block/vdb@/usr@ext4@ro,barrier=1@wait,required ohos.required_mount.vendor=/dev/block/vdc@/vendor@ext4@ro,barrier=1@wait,required ohos.required_mount.data=/dev/block/vdd@/data@ext4@nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc@wait,reservedsize=104857600" \
-kernel ${image_path}/Image \
-initrd ${image_path}/ramdisk.img \
-vga none \
-vnc :9920 \
-device virtio-gpu-pci,xres=486,yres=864,max_outputs=1,addr=08.0 \
-monitor telnet:127.0.0.1:55556,server,nowait \
-device virtio-mouse-pci \
-device virtio-keyboard-pci \
-device ac97 \
-k en-us \
-display cocoa
exit
连接使用
在Mac上,并不会自动弹出图形化界面来直接使用,这时候我们可以VNC。注意到启动参数有一个monitor telnet:127.0.0.1:55556
,这个类似于管理Console。
使用命令
telnet 127.0.0.1 55556
来登录到后台,这里可以输入help
查看一些常用命令操作。
我们使用info vnc
命令查看到当前的VNC端口是15980。
(qemu) info vnc
default:
Server: :::15820 (ipv6)
Auth: none (Sub: none)
(qemu) info
我们打开一个VNC Viewer输入IP和端口号即可。IP的查看可以在宿主机输入命令ifconfig
查看一下有没有198
开头的IP,大概率就是。
疑难解答
如何关闭摄像头?
摄像头通过为 QEMU 模拟器注册新的设备来开启,您可以在启动参数找到 --device virtio-camera-device,v4ldev=/dev/video
,通过简单的移除和添加,您可以以此关闭或开启摄像头。
摄像头的性能问题
摄像头功能对系统性能要求较高,建议暂时分配更多的 CPU 资源。
如何关闭物理按键仿真
物理按键仿真使用 GTK 来实现,您可以通过替换启动参数中的 gtk
选项为 sdl
来关闭物理按键仿真。
-display gtk,gl=off
=> -display sdl,gl=off
鼠标延迟过高
鼠标移动可能出现不流畅的情况,可以通过降低电脑分辨率改善。
当分辨率过小时,物理按键仿真将无法工作,会导致黑屏。
受到影响的分辨率:360x720
及以下。