ARM busybox 的移植实战1

news2024/11/10 12:56:55

前言

先逐步构建 “文件夹形式”的根文件系统,然后制作烧录镜像。

(1) rootfs 有 2 种格式:nfs 方式启动的 “文件夹形式” 的 rootfs,和用来烧录的镜像形式的 rootfs。


(2) 我们先从空文件夹开始,逐步向其中添加一些 rootfs 中必备的东西,然后做一步就用 nfs 方式去挂载启动,观察启动后的现象,并且理论上去分析原因。


一、busybox 的移植实战

1、busybox源码下载

(1) busybox 是一个开源项目,所以源代码可以直接从网上下载。

(2) busybox 的版本差异不大,版本新旧无所谓。

(3) 下载 busybox 可以去 linuxidc 等镜像网站,也可以去 www.busybox.net 官方网站下载。

在这里插入图片描述

https://www.windowszj.net/pcsoft/youxi/25291.html

在这里插入图片描述


2、修改Makefile

(1) ARCH = arm
(2) CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-linux-

在这里插入图片描述


3、make menuconfig 进行配置

(1) 参照网盘中章节目录下的《busybox menuconfig配置.txt》文件中的记录进行配置。

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


4、make 然后 make install

(1) make 编译,如果有错误就去解决。

编译错误:

在这里插入图片描述


在 Kbuild 查看这个文件的编译配置:

在这里插入图片描述


在 make menuconfig 命令中,取消这个 sync 的选中。

在这里插入图片描述


最后重新编译,解决问题。

在这里插入图片描述


(2) 编译完成后,需要执行 make install 安装 busybox。make install 执行的时候,其实是在执行 busybox 顶层目录下的一个目标 install。


(3) make install 在所有的 linux 下的软件中,作用都是安装软件。

在传统的 linux 系统中安装软件时,都是选择源代码方式安装的。我们下载要安装的软件源代码,然后配置、编译、安装。make install 的目的就是,将编译生成的可执行程序及其依赖的库文件、配置文件、头文件安装到当前系统中指定(一般都可以自己指定安装到哪个目录下,如果不指定一般都有个默认目录)的目录下。

busybox 源代码指定的安装路径:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


(4) 重新进行安装,安装到我们需要的 rootfs 根文件系统目录下。

首先,清空原始的 rootfs 根文件系统目录。

在这里插入图片描述


修改安装目录为我们指定的根文件系统路径:/home/aston/workspace/porting_x210/rootfs/rootfs

在这里插入图片描述


再次 make install,之后可以看到, busybox 安装到了我们指定的路径:/home/aston/workspace/porting_x210/rootfs/rootfs

在这里插入图片描述


5、设置 bootargs 挂载添加了 busybox 移植的 rootfs

(1) 之前建立了一个空的文件夹,然后自己 touch linuxrc 随便创建了一个不能用的 /linuxrc,然后去 nfs 挂载 rootfs,实验结果是:挂载成功,执行 /linuxrc 失败。


(2) 现在我们移植了 busybox 后,/linuxrc 就可以用了,然后再次去 nfs 挂载这个 rootfs。预计看到的效果是:挂载成功,执行 /linuxrc 也能成功。


(3) 注意 uboot 的 bootargs 设置成:

setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/home/aston/workspace/porting_x210/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off  init=/linuxrc console=ttySAC2,115200 

(4) 实验结果:挂载成功,执行 /linuxrc(也就是 busybox)成功,但是因为找不到 /etc/init.d/rcS 和 /dev/tty2 等文件,所以一直在打印错误提示信息,但是其实有进入命令行。

在这里插入图片描述


三、inittab 详解

1、添加一个典型的 inittab

(1) 将网盘提供的典型的 inittab 文件,复制到我们制作的 rootfs 的根目录下的 /etc/ 目录下。

网盘文件的位置:《课件&代码\课件\2.uboot和linux内核移植\2.19.根文件系统构建实验及过程详解\etc》.

在这里插入图片描述

root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs/etc# cat inittab 
#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init

root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs/etc# 


(2) 再次启动内核,挂载这个 rootfs 看效果。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


(3) 实验现象是成功启动,并且挂载 rootfs 进入了控制台命令行。当前制作的最小 rootfs 成功了。


2、inittab 格式解析

(1) inittab 的工作原理就是,被 /linuxrc(也就是 busybox)执行时所调用 起作用。


(2) inittab 在 /etc 目录下,所以属于一个运行时配置文件,是文本格式的(内容是由一系列的遵照一个格式组织的字符组成的)。实际工作的时候,busybox 会(按照一定的格式)解析这个 inittab 文本文件,然后根据解析的内容来决定要怎么工作。

#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init

(3) busybox 究竟如何完成解析,并且解析结果如何去工作(busybox 中实现 /etc/inittab 的原理)并不是我们的目标,我们的重点是 inittab 的格式究竟怎样的?我们看到一个 inittab 后,怎么去分析这个 inittab 对启动的影响。


(4) inittab 的格式在 busybox 中定义的,网上可以搜索到详细的格式说明,具体去参考即可:

#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init

第一个:“#” 开始的行是注释。

第二个:冒号在里面的角色是 分隔符,分隔开各个部分。

第三个:inittab 内容是以行为单位的,行与行之间没有关联;每行都是一个独立的配置项,每一个配置项表示一个具体的含义。

第四个:每一行的配置项都是由 3 个冒号分隔开的 4 个配置值共同确定的。这 4 个配置值就是 “id:runlevels:action:process”。

值得注意的是,有些配置值可以空缺,空缺后冒号不能空缺,所以有时候会看到连续 2 个冒号。

第五个:每一行的配置项中,4 个配置值中最重要的是 action 和 process。action 是一个条件/状态,process 是一个可被执行的程序的 pathname。合起来的意思就是:当满足 action 的条件时,就会执行 process 这个程序。

注意:理解 inittab 的关键就是,明白 “当满足 action 的条件时,就会执行 process 这个程序。”

你去分析 busybox 的源代码就会发现,busybox 最终会进入一个死循环,在这个死循环中,去反复检查是否满足各个 action 的条件,如果某个 action 的条件满足,就会去执行对应的 process。

第六个:明白各个 action 什么意思。


源自朱有鹏老师.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

消息队列总结

消息队列 KafkaRocketMQRabbitMQActiveMQZeroMQMQ对比选型结论 消息队列的优点: 实现系统解耦实现异步调用流量削峰 消息队列的缺点: 系统可用性降低提升系统的复杂度数据一致性问题 Kafka Apache Kafka 是一个分布式消息发布订阅系统。它最初是由Li…

通过ObjectMapper和JsonNode 把JSON字符串转换成树结构数据和获取树节点数据

一.简介 今天同事有个需求&#xff0c;要把一个JSON字符串转换成一个树结构的数据并获取节点数据&#xff0c;鉴于自己不想写递归去转换&#xff0c;于是使用ObjectMapper和JsonNode类去实现。 二.依赖 pom文件引入依赖&#xff1a; <dependency><groupId>com.…

leetcode每日一题——美团笔试题【1】

今天分享两道算法题&#xff0c;自己刚开始练习&#xff0c;可能在解法上不是最佳的&#xff0c;但是只提供一些自己的思路&#xff0c;欢迎大家多多指教~ 第一题 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a;输入: s "lee…

NUC980驱动595与165扩展输入输出接口

一、电路图 3个165串联组成扩展24路光耦输入检测&#xff0c;一个595扩展8路继电器输出 二、驱动源码 #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/device.h>#include <linux/kernel.h> #in…

【C++ 学习 ①】- C++ 入门知识(上万字详解)

目录 一、历史 1.1 - C 语言的发展历程 1.2 - C 发展历程 二、C 关键字&#xff08;C98&#xff09; 三、命名空间 3.1 - 命名空间的定义 3.2 - 命名空间的使用 四、C 输入&输出 五、缺省参数 5.1 - 缺省参数的概念 5.2 - 缺省参数的分类 六、函数重载 6.1 - …

JavaSE学习进阶day05_03 泛型(进阶)

第五章 泛型&#xff0c;之前基础班学习过泛型&#xff0c;但是学的不深入 需要我们掌握的内容&#xff1a;&#xff08;掌握&#xff09; 1&#xff0c;如何使用一个带有泛型的类 2&#xff0c;如何使用一个带有泛型的方法 代码示例&#xff1a; ArrayList<String> lis…

浏览器插件官方demo学习(五):键盘快捷键、数据缓存、网络请求监听

键盘快捷键 这个demo主要是介绍了&#xff0c;通过自定义键盘快捷键的方式来触发扩展。 必须要在manifest.json文件中添加commands属性组合键&#xff1a;使用组合键时必须包含 Ctrl 或 Alt 细节不介绍&#xff0c;可以自行查看官方文档。这里只看一下常用的东西。 定义组合…

MYSQL第一讲:一个查询语句需要经过多少步?

1.连接器 负责客户端和MYSQL连接时的校验和权限验证 短连接&#xff1a;一段时间就断开然后重连&#xff0c;身份校验和权限验证不是一个轻松的活。所以不推荐 长连接&#xff1a;一般的情况都是长连接&#xff0c;但是长连接如果长时间不断开&#xff0c;会出问题&#xff…

Vulnhub项目:MrRobot

靶机地址&#xff1a;Mr-Robot: 1 ~ VulnHub 渗透过程&#xff1a; 先看描述&#xff0c;有3跟keys在这个靶机中 首先确定靶机ip&#xff0c;对靶机开放的端口进行探测 访问靶机地址&#xff0c;出现了很酷炫的web界面&#xff0c;这个mr.robot,是一个美剧&#xff0c;还是挺…

Python语言请求示例,电商商品详情接口,代码封装

Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语和动态类型&#xff0c;以及解释型语言的本质&#xff0c;使它成为多数平台上写脚本和快速开发应用的编程语言&#xff0c; [2] 随着版本的不断更新和语言新功能的添加&#xff0c;逐渐被用于…

环信 uni-app Demo升级改造计划——Vue2迁移到Vue3(一)

前言 由于环信uni-app Demo 为早期通过工具从微信小程序转换为的 uni-app 项目&#xff0c;经过实际的使用以及复用反馈&#xff0c;目前已经不适用于当前的开发使用&#xff0c;因此开启了整体升级改造计划&#xff0c;目前一期计划将 vue2 代码进行手动转换为 vue3vite&#…

MySQL高级第十四篇:锁机制分类详解(表锁,行锁,页锁,悲观锁和乐观锁)

MySQL高级第十四篇&#xff1a;锁机制分类详解&#xff08;表锁&#xff0c;行锁&#xff0c;页锁&#xff0c;悲观锁和乐观锁&#xff09; 一、概述二、MySQL并发事物访问相同记录的几种情况&#xff1f;1. 读--读情况2. 写--写情况3. 读--写情况&#xff08;写--读情况&#…

大数据项目实战之数据仓库:电商数据仓库系统——第8章 数仓开发之DIM层

文章目录 第8章 数仓开发之DIM层8.1 商品维度表8.2 优惠券维度表8.3 活动维度表8.4 地区维度表8.5 日期维度表8.6 用户维度表8.7 数据装载脚本8.7.1 首日装载脚本8.7.2 每日装载脚本 第8章 数仓开发之DIM层 DIM层设计要点&#xff1a; &#xff08;1&#xff09;DIM层的设计依…

解决 Microsoft Edge Dev 版本中右上角的 bing 按钮消失的问题 让 New Bing 还能阅读分析文档!

Microsoft Edge Dev 右上角的必应图标消失了&#xff0c;使得无法用 New Bing 阅读分析文档&#xff0c;到底什么原因呢&#xff1f; 针对 Microsoft Edge Dev 版本中右上角的发现按钮消失的问题&#xff0c;网上搜索解决方案。发现也有一些用户反馈在更新 Microsoft Edge Dev …

【C++STL精讲】优先级队列(priority_queue)与双端队列(deque)

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f337;优先级队列——priority_queue&#x1f338;什么是优先级队列&#xff1f;&#x1f338;优先级队列的基本使用&#x1f338;什么是仿函数&#xff1f;&#x1f338;优先级队列的模拟实现 &#x1f337;双端队…

本地Pycharm连接远程服务器训练模型教程-yolov5为例

本篇文章解决的问题&#xff1a; 本地pycharm 与云服务器/实验室服务器进行远程连接跑实验训练、同步本地与云服务器的全部或者部分文件。 在这之前需要做的的工作&#xff1a; 1.服务器上已经创建好虚拟环境&#xff08;不会的可以看下篇文章&#xff09;&#xff1a;使用云…

git commit三种回退的方式

git commit 回退 弄清楚三个区 工作区&#xff08;working tree&#xff09;&#xff1a; 本地编辑器 暂存区&#xff08;index&#xff09;&#xff1a;git add操作后进入暂存区&#xff0c;可用git status查看 本地仓库&#xff08;repository&#xff09;&#xff1a;git …

C#上位机与三菱FX3UPLC实现异步伪实时串口通信机制(串口类通信可参考)

C#上位机与三菱FX3UPLC实现异步伪实时串口通信机制&#xff08;串口类通信可参考&#xff09; 一、串口通信概述1.1 串口通信1.2 串行通信1.2.1 串行同步通信1.2.2 串行异步通信1.2.2.1 异步通信的数据格式1.2.2.2 异步通信的数据发送过程1.2.2.3 异步通信的数据接收过程 1.3 串…

Redis如何保障缓存与数据库的数据一致性问题?

目录 一.最经典的数据库加缓存的双写双删模式 二. 高并发场景下的缓存数据库双写不一致问题分析与解决方案设计 三、上面高并发的场景下&#xff0c;该解决方案要注意的问题 一.最经典的数据库加缓存的双写双删模式 1.1 Cache Aside Pattern概念以及读写逻辑 &#xff08;…

redis非关系型数据库部署和使用(linux)

1.概念 NoSQL非关系型数据库是一种不使用关系模型来组织数据的数据库&#xff0c;通常用于存储非结构化或半结构化的数据&#xff0c;不支持或只部分支持SQL语言&#xff0c;满足最终一致性。非关系型数据库有多种类型&#xff0c;例如键值数据库、文档数据库、列式数据库、图形…