首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >嵌入式Linux利用busybox制作根文件系统

嵌入式Linux利用busybox制作根文件系统

作者头像
知否知否应是绿肥红瘦
发布2025-02-19 21:22:19
发布2025-02-19 21:22:19
1.5K0
举报
文章被收录于专栏:Linux知识Linux知识
本文介绍如何利用busybox制作一个最小根文件系统,系统包含ls、cd、ifconfig等基本指令,文件系统采用动态加载的方式。

1.去busybox官网下载源码
  • 官网地址:busybox官网
  • 下载busybox-1.29.0版本。
2.将源码拷贝至Linux主机并解压

将busybox源码拷贝到linux主机并解压,同时新建一个rootfs文件夹,用于保存待会制作好的根文件系统。

3.配置makefile

进入busybox源码主目录,首先配置makefile文件:

  • cd busybox-1.29.0
  • vim makefile

makefile需要改的就是指定处理器架构和交叉编译器。

4.配置busybox
  • make menuconfig

首先是setting

接下来是Linux Module Utilities配置

接下来是 Linux System Utilities配置

write support 下面的6个子选项需要全部勾上。

最后是shell配置:bash shell和sh 最终都解释为ash运行

以上配置完成以后,保存退出。

5.编译busybox
  • make

在源码根目录下执行make编译:

出现了错误,提示setns和syncfs未定义,出现这两个错误的原因就不分析了,由于这两个文件对于根文件系统的影响微乎其微,所以我们在menuconfig里把这两个地方屏蔽掉就可以了。

然后保存退出,继续编译。

6.安装文件系统
  • make install CONFIG_PREFIX=/test/rootfs/

CONFIG_PREFIX是指定文件系统安装位置,这里指向我们刚刚新建的rootfs文件夹

安装完成,我们去rootfs文件夹看下:

多了这4个文件(夹),至此busybox的任务就完成了。但是这个根文件系统是不完整的,还缺少很多东西,所以接下来我们就需要完善这个根文件系统。

7.构建lib目录

由于我们在menuconfig里选择的是动态库,所以我们需要构建需要的动态库文件(.so文件)。

这些动态库文件在交叉编译器的目录下可以找到,我们直接把整个lib复制过来。

  • mkdir lib
  • cp /ZLG_linux/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi/multi-libs/lib/* /test/rootfs/lib/ -a

注意复制的时候要选择-a,因为lib下有很多链接文件,我们需要将链接文件和链接文件的源文件都复制过来。

由于我的lib库里自带了很多静态库文件,这些静态库文件是不需要的而且占用很大空间,所以需要将它们删除:

  • rm -f *.a

我们可以看下lib文件的大小:

有7.6M,这个lib文件还是比较大的,因为里面有很多用不到的库,我们也一并复制过来了,但是影响不大。

注意:也可以在lib下使用arm-fsl-linux-gnueabi-strip *去掉lib里面库文件的符号文件 对库文件进行瘦身(去除符号表和调试信息)

至此,lib文件就构建完成了。

8.构建etc目录

我们可以把/busybox-1.29.0/examples/bootfloppy下的etc目录直接拷贝过来。

在配置etc目录之前首先简单讲下文件系统的启动顺序:

  1. Linux内核启动过程中,运行的第一个程序是init程序,通常是根目录下的linuxrc,而这是一个指向/bin/busybox 的链接,也就是说,系统起来后运行的第一个程序就是busybox本身。
  2. linuxrc 会解析/etc/inittab内容,运行相关子进程,首先会运行etc/inittab配置文件里面/etc/init.d/rcS这个脚本!
  3. rcS脚本中会运行mount -a命令,这条命令会读取/etc/fstab 内容进行挂载各个文件系统,然后执行创建/dev文件的脚本。
  4. 系统起来后,登陆用户后会运行/etc/profile,进行相关环境变量的配置;

刚刚拷贝过来的etc文件夹已经包含了上述的几个必要文件,但是还需要做一些修改:

inittab:配置文件,里面包含需要执行的脚本,第一个需要执行的脚本就是/etc/init.d/rcS

代码语言:javascript
复制
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

rcS:脚本程序

首先设置网卡MAC地址和IP地址(也可以放到profile里面),mount -a命令会挂载各个虚拟文件系统,mdev是udev的嵌入式简化版本,udev/mdev是用来配合linux驱动工作的一个应用层的软件,udev/mdev的工作就是配合linux驱动生成相应的/dev目录下的设备文件,echo /sbin/mdev > /proc/sys/kernel/hotplug为设置内核热插拔,当有设备的热插拔时调用/sbin/mdev。最后一条命令指定了一个主机名配置文件(这个文件一般文件名叫hostname或者HOSTNAME).

代码语言:javascript
复制
#! /bin/sh
ifconfig eth0 hw ether 02:00:92:B3:C4:08 
ifconfig eth0 192.168.0.100 
/bin/mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
/bin/hostname -F /etc/sysconfig/HOSTNAME

fstab:配置文件,在Linux开机以后自动配置哪些需要自动挂载的分区,mount -a指令会读取本文件的内容,然后挂载虚拟文件系统。格式如下:

file system

mount point

type

options

dump

pass

要挂载的特殊的设备

挂载点

文件系统类型,比如 ext2、ext3、proc、romfs、tmpfs 等等。

挂载选项,一般为default

为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0

磁盘检查设置,为 0 表示不检查

代码语言:javascript
复制
#
# /etc/fstab: static file system information.
#
# file system   mount       type    options           dump    pass
#/dev/root       /           ext2    rw,noauto         0       1
proc            /proc       proc    defaults          0       0
devpts          /dev/pts    devpts  gid=5,mode=620    0       0
sysfs           /sys        sysfs   defaults          0       0
usbfs        /proc/bus/usb  usbfs   defaults          0       0

/dev/fd0        /mnt/floppy auto    noauto,owner      0       0
/dev/cdrom      /mnt/cdrom  iso9660 noauto,owner,ro   0       0

profile:PS1是主提示符变量,也是默认提示符变量。默认值[\u@\h \W]\$,显示用户主机名称工作目录。

代码语言:javascript
复制
# /etc/profile: system-wide .profile file for the Bourne shells

export PS1='[\u@\h \W]\# '

接着在etc下创建目录sysconfig, 然后再sysconfig目录下创建HOSTNAME文件,往这个文件中写入你想要设置的主机名。

这里暂设主机名为busybox。

实际上,到这里根文件系统的主要目录和文件已经构建完成,这时候的根文件系统已经可以运行!

9.构建其他目录

为了方便使用,我们再创建几个其他常用目录

  • mkdir mnt tmp dev proc sys root

一个最小版根文件系统制作完成!下面就可以利用NFS或者写入FLASH测试这个文件系统了。

10.添加root用户

最后,给中这个文件系统添加一个root用户,无密码。

在/etc添加passwd文件,内容如下:

代码语言:javascript
复制
root::0:0:root:/root:/bin/sh
11.测试

我是直接将文件系统烧到板子的NAND FLASH里面去测试的。

可以看到,文件系统已经成功启动!接下来,写个hello world 看下动态库加载是否正常。

程序成功运行,动态库加载也没有什么问题!

参考博客:

1.利用busybox制作根文件系统

2.busybox构建根文件系统

3.最新busybox-1.28.1制作根文件系统

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文介绍如何利用busybox制作一个最小根文件系统,系统包含ls、cd、ifconfig等基本指令,文件系统采用动态加载的方式。
  • 1.去busybox官网下载源码
  • 2.将源码拷贝至Linux主机并解压
  • 3.配置makefile
  • 4.配置busybox
  • 5.编译busybox
  • 6.安装文件系统
  • 7.构建lib目录
  • 8.构建etc目录
  • 9.构建其他目录
  • 10.添加root用户
  • 11.测试
  • 参考博客:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档