根据自己的选择下载合适的版本,本文以1.31.1为例,下载链接:busybox
tar -xf busybox-1.31.1.tar.bz2
make menuconfig
配置交叉编译器前缀,安装目录,我这里直接安装到我的nfs挂载的目录(如果无法删除原有路径,按住ctrl加退格键可删除):
Settings
(arm-linux-gnueabi-) Cross compiler prefix
(/home/rootfs) Destination path for 'make install'
其它配置(可选):
Settings
[*] vi-style line editing commands
[*] Fancy shell prompts
Login/Password Management Utilities
[ ] add-shell (3.1 kb)
[ ] remove-shell (3 kb)
[ ] addgroup (8.6 kb)
[ ] adduser (15 kb)
[ ] chpasswd (18 kb)
[ ] cryptpw (14 kb)
[ ] mkpasswd (15 kb)
[ ] deluser (9.1 kb)
[ ] delgroup (6.4 kb)
[ ] su (19 kb)
[ ] sulogin (17 kb)
Miscellaneous Utilities
[ ] chat (6.3 kb)
[ ] man (26 kb)
[ ] nandwrite (4.8 kb)
[ ] nanddump (5.2 kb)
Print Utilities
[ ] lpd (5.5 kb)
[ ] lpr (9.9 kb)
[ ] lpq (9.9 kb)
Mail Utilities
[ ] makemime (5.4 kb)
[ ] popmaildir (10 kb)
[ ] reformime (7.5 kb)
[ ] sendmail (14 kb)
make -j4
make install
安装完成后在前面指定的安装目录可看到生成的文件:
bin linuxrc sbin usr
创建其它必须的目录:
mkdir dev etc lib proc var
从交叉编译器安装目录拷贝lib目录里面的动态库到根文件系统的lib目录:
cp /usr/arm-linux-gnueabi/lib/*.so.* lib/
完善系统配置相关的内容:
cp -rf ~/Desktop/busybox-1.31.1/examples/bootfloppy/etc/* etc/
修改配置脚本:
#! /bin/sh
/bin/mount -a
for script in /etc/init.d/S[0-9][0-9]*
do
if [ -x $script ];then
/bin/sh -c $script
fi
done
到此一个精简的根文件系统就完成了,其它的根据需要进行配置。
因为制作好的根文件系统里面没有mkfs.ext4工具,只有ext2的,我想制作ext4格式的根文件系统,所以需要移植。
下载源码:e2fsprogs
tar -xf e2fsprogs-1.45.6.tar.gz
# 指定交叉编译器
# 指定运行主机架构
# 指定安装路径前缀(绝对路径)
# 使用动态库
./configure CC=arm-linux-gnueabi-gcc --host=arm --prefix=/home/Desktop/e2fsprogs-1.45.6/release/ --enable-elf-shlibs
make -j4
make install
完成后,就可以在前面指定的安装路径前缀那个目录下找到生成的文件:
bin etc include lib sbin share
在sbin目录下拷贝需要的工具(我暂时只需要mkfs.ext4)到制根文件系统目录下的sbin目录。
通过如下命令查看这对应工具依赖的动态库:
readelf -d sbin/mkfs.ext4 | grep NEEDED
# 结果
0x00000001 (NEEDED) 共享库:[libext2fs.so.2]
0x00000001 (NEEDED) 共享库:[libcom_err.so.2]
0x00000001 (NEEDED) 共享库:[libblkid.so.1]
0x00000001 (NEEDED) 共享库:[libuuid.so.1]
0x00000001 (NEEDED) 共享库:[libe2p.so.2]
0x00000001 (NEEDED) 共享库:[libc.so.6]
0x00000001 (NEEDED) 共享库:[ld-linux.so.3]
在lib目录拷贝这些必要的动态库到根文件系统目录下的lib目录。
上面的步骤完成后,启动开发板挂载根文件系统已经可以使用mkfs.ext4工具了。
挂载根文件系统启动开发板进入控制台,通过fdisk工具分区emmc:
fdisk /dev/mmcblk0
# 创建分区
Command (m for help): n
Partition type
p primary partition (1-4)
e extended
# 分区类型为主分区
p
# 分区号1
Partition number (1-4): 1
# 起始扇区2048(前面的空间固化u-boot)
First sector (16-7634943, default 16): 2048
# 分区1的大小
Last sector or +size{,K,M,G,T} (2048-7634943, default 7634943): +100M
# 更改分区1的类型
Command (m for help): t
Selected partition 1
# 更改分区类型为FAT32
Hex code (type L to list codes): b
Changed system type of partition 1 to b (Win95 FAT32)
# 创建分区
Command (m for help): n
Partition type
p primary partition (1-4)
e extended
# 分区类型为主分区
p
# 分区号2
Partition number (1-4): 2
# 起始扇区接着分区1的结束扇区
First sector (16-7634943, default 16): 206848
# 分区大小默认为剩余的空间
Last sector or +size{,K,M,G,T} (206848-7634943, default 7634943):
Using default value 7634943
# 保存并退出
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table
mmcblk0: p1 p2
格式化分区1:
mkfs.vfat /dev/mmcblk0p1
格式化分区2:
mkfs.ext4 /dev/mmcblk0p2
前面制作的根文件系统只能用于网络挂载,但我要将文件系统固化到emmc里面,所以需要将其打包制作成可以烧录的镜像(实际上不制作成镜像直接拷贝也可以,但是制作成镜像后添加文件比较方便)。
生成一个200M(根据实际调整)大小的空文件:
dd if=/dev/zero of=rootfs.ext4 bs=1024 count=204800
将生成的空文件格式化成ext4格式:
mkfs.ext4 rootfs.ext4
挂载格式化后的空文件:
sudo mount rootfs.ext4 /mnt/
将前面制作好的根文件系统的内容拷贝到挂载的目录。
拷贝完后卸载文件:
sudo umount /mnt
此时,可烧录的根文件系统镜像就制作好了,再烧录到emmc/sd的存放根文件系统的分区:
dd if=rootfs.ext4 of=/dev/mmcblk0p2
如果以后还想添加其它文件,只需要再次进行挂载,然后添加内容即可。