Linux 根文件系统的移植(从入门到精通)

linux · 浏览次数 : 7

小编点评

**学习过程总结:** 1. **系统架构分析**:了解 Linux 的架构图,理解操作系统之间的关系,便于移植操作系统。 2. **ARM 开发板学习**:从 uboot 和 kernel 移植到 rootfs 安装,逐步掌握嵌入式系统的操作方法。 3. **移植操作系统**:从 busybox、Ubuntu 到 yocto,逐一移植操作系统,遇到问题时尝试解决。 4. **工具包打包**:将外设和工具文件打包成 deb 文件,方便后续的烧写操作。 5. **脚本编写**:根据芯片的具体需求,编写脚本解决复杂问题,提升移植效率。 6. **测试和验证**:完成操作系统移植后,进行测试和验证,确保系统正常运行。

正文

一、简介

提到操作系统的安装,还得从大学的时候说起,刚入学的时,朋友的系统本崩了,跑去电脑城换个系统花了40大洋,震惊了贫穷的我。好像发现了商机,果断开始了折腾自己的电脑,然后用朋友的电脑进行测试,由于对启动项不了解,有次蹦了过后,自己花钱去维修电脑哪里安装了一次,偷偷的学习。在这样的不断折腾下,慢慢学会了 windows 系统的安装,因此蹭了不少饭。可能会有小伙伴觉得我们太弱了,确实我们非科班出生,然后又在化工专业下,身边的人在计算机方面都是小白,只能慢慢的学习。

发现 windows 系统的安装也不难啊,都是傻瓜式的操作,还是图形界面,唯一影响小白的就是主板的启动项不一样。后来听说人家计算机专业的都用 linux 系统,安装才是麻烦,于是我又开始了对 linux 的折腾,发现操作也差不多,甚至更简单了(x86架构下)。就这样机缘巧合的折腾下,被带到了嵌入式这个行业

有次拿到了一块 ARM 开发板(正点原子 i.MX6ULL),又回到了系统安装的道路,先从 uboot 移植到 kernel 移植再到 rootfs 安装,操作起来确实麻烦多了,教程很详细,感觉也不是很困难,然后就没多管了。

直到去年,得到了 RK 平台的 SDK,发现和我学的不一样,以前都是 uboot、kernel、rootfs分开的,感觉没啥难度,现在突然给合在一起,并且芯片的性能提上来了,可以支持 busybox、Debian、ubuntu、android、鸿蒙等,然后一看 SDK 中也没这些系统啊,也看到很多小伙伴在问,RK3588 怎么安装 ubuntu 系统之类的,这下我也开始慌了。

逛了一圈,也没详细的教程,但是看到别人都在用不同的种芯片开始装各种各样的系统。冷静下来分析了一下,没有相应的教程,只能靠自己慢慢琢磨,研究了一下 SDK,终于发现了套路,在这里记录一下,也希望能帮助到迷茫的小伙伴。

二、测试环境

下面是我测试过程中使用的开发板和环境,具体的可以更具自己的需求来,不做严格要求

  • 开发板:i.MX6ULL、RK3588、RK3288、RV1126
  • roots:busybox、debian、ubuntu、yocto
  • 开发环境:VMware(ubuntu18.04、ubuntu20.04)

三、学习过程

开始之前,先回顾一下 ARM 开发板的学习过程,慢慢的去发现其中的奥秘。

  1. 系统架构分析
    在开始之前,先看一下 linux 的架构图

    注意: 从图可以看出来,这是 Android 系统的机构图,同理,不论是 busybox、Debian、ubuntu 等操作系统都是在 linux 之上的。

  2. 系统移植
    不论选择的操作系统是什么,但是在移植之前,需要先把 uboot 和 kerner 移植完成,这里不是重心,准确说这个两个的移植也不是很难,不论是分开的,还是合在一起的 SDK,官方都会提供相应的教程,再不济也有厂商进行指导。

    可以说操作系统的移植相反变成最简单的了,但是没有相应的教程,然后又有各种各样的操作系统,会出现各种奇怪的问题,导致小伙伴们觉得这是最难的。不要慌,这里我做了一系列的笔记,接着往后看。

    之所以说操作系统的移植是最简单的,因为他是公用的,并不会因为芯片的差异进行改动,准确是操作系统的核心基本上都是能跑起来的,移植也是没任何难度,百度随便搜搜都能出来,如果 SDK 中没有的,可以模仿模仿,装个系统没有难度。有的小伙伴就会害怕,不知从和下手,我得到的结论就是随便去找一个对应系统的移植,然后跟着操作,最后烧写到对应的空间即可。

    学习嵌入式,最忌讳的就是只看不练,一番操作下来,就会发现问题了,虽然操作系统是移植成功了。可能会出现各种外设不能使用,甚至界面都起不起来等各种问题。别慌只需要将遇到的问题解决了即可,解决这些问题也很简单的,接着往后看。

  3. busybox 移植
    移植 busybox 还挺简单的,因为没有过多的组件,甚至连图形界面都没有,所以不论什么芯片,一般不会遇到问题,这里就不过多介绍了,需要的看后面的笔记。

  4. ubuntu 移植
    应该很多小伙伴都尝试过移植 ubuntu 的,虽然操作起来比 busybox 还简单,但是会遇到各种各样的问题,比如有的网卡不能工作,图形界面起不来等。遇到问题后,直接慌了,很多都找不到解决办法。接着往下看,慢慢的掌握解决问题的办法,剩下的就是时间问题了。

  5. 组件移植
    这里我们以 busybox 为例,开始处理各种问题,移植过的小伙伴会发现,busybox 的操作很简单,基本不会遇到啥问题,但是它移植成功后,只有操作系统的核心组件,其他啥都没有,需要我们一个个的移植,这里我有以 QT 环境的移植为例,请参考合集后面的笔记

  6. buildroot 和 yocto 使用
    操作完就会发现,每个工具都这样的移植也挺麻烦的,并且组件多了也很费时,所以出现了 buildroot 和 yocto 这样的工具,来解决这个比较困难的问题,这里我用过 buildroot,请参考合集后面的笔记,yocto 我使用过后,再附上。

  7. deb 文件打包
    在了解打包 deb 文件之前,先观察一下之前所经历的事情,我们都知道 busybox 是简单的工具集,只能满足常规的linux 工具需求,像需要 QT 环境之类的,还得需要自己手动移植过来。为了解决这个麻烦,buildroot 和 yocto 工具实现了快速定制的过程,减少了自己手动移植的时间。

    可能细心的小伙伴已经发现了,像板子需要的文件,都是通过工具的形式出现的,比如 GPU、NPU、各种外设等,每家的芯片都有一定的却别,想要在根文件系统中调用对应的硬件,需要将厂商提供的工具,编译成对用的 .so 和 .a 文件,然后放到系统中,再根据对应的 API 即可调用。

    明白了这一步,那基本掌握了,移植时,外设不能使用等问题的解决办法。同理,每个开发板都会提供对应的 SDK,我们便可以参考 SDK 解决自己的问题,比如我移植 ubuntu 时,发现 GPU 不能用,便可以去厂商提供的 SDK,找到对应的文件,拷贝到系统中即可解决。

    但是一直这样不断的去拷贝文件,也是比较麻烦了,为了以后同类芯片的问题简单话,每个环境需要的文件整理好,打包成 deb 需要的时候直接安装即可。

  8. 写脚本
    哪怕我们将需要的文件都打包成了 deb 文件,文件多了,操作起来也是很麻烦的,所以可以参考厂家提供的 SDK,直接将自己需要的流程编写成一个脚本,然后一条命令便可解决复杂的问题。

三、总结

现在在整体回顾一下流程,将会发现移植自己需要的系统也是挺简单的,流程如下

  1. 选择自己需要的系统
  2. 整理自己需要的外设和工具文件
  3. 打包成系统能识别的工具包
  4. 编写脚本并打包成 img 文件
  5. 烧写验证

** 注意:** 虽然看起来挺简单的,但是需要各位小伙伴多多练习,彻底掌握其中奥秘。
笔记还没写完,后续我会持续添加,有写得不好的地方望大佬指出,有也我一样还在学习过程中的,可以一起相互讨论。

与Linux 根文件系统的移植(从入门到精通)相似的内容:

Linux 根文件系统的移植(从入门到精通)

一、简介 提到操作系统的安装,还得从大学的时候说起,刚入学的时,朋友的系统本崩了,跑去电脑城换个系统花了40大洋,震惊了贫穷的我。好像发现了商机,果断开始了折腾自己的电脑,然后用朋友的电脑进行测试,由于对启动项不了解,有次蹦了过后,自己花钱去维修电脑哪里安装了一次,偷偷的学习。在这样的不断折腾下,慢

[转帖]linux系统下grub.cfg详解和实例操作

linux系统下grub.cfg详解和实例操作 简介 grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后,内核会根据grub配置文件中的配置,找到根分区所使用的文件系统对应的驱动,通过根分区文件系统对应的驱动,挂载根分区,从而达到启动操作系统的目的。 特殊变量

Linux 内存管理 pt.1

哈喽大家好,我是咸鱼 今天我们来学习一下 Linux 操作系统核心之一:内存 跟 CPU 一样,内存也是操作系统最核心的功能之一,内存主要用来存储系统和程序的指令、数据、缓存等 关于内存的学习,我会尽量以通俗易懂的方式且分成多篇文章去讲解 那么今天在 pt.1 文章中,我们来学习一下 Linux 中

systemctl 命令设置开机自启动失败

哈喽大家好,我是咸鱼。今天跟大家分享一个关于 Linux 服务(service)相关的案例 案例现象 我在 3 月 31日的时候发表了一篇《shell 脚本之一键部署安装 Nginx》,介绍了如何通过 shell 脚本一键安装 Nginx 我脚本中执行了 Nginx 开机自启动的命令,当我使用 sy

[转帖]Linux内核Memory Barrier

https://zhuanlan.zhihu.com/p/138886949 硬件模型 Memory barrier跟cache的实现有很强的相关性, 掌握cache的实现硬件对理解memory barrier很有帮助. 以基本的MESI协议为例, 它主要实现了4种状态: Modified. Cac

Linux 网络收包流程

哈喽大家好,我是咸鱼 我们在跟别人网上聊天的时候,有没有想过你发送的信息是怎么传到对方的电脑上的 又或者我们在上网冲浪的时候,有没有想过 HTML 页面是怎么显示在我们的电脑屏幕上的 无论是我们跟别人聊天还是上网冲浪,其实都依靠于计算机网络这项技术 > 计算机网络是指将多台计算机通过通信设备和传输介

[转帖]Linux kernel内存管理之overcommit相关参数

前言 了解 linux kernel内存管理,首先可以从用户空间的角度来看kernel的内存管理,执行ls /proc/sys/vm的命令,就可以看到vm运行的所有参数,其中就包含了跟overcommit相关的参数。 Memory overcommit概念介绍 要了解这类参数首先要理解什么是comm

[转帖]Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰

一.网络流量上不去二.中断绑定 2.1 关闭中断平衡守护进程 2.2 脱离中断平衡守护进程 2.3 手动设置中断的CPU亲和性三. 总结 一.网络流量上不去 在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下: 网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理

[转帖]Linux性能分析:理解系统平均负载

Linux系统中,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。它不仅包括了正在使用CPU的进程,也包括处于不可打断的睡眠状态的进程—它们是在等待其它系统资源如磁盘 I/O 等的进程。而CPU使用率,是单位时间内CPU繁忙情况的统计,跟平均负载并不一定完全对应。 有诸多方式监测系统平

【转帖】Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰

一.网络流量上不去二.中断绑定 2.1 关闭中断平衡守护进程 2.2 脱离中断平衡守护进程 2.3 手动设置中断的CPU亲和性三. 总结 一.网络流量上不去 在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下: 网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理