Linux rootfs:使用busybox构建根文件系统

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根据自己需求添加对应的功能。)

猜你喜欢

转载自blog.csdn.net/weixin_44498318/article/details/112122773