使用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可…

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

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

Linux 僵尸进程和孤儿进程

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

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;其中每个事件的发生仅依赖于前一个事件的状态。这一特性称为“无记忆性”或“马尔可夫性质”。我将用一个简单的天气预测模型作为例子来解释马…

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

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

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…

文件系统和日志分析

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

Renesas MCU之使用e² studio搭建开发环境

目录 概述 1 e studio介绍 2 搭建Renesas MUC开发环境 2.1 软件版本信息 2.2 安装软件 3 创建工程 3.1 板卡硬件接口 3.2 FSP配置IO 4 Generate Project 4.1 项目目录介绍 4.2 LED接口相关驱动 5 调试 5.1 测试代码 5.2 J-Link调试代码 5.3 硬件结构 概述 本文主…

ES6-01-简介

一、什么是ES6&#xff1f; 每年一个版本o(╥﹏╥)o。 二、javaScript新特性的特点 1、语法简洁&#xff0c;功能丰富&#xff1b; 2、框架开发应用。 3、岗位需求&#xff01; 三、let关键字 3-1、声明变量 let a;let a,b;let e100;let f521, gmilk-love, h[]; 3-2、声明的…

python采集汽车价格数据

python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…

属性(property)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 创建用于计算的属性 在Python中&#xff0c;可以通过property&#xff08;装饰器&#xff09;将一个方法转换为属性&#xff0c;从而实现用于计算…

几种更新 npm 项目依赖的实用方法

引言 在软件开发的过程中&#xff0c;我们知道依赖管理是其中一个至关重要的环节。npm&#xff08;Node Package Manager&#xff09; 是 Node.js 的包管理器&#xff0c;它主要用于 Node.js 项目的依赖管理和包发布。随着项目的不断发展&#xff0c;依赖库的版本更新和升级成…

基于Win11下的Wireshark的安装和使用

Wireshark的安装和使用 前言一、Wireshark是什么简介 二、下载Wireshark下载过程查看自己电脑配置 三、安装Wireshark安装过程安装组件创建快捷方式winPacpNpcap 打开检验 四、使用Wireshark实施抓包捕获数据包 五、基于Wireshark使用显示过滤器简介使用方法注意ICMP的请求和应…

目标检测算法综述

1 研究背景 1.1 概述 目标检测是计算机视觉的重要分支&#xff0c;主要任务是在给定的图片中精确找到物体所在位置&#xff0c;并标注出物体的类别&#xff0c;即包含了目标定位与目标分类两部分。在计算机视觉领域中的目标跟踪、图像分割、事件检测、场景理解等的任务都以目标…

Java线程几种常用方法详细说明

在Java编程中&#xff0c;多线程编程是一个非常重要的主题。它允许我们同时运行多个任务&#xff0c;提高程序的性能和响应速度。在这篇博客中&#xff0c;我们将介绍一些常用的Java线程方法和构造器&#xff0c;并通过示例代码展示如何使用它们。 Thread提供的常用方法 publi…

SpringBoot与Spring Framework提供的缓存抽象

目录 缓存 项目总结 新建一个SpringBoot项目 pom.xml application.properties CacheConfig Book BookRepository接口 BookService服务类 BookController控制器 SpringbootCacheApplication启动类 启动项目&#xff0c;使用Postman测试 参考博文&#xff1a; 1、使用…

llvm 3.5 源码分析 clang for x86 001 之搭环境

0&#xff0c;目标 编译 针对x86 的&#xff0c;debug 的 c语言的编译器 1&#xff0c;下载代码 git clone --recursive 。。。llvm-project.git $ cd llvm-project 2&#xff0c;预备代码 llvm 3.5 版本的源代码&#xff0c;早期版本&#xff0c;可能比较小比较容易debug $…