[RK3399 Linux] 使用busybox 1.36.1制作rootfs

本文详细介绍了如何在RK3399 Linux环境下,使用busybox 1.36.1版本编译、配置和制作rootfs。内容涵盖下载源码、配置busybox、构建根文件系统、制作ext4和ramdisk根文件系统镜像。涉及到的关键步骤包括配置busybox、添加库文件、构建etc目录、制作dev目录,并讲解了如何修改相关配置文件。

一、 编译、安装、配置 busybox

1.1 下载源码

根文件系统是根据busybox来制作的。

下载地址:https://busybox.net/downloads/

这里就以1.36.1版本为例进行编译安装介绍:

在这里插入图片描述

注意:编译linux内核与文件系统中的所有程序要使用相同的交叉编译器。

下载完成后解压:

mkdir rootfs
cd rootfs
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjvf busybox-1.36.1.tar.bz2
<think>我们有两个主要问题:1.解决u-boot编译时缺少gnutls/gnutls.h头文件的错误;2.在安装busybox1.36.1制作rootfs文件。对于第一个问题:缺少gnutls/gnutls.h这个头文件属于gnutls开发包,通常在Linux系统中可以通过包管理器安装。由于u-boot的某些功能(如网络相关)可能依赖这个库,所以需要安装对应的开发包。对于第二个问题:制作rootfs在引用[1]中,我们注意到编译后会生成rootfs.ext2和rootfs.ext4等文件,说明制作rootfs是构建过程的一部分。通常,制作rootfs包括:-使用busybox安装基本的命令到目标目录(例如,通过`makeinstall`将busybox安装到某个目录,如`_install`)。-创建必要的目录结构(dev,proc,sys,etc,bin,sbin,usr,lib等)。-添加必要的配置文件(如inittab、rcS等,这些在busybox的examples目录下有示例)。-使用工具(如genext2fs,mkfs.ext4等)将目录制作成镜像文件。根据引用[2],我们还可以通过NFS挂载rootfs进行测试,但在制作阶段我们主要关注如何生成镜像文件。现在,结合引用[4],我们还注意到在OpenWrt中有自动挂载的配置,但是我们在制作rootfs时不需要考虑这些,除非我们的rootfs是为OpenWrt准备的。不过,这里我们制作通用的rootfs。详细步骤:问题1:缺少gnutls/gnutls.h解决方案:在Ubuntu/Debian系统上,可以安装libgnutls28-dev包:```bashsudoapt-getinstalllibgnutls28-dev```在其他Linux发行版上,包名可能略有不同(例如Fedora上可能是gnutls-devel)。问题2:制作rootfs(以ext4格式为例)的步骤:1.编译并安装busybox1.36.1:```bashmakedefconfigmakemenuconfig#可选,进行配置,比如选择静态链接,这样就不需要额外拷贝库文件make-j$(nproc)makeinstall```这会在busybox目录下生成`_install`目录,里面包含基本的命令。2.创建rootfs目录结构:```bash#假设我们在当前目录下创建rootfs目录mkdirrootfscdrootfscp-r../busybox-1.36.1/_install/*.mkdir-pdevprocsysetc/init.dtmplibusr/lib```3.创建init脚本(例如`etc/inittab`)和启动脚本(例如`etc/init.d/rcS`):-`etc/inittab`示例:```::sysinit:/etc/init.d/rcS::askfirst:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/sbin/swapoff-a::shutdown:/bin/umount-a-r::restart:/sbin/init```-`etc/init.d/rcS`示例(需添加可执行权限):```bash#!/bin/shmount-tprocproc/procmount-tsysfssysfs/sysmount-ttmpfstmpfs/tmp#其他挂载或启动任务echo"StartingrcS..."```然后设置可执行权限:`chmod+xetc/init.d/rcS`4.如果使用动态链接,需要将工具链的库文件拷贝到rootfs的lib目录(例如`lib/`)。如果是静态编译busybox,则可以省略。5.使用工具生成ext4镜像:```bash#假设rootfs目录在当前目录的rootfs,生成大小为128MB的ext4镜像genext2fs-drootfs-b131072-Urootfs.ext2#使用genext2fs创建ext2(也可以转成ext4)#或者使用mkfs.ext4mkdir-pimagesddif=/dev/zeroof=images/rootfs.ext4bs=1Mcount=128mkfs.ext4images/rootfs.ext4sudomount-oloopimages/rootfs.ext4/mntsudocp-rrootfs/*/mnt/sudoumount/mnt```另外,引用[3]中提到了lxc容器的配置,这与我们的rootfs制作关系不大,但注意在配置容器时可能需要类似的rootfs目录结构。因此,总结回答:针对缺少gnutls/gnutls.h的问题,安装对应的开发包。针对制作rootfs,按照上述步骤构建目录结构,添加配置,然后使用工具制作成镜像。注意:在制作rootfs时,确保busybox是静态编译(在配置中选择“Buildstaticbinary(nosharedlibs)”),这样就不需要额外拷贝库文件,简化过程。最后,引用[1]中提到的编译后会生成rootfs.ext2和rootfs.ext4,可能是构建系统自动完成了上述步骤(比如使用Buildroot或Yocto等构建系统),但用户是手动编译busybox,所以需要手动制作。相关问题:§§相关问题§§1.如何配置busybox以静态编译?2.rootfs中还需要哪些必要的配置文件?3.如何为嵌入式系统设置自动挂载(如引用[4]中的mdev配置)?4.如何通过NFS挂载rootfs进行调试(如引用[2]所示)?</think> ### 解决u-boot编译缺少gnutls/gnutls.h问题 #### 原因分析 该错误表明系统缺失**GnuTLS开发库**。GnuTLS是用于实现SSL/TLS协议的安全通信库,u-boot在启用加密功能(如HTTPS引导)时需要该库[^1]。 #### 解决方案 1. **安装GnuTLS开发包**(以Ubuntu为例) ```bash sudo apt-get update sudo apt-get install libgnutls28-dev # 安装开发头文件和库 ``` - 其他发行版对应包名: - Fedora/CentOS: `gnutls-devel` - Arch: `gnutls` 2. **重新配置u-boot** ```bash make distclean # 清理旧配置 make <your_board>_defconfig # 使用目标板配置文件 make menuconfig # 检查加密功能配置 ``` - 验证`CONFIG_FIT_SIGNATURE`和`CONFIG_CMD_LOAD_OTP`等加密相关选项状态 3. **验证安装** ```bash ls /usr/include/gnutls/gnutls.h # 确认头文件存在 ``` 4. **重新编译** ```bash make all CROSS_COMPILE=arm-linux-gnueabihf- # 替换为你的交叉编译器 ``` > 📌 注:若仍报错,检查交叉编译器是否包含GnuTLS支持(通过`arm-linux-gnueabihf-gcc -v`查看库路径) --- ### 制作Busybox 1.36.1 rootfs步骤 #### 准备工作 1. **编译Busybox** ```bash make menuconfig # 设置静态编译: Settings → Build static binary make -j$(nproc) make CONFIG_PREFIX=./rootfs install # 安装到rootfs目录 ``` #### 构建rootfs结构 ```bash cd rootfs mkdir -p dev etc/init.d proc sys tmp lib/modules usr/bin usr/sbin ``` #### 添加关键文件 1. **创建init脚本** (`sbin/init`) ```bash #!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys echo "Welcome to MyRootFS!" exec /bin/sh chmod +x sbin/init ``` 2. **配置inittab** (`etc/inittab`) ```ini ::sysinit:/etc/init.d/rcS ::respawn:/sbin/getty -L ttyAMA0 115200 vt100 # 串口登录 ``` 3. **启动脚本** (`etc/init.d/rcS`) ```bash #!/bin/sh /bin/mount -a echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s chmod +x etc/init.d/rcS ``` #### 生成文件系统镜像 1. **EXT4格式镜像** ```bash dd if=/dev/zero of=rootfs.ext4 bs=1M count=128 # 创建128MB镜像 mkfs.ext4 rootfs.ext4 sudo mount -o loop rootfs.ext4 /mnt sudo cp -r rootfs/* /mnt sudo umount /mnt ``` 2. **兼容u-boot的镜像**(参考[1]) ```bash mkimage -A arm -O linux -T ramdisk -C gzip \ -d rootfs.ext4 uRamdisk # 生成u-boot可加载的ramdisk ``` #### 验证方式 1. **QEMU测试** ```bash qemu-system-arm -M versatilepb -kernel zImage \ -dtb stm32mp157c-myir.dtb \ -append "root=/dev/ram0" \ -initrd uRamdisk ``` 2. **开发板加载**(参考[2][4]) 将镜像放入`output/images/`,通过tFTP/NFS引导系统 > 💡 关键配置: > - 静态编译Busybox避免库依赖问题[^2] > - 通过`mdev`实现设备节点自动创建(参考[4]的mdev配置) > - 对齐u-boot的ramdisk要求(镜像类型/压缩格式)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值