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