使用 QEMU 启动 ARM aarch64 架构 Ubuntu 虚拟机

本文将介绍如何使用 QEMU 启动 aarch64 架构的 Ubuntu 操作系统以及宿主机上相关配置的操作方法。

安装 QEMU

安装启动 aarch64 ubuntu 所需的依赖程序:

1
2
3
4
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager qemu
sudo apt install qemu-system-aarch64
sudo apt install qemu-efi-aarch64
sudo apt install qemu-utils

创建镜像

1
2
3
4
5
6
7
8
9
10
dd if=/dev/zero of=flash1.img bs=1M count=64
dd if=/dev/zero of=flash0.img bs=1M count=64
dd if=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd of=flash0.img conv=notrunc


wget http://ports.ubuntu.com/ubuntu-ports/dists/xenial-updates/main/installer-arm64/current/images/netboot/mini.iso

qemu-img create ubuntu-image.img 20G


安装系统

1
2
3
4
5
6
qemu-system-aarch64 -nographic -machine virt,gic-version=max -m 512M -cpu max -smp 4 \
-netdev user,id=vnet,hostfwd=:127.0.0.1:0-:22 -device virtio-net-pci,netdev=vnet \
-drive file=ubuntu-image.img,if=none,id=drive0,cache=writeback -device virtio-blk,drive=drive0,bootindex=0 \
-drive file=mini.iso,if=none,id=drive1,cache=writeback -device virtio-blk,drive=drive1,bootindex=1 \
-drive file=flash0.img,format=raw,if=pflash -drive file=flash1.img,format=raw,if=pflash

启动镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
网络架构:
+-----------------------------------------------------------------+
| Host |
| +---------------------+ |
| | | |
| | br0: | |
| | 192.168.199.32/24 +-----+ |
| | | | |
| +----+----------------+ | +-------------------------+ |
| | | | Guest | |
| | | | +---------------------+ | |
| +----+----------------+ +--+---+ | | | | |
| | | | | | | eth0: | | |
| | enp3s0: | | tap0 | | | 192.168.199.33/24 | | |
| | 192.168.199.30/24 | | +-----+ | | |
| | | | | | +---------------------+ | |
| +---------------------+ +------+ +-------------------------+ |
+-----------------------------------------------------------------+


# 配置网桥
sudo ip link add name br0 type bridge
sudo ip link set dev br0 down
sudo ip addr flush dev br0
sudo ip addr add 192.168.199.32/24 dev br0
sudo ip link set dev br0 up

# 配置 tap 设备 tap0:
sudo ip tuntap add name tap0 mode tap
sudo ip link set dev tap0 up

# 将宿主机网络接口 enp3s0 和 tap0 接入网桥 br0:
sudo ip link set enp3s0 master br0
sudo ip link set tap0 master br0

# 启动虚拟机系统:
sudo qemu-system-aarch64 -nographic -machine virt,gic-version=max -m 1G -cpu max -smp 4 \
-netdev tap,id=mynet0,ifname=tap0,script=no,downscript=no \
-device virtio-net-pci,netdev=mynet0,mac=$(qemu-mac-hasher.py ubuntu1604-arm64) \
-drive file=ubuntu-image.img,if=none,id=drive0,cache=writeback \
-device virtio-blk,drive=drive0,bootindex=0 \
-drive file=flash0.img,format=raw,if=pflash -drive file=flash1.img,format=raw,if=pflash \
-device virtio-rng-pci

# 以上命令指定 qemu 使用 tap 设备作为虚拟机网络接口并且指定使用刚刚创建的 tap0 接口。

# 为了指定虚拟器的 MAC 地址我们使用一个脚本来为每个虚拟机生成特定地址。MAC 地址的生成脚本如下:

# qemu-mac-hasher.py
#!/usr/bin/env python
# usage: qemu-mac-hasher.py <VMName>
import sys
import zlib

crc = str(hex(zlib.crc32(sys.argv[1].encode("utf-8"))))[-8:]
print("52:54:%s%s:%s%s:%s%s:%s%s" % tuple(crc))

# 虚拟机启动后根据需要配置其网络参数即可。

网络优化

以上步骤完成后虚拟机可与宿主机所在网络的其他设备互连(包括宿主机),也可以通过指定的网关连接互联网,但是此时宿主机无法连接互联网,解决方法如下:

删除 enp3s0 接口的默认网关, 为 br0 添加默认网关:

1
2
sudo ip route del default dev enp3s0
sudo ip route add default via 192.168.199.1 dev br0

iperf2 交叉编译 ARM64 static版本

编译静态版本的iperf2,到嵌入式环境进行测试;

iperf2 可以利用多核多线程并行测试,iperf3的多核是运行在一个物理核上面,只是软件意义上的多核;

1
2
3
4
5
(base) root@mengxia01:~/code/iperf-2.0.4-RELEASE# diff config.h ../iperf-2.0.4-arm/config.h
258c258
< //#define bool int
---
> #define bool int
1
2
#编译命令
./configure --host=arm CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ CFLAGS="-static -fPIE -fPIC" LDFLAGS="-static -fPIE -fPIC"

Linux perf工具静态编译

在嵌入式环境中,有时候相关库比较少,所以需要单独编译静态版本的perf工具去定位问题,这里仅仅作为关键步骤记录,以备后续查阅

阅读更多

backtrader 简单双均线策略

策略的主要行为:
1) 初始化5日均线以及20日均线,sma5, sma20
2) sma5上穿sma20买入
3) sma5 下穿sma20卖出

策略绩效:

1
2
Starting Portfolio Value: 100000.00
Final Portfolio Value: 99796.00
阅读更多

backtrader (一)

当前组合版本: numpy==1.23.5 backtrader==1.9.78.123 matplotlib==5.6

但是始终在调用plot的时候出现错误:

1
2
AttributeError: 'Plot_OldSync' object has no attribute 'mpyplot'

尝试过不同的版本,都解决不了这个问题,目前尚不知道什么原因,暂时不使用画图,或者后续有空了用pyecharts自己画;

阅读更多

Qemu Virt平台集成ARM PL080 DMA

背景

最近有比较多的新员工入职,新员工入职如何更快的适应工作,需要通过一些虚拟项目进行工作培训;但是如果利用现有的芯片平台进行验证,有几个缺陷:

  • 当前芯片略显复杂,新员工接手理解难度较高
  • 平台已经solid,并且有参考的代码以及测试用例,对于新员工而言,没有起到端到端cover一个模块的作用
  • 难以预埋bug,无法通过挖掘设计bug,衡量验证效果

因此根据实际工作需求,设计了一个可以给到新员工练兵的验证项目,利用qemu平台,集成一个简单的DMA模块,并且在模块中预埋一些bug,让新员工提前感知在后续验证过程中,应该要重点关注的一些验证重点,验证难点,同时也可以观察在整个新员工项目过程中,新员工的表现,识别高潜人才;

阅读更多