英文原版地址
Chapter 6. Root Filesystem Content
Linux内核在系统启动过程中最后的操作是加载根文件系统。所有的Unix系统从一开始,根文件系统是一个重要组成部分。根文件系统目前的组织是一个位千变万化的,载有一些冗余,因为它如何增长,并随着时间的推移被Unix的发展影响。我不会试图掩盖的原因,目前的结构和基本公约。相反,我将解释如何组织的各个组成部分遵守公认的标准,从而获得功能根文件系统。在这个过程中,我们将使用许多组成部分,我们建立较早,如内核模块和C库。
首先,我们将讨论基本的根文件系统的结构。然后,我们将讨论如何以及在何处安装系统库,内核模块,内核镜像,设备节点,主系统应用,以及定制的应用。最后,我们将讨论如何配置系统初始化脚本。在结束这一章,您将有一个功能齐全的根文件系统为您的目标。在接下来的章节,我们将讨论如何可以在本根文件系统的一个实际的文件类型的存储设备,用于您的目标。
6.1 Basic Root Filesystem Structure
根文件系统中的顶层目录都有特定的用途和目的。许多这些都是有意义的只有在多用户系统,系统管理员负责许多服务器和/或工作站使用不同的用户。在大多数的嵌入式Linux系统,没有用户,没有管理员,建立一个根文件系统的规则,可以被松散的解释。这并不意味着所有的规则可以侵犯,但它确实意味着打破一些规则将有很少或几乎没有影响系统的正常运行。有趣的是,即使是主流的用于工作站和服务器的商业发布版没有始终坚持为根文件系统建立规则。
建立一个根文件系统“官方”规则被包含在Filesystem Hierarchy Standard ( FHS ),在第1章介绍了。该文件是不超过30页,比较容易阅读。如果您正在寻找答案或根文件系统说明,该FHS可能是最好的开端。表6-1提供了完整的根文件系统的顶层目录,正如FHS所指明的 。
Directory | Content |
bin | Essential user command binaries |
boot | Static files used by the bootloader |
dev | Devices and other special files |
etc | System configuration files, including startup files |
home | User home directories, including entries for services such as FTP |
lib | Essential libraries, such as the C library, and kernel modules |
mnt | Mount point for temporarily mounted filesystems |
opt | Add-on software packages |
proc | Virtual filsystem for kernel and process information |
root | Root user's home directory |
sbin | Essential system administration binaries |
tmp | Temporary files |
usr | Secondary hierarchy containing most applications and useful to most users, including the X server |
var | Variable data stored by daemons and utilities |
如果您是使用Linux系统为您的日常工作,您已经熟悉这些目录。然而,让我们仔细看看一个在嵌入式Linux系统使用的典型的根文件系统的内容。
首先,从属于提供多用户一个可扩展的环境的所有目录,如 /home, /mnt, /opt 和 /root, 可省略。我们可以削减根文件系统,甚至进一步移除/ tmp目录和/ var ,但这些删除部分可能危害的某些程序。我不鼓励这样的尽量少的办法。
注:这种讨论并不围绕大小问题,而是功能。事实上,省略目录条目对根文件系统的改变很小。
我之所以说/home可省略的原因,例如,即使是目前在嵌入式Linux系统,它将是空的,因为它的内容,按FHS所描述的,只有在工作站和服务器的设置中有用。
根据你的bootloader及bootloader的配置,您可能不会需要有一个/boot目录。这取决于在你的内核被启动之前,你的bootloder能够从你的根文件系统中取到内核镜像。阅读第9章后,您将可以决定是否要使用/boot目录和如何使用它。当然,您也可以在以后的任何时间如果需要的话,重新设计根文件系统。
剩下的目录,/bin, /dev, /etc, /lib, /proc, /sbin, and /usr, 是必不可少的。
在极端的情况下,你可以忽略/proc ,这只在mount具有相同名称的虚拟文件系统时有用。然而,如果你需要在这个区域分析它,将很难明白在你的目标上正在发生什么。
两个根目录, /usr和/var,有一个自己的预先定义的等级,就像是根目录。我们将简要地讨论这些等级,因为我们两个目录中填入下面的步骤。
在根文件系统中,其中一个最困惑的方面就是,一些目录的目的有明显的相似性。特别是,新手经常会问各种目录包含二进制文件和各种目录包含库文件,它们有什么区别的。
在根文件系统中,对于二进制文件, 有四个主要的目录:/bin, /sbin, /usr/bin 很 /usr/sbin. 二进制文件如何放,很大程度上取决于它在系统中的角色。对用户和系统管理员比不可少的二进制文件放在/bin.对系统管理员必不可少,但不被普通用户使用的放在/sbin。与此相反,不重要的用户二进制文件放在/usr/bin.不重要的系统管理员工具放在/usr/sbin.
至于库的位置,也是类似的。系统启动需要的库和运行最重要命令需要的库位于/lib,而/usr/lib中包含的所有库。通常,包将在/ usr/lib创建子目录,包含自己的库。 Perl的5.x的软件包,例如,有一个/ usr/lib/perl5目录包含所有的Perl相关的库和模块。
看看您的Linux工作站的根文件系统,在这些目录中,会显示实际的例子,你的发布版设计者设计的这些标准的应用。
为根文件系统工作,我们进入为此目的创建的目录:
$ cd ${PRJROOT}/rootfs
我们现在建立我们的系统需要的核心根文件系统目录:
$ mkdir bin dev etc lib proc sbin tmp usr var
$ chmod 1777 tmp创建/boot.如有必要,以后回来创建它。
注意,我们没有。我们会回来以后,创造它,如有必要。另外,我们改变/tmp目录的权限,把"sticky bit"打开了。在目录权限领域中的这一位(sticky bit)将确保在/tmp目录创建的文件,只由创建它们的用户可以删除。尽管大多数的嵌入式Linux系统是单用户系统,但在某些情况下的嵌入式应用程序不能root权限运行,因此对于根文件系统的权限,必须遵循一些基本规则。举例来说,我们第10章讨论的OpenSSH软件包,就是这样的应用程序。
我们可以着手建立/usr层次:
$ mkdir usr/bin usr/lib usr/sbin
在一个功能齐全的根文件系统, /usr目录通常包含有更多的项目。一个简单的演示,在你的工作站上输入 "ls -al /usr"。
你会找到,例如 man, src 和 local这些目录。该FHS中有一节对这个目录中布局,有详细说明。为了最嵌入式Linux系统,但是,我们建立了三个目录就够了。
最后建立/var目录:
$ mkdir var/lib var/lock var/log var/run var/tmp
$ chmod 1777 var/tmp
这里同样的,这个目录通常包含更多的目录。如 cache, mail 和 spool 对于工作站和server都是有用的,但是很少嵌入式系统需要这些目录。我们创建的都是嵌入式linux系统中大多数应用程序正常运行时最低限度需要的目录。当然,如果你需要例如web page或打印功能,你可以添加应用程序需要的目录。看FHS和您的应用程序提供的文档,找你的实际需求。
根文件系统骨架现已准备就绪,让我们把各种软件组件放在适当的位置。
正如我在前面的讨论中,在FHS可以发现建立一个根文件系统的规则 。虽然大多数的Linux应用和发布版依靠这些规则,Linux内核本身不强制如此。事实上,内核源代码对根文件系统的结构做极少数假设。它遵循这一点,你可以建立一个有非常不同的根文件系统结构的嵌入式Linux系统。你就必须修改缺省的大多数软件包,使其符合您的新结构。有些人采取了更为极端的做法,建设嵌入式Linux系统没有任何根文件系统。不用说,我不鼓励你去这条道路。我以上概述的根文件系统的规则,被所有开源和自由软件开发认识和承认。使用其他规则建立您的嵌入式Linux系统,你将从大多开源与自由软件及其开发者被切断。
阅读(850) | 评论(0) | 转发(0) |