RK3568/RK3588 KVM系统虚拟化解决方案

RK3568/RK3588 KVM系统虚拟化解决方案

buildroot 编译

为啥要用 buildroot

  1. 支持很多:交叉编译工具链、根文件系统生成、内核映像编译和引导加载程序编译。
  2. 使用简单:使用类似内核的 menuconfig、gconfig 和 xconfig配置界面,使用 buildroot 构建基本系统很容易。
  3. 支持很多的包:很多 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, BuildIDsha1=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
相关推荐
STQY燊桐启元(深圳)电子科技15 小时前
医疗精密电源散热方案:相变陶瓷片保障医疗设备长效稳定低干扰
大数据·网络·人工智能
CDN36017 小时前
节点智能调度实操:解决出海区域访问快慢不均、节点拥堵、跨洋延迟高,CDN 全网择优落地方案
运维·服务器·网络
roman_日积跬步-终至千里17 小时前
【数据治理(6)】DataOps 不是调度工具,而是让数据产品长期可信的运行机制
java·服务器·网络
可乐鸡翅yeah_19 小时前
个人 / 外包流媒体项目交付实战,M3U8 验收与问题闭环完整工作流
运维·网络·python·低代码·django·m3u8·在线播放
黄俊懿20 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第十节:网关安全-单向加密
网络·数据库·计算机网络·安全·架构·系统架构·架构师
Patrick在香港21 小时前
Python 拉取城巴开放数据:406 条路线,香港岛巴士网络的数字画像
网络·python·数据分析·php·数据可视化·香港·开放数据
一直C21 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
Experience-摆渡21 小时前
自建 IP 轮换方案实战:健康探测 + 熔断剔除 + 粘性会话
网络·网络协议·tcp/ip
luj_176821 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法
库玛西21 小时前
Linux网络编程:HTTP/HTTPS协议核心技术全解析
linux·运维·服务器·网络·c++·http·https