Busybox生成根文件系统,并移植e2fsprogs:RK3568
链接
busybox:BusyBox
e2fsprogs:Ext2/ext3/ext4 文件系统工具下载 |SourceForge.net
e2fsprogs: e2fsprogs - Debian Package Tracker
或者尝试其他方法下载e2fsprogs
busybox的编译以及根文件系统的生成
指定交叉编译链
vi Makefile :找到CROSS_COMPILE ?= ,修改为:CROSS_COMPILE ?= aarch64-linux-gnu-

配置menuconfig

编译busybox
输入 make

安装busybox,并指定将busybox安装到哪个文件夹
sudo make CONFIG_PREFIX=output install

生成后的根文件系统

创建output/dev 目录
- 在output目录下创建dev目录
- 在dev目录下创建必要的console和null设备
shell
cd output
sudo mkdir dev
sudo mknod console c 5 1
sudo mknod null c 1 3
console和null设备是必要的,一个是控制台设备,一个是空设备,没有console没法进行串口打印,null设备是写什么都会成功,这玩意有些会使用到

创建lib目录
该目录下放置使用的库文件
查看busybox使用的哪些库
aarch64-linux-gnu-readelf -d ./bin/busybox
注意打印出来的 NEEDED,如下

需要 libm.so.6 、 libresolv.so.2、libc.so.6、ld-linux-aarch64.so.1
从交叉编译工具链目录下进行copy
示例:sudo cp -d /usr/aarch64-linux-gnu/lib/ld-* ./lib/
注意 使用sudo和 cp -d,保证权限为root以及保持原样复制

题外话
其实这里就可以生成一个根文件系统,并且打包成镜像烧录了,但仍需要继续完善
完善busybox生成的根文件系统
错误如下

创建目录
shell
sudo mkdir run
sudo mkdir sys
sudo mkdir proc
sudo mkdir -p etc/init.d
sudo mkdir tmp #这个文件夹也需要创建,在fstab文件内容那块会体现
sudo mkdir boot#这个文件夹也需要创建,在fstab文件内容那块会体现

增加etc/inittab、etc/init.d/rcS、etc/fstab文件
将busybox文件夹内的示例inittab、rcS、fstab文件cp过来,进行修改
initab文件内容如下:
shell
#............省略
::sysinit:/etc/init.d/rcS
#.......................省略
console::askfirst:-/bin/sh
#..................省略
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
其中,sysinit:系统启动后最先执行,其他字段的信息可以参考网络上或者韦东山老师的使用Busybox制作根文件系统文档,这里不赘述。
fstab文件内容
这个是我直接使用的lubancat2的RK3568板卡上面的fstab的文件,这个文件是用来表明要挂载的文件系统,由rcS脚本执行命令,进行挂载
shell
# <file system> <mount pt> <type> <options> <dump> <pass>
/dev/root / auto rw,noauto 0 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
tmpfs /tmp tmpfs mode=1777 0 0
tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0
sysfs /sys sysfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
pstore /sys/fs/pstore pstore defaults 0 0
/dev/mmcblk0p2 /boot auto defaults 0 2
rcS文件内容
shell
#! /bin/sh
mkdir -p /dev/shm
/bin/mount -a # 让系统自动的根据fstab文件去挂载设备
ifconfig eth0 192.168.1.181 up
效果
根据 生成rootfs.img步骤:生成rootfs.img,并打包生成镜像烧录后的效果:

这的 /dev/mmcblk0p3 的大小显然是不对的,所以需要移植e2fsprogs,进行自动扩容
移植e2fsprogs
移植过程中一定要小心,否则一旦变动了busybox,就会导致系统启动崩溃
下载后,将e2fsprogs进行编译
编译
切换到e2fsprogs源码根目录下

touch build.sh
chmod 777 build.sh
sudo ./build.sh
其中,build.sh脚本内容如下
shell
mkdir -p build
cd build
#这一条命令需要注意,host指向类似于平台的意思
#aarch64-linux-gnu 意思为:ARM64
#CC : 交叉编译工具链
# prefix :安装目录,如果不增加这个,就会安装到虚拟机里面,破坏虚拟机环境
# enable-elf-shlibs : 生成动态库
#with-*-dir : 这三条命令是一些其他用不到的功能
#更多查看:../configure --help
../configure --host=aarch64-linux-gnu \
CC=aarch64-linux-gnu-gcc \
--prefix=/home/lubancat/test/e2fsprogs-1.47.4/rootfs_out \
--enable-elf-shlibs \
--with-udev-rules-dir=no \
--with-crond-dir=no \
--with-systemd-unit-dir=no
make -j4
make install
在rootfs_out目录下查看生成的e2fsprogs内容

合并进入busybox
我建议使用 mv 命令,不使用cp命令,cp命令无法替换掉 链接文件,使用cp命令,很容易就导致busybox文件被污染,移植完毕后,一定要用readelf命令查看一下可执行程序busybox文件是否正常,如下,和移植之前进行比较,如果不正常,我遇到的是:NEEDED多出了一个libpthread.so ,那么就有理由怀疑是在移植过程中,将可执行程序busybox污染了
移植过程不需要多的赘述,就是将 e2fsprogs 生成的文件 移动到 根文件系统 对应的目录下面即可

其余注意
mv完毕后,注意libexec、share、/lib/pkgconfig文件夹的用户和用户组不是root,注意修改
shell
sudo chown -R root ./*
sudo chgrp -R root ./*
注意resize2fs 功能的运行需要libpthread.so库,所以需要从交叉编译工具链下面cp过来

测试:手动扩容/dev/mmcblk0p3
移植完毕后,打包、烧录镜像,查看,如下,正常

自动扩容/dev/mmcblk0p3
修改/etc/init.d/rcS 文件
shell
#!/bin/sh
mkdir -p /dev/shm
/bin/mount -a
ifconfig eth0 192.168.1.181 up
#这一块就是相当于记录烧录镜像后,执行了多少次上下电
DEST_FILE="/etc/init.d/.sys_start_num"
if [ ! -f "$DEST_FILE" ]; then
echo 1 > $DEST_FILE
resize2fs /dev/mmcblk0p3
else
num_old=$(cat "$DEST_FILE")
num_new=$(( num_old + 1 ))
echo "$num_new" > "$DEST_FILE"
fi
sync
生成rootfs.img步骤:
shell
#生成一个50M空间大小的空文件
dd if=/dev/zero of=rootfs.img bs=1M count=50
#将该文件格式化为ext4
mkfs.ext4 rootfs.img
#将该文件空间挂载到指定的目录,并将根文件系统写入,然后卸载
sudo mount -o loop rootfs.img /mnt/rootfs/
sudo cp -r ../tmp/* /mnt/rootfs/
sudo umount /mnt/rootfs
RK3568打包镜像
在RK SDK源码目录内,找到Linux_Pack_Firmware工具
如图

查看Image文件夹

即,Image指向 源码目录根目录下面的rockdev文件夹

替换根文件系统
将生成的rootfs.img 移动到debian目录下 ,并替换链接,由于我之前已经替换过了,所以我直接拷贝即可
链接命令:ln -sf 目标 链接名
shell
mv ./rootfs.img /home/lubancat/LubanCat_SDK/debian/
指定打包的分区
注意package_file指向的文件,rk356x-package-file-me,其下包含你要打包进入镜像的内容,rk356x-package-file-me,内容如下,实际我只是cp了一下rk356x-package-file-ubuntu
一定要将 package-file 文件指向分区表,否则打包时会指明找不到某文件

shell
package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
uboot Image/uboot.img
boot Image/boot.img
rootfs Image/rootfs.im
打包镜像
使用官方的 rk356x-mkupdate.sh 脚本,让mkupdate.sh 指向该文件即可(我的板卡是rk3568)

sudo mkupdate.sh
运行后,你会发现有两个update.img,如图

实际上,在Image目录下面的只是一个中间件,最后可以烧录的update.img,是下面的哪个update.img
这一点也可以在 内核编译脚本中发现,在运行完毕mkupdate.sh脚本后,将update.img 移动到了源码根目录下面的rockdev目录:

烧录
最终,将update.img烧录即可
其他
第一次移植e2fsprogs时出现如下错误:
shell
mke2fs 1.47.4 (6-Mar-2025)
The file earlyprintk does not exist and no size was specified.
[ 2.113257] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100
导致这个错误的原因是因为/sbin/init不正常的执行,也就是在移植过程(使用cp命令将e2fsprogs生成的文件拷贝到busybox生成的文件系统内)中,破坏了正常的可执行文件:bin/busybox,从而导致报错。可以通过 交叉编译工具链的readelf工具(如,我的是:aarch64-linux-gnu-readelf),对比移植前后的 bin/busybox ,会明显发现不一致
查看ELF文件结构信息:aarch64-linux-gnu-readelf -d ./bin/busybox

探测库
echo "void main(){}" | aarch64-linux-gnu-gcc -E -v -

官方镜像的映射如下:

fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/mmcblk0: 7.3 GiB, 7851737088 bytes, 15335424 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 17790000-0000-4866-8000-02F900007F03
Device Start End Sectors Size Type
/dev/mmcblk0p1 16384 24575 8192 4M unknown
/dev/mmcblk0p2 24576 286719 262144 128M unknown
/dev/mmcblk0p3 286720 15335359 15048640 7.2G unknown

df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 970M 8.0K 970M 1% /dev
tmpfs 197M 5.6M 192M 3% /run
/dev/mmcblk0p3 7.1G 3.4G 3.3G 51% /
tmpfs 985M 0 985M 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 985M 0 985M 0% /sys/fs/cgroup
tmpfs 985M 16K 985M 1% /tmp
/dev/mmcblk0p2 124M 43M 75M 37% /boot
tmpfs 197M 12K 197M 1% /run/user/1000
tmpfs 197M 0 197M 0% /run/user/0
reboot loader不能使用
这一块我认为是和移植e2fsprogs类似的,直接将源码内的reboot移植即可(未实验)