1d6aed566Sopenharmony_ci# Qemu ARM Virt 教程 - liteos_a 2d6aed566Sopenharmony_ci 3d6aed566Sopenharmony_ci## 1. 简介 4d6aed566Sopenharmony_ci 5d6aed566Sopenharmony_ci`arm_virt/` 子目录包含部分Qemu ARM虚拟化平台验证的OpenHarmony kernel\_liteos\_a的适配代码,含驱动配置、板端配置等。 6d6aed566Sopenharmony_ci 7d6aed566Sopenharmony_ciARM 虚拟化平台是一个 `qemu-system-arm` 的目标设备,通过它来模拟一个通用的、基于ARM架构的单板。 8d6aed566Sopenharmony_ciQemu中machine为 **virt** 的单板就是这种可配置的,例如:选择核的类型、核的个数、内存的大小和安全特性等,单板设备的配置。 9d6aed566Sopenharmony_ci 10d6aed566Sopenharmony_ci这次模拟的配置是:Cortex-A7架构,1个CPU,带安全扩展,GICv2,1G内存。 11d6aed566Sopenharmony_ci提示: 系统内存硬编码为64MB。 12d6aed566Sopenharmony_ci 13d6aed566Sopenharmony_ci## 2. 环境搭建 14d6aed566Sopenharmony_ci 15d6aed566Sopenharmony_ci参考链接: [环境搭建](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/Readme-CN.md) 16d6aed566Sopenharmony_ci 17d6aed566Sopenharmony_ci## 3. 获取源码 18d6aed566Sopenharmony_ci 19d6aed566Sopenharmony_ci参考链接: [代码获取](https://gitee.com/openharmony/docs/blob/HEAD/zh-cn/device-dev/get-code/sourcecode-acquire.md) 20d6aed566Sopenharmony_ci 21d6aed566Sopenharmony_ci## 4. 源码构建 22d6aed566Sopenharmony_ci 23d6aed566Sopenharmony_ci在已经获取的源码根目录,请输入: 24d6aed566Sopenharmony_ci 25d6aed566Sopenharmony_ci``` 26d6aed566Sopenharmony_cihb set 27d6aed566Sopenharmony_ci``` 28d6aed566Sopenharmony_ci 29d6aed566Sopenharmony_ci选择ohemu下的`qemu_small_system_demo`选项。 30d6aed566Sopenharmony_ci 31d6aed566Sopenharmony_ci 32d6aed566Sopenharmony_ci然后执行构建命令如下: 33d6aed566Sopenharmony_ci 34d6aed566Sopenharmony_ci``` 35d6aed566Sopenharmony_cihb build 36d6aed566Sopenharmony_ci``` 37d6aed566Sopenharmony_ci 38d6aed566Sopenharmony_ci在构建完成之后,对应的结果文件在out/arm_virt/qemu_small_system_demo/目录。 39d6aed566Sopenharmony_ci 40d6aed566Sopenharmony_ci 41d6aed566Sopenharmony_ci## 5. 在Qemu中运行镜像 42d6aed566Sopenharmony_ci 43d6aed566Sopenharmony_cia) 如果没有安装 `qemu-system-arm` ,安装请参考链接 [Qemu installation](https://gitee.com/openharmony/device_qemu/blob/HEAD/README_zh.md) 44d6aed566Sopenharmony_ci 45d6aed566Sopenharmony_ci提示:当前引入的功能在virt-5.1的目标machine已经完成测试,不保证所有的Qemu版本都能够运行成功,因此需要保证你的qemu-system-arm 46d6aed566Sopenharmony_ci版本尽可能在5.1及以上。 47d6aed566Sopenharmony_ci 48d6aed566Sopenharmony_cib) 制作以及运行镜像 49d6aed566Sopenharmony_ci 50d6aed566Sopenharmony_ci在代码根目录下,编译后会生成qemu-run脚本,可直接运行该脚本,根据脚本提示制作、运行镜像。 51d6aed566Sopenharmony_ci 52d6aed566Sopenharmony_ci执行`./qemu-run --help`获取帮助。 53d6aed566Sopenharmony_ci 54d6aed566Sopenharmony_ci网卡模拟的是无线网卡wlan0,但无真的wifi功能;默认不加参数的情况下,网络不会自动配置。 55d6aed566Sopenharmony_ci 56d6aed566Sopenharmony_ci当镜像文件out/smallmmc.img存在时,默认不会被重新制作。MMC镜像主要内容为rootfs和userfs,第1个分区为rootfs,第2个分区为userfs,安装在/storage目录,第3个分区为用户数据,安装在/userdata目录。 57d6aed566Sopenharmony_ci 58d6aed566Sopenharmony_cic) 退出qemu环境 59d6aed566Sopenharmony_ci 60d6aed566Sopenharmony_ci按下`Ctrl-A + x`可退出qemu虚拟环境。 61d6aed566Sopenharmony_ci 62d6aed566Sopenharmony_ci## 6. gdb调试 63d6aed566Sopenharmony_ci 64d6aed566Sopenharmony_ci安装`gdb-multiarch`工具包: 65d6aed566Sopenharmony_ci``` 66d6aed566Sopenharmony_cisudo apt install gdb-multiarch 67d6aed566Sopenharmony_ci``` 68d6aed566Sopenharmony_ci然后, 69d6aed566Sopenharmony_ci``` 70d6aed566Sopenharmony_cicd ohos/vendor/ohemu/qemu_small_system_demo/kernel_configs 71d6aed566Sopenharmony_civim debug.config 72d6aed566Sopenharmony_ci``` 73d6aed566Sopenharmony_ci 74d6aed566Sopenharmony_ci将 `LOSCFG_CC_STACKPROTECTOR_ALL=y` 修改为: 75d6aed566Sopenharmony_ci 76d6aed566Sopenharmony_ci``` 77d6aed566Sopenharmony_ci# LOSCFG_CC_STACKPROTECTOR_ALL is not set 78d6aed566Sopenharmony_ciLOSCFG_COMPILE_DEBUG=y 79d6aed566Sopenharmony_ci``` 80d6aed566Sopenharmony_ci 81d6aed566Sopenharmony_ci保存并退出,在OHOS根目录重新编译: 82d6aed566Sopenharmony_ci 83d6aed566Sopenharmony_ci``` 84d6aed566Sopenharmony_cihb build -f 85d6aed566Sopenharmony_ci``` 86d6aed566Sopenharmony_ci 87d6aed566Sopenharmony_ci在一个窗口中输入命令: 88d6aed566Sopenharmony_ci 89d6aed566Sopenharmony_ci``` 90d6aed566Sopenharmony_ci./qemu-run -g 91d6aed566Sopenharmony_ci``` 92d6aed566Sopenharmony_ci 93d6aed566Sopenharmony_ci在另一个窗口中输入命令: 94d6aed566Sopenharmony_ci 95d6aed566Sopenharmony_ci``` 96d6aed566Sopenharmony_cigdb-multiarch out/arm_virt/qemu_small_system_demo/OHOS_Image 97d6aed566Sopenharmony_ci(gdb) target remote localhost:1234 98d6aed566Sopenharmony_ci``` 99d6aed566Sopenharmony_ci 100d6aed566Sopenharmony_ci更多gdb相关的调试可以查阅:[gdb指导手册](https://sourceware.org/gdb/current/onlinedocs/gdb)。 101d6aed566Sopenharmony_ci 102d6aed566Sopenharmony_ci## 7. 用法示例 103d6aed566Sopenharmony_ci 104d6aed566Sopenharmony_ci- [向内核传递参数](example.md#sectiondebug) 105d6aed566Sopenharmony_ci 106d6aed566Sopenharmony_ci- [用MMC映像传递文件](example.md#sectionfatfs) 107d6aed566Sopenharmony_ci 108d6aed566Sopenharmony_ci- [添加一个Hello World程序](example.md#addhelloworld) 109d6aed566Sopenharmony_ci 110d6aed566Sopenharmony_ci- [运行图形demo](example.md#simple_ui_demo) 111d6aed566Sopenharmony_ci 112d6aed566Sopenharmony_ci- [观察dsoftbus组网发现](example.md#dsoftbus_discover) 113d6aed566Sopenharmony_ci 114d6aed566Sopenharmony_ci- [Hack图形桌面](example.md#desktop) 115d6aed566Sopenharmony_ci 116d6aed566Sopenharmony_ci## FAQ: 117d6aed566Sopenharmony_ci1. 当网络配置出现问题时,如何排查问题? 118d6aed566Sopenharmony_ci 119d6aed566Sopenharmony_ci 手动配置主机网桥设备。Linux系统参考以下命令: 120d6aed566Sopenharmony_ci 121d6aed566Sopenharmony_ci ``` 122d6aed566Sopenharmony_ci sudo modprobe tun tap 123d6aed566Sopenharmony_ci sudo ip link add br0 type bridge 124d6aed566Sopenharmony_ci sudo ip address add 10.0.2.2/24 dev br0 125d6aed566Sopenharmony_ci sudo ip link set dev br0 up 126d6aed566Sopenharmony_ci 127d6aed566Sopenharmony_ci # 以下命令执行一次后即可注释掉 128d6aed566Sopenharmony_ci sudo mkdir -p /etc/qemu 129d6aed566Sopenharmony_ci echo 'allow br0' | sudo tee -a /etc/qemu/bridge.conf 130d6aed566Sopenharmony_ci ``` 131d6aed566Sopenharmony_ci 132d6aed566Sopenharmony_ci 配置完成后,用ip addr检查应有如下类似显示。当br0不存在或尖括号中为DOWN时,请重新检查配置命令。 133d6aed566Sopenharmony_ci 134d6aed566Sopenharmony_ci ``` 135d6aed566Sopenharmony_ci 5: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 136d6aed566Sopenharmony_ci link/ether 2e:52:52:0e:21:44 brd ff:ff:ff:ff:ff:ff 137d6aed566Sopenharmony_ci inet 10.0.2.2/24 scope global br0 138d6aed566Sopenharmony_ci valid_lft forever preferred_lft forever 139d6aed566Sopenharmony_ci ``` 140d6aed566Sopenharmony_ci 141d6aed566Sopenharmony_ci 当系统安装有docker等软件时,系统防火墙可能阻止网桥访问。 142d6aed566Sopenharmony_ci 143d6aed566Sopenharmony_ci `cat /proc/sys/net/bridge/bridge-nf-call-iptables`会显示结果:1 144d6aed566Sopenharmony_ci 145d6aed566Sopenharmony_ci 这时,可用如下命令打开访问许可: 146d6aed566Sopenharmony_ci 147d6aed566Sopenharmony_ci ``` 148d6aed566Sopenharmony_ci echo 0 | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables 149d6aed566Sopenharmony_ci ``` 150d6aed566Sopenharmony_ci 151d6aed566Sopenharmony_ci 提示:系统网络硬编码为10.0.2.0/24,网关10.0.2.2,网址随机选取。不同的客户机实例应使用不同的MAC和IP地址(flash、MMC映像文件也应不同),MAC地址可通过QEMU命令行传递,IP地址可在OHOS命令行中调整,如`ifconfig wlan0 inet 10.0.2.30`,或使用其它方法。 152d6aed566Sopenharmony_ci 153d6aed566Sopenharmony_ci2. qemu-run提示`qemu-system-arm`运行出错时,如何排查问题? 154d6aed566Sopenharmony_ci 155d6aed566Sopenharmony_ci qemu-run脚本中,完整的执行命令及参数解释如下: 156d6aed566Sopenharmony_ci 157d6aed566Sopenharmony_ci ``` 158d6aed566Sopenharmony_ci qemu-system-arm -M virt,gic-version=2,secure=on -cpu cortex-a7 -smp cpus=1 -m 1G \ 159d6aed566Sopenharmony_ci -bios out/arm_virt/qemu_small_system_demo/OHOS_Image.bin \ 160d6aed566Sopenharmony_ci -drive if=none,file=out/smallmmc.img,format=raw,id=mmc 161d6aed566Sopenharmony_ci -device virtio-blk-device,drive=mmc \ 162d6aed566Sopenharmony_ci -netdev bridge,id=net0 \ 163d6aed566Sopenharmony_ci -device virtio-net-device,netdev=net0,mac=12:22:33:44:55:66 \ 164d6aed566Sopenharmony_ci -device virtio-gpu-device,xres=960,yres=480 \ 165d6aed566Sopenharmony_ci -device virtio-tablet-device \ 166d6aed566Sopenharmony_ci -device virtio-rng-device \ 167d6aed566Sopenharmony_ci -vnc :20 \ 168d6aed566Sopenharmony_ci -s -S \ 169d6aed566Sopenharmony_ci -global virtio-mmio.force-legacy=false 170d6aed566Sopenharmony_ci ``` 171d6aed566Sopenharmony_ci 172d6aed566Sopenharmony_ci ``` 173d6aed566Sopenharmony_ci -M 虚拟机类型,ARM virt,GIC 2中断控制器,有安全扩展 174d6aed566Sopenharmony_ci -cpu CPU型号 175d6aed566Sopenharmony_ci -smp SMP设置,单核 176d6aed566Sopenharmony_ci -m 虚拟机可使用的内存限制 177d6aed566Sopenharmony_ci -bios 内核启动映像 178d6aed566Sopenharmony_ci -drive if=none 块设备映像文件设置 179d6aed566Sopenharmony_ci -netdev [可选]网卡后端设置,桥接类型 180d6aed566Sopenharmony_ci -device virtio-blk-device 块存储设备 181d6aed566Sopenharmony_ci -device virtio-net-device [可选]网卡设备 182d6aed566Sopenharmony_ci -device virtio-gpu-device GPU设备 183d6aed566Sopenharmony_ci -device virtio-tablet-device 输入设备 184d6aed566Sopenharmony_ci -device virtio-rng-device 随机数设备 185d6aed566Sopenharmony_ci -vnc :20 [推荐]远程桌面连接,端口5920 186d6aed566Sopenharmony_ci -s -S [可选]gdb单步调试 187d6aed566Sopenharmony_ci -global QEMU配置参数,不可调整 188d6aed566Sopenharmony_ci ``` 189d6aed566Sopenharmony_ci 190d6aed566Sopenharmony_ci 运行时,qemu-run遇到报错如下报错: failed to parse default acl file 191d6aed566Sopenharmony_ci 192d6aed566Sopenharmony_ci 可能是qemu安装方式不同,导致qemu配置文件路径存在一定差异: 193d6aed566Sopenharmony_ci 194d6aed566Sopenharmony_ci - 使用源码安装默认在/usr/local/qemu/etc/qemu 195d6aed566Sopenharmony_ci 196d6aed566Sopenharmony_ci - 使用部分Linux发行版安装工具进行安装时,默认在/ect/qemu/目录下 197d6aed566Sopenharmony_ci 198d6aed566Sopenharmony_ci 可根据实际情况,确认具体配置目录,并进行如下修改: 199d6aed566Sopenharmony_ci 200d6aed566Sopenharmony_ci ``` 201d6aed566Sopenharmony_ci echo 'allow br0' | sudo tee -a <配置文件路径> 202d6aed566Sopenharmony_ci ``` 203d6aed566Sopenharmony_ci 204d6aed566Sopenharmony_ci 205d6aed566Sopenharmony_ci3. 1.1.0LTS版本qemu运行无输出? 206d6aed566Sopenharmony_ci 207d6aed566Sopenharmony_ci LTS的代码存在一个内核启动缺陷,可以参考如下PR尝试解决问题: 208d6aed566Sopenharmony_ci 209d6aed566Sopenharmony_ci https://gitee.com/openharmony/kernel_liteos_a/pulls/324 210d6aed566Sopenharmony_ci 211d6aed566Sopenharmony_ci 212d6aed566Sopenharmony_ci4. VNC窗口不显示光标? 213d6aed566Sopenharmony_ci 214d6aed566Sopenharmony_ci virtio-tablet是个模拟平板输入的设备,QEMU不捕获设备,虚拟机不显示光标,由VNC客户端自行处理光标显示。请查看VNC客户端选项设置。