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移植即可(未实验)

相关推荐
Cyber4K3 小时前
【Nginx专项】基础入门篇:状态页、微更新、内容替换、读取、压缩及防盗链
linux·运维·服务器·nginx·github
shining4 小时前
当拿到一个新服务器时所需准备工作
linux·程序员
maosheng11465 小时前
linux的综合教程(搭建论坛教程)
linux
Deitymoon5 小时前
linux——TCPIP协议原理
linux·网络
独小乐5 小时前
018.使用I2C总线EEPROM|千篇笔记实现嵌入式全栈/裸机篇
linux·笔记·单片机·嵌入式硬件·arm·信息与通信
SPC的存折5 小时前
2、Docker命令与镜像、容器管理
linux·运维·服务器·docker·容器·eureka
D4c-lovetrain5 小时前
Linux个人心得26 (redis主从复制全流程,详细版)
linux·运维·服务器
晴天¥5 小时前
达梦数据库共享存储集群搭建(DSC双节点+Openfiler-IP SAN存储)
linux·数据库·达梦数据库
吃着火锅x唱着歌5 小时前
LeetCode 150.逆波兰表达式求值
linux·算法·leetcode