近日,在 RK3588 设备上进行开发时,厂家提供基于 Buildroot 定制的精简 Linux 根文件系统不太适应,因此重新定制 Ubuntu 根文件系统并烧录。

1 问题所在:利其器

上学时,购买的开发板都是学习的利器,提供的资源以及资料,可以让初学者不费吹灰之力上手。然而,在工作中遇到的开发板可谓是一言难尽了。最近,使用某厂商开发的 RK3588 时,就遇到了一些问题,其根系统由 Buildroot 定制的精简系统。如果需要安装工具必然需要交叉编译后导入到板上才可使用,对于开发者而言可能并不是特别友好,因此考虑了几种可行方式旨在让开发过程变得顺畅,工欲善其事必先利其器嘛。

  • 安装 gcc 实现本地编译;
  • 通过写个 sh 脚本文件,实现一键自动交叉编译并 scp 到开发板;
  • 通过 docker 运行 ubuntu,然后编译。

毫无疑问,安装 gcc 是上上策,因为后续的开发规划中,RK3588 需要承担一定的上位机作用,首当其中的就要求 RK3588 可以实现本地编译。

通过一键执行脚本是下下策,因为这部分属于非主要开发工作,所以肯定不可能停留太多时间,所以规定了一个日期如果搞定不了好的方法,现阶段就优先采取这个方法。

docker 运行 ubuntu 执行编译,这个在多次发现镜像站失效后便放弃了,主要不熟悉的工具耗费的时间无可计量,会导致后续开发时间变得不可控。

2 问题引发的问题

通过上述,不难发现。虽说上面有三种方法,其实只有第一种是需要花费时间值得去尝试解决的,第二种方法并不能解决实质,第三种方法属于所熟悉技术路线以外的方法,是属于后续如果无法绕开会尝试的可行性替代方案。

如果是在 Ubuntu 上安装 gcc 只需要一步,当然,可能需要更换下 apt 的源并执行下 update。

1
sudo apt install gcc

可是 Buildroot 定制的根文件系统就没有 apt 这种包管理工具。不过 Buildroot 定制的根文件系统可以安装 gcc,然而现实是编译定制化支持 gcc 的根文件系统后依旧无法运行,原因还缺一些库文件。

从上述的实际操作出发,可以发现,如果没有包管理工具,单独交叉编译某个工具后,依然存在很多问题。于是,问题进一步进化为,如何在厂家提供的 SDK 上编译一个支持包管理的 linux 系统。

Buildroot 定制的系统是可以通过 "make menuconfig" 支持 opkg 包管理工具的,然而,通过实际操作发现其源相对比较难找,并且版本管理混乱,很难和 apt 相提并论,遂放弃研究。

3 回归底层

从浅薄认知出发,Linux 系统主要分为:

  • U-Boot,主要作用是启动 boot 以及加载 Kernel 和根文件系统 loader 两个功能;
  • Kernel,系统核心,板卡设备相关定义在该部分;
  • Rootfs,根文件系统,主要是工具以及面向用户的支持。

如果需要系统支持 apt 只需要将根文件系统替换为 Ubuntu 相关的底包即可。U-Boot 和 Kernel 继续与原厂 SDK 保持一致即可。

根文件系统编译一共有两种方法,一种是通过定义 Bulidroot 中的底包继续使用 Buildroot 定制即可;另一种是下载 Ubuntu 根文件系统,然后根据需求交叉编译生成根文件系统。

4 完美解决

根据上述方法,编译生成 rootfs.img 根文件系统后,通过 Rockchip 提供的开发工具,可以选择只升级 rootfs 镜像,从而实现官方 SDK 到 Ubuntu 的支持。

虽然,更新根文件系统到 Ubuntu 后,风扇便开始转个不停,但有一说一,除了能耗外,新系统真是比官方原厂提供的系统强太多。

  • 1.无需交叉编译,本地即可实现编译;
  • 2.得益于 apt 的支持,想装什么装什么;
  • 3.各种问题也可以找到通用解决方法;

总之,回归到熟悉的环境,常用的操作方式,效率各方面都提高了很多。

⚓ Carl Zhao
📧 邮箱:1005513510@qq.com
💭 曾经也是追光少年,然而少年归来已不再是少年,但依然在追光的路上。