迅为3568开发板文件系统构建之简介
1.1 根文件系统简介
在移植Linux系统的时候,我们需要先移植一个bootloader代码,
bootLoader用于启动Linux 内核,然后移植 Linux Kernel,移植完 Linux Kernel 之后,还需要再移植根文件系统,根文件 系统里面包含了最常用的命令和文件。所以 uboot,内核,文件系统三者一起构成了一个完整 的,功能完善的,可以正常使用的 Linux 系统。
在系统正常启动过程中,Bootloader 首先运行,然后将内核复制到内存中(或者在固态存储设备上直接运行,但是效率较低),并在内存某个固定的地址(包括地址与参数的结构) 设置好要传递给内核的参数,最后运行内核。内核启动后,挂载(mount)根文件系统(Root filesystem),启动文件系统中的应用程序。如下图所示:
通过以上的学习,我们认识到文件系统是 linux “三巨头”之一,构建文件系统是 Linux 移植的最后一步。
那么什么是根文件系统呢?那么文件系统又是什么呢?
首先我们要明白什么是文件系统,文件系统是对一个存储设备上的数据或元数据进行组织的机制。这种机制有利于用户和操作系统的交互。Oracle 的一篇技术文章有这样一句话“尽管内核是 Linux 的核心,但是文件确是用户和操作系统交互采用的主要工具。这对 Linux 来说尤其如此,这是因为在 UNIX 传统中,它使用文件 I/O 机制管理硬件设备和数据文件” 这句话我是这样理解的,在 Linux 没有文件系统的话,用户和操作系统的交互也就断开了,例如我们使用最多的交互 shell,包括其它的一些用户程序,都没有办法运行。在这里可以看到文件系统相对于 Linux 操作系统的重要性。
当我们在 windows 下,提到文件系统,是不是马上想到 windows 下的 fat32,NTFS 等的文件系统的类型。但是在 Linux 中,你可能会想到 ext2 ext3,但是你还必须要有一个根文件系统的概念。根文件系统首先是一种文件系统,根文件系统不仅具有普通文件系统的存储数据文件的功能,但是对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如 rcS,inittab)和服务加载到内存中去运行。
我们要明白文件系统和内核是完全独立的两个部分。在开发板中移植的内核下载到开发板上,是没有办法真正的启动 Linux 操作系统的,会出现无法加载文件系统的错误。那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0 挂载,而后执行/linuxrc 等其执行完后。切换根目录,再挂载具体的根文件系统。根文件系统执行完之后,也就是到了Start_kernel()函数的最后,执行 init 的进程,也就第一个用户进程。对系统进行各种初始化的操作。如果要弄明白这里的过程的话,可要好好的看看 Linux 内核源码了。
根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话, 那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他 文件系统得以挂载(mount)所必要的文件。根文件系统包括 Linux 启动时所必须的目录和关 键性的文件,例如 Linux 启动时都需要有 init 目录下的相关文件,在 Linux 挂载分区时 Linux 一定会找/etc/fstab 这个挂载文件等,根文件系统中还包括了许多的应用程序 bin 目录等,任何
包括这些 Linux 系统启动所必须的文件都可以成为根文件系统。
Linux 启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系 统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个 系统中可以同时存在不同的文件系统。
在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂载时,要提供 文件系统类型、文件系统和一个挂装点。根文件系统被挂载到根目录下“/”上后,在根目录下 就有根文件系统的各个目录,文件:
/bin /sbin /mnt 等,再将其他分区挂载到/mnt 目录上,/mnt
目录下就有这个分区的各个目录,文件。
1.2 根文件系统目录简介
Linux 根文件系统中一般有如下的几个目录。
**1 /bin **目录
**2 /sbin **目录
**3 /dev **目录
**4 /etc **目录
**5 /lib **目录
**6 /home **目录
**7 /root **目录
**8 /usr **目录
**9 /var **目录
10 /proc 目录
**11 /mnt **目录
**12 /tmp **目录
1.3 常见的根文件系统
根文件系统本质都是一些文件和配置信息组成,之间的界限没有很明确的界定。最简单的 根文件系统是使用 busybox 工具制作的文件系统。除此之外,还有使用 buildroot 工具和 yocto 工具构建的文件系统。还有发行版 Linux 系统——Ubuntu 系统,Debian 系统。以下大致列出 一些根文件系统的特点,如下图所示:
迅为提供的 Linux 源码支持 buildroot,Debian,ubuntu,
yocto 等系统,他们共用 BootLoader 和 kernel,只是文件系统不同。以下依次介绍不同的文件系统。
Buildroot
Linux 源码中的 buildroot 版本是 Buildroot-2018.02 的版本的软件开发包,其包含了基于 Linux 系统开发用到的各种系统源码,驱动,工具,应用软件包。Buildroot 是 Linux 平台上一个 开源的嵌入式 Linux 系统自动构建框架。整个 Buildroot 是由 Makefile 脚本和 Kconfig 配 置文件构成的。你可以通过 Buildroot 配置,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件。这里我们只是使用 buildroot 编译文件系统。
Yocto
Yocto 和 Buildroot 一样, 是一套构建嵌入式系统的工具,但是两者的风格完全不同。
Yocto project 是通过一个个单独的包(meta)来维护,比如有的包负责核心,有的包负责外围。有的包用于跑 Rockchip 的芯片,有的包用于安装上 Qt。
Ubuntu:
Ubuntu 是一个流行的 Linux 发行版,是基于 Debian 的 unstable 版本加强而来,以“最好的 Linux 桌面系统”而闻名,近些年 Ubuntu 也推出了 Ubuntu Enterprise Linux, 在企业 Linux 应用市场 占有率也有较大提高。
优点:技术支持较好,用户界面友好,硬件的兼容性好,采用基于 Deb 的 ATP 包管理系统。
Debian:
Debian GNU / Linux 是一款是由 GPL 和其他自由软件许可协议授权的自由软件组成的 Linux 操作系统,由 Debian Project 组织维护。以其坚守 Unix 和自由软件的精神,以及其给予用户的众多选择而闻名。
1.4 构建 Linux 文件系统
所谓制作构建根文件系统,就是创建各种目录,并且在里面创建文件。我们可以用 buildroot yocto busybox等工具来构建文件系统,也可以用Linux系统发行版比如ubuntu Debian openwrt。
接下来的章节我们将会讲解各种根文件系统的构建方法。