用busybox构建最小根文件系统详解

2023-11-03

1、busybox源码获取

(1)busybox官网下载地址:https://busybox.net/
(2)建议下载busybox的版本:尽量和你使用的编译环境(比如:Ubuntu)的版本相近,版本差太多可能需要解决一些编译时候的兼容问题;

2、busybox原理分析

参考博客:《busybox的实现原理分析(C语言实现简易版的busybox)》

3、busybox编译

3.1、配置busybox

Busybox Settings--->
	Build Options--->
		[*]Build BusyBox as a static binary(no shared libs)

		
Busybox Library Tuning--->
	[*]vi-style line editing commands
	[*]Fancy shell prompts
	
	
Linux Module Utilities--->
	[ ]Simplified modutils
	[*]insmod
	[*]rmmod
	[*]lsmod
	[*]modprobe
	[*]depmod

	
Linux System Utilities--->[*]mdev
	[*]Support /etc/mdev.conf
	[*]Support subdirs/symlinks
	[*]Support regular expressions substitutions when renaming dev
	[*]Support command execution at device addition/removal
	[*]Support loading of firmwares

3.2、编译

root@Ubuntu:~$ ls
busybox-1.24.1  busybox-1.24.1.tar.bz2
root@Ubuntu:~$
root@Ubuntu:~$ cd busybox-1.24.1/
root@Ubuntu:~$ make ARCH=arm CROSS_COMPILE=arm-linux-

解压开busybox源码后,在编译时指定CPU架构和交叉编译工具链

4、busybox构建根文件系统

Busybox Settings--->
	Installation Options ("make install" behavior)--->

在这里插入图片描述

(1)配置安装目录:"make menuconfig"里可以按照上面的选项去选择busybox安装目录;
(2)配置好安装目录,执行"make install"就会将busybox、链接文件、linuxrc等拷贝到指定目录,构成文件夹形式的最小文件系统;

5、完善根文件系统

5.1、添加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

在这里插入图片描述
在这里插入图片描述

(1)在未添加inittab文件前,系统可以起来,可以进入命令行,但是系统起来后会不停的刷报错的打印;
(2)在添加上面的inittab文件后,系统不会再刷"can’t open /dev/tty3: No such file or directory";
(3)inittab文件的内容解读可以参考博客:《嵌入式系统开发——文件系统中inittab文件、rcS文件、fstab文件、profile文件详解》

5.2、添加fstab文件

# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# 	<file system> 	<mount point> 	<type> 	<options> 	<dump> 	<pass>
	proc 			/proc 			proc 	defaults 	0 		0
	sysfs 			/sys 			sysfs 	defaults 	0 		0
	tmpfs 			/var 			tmpfs 	defaults 	0 		0
	tmpfs 			/tmp 			tmpfs 	defaults 	0 		0
	tmpfs 			/dev 			tmpfs 	defaults 	0 		0

fstab是开启自动挂载文件系统的,需要在文件系统中手动创建好根目录下的"sys、proc、dev等"挂载点;

5.3、添加rcS文件

#!/bin/sh
# 设置PATH变量
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# 将系统设置为单用户模式
runlevel=S
prevlevel=N

# 设置umask的值,和创建文件的默认权限相关
umask 022

# 到处为环境变量
export PATH runlevel prevlevel

#解析/etc/fstab文件并挂载分区;
mount -a

# 开启mdev,和驱动在/dev目录下生成设备节点有关
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

#指定主机名保存在/etc/sysconfig/HOSTNAME文件中
/bin/hostname -F /etc/sysconfig/HOSTNAME

#设置eth0的ip为192.168.1.10
ifconfig eth0 192.168.1.10

5.4、设置主机名

在这里插入图片描述

(1)创建/etc/sysconfig/HOSTNAME 文件,里面保存主机名,可以用hostname命令查看;
(2)这个文件名和路径是与rcS文件中的设置相对应的;

5.5、添加profile文件

# Ash profile
# vim: syntax=sh

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATH

HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH

在这里插入图片描述

添加上面的profile文件后,可以在终端的命令行看到设置的主机名和登录的账户名;

5.6、增加用户登录

参考博客:《嵌入式设备文件系统构建——增加用户登录功能》

5.7、动态链接库的拷贝

(1)将程序运行需要依赖的动态库拷贝到/lib或者/usr/lib目录下;
(2)最少是需要将交叉编译工具链的动态库拷贝到/lib目录下,不然编译的程序都没法在板子上运行;

6、用NFS挂载构建的根文件系统

参考博客:《用NFS挂载根文件系统详解(带nfs版本不兼容问题的解决方法)》

推荐

再难的项目都是基础知识的复杂运用,基础是最重要的。给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用busybox构建最小根文件系统详解 的相关文章

  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我

随机推荐

  • Elasticsearch实战(三)---复杂数据结构及映射 Mapping操作

    Elasticsearch实战 复杂数据结构及映射 Mapping操作 文章目录 Elasticsearch实战 复杂数据结构及映射 Mapping操作 1 ElasticSearch 映射操作 1 1 结构 1 2 映射 1 3 映射 显
  • CentOS8安装keepalived和lvs遇到的坑

    CentOS8 最小化安装 关闭selinux 两个负载yum 安装keepalived 和ipvsadm 一 没有配置ip forward lvs用DR模式不用 二 没有配置虚拟IP 只在keepalived配置中写的 前期是没有会配置虚
  • Java七大设计原则 - 接口隔离原则

    一 什么是 接口隔离原则 Interface Segregation Principle 原则含义 一个类对于另外一个类的依赖应该建立在最小的接口上 1 接口隔离原则 实际上它是建立在另一种设计原则之上 依赖倒置 的 即 面向接口编程 而
  • 【C++】C++封装成DLL并调用(初学者快速入门)

    话不多说 干货走起 侵删 使用vs2019将C 封装成DLL并调用主要有以下几个步骤 1 新建工程 编写要封装的 cpp和 h文件 2 生成动态链接库 dll和静态链接库 lib 3 调用通过 h文件调用 第一步 编写 cpp和 h文件 本
  • Linux中vi的用法

    vi 有三种工作模式 普通模式 1 输入模式 2 命令模式 3 末行模式 ese 退出到普通模式 输入模式 a 光标处的后面切换到输入 A 光标跳转到当前行的最末端 i 光标处的前面输入 I 光标跳到当前行的最前端 r 替换光标处的一字母
  • 判断一个字符串中各个字符出现的次数

    我这里使用了两种方法 两种方法思路差不多 但是使用处理字符串的方法不一样 所以执行效率不一样 long xxx System nanoTime 这个方法用来标记执行方法前后的时间点 看最终执行完所用时间 纳秒 第一种方法效率高 时间快 不是
  • 基于Matlab GUI的形态学方法进行水果大小识别

    基于Matlab GUI的形态学方法进行水果大小识别 在本文中 我们将探讨如何使用Matlab的图形用户界面 GUI 和形态学方法来进行水果大小的识别 形态学是一种图像处理技术 主要用于提取和改善图像中的形状和结构信息 我们将使用Matla
  • YOLOX训练代码分析1-COCO与VOC训练

    1 YOLOX的网络结构图与代码YOLOv3 YOLOv4 YOLOv5 YOLOx的网络结构图 清晰版 YMilton的专栏 CSDN博客 https blog csdn net YMilton article details 12026
  • 最短路径(Dijkstra)算法

    目录 一 Dijkstra算法 二 核心思路 三 步骤 四 代码 一 Dijkstra算法 迪杰斯特拉 Dijkstra 算法是由荷兰计算机科学家狄克斯特拉于1959年提出的 是寻找从一个顶点到其余各顶点的最短路径算法 可用来解决最短路径问
  • 获取自定义弹出框的DialogResult的值以及返回用户输入的值

    在编写Winform程序时 有些情况下需要自己定义一个弹出框 获取用户选择的是YES还是NO 并且获取用户输入的数据 首先 自定义弹出框非常容易编写 利用Form可以制作成一个对话框样式 并且在主程序中以模态形式显示 ShowDialog
  • 如何安装多个node版本(使用nvm)

    1 卸载之前安装的所有node 2 下载nvm安装包 下载地址https nvm uihtm com 3 安装nvm 4 打开cmd 运行命令 nvm install node版本号 安装对应版本的node 5 打开nvm的安装路径 可以看
  • EMD 经验模态分解

    文章目录 1 本征模态函数 IMF 2 算法步骤 3 MATLAB代码 4 C代码 5 应用 缺点和改进 6 相关链接 EMD Empirical Mode Decomposition 是由美国国家宇航局的华裔科学家Norden e Hua
  • ​​insecure-configuration --复现

    有什么不对的地方希望大佬指导 也希望正在学习渗透的小伙伴加油 坚持下去 努力耕耘 总有收获 配置错误导致漏洞 insecure configuration 影响版本 全版本 启动环境 docker compose up d 运行成功后 环境
  • vue3+ts-数据自动滚动效果

    html
  • annconda 安装之后运行 conda 出现conda: command not found

    大概有两种方法 1 直接在终端运行export PATH anaconda的安装路径 bin PATH 但这样貌似只能 在这个终端使用 如果另开一个终端的话还会出现一样的问题 换句话说 直接运行 这个代码只是临时的 2 在home目录下运行
  • 数学符号大全(量词符号、代数符号等)

    量词符号 任意 存在 且 或 非 数学符号 alpha alfa 阿耳法 beta beta 贝塔 gamma gamma 伽马 deta delta 德耳塔 epsilon epsilon 艾普西隆 zeta zeta 截塔 eta et
  • 解决SQL语句警告提示

  • MySQL之mysqldump备份和恢复

    一 备份单个数据库 1 备份命令 mysqldump MySQL数据库自带的一个很好用的备份命令 是逻辑备份 导出 的是SQL语句 也就是把数据从MySQL库中以逻辑的SQL语句的形式直接输出或生成备份的文件的过程 单实例语法 Syntax
  • 【深度学习】如何用PyTorch构建一个ResNet50网络?(附代码)

    ResNet Residual Network 是一种深度卷积神经网络 具有非常深的网络结构 并在ImageNet图像分类比赛中取得了很好的成绩 ResNet的一个关键点是增加了残差块 residual block 使网络更容易训练 Res
  • 用busybox构建最小根文件系统详解

    1 busybox源码获取 1 busybox官网下载地址 https busybox net 2 建议下载busybox的版本 尽量和你使用的编译环境 比如 Ubuntu 的版本相近 版本差太多可能需要解决一些编译时候的兼容问题 2 bu