我在之前的uboot通过NFS挂载ubuntu根文件系统中也有实现过根文件系统的制作,那只是在ubuntu官网已经做好的根文件基础上安装一些自己所需的软解而已。而使用busybox制作根文件系统可以自定义选项,加深自己对linux的系统理解,方便后期学习根文件系统的裁剪。

一、下载busybox制作制作工具

官网下载地址https://busybox.net/,进入“Download Source”下载连接



根据自己的需要下载相应的版本,我下载的是“busybox-1.33.1.tar.bz2 ”。

二、编译链配置

将下载的文件放入linux开发环境中进行解压,目录如下图所示



为了以后使用方便,修改交叉工具链,进入“Makefile”文件

sudo vim Makefile

进入文件后修改“ARCH”和“CROSS_COMPILE”变量,如下图所示:



注意:交叉编译链一定要是自己安装的全路径

三、busybox中文支持

1.修改“printable_string.c”文件

sudo vim libbb/printable_string.c

进入文件后修改内容如下图所示:



2.修改“unicode.c”文件

sudo vim libbb/unicode.c

进入文件后修改内容如下图所示:

四、配置busybox

1.设置配置项

defconfig:缺项配置,也就是默认配置选项。

allyesconfig:全选配置,也就是说选中busybox的所有功能。

allnoconfig:最小配置。

可以根据自己需要选择配置命令,这里我选用的是最下配置命令如下

sudo make defconfig

配置完成后可通过查看是否有.config文件,如果存在则说明配置成功,如下图所示:



2.进入图形配置

sudo make menuconfig

进入图形配置界面后,配置库文件来源,配置路径如下所示

-> Settings
-> Build static binary

使用静态库时,编译出来的文件很大,然后编译出来的DNS会出问题,所以我这里选用的是动态库,配置如下图所示:



勾选“vi-style line editing commands”,配置路径如下

-> Settings
-> vi-style line editing commands

取消“Simplified modutils”的勾选,配置路径如下

-> Linux Module Utilities
-> Simplified modutils

勾选“mdev”,配置路径如下

-> Linux System Utilities
-> mdev

如下图所示:



勾选“Support Unicode”及其子选项“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”

-> Settings
-> Support Unicode
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables

到此busybox的配置基本完成,如果需要其他配置项的内容可根据自己的需求选择。

五、编译busybox

编译时指定生成的根文件系统的存放路径

make install CONFIG_PREFIX=/home/nfs/rootfs

编译完成后会出下图中的结果说明编译成功,如果所示:



此时,进入生成的根文件路径下可以看到相应的目录生成,如下图所示:



此时看到的根文件系统是不完全的,因为我选择的库文件是动态库,所以还需要将库文件加入系统中。

六、添加动态库文件

1.在生成的根文件目录下创建lib文件夹

mkdir lib

将交叉编译链arm-linux-gnueabihe/libc/lib下的所有so和.a文件拷贝到刚才创建的lib文件下

cp *so* *.a /home/nfs/rootfs/lib -d

将刚拷贝过来放在lib目录下的ld-linux-armhf.so.3的软链接改为源文件,首先删除文件

rm ld-linux-armhf.so.3

然后重新在交叉编译链arm-linux-gnueabihe/libc/lib下将文件拷贝过来

cp ld-linux-armhf.so.3 /home/nfs/rootfs/lib

将交叉编译链arm-linux-gnueabihe/lib下的所有so和.a文件拷贝到刚才创建的lib文件下

cp *so* *.a /home/nfs/rootfs/lib -d

2.在生成的根文件目录下创建usr/lib文件夹

cd ../
mkdir usr/lib
cd usr/lib
ls

将交叉编译链arm-linux-gnueabihe/libc/usr/lib下的所有so和.a文件拷贝到刚才创建的lib文件下

cp *so* *.a /home/nfs/rootfs/usr/lib -d

到此动态库文件已经拷贝完成,可以通过du命令查看刚才拷贝文件的大小

cd ../../
du ./lib ./usr/lib

如下图所示:



3.创建其他文件夹

mkdir dev proc mnt sys tmp root

目录如下图所示:



现在我们的根文件系统就基本制作完成了,接下来测试我们制作的根文件是否能用。

七、测试

测试方式推荐使用NFS的形式挂载根文件系统,由于之间我有写过一篇文章,这里就不过多介绍了,具体流程见uboot通过NFS挂载ubuntu根文件系统

挂载根文件系统启动后,见如下图信息,则说明成功:



启动后虽然能正常使用,但是会提示缺少'rcS'文件,需要在/etc/init.d/路径下创建rcS文件,如果路径不存在,创建相应的文件即可

1.rvS文件

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s

完成后重启开发版,又会出现缺少fstab文件,同样的方式在/etc路径下创建fstab文件

2.fstab文件

# <file system>        <dir>         <type>    <options>             <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0

完成后在此重启,这次虽然没错误提示,还需要在/etc路径下创建inittab文件

3.inittab文件

#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swqpoff -a

到此简单的根文件系统已经制作完成,可以进行系统的烧写。

八、问题与处理

1.打开图形配置界面时,可能出现的问题如下图所示:



解决办法,错误主要是没有安装ncurses导致的,只需要进行安装即可

sudo apt-get install libncurses5-dev

九、参考连接

原子哥视频教程https://www.bilibili.com/video/BV12E411h71h?p=44&spm_id_from=pageDriver

最新文章

  1. 常见http错误码解读
  2. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
  3. 【python】3.x,string与bytes的区别(文本,二进制数据)
  4. 坑的可以呀re
  5. cobbler工作流分析
  6. js简版图片左右切换功能
  7. java实现MD5加密
  8. Notice: Trying to get property of non-object problem(PHP)解决办法 中间件只能跳转不能返任何数据
  9. iOS开发 判断代理以及代理方法是否有人遵循
  10. HDU 5405 (树链剖分+线段树)
  11. 20169210《Linux内核原理与分析》第十周作业
  12. 【转】Device Tree(三):代码分析
  13. Mongodb 权限管理
  14. 30款基本UX工具 - 用户测试与反馈工具
  15. Thinkjs学习2—数据库的配置
  16. 从前端开发看HTTP协议的应用
  17. iOS应用架构开篇
  18. 自学Zabbix11.3 Zabbix SNMP 常用OID列表
  19. 网络编程 tcp(一)
  20. 【mlflow】执行import mlflow 报错:ImportError: No module named &#39;pkg_resources&#39;

热门文章

  1. reboot 就是 poweroff 然后power on
  2. SSL数字证书颁发
  3. docker容器中日志文件过大处理方法
  4. 运维常用shell脚本二(压缩文件、过滤不需要的文件、检测进程)
  5. python基础之包、模块、命名空间和作用域
  6. 10.11 arping:发送arp请求
  7. JS中的高阶函数
  8. Volatile 原理及使用,java并发中的可见性问题
  9. java IO教程《四》
  10. ADAS可行驶区域道路积水反光区域的识别算法