沥青路面有什么污染:6.1 根文件系统

来源:百度文库 编辑:偶看新闻 时间:2024/05/06 07:20:12
《嵌入式Linux基础教程》第6章系统初始化,在本章我们将仔细研究内核初始化之后的系统初始化内容。本节为大家介绍FHS。
第6章 系统初始化

本章内容

根文件系统

内核的最后引导过程

init进程

初始RAM磁盘

使用initramfs

关机

小结

第2章曾经指出,Linux内核本身只是嵌入式Linux系统的一小部分。Linux内核完成初始化之后,必须挂载一个根文件系统,并执行由开发人员定义的一系列初始化例程。在本章中,我们将仔细研究内核初始化之后的系统初始化内容。

我们先来看看根文件系统的内容及其布局,接下来开发和研究一个最小的系统配置。本章后面会在这个最小的系统配置中增加一些功能以实现一个嵌入式系统配置的示例。介绍初始RAM磁盘(或initrd)及其操作和用法之后,就完成了对系统初始化的介绍。最后简要介绍了Linux系统关机(shutdown)操作。

6.1 根文件系统

在第5章中,我们研究了初始化过程中Linux内核的行为,还提供了几种挂载根文件系统的方法。像其他高级操作系统一样,Linux也需要一个根文件系统才能体现其卓越的性能。尽管在没有文件系统的环境下使用Linux不存在问题,不过这么做不切实际,因为这样一来就无法充分利用Linux最重要的特性和价值,这就如同要将用户的整个系统应用塞进一个巨大的设备驱动程序或内核线程里。

根文件系统是指作为文件系统层次结构之基部而挂载的文件系统,简言之即"/"。正如第9章将介绍的,即使是一个很小的嵌入式系统也会在文件系统层次结构的不同位置挂载多个文件系统,例如第9章介绍的proc文件系统。proc文件系统是挂载到根文件系统下/proc位置的一个专用文件系统。实际上,根文件系统不过是挂载到文件系统层次结构基部的第一个文件系统。

稍候你会看到,Linux系统对根文件系统有一些特殊的要求,期望根文件系统包含若干程序和实用工具,用于引导系统、初始化网络和系统控制台等服务、加载设备驱动和挂载另外的文件系统。

6.1.1 FHS

一些内核开发人员制定了一个标准,用来规定UNIX文件系统的组织和布局。FHS(File System Hierarchy Standard,文件系统层次结构标准)为实现Linux各个发行版和应用程序之间的兼容性建立了最低基线,本章结尾的"参考资源"中给出了关于FHS的参考资料。如果你想深入了解UNIX文件系统组织的布局和基本原理,建议阅读FHS标准。

许多Linux发行版的文件系统布局方式与FHS标准严格匹配。FHS标准在不同的UNIX或Linux发行版之间提供了一个通用的基本要素,FHS标准允许用户的应用软件(和开发人员)预先获知某些特定系统元素(包括文件和目录)在文件系统上的具体位置。
6.1.2 文件系统布局

出于空间的考虑,许多嵌入式系统开发人员会在一个可引导设备(例如Flash)上创建一个非常小的根文件系统,然后从另一个设备上挂载一个更大的文件系统,这里的设备可能是硬盘也可能是网络中的一个NFS服务器。事实上,在一个最初较小的根文件系统上挂载一个较大的根文件系统并不少见,在本章后面研究初始RAM磁盘的相关内容时,你会看到这样一个例子。

一个简单的Linux根文件系统可能包含如下顶层目录项:

  1. .  
  2. |  
  3. |--bin  
  4. |--dev  
  5. |--etc  
  6. |--lib  
  7. |--sbin  
  8. |--usr  
  9. |--var  
  10. |--tmp  

表6-1描述了上述各根目录项里最常见的内容。

表6-1 根文件系统顶层目录

目录

内容

bin

可执行二进制文件,系统下的所有用户都可用

dev

设备节点(参见第8章)

etc

本地系统配置文件

lib

系统库所在目录,如C标准库及其他大量库

(续)

目录

内容

sbin

二进制可执行文件,通常仅限系统超级用户使用

usr

应用程序的辅助文件系统层次结构,通常为只读

var

包含多变的文件,如系统日志和临时配置文件

tmp

临时文件


通过斜杠(/)字符可以引用Linux文件系统层次结构的最顶层。例如,要列出根目录的内容,可以键入如下命令:

  1. $ ls / 

输出结果类似如下:

  1. root@coyote:/# ls /  
  2. bin dev etc home lib mnt opt proc root sbin tmp usr var  
  3. root@coyote:/# 
这个目录列表包含了用于其他用途的目录项,包括/mnt和/proc。注意,我们通过在前面加"/"引用这些目录项,表示这些顶层目录的路径是从根目录开始的。

6.1.3 最小文件系统

为了具体地说明一个根文件系统所必需的内容,我们创建了一个最小根文件系统。这个例子是在一块使用XScale处理器的ADI Coyote评估板上实现的,代码清单6-1为使用tree命令显示这个最小根文件系统的内容。

代码清单6-1 最小根文件系统的内容

  1. .  
  2. |-- bin  
  3. |   |-- busybox  
  4. |   '-- sh -> busybox  
  5. |-- dev  
  6. |   '-- console  
  7. |-- etc  
  8. |   '-- init.d  
  9. |       '-- rcS  
  10. '-- lib  
  11.     |-- ld-2.3.2.so  
  12.     |-- ld-linux.so.2 -> ld-2.3.2.so  
  13.     |-- libc-2.3.2.so  
  14.     '-- libc.so.6 -> libc-2.3.2.so  
  15.  
  16. 5 directories, 8 files 

该根文件系统配置使用了busybox,busybox是一个非常流行而且名符其实的嵌入式系统工具包。简言之,busybox是一个独立的二进制可执行文件,提供对大量常用Linux命令行实用工具的支持。busybox和嵌入式系统的关系非常紧密,本书专门抽出一章(第11章)详细介绍这个灵活便捷的实用工具。

注意,代码清单6-1中的这个最小根文件系统例子只有5个目录,共8个文件。这个极小的根文件系统可以实现系统引导,并通过串行控制台为用户提供一个功能完整的命令行提示,用户可以使用busybox 中启用的任意命令。

从/bin目录开始看,在其下面已经有了可执行的busybox文件和指向busybox的软链接(soft link)sh,你一会儿就会明白这样做的必要性。/dev目录下的文件是打开一个控制台进行输入/输出所需要的设备节点(device node) 。/etc/init.d目录下的rcS文件是由busybox启动时处理的默认的初始化脚本文件,尽管该文件并不是必需的。使用rcS文件之后就不会出现busybox发出的警告信息,该警告信息只会在rcS文件缺失的时候才出现。

上述根文件系统必需的最后一个目录项及两个文件是两个库:GLIBC(libc-2.3.2.so)库和Linux动态加载器(ld-2.3.2.so)。GLIBC包括C标准库函数(如printf())以及绝大多数应用程序所依赖的其他大量库函数;Linux动态加载器用于将二进制可执行文件加载到内存中,并且执行应用程序引用所需共享库函数的链接工作。这里包括的两个软链接是指向ld-2.3.2.so的ld-linux.so.2和指向libc-2.3.2.so的libc.so.6,这些链接使这些共享库不受版本影响并且具有向后兼容的特性,在所有Linux系统下都能看到这类链接。

这个简单的根文件系统实现了一个功能完整的系统。以本书所用ARM/XScale为例的开发板进行试验后发现,这个小型根文件系统的大小为1.7 MB,而且有趣的是,该根文件系统超过80%的大小为C库所占用。如果你需要为嵌入式系统进一步缩小C库的大小,可以参考http://libraryopt.sourceforge.net/上的库优化工具(Library Optimizer Tool)。
 6.1.4 根文件系统带来的挑战

根文件系统带给嵌入式系统的挑战很容易解释,但它所带来的问题却并不容易解决。除非用户足够幸运,拥有相当大的硬盘或闪存设备来开发嵌入式系统,否则就会发现,很难将所有用户应用程序和工具放进一个单独的闪存介质。尽管闪存介质的成本在不断下降,但是需要缩减产品成本并加速产品上市时间的竞争压力始终存在。作为嵌入式操作系统,Linux日益流行的一个最大原因,在于Linux具有数量巨大且仍在不断增加的应用软件。

对根文件系统进行裁减以便塞进一个给定大小的存储空间可能非常棘手。许多软件包和子系统包含了几十甚至几百个文件。除了应用程序之外,许多软件包还包括配置文件、库、配置工具、图标文件、文档文件、国际化相关的区域文件、数据库文件,等等,不一而足。由Apache软件基金会主导开发的Apache网络服务器是嵌入式系统下应用广泛的程序之一。某个非常流行的嵌入式系统下的Apache基本软件包包含了254个不同的文件,此外,这些文件并不是简单地复制到用户文件系统下某个目录中,要想不经修改就能运行Apache应用程序,就需要将它们安置到文件系统下几个不同的地方。

这些是发行工程(distribution engineering)的一些基础概念,它们可能非常单调乏味。Linux发行商,如Red Hat(在桌面版和企业版市场)和Monta Vista Software(在嵌入式市场),在以下方面投入了大量工程资源:将大量的程序、库、工具和应用程序打包在一起,组合成一个Linux发行版。构建一个根文件系统必然会使用较小规模的版本发行工程要素。 6.1.5 试错法 直到现在,移植用户根文件系统的唯一方法仍然是采用试错法(Trial-and-Error Method)。或许这一过程可以通过创建一系列与此相关的脚本来自动实现,但是某个给定功能需要哪些文件,仍要取决于开发人员所掌握的知识。诸如Red Hat软件包管理器(Red Hat Package Manager,rpm)之类的工具可以用来在用户的根文件系统中安装软件包。rpm在给定的软件包内具有合理的依赖性,但是它比较复杂而且难于学习。此外,采用rpm无法轻易创建小型根文件系统,因为它本身并不能够在安装过程中剔除给定软件包里诸如描述文档和用不到的程序等不必要的文件。 6.1.6 自动化文件系统构建工具居于领先地位的嵌入式Linux发行版,为实现在闪存或其他存储介质中自动构建根文件系统,推出了功能强大的工具,这些工具通常都带有良好的操作界面,使得开发人员可以轻松地选择应用程序或功能所需的文件。它们具有从一个软件包剔除无用文件(如文档或其他不需要文件)的功能,而且很多这样的工具具有选择单个文件的功能。这些工具也可以为用户在所选择设备上进行的后续安装提供不同形式的文件系统。想要了解这些功能强大的工具,用户可以与所熟悉的嵌入式Linux发行版开发商联系。