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, 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
相关推荐
Dream Algorithm31 分钟前
中国移动6周年!
网络·架构·信息与通信
GateWorld40 分钟前
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析(四)DPHY ECC
fpga开发·mipi csi2
贝塔实验室43 分钟前
FPGA 的硬件结构
arm开发·fpga开发·职场和发展·硬件架构·硬件工程·fpga·安全架构
小疆智控1 小时前
农田水利如何「聪明」起来?Modbus转Ethernet IP破解设备互联
网络·网络协议·tcp/ip
木mu升1 小时前
java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
网络·websocket·网络协议
Li-Yongjun3 小时前
深度解析 Linux 内核参数 net.ipv4.tcp_rmem:优化网络性能的关键
linux·网络·tcp/ip
GateWorld3 小时前
《深入解析SPI协议及其FPGA高效实现》-- 第三篇:FPGA实现关键技术与优化
fpga开发·开源协议
枷锁—sha4 小时前
【DVWA系列】——xss(Reflected)——Medium详细教程
前端·网络·web安全·网络安全·xss
不像程序员的程序媛4 小时前
http接口莫名奇妙返回body空白
网络·网络协议·http