树莓派4b制作加载的FLASH文件系统并移植busybox

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 等文件夹,否
则会出现一些问题 , 可能的原因是,第一次启动时,已经将文件系统烧写进内存当中 , 再次修
改导致死机,文件系统做的任何修改都不行要整体拷贝

猜你喜欢

转载自blog.csdn.net/m0_61563608/article/details/120943219