笔记:使用busybox制作根文件系统

busybox源码下载

根据自己的选择下载合适的版本,本文以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

到此一个精简的根文件系统就完成了,其它的根据需要进行配置。

移植e2fsprogs

因为制作好的根文件系统里面没有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工具了。

格式化并分区emmc/sd

挂载根文件系统启动开发板进入控制台,通过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里面,所以需要将其打包制作成可以烧录的镜像(实际上不制作成镜像直接拷贝也可以,但是制作成镜像后添加文件比较方便)。

ext4文件系统

生成一个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

如果以后还想添加其它文件,只需要再次进行挂载,然后添加内容即可。

猜你喜欢

转载自blog.csdn.net/a1598025967/article/details/107501533