# Arch filesystem hierarchy (简体中文)

Arch Linux 是众多遵守文件系统层次标准(FHS, filesystem hierarchy standard)中的一种。除了描述不同目录和其设计，本文还将涵盖 Arch 特有的更改。

## 文件系统层次标准

引用至 文件系统层次标准的主页 (FHS):

  "文件系统标准是设计给Unix发行版开发者、包开发者和系统实现者使用的。然而，它首先意在作为一个参考而不是一个如何管理Unix文件系统或目录层次的教程。"

### 可共享文件和不可共享文件

可共享文件是指那些能保存在某个主机而被其他主机上的用户使用的文件。 不可共享文件是指那些不可被其他主机上的用户使用的文件。例如,用户家目录可共享而设备锁文件不可共享。 静态文件包括二进制、库、文档文件和其他系统管理员才能变更的文件。 可变文件即非静态文件。

## 目录

### 根文件系统

根文件系统，用斜杠自身表示(/)，是最基本的文件系统，其他所有文件系统起源于此，是（文件系统）层次的顶端。所有文件和目录都出现在根目录"/"之下，即使它们存储在不同的物理设备上。根文件系统的内容必须能够引导启动或者修复系统。

### /bin: 基本命令的二进制文件

传统上，二进制文件存放目录必须在单用户模式下可访问，且可被任何用户访问（例如cat,ls,cp命令）。这样即使在只有根目录/所在分区被挂载，/bin/目录下的程序也能被访问。但实际上，Arch上并非如此，因为所有必须的库都在/usr/lib目录下。Arch开发者计划在将来将/bin目录合并至/usr/bin目录。不像/sbin（其中包含的命令只能被root用户使用），/bin目录意在包含能同时被root用户和非root用户使用的命令。

### /boot: 静态bootloader文件

非共享静态目录，包含内核镜像、内存盘（ramdisk）镜像文件、启动器(bootloader)配置文件和bootloader stage（真不知道怎么翻译了，都懂的）文件。内核开始工作前，可能会执行一些用户空间程序，这些程序所需的数据也保存在/boot中。这些数据可能包括主引导扇区（boot sector）和扇区映射表（sector map）文件。

### /dev: 设备文件

系统启动期间udev和检测到硬件（产生相应事件）时创建的基本设备节点保存在该目录下。该目录突出了UNIX文件系统一个重要的特性——一切皆文件（或目录，其实目录也是文件）。查看这个目录，你会发现一大堆文件，每个文件代表系统的一个硬件组件。多数设备是块设备或字符设备，但也存在其他设备类型且可以被创建。一般来说，‘块设备’是保存或容纳数据的设备，而‘字符设备’可以被看成传送或转移数据的设备。例如，硬盘驱动器和光驱被归类为块设备而串行端口、鼠标和USB接口都是字符设备。

### /etc: 主机相关的配置

主机相关，不可共享的配置文件应当放在/etc目录。如果某个程序需要多个配置文件，通常的做法是用一个子目录存放，以尽可能保持/etc/目录的整洁。时常备份该目录是一个良好的习惯，因为它包含整个系统相关的配置文件。

#### /etc/X11

X视窗系统的配置文件

##### /etc/X11/xinit

xinit配置文件。'xinit'是一个启动X会话的配置方法，被设计成作为一个脚本的一部分来使用。

##### /etc/X11/xinit/xinitrc

全局xinitrc文件，被所有由xinit（startx命令）启动的X会话使用。该文件的设置会被位于用户家目录的.xinitrc文件覆盖。

### /home: 用户目录

UNIX是一个多用户环境。因此，每个用户都被分配了一个特定的目录，该目录只允许其所属的用户和root用户访问。这就是用户家目录，可以在'/home/$USER'（~/）下被找到。在其家目录中，用户可以写文件、删除它们、安装程序等等。用户的家目录包含他们的数据和个人配置文件，所谓的'点文件'（文件名前有一个点），这些'点文件'是隐藏文件。要查看点文件，需要打开文件管理器的相应选项或使用带-a开关的ls命令。如果个人配置文件和系统级配置文件有冲突，个人配置文件中的设置具有更高优先级。最终用户最可能更改的点文件包括.xinitrc和.bashrc文件，这两个文件分别用于配置xinit和Bash。它们允许用户能够改变窗口管理器，使其登录时就被启动，同时允许别名（alias），用户定义的命令和环境变量。当某个用户被创建时，系统会从/etc/shel目录，存放系统样本文件的目录，获取其点文件。

/home目录可能变得相当大，因为它通常用于存储下载、编译、安装、程序运行、邮件、多媒体集等文件。

### /lost+found: 文件系统相关的可恢复数据

类UNIX操作系统必须执行一个正常的关机流程。有时，系统可能会崩溃或断电会导致关机。没关系，下一次系统启动时，系统会使用fsck程序检测文件系统。Fsck会检测系统然后尝试恢复其找到的任何错误文件。该恢复操作的结果会被放在该目录下。恢复文件可能并不完整或不会其太大作用，但有可能会有有价值的东西被恢复。

### /mnt: 临时挂载点

该目录通常作为临时的文件系统或设备挂载点。挂载是一个使文件系统能被系统访问的步骤。挂载后，挂载点之下的文件就能被访问。其他挂载点（子目录）可以被创建在/mnt/之下。在系统任何地方都可以创建挂载点，并无限制，但从约定和实用性来讲，为防止扰乱系统，应当防止到处创建挂载点。

### /opt: 不确定的软件包

无法干净利落的纳入到GNU文件系统布局中去的软件包和大型静态文件都被放在/opt中。某软件将文件放到/opt中会创建一个和软件同名的文件夹。该文件夹转而存储文件，否则这些文件将散落在文件系统各处。

例如，acrobat软件包有Browser，Reader，Resource目录，位于其bin目录的同一级目录下。这不符合一个正常的GNU文件系统布局，所以Arch将所有的这些文件放到/opt的某个子目录下。

### /proc: 进程信息

/proc目录的特别之处在于它也是一个虚拟文件系统。它有时候被称为“进程信息伪文件系统”。它不包含‘真实’的文件，却包含运行时系统信息（例如系统内存、设备挂载、硬件配置等信息）。因此它可以被当做内核的控制和信息中心。实际上，相当多系统程序仅仅是对该目录中文件的调用。例如，‘lsmod’就是‘cat /proc/modules’而‘lspci’和‘cat /proc/pci’一样。系统运行时，改变该目录下的文件，内核参数可能被读取或改变（sysctl）。

该目录下的文件最有特点的一面是所有的文件大小都为零，除了kcore, mounts和self。

### /root: 管理员目录

系统管理员的家目录，'root'。这可能会有点令人困惑，（'根目录下的/root目录）但从历史上来讲，'/'是用户root的家目录（因此系统管理员的账号名叫root）。为保持规整，给用户'root'分配了一个家目录。但为什么不在'/home'中？因为'/home'经常位于不同的分区或者甚至在另一个系统上，因此当由于某些原因只挂载了'/'目录时，'/home'对于用户'root'可能是不可访问的。

### /run: 短暂的运行时数据

/run挂载点在系统启动早期被挂载，被当成一个tmpfs文件系统，在系统启动期间的任何时间，可被所有工具访问和写入。systemd、udev或mdadm这些系统启动早期必须的工具都需要这个目录，因为系统启动后期才实现了一个单独的文件系统/var。它取代了/var/run，而/var/run则变成了一个指向/run的链接。

### /sbin: 系统二进制文件

Arch 现在已经将/sbin合并到/usr/bin中。

### /srv: 服务数据

站点相关的数据，由系统提供。指出这点的主要目的是以便用户能找到特定服务的数据文件的位置。某些服务需要单个目录树来存放只读数据、可写数据和脚本（例如CGI脚本），指出这点能使其能够被合理的放置。某个用户的Data of interest应当放在该用户的家目录中。

### /tmp: 临时文件

该目录包含临时需要的文件。许多程序用其来生成锁文件和临时存储数据。不要删除该目录下的文件，除非你确切滴知道你在干什么！其中许多文件对当前正在运行的程序来说是重要的，删除它们可能造成系统崩溃。在大多数系统上，该目录中的老文件在系统启动时或日常空闲时间(daily intervals?)会被清除干净。

### /usr: 共享只读数据

根目录是首要文件系统，而/usr是第二层次系统，用于用户数据，包含大多数的(多)用户实用工具和程序。/usr是可共享的只读数据。这意味着/usr应当被共享给多个主机且必须不可写入，软件包管理员（安装，更新，升级）除外。任何主机相关或随时间变化的的信息都被存储在其他地方。

在一个系统中，除/home/之外，/usr/通常包含最大的共享数据。因此，这是系统中最重要的目录之一，因为它包含所有的用户二进制文件，其文档，库，头文件，等等。X和其支持库也在其中。用户程序如telnet，ftp等，也被放在此处。在原始的UNIX实现中，/usr/（为user而创建），是系统用户的家目录（也就是说，那时/usr/someone被当成/home/someone）。随着时间的推移，/usr/已经变成用户空间程序和数据（相对于'内核空间'程序和数据）的所在地。命名没有改变，但其意义变得狭长：从任何用户相关的变成用户可使用的程序和数据。据此，反向缩略语'User、System、Resources'被创造出来了。

#### /usr/bin: 二进制文件

命令的二进制文件。该目录包含你的系统上的绝大多数二进制文件（应用）。该目录遍布可执行文件。例如vi、gcc和gnome-session就在其中。传统上，其只包含不需要root权限且不需要单用户模式的二进制文件。然而，这已不再是强制的，且Arch开发者打算将所有的二进制文件移到此处。

#### /usr/include: 头文件

编译用户空间源代码需要的头文件。

#### /usr/lib: 库

注意: `/lib`目录变成了一个指向`/usr/lib`的链接。这里有相关消息。如果你在升级时遇到错误，请查阅DeveloperWiki:usrlib寻求解决方案。

包含应用私有数据（内核模块，systemd服务，udev规则，等等）和共享库镜像文件（C程序代码库）。库是频繁使用的程序例程，可通过文件名扩展*.so轻易地识别。它们基本系统功能的必要品。内核模块（驱动）在子目录/lib/modules/<kernel-version>中。

#### /usr/sbin: 系统二进制文件

该目录包含系统管理员使用的非必备系统二进制文件。此处用于存放系统的网络守护程序和那些（通常）只能被系统管理员访问但并非系统维护必须的的二进制文件。Arch开发者计划将/usr/sbin中的所有二进制文件移动到/usr/bin中。

#### /usr/share: 架构相关数据

该目录包含'可共享的'，架构相关的文件（文档，图标，字体等）。注意：然而，其他操作系统或相同操作系统的其他发行版通常并不共享'/usr/share'目录。任何包含或需要不被改变的数据的程序或软件包应该将这些数据保存在'/usr/share'（或'/usr/local/share'，如果是手动安装的话——见下）。推荐在/usr/share下使用一个子目录以达成此目的。

#### /usr/src: 源代码

'linux'子目录下保存了Linux内核源代码和头文件。

#### /usr/local: 本地层次系统

可选的用于本地数据的第三层次系统。'/usr/local'的原始想法是为了让每台机器除'/usr/'之外还拥有一个独立的（'local'）'/usr'目录，该目录可能被只读挂载到别的地方。它复制了'/usr/'目录的结构。目前，'/usr/local/'被广泛认为是一个存放自己编译的或第三方的程序的好地方。Arch Linux中，该目录默认情况下式空目录。如果想的话，可以用来安装手工编译的软件。pacman会将软件安装到/usr/目录，因此，手动编译/安装的软件放在/usr/local可能能和pacman跟踪系统中的软件和平共处。

### /var: 可变文件

可变文件，例如日志文件，管道文件，和临时e-mail文件。在Arch上，ABS树和pacman缓存也在其中。为什么不将可变和临时文件放到/usr/中？因为可能会遇到/usr/以只读方式挂载的情况，例如如果它在一张CD上或其他电脑上。'/var'包含可变数据，例如文件和目录允许系统在操作期间能写入，而/usr/应当只包含静态数据。某些目录被放在独立的分区或系统上，因为它们在系统启动过程中至关重要。'可挂载'目录有：'/home'、'/mnt'、'/tmp'、'/usr'和'/var'。系统启动必须的有：'/bin'、'/boot'、'/dev'、'/etc'、'/lib'、'/proc'和'/sbin'。

#### /var/abs

ABS树。一个类似于ports包含构建脚本的包管理系统，该目录包含带所有可安装的Arch软件相应子目录。

#### /var/cache/pacman/pkg

pacman包缓存。

#### /var/lib: 状态信息

程序运行时修改的永久数据（如数据库，包管理系统元数据等）。

#### /var/log: 日志文件

日志文件。

#### /var/mail: 用户邮件

用户邮箱目录，可共享。

#### /var/spool: 队列

等待被执行的任务的管道（如打印队列和未读邮件）。

##### /var/spool/mail

用户邮箱路径，已废弃.

#### /var/tmp: 可保存的临时文件

两次重启之间需要保存的文件。

## 另见

- wikipedia:Filesystem Hierarchy Standard

Category:

- File systems (简体中文)