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客户端选项设置。