作者:Shabbirk,AMD工程师
本篇博文涵盖了有关使用 PetaLinux 命令行来对 Versal™ ACAP 的 PetaLinux BSP 运行 QEMU 的信息,并演示了 QEMU 支持的部分网络选项。
QEMU (Quick EMUlator) 是一种开源跨平台系统仿真器。它是一个可执行程序,可在 x86 Linux 或 Windows 操作系统上运行。
QEMU 可对整个系统进行仿真(通常它被称为访客),如赛灵思 ZCU102 或 VCK190 开发板。
仿真包括处理器、外设以及开发板上的其它硬件,支持您在虚拟化硬件上启动操作系统或其它应用。
要在虚拟化硬件中开发此类应用,只需使用物理硬件上所用的相同工具链即可。
QEMU 也可通过诸如 CAN、以太网和 USB 等接口来与主机进行交互,支持在访客机器中实时使用来自主机的现实世界数据。
赛灵思 QEMU 随 PetaLinux 和 Yocto 工具链一起分发,并与 SDK/Vitis 集成。
请确保根据 PetaLinux 用户指南 (UG1144) 中所述,安装在 Linux 主机上构建 PetaLinux 工程所需的所有 Linux 程序包。请参阅此文档的“Installation Steps”(安装步骤)部分,其中提供了所有必需的程序包,因此尤为重要。
此处所示的演示使用的是预构建的镜像,无须再构建 PetaLinux 工程。
基于 VCK190 BSP 创建工程的步骤
$ source/settings.sh
注:对于基于 bash 的 shell,请选择 settings.sh,对于基于 C 语言的 shell,请选择 settings.csh。
$ petalinux-create -t project -s xilinx-vck190-v2020.2-final.bsp -n xilinx-qemu-first-run
$ cd xilinx-qemu-first-run
$ petalinux-build(如使用预构建镜像,则此步骤为可选)
下列步骤详述了如何使用 PetaLinux BSP 工程随附的 QEMU 预构建二进制文件来启动 VCK190 平台。
我们将使用下列命令随 U-Boot 和 Linux 内核一并启动 QEMU。
使用 QEMU 启动 U-boot:
$ petalinux-boot --qemu --prebuilt 2
使用 QEMU 启动内核:
$ petalinux-boot --qemu --prebuilt 3
如果要在运行 petalinux-build 后启动构建的镜像,则所用 QEMU 命令行与此处所示不同,应遵循下述步骤进行操作:
构建 PetaLinux BSP 工程后,下一步是使用命令行生成 BOOT.BIN 二进制文件:
$ petalinux-package --boot --plm --psmfw --uboot --dtb --force
QEMU 启动直至完成 U-Boot 启动为止:
$ petalinux-boot --qemu --uboot
QEMU 启动直至完成 Linux 内核启动为止:
$ petalinux-boot --qemu --kernel
要退出仿真,请按 Ctrl+A,然后按 X。
下一节将侧重于讲解赛灵思 QEMU 所提供的基本网络功能及其测试方式。
QEMU 可对小型子网(或 LAN)进行仿真,包括 DHCP 服务器、网关和 DNS 服务器;即访问互联网所需的所有一切均可仿真。
启动 QEMU 并登录系统。使用 ifconfig 实用工具来将网络设置检出。
结果如下:
root@xilinx-vck190-2020_2:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0A:35:00:22:01
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::20a:35ff:fe00:2201/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1152 (1.1 KiB) TX bytes:4732 (4.6 KiB)
Interrupt:30
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
此处 eth0 是 PS GEM 以太网的接口。通过 RX 和 TX 字节计数可见,部分网络流量已累计。这可能是由于启动期间发生的 DHCP 采集所导致的。
以下列出了部分 QEMU 网络功能,并简要解释了其测试功能。
1. 测试网络:
我们可以正常使用此网络连接,与连接到主机网络时几乎相同。
例如,您可以从赛灵思 Github 仓库下载文件。
在 QEMU 上已启动的 Linux 内,输入以下命令:
root@xilinx-vck190-2020_2:~# wget https://github.com/Xilinx/qemu-devicetrees/archive/master.zip
输出应如下所示:
Connecting to codeload.github.com (192.30.255.120:443)
master.zip 100% |**********************************************************| 133k 0:00:00 ETA
这是从赛灵思公共 Github 仓库检索得到的 DTS 工程的源代码 tarball。您可使用 unzip 命令解压此文件。
注:从 QEMU 去 ping 主机是无效的。
2. QEMU 中的网络文件系统 (NFS) 装载
NFS 支持将任一设备上的某个目录与网络中其它设备共享。
预构建的 PetaLinux BSP 具有 rootfs 和 Linux 内核,可通过 NFS 选项加载。因此,NFS 无需进行重新构建或重新配置。以下是在 Linux 主机上使用 QEMU 设置 NFS 的简单步骤:
检查在主机上是否已安装 NFS 服务器
dpkg -l | grep nfs-kernel-server
如未安装,请使用以下命令进行安装:
sudo apt-get install nfs-kernel-server
NFS 服务器安装完成后,请添加要共享的本地目录。
以下示例显示了如何在 /etc/exports 文件的导出设置中添加 /home/test_nfs 目录:
对于此示例,我们将在 NFS 条目中添加“insecure”选项。
/home/test_nfs *(rw,sync,no_root_squash,insecure)
我们还可以为 NFS 服务器主机分配 IP 地址,替代以上命令中的 *。
$ sudo exportfs -ra
使用 petalinux-boot 启动 QEMU,如下所示:
$ petalinux-boot --qemu --prebuilt 3
QEMU 启动完成后,登录访客机。使用以下命令将主机 NFS 文件系统装载到 QEMU 下的 /tmp 目录中。
$ mount -o port=2049,nolock,proto=tcp:/home/test_nfs/ /tmp
要查找 host_ip,请使用 ifconfig 或类似的 IP 实用工具。
现在,我们可以在访客机的 /tmp 目录下看到共享的文件。
3. 使用 TFTP 进行文件传输
QEMU 具有内置 TFTP 功能,支持在访客机与主机之间轻松进行往来文件传输。
如果原先已运行 QEMU,请退出,在主机终端上,创建一个新目录,并在其中包含一个文件:
$ mkdir -p /home/${USER}/qemu-training-tftp$ echo "hello QEMU world" >> /home/${USER}/qemu-training-tftp/file.txt
此新目录中的 file.txt 将包含我们的“hello QEMU world”文本行。
QEMU 需要额外参数以建立到该目录的 TFTP 访问:-tftp /home/${USER}/qemu-training-tftp
如果使用的是 PetaLinux,请使用修改后的命令重新启动 QEMU:
$ petalinux-boot --qemu --prebuilt 3 --qemu-args "-tftp /home/${USER}/qemu-training-tftp"
这将覆盖新目录的默认 TFTP 目录设置。
从访客机发起的任何 TFTP 请求都将指向刚创建的此目录。
内置 TFTP 服务器 IP 为 10.0.2.2
root@xilinx-vck190-2020_2:~# tftp -g -r file.txt 10.0.2.2
对此文件执行 cat 命令,查看内容是否正确:
root@xilinx-vck190-2020_2:~# cat file.txt
4. 使用 SCP 进行文件传输
在主机与访客机之间可使用 scp 命令通过 SSH 来传输文件。
scp 语法如下:
$ scp
远程路径采用如下语法:
user@host:/path/to/file
例如,如果将文件从主机复制到访客机,则命令输出如下所示:
root@xilinx-vck190-2020_2:~# scp <主机用户名>@<主机 IP>:/scratch/doc-example/myapp.elf .
Host '<主机 IP>' is not in the trusted hosts file.
(ecdsa-sha2-nistp256 fingerprint sha1!! 18:7e:92:d0:33:ed:97:e7:cb:b2:f7:b1:5d:52:5f:a6:34:9a:97:f9)
Do you want to continue connecting? (y/n) y
komlodi@'s password:
myapp.elf 100% 18KB 17.7KB/s 00:00
5. 通过 SSH 进入 QEMU
要通过 SSH 进入 QEMU,需要向 QEMU 传递其它实参。
例如,如果在 Versal ACAP 工程上使用 PetaLinux:
$ petalinux-boot --qemu --prebuilt 3 --qemu-args "-net nic,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::1114-:22 -net nic"
登录 QEMU 机器。
在主机终端内,运行以下所示命令以通过 SSH 访问 QEMU。
$ ssh -p 1114 root@localhost
《赛灵思 QEMU 用户指南》:(UG1169)
《PetaLinux 用户指南》:(UG1144)
开源 QEMU 文档:
https://www.qemu.org/documentation/
NFS 设置指南:
https://help.ubuntu.com/community/SettingUpNFSHowTo