目录
概述
1 编译busybox
1.1 配置Makefile
1.2 需改参数
1.3 配置busybox
1.4 编译busybox
2 完善 rootfs下文件
2.1 rootfs 的“/lib”目录添加库文件
2.2 rootfs 的“usr/lib”目录添加库文件
2.3 创建其他目录
3 完善其他文件
3.1 完善etc/init.d/rcS
3.2 完善 /etc/fstab 文件
3.3 完善 /etc/inittab文件
4 打包rootfs
概述
本文主要介绍如何使用busybox工具创建rootfs系统,交叉编译器版本为:gcc-linaro-4.9.4-arm-linux-gnueabihf。笔者通过实操的方式介绍制作rootfs的全过程。并将每个文件中的要编写的内容罗列出来,方便使用其作为一个设计的模版。
1 编译busybox
从如下网址上获取busybox的源码包: https://busybox.net/downloads/
1.1 配置Makefile
解压busybox
tar -vxjf busybox-1.29.0.tar.bz2
在busybox-1.29.0/Makefile配置编译器信息:
源代码为:
CROSS_COMPILE ?=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
配置架构信息:
1.2 需改参数
修改busybox 源码,取消 busybox 对中文显示的限制,打开文件 busybox-1.29.0/libbb/printable_string.c,找到函数 printable_string,函数内容如下:
修改位置-1:
修改位置-2:
修改位置-3:
在busybox-1.29.0/libbb/unicode.c文件中修改如下内容:
1.3 配置busybox
使用命令 make menuconfig 进行配置
配置选项-1:
-> Settings-> Build static binary (no shared libs)
配置选项-2:
-> Settings-> vi-style line editing commands
配置选项-3:
-> Linux Module Utilities-> Simplified modutils
配置选项-4:
-> Linux System Utilities-> mdev (16 kb)
配置选项-5:
-> Settings-> Support Unicode-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables
配置完成后,退出配置UI,保存配置
1.4 编译busybox
使用命令
make
然后install busybox
make install CONFIG_PREFIX=/home/mftang/linux_workspace/atk_dl6y2c_rootfs/rootfs
执行命令后, rootfs 目录下有 bin、 sbin 和 usr 这三个目录,以及 linuxrc 这个文件。前面说过 Linux 内核 init 进程最后会查找用户空间的 init 程序,找到以后就会运行这个用户空间的 init 程序,从内核态切换到用户态。如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。至此,busybox 的工作就完成了,但是此时的根文件系统还不能使用,还需要一些其他的文件,下面还需要继续来完善 rootfs。
2 完善 rootfs下文件
2.1 rootfs 的“/lib”目录添加库文件
step-1: 在rootfs目录下创建lib目录,使用命令
mkdir lib
复制编译器目录下文件:/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/arm-linux-gnueabihf/lib
step-2: 复制文件
将此目录下所有的so和.a文件都拷贝到 rootfs/lib 目录中, 拷贝命令如下:
cp *so* *.a /home/mftang/linux_workspace/atk_dl6y2c_rootfs/rootfs/lib -d
step-3: 删除软链接文件
删除文件后:
2.2 rootfs 的“usr/lib”目录添加库文件
在usr 目录下创建lib目录
将/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib目录下文件copy到rootfs/usr/lib中。在/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib目录下使用命令:
cp *so* *.a /home/mftang/linux_workspace/atk_dl6y2c_rootfs/rootfs/usr/lib -d
2.3 创建其他目录
创建其他的一些文件夹,具体如下:
进入rootfs查看目录结构:
3 完善其他文件
3.1 完善etc/init.d/rcS
rcS 是个 shell 脚本, Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件 的脚本文件。在 rootfs 中创建/etc/init.d/rcS 文件,然后在 rcS 中输入如下所示内容:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel
#网络开机自启动设置
ifconfig eth0 up
#udhcpc -i eth0
ifconfig eth0 192.168.1.225 netmask 255.255.255.0
route add default gw 192.168.1.1
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
#添加开级自动运行的代码
在文件夹中的位置
3.2 完善 /etc/fstab 文件
在 rootfs 中创建/etc/fstab 文件, fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区,格式如下:
<file system> <mount point> <type> <options> <dump> <pass>
文件内容:
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
在文件夹中的位置
3.3 完善 /etc/inittab文件
inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。 init 程序会读取/etc/inittab这个文件, inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的 4 个段组成,格式如下:
<id>:<runlevels>:<action>:<process>
文件内容:
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
在文件夹中的位置:
4 打包rootfs
进入到 Ubuntu 中的rootfs 目录中,然后使用 tar 命令对其进行打包,命令如下:
tar -vcjf rootfs.tar.bz2 *
执行命令后,生成.bz2文件