Home busybox 根文件系统
Post
Cancel

busybox 根文件系统

busybox是一个开源项目,可以用来构建根文件系统。其主要特点是轻量、精简。Linux系统上的许多命令工具主要来自于 GNU Coreutils 软件包,如日常使用的基本命令,ls,cat,mv等等。这些命令工具通常支持的参数非常多,功能也 很全。而busybox则是非常精简,首先就是这些基本命令的精简实现,从源代码实现上去掉了很多不常用的参数,使得命令 工具本身精简了。其次,在根文件系统中还可以直接去掉一些不需要使用的命令,达到进一步精简。构建出一个非常精简化 的根文件系统,所有的命令都静态链接进一个二进制文件中。缺点也基本是因为这个,因为非常精简,调试时很可能会缺少 相关工具或功能。busybox作为一个精简的根文件系统,一般可以用在嵌入式环境,initramfs,docker镜像中。

获取busybox

可以从网站 https://www.busybox.net/ 上获取稳定版本的busybox源码包。 或者有docker工具时,可以拉取官方的docker镜像体验下。

这里选择 busybox-1.34.1 的稳定版本测试。

制作initramfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 安装相关依赖工具

# 配置
$ mkdir build_dir
$ make O=build_dir menuconfig
# 配置 使用整个静态库
# Settings -> Build Options -> Build BusyBox as s static binary
# 如果是作为initramfs,静态链接更方好,动态链接需要
# 其他:如果是交叉编译,指定一下交叉编译器: Settings  --->  Cross compiler prefix
# 另外可以根据需要裁剪不需要的工具

# 多核编译
$ make O=build_dir -j20

# 安装,(目录为 build_dir/_install)
$ make O=build_dir install

# 创建initramfs 文件夹
$ mkdir rootfs_my_init_ramfs
$ cp -r ./build_dir/_install/* ./rootfs_my_init_ramfs/

# 继续完善initramfs根文件系统
$ cd ./rootfs_my_init_ramfs/
$ mkdir  dev  etc  lib  usr  var  proc  tmp  home  root  mnt  sys
$ cd ..
# 复制Busybox中示例etc目录内容
$ cp -rf ./examples/bootfloppy/etc/*  rootfs_my_init_ramfs/etc

接下来可以修改 rootfs_my_init_ramfs/etc 目录下的启动配置相关文件,其中init.dinittab是sysV init 初始化程序需要的配置文件和目录,busybox似乎还不支持systemd作为init进程。默认内容

1
2
3
4
5
6
7
8
9
10
11
# 系统启动后,先运行 /etc/init.d/rcS 脚本
::sysinit:/etc/init.d/rcS
# 总是重启 /bin/sh 程序
::respawn:-/bin/sh
# ???
tty2::askfirst:-/bin/sh
# ctrl+alt+del = /bin/umount -a -r
::ctrlaltdel:/bin/umount -a -r

# 可以使用getty程序登录,一般不太需要
# tty1::respawn:/sbin/getty 115200 tty1

还可以修改 rootfs_my_init_ramfs/etc/profile 文件,profile文件是终端登录后第一个运行的脚本。可以设置一些环境变量,如

1
2
3
4
5
6
7
PATH=/bin:/sbin:/usr/bin:/usr/sbin   #可执行程序 环境变量
export LD_LIBRARY_PATH=/lib:/usr/lib #动态链接库 环境变量
/bin/hostname emuhost
USER="`id -un`"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
PS1='[\u@\h \W]# '                   #显示主机名、当前路径等信息:

继续编辑rootfs_my_init_ramfs/etc/fstab,根据需要添加, 因为在 init.d/rcS 中第一行为mount -a ,所以这里的虚拟文件系统会被自动挂载。

1
2
3
4
5
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>    <options>     <dump>  <pass>
proc            /proc           proc      defaults      0       0
sysfs           /sys            sysfs     defaults      0       0

继续创建一些设备节点文件,在 rootfs_my_init_ramfs/dev目录下,

1
2
3
4
5
6
7
cd rootfs_my_init_ramfs
sudo mknod dev/tty1    c 4 1
sudo mknod dev/tty2    c 4 2
sudo mknod dev/tty3    c 4 3
sudo mknod dev/tty4    c 4 4
sudo mknod dev/console c 5 1
sudo mknod dev/null    c 1 3

最后创建 /init ,内核启动后需要执行它。

1
2
$ cd rootfs_my_init_ramfs
$ ln -s ./bin/busybox ./init

可以查看一下总容量:

1
2
du -sh ./rootfs_my_init_ramfs/
2.7M	./rootfs_my_init_ramfs/

到此,基本制作完毕。rootfs_my_init_ramfs 即为需要的根文件系统。后续可以作为简单的根文件系统测试或是initramfs等。

1
2
3
cd rootfs_my_init_ramfs
find . | cpio -c -o | gzip -9 > ../initrd.cpio.gz
cp ../initrd.cpio.gz ../myinitrd.img
This post is licensed under CC BY 4.0 by the author.

使用apt降级软件包

QEMU-x86 System emulator