1、准备工作
busybox源码下载:https://busybox.net/downloads/
主机环境:Ubuntu 16.04
目标主机:Freescale imx6ull
工具链:arm-linux-gnueabihf (4.9.4)
2、制作文件系统
2.1 解压压缩包
tar xjvf busybox-1.32.0.tar.bz2
2.2 配置交叉编译工具链
cd busybox-1.32.0/
make menuconfig
# 配置路径
Settings --->
--- Build Options
(arm-linux-gnueabihf-) Cross compiler prefix
若旧版busybox不支持menuconfig配置交叉编译工具链也可以直接修改Makefile:
CROSS_COMPILE ?= arm-linux-gnueabihf-
ARCH ?= arm
2.3 编译
make
2.4 安装
# 新建需要安装的目录
mkdir myrootfs
# 安装到新建的目录中,如果不指定路径会默认安装在主机的目录,可能会造成严重后果
make install CONFIG_PREFIX=./myrootfs/
# 安装完成会生成一下目录
ls myrootfs/
bin linuxrc sbin usr
2.5 完善其他目录
dev目录:(设备相关)
mkdir dev
cd dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
etc目录:(系统配置)
mkdir etc
cd etc/
vi inittab # 文件内容在后面
vi fstab # 文件内容在后面
mkdir init.d
cd init.d/
vi rcS # 文件内容在后面
chmod +x rcS
# 1、inittab内容如下:
console::askfirst:-/bin/sh # '-'代表交互
#tty1::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS # 执行rcS文件初始化系统
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
# 2、fstab内容如下:
#device mount-point type options dump fask order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
# 3、rcS内容如下:
mount -a # 会调用/etc/fstab文件去挂载
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug # 开启热拔插机制
mdev -s
解析:
inittab说明可以参考busybox中examples/inittab文件,内容格式为<id>:<runlevels>:<action>:<process>
;id是唯一的,runlevels完全可以忽略,主要看action动作选项,它是指定process可能会用到的动作;
rcS和fstab所涉及的文件系统主要用途如下:tmpfs用于内存文件系统,用于减少对flash的读写操作;pts用于支持外部网络连接(telnet)的虚拟终端;sysfs用于mdev通过它获得设备信息;proc用于查看设备运行情况;
其他目录:
mkdir lib proc mnt tmp sys root usr/lib -p
2.6 拷贝C库(c程序运行会依赖动态库)
cp -d /arm-linux-gnueabihf-linaro-4.9.4-2017.01-x86_64/arm-linux-gnueabihf/libc/usr/lib/*so* ./usr/lib/
cp -d /arm-linux-gnueabihf-linaro-4.9.4-2017.01-x86_64/arm-linux-gnueabihf/libc/lib/*so* ./lib/
2.7 完成!
完成后的文件架构如下:
book@Ubuntu:~/busybox-1.32.0/myrootfs$ tree
.
├── bin
│ ├── arch -> busybox
│ ├── # 省略...
│ └── zcat -> busybox
├── dev
│ ├── console
│ └── null
├── etc
│ ├── fstab
│ ├── init.d
│ │ └── rcS
│ └── inittab
├── lib
│ ├── ld-2.19-2014.08-1-git.so
│ ├── # 省略...
│ └── libutil.so.1 -> libutil-2.19-2014.08-1-git.so
├── linuxrc -> bin/busybox
├── mnt
├── proc
├── root
├── sbin
│ ├── acpid -> ../bin/busybox
│ ├── # 省略...
│ └── zcip -> ../bin/busybox
├── sys
├── tmp
└── usr
├── bin
│ ├── [ -> ../../bin/busybox
│ ├── # 省略...
│ └── yes -> ../../bin/busybox
├── lib
│ ├── libanl.so -> ../../lib/libanl.so.1
│ ├── # 省略...
│ └── libutil.so -> ../../lib/libutil.so.1
└── sbin
├── addgroup -> ../../bin/busybox
├── # 省略...
└── udhcpd -> ../../bin/busybox
(注:这里只是演示构建最简单的文件系统,需要添加新的功能可以通过make menuconfig根据自己需求添加对应的功能。)