RK3568/RK3588 KVM系统虚拟化解决方案
buildroot 编译
为啥要用 buildroot
- 支持很多:交叉编译工具链、根文件系统生成、内核映像编译和引导加载程序编译。
- 使用简单:使用类似内核的 menuconfig、gconfig 和 xconfig配置界面,使用 buildroot 构建基本系统很容易。
- 支持很多的包:很多 benchmark 的测试,qemu,kvmtools等都集成在里面。
基本介绍
目录结构

- config:配置文件
- dl:下载的软件包
- output:输出文件
- package:软件包版本,编译配置信息
配置界面:

主要关注:
- Target options:用于为构建目标选择特性和配置参数
- Toolchain:该选项用于配置工具链和编译器特性
- System configuration:该选项用于配置生成的文件系统的配置文件和启动特性
- Target packages:该选项用于选择和配置所需要的软件包和软件环境
- Filesystem images:该选项用于配置经 buildroot 编译构建后的文件系统的镜像格式
虚拟机根文件系统需设置:


配置保存
配置文件作为.config 存储在顶级 buildroot 源目录中。它是一个完整的配置文件,它包含所有选项的值。efconfig 只存储选择了非默认值选项的值,这样更容易阅读、修改,可以用于配置的自动化构建。对于默认的 buildroot 配置,defconfig 是空的,一切都是默认的。
在 configs / 目录下,有许多已经配置好的 *_defconfig
,我们可以根据它来生成.config 文件。
make *_defconfig
然后再:
make menuconfig
它会覆盖当前的.config 文件,如果要保存,则可以使用:
make savedefconfig
升级 qemu
默认的 qemu 不支持 cortex-a55,最新的 qemu8.2.0 则支持。
下载最新的 qemu-8.2.0.tar.xz
,并把它放入 dl
目录。
修改 package/qemu
目录下的 qemu.mk
:
QEMU_VERSION = 8.2.0
QEMU_SOURCE = qemu-$(QEMU_VERSION).tar.xz
QEMU_SITE = http://download.qemu.org
QEMU_LICENSE = GPL-2.0, LGPL-2.1, MIT, BSD-3-Clause, BSD-2-Clause, Others/BSD-1c
QEMU_LICENSE_FILES = COPYING COPYING.LIB
并且在 qemu 的编译配置中 (搜索宏 QEMU_CONFIGURE_CMDS
),添加编译参数:
--disable-hexagon-idef-parser
kernel 编译
配置
make ARCH=arm64 CROSS_COMPILE=/home/yue/beauty/proj/rk356x_linux_release_v1.3.0b_20221213/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- menuconfig
选择 KVM:

配置 console:

关联根文件系统:

编译
ake ARCH=arm64 CROSS_COMPILE=/home/yue/beauty/proj/rk356x_linux_release_v1.3.0b_20221213/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- j8
输出
- arch/arm64/boot/Image
- vmlinux
file
一下发现:
- Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages
- vmlinux: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=dad4c3147e36034c9cb13a786bd8e238f740504b, with debug_info, not stripped
查看编译信息:
SORTEX vmlinux
SYSMAP System.map
OBJCOPY arch/arm64/boot/Image
Building modules, stage 2.
MODPOST 418 modules
编译报错
在编译 buildroot
中的 dtc
库的时候:
error:multiple definition of `yylloc'
屏蔽 dtc-parse.tab.c
文件中 1205 行左右的 YYLTYPE yylloc
,或者 extern YYLTYPE yylloc
:
/* The semantic value of the lookahead symbol. */
YYSTYPE yylval;
/* Location data for the lookahead symbol. */
//YYLTYPE yylloc
# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
= { 1, 1, 1, 1 }
# endif
;
在编译 buildroot
中的 ctest
库时候:
buildroot/output/build/host-cmake-3.8.2/Source/cmServerProtocol.cxx:626:39: error: 'numeric_limits' is not a member of 'std'
此时需要添加头文件引用:
#include <stdexcept>
#include <limits>
在编译 qemu 的时候:
FAILED: target/hexagon/idef-parser
link meson-generated_idef-parser.tab.c.o libglib-2.0.so: error adding symbols: file in wrong format
使用 file 查看这两个文件发现,一个是 x86,一个是 aarch64
--disable-hexagon-idef-parser
信息查看
内核版本:
cat /proc/version
Linux version 4.19.232 (root@yue-yi-machine) ((HEAD: f7165816db073abb32bfe4f754a317d687c7bbcf) (sdk version: rk356x_linux_release_20230710_v1.3.2f.xml) (gcc version 10.3.1 20210621
root@RK356X:/#
发行版本:
cat /etc/issue
Welcome to RK356X Buildroot
CPU 信息:
root@RK356X:/# lscpu
Architecture: aarch64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Vendor ID: ARM
Model name: Cortex-A55
Model: 0
Thread(s) per core: 1
Core(s) per cluster: 4
Socket(s): -
Cluster(s): 1
Stepping: r2p0
CPU max MHz: 1992.0000
CPU min MHz: 408.0000
BogoMIPS: 48.00
另外:cat /proc/cpuinfo 可以查看每一个 CPU 信息。
** 内存信息:** 单位为 MB
root@RK356X:/# free -m
total used free shared buff/cache available
Mem: 3837 106 3567 1 163 3690
Swap: 0 0 0
分区信息:
me@ubuntu:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 875M 0 875M 0% /dev
tmpfs 185M 3.0M 182M 2% /run
/dev/mmcblk0p2 29G 4.0G 24G 15% /
tmpfs 924M 0 924M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 924M 0 924M 0% /sys/fs/cgroup
/dev/loop0 58M 58M 0 100% /snap/core20/1614
/dev/loop2 92M 92M 0 100% /snap/lxd/24065
/dev/loop1 62M 62M 0 100% /snap/lxd/22761
/dev/loop3 36M 36M 0 100% /snap/snapd/20674
/dev/mmcblk0p1 253M 121M 132M 48% /boot/firmware
tmpfs 185M 0 185M 0% /run/user/1000
查看是否开启了 KVM:
查看开机信息:
[ 0.011336] CPU: All CPU(s) started at EL2
[ 0.106179] kvm [1]: IPA Size Limit: 44 bits
[ 0.107506] kvm [1]: vgic interrupt IRQ9
[ 0.107646] kvm [1]: Hyp mode initialized successfully
编译时确认:
如果是 buildroot 编译,可以查看 kernel/arch/arm64/configs
目录下,指定的配置文件是否有 CONFIG_VIRTUALIZATION
宏,如果没有,需要自己配置添加上。
命令查看:
zcat /proc/config.gz | grep "CONFIG_VIRTUALIZATION"
得到 shell 输出:
CONFIG_VIRTUALIZATION=y