一旦你拥有了一个toolchain,就拥有了制作MagicLinux的初级武器了。这个时候你可能 已经开始辂胳膊挽袖子,准备大干一场了,可你却突然发现,还是什么也做不了,原因就在于你还不了解如何使用toolchain来制作 MagicLinux。下一章我将讲述Linux的组织结构,让你对Linux有一个彻底的了解,为正式开始制作MagicLinux作准备。
第二章 Linux的文件组织结构
像Linux这些类Unix操作系统与你所熟知的Windows有很大的不同,其中一个显著的不同就是类Unix操作系统的文件管理方式,它只有一个文件
树,以一个树根“/”为起点,所有的文件和外部设备都以文件的形式挂接在这个文件树上,包括硬盘、软驱、光驱、调制解调器等,而且有着非常严格的组织结
构。不同的Unix分支在文件组织细节方面会有一些不同,但基本层次与本文下面将介绍的内容是相一致的。
在Linux操作系统下,众多软件都被安装在既定的位置,它们的文件名、文件内容、目录结构等都是固定的,相互合作的软件系统通过这些既定的规则就可以恰
当的找到它们的合作伙伴,互相配合完成一些更为复杂的任务。作为用户也可以在通过查看既定的位置的内容来判断是否安装了自己需要的软件,或者修改软件的配
置等,且同等的操作在任何同类系统中都能得到相同的结果。为了实现这些目的,Linux必须严格的组织文件层次关系,且形成一种规范行为,才不至于因为混
乱而使得用户以及软件系统对操作系统产生恐慌。这充分体现了Unix的传统——简单。
Magic Linux作为一个成熟的Linux发布,必定要因袭传统标准,作为Magic
Linux的开发者,熟识Linux的文件组织结构也很自然的成为你必修的基本功课,因为这决定了你制作出来的系统能否被其他人所接受,以及能否正确运行
那些成熟稳定且应用广泛的软件产品。
2.1 基本组织原则
类Unix系统的文件组织结构是按照一个基本组织原则而设计的。当你能够深入理解这些原则之后,你会发现目前这种组织结构是必然的选择,你也不必牢记那些结构性的问题,而不由自主的做出与现今沿袭下来的基本一致的布局来。
按照各文件在系统中所起的作用,可以划分为是否共享与是否可变两类属性。一般来说,不一定需要本地系统提供的文件都可以看作为共享的,而那些必须由本地系
统提供的文件则可以看作为非共享的;能够被保存在只读存储设备上的文件都可以被认为是不可变的,反之那些必须要存在可读写存储设备上的文件就是可变的。
从是否可共享这一属性上可以充分体现类Unix操作系统极强的灵活性与可扩展性。由于采用单一文件树形式,任何设备都能够以文件方式挂接到树的某一枝上,
这使得非本地存储设备通过某种网络协议挂接到本地文件树上成为可能。这样,很有可能你正在使用的某些程序根本就不在你的计算机里,而是在离你非常遥远的大
洋彼岸。给文件赋予是否可共享这一属性,使得这种操作变得轻松且合理,只要按照这个原则来组织文件布局,就可以很容易的提供这种让你难以置信的强大功能。
其实这也是历史原因造成的,毕竟在很早以前,大量的本地存储是非常奢侈的事情,让远端的一个设备来存储大家共用的一些程序是很棒的解决方案。那些程序自然
的就是为大家所共享的。然而这种共享不能解决所有问题,毕竟本机的设备不能完全与别人的设备相同,那么它们对应的文件也不能提供给别人使用,自然的也就是
非共享文件了。
可变属性在某种意义上为类Unix系统提供了很大的伸缩性,可以容易的将它们一直到很多非通用设备上,比如电视机顶盒。它允许你合理的将那些固定不变的二
进制代码存储在只读设备上,而那些随着系统运行而时刻变化的内容,如系统日志等可以存储在随机读写设备上,这样便于你最大限度的节省硬件设备上的成本开
销。于此,系统的安全性也得到了保障,毕竟很少有人希望他们那些常用的程序可以很容易的被一些恶意程序所修改,这点Windows上的用户们是感同身受
的。
以前,类Unix系统的文件组织结构不是非常清晰,/usr和/etc目录混合着大量的可变与不可变的文件。由此,引入了/var目录,将/usr目录下
的可变文件全部转移至/var目录下,这就保证了/usr目录可以单独放在其他设备上且以只读方式被挂接在树根上。目前/etc目录下的可变文件还没有完
全转移至/var目录下,但是从技术角度看,这也只是一个时间问题。
下表列出了依照这一基本原则组织文件的典型例子:
可共享 不可共享
不可变 /usr /etc
/opt /boot
可变 /var/mail /var/run
/var/spool/news /var/lock
表2-1
2.2 根文件系统
根文件系统保存在根分区,它担负着系统启动、修复、更新、恢复等重要任务。当你启动系统成功后,可以执行下列命令查看树根的内容:
#cd /
#ls
结果可能是下面的内容:
bin dev lib media opt root sys tmp usr
boot etc home mnt proc sbin srv var
虽然他们井然有序的排列在一起,但是他们并不一定完全存放在同一个设备上,比如/usr、/var等,而且/sys和/proc根本不在任何外部存储设备上,而是在内存中。
这里,将直接挂接在树根“/”上的设备叫做根设备,可能是内存,也可能是磁盘,如果是磁盘的某一分区,就称之为根分区,它是操作系统启动时默认挂接的设
备,是所有文件系统的根源。可谓有了根文件系统就有了一切。如果当系统崩溃到连根文件系统都无法挂接时,你只有唯一的选择——重装。
为了启动系统,根分区的内容必须能够支持到系统挂接了其他设备和其它磁盘分区之后。这就要求它必须包含必要的工具(如init、mount等),配置信息
(如inittab、fstab等)以及其他重要的启动数据。还应该包含引导器的配置信息,但与具体引导器的不同而不同,有的需要有的可以放在其他地方。
为了更新或修复系统,根文件系统还包含那些能够提供这些功能的工具。保证有经验的系统管理员能够重建被毁坏的部分。
为了恢复系统,根文件系统要提供备份和还原工具,在必要的时候可以通过以前的备份恢复系统的运行。这些备份往往保存在光盘、磁带等大容量外存上面。
根文件系统上的内容需要平衡考虑,要仔细斟酌将哪些内容放入根分区,尽量保证根分区的精巧。有很多因素要求跟分区要尽量的精巧:第一,根文件系统包含了众
多的系统特有的配置文件,如:内核、hostname文件等,这些都是系统特有的,这就意味着根文件系统不能通过网络系统共享。保证网络系统根分区在服务
器的最小化,可以最小化非共享文件区域
的磁盘空间浪费。这也使得工作站可以使用更小容量的硬盘。第二,虽然你划分了较大的根分区给根文件系统,且对它付诸了你的心血,可是有人却使用了更小的根
分区,导致你的发布无法安装。当系统有了更多的安装文件,你可能会发现这与其它使用更小根分区的系统不兼容了。作为开发者,你就把这个问题转移给你的广大
用户了。第三,由于磁盘错误毁坏了根分区数据是致命的,更小的根分区可以尽量减小这种致命问题的发生。
应用程序不得创建或依赖根文件系统上的特定文件或子目录,后面将要讲述的其他位置可以为任何软件包提供更多的灵活性。这有很多原因,最主要的,从性能或安全等多方面考量,系统管理员需要保证根文件系统精小,而且也规避了因交叉挂接而引发的各种混乱问题。
根文件系统必须包含下列目录,某些可以是符号连接:
名称 功能
bin 重要的可执行文件,shell命令
boot 引导器配置文件,内核等。
dev 设备文件
etc 系统专有配置文件
lib 重要的共享库和内核模块
media 可移动设备挂接点
mnt 其他文件系统的临时挂接点
opt 附加应用软件包
sbin 重要的系统可执行文件
srv 本系统提供的用于服务器的数据
tmp 临时文件
usr 文件系统的第二层
var 可变数据
表2-2-1
这些内容可能与你理解的不太一样,但这就是全部必须的内容,各目录的详细内容下面会逐一介绍。而下表所列的可能就是你疑问的了,但这些是可选的,只要在有相应子系统的时候才需要。不过对于大多数通用系统它们都是需要的。
名称 功能
home 用户自己的目录
lib 其他各式的重要共享库,比较少见
root root用户的专有目录
表2-2-2
它们的具体内容也会在下面内容进行详细介绍。
2.3 子目录
本节将讲述根文件系统下各子目的详细内容,以及为了使系统能够运行它们所必须包含的内容。/usr和/var由于本身的复杂性,我会以单独的章节介绍它们。
2.3.1 /bin
/bin目录下包含了用户命令文件,也就是shell命令,供所有用户使用。不仅仅是用户,脚本程序也要使用它们。即使其他文件系统还没有被挂接时,它们也要能够工作。
/bin目录不得包含任何子目录,下表列出了它必有的内容,有些文件可能是一个符号连接:
名称 功能
cat 连接多个文件,并将内容输出至标准输出
chgrp 改变文件的所属组
chmod 改变文件的访问权限
chown 改变文件的所属用户和组
cp 复制文件和目录
date 打印或设置系统日期与时间
dd 转换并复制文件
df 查看文件系统磁盘空间使用情况
dmesg 打印或控制内核的消息缓冲
echo 显示一行文本
false 不做任何事情,表示不成功
hostname 显示或设置系统的主机名
kill 向进程发送信号
ln 创建文件连接
login 开始系统上的一个会话
ls 列出目录内容
mkdir 创建目录
mknod 创建块或字符设备的专用文件
more 分页显示文本
mount 挂接一个文件系统
mv 移动文件或更改文件名
ps 查看系统进程状态
pwd 打印当前工作目录名
rm 删除文件或目录
rmdir 删除空目录
sed 一个流式文本编辑器
sh Bourne命令shell
stty 改变或打印终端行设置
su 改变用户标识
sync 刷新文件系统缓存
true 什么也不做,表示成功
umount 卸载文件系统
uname 打印系统信息
表2-3-1
如果/bin/sh不是真正的Bourne
shell,它必须连接到一个真正的shell命令上,既可以是硬连接也可以是软连接。例如,调用sh或bash时,bash会有不同的行为。使用符号连
接也使得用户容易地了解到/bin/sh不是一个真正的Bourne
shell。“[”和“test”命令必须被放在一起,既可以在/bin目录下也可以在/usr/bin目录下。这是为了保持与POSIX.2标准一致,
即使它们已经由shell程序内部实现了。
下表的内容是可选的。如果有相应的子系统被安装,则是必须的。目前大多数发布都会部分的提供它们。
名称 功能
csh 著名的C shell
ed “ed”文本编辑器
tar tar打包工具
cpio cpio打包工具
gzip GNU压缩工具
gunzip GNU解压缩工具
zcat GNU解压缩工具
netstat 网络统计工具
ping ICMP网络测试工具
表2-3-2
如果存在gunzip和zcat程序,它们一定是gzip的软连接或硬连接。/bin/csh可能是/bin/tcsh或/usr/bin /tcsh的符号连接。tar、gzip和cpio为系统提供了恢复能力,反之,如果不考虑从根分区恢复系统的话,这些程序可被忽略(例如一个只读片内根 系统,通过NFS挂接/usr目录)。若要通过网络恢复系统,还需要ftp或tftp存在于根分区。
2.3.2 /boot
该目录包含了除在启动时刻和映像安装器不需要的配置文件外,启动进程所需要的所有内容。换句话说,/boot目录下存储的数据用于内核开始执行用户级程序
之前的操作。这里也可能包含备份的主引导扇区信息和扇区映像文件。另外,操作系统的内核必须放在“/”或“/boot”目录下。
2.3.3 /dev
/dev目录是设备文件或专有文件的存放位置。要是/dev中的设备需要手工创建,/dev必须含有一个名为MAKEDEV的命令,它能够创建需要的设备
文件。同时也应该为任何本地设备包含一个MAKEDEV.local文件。如果需要,MAKEDEV必须具备为任何发现与系统的设备创建文件的权限,而不
限于那些特定的安装实现。
2.3.4 /etc
/etc包含了系统特有的配置文件。所谓配置文件,就是用于控制程序运行的本地文件,它一定是不可变文件,而且是可编辑的,那些二进制可执行文件是不能作为配置文件的。/etc下基本没有二进制文件,下表中列出的目录需要包含在/etc下,有些可能是符号连接。
名称 功能
opt /opt目录下各软件的配置文件
X11 X Window系统的配置文件,可选。
sgml SGML的配置文件,可选。
xml XML的配置文件,可选。
表2-3-3
当相关子系统安装后,下列文件必须放在/etc中,有些也可以是符号连接:
名称 功能
csh.login C shell登陆的全局初始化文件,有C shell时有效。
exports NFS文件系统的访问控制列表,有NFS支持时有效。
fstab 文件系统的静态信息,系统初始化时需要挂接多个文件系统时需要。
ftpusers FTP守护进程的用户访问控制列表。
geteways routed的网关列表。
gettydefs getty程序的配置文件。
group 用户组列表文件。
host.conf 决定如何解析域名。
hosts 主机名静态信息。
hosts.allow 允许访问本机的IP地址列表。
hosts.deny 禁止访问本机的IP地址列表。冲突时,优先。
hosts.equiv 信任主机列表,作用于rlogin,rsh,rcp。
hosts.lpd 信任主机列表,作用于lpd。
inetd.conf inetd守护进程的配置文件。
inittab init程序的配置文件。
issue 登陆提示符上面的消息和标识文件。
ld.so.conf 搜索共享库的目录列表文件。
motd 本机的标识信息,远程登陆时确认你当前控制的是本机还是远程计算机。
mtab 文件系统的动态信息,记录当前挂载的文件系统。
mtools.conf mtools程序的配置文件。
networks 网络名称的静态信息,与hosts类似。
passwd 用户密码文件。
printcap ldp打印机的性能数据库。
profile sh shell登陆的全局初始化文件。
protocols 网络协议定义文件。
resolv.conf DNS域名解析的配置文件。
rpc RPC协议定义文件。
securetty Root登陆的TTY访问控制文件。
services 记录网络服务名和它们对应使用的端口号及协议。
shells 可使用的登陆shell路径名。
syslog.conf syslogd守护进程的配置文件。
这里,显然mtab就不适合/etc内单纯为不可变文件的原则,这在今后会逐步得到解决。
/etc/opt目录下的内容是为/opt而准备的。附加应用软件包的配置文件必须安装在
/etc/opt/
/etc/X11目录下的内容是X
Windows系统的配置文件,X
Windows系统的所有主机
相关配置文件全都在这里。这使得在/usr以只读方式挂接时,可以局部控制
X
Windows系统。只要安装了X
Windows系统,下表中的文件必须安装在/etc/X11目录
下:
名称 |
功能 |
Xconfig |
XFree86早期版本的配置文件。 |
XF86Config |
XFree86第3、4版的配置文件。 |
Xmodmap |
定义xdm和xinit所要使用的键盘映射。 |
xorg.conf |
Xorg的配置文件。 |
表2-3-5
/etc/X11下的那些子目录是为xdm以及别的程序(如窗口管理器)准备的。那些只有
一个配置文件的窗口管理使用的配置文件名是system.*wmrc(除非有约定俗成的名
字),一般不占用一个子目录。任何窗口管理器的子目录一定与它实际的可执行文
件名相一致。
/etc/sgml和/etc/xml里的内容是SGML和XML的配置文件,这是可选的。定义它们
高级参数的基本配置文件就安装在这里。
2.3.5
/home
/home为用户专有目录,每个用户都会在/home目录下有其对应的子目录,而且这
个子目录一般与他的用户名相同。没有任何程序会依赖于这个目录。
同一个程序,不用的用户有不同的配置方式,这些用户独有的配置文件就保存
在他的home目录中,一般以“.”开头(即隐藏文件)。如果某个程序需要创建多个
配置文件,它就会在用户的home目录下创建一个以“.”开头的目录(即隐藏目
录),将这些配置文件放入目录中。这种情况下,配置文件不再需要以“.”开头
了。
2.3.6
/lib
/lib目录里存放着必备的共享库和内核模块。在系统启动和运行根文件系统上的
各种命令时,都要用到这些共享库。必须至少存在一组下列文件名组合方式的一组
文件(可以是文件,也可以是符号连接):
文件名组合 |
功能 |
libc.so.* |
C动态链接库。 |
ld* |
运行时连接器/加载器。 |
表2-3-6
如果安装了某个C预处理器,由于历史原因,/lib/cpp必须是它的连接。modules子目录
必须存在于/lib目录下,它是内核可装载模块的存放位置。
2.3.7
/lib
有些时候,系统为了支持不只一种可执行文件格式,会需要有多个不同的/lib目
录来单独保存必须的共享库。一般的,在处理这个问题时会在lib后面追加一些修
饰,如AMD64系统的/lib64等。这种情况下就不再需要/lib
象PPC64、s390x、sparc65和AMD64这些即支持64位程序也支持32位程序的平台
下,/lib
中,而32位库则依然放置在/lib中,这保证了对原有32位程序的平滑兼容。完全64位
架构的IA64不支持32位程序,则只有/lib,也就是说所有的64位库都要放置在/lib中。
2.3.7
/media
该目录用于挂接如软盘、光盘、U盘等可移动设备,其各子目录挂接各种类型
设备,从其目录名可了解具体设备类型。曾经出现过很多其他名称的挂接点,如
/cdrom,/mnt或/mnt/cdrom等,现在统一规范到/media中。虽然很多人习惯于将这些
可移动设备挂接在/mnt子目录中,但这与传统不符,因为/mnt实际上只是临时挂接
点。下表的内容一定要出现在/media目录中,具体内容与系统实际情况有关。
名称 |
功能 |
floppy |
软盘驱动器 |
cdrom |
CD-ROM |
cdrecorder |
光盘刻录机 |
zip |
Zip磁盘驱动器,现在比较少见 |
表2-3-7
如果系统中有不止一个同类的驱动器,则在其挂接类型目录名后面带有一个0起始的
数字,比如“cdrom0、cdrom1、…..”。
2.3.8
/mnt
提供这个目录是让系统管理员临时挂接某个文件系统的。此目录的内容属于局
部问题,不应该影响任何程序的运行。千万不要在这里安装什么程序,毕竟一个临
时目录在系统不需要它的时候会被其他东西占用。
2.3.9
/opt
这里是系统附加软件包的栖息地。每个软件包会在/opt下拥有一个自己的目录,
那里面存放着他所有的可执行程序和静态数据。这个专有目录名应该与它本身的名
字相一致,这样用户就很容易管理它们了。也可以使用厂商名称,不过这个厂商名
称必须是在Linux名称与号码分配管理局注册过的,不过厂商名下面还应该是软件
名,毕竟同一个厂商可以有多个软件。
/opt/bin、/opt/doc、/opt/include、/opt/info、/opt/lib和/opt/man是保留给本地系统管理
员使用的。有些软件包可能会提供一个前端文件(连接或副本),系统管理员可以
将这个文件放在这些保留目录中,但是在缺少这些保留目录时也要保证可以正常工
作。
用户调用的程序必须放在软件包目录下的bin子目录中。如果包含Unix指南页,
则要将它们放在对应软件包的share/man子目录下,而且也必须拥有与/usr/share/man目
录中相同的组织结构。
软件包有可变文件,必须将这些可变文件安装在/var/opt目录下。见/var/opt一
节,会有更详细的介绍。
本机专有的配置文件必须安装在/etc/opt目录下,见/etc一节的介绍。
没有哪些附加软件包会将它们的文件放在/opt、/var/opt和/etc/opt之外,除非那个
软件包的某些文件必须放在特定位置,否则不能正常工作。比如,设备锁文件必须
放在/var/lock中,设备文件必须放在/dev中。
一些Linux发行版可能在/opt目录下安装了软件,在没有征得本地管理员同意时,
千万不要擅自更改或删除这里的软件。
为附加软件提供/opt目录,是类Unix世界非常优良的传统习惯。发布版对/opt目
录的使用应该做些少许的限制,因为发布的软件与本地安装软件可能会发生冲突,
尤其那些使用固定路径的软件。
2.3.10
/root
是否为root帐户提供专有home目录取决于开发者或者用户的使用习惯。不过还是
建议提供这个/root目录。
2.3.11
/sbin
必备的系统软件存放处。用于系统维护的软件和某些只限root用户使用的命令存
储在/sbin、/usr/sbin以及/usr/local/sbin目录下。/sbin目录存储的则是那些在系统启动、
恢复、还原以及修复过程中必备系统工具,也是对/bin下内容的补充。那些已知
在/usr被挂接之后才需要的程序一般可以放在/usr/sbin目录下。用户自行安装的系统管
理程序应该放在/usr/local/sbin目录下。下表所列的各种命令应该出现在/sbin目录下。
名称 |
功能 |
shutdown |
关机命令 |
fastboot |
快速从新启动系统,不做磁盘检测。可选。 |
fasthalt |
快速停止系统运行,不做磁盘检测。可选。 |
fdisk |
磁盘分区表维护工具。 |
fsck |
文件系统检测与修复工具。 |
fsck.* |
特定文件系统检测与修复工具。 |
getty |
getty程序,设置终端机模式、连线速率和管制线路。 |
halt |
停止系统运行。 |
ifconfig |
网口配置工具。 |
init |
系统初始化进程。内核调用的第一个用户进程。 |
mkfs |
创建文件系统,也叫格式化。 |
mkfs.* |
创建特有的文件系统。 |
mkswap |
格式化交换分区。 |
reboot |
重新启动系统。 |
route |
IP路由表维护工具。 |
swapon |
开启页交换。 |
swapoff |
关闭页交换。 |
update |
周期性的刷新文件系统缓冲的守护进程。 |
表2-3-8
2.3.12
/srv
某些服务进程启动之后,它们需要读取的数据会放在/srv目录中。提供/srv目录
一方面为了方便用户找到特定服务的数据文件,另一方面也为某些服务放置它们的
执行脚本(如CGI脚本)、只读或可写数据提供一个合适的地方。提供给特定用户
的数据应该放在那个用户的home目录下。
目前还没有规范的/srv下子目录的命名方法。有一种方式是按照协议构造/srv下
的数据,如ftp、rsync、www、cvs等等。对于大型系统,可能利用功能管辖范围构
造/srv下的内容,如/srv/physics/www、/srv/compsci/cvs等。它的具体内容在不同主机间
会有很大的差异,因此,没有程序会依赖于/srv下特定的子目录结构,也没有那个程
序必须在/srv下保存数据。不过,/srv目录始终会作为服务进程数据存放地而一直存
在着。
2.3.13
/tmp
/tmp必须能够被任何程序、任何用户访问,它存放临时文件。任何程序都不用
对/tmp目下任何文件或目录负责,尽管如此,还是建议系统重起后,应该清除/tmp目
录下的内容。
2.4
/usr目录组织结构
/usr是整个文件系统的第二个主要区段。它既是可共享的也是只读的,这意味
着/usr可以共享于多种主机之间,但不能写入。任何主机专有的或随时间变化的信息
只能存放在其他地方。
即使是大型软件包,也不得占用/usr下的一个独立子目录。下表所列的目录或目
录的符号连接要求出现在/usr下:
名称 |
功能 |
bin |
大部分用户命令。 |
include |
C/C++程序头文件目录。 |
lib |
程序库。 |
local |
用户自行安装的程序存放于此。 |
sbin |
非重要的系统程序。 |
share |
体系结构独立数据。 |
表2-4-1
下表所列目录是可选的,根据具体软件安装情况而定:
名称 |
功能 |
X11R6 |
X Window 11 第六版 |
games |
育教娱乐程序 |
lib |
备用格式程序库,如lib64。 |
src |
源代码。 |
sbin |
非重要的系统程序。 |
表2-4-2
这里有一个例外,就是X
Windows系统,它占有了一个独立子目录,这是历史原因导
致的。
为了与老系统保持兼容,可以在/usr目录下创建下列符号连接:
/usr/spool —〉/var/spool |
/usr/tmp —〉/var/tmp |
/usr/spool/locaks —〉/var/lock |
表2-4-3
这是因为这些目录早先是在/usr下的,后来转移到了/var目录下。一旦系统不再需要
那些符号连接了,可以直接删除。
2.4.1
/usr/X11R6
该目录保留给X
Window 11第六版和与其有关的文件的。为了使XFree86与其它
系统的X
Window相兼容,只要有/usr/X11R6目录就一定要有下表中的符号连接:
/usr/bin/X11 —〉/usr/X11R6/bin |
/usr/lib/X11 —〉/usr/X11R6/lib/X11 |
/usr/include/X11 —〉/usr/X11R6/include/X11 |
表2-4-4
通常,不得利用这些符号连接安装或管理软件,它们仅供用户使用。另外,在
X
Window发布版本更替期,没什么好方法可以了解当前使用的是X11的那个版本。
保存在/usr/X11R6/lib/X11的主机专属数据应解释为示范文件。应用程序需要了解
本机信息时,必须参考/etc/X11下的某个配置文件,虽然这个配置文件可能是
/usr/X11R6/lib下某个文件的连接。
2.4.2
/usr/bin
系统中绝大多数的可执行文件都放置在这里。下表所列的目录必须放在/usr/bin
下,除非没有安装与它们相关的系统:
名称 |
功能 |
mh |
MH邮件处理系统的命名所在目录。 |
/usr/bin/X11 |
如果存在/usr/X11R6/bin目录,一定是它的符号连接。 |
表2-4-5
下表所列的文件或符号连接也必须放在/usr/bin目录下,除非你没有安装这些软件:
名称 |
功能 |
perl |
经典的perl语言解释器。 |
python |
最近非常流行的python语言解释器 |
tclsh |
古老而特别的tcl解释器。 |
wish |
图形界面的tcl解释器。 |
expect |
Tcl语言非常经典的扩展部分,实现程序的自动交互。 |
表2-4-6
读者会发现一个特别的地方,我所列出来的这些程序都是某种脚本语言的解释器或
扩展部分。这是因为shell脚本解释器(shell脚本的第一行往往带有一个!#
的注释)不能依赖于某个具体目录,这就要求必须标准化它们的位置。Bourn
shell和
C
shell解释器已经被锁定在/bin目录中了,可是Perl、Python和Tcl却经常被放置在不同
的地方,于是/usr/bin下的内容往往是到其实际位置的符号连接。
2.4.3
/usr/include
标准头文件存放目录,系统内所有通用的C语言头文件都要放置在这里。如果
有/usr/X11R6/include/X11存在,则一定要建立/usr/include/X11这个符号连接。
2.4.4
/usr/lib
/usr/lib内的内容是库和目标文件,它们都是二进制文件,但不被用户和shell脚本
直接执行。应用程序可以在这里创建独立的子目录。如果应用程序在这里创建了独
立的子目录,它所有的与体系结构有关的执行数据都必须放在这个子目录中。
由于历史原因,如果有/usr/sbin/sendmail存在,则必须在/usr/lib下创建sendmail符号
连接;如果有/lib/X11存在,也必须在/usr/lib下创建X11的符号连接,即使/lib/X11也是
一个符号连接也要这样做。
2.4.5
/usr/local
/usr/local是供系统管理员安装局域性软件使用的,这保证了当系统更新时不会把
它们覆盖掉。/usr/local也可被用于在一组主机之间共享程序和数据,不过不能在/usr
中也有同样的东西。下表所列的目录或符号连接必须出现在/usr/local中。
名称 |
功能 |
bin |
局域性可执行文件。 |
etc |
局域性软件的配置文件目录。 |
games |
局域性育教娱乐可执行文件。 |
include |
局域性C头文件。 |
lib |
局域性程序库。 |
man |
局域性在线指南。 |
sbin |
局域性系统管理可执行文件。 |
share |
局域性体系结构无关数据。 |
src |
局域性源代码。 |
表2-4-7
默认情况下不会再有其他的子目录了。/usr/local/etc也可能符号连接到/etc/local,这更
适用于将所有配置文件放置在/etc下这一规则。
2.4.6
/usr/sbin
那些非必要的系统管理软件可执行文件就存放在这里。那些用于还原、更新、
修复系统,以及挂接/usr目录的系统管理程序都必须放置在/sbin目录下。
2.4.7
/usr/share
这里存放着所有体系结构无关的数据文件,它的内容可以共享给运行在任何体
系结构下的操作系统。例如,某个站点可能由i386、Aplpah和PPC三种体系结构平台
构成,但是它们可能共同维护唯一的一个挂接自某处的/usr/share目录。需要注意的
是,虽然/usr/share可以共享于不同体系结构之间,但必须保证它们运行的是不同发布
平台的相同操作系统。
任何程序或软件包包含或需要的不需要修改的体系结构无关的数据都应该保存
在/usr/share(如果安装的是局域性软件,应该是/usr/local/share)目录中。同时也建
议/usr/share下的任何子目录也应用于此目的。保存在/usr/share/games下的游戏数据必
须是纯粹的静态文件,类似于分值、日志等文件,必须放置在/var/games中。
下表所列目录或符号连接必须出现在/usr/share中:
名称 |
功能 |
man |
在线指南。 |
misc |
体系结构无关的其他数据。 |
表2-4-8
下表所列目录或符号连接,与你所安装的软件有关,如果有则必须出现
在/usr/share中:
名称 |
功能 |
dict |
单词列表。 |
doc |
其他文档。 |
games |
/usr/games的静态数据文件。 |
info |
GNU Info系统的主目录。 |
locale |
本地信息。 |
nls |
本地语言支持的消息目录。 |
sgml |
SGML数据。 |
terminfo |
terminfo数据库目录。 |
tmac |
没有与groff一同发布的troff宏。 |
xml |
XML数据。 |
zoneinfo |
时区配置信息。 |
表2-4-9
建议将那些应用程序专有的,且体系结构无关的目录放置在这里,例如:groff、
perl、ghostscript、texmf等等,为了向后兼容,某些发布版也会将它们放置在/usr/lib
下,出于同样的原因,/usr/share/games也可能会被这样处理。
2.4.8
/usr/share/man
本节会详细的介绍贯穿于整个系统的在线指南的文件组织结构,当然,也会包
括/usr/share/man目录下的组织结构。
/usr/share/man是各种指南页面存储的主要目录,它包含了“/”和“/usr”下大部
分程序的帮助信息。各指南页面被存储在
路径中。下面将逐步解释
当你打开/usr/share/man目录,你会看到如man1、man2、…、man8这样的子目录,
它们的具体分工如下:
lman1:公共可用的命令或软件的指南页面保存在这里。
lman2:所有系统调用(可以理解为类似Windows的API)的说明保存在这里。
lman3:库函数的说明信息保存在这里。
lman4:特种文件的说明保存在这里,如/dev目录下的设备文件和提供网络协
议支持的内核接口等。
lman5:大部分数据文件的格式说明保存在这里。这包括各种包含文件、程序
输出文件和系统文件。
lman6:寓教于乐程序、演示程序和一些不太重要的程序的说明文档保存在这
里。
lman7:其他类型的在线帮助信息保存在这里。如troff等文本处理宏的信息。
lman8:系统维护程序文档保存在这里。当然,这些程序有时也适合普通用户
使用。
上述目录也必须出现在/usr/share/man/
这是为了提供多语言版本支持而提供的,其中
常遗憾的是,没有中文语言的支持。
料还请参考其他文献,这里就不一一列举了。如果系统只使用一种语言的话,
同理,如果某些内容与体系结构有关的话,如设备驱动器或底层系统管理命
令,则需要将这些内容放置在对应的
保存为/usr/share/man/
/usr/local下的软件的在线帮助信息保存在/usr/local/man中。X11R6的保存
在/usr/X11R6/man中。它们的组织结构与/usr/share/man是相同的。
数字1至8即为前面讲述的。通常,每一个帮助页都有一个独立文件,
这个文件要带有一个“.
的帮助文档可能不遵循这一规则,反倒会使用它们自己定义的后缀。如X
Window就
会使用.x作为后缀。
其他位置的帮助文档,提供多语言版本支持时,同样遵循/usr/share/man的多语言
版本支持规则,包括后面将要讲述的/var/cache/man目录。
2.4.9
/usr/share/misc
那些不需要在/usr/share目录下拥有自己目录的应用程序,会将它们的体系结构无
关的数据放置在这里。
下表所列内容就是会出现在/usr/share/misc目录下的内容:
名称 |
功能 |
ascii |
ASCII码表。 |
magic |
file命令使用的特征符号表。 |
termcap |
终端性能数据库。 |
termacp.db |
终端性能数据库。 |
表2-4-10
2.5
/var目录组织结构
/var目录包含着系统中绝大多数的可变数据,如系统日志、spool目录与文件等。
/var的某些内容不能共享给其他系统,最典型的就是/var/logs、/var/lock和/var/run。
当然,某些内容是可以共享给其他系统的,特别是/var/mail、/var/cache/man和
/var/spool/news。
/var的创建就是为了使得/usr可以只读方式被挂接成为可能。/usr里面的东西一旦
有被写入的要求,则必须转移到/var下。
若是无法为/var分配一个单独的分区,通常更好的选择是将/var转移至/usr目录下
(这是为了节省根分区的空间,让它尽量精小化)。不过即使这样,也千万不要直
接将/var连接到/usr,因为这就很难区分/var和/usr了。正确做法是将/var连接至/usr/var。
通常情况下,应用程序不得在/var顶层添加任何目录。这个位置只留给那些影响
到整个系统的软件,而且还需要经过Linux社团商议之后决定是否添加。
下表所列目录或符号连接是/var下必须具备的内容。
名称 |
功能 |
cache |
应用程序的缓存数据。 |
lib |
可变状态信息。 |
local |
/usr/local的可变数据。 |
lock |
锁文件。 |
log |
日志文件与目录。 |
opt |
/opt的可变数据。 |
run |
与当前运行进程有关的数据。 |
spool |
spool应用程序数据。 |
tmp |
系统重新启动期间起到保护作用的临时文件。 |
表2-5-1
下面列出的目录都是保留的,某些新的应用程序不得擅自使用它们,否则可能造成
与历史或局部性规则产生冲突:
/var/backups
/var/cron
/var/msgs
/var/preserve
当你的系统安装了某些程序,则下表所列的目录或符号连接必须放置在/var中。
名称 |
功能 |
account |
记录进程的运行情况。 |
crash |
系统崩溃产生的dumps。 |
games |
寓教于乐程序的可变数据。 |
|
用户邮箱文件。 |
yp |
网络信息服务(NIS)数据库文件。 |
表2-5-2
2.5.1
/var/account
该目录包含了当前活动进程的运行情况日志和复合进程的利用率数据。这些内
容用在类Unix系统的lastcomm和sa程序。
2.5.2
/var/cache
该目录的内容是来自应用程序的缓存数据,这些内容可以加快那些费时的运算
或I/O处理任务。应用程序必须能够再生或恢复这些数据。与/var/spool不同,删除缓
存文件不会造成数据丢失错误。
/var/chace下的数据有一定的时效性,这取决于使用它的程序或系统管理员,有
时这两者会同时影响这些数据的时效性。应用程序必须有能力恢复被手工删除的缓
存数据(通常是因为磁盘空间有限,才会手工删除缓存文件)。另外,缓存数据没
有格式要求。
为缓存数据单独划分一个目录,就可以让系统管理员将它们设置在其他磁盘上,
而且还可以从/var的其他目录备份策略。这是/var/cache存在的意义所在。
2.5.3
/var/crash
虽然这个目录不能被Linux系统所使用(Linux不支持系统崩溃dumps),但是它可
以为其他支持这一功能类Unix系统所使用。
2.5.4
/var/games
/usr中那些寓教于乐类程序的可变数据存放于此,而那些静态数据,如帮助文本,
级别定义等内容,必须放在别处,最合理的就是/usr/share/games下。
2.5.5
/var/lib
该目录保存着那些与某个应用程序或系统有关的状态信息。状态信息,即程序
运行过程中不断修改的那些数据,且仅于具体系统有关。对于控制程序的具体行为,
用户不应该通过修改/var/lib下的文件来完成。
在应用程序启动期间或同一个程序不同实例之间,状态信息通常用于保护程序
的所处的状态的。
一个应用程序(或一组相关联的应用程序)必须为其状态数据占有/var/lib下的一
个子目录。不过还有一个misc子目录,专门提供给那些不需要一个子目录的程序。
其他子目录应仅提供给那些包含在发行版中有这一需求的应用程序。
/var/lib下的各子目录的命名应该被所发布的所有软件包支持,当然,不同的发布
版可以使用不同的命名方式。
2.5.6
/var/lock
锁文件必须被保存在/var/lock目录结构中。
锁文件用于硬件设备和其他被多个应用程序共享的资源,例如串行设备锁文
件,最初可能放在/usr/spool/locks或/usr/spool/uucp中,现在,必须放在/var/lock中。锁
文件的命名方式必须是“LCK..”后接设备及本名。例如,/dev/ttyS0的锁文件名
为“LCK..ttyS0”。
锁文件的内容组织格式,必须是HDB
UUCP锁文件格式。HDB格式以10字节
ASCII数字字符存储进程ID,尾部带有换行符。例如,进程1230,它的锁文件将包含
11字符:空格、空格、空格、空格、空格、空格、1、2、3、0和换行符。
2.5.7
/var/log
该目录包含了各种日志文件。大多数日志文件都保存在这里或相应的子目录
中。下表所列的文件或符号连接应该出现在/var/log中,不过这取决于系统中安装的
具体软件。
名称 |
功能 |
lastlog |
每个用户上次登陆记录。 |
messages |
由syslogd产生的系统消息。 |
wtmp |
所有登陆于登出地记录。 |
表2-5-3
2.5.8
/var/mailbox
此处是用户邮箱文件的存放处,所有邮箱文件必须以UNIX邮箱格式存储。
mail
spool必须能够访问/var/mailbox,而且mail
spool文件取自具体用户。此目录移自
/var/spool/mail,就是为了能够与几乎所有的Unix实现相一致。这一改变,使得一个
/var/mail共享于多个主机以及多个不同的Unix实现成为可能。更为重要的是,这不
需要转移mail
spool的物理位置,不过,程序和头文件还需要转移到/var/mail中。
2.5.9
/var/opt
/opt下软件包的可变数据都应该安装到/var/opt下对应的子目录中去,这个子目录
名称应该与/opt下的子目录名称相一致,里面内容的组织结构没有特殊要求。
2.5.10
/var/run
从系统启动开始至当前的系统运行状态信息就保存于此。该目录下的文件,在
系统启动进程执行开始,必须被清空。程序可以在/var/run下拥有一个子目录;鼓励
程序使用不止一个运行时文件。进程标识文件(PID文件),原来是放置在/etc中
的,现在必须放置在/var/run中。PID文件的命名规则是“<程序名>.pid”,例如:
crond的PID文件名就是crond.pid。
PID文件的内部格式依然保持不变,必须以ASCII码的数字字符描述进程标识
符,同时末尾带有换行符。如,若crond的进程ID为25,则/var/run/crond.pid将包含三
个字符:1、2和换行符。
记录当前谁正在使用系统的utmp文件也保存在这里。那些使用Unix-domain套接
字的系统程序,必须将它们的套接字文件放置在该目录中。
2.5.11
/var/spool
/var/spool中的数据就是供以后用的(可以被程序,用户,管理员处理),一旦
被处理完毕,就会被删除。
下表所列的目录或符号连接,必须放置在/var/spool,不过这取决于系统中安装
的具体软件。
名称 |
功能 |
lpd |
打印机spool目录。 |
mqueue |
邮件待发队列。 |
news |
新闻spool目录。 |
rwho |
Rwhod文件。 |
uucp |
UUCP的spool目录。 |
表2-5-4
2.5.12
/var/tmp
/var/tmp目录使得应用程序要求在系统重起期间保护临时文件或目录成为可能,
因此,保存在/var/tmp中的数据,比/tmp中的数据得到更多的保护。
/var/tmp中的文件或目录,在系统启动时不得删除。
2.5.13
/var/yp
网络信息服务(NIS),著名的Sun
Yellow Pages(YP),其可变数据,必须保存在
该目录中。/var/yp是NIS(YP)的标准目录,而且几乎被它所独占。