2021SC@SDUSC
BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell。
一、下载 busybox 源码
在
BusyBox
的官网下载到源码:
https://busybox.net/downloads

将下载的
busybox
复制到任意目录下
,
并运行命令解压
tar -vxjf busybox-1.33.0.tar.bz2

二、编译 busybox
cd busybox-1.33.0 #
进入
busybox-1.30.0/
目录下
1.
修改顶层
Makefile(
指定交叉编译工具链
)
sudo gedit Makefile
一个是
164
行的
`CROSS_COMPILE ?= `,
用来指定交叉编译工具链,目录为自己之前解压
的目录

另一个地方是
190
行的
`ARCH ?=$(SUBARCH)`
,修改为
`ARCH ?= arm`

保存退出。
2.
配置
Busybox
在
busybox-1.33.0/
目录下输入
`sudo make defconfig`
命令预配置
busybox
,然后通过
`sudo make menuconfig`
图形化界面配置
第一个地方,
Settings->Build static binary (no shared libs)
,不要选中该项(方向键选择,
回车键进入下一级目录,空格是选中或不选中,双击
ESC
返回)。

第二个地方,
Linux System Utilities
—
>nsenter
,不要选中该项。

第三个地方,
Coreutils
—
>sync
,不要选中该项

3.
编译
Busybox
在
busybox-1.33.0/
目录下输入
`sudo make install`
,编译的结果在在
busybox-1.33.0/_install

三、制作最小根文件系统
进入到
_install
目录下
mkdir dev etc lib mnt proc sys tmp var boot
/*
说明
* dev
目录主要共系统生成各类设备节点
* etc
系统的配置文件
* lib
系统需要的各类库文件
* mnt
一般用来挂载其他设备的的目录
* sys
系统文件
* tmp
临时文件
* var
* proc
内存虚拟文件系统节点
*/

2.
创建设备文件
在
_install
文件夹下面创建两个设备文件
/dev/console
和
/dev/NULL
mkdir /dev/console
mkdir /dev/NULL

查询虚拟机

console :
主设备号为
5
,次设备号为
1
null
:主设备号为
1
,次设备号为
3
所以,创建两个新的设备节点
raspi@ubuntu:~/busybox-1.33.0/_install/dev/console$ mknod -m 666 console c 5 1
raspi@ubuntu:~/busybox-1.33.0/_install/dev/NULL$ mknod -m 666 null c 1 3
(
1
)
/dev/console
/dev/console
代表
bai
的系统控制台,错误信息和诊
du
断信息都会被到这个上。
(
2
)
/dev/null
这个是一个空设备文件,所有写到这个文件中的数据都会被丢弃掉
3.
构造
inittab
这里移植的是一个已经做好的典型的
inittab
,所以操作如下
busybox-1.33.0/examples/bootfloppy#
目录下有一个
etc
文件夹,

全部拷贝到你的
_install
目录下的
etc
文件夹下

Fstab:
当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中
指定的文件系统挂载到指定的目录(
https://blog.csdn.net/kepa520/article/details/81315430
)
修改为以下内容:
在
/etc/init.d
目录下运行
`chmod +x rcS`
这样我们这个文件系统启动就会执行
rcS
,可以在
proc
目录看到所有运行的文件
inittab
:
Linux
在完成核内引导以后,就开始运行
init
程 序
linux中inittab文件详解linux中inittab文件详解_u014089899的博客-CSDN博客_inittab
(https://blog.csdn.net/u014089899/article/details/80622607)
/*init的进程号是1(ps -aux | less),从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序。
init程序需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。
理解Runlevel:
runlevel用来表示在init进程结束之后的系统状态,在系统的硬件中没有固定的信息来表示runlevel,它纯粹是一种软件结构。init和inittab是runlevel影响系统状态的唯一原因。在上述例子中inittab文件起始阶段的注释主要用来描述runlevel:
Runlevel=0 是让init关闭所有进程并终止系统。
Runlevel=1 是用来将系统转到单用户模式,单用户模式只能有系统管理员进入,在该模式下处理那些在有登录用户的情况下不能进行更改的文件,改runlevel的编号1也可以用S代替。
Runlevel=2 是允许系统进入多用户的模式,但并不支持文件共享,这种模式很少应用。
Runlevel=3 是最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式。
Runlevel=4 一般不被系统使用,用户可以设计自己的系统状态并将其应用到runlevel 4阶段,尽管很少使用,但使用该系统可以实现一些特定的登录请求。
Runlevel=5 是将系统初始化为专用的X Window终端。对功能强大的Linux系统来说,这并不是好的选择,但用户如果需要这样,也可以通过在runlevel启动来实现该方案。
Runlevel=6 是关闭所有运行的进程并重新启动系统。 */

init.d/rcS
:
rcS
是一个脚本文件,在
inittab
文件中本解析调用,用于配置
Linux
系统
(
https://blog.csdn.net/u013686019/article/details/26846571
、
https://blog.csdn.net/weixin_30839881/article/details/97608919?utm_medium=distribute.
pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-ut
m_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.ed
u_weight
)
执行
mount
–
a
命令后,将挂接
proc
、
tmpfs
文件系统
写成
mount
–
a
它会依赖于
etc/fstab ,
根据
fstab
的指示来挂载根文件系统
profile
:
/etc/profile
文 件 的 改 变 会 涉 及 到 系 统 的 环 境
(
https://www.cnblogs.com/lh03061238/p/9952659.html
)
4.C
库
lib
进入到编译
busybox
的
C
库,路径是
/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnuea
bihf/libc/lib/arm-linux-gnueabihf

交叉编译工具链里面需要的文件动态链接到
_install
的
lib
下
四、移植到 sd 卡
与内核移植一致,首先在
/busybox-1.33.0
下创建
mnt/ext4
用来挂载的文件夹,
sudo mount /dev/sdb2 mnt/ext4
sudo cp -r _install/* mnt/ext4 -d
sudo umount /mnt/ext4
注意:这里必须将文件夹整体拷贝进
SD
卡,不能在拷贝之后在添加
boot
等文件夹,否
则会出现一些问题
,
可能的原因是,第一次启动时,已经将文件系统烧写进内存当中
,
再次修
改导致死机,文件系统做的任何修改都不行要整体拷贝