Linux系统文件大致布局


本文材料摘自”LPI LINUX认证权威指南(第二版)”

Linux的开发本质造成了诸多”发行包(distribution)”的存在, 两大主流为由商业公司Red Hat维护的商业版本系列(Red Hat Enterprise Linux, CentOS, Fedora, …)与由开源社区维护的免费发行版本系列(Debain, Ubuntu, …)。

各自为政导致文件系统布局的不一致使得软件开发者很难写出适合各家发行包的安装程序, 用户也深受其扰。Linux社群于1993年计划制定一套适合一般发行包的文件系统布局标准, 后来形成了Filesystem Hierarchy Standard(简称FHS), 尽管FHS无法约束所有的Linux开发者和发行商, 但是Linux社群深刻体会到次标准的重要性, 所以主要的发行版本都尽量朝着符合FHS的标准而努力, 使得FHS几乎成为新版Linux发行包的实质标准。

数据类型

文件系统是用来保存数据的, 不同类型的数据应该分别保存在文件系统中的不同位置。因此, 第一步应该先理清如何分类数据。FHS将数据的属性分成两类, 各类属性各有两种截然相反的性质。

共享性(数据于网络环境中的应用范围)

共享(sharable): 可供网络上的多个主机同时访问的数据。通常是无关特定主机的一般性信息, 诸如用户的数据文件, 可执行程序文件以及通用的配置文件(像是记录主机名称与IP地址对应关系的hosts文件)。

专用(non-sharable): 仅供特定主机使用的数据。通常是仅对特定主机才有意义的信息, 像是passwd文件, 网络配置文件, 系统日志文件。

变动性(数据变动的频繁程度)

常变(variable): 会因系统运作或人为操作而经常变化的数据。例如, 用户的邮件文件, 系统日志文件。

静态(static): 除非人为的刻意操作, 否则平常不会有变化的数据。例如, 已被编译成二进制格式的程序(像是ls与cp), 这类文件只有在系统管理者进行版本升级时才有可能被修改。


 

两种属性各有两种性质, 共可交织出四种组合, 构成一个2 X 2矩阵。FHS以此矩阵作为数据的分类原则, 尽量将同类型的数据集中在相同目录, 让相似性质的目录构成合乎逻辑的目录树, 借此简化文件共享, 系统管理, 备份工作的复杂度, 甚至可缩减存储空间的需求。

共享 专用
静态 /usr
/usr/local
/etc
/boot
常变 /var/mail
/home
/var/log
/proc

/usr目录为例, 此目录专门用于存放程序文件, 之所以被归类为”静态”, “共享”, 是因为在正常情况下, 程序文件的内容是不变的, 而且可供局域网上的其他主机共享。在Unix发展初期, 磁盘空间相当有限, 而且局域网上几乎是同机型的主机, 所以通常将程序文件集中安装于一个NFS server主机上, 供局域网上的其他主机挂载, 借此节省磁盘空间, 同时也简化了管理软件版本的工作。

/var/mail/home目录被归类为”共享”, “常变”, 因为它们可供网络上的其它主机共享, 但是它们的数据文件经常会被用户修改。

同样地, 不难想象/etc/boot目录被归类为”专用”, “静态”, 前者存放配置文件, 后者存放开机所需的文件。这两种数据只对个别主机才有意义, 而且一固定下来后就很少变动。/var/log/proc目录被归类为”专用”, “常变”, 因为它们包含的都是本机专属数据, 而且经常变动。

FHS依据前述的分类原则, 详细规范了标准系统应有的各种数据于目录树上的确切位置。

根文件系统

根文件系统位于整个目录树的最顶端。依据FHS的定义, 根文件系统应该满足下列条件:

  • 必须含有足以启动操作系统的工具与文件, 包括挂载其他文件系统的能力。这包括: 工具程序, 设备文件, 配置文件, 启动加载程序(boot loader)所需的信息以及其他基本的启动数据。
  • 必须具备系统管理者修理或恢复遭损系统所需的工具程序。
  • 规模应该精简。相较于大分区, 当系统死机或停电时, 小分区受到损坏的机会相对较小。此外, 根分区应尽可能包含共享数据, 空出尽可能多的磁盘空间来放共享数据。
  • 应用软件不应该在根文件系统上创建文件或目录。

虽然可以将整个Linux系统全都创建在单一分区上, 但是这样却会违反FHS的建议。因此, 根文件系统应该只包含基本的系统目录以及其他文件系统的挂载点。根文件系统的基本目录包括:

/bin:  存放的大多都是二进制文件, 一些系统的基本命令, 像是cp, mv, date, ln, ls, mkdir, kill等。此目录应该含有管理者解决问题所需的工具。

/dev:  设备文件, 这是访问磁盘与其他设备所必需的。例如, 磁盘分区(像是hda1), 终端机(像是tty1)。在启动过程中, /dev必须含有必要的设备文件, 才可进行挂载与配置设定。

/etc:  个别系统的配置信息, 特别是启动时期会用到的信息必须齐全, 例如passwd, hosts以及login.defs等。此目录通常不含二进制文件。

/lib:  存放共享链接库以及内核模块。这些都是系统进行初始化时所必需的。

/libqual(非必要):  用途与/lib一样, 但用于存储不同格式的基础共享函数库。例如, 在兼具64-bits与32-bits运算能力的Sparc系统上, 就可能会有一个/lib64目录, 用来存储64-bits格式的共享函数库, 而32-bits格式的等效版本则留在/lib目录。

/mnt:  这是个空目录, 它只包含几个挂载点, 用以挂载临时的文件系统。

/media:  具有根/mnt相同的作用, 但是用来挂载插入式储媒(CDROM, USB, …)。

/root(非必要):  系统管理者的个人目录。虽然/root不一定要放在根文件系统上, 但是为了让管理者可以在紧急状况时取用自己的数据或工具, /root通常是放在根文件系统。

/sbin:  用于系统管理的基本工具。例如fdisk, fsck以及mkfs

/srv:  系统服务的专属数据。这是FHS 2.3才提出的新建议, 其用意是让用户可找到特定系统服务的数据文件以及相关的脚本。FHS并未严格规定如何组织此目录, 但是提议了可以依协议(FTP, DNS…)或服务对象的位置(本地, 远程…)来组织子目录。

以下的顶层目录并非”紧急程序”所必需, 而且通常是作为独立分区的挂载点:

/boot:  存放内核镜像文件, boot loader(LILO, GRUB)所需的文件。由于这些文件占用的空间极少, 而且很少变动, 所以可考虑放在根文件系统。然而, 在x86平台上, 为了确保内核镜像文件放在磁盘的前1024磁柱之内, 所以通常将/boot放在独立的分区。

/home(非必要):  用于存放用户的个人目录。这通常是整个目录树中最大的可变的文件系统。

/opt:  主要用于安装非操作系统所包装的额外软件。第三方(third-party)常会选用此位置来安装它们的软件。

/tmp:  存放临时文件。这些文件的生命周期可能不会超过下次开机时。

/usr:  存放应用软件系统, 但不包含”紧急程序”所需的软件。/usr是很值得深入探讨的文件系统, 下续说明。

/var:  存放会随时间改变的数据, 像是日志文件(log), 邮件文件, 假脱机目录(spool)。

/usr目录树

除了应付紧急修复程序所需的基本工具之外, 系统平日运作所用的应用软件都放在/usr目录树下。可供一般用户使用的工具(例如awk, less, tail等)会放在/usr/bin目录下, 而/usr/sbin则存放系统管理命令(像是adduser, traceroute)以及服务器软件。

主机专属或可变的数据不会存放在/usr下, 较大型的应用软件也不会直接放在/usr下, 唯一例外的是X11, 因为这已经成为难以变革的惯例了。通常, /usr会含有下列子目录:

/usr/X11R6:  此目录存放XFree86软件所用的文件。在许多Unix上, X Window System就直接部署于此目录, 许多X应用软件也如此假设。如果改变位置, 将破坏软件兼容性。

/usr/bin:  主要是用来存放”非紧急系统维护所必需”的一般性工具(因此才会存放在此处, 而不会放在/bin下)。

/usr/include:  供C与C++程序设计之用, 主要存放C/C++程序的头文件(.h)。

/usr/lib;  /usr/libqual:  支持各种程序的共享函数库。FHS还允许在此创建软件专属目录。例如, /usr/lib/perl5(Perl 5的模块)。

/usr/local:  供系统管理者用于安装额外应用程序。在刚安装好的Linux系统上, /usr/local可能会含有一个空的子目录树, 其结构类似与/usr下的子目录树, 像是/usr/local/bin, /usr/local/inclue, /usr/local/lib, /usr/local/sbin等。

/usr/sbin:  存放”非紧急系统维护所必需”的系统管理命令(因此才会存放在此处, 而不会放在/sbin下)。

/usr/share:  存放无关硬件平台, 操作系统版本的静态数据文件, 像是GNU info的系统文件, 字典文件以及供软件包使用的文件。这与/usr/bin(用来存放硬件相关的文件)是强烈的对比。举例来说, 即使一企业同时使用了以i386与以Alpha为基础的Linux系统, 其系统管理者仍能将/usr/share经NFS分享给所有系统使用。不过, 因为这两个处理器并非binary-compatible, 所以/usr/bin只能通过两个NFS共享机制,  分别提供给以i386与以Alpha为基础的系统。

/usr/local/share:  此目录的作用与/usr/share大致上相同, 唯一的额外限制是/usr/local/share/man/usr/local/man必须等效(通常两者之一是另外一个的符号链接)。

/usr/src:  软件的源程序代码, 当管理者需要安装tarball形式的open-source软件时, 通常会将tarball解开在此目录下, 以便进行编译, 安装。对于较旧的libc4与libc5系统, 会期待在/usr/src/linux找到一份Linux内核的源程序代码, 或至少可在改目录下的include/asm/include/linux找到内核源代码的头文件。不过, 今日的glibc系统并没有这样假设, 甚至刻意避开引用到/usr/src/linux。事实上, 在该位置留一份内核源代码现在反而被视为一种坏习惯, 因为那可能会造成与旧软件的混淆。

/var目录树

/var, 正如其名称(“variable”)的暗示, 含有随时间变动的数据, 像是打印队列, 日志文件等。由于此区的数据会随时间而增长, 所以通常位于独立分区, 以免因为失控而影响其他文件系统。/var包含以下子目录:

/var/account(非必要):  有记账功能的系统以此目录来维护账务信息。

/var/cache:  应用程序的高速缓存数据。可能是处理过程中产生的临时数据, 一系列冗长运算的结果或是会被反复使用的少量数据。需要长期保存的数据不应该放在此目录下, 而且使用此目录的应用程序必须要有重生高速缓存数据的能力, 因为FHS允许管理者删除此目录下的临时文件,  以作为换取磁盘空间的最后手段。此外, 备份操作也不会将/var/cache涵盖在内。

/var/crash(非必要):  如果系统支持此功能的话, 此目录用来存放系统的crash dump(崩溃转储)。

/var/games(非必要):  比较老旧的游戏程序会使用此目录来存放状态信息, 玩家分数以及其他临时性的数据。

/var/lock:  锁定文件的集中地。需要独占系统资源的应用程序会在启动时于此目录下创建一个锁定文件(lock file), 以免用户重复启动自己或是让其他进程知道自己的存在。锁定文件通常不含任何数据, 只是个空文件。

/var/log:  系统日志文件的主要存储区。syslog服务会将收集到的事件信息写入此目录下的适当文件。例如, 默认的系统日志文件是/var/messages

/var/mail(非必要):  mbox格式的邮箱文件的集中目录。系统上的每一个用户在此目录下都有一个属于自己的邮箱文件。依照Unix 的老传统, 邮箱文件是放在/var/spool/mail目录下。FHS建议以/var/mail取代/var/spool/mail, 不过至今仍有许多Linux依然沿袭旧传统。此外, 采用maildir格式的邮件系统也不一定需要用到此目录。

/var/opt:  供安装于/opt的应用程序来存放修改数据。

/var/run:  运行状态文件的集中区。长期运行的服务器程序在启动之后, 会将自己的PID写入此目录下的一个文件, 供init script用来判断服务器程序的运行状态或是停止运行中的进程。例如, 假设Apache httpd进程的PID为534, 那么, 将会出现一个/var/run/httpd.pid文件, 其内容是httpd进程的PID, 除了PID文件之外, utmp文件也放在此目录下, 供last与who之类的命令来显示登记记录。

/var/spool:  用于暂时等待依序处理的信息。例如, 打印队列, 所要寄出的电子邮件以及crontab文件。

/var/tmp:  作用与/tmp一样, 唯一的差异是此处的临时文件的生命周期可以跨越系统重新开机。

/var/yp(非必要):  NIS(Network Information Service)的数据库文件。NIS的前身称为yellow pages(黄页, 就像大本的电话号码簿那样), 简称yp

 

Leave a comment

邮箱地址不会被公开。 必填项已用*标注