文章目录
busybox源码下载
根据自己的选择下载合适的版本,本文以1.31.1为例,下载链接:busybox
1.配置与裁剪
1.1解压源码
tar -xf busybox-1.31.1.tar.bz2
1.2配置
进入到解压得到的源码目录下执行如下命令:
make menuconfig
配置交叉编译器前缀及安装目录,我这里直接安装到我的nfs挂载的目录(如果无法删除原有路径,按住ctrl加退格键可删除):
Settings
(arm-linux-gnueabi-) Cross compiler prefix
(/home/rootfs) Destination path for 'make install'
其它配置根据自己的需求进行裁剪。
1.3编译
make -j4
1.4安装
make install
安装完成后在前面指定的安装目录可看到生成的文件(我这里的文件在/home/rootfs
目录):
bin linuxrc sbin usr
创建其它必须的目录:
mkdir dev etc lib proc var
从交叉编译器安装目录拷贝lib目录里面的动态库到根文件系统的lib目录:
cp /usr/arm-linux-gnueabi/lib/*.so.* lib/
拷贝示例系统初始化配置文件:
cp -rf busybox-1.31.1/examples/bootfloppy/etc/* etc/
到此一个精简的根文件系统就完成了,其它的根据需要进行配置。
2.制作烧录镜像
前面制作的根文件系统只能用于网络挂载,但我要将文件系统固化到emmc里面,所以需要将其打包制作成可以烧录的镜像,这里以ext4
格式为例。
首先生成一个200M(根据实际调整)大小的空文件:
touch rootfs.ext4
dd if=/dev/zero of=rootfs.ext4 bs=1024 count=204800
将生成的空文件格式化成ext4格式:
mkfs.ext4 rootfs.ext4
挂载格式化后的空文件(-o loop选项可以让文件像块设备一样访问):
sudo mount -t ext4 rootfs.ext4 /mnt/ -o loop
将前面制作好的根文件系统的内容拷贝到挂载的目录。
拷贝完后卸载目录:
sudo umount /mnt
此时,可烧录的根文件系统镜像就制作好了,再烧录到emmc/sd的存放根文件系统的分区:
dd if=rootfs.ext4 of=/dev/mmcblk0p2
如果以后还想添加其它文件,只需要再次进行挂载,然后添加内容即可。
3.格式化并分区emmc/sd
因为制作好的根文件系统里面没有mkfs.ext4工具,只有ext2的,我需要格式化emmc其它分区为ext4
格式的,所以需要移植。
3.1移植e2fsprogs
下载源码:e2fsprogs
3.2解压源码
tar -xf e2fsprogs-1.45.6.tar.gz
3.3配置
进入解压得到的源码目录下执行如下命令:
# 指定交叉编译器
# 指定运行主机架构
# 指定安装路径前缀(绝对路径)
# 使用动态库
./configure CC=arm-linux-gnueabi-gcc --host=arm --prefix=/home/Desktop/e2fsprogs-1.45.6/release/ --enable-elf-shlibs
3.4编译
make -j4
3.5安装
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