Busybox生成根文件系统,并移植e2fsprogs:RK3568

Busybox生成根文件系统,并移植e2fsprogs:RK3568

链接

busyboxBusyBox

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 目录

  1. 在output目录下创建dev目录
  2. 在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文件夹内的示例inittabrcS、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移植即可(未实验)

相关推荐
一起逃去看海吧36 分钟前
dify-03
java·linux·开发语言
fengyehongWorld37 分钟前
Linux 根据端口进行的相关查询
linux
lihao lihao39 分钟前
linux匿名管道
linux·运维·服务器
うちは止水42 分钟前
weston出图调试
linux·wayland·weston
STDD44 分钟前
Farming Simulator 25(模拟农场 25) Linux 专服搭建完全指南
linux·运维·javascript
好好风格1 小时前
宝塔面板 HTTPS 端口证书不生效排查记录
linux·运维·nginx
用户2367829801682 小时前
Linux pgrep 命令详解:按名称查找进程 PID 的高效方法
linux
zzipeng2 小时前
Linux LCD驱动
linux·运维·服务器
思麟呀2 小时前
C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
linux·开发语言·jvm·c++·windows