本文记录了根文件系统的一些知识点,Busybox 工具的使用和 最小根文件系统的制作。
根文件系统是特殊用途的文件系统,必须属于某种文件系统格式。那么文件系统是用来干嘛的?
-
首先,存储设备(块设备,像硬盘、 flash 等) 是分块(扇区)的,物理上底层去访问存储设备时是按照块号(扇区号)来访问的。这就很麻烦。
-
其次,文件系统是一些代码,是一套软件,这套软件的功能就是对存储设备的扇区进行管理,将这些扇区的访问变成了对目录和文件名的访问。我们在上层按照特定的目录和文件名去访问一个文件时,文件系统会将这个目录 + 文件名转换成对扇区号的访问。
-
最后,不同的文件系统的差异在于对这些扇区的管理策略和方法不同,如坏块管理、 碎片管理。
-
dev 目录下的设备文件。在 linux 中一切皆是文件,硬件设备被虚拟化成一个设备文件。
-
sys 和 proc 目录。可以为空但是必须有,和驱动有关。 属于 linux 中的虚拟文件系统。
-
etc 目录。存放运行时配置文件。 /etc 目录下的所有配置文件会直接或者间接的被 /linuxrc 所调用执行,完成操作系统的运行时配置。 etc 目录是制作 rootfs 的关键。
-
lib 目录下放的是当前操作系统中的动态和静态链接库文件。
-
使用专用工具软件制作的可供烧录的镜像文件
-
镜像中包含了根文件系统中的所有文件
-
烧录此镜像类似于对相应分区格式化。
-
镜像文件系统具有一定的格式,格式是内化的,跟文件名后缀是无关的。
-
根文件系统其实就是一个包含特定内容的文件夹而已
-
根文件系统可由任何一个空文件夹添加必要文件构成而成
-
根文件系统的雏形就是在开发主机中构造的文件夹形成的
-
镜像文件形式的根文件系统主要目的是用来烧录到块设备上,设备上的内核启动后去挂载它。镜像文件形式的根文件系统是由文件夹形式的根文件系统使用专用的镜像制作工具制作而成的。
-
最初在开发主机中随便 mkdir 创建了一个空文件夹,然后向其中添加一些必要的文件(包括etc 目录下的运行时配置文件、/bin 等目录下的可执行程序、 /lib 目录下的库文件等···)后就形成了一个文件夹形式的 rootfs。 然后这个文件夹形式的 rootfs 可以被 kernel 通过 nfs 方式来远程挂载使用,但是不能用来烧录块设备。我们为了将这个 rootfs 烧录到块设备中,于是用一些专用的软件工具,将其制作成可供烧录的一定格式的根文件系统镜像。
-
文件夹形式的 rootfs 是没有格式的,制作成镜像后就有了一定的 rootfs 格式了, 格式是由我们的镜像制作过程和制作工具来决定的。 每一种格式的镜像制作工具的用法都不同。
-
busybox是一个C语言写出来的项目,里面包含了很多.c文件和.h文件。
-
busybox 这个程序开发出来就是为了在嵌入式环境下构建根文件系统(以下简称 rootfs)使用的,也就是说他就是专门开发的 init 进程应用程序。
-
busybox 为当前系统提供了一整套的 shell 命令程序集。譬如 vi、cd、mkdir、ls 等。在桌面版的 linux 发行版(譬如 ubuntu、redhat等)中 vi、cd、ls 等都是一个一个的单独的应用程序。但是在嵌入式 linux 中,为了省事我们把 vi、cd 等所有常用的 shell 命令集合到一起构成了一个 shell 命令包,起名叫 busybox。
-
Busybox 在编写过程中对文件大小进行了优化,并考虑了系统资源有限(比如内存等)的情况。与一般的 GNU 工具集动辄几 M 的体积相比,动态链接的 Busybox 只有几百 K,即使是采用静态链接也只有1 M 左右。Busybox 按模块设计,可以很容易地加入、去除某些命令,或增减命令的某些选项。
-
linuxrc 是一个可执行的应用程序。 是应用层的,和内核源码一点关系都没有。
-
linuxrc 如果是静态编译连接的那么直接可以运行;如果是动态编译连接的那么我们还必须给他提供必要的库文件才能运行。但是因为我们 linuxrc 这个程序是由内核直接调用执行的, 因此用户没有机会去导出库文件的路径,因此实际上 linuxrc 没法动态连接,一般都是静态连接的。
-
linuxrc 执行时引出用户界面。操作系统启动后在一系列的自检运行配置之后,最终会给用户一个操作界面(cmdline 或 GUI),这个用户操作界面就是由 /linuxrc 带出来的。用户界面等很多事并不是在 /linuxrc 程序中负责的,用户界面有自己专门的应用程序,但是用户界面的应用程序是直接或者间接的被 linuxrc 调用执行的。用户界面程序和其他的应用程序就是进程 2、3、4 ···,这就是我们说的进程 1(init 进程,也就是 /linuxrc)是其他所有应用程序进程的祖宗进程。
-
linuxrc 负责系统启动后的配置。操作系统启动起来后也不能直接用,要配置下。操作系统启动后的应用层的配置(一般叫运行时配置,英文简写 etc),是为了让我们的操作系统用起来更方便,更适合个人的爱好或者实用性。
-
VFS 是借鉴了文件系统的设计理念(通过文件系统将底层难以管理的物理磁盘扇区式访问,转换成目录 + 文件名的方式来访问),将硬件设备的访问也虚拟化成了对目录 + 文件的访问。所以有了 VFS 后我们可以通过设备文件(如/dev/mmcblk0p2) 的方式来访问系统中的硬件设备。
-
VFS 将对硬件设备的访问和对普通文件的访问给接口统一化了(linux 中一切皆是文件)。VFS 成了一个隔离层,隔离了下层的不同文件系统的差异性,对上层应用提供一个统一的接口。
-
VFS 将不同文件系统和下层硬件设备(块设备)驱动之间的细节也给屏蔽了。不同类型的文件系统在本身设计时是 不用考虑各种不同的硬件设备的具体操作差异的,这里有一个类似于 VFS 的设计理念。
-
VFS 机制和 rootfs 挂载与其他文件系统的挂载都是有关联的。内核中有一些 sys proc 这种虚拟文件系统,也是和 VFS 机制有关。 /dev/目录下的设备文件都和 VFS 有关。
|
---|
主要是实现applets框架的文件 |
与压缩有关的命令源文件,例如:bzip2、gzip等 |
自带的一些默认配置文件 |
与控制台相关的一些命令,例如:setconsole |
常用的核心命令,例如:cat、rm等 |
常用的编辑命令,例如:vi、diff等 |
用于查找的命令,例如:find、grep等 |
init进程的实现源文件 |
与网络相关的命令,例如:telnetl、arp等 |
与shell相关的实现,例如:ash、msh等 |
Linux下常用的命令,主要是与文件系统相关的,例如:mkfs_ext2等 |
-
解压 Busybox 源码后,进入 Busybox 目录,打开图像界面配置菜单:
-
进入配置菜单后,进行相关配置。我们可以静态或者动态编译Busybox,选择动态编译,使得Busybox可执行文件更小,选项开关如下:
-
经过上诉步骤之后,这个时候选择配置界面的 Exit 退出,保存刚刚的配置,之后就可以看到在源代码目录下多了一个 .config 文件。.config 配置文件里面的内容记录了我们刚刚选中的功能。如下所示:
每一个都是名值对的形式,名称是一个环境变量,后面的值如果为 Y 代表选中,注释行代表裁减掉的功能。
-
生成的文件将默认安装到目录 _install。
BusyBox 编译成功后,在 目录 _install 下可以看到生成的 文件,我们可以继续添加文件,做成一个最小根文件系统。或是直接操作 Busybox 这个可执行文件,用法如下:
其中 命令 是编译 BusyBox 时选中的命令,用法同 Linux 下的命令,只是加上 ./BusyBox 。比如我们在编译时选中的 flashcp 命令,编译成功后,我们把 BusyBox 放到开发板中,就可以直接使用新加入的 flashcp 命令了,而不用重新编译和烧录根文件系统到开发板中: