第三章 目录树概述

“两天之后,Pooh出现了,交叉着双腿做着,摇摆着双腿,在那里,在他身旁,是四罐蜂蜜。。。”(A.A.\ Milne

本章描述了基于FSSTND文件系统标准的标准Linux目录树的重要部分。略述了针对不同的目的将目录树分割成独立的(分离的)文件系统的常用方法并且给出了详细分割的动机。对分割的其它方法也进行了讨论。

背景

这一章松散地基于Linux文件系统标准,FSSTND,版本1.2(见参考书目),它试图对如何在Linux系统中组织目录树设置一个标准。这样一个标准是有好处的,这将更容易地为Linux写出或移植软件,并且管理Linux机器,因为每件事都在它通常的地方。在这标准之后并没有权威来迫使每个人去遵守它,但是它以得到了绝大多数Linux发行的支持,如果不是所有的话。没有充分的理由而不遵守FSSTND并不是一个好主意。FSSTND试图遵守UNIX传统以及当前的趋势,使得Linux系统对于有着其它UNIX系统经验的人也是熟悉的,反之也然。

本章并没有FSSTND来的更详细。一个系统管理员也应该通读FSSTND以期有完整的理解。

本章并没有详细解释所有的文件。目的不是描述每一个文件,而是从文件系统的观点给出一个系统概述。对于每个文件的更多的信息参见本手册的别的章节或manual pages

整个目录树是可以分割成更小的部分,每一部分可放在它自己的磁盘上或分区内,以利于适合磁盘大小的限制以及利于备份和其它一些系统管理。主要的目录部分有root/usr/var以及/home文件系统(见图3-1)。每个部分有不同的目的。目录树被设计成能够在Linux机器的网络中很好的工作,这些Linux机器可以在一个只读的设备上共享文件系统的某些部分(例如,一个CD-ROM),或在一个NFS的网络上。

 

3-1. 一个Unix目录树的部分。虚线指示出分区的限制。

目录树不同部分的规则的描述如下。

。对于每台机器来说,根(root)文件系统是确定的(它通常是存储于一个本地磁盘上,尽管它可以是一个内存虚拟盘或是个网络驱动器)并且包含有引导系统启动以及将系统引导至一个能够加栽其它文件系统的状态所必需的文件。此时,根(root)文件系统的内容对于单用户状态已经足够。它也将含有用于修复坏系统的工具,以及从备份中恢复丢失的文件的工具。

/usr文件系统包含所有的命令、库文件、manual pages以及正常操作时所需的其他一些非改变文件。/usr中所有的文件都应该是通用的而非特定地用于某台给定的机器。在正常操作中,所有的文件均不能被改变。这使得这些文件能够在网络上共享,这样就能够做到节约磁盘空间而有成本效益(/usr中文件通常要占用几百兆的空间),并且能够更容易地管理(仅仅主 /usr在升级一个应用程序是需要改变,而非各台机器)。甚至如果文件系统是在一个本地磁盘上,它可以以只读方式加载上来,以减少在系统崩溃时文件系统的毁坏的机会。

/var文件系统包含有会改变的文件,如spool目录(用于mailnewsprinters等等)、log文件、格式化的manual pages以及临时文件。传统上,/var内的任何东西都可以从/usr中找到,但那样的话,就不可能将/usr以只读方式加载了。

/home文件系统包含用户的主目录,也即,系统上的所有实际数据。分离home目录到它自己的目录树或文件系统使得备份更容易;而其它部分常不必备份,或者说不常备份(它们很少改变的)。一个大的/home也可以分割成几个文件系统,这需要在/home下加上一个额外的命名层,例如,/home/students以及/home/staff

 

尽管上面将不同部分都称为文件系统,并不需要它们实质上是在分离的文件系统上。它们可以容易地被放置进一单个的文件系统中如果系统是一个小的单用户系统并且用户想使得事情简单化。目录树也可以以不同的方式划分成文件系统,这依赖于磁盘有多大,以及对于各种目的空间是如何分配的。然而,重要的部分是按照标准来命名;尽管我们可以把/var/usr放在同一个分区上,/usr/lib/libc.a/var/log/messages的命名必须可以工作,例如通过移动/var/usr/var,并且作一个从/var/usr/var的符号连接。

Unix系统文件结构以目的的不同来组合(groups)文件,也即,所有的命令都在一个地方,所有的数据文件在另一个地方,所有的文档在第三个地方,以次类推。另一种方法是根据文件所属程序来组合文件,也即,所有Emacs文件都将存于一个目录中,所有TeX存于另一个目录,依次类推。第二种方法所带来的问题是难于共享文件(程序目录常常包含有静态的、共享的、会改变的以及非共享的文件),并且有时甚至难于找到文件(例如,manual pages分散于许多地方,使得manual page程序寻找这些文件变成了维护上的噩梦)。

根(root)文件系统

根文件系统一般应设置的小一些,因为它包含着重要的文件并且小一些的、不常修改的文件系统就有一个更好的机会不被毁坏掉。一个毁坏的根文件系统通常意味着系统将不能启动了,除非使用特殊方法(例如,从软盘启动),所以你不会去冒这个险的。

根目录通常不包含任何其他文件,除了可能会有些系统的标准启动引导用的影像文件,常称为/vmlinuz。所有其它文件都在根文件系统的子目录中:

/bin

在启动引导期间所需的命令,也可以被普通用户使用(大概在启动引导以后)。

/sbin

如同/bin,但该目录中的命令不是给普通用户使用的,尽管他们在需要和允许时可能可以使用。

/etc

该目录中存储了与机器有关的配置文件。

/root

用户root的主目录。

/lib

根文件系统中的程序所需的共享库文件。

/lib/modules

可加载的内核模块,尤其是那些当从灾难中恢复启动引导系统时所需的模块文件(例如,网络以及文件系统驱动程序)。

/dev

设备文件。

/tmp

临时文件。启动后程序运行时应使用/var/tmp,而非/tmp,因为前者可能在有更大的空间的磁盘上。

/boot

用于系统启动引导加载程序。例如,LILO。内核影像文件常常是放置在此的,而不是直接放在根目录下。如果有许多内核影像文件,该目录很容易变得很大,因此此时将其置于一个分离独立的文件系统更好些。另一个理由就是要确保内核影像文件被存于IDE磁盘的1024柱面以内。

/mnt

系统管理员为临时加载的加载点。程序不会自动地加载到/mnt的。/mnt可以再划分成子目录(例如,/mnt/dosa可以是使用MS-DOS文件系统的软驱,/mnt/exta可以是一个ext2文件系统)。

/proc/usr/var/home

其它文件系统的加载点。

/etc目录

/etc目录包含有许多的文件。有些文件将在下面给予讨论。对于其他一些文件,你应该确定它们是属于哪个程序的并且阅读所属程序的manual page。许多网络配置文件也包含于/etc目录中,它们在网络管理员手册中给予了讨论。

/etc/rc /etc/rc.d /etc/rc?.d

在系统启动时或当改变了运行层时所要运行的描述(scripts)文件或者是描述文件的目录。更多信息请参见有关init的章节。

/etc/passwd

用户数据库,所含的域有用户名、实际名称、该用户主目录、加密过的口令以及有关各个用户的其它一些信息。该文件的格式在/man{passwd} manual page中有记载。

/etc/fdprm

软盘参数表。描述了不同软盘的格式样式。由setfdprm程序使用。有关信息请参阅setfdprmmanual page

/etc/fstab

列出了在系统启动时由mount –a命令自动加载的文件系统(在/etc/rc或者同等的启动文件中)。在Linux中,该文件也包含由swapon –a自动使用的的交换区的信息。有关更详细的信息,请参阅第四章中加载与卸载小节以及mountmanual page

/etc/group

/etc/passwd相类似,但描述了组的信息而非用户信息。详细信息请参见groupmanual page

/etc/inittab

init的配置文件。

/etc/issue

getty输出的在login提示之前的信息。通常含有一小段叙述或是欢迎使用系统的消息。内容由系统管理员决定。

/etc/magic

file的配置文件。包含了基于file猜测出的文件类型的各种文件格式的描述。

/etc/motd

当日消息,在成功登录后将自动输出(显示)。其内容由系统管理员决定。常用于给所有用户送信息,比如计划中的关机时间警告消息。

/etc/mtab

当前加载的文件系统的列表。最初是由启动引导描述文件所设置,并由mount命令自动地更新。当需要一个已加载文件系统列表时被使用,例如,在df命令中使用。

/etc/shadow

安装了影子(shadow)口令软件的系统中的影子口令文件。影子口令将加密的口令从/etc/passwd中移入/etc/shadow中;后者只有root用户才能读取。这使得破解口令变的极其困难。

/etc/login.defs

login命令的配置文件。

/etc/printcap

/etc/termcap相类似,但用于打印机。具有不同的语法。

/etc/profile/etc/csh.login/etc/csh.cshrc

BourneC shell在登录或启动时所执行的文件。系统管理员可以使用它为所有用户设置全局设置值。对于各个shell参见各自的manual page

/etc/securetty

确定安全终端,也即,确定能以root登录的终端。典型地,只有虚拟终端被列入,因此从调制解调器或网络侵入系统以获得超级用户的权限几乎是不可能的事(至少是非常困难的)。

/etc/shells

列出可信赖的shellChsh命令允许用户改变他们的登录shellshells中所列出的shell之一。一台机器的提供FTP服务的服务器进程ftpd,将检查用户的shell是否在/etc/shells中被列出。除非用户的shell被列出,否则系统将阻止该用户的登录。

/etc/termcap

终端性能数据库。描述了各种终端可被哪些“escape序列”所控制。取代那些直接输出的只能工作于一种特殊牌子的终端上的逃逸序列(escape sequence)的程序已经写出,该程序在/etc/termcap中查询正确的序列来工作。其结果就是许多程序能够在绝大多数的终端上使用。详细信息参见termcapcurs_termcap以及terminfomanual pages

 

/dev目录

/dev目录包含所有设备的特殊设备文件。设备文件是以特定规则命名的文件;它们在设备列表(见XXX)中进行了描述。设备文件是在系统安装时创建的,以后是由/dev/MAKEDEV描述文件来创建。/dev/MAKEDEV.local是由系统管理员写的描述文件,用以建立仅是本地的设备文件或连接文件(也即,那些不是标准MAKEDEV中的部分,如有些非标准设备驱动程序的设备文件)。

 

/usr文件系统

/ usr文件系统通常很大,因为所有的程序都安装于此。/usr中的所有文件通常来自Linux发行版;本地安装的程序以及其它程序都放在/usr/local下。这使得从发行的一个新版中更新系统成为可能,甚至完全更新至新版而无须再次安装所有的程序。下面列出了/usr中的一些子目录(有些不很重要的子目录这里没有列出,详细信息参见FSSTND)。

/usr/x11R6

X窗口系统,所有文件。为了简化X的开发与安装,X的文件并没有集成到系统的其余部分中去。在/usr/x11R6下有个目录树,与/usr下的相类似。

/usr/X386

/usr/X11R6类似,但是是X11版本5

/usr/bin

几乎所有的用户命令。有些命令在/bin/usr/local/bin之中。

/usr/sbin

系统管理命令,是根文件系统不需要的,例如,绝大多数的服务器程序。

/usr/man/usr/info/usr/doc

随机手册(manual pages,GNU 信息文档以及各种其它的文档资料。

/usr/include

C编程语言的头文件。为了一致性这本应位于/usr/lib之下,但是传统的习惯势力一直支持这样的命名。

/usr/lib

程序和子系统的不变数据文件,包括一些场所配置文件。名字lib来源于library;最初的编程子程序库是存于/usr/lib中。

/usr/local

这个地方用于存放本地安装的软件和其它一些文件。

 

/var文件系统

/var中包含着数据文件,当系统正常运行时,这些数据文件是变化的。对于每个系统来说它是特定的,也即,不能在网络上与其它计算机共享这些数据文件。

/var/catman

用于格式化过的man pages的高速缓冲。Manual pages的原始资料通常是存放在/usr/man/man*中的;有些manual pages是以预格式化的版本形式给出的,存储于/usr/man/chat*中。其它一些manual pages在第一次使用时需要进行格式化处理;格式化过的版本就被存于/var/man目录中,因此下一个人阅读同样的page时就不用等待格式化过程了。(/var/catman的内容如同临时目录一样常常被清理的。)

/var/lib

当系统正常运行时改动过的文件。

/var/local

安装于/usr/local中的程序的可变的数据(也即,由系统管理员安装的程序)。注意,即使是本地安装的程序也应该使用/var的其它目录,例如,/var/lock

/var/lock

上锁文件(锁定的文件)。许多程序遵循一个惯例,在/var/lock目录中建立上锁文件,用以指出它们正在使用一个特殊的设备或文件。其它的程序将会注意到这一点并会避免再使用这个特殊的设备或文件。

/var/log

各种程序的操作记录文件,特别是login/var/log/wtmp,该文件中记录了所有的对系统的登录和退出)以及syslog/var/log/messages,这里存储了内核和系统程序所有的消息)。/var/log中的文件经常会变得很大,需要定期进行清理。

/var/run

含有有关系统信息的文件,这些信息在系统下一次启动之前一直有效。例如,/var/run/utmp中含有当前登录的人的信息。

/var/spool

用于邮件、新闻、打印队列以及其它排队工作的目录。每个不同的spool/var/spool下面都有自己的子目录,例如,用户邮件箱在/var/spool/mail之中。

/var/tmp

大的临时文件或者需要比在/tmp中更长期存在的临时文件。(尽管系统管理员可能不允许很陈旧的文件存在于/var/tmp中。)

 

/proc文件系统

/proc文件系统是一个幻影文件系统,它在磁盘上并不存在。相反地,内核在内存中创建了它。它用于提供有关系统的信息(最初是关于处理器的,因此有了此名称)。一些重要的文件和目录在下面给出了说明。在manual pageproc中有更详细的说明。

/proc/1

是一个有关进程1信息的目录。每一个进程在/proc下面都有一个以其进程号为名称的目录。

/proc/cpuinfo

有关处理器的信息,如它的类型、制造日期、型号以及性能。

/proc/devices

配置进当前运行内核的设备驱动程序的列表。

/proc/dma

显示当前哪个DMA通道正在被使用。

/proc/filesystems

配置进内核的文件系统。

/proc/interrupts

显示哪些中断被使用以及它们使用了多少次。

/proc/ioports

显示此时那些端口正被使用着。

/proc/kcore

是系统物理内存的一个映像。它的大小与你的物理内存完全一样,但实际上并不真正占据那样多的内存;他是在程序访问它时瞬时产生的。(记住:除非你将其复制到别的地方去,否则它在/proc下不占用任何磁盘空间。)

/proc/kmsg

内核输出的消息。这些消息同样也被送到了syslog中。

/proc/ksyms

内核的符号表。

/proc/loadavg

系统的“平均负荷”;是三个毫无意义的指示值,指示出此时系统有多少工作要做。

/proc/meminfo

物理内存和交换区使用情况的信息。

/proc/modules

此时哪些内核模块被加载。

/proc/net

网络协议的状态信息。

/proc/self

一个进程目录的符号连接,该进程属于在/proc中查看信息的程序的。当两个进程在观察/proc时,它们取得不同的连接。这主要是为了方便程序观察它们自己的进程目录。

/proc/stat

有关系统的静态参数,如系统自启动以来的页故障(page faults)数。

/proc/uptime

系统启动的时间。

/proc/version

内核版本。

可以注意到,虽然以上文件基本上是易读的文本文件,这些文件的格式有时可能还是难于理解。有许多命令就只是读入上述文件并格式化成利于理解的格式。例如,free程序读入/proc/meminfo信息并将字节数转换成千字节(同时也加入了少量的信息)。