使用busybox快速创建rootfs系统(硬件:atk-dl6y2c)

目录

概述

1 编译busybox

1.1 配置Makefile

1.2 需改参数

1.3 配置busybox

1.4 编译busybox

2 完善 rootfs下文件

2.1 rootfs 的“/lib”目录添加库文件

2.2 rootfs 的“usr/lib”目录添加库文件

2.3 创建其他目录

3 完善其他文件

3.1 完善etc/init.d/rcS

3.2 完善 /etc/fstab 文件

3.3 完善 /etc/inittab文件

4 打包rootfs


概述

本文主要介绍如何使用busybox工具创建rootfs系统,交叉编译器版本为:gcc-linaro-4.9.4-arm-linux-gnueabihf。笔者通过实操的方式介绍制作rootfs的全过程。并将每个文件中的要编写的内容罗列出来,方便使用其作为一个设计的模版。

1 编译busybox

从如下网址上获取busybox的源码包: https://busybox.net/downloads/

1.1 配置Makefile

解压busybox

tar -vxjf busybox-1.29.0.tar.bz2

在busybox-1.29.0/Makefile配置编译器信息:

源代码为:

CROSS_COMPILE ?=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

配置架构信息:

1.2 需改参数

修改busybox 源码,取消 busybox 对中文显示的限制,打开文件 busybox-1.29.0/libbb/printable_string.c,找到函数 printable_string,函数内容如下:

修改位置-1:

修改位置-2:

修改位置-3:

在busybox-1.29.0/libbb/unicode.c文件中修改如下内容:

1.3 配置busybox

使用命令 make menuconfig 进行配置

配置选项-1:

-> Settings-> Build static binary (no shared libs)

配置选项-2:

-> Settings->  vi-style line editing commands

配置选项-3:

-> Linux Module Utilities-> Simplified modutils

配置选项-4:

-> Linux System Utilities-> mdev (16 kb)

配置选项-5:

-> Settings-> Support Unicode-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables

配置完成后,退出配置UI,保存配置

1.4 编译busybox

使用命令

make

然后install busybox

make install CONFIG_PREFIX=/home/mftang/linux_workspace/atk_dl6y2c_rootfs/rootfs

执行命令后, rootfs 目录下有 bin、 sbin 和 usr 这三个目录,以及 linuxrc 这个文件。前面说过 Linux 内核 init 进程最后会查找用户空间的 init 程序,找到以后就会运行这个用户空间的 init 程序,从内核态切换到用户态。如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。至此,busybox 的工作就完成了,但是此时的根文件系统还不能使用,还需要一些其他的文件,下面还需要继续来完善 rootfs。

2 完善 rootfs下文件

2.1 rootfs 的“/lib”目录添加库文件

step-1: 在rootfs目录下创建lib目录,使用命令

mkdir lib

复制编译器目录下文件:/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/arm-linux-gnueabihf/lib

step-2: 复制文件

将此目录下所有的so和.a文件都拷贝到 rootfs/lib 目录中, 拷贝命令如下:

cp *so* *.a /home/mftang/linux_workspace/atk_dl6y2c_rootfs/rootfs/lib -d

step-3: 删除软链接文件

删除文件后:

2.2 rootfs 的“usr/lib”目录添加库文件

在usr 目录下创建lib目录

/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib目录下文件copy到rootfs/usr/lib中。在/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib目录下使用命令:

cp *so* *.a /home/mftang/linux_workspace/atk_dl6y2c_rootfs/rootfs/usr/lib -d

2.3 创建其他目录

创建其他的一些文件夹,具体如下:

进入rootfs查看目录结构:

3 完善其他文件

3.1 完善etc/init.d/rcS

rcS 是个 shell 脚本, Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件 的脚本文件。在 rootfs 中创建/etc/init.d/rcS 文件,然后在 rcS 中输入如下所示内容:

#!/bin/sh
​
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
​
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel
​
#网络开机自启动设置
ifconfig eth0 up
​
#udhcpc -i eth0
ifconfig eth0 192.168.1.225 netmask 255.255.255.0
route add default gw 192.168.1.1
​
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
​
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
​
#添加开级自动运行的代码
在文件夹中的位置

3.2 完善 /etc/fstab 文件

在 rootfs 中创建/etc/fstab 文件, fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区,格式如下:

<file system> <mount point> <type> <options> <dump> <pass>

文件内容:

#<file system> <mount point>  <type>  <options>  <dump>        <pass>
proc                  /proc   proc     defaults    0            0
tmpfs                 /tmp    tmpfs    defaults    0            0
sysfs                 /sys    sysfs    defaults    0            0

在文件夹中的位置

3.3 完善 /etc/inittab文件

inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。 init 程序会读取/etc/inittab这个文件, inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的 4 个段组成,格式如下:

<id>:<runlevels>:<action>:<process>

文件内容:

#etc/inittab
​
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

在文件夹中的位置:

4 打包rootfs

进入到 Ubuntu 中的rootfs 目录中,然后使用 tar 命令对其进行打包,命令如下:

tar -vcjf rootfs.tar.bz2 *

执行命令后,生成.bz2文件

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

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

相关文章

Golang | Leetcode Golang题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; func longestConsecutive(nums []int) int {numSet : map[int]bool{}for _, num : range nums {numSet[num] true}longestStreak : 0for num : range numSet {if !numSet[num-1] {currentNum : numcurrentStreak : 1for numSet[currentNum…

【CMake】CMake入门(五)打包安装程序 使用CMake管理库 打包调试版和发行版

本篇文章不是新手入门教学文章&#xff0c;主要是记录笔者个人的学习笔记 CMake入门&#xff08;五&#xff09; 一、打包二、使用CMake管理库三、打包调试版和发行版 一、打包 发布程序可以有多种形式&#xff0c;比如安装包、压缩包、源文件等。CMake也提供了打包程序cpack可…

YOLOv8训练自定义项目

训练内容&#xff1a;基于yolo的筒纱实例分割 数据设置&#xff1a; 1&#xff09;https://ultralytics.com/assets/coco8-seg.zip&#xff0c;下载coco8-seg.zip&#xff0c;解压&#xff0c;记住各个文件夹内的文件名&#xff08;12为为长度&#xff0c;如000000000001.jpg…

8、架构-分布式的共识

概述 在正式探讨分布式环境中面临的各种技术问题和解决方案前&#xff0c;我 们先把目光从工业界转到学术界&#xff0c;学习几种具有代表性的分布式共识 算法&#xff0c;为后续在分布式环境中操作共享数据准备好理论基础。下面笔 者从一个最浅显的场景开始&#xff0c;引出本…

金钱的认知,你如何理解呢?

金钱的认知 建立在金钱之上的爱情是纯真的爱&#xff0c;朋友关系也才够纯粹&#xff0c;才是单纯的世界&#xff0c;反之没了钱的条件爱情和友情的美好关系极易破碎&#xff0c;也极易反目成仇。 心若美好钱就美好&#xff0c;心有欲望狰狞钱就是只咬人的老虎&#xff0c;钱…

python练习五

Title1&#xff1a;请实现一个装饰器&#xff0c;每次调用函数时&#xff0c;将函数名字以及调用此函数的时间点写入文件中 代码&#xff1a; import time time time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 获取当前的时间戳 # 定义一个有参装饰器来实…

Linux 僵尸进程和孤儿进程

一.Z(zombie)-僵尸进程 1.僵死状态&#xff08;Zombies&#xff09;是一个比较特殊的状态。当进程退出并且父进程&#xff08;使用wait()系统调用后&#xff09;没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 2.僵死进程会以终止状态保持在进程表中&#xff0c;并且会…

【代码随想录37期】Day24 回溯 组合

理论基础 回溯是一种搜索方式&#xff0c;通常通过穷举来解决问题&#xff0c;核心思想是从一个初始状态出发、暴力搜索所有可能的方案&#xff0c;遇到正确的解法则记录下来&#xff0c;直到结束&#xff0c;这是一个典型的深度优先搜索思想&#xff1a;不撞南墙不回头 回溯…

Java17 --- SpringCloud之seate

目录 一、创建seata需要的mysql数据库表 二、修改seata的配置文件 三、启动nacos及seata 四、创建需要的数据库及表 一、创建seata需要的mysql数据库表 CREATE DATABASE seata;CREATE TABLE IF NOT EXISTS global_table(xid VARCHAR(128) NOT NULL,…

C++ | Leetcode C++题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longestStreak 0;for (const int& num : num_set) {…

隐马尔可夫链

1 马尔可夫链 马尔科夫链&#xff08;Markov Chain&#xff09;是一种数学模型&#xff0c;它描述了一系列可能事件的概率&#xff0c;其中每个事件的发生仅依赖于前一个事件的状态。这一特性称为“无记忆性”或“马尔可夫性质”。我将用一个简单的天气预测模型作为例子来解释马…

【组合数学 隔板法 容斥原理】放球问题

本文所属分类 组合数学汇总 8类放球问题 放球问题是一类很有意思的排列组合问题。通俗来说&#xff0c;就是把n个小球放到m个盒子里&#xff0c;问有几种放法。具体可以从3个维度&#xff0c;每个维度2种情况&#xff0c;共8种情况&#xff1a; 维度一&#xff1a;小球是否相…

对象业务的追加写接口

类似文件的追加写操作&#xff0c;在对象的末尾增加新的数据内容。 本文有如下假定&#xff1a; 对象存储服务基于文件语义实现。使用PUT方式上传的对象&#xff0c;内部使用一个文件和对应的元数据来承载。使用多段方式上传的对象&#xff0c;内部使用多个段文件、元数据来承…

【面试题-012】什么是Spring 它有哪些优势

文章目录 Spring有哪些优势有哪些优势Spring和Springboot区别在 Spring 框架中&#xff0c;什么是AOP核心概念应用场景 Spring有哪些通知类型 Spring 是一个开源的 Java 平台&#xff0c;由 Rod Johnson 创建&#xff0c;用于简化企业级 Java 应用程序的开发。它于 2003 年首次…

T-Pot多功能蜜罐实践@debian12@FreeBSD

T-Pot介绍 T-Pot是一个集所有功能于一身的、可选择分布式的多构架&#xff08;amd64&#xff0c;arm64&#xff09;蜜罐平台&#xff0c;支持20多个蜜罐和很多可视化选项&#xff0c;使用弹性堆栈、动画实时攻击地图和许多安全工具来进一步改善欺骗体验。GitHub - telekom-sec…

15.FreeRTOS数据结构:StreamBuffer,MessageBuffer和Queue的区别

FreeRTOS数据结构&#xff1a;StreamBuffer&#xff0c;MessageBuffer和Queue的区别 介绍 在嵌入式系统开发中&#xff0c;任务间的通信是非常重要的一部分。FreeRTOS提供了多种数据结构来实现任务间的通信&#xff0c;包括StreamBuffer&#xff0c;MessageBuffer和Queue。这…

SpringBootWeb登录认证

JWT令牌 JSON Web Token JSON Web Tokens - jwt.ioJSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signatur…

MogDBopenGauss查询重写规则uniquecheck

在MogDB&openGauss中&#xff0c;参数rewrite_rule用于控制查询重写&#xff0c;本文介绍查询重写规则uniquecheck uniquecheck表示提升无agg的where子查询 现在有如下例子 orcl> explain analyze select count(*)from test01 t1where t1.data_object_id (select data…

文件系统和日志分析

文件系统 概述 文件是存储在硬盘上的。硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode号&#xff1a;又叫索引号&#xff0c;保存的是元信息&#xff08;主要有文件的属性 &#xff1a;包括权限&#xff0c;创建者&#xff0c;创建日期等&#xff…

Nodejs 调用langchain的实验

langchain 支持js/ts 语言&#xff0c;可以在nodeJs 中调用langchain 。这有利于在网站后台软件中使用&#xff0c;本博文记录做的小实验。 安装与升级 升级node 直接在官网下载&#xff0c;重新安装就可以了。 安装大模型模块 npm install openai 安装langchain npm insta…