Linux 根文件系统的移植(从入门到精通)
一、简介
提到操作系统的安装,还得从大学的时候说起,刚入学的时,朋友的系统本崩了,跑去电脑城换个系统花了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 开发板的学习过程,慢慢的去发现其中的奥秘。
系统架构分析
在开始之前,先看一下 linux 的架构图

注意: 从图可以看出来,这是 Android 系统的机构图,同理,不论是 busybox、Debian、ubuntu 等操作系统都是在 linux 之上的。系统移植
不论选择的操作系统是什么,但是在移植之前,需要先把 uboot 和 kerner 移植完成,这里不是重心,准确说这个两个的移植也不是很难,不论是分开的,还是合在一起的 SDK,官方都会提供相应的教程,再不济也有厂商进行指导。可以说操作系统的移植相反变成最简单的了,但是没有相应的教程,然后又有各种各样的操作系统,会出现各种奇怪的问题,导致小伙伴们觉得这是最难的。不要慌,这里我做了一系列的笔记,接着往后看。
之所以说操作系统的移植是最简单的,因为他是公用的,并不会因为芯片的差异进行改动,准确是操作系统的核心基本上都是能跑起来的,移植也是没任何难度,百度随便搜搜都能出来,如果 SDK 中没有的,可以模仿模仿,装个系统没有难度。有的小伙伴就会害怕,不知从和下手,我得到的结论就是随便去找一个对应系统的移植,然后跟着操作,最后烧写到对应的空间即可。
学习嵌入式,最忌讳的就是只看不练,一番操作下来,就会发现问题了,虽然操作系统是移植成功了。可能会出现各种外设不能使用,甚至界面都起不起来等各种问题。别慌只需要将遇到的问题解决了即可,解决这些问题也很简单的,接着往后看。
busybox 移植
移植 busybox 还挺简单的,因为没有过多的组件,甚至连图形界面都没有,所以不论什么芯片,一般不会遇到问题,这里就不过多介绍了,需要的看后面的笔记。ubuntu 移植
应该很多小伙伴都尝试过移植 ubuntu 的,虽然操作起来比 busybox 还简单,但是会遇到各种各样的问题,比如有的网卡不能工作,图形界面起不来等。遇到问题后,直接慌了,很多都找不到解决办法。接着往下看,慢慢的掌握解决问题的办法,剩下的就是时间问题了。组件移植
这里我们以 busybox 为例,开始处理各种问题,移植过的小伙伴会发现,busybox 的操作很简单,基本不会遇到啥问题,但是它移植成功后,只有操作系统的核心组件,其他啥都没有,需要我们一个个的移植,这里我有以 QT 环境的移植为例,请参考合集后面的笔记buildroot 和 yocto 使用
操作完就会发现,每个工具都这样的移植也挺麻烦的,并且组件多了也很费时,所以出现了 buildroot 和 yocto 这样的工具,来解决这个比较困难的问题,这里我用过 buildroot,请参考合集后面的笔记,yocto 我使用过后,再附上。deb 文件打包
在了解打包 deb 文件之前,先观察一下之前所经历的事情,我们都知道 busybox 是简单的工具集,只能满足常规的linux 工具需求,像需要 QT 环境之类的,还得需要自己手动移植过来。为了解决这个麻烦,buildroot 和 yocto 工具实现了快速定制的过程,减少了自己手动移植的时间。可能细心的小伙伴已经发现了,像板子需要的文件,都是通过工具的形式出现的,比如 GPU、NPU、各种外设等,每家的芯片都有一定的却别,想要在根文件系统中调用对应的硬件,需要将厂商提供的工具,编译成对用的 .so 和 .a 文件,然后放到系统中,再根据对应的 API 即可调用。
明白了这一步,那基本掌握了,移植时,外设不能使用等问题的解决办法。同理,每个开发板都会提供对应的 SDK,我们便可以参考 SDK 解决自己的问题,比如我移植 ubuntu 时,发现 GPU 不能用,便可以去厂商提供的 SDK,找到对应的文件,拷贝到系统中即可解决。
但是一直这样不断的去拷贝文件,也是比较麻烦了,为了以后同类芯片的问题简单话,每个环境需要的文件整理好,打包成 deb 需要的时候直接安装即可。
写脚本
哪怕我们将需要的文件都打包成了 deb 文件,文件多了,操作起来也是很麻烦的,所以可以参考厂家提供的 SDK,直接将自己需要的流程编写成一个脚本,然后一条命令便可解决复杂的问题。
三、总结
现在在整体回顾一下流程,将会发现移植自己需要的系统也是挺简单的,流程如下
- 选择自己需要的系统
- 整理自己需要的外设和工具文件
- 打包成系统能识别的工具包
- 编写脚本并打包成 img 文件
- 烧写验证
** 注意:** 虽然看起来挺简单的,但是需要各位小伙伴多多练习,彻底掌握其中奥秘。
笔记还没写完,后续我会持续添加,有写得不好的地方望大佬指出,有也我一样还在学习过程中的,可以一起相互讨论。
Linux 根文件系统的移植(从入门到精通)的更多相关文章
- linux根文件系统 /etc/resolv.conf 文件详解
Linux根文件系统/etc/resolv.conf文件,它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序.该文件是由域名解析器(resolver,以恶 ...
- linux根文件系统制作
在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误. 那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/l ...
- Linux根文件系统的制作
转载:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076655.html 1. 根文件系统 文件系统是包括在一个磁盘(包括光盘.软盘.闪盘及 ...
- 18.14 构建Linux根文件系统
18.14.1 Busybox1.7.0之init程序分析 1.读取配置文件 2.解析配置文件 3.执行用户程序(根据配置文件中指定的内容) 配置文件: 1.指定应用程序 2.何时执行 busybox ...
- 使用BusyBox制作linux根文件系统(CramFS+mdev)
转:http://www.360doc.com/content/10/0428/11/496343_25245348.shtml 操作系统:Ubuntu9.04 内核版本:linux-2.6.24.7 ...
- 构建Linux根文件系统(未完待续)
所谓制作根文件系统, 就是创建各种目录, 并且在里面创建各种文件. 比如在/bin ./sbin 目录下存放各种可执行程序, 在/etc 目录下存放配置文件, 在/lib 目录下存放库文件 ...
- 基于mini2440嵌入式Linux根文件系统制作(Initramfs和nfs两种跟文件系统)
嵌入式系统由三部分构成: 1.bootoader---bootparameters---2.kernel 3.Root-filesysytem 一个内核可以挂载多个文件系统,但是有一个根文件系统所以叫 ...
- 制作linux根文件系统
转载地址:http://wenku.baidu.com/view/2cb1b4707fd5360cba1adb14.html 2011十一月 24 转 嵌入式根文件系统制作 (3985) (0) 转自 ...
- Linux 根文件系统的制作
一.建立根文件系统目录与文件 1. 创建目录 #mkdir rootfs #cd rootfs #mkdir bin dev etc lib proc sbin sys usr mnt tmp var ...
- Linux根文件系统
root :文件系统是文件系统的顶级目录.它必须包含在挂载其它文件系统前需要用来启动 Linux 系统的全部文件.它必须包含需要用来启动剩余文件系统的全部可执行文件和库.文件系统启动以后,所有其他文件 ...
随机推荐
- 应急响应靶机训练-Linux2
靶机来源: 知攻善防实验室公众号 https://mp.weixin.qq.com/s/xf2FgkrjZg-yWlB9-pRXvw 我是在另一台主机上通过ssh连接到靶机进行解题的,我的ip为192 ...
- C#调用HTTP POST请求上传图片
public static string UploadImage(string uploadUrl, string imgPath, string fileparameter = "file ...
- KingbaseES 行级安全策略介绍
本文详细介绍了KingbaseES中通过CREATE POLICY为一个表定义一条行级安全性策略.注意为了应用已被创建的策略,在表上必须启用行级安全性. 策略名称是针对每个表的.因此,一个策略名称可以 ...
- Java,substring( )方法
该方法可以获取一个String字符串的(x,y)个字符. 其中x和y是左闭右开的,左边的可以取到,右边的取不到,并且索引从0开始. 例如 1 String text = "reliableY ...
- 禅道16.2版本发布!主要新增专业研发看板,修复Bug
大家好,禅道16.2发布了,本次发布在项目管理模型层面新增了专业研发看板功能,今后禅道全面支持Scrum.瀑布.看板3种项目管理模型,功能更加健全,用户选择更加灵活. 视频地址:https://www ...
- #树上启发式合并,位运算#CF570D Tree Requests
题目 给定一个以 \(1\) 为根的 \(n\) 个结点的树,每个点上有一个字母\((a-z)\),每个点的深度定义为该节点到 \(1\) 号结点路径上的点数. 每次询问 \(a, b\) 查询以 \ ...
- 【Kotlin】类和对象
1 前言 Kotlin 是面向对象编程语言,与 Java 语言类似,都有类.对象.属性.构造函数.成员函数,都有封装.继承.多态三大特性,不同点如下. Java 有静态(static)代码块,Ko ...
- Tailscale 的 TLS 证书过期,网站挂了 90 分钟!
3月7日,基于 WireGuard 的知名 VPN 厂商 Tailscale 的官方网站 tailscale.com 因 TLS 证书过期而中断服务约90分钟. 虽然影响有限,但这起事件还是在 Hac ...
- Prometheus 性能调优-水平分片
简介 之前笔者有连续 2 篇文章: Prometheus 性能调优 - 什么是高基数问题以及如何解决? 如何精简 Prometheus 的指标和存储占用 陆续介绍了一些 Prometheus 的性能调 ...
- 《深入理解Java虚拟机》读书笔记: 虚拟机类加载的时机和过程
虚拟机类加载的时机和过程 一.类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation ...