Busybox,是一个未完全实现的Unix系统,可以裁剪为最小的一个运行系统,可以包含一些简单的命令。
制作环境:
- Board: iTOP-4412 POP 1G 精英板
- Root FS: BusyBox 1.37.0
- Compiler: gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
依赖
curses:sudo apt-get install libncurses5-dev libncursesw5-dev
编译
1 | make defconfig |
设置:
1 | Busybox Settings ---> |
错误1:
1 | libbb/hash_md5_sha.c: In function ‘sha1_end’: |
解决:
1 | libbb/hash_md5_sha.c | 2 ++ |
错误2:
1 | networking/libiproute/iplink.c: In function ‘do_set_can’: |
解决:
1 | --- a/networking/libiproute/iplink.c 2024-04-16 15:23:50.000000000 +0800 |
编译:
1 | make |
添加其它文件
创建所需文件夹(根据FHS标准)
mkdir dev etc home lib media mnt opt proc sys tmp var root
添加相应的库
从编译busybox所使用的交叉编译工具里拷贝,使用
arm-linux-gnueabihf-readelf -d bin/busybox
查询到:1
2
3
4Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libresolv.so.2]
0x00000001 (NEEDED) Shared library: [libc.so.6]将这 3 个库文件拷贝到 lib 文件夹下。
一般把正常需要的库都拷贝到/lib下,这样也不会太大,包括:
ld-linux:动态链接库,必需
libc: 标准c函数库,必需
libm: 数学库,一般需要
libdl: 用于动态装载共享库,较少用到
libcrypt: 加密附加库,需要认证的程序用到,较少用
libpthread: POSIX线程库,一般需要添加配置文件
vim etc/inittab
1 | ::sysinit:/etc/init.d/rcS |
mkdir etc/init.d; vim etc/init.d/rcS
1 |
|
vim etc/HOSTNAME
1 | Easy4412 |
vim fstab
1 | #device mount-point type options dump fsck order |
vim etc/profile
1 | USER="`id -un`" |
vim etc/group
1 | root:x:0:root |
vim etc/passwd
1 | root::0:0:root:/:/bin/sh |
制作镜像文件
1 | dd if=/dev/zero of=rootfs.ext4 bs=1M count=1024 |
这个命令会创建一个名为image.img的文件,大小为1GB(Ext4默认保留5%的空间)。这个文件的内容全部是零,因为我们使用的输入文件(if)是/dev/zero,这是一个特殊的文件,读取它会得到无限的零。
1 | mkfs.ext4 rootfs.ext4 |
这个命令会将image.img文件格式化为ext4文件系统。
1 | sudo mkdir /mnt/myimage |
这个命令会将image.img文件挂载到/mnt/myimage目录。注意,我们需要使用-o loop选项,因为我们是挂载一个文件,而不是一个设备。
操作镜像文件:现在,我们可以在/mnt/myimage目录下创建文件、写入数据等,所有的操作都会被写入到image.img文件中。
操作完成后,我们需要卸载这个镜像文件sudo umount /mnt/myimage
。
1 | sudo apt install android-sdk-ext4-utils |