现在的位置: 首页 > 综合 > 正文

根文件系统的构建

2013年05月03日 ⁄ 综合 ⁄ 共 3376字 ⁄ 字号 评论关闭

根文件系统的构建

Linux 内核在系统启动期间的最后操作之一就是安装根文件系统。根文件系统一直都是所有 Unix 系统不可或缺的组件。根文件系统目前的结构有点独特,而且包含了一些多余之处,这是因为它与日俱进的成长深受 Unix 发展的影响。

根文件系统的基本结构

根文件系统顶层目录各有其特殊的用法和目的。其中有许多目录只对用户系统有意义,而这些由不同用户使用的服务器或工作站,则是由系统管理员负责维护。在大多数的嵌入式 Linux 系统中,通常不会有所谓的用户和管理者,所以不必严格看待用来建立根文件系统的规则。这并不表示你可以违反所有的规则,只是意味着破坏某些规则对系统的正常操作几乎没有影响。值得注意的是,即使是用于工作站和服务器的主流商业发行套件也不一定会遵守根文件系统的建立规则。

用来建立根文件系统的“正式”规则列在FHS中,在下面的附页中我们提到了。如果在寻求与根文件系统有关的答案或说明,FHS 或许是绝佳的起点。下表提供了根文件系统顶层目录的完整清单以及 FHS 指定的内容。

根文件系统顶层目录:

如果 Linux 是你每天必用的工作平台,应该已经熟悉以上提到的目录了。不过,现在让我们来进一步检查嵌入式 Linux 系统如何使用这些典型的根文件系统内容。

首先,为多用户提供可扩展的所有目录(如 /home/mnt/opt/root)都应该省略。调整根文件系统的时候,我们甚至可以进一步移除 /mnt/ /var ,不过这么做可能会危害到某些软件的运行。因此不建议采用这种过于简化的做法。

根据引导加载程序和它的配置情况,可能不需要 /boot 目录。这取决于引导加载程序是否会在内核被启动之前从根文件系统取回内核映像。在此我们可以不要,日后如果觉得有此需要,还可以重新设计根文件系统。

其余的目录,/bin/dev/etc/lib/proc/sbin/ usr ,都是不可或缺的。

极端情况下我们还可以省略 /proc ,因为它只能用来安装与其同名的虚拟文件系统。然而这么做之后,如果需要实地分析目标板,将会很难了解目标板发生了什么事。如果为了缩减存储空间,可能会将内核设定成不支持 /proc ,但是还是建议尽可能启用此功能。

/usr /var 这两个顶层目录与根目录非常像,有自己的目录结构。在接下来的步骤中,当我们在摆放这两个目录的时候,将会简述它们的目录结构。

令人困惑的相似性

根文件系统最令人困惑的一点就是有些目录看起来具有类似的用途。尤其是,新手常会问、不同目录包含的二进制文件,以及不同目录包含的链接库,有何差异。

在根文件系统上,存放二进制文件的目录主要有四个:/bin/sbin/usr/bin/usr/sbin 。二进制文件要放在其中哪个目录,这与它在系统中所扮演的角色有很大的关系。如果这是用户和系统管理员必备的二进制文件,就会放在 /bin 。如果这是系统管理员必备、但是一般用户根本不会用到的二进制文件,就会放在 /sbin 。相对而言,如果不是用户必备的二进制文件,多半会放在 /usr/bin ;如果不是系统管理员必备的工具,多半会放在 /usr/bin

至于链接库的摆放位置,也是同样的道理。系统引导以及执行最基本命令需要的链接库摆在 /lib 。所有其他的链接库则会摆在 /usr/lib 。通常,套件安装时,会在 /usr/lib 中产生子目录,以便摆放它自己的链接库。以 Perl 5.x 为例,它会产生 /usr/lib/perl5 目录,里面摆放的都是与 Perl 有关的链接库和模块。

回过头来看看自己使用的 Linux 工作站,可以从它的根文件系统看到,发行套件设计者应用这些标准的实际范例。

为了建立根文件系统,我们可以建立以下目录:

[root@Binnary ~ ] # mkdir rootfs

[root@Binnary ~ ] #cd rootfs

现在我们可以针对系统的需要建立根文件系统的顶层目录:

[root@Binnary rootfs ] #mkdir bin dev etc lib proc sbin tmp usr var

[root@Binnary rootfs ] #chmod 1777 tmp

请注意:我们并未建立 /boot 。如果日后需要再建立也不迟。同时请注意,我们变更了 /tmp 目录的使用权,让它开启 sticky 位,为 /tmp 目录的使用权开启此位,可确保 /tmp 目录底下建立的文件,只有建立它的用户有权删除。嵌入式系统多半是单用户系统,不过有些嵌入式应用一定不能用 root 的特权来执行,因此需要遵照根文件系统权限位的一些基本规定。如 OpenSSH 套件便属于此类应用。

接着我们可以建立 /usr 的目录结构:

[root@Binnary rootfs ] # mkdir usr/bin usr/lib usr/sbin

在一个全功能的根文件系统上,/usr 目录通常会包含更多条目。你只要在自己的工作站上键入 ls –al /usr 这个命令就能够展示这样的简单范例。你将会发现如 man src local 等这样的目录。FHS 中有一节专门探讨此目录的布局。然而,以大多数嵌入式 Linux 系统的用途来说,上面所建立的这三个目录已经够用了。

最后我们可以建立 /var 的目录结构:

[root@Binnary rootfs ] # mkdir var/lib var/lock var/log var/run var/tmp

[root@Binnary rootfs ] #chmod 1777 var/tmp

同样地,此目录通常会包含更多的条目。尽管 cache mail spool 等目录对工作站或服务器来说很有用,但是嵌入式系统多半不需要这些目录。我们建立的目录必须符合“能够让嵌入式 Linux 系统上可以找到的大多数应用程序正常运行”这个最起码的要求。当然,如果需要 Web 服务或打印功能,那么你或许会想要加入额外的目录,以符合应用程序提供功能的需要。FHS 和应用程序提供的文档可以找到实际需求。

装备好根文件系统的骨架之后,让我们将各软件组安装到正确的位置上去。

以不同的根文件系统结构来执行 Linux

正如前所说,可以在 FHS 中找到建立根文件系统的规则。尽管大多数的 Linux 应用和发行套件都会遵照这些规则,但是 Linux 内核本身并未强制实施这些规则。事实上,内核源码与根文件系统结构的几乎没有什么关联。它让你可以使用截然不同的根文件系统结构来建立嵌入式 Linux 系统。然后你必须修改大多数软件套件的默认值,以便与新的结构相符。有些人甚至采取更极端的做法,建立完全没有根文件系统的嵌入式 Linux 系统。我会建立你别这么做。以上描述的根文件系统的规则,是开放源码和自由软件所有开发者一致奉告的原则。如果使用其他规则来建立嵌入式 Linux 系统,无疑将自己排斥在大多数的开放源码和自由软件套件有以及它们的开发者之外。

设备文件

依照 Unix 的传统,在 Linux 系统中任何对象都可以视为文件。在 Linux 根文件系统中,所有的设备文件(也称为设备节点)都放在 /dev 目录里。对各种可能的系统变体来说,大多数的工作站和服务器发行套件为 /dev 目录附带了内容,这个数目超过了 2000 套。因为嵌入式 Linux 系统是个定制的的系统,所以目标板的 /dev 目录里并不需要像 Linux 工作站和服务器那样填入那么多条目。事实上,只需建立让系统正常操作的必要条目即可。

如果手上没有可供参考的信息,很判断自己需要哪些条目。倘若选择用devfs(设备文件系统)来取代固定的静态设备文件,则可免去寻找设备信息的麻烦。然而,devfs 并没有得到广泛采用,静态的设备仍是标准。

先前我们也说过静态设备主要和次要编号的信息。

下表列出了 /dev 目录中需要填入的最基本条目。根据设备情况,或许应该加入若干额外的条目。在某些情况下,可能甚至需要使用下表以外的条目。如在某些系统上第一个串行端口并非ttyS0StrongARM-base 系统的第一个串行端口则是 ttySAC0(主要编号:204,次要编号:5)。

表:基本的 /dev 条目

文件名

说明

类型

主编号

次编号

权限位

mem

物理内存

字符

1

1

660

null

黑洞

字符

1

3

666

zero

null byte(零值字节)为数据来源

字符

1

5

666

random

真随机产生器

字符

1

8

644

tty0

现行的虚拟控制台

字符

4

0

600

tty1

第一个虚拟控制台

字符

4

1

600

ttyS0

第一个UART串行端口

字符

4

抱歉!评论已关闭.