FHS 3.0 翻译

本文翻译自 FHS 3.0,谷歌翻译稍加调整整理如下,本人英语渣渣,不到位的地方还请见谅。

第一章:介绍

1.1. 目的

该标准可以使:

  • 软件预测已安装文件和目录的位置,以及
  • 用户预测已安装文件和目录的位置。

我们通过以下工作来实现上面的目标:

  • 为文件系统的每个区域指定指导原则,
  • 指定最少的必备文件和目录,
  • 列出指导原则的例外情况,以及
  • 列出发生历史冲突的具体案例。

FHS 文档可用于以下几个方面:

  • 独立软件提供商可以根据 FHS 文档创建遵循 FHS 的应用程序,并运行在遵循 FHS 的 Linux 发行版上,
  • 操作系统创建者可以根据 FHS 文档创建遵循 FHS 的操作系统,以及
  • 用户可以根据 FHS 文档了解并维护系统的 FHS 合规性。

FHS 文档的范围有限:

  • 本地文件的存放是本地范围内的事情,因此 FHS 不会试图篡夺系统管理员的工作。
  • FHS 解决了需要在多处(例如本地站点、发行版、应用程序、文档等)之间协调文件放置的问题。

1.2. 约定

我们建议您阅读本文档的排版版本,而不是纯文本版本。在排版版本中,文件和目录的名称以等宽字体显示。

不同的文件名组件由包含在“<”和“>”字符中的内容描述表示,如 。电子邮件地址也包含在“<”和“>”中,但以通常的字体显示。

文件名的可选组成部分包含在“[”和“]”字符中,并且可以与“<”和“>”约定结合使用。例如,如果允许文件名带有或不带有扩展名,则它可能由 [.]

目录名和文件名的可变子串用“\*”表示。

文本中标记为 Rationale(基本原理)的部分是解释性的,不是规范性的。

第二章:文件系统

该标准假设 FHS 兼容文件系统的操作系统支持与大多数 UNIX 文件系统相同的基本安全功能。

可以在文件之间定义两个独立的区别:可共享的不可共享的,以及可变的静态的。通常,在这些方面不同的文件应该位于不同的目录中。这使得在不同的文件系统上存储具有不同使用特征的文件变得容易。

可共享文件是那些可以存储在一台主机上并可以供其他主机使用的文件。不可共享文件是那些不可共享的文件。例如,用户主目录中的文件是可共享的,而设备锁定文件则不是。

静态文件包括二进制文件、库、文档文件和其他在没有系统管理员干预的情况下不会更改的文件。可变文件是非静态文件。

基本原理

可共享文件可以存储在一台主机上并在其他几台主机上使用。然而,通常情况下,并非文件系统层次结构中的所有文件都是可共享的,因此每个系统都有至少包含其不可共享文件的本地存储。如果系统所需的存储在外部主机上所有文件都可以通过从外部主机挂载一个或几个目录来提供就非常方便。

静态文件与可变文件应该分开,因为与可变文件不同,静态文件可以存储在只读介质上,不需要按照与可变文件相同的时间表进行备份。

老旧的类 UNIX 文件系统在 /usr/etc 下同时含有静态文件和可变文件。为了实现上面所述的优点就创建了 /var,且 /usr 中的所有可变文件转移到了 /var 中。因此,/usr 现在可以以只读方式挂载(如果它是一个单独的文件系统)。后来在技术的允许下,/etc 中的可变文件到也已经转移到了 /var 中。

以下是一个兼容 FHS 的系统示例。(也可以是其他符合 FHS 的布局。)

[图片上传失败...(image-273a7d-1637326509763)]

第三章:根文件系统

3.1. 目的

根文件系统的内容必须足以启动、(备份后)恢复(restore)、故障后的恢复(recover)和/或修复系统。

  • 要启动系统,根分区上必须存在足够的软件和数据以挂载其他文件系统。这包括实用工具(utilities)、配置、启动加载程序的信息和其他重要的启动数据。 /usr/opt、 和 /var被设计为可以位于其他分区或文件系统上。
  • 为了能够恢复(recovery)和/或修复系统,根文件系统中必须要有那些可供运维人员进行诊断和重建损坏系统的实用工具。
  • 要恢复(restore)系统,根文件系统中必须存在那些用于从系统备份(软盘、磁带等)中恢复的实用工具。

根文件系统的最低要求应该尽可能小,但不能更小。虽然许多用户可能不想要让分区系统更加复杂,但出于以下几个原因,应该保持根目录的最小化:

  • 有时候会从非常小的介质上安装系统。
  • 根文件系统包含许多特定于系统的配置文件。比如,包括特定于系统的内核、特定主机名等。这意味着根文件系统并不总是可在网络系统之间共享。在服务器上保持较小根文件系统可以最大限度地减少不可共享文件区域的空间丢失。根文件系统可以使工作站具有较小的本地硬盘驱动器。
  • 虽然您可以将根文件系统放在一个大分区上,这样会让人觉得心满意足,但有人的分区就很小。如果您在大分区上的根文件系统中安装了很多文件,可能会与那些在较小分区上使用根文件系统的其他系统不兼容。如果您是开发人员,那么可以将这个假设类推到大量用户的情形。
  • 损坏根文件系统上数据的磁盘错误比任何其他分区上的错误都要严重。小型根文件系统不太容易因系统崩溃而损坏。

为了能够启动以及从故障中恢复,上述考量必须与最低限度的操作环境相平衡。

应用程序不得在根目录中创建或使用特定的文件或子目录。FHS 层次结构中的其他位置为应用程序提供了足够的灵活性。(看见没,以后少在根目录下创建目录和文件吧)。

基本原理

禁止创建在根文件系统的子目录有以下几个原因:

  • 这样会占用根文件系统所在分区的空间,出于性能或安全原因,系统管理员可能希望该空间尽可能小而简单。
  • 这让系统管理员跨多个挂载卷来部署标准文件层次结构而犯难。

如果没有非常仔细地考虑后果(包括应用程序可移植性),(操作系统的)发行版不应在根层次结构中创建新目录。

3.2. 必要目录

下列目录或指向目录的符号链接是 / 中必须的。

目录 描述
bin 重要(Essential)命令的二进制文件
boot 引导加载程序的静态文件
dev 设备文件
etc 特定于主机的系统配置
lib 重要的(Essential)共享库和内核模块
media 可移动媒体的挂载点
mnt 用于临时挂载文件系统的挂载点
opt 附加应用程序软件包
run 与正在运行的进程相关的数据
sbin 重要的(Essential)系统二进制文件
srv 本系统提供的服务数据
tmp 临时文件
usr 二级层次结构
var 可变数据

上面列出的每个目录都在下面单独的小节中详细说明。其中,/usr/var 这两个目录由于比较复杂,所以在本文档中都有对应的完整描述。

3.3. 特定选项

如果安装了相应的子系统,则以下目录或目录的符号链接必须出现在 / 中:

目录 描述
home 用户主目录(可选)
lib 替代格式的重要共享库(Alternate format essential shared libraries)(可选)
root root 用户的主目录(可选)

上面列出的每个目录都在下面的单独小节中详细说明。

3.4. 重要用户命令库(供所有用户使用)

3.4.1 目的

/bin 包含系统管理员和用户都可以使用的命令,但是当没有安装其他文件系统时(例如在单用户模式下),这些命令是必需的。它还可能包含脚本间接使用的命令。[1]

3.4.2. 必要内容

/bin 中决不能有子目录。/bin 目录中必须存在以下命令、或命令的符号链接。

命令 描述
cat 将文件内容输出到标准输出
chgrp 更改文件的所属群组
chmod 更改文件的访问权限
chown 更改文件的所属用户和所属群组
cp 复制文件和目录
date 打印或设置系统日期和时间
dd 转换和复制文件
df 报告文件系统的磁盘使用情况
dmesg 打印或控制内核消息 buffer
echo 显示一行文本
false 不成功时不做任何事
hostname 显示或设置系统的主机名
kill 将进程发送某种信号
ln 在文件之间建立链接
login 在系统上开启一个登录会话
ls 列出目录内容
mkdir 创建目录
mknod 创建块或字符特定文件
more 按页输出文本
mount 挂载文件系统
mv 移动或重命名文件
ps 报告进程状态
pwd 打印当前工作目录
rm 删除文件或目录
rmdir 删除空目录
sed sed 流编辑器
sh 兼容 POSIX 的命令 shell
stty 更改和打印终端中的行设置
su 切换用户
sync 刷新文件系统缓冲区
true 不做任何事,成功时
umount 卸载(unmount )文件系统
uname 打印系统信息

如果 /bin/sh 不是兼容 POSIX 的 shell,就必须是链接到真正 shell 命令的硬链接或软链接。

[test 命令必须一起放在 /bin/usr/bin 中。

基本原理

被称为 sh 的各种 shell 的行为各不相同,以便在需要时允许对 POSIX 进行更改或扩展的同时保留 POSIX 兼容性。
POSIX.1-2008 标准共享将 [test 命令当作必须要包含的二进制文件(即使由 shell 在内部实现)。

3.4.3. 特定选项

如果安装了相应的子系统,则 /bin 中必须包含以下程序或程序的符号链接:

命令 描述
csh C shell(可选)
ed ed 编辑器(可选)
tar tar 归档工具(可选)
cpi cpio 归档工具(可选)
gzip GNU 压缩工具(可选)
gunzip GNU 解压缩工具(可选)
zcat GNU 解压缩工具(可选)
netstat 网络统计工具(可选)
ping ICMP 网络测试工具(可选)

/bin/csh 可能是一个链接到 /bin/tcsh/usr/bin/tcsh 的符号链接。

基本原理

添加了 targzipcpio 命令,系统恢复(restoration)成为可能(前提是 / 完好无损)。

相反,如果不需要从根分区恢复,那么这些二进制文件可能会被忽略(例如,ROM 芯片根,通过 NFS 挂载 /usr)。如果计划通过网络恢复系统,则 ftptftp(以及获得 ftp 连接所需的一切)必须在根分区上可用。

3.5. /boot:启动加载程序的静态文件

3.5.1. 目的

除了启动时不需要的配置文件和映射安装程序(在 /etc 中)以外,/boot 目录包含了启动过程所需的所有内容。因此,/boot 存储在内核开始执行用户模式程序之前使用的数据。这可能包括保存的主引导扇区和扇区映射文件。

使引导加载程序能够引导文件的程序必须放在 /sbin 目录中。启动时不需要的启动加载程序的配置文件必须放在 /etc 中。

3.5.2. 特定选项

操作系统内核必须位于 / 中或 /boot 中。

某些架构可能对 /boot 有其他要求,这些要求与这些架构中特定的限制或期望相关。这些要求在此不一一列举;允许发行版根据需要添加此类要求以在这些架构上可以启动系统。

3.6. /dev:设备文件

3.6.1. 目的

/dev 目录是特殊文件或设备文件的位置。

3.6.2. 特定选项

如果可能 /dev 中的设备需要手动创建,则 /dev 必须包含名为的命令 MAKEDEV,该命令可以根据需要创建设备。它还可能包含 MAKEDEV.local 用于任何本地设备的。

如果需要,MAKEDEV 必须准备好创建可以在系统上找到的任何设备,而不仅仅是特定发行版的设备。

3.7. /etc:主机特定的系统配置

3.7.1. 目的

/etc 层次结构中含有配置文件。配置文件是用于控制程序运行的本地文件;它必须是静态的,不能是可执行的二进制文件。[2]

建议将文件存储 /etc 中的子目录中,而不是直接存储在 /etc 目录中。

3.7.2. 必要内容

/etc 中不能含有二进制文件。

/etc 中必须包含下列目录或链接到目录的符号链接:

目录 描述
opt /opt 的配置

3.7.3. 特定选项

如果安装了相应的子系统,则 /etc 必须包含以下目录或链接到目录的符号链接:

目录 描述
X11 X Windows 系统的配置(可选)
sgml SGML 的配置(可选)
xml XML 的配置(可选)

如果安装了相应的子系统,则 /etc 目录中必须包含以下文件或链接到文件的符号链接 :[3]

文件 描述
csh.login 用于 C shell 登录的系统范围的初始化文件(可选)
exports NFS 文件系统访问控制列表(可选)
fstab 文件系统相关的静态信息(可选)
ftpusers FTP 守护进程用户访问控制列表(可选)
gateways 列出路由网关的文件(可选)
gettydefs getty 使用的速度和终端设置(可选)
group 用户群组文件(可选)
host.conf 解析器配置文件(可选)
hosts 关于主机名的静态信息(可选)
hosts.allow TCP 包装器的主机访问文件(可选)
hosts.deny TCP 包装器的主机访问文件(可选)
hosts.equiv rloginrshrcp 的可信主机列表(可选)
hosts.lpd lpd 的可信主机列表(可选)
inetd.conf inetd 的配置文件(可选)
inittab init 的配置文件(可选)
issue 登录前消息和身份文件(可选)
ld.so.conf 用于搜索共享库的额外目录列表(可选)
motd 当天文件的登录后消息(可选)
mtab 有关文件系统的动态信息(可选)
mtools.conf mtools 的配置文件(可选)
networks 关于网络名称的静态信息(可选)
passwd 密码文件(可选)
printcap lpd 打印机能力数据库(可选)
profile 用于 sh shell 登录的系统范围初始化文件(可选)
protocols IP 协议列表(可选)
resolv.conf 解析器配置文件(可选)
rpc RPC 协议列表(可选)
securetty 根登录的 TTY 访问控制(可选)
services 网络服务的端口名称(可选)
shells 有效登录 shell 的路径名(可选)
syslog.conf syslogd 的配置文件(可选)

mtab 不符合 /etc 的静态性质:由于历史原因,它被排除在外。[4]

3.7.4. /etc/opt:/opt 的配置文件

3.7.4.1. 目的

用于附加应用软件包的主机特定配置文件必须安装在 /etc/opt/ 目录中,其中 /opt 中的子树的名称,该子树中存储了该软件包的静态数据。

3.7.4.2. 必要内容

/etc/opt/ 的内部安排没有强加任何结构。如果配置文件必须驻留在不同的位置才能使包或系统正常运行,则可以将其放置在 /etc/opt/ 以外的位置。

基本原理

请参考 /opt 的基本原理。

3.7.5. /etc/X11:用于 X Window 的配置(可选)

3.7.5.1. 目的

/etc/X11 是所有 X11 主机特定的配置所在的位置,如果 /usr 目录挂载为只读,则此目录是进行本地控制所必需的。

3.7.5.2. 特定选项

如果安装了相应的子系统,则 /etc/X11 必须包含以下文件或文件的符号链接:

文件 描述
xorg.conf 和更高版本的 X.org 的配置文件(可选)
Xmodmap 全局 X11 键盘配置修改文件(可选)

/etc/X11 的子目录可以包含用于 xdm 的文件和其他程序(比如一些窗口管理器)所需的文件。[5]

3.7.6. /etc/sgml:用于 SGML 的配置文件(可选)

3.7.6.1. 目的

定义 SGML 系统高级参数的通用配置文件安装在这里。带有 *.conf 名称的文件表示通用配置文件。带有 *.cat 名称的文件是特定于 DTD 的集中目录(catalog),包含对给定 DTD 所需的所有其他目录(catalog)的引用。超级目录文件 catalog 引用所有集中目录(catalog)。

3.7.7. /etc/xml:用于 XML 的配置文件(可选)

3.7.7.1. 目的

定义 XML 系统高级参数的通用配置文件安装在此处。带有 *.conf 名称的文件表示通用配置文件。超级目录(catalog)文件 catalog 引用所有集中目录(catalog)。

3.8. /home:用户主目录(可选)

3.8.1. 目的

/home 是一个相当标准的概念,但它显然是一个特定于站点的文件系统。 [6] 该目录的设置会因主机而异。因此,任何程序都不应该假设主目录的任何特定位置,而应该查询它。 [7]

3.8.2. 必要内容

应用程序的用户特定配置文件存储在用户主目录中以“.”开头的文件(点文件)中。如果应用程序需要创建多个点文件,则应将它们放在名称以“.”开头的子目录(点目录)中。在这种情况下,配置文件不应以“.”开头。[8]

3.8.3. 主目录的规范和约定

过去已经做出了许多努力来标准化主目录的布局,包括 XDG Base 目录规范 [9] 和关于用户目录内容的 GLib 约定。 [10] 未来可能会在这方面做出更多努力。为了适应使用这些规范和约定的软件,发行版可以创建遵循规范和约定的目录层次结构。这些目录层次结构可能位于主目录下。

3.9. /lib:重要的(Essential)共享库和内核模块

3.9.1. 目的

/lib 目录包含引导系统和运行根文件系统中的命令所需的那些共享库镜像,即,通过 /bin/sbin 中的二进制文件。 [11]

3.9.2. 必要内容

至少需要以下每种文件名模式之一(它们可能是文件或符号链接):

文件 描述
libc.so.* 动态链接的 C 库(可选)
ld* 执行时间的链接器/加载器(可选)

如果安装了 C 预处理器 ,出于历史原因,/lib/cpp 必须是对它的引用。[12]

3.9.3. 特定选项

如果安装了相应的子系统,则以下目录或目录的符号链接必须在 /lib 中:

目录 描述
modules 可加载的内核模块(可选)

3.10. /lib:替代格式基本共享库(可选)

3.10.1. 目的

在支持不止一种二进制格式的系统上,/lib 目录可能有一个或多个变体,需要单独的库。 [13]

如果存在这些目录中的一个或多个,则对其内容的要求与正常的 /lib 目录相同,只是不需要 /lib/cpp。 [14]

3.11. /media:可移动媒体的挂载点

3.11.1. 目的

此目录包含用作可移动媒体(如软盘、cdromzip 磁盘)的挂载点的子目录。

基本原理

历史上有许多其他不同的地方被用于挂载可移动媒体,例如 /cdrom/mnt/mnt/cdrom。将所有可移动媒体的挂载点直接放在根目录中可能会导致在 / 目录中出现大量额外目录。尽管最近使用 /mnt 中的子目录作为挂载点很常见,但它与直接使用 /mnt 作为临时挂载点的古老传统相冲突。

3.11.2. 特定选项

如果安装了相应的子系统,以下目录或目录的符号链接必须在 /media 中:

目录 描述
floppy 软驱(可选)
cdrom CD-ROM 驱动器(可选)
cdrecorder CD 刻录机(可选)
zip Zip 驱动器(可选)

在存在多个设备用于挂载某种类型的媒体的系统上,挂载目录可以通过在上面可用的名称后附加一个数字来创建,以“0”开头,但非限定名称也必须存在。[15]

3.12. /mnt:临时挂载的文件系统的挂载点

3.12.1. 目的

提供此目录是为了系统管理员可以根据需要临时挂载文件系统。此目录的内容是本地问题,不应影响任何程序的运行方式。安装程序不得使用此目录:必须改用系统未使用的合适临时目录。

3.13. /opt : 附加应用程序软件包

3.13.1. 目的

/opt 保留用于安装附加应用程序软件包。

要安装在 /opt 中的软件包必须在单独的 /opt//opt/ 目录树中定位其静态文件,其中 是描述软件包的名称, 是提供商的 LANANA 注册名称。

3.13.2. 必要内容

目录 描述
静态包对象
LANANA 注册提供商名称

目录 /opt/bin/opt/doc/opt/include/opt/info/opt/lib/opt/man 保留供本地系统管理员使用。(应用程序软件)包可能提供旨在由本地系统管理员放置(通过链接或复制)这些保留目录中的“前端”(front-end)文件,但必须在没有这些保留目录的情况下正常运行。

用户要调用的程序必须位于目录 /opt//bin/opt/ 层次结构下。如果(应用程序软件)包包含 UNIX 手册页,它们必须位于 /opt//share/man/opt/ 层次结构下,并且必须使用与 /usr/share/man 相同的子结构。

可变的(应用程序软件)包文件(正常操作中的更改)必须安装在 /var/opt 中。有关更多信息,请参阅有关 /var/opt 的部分。

特定于主机的配置文件必须安装在 /etc/opt 中。有关更多信息,请参阅有关 /etc 的部分。

除了那些必须驻留在文件系统树中特定位置才能正常运行的(应用程序软件)包文件之外,在 /opt/var/opt/etc/opt 层次结构之外不得存在其他(应用程序软件)包文件。例如,设备锁定文件必须放在 /var/lock 中,设备必须位于 /dev 中。

发行版可以在 /opt 中适当注册的子目录下安装和以其他方式管理软件。

基本原理

/opt 用于附加软件是 UNIX 社区中一种成熟的做法。 System V 应用程序二进制接口 [AT&T 1990] 基于 System V 接口定义(第三版),提供了一个与此处定义的非常相似的 /opt 结构。

Intel Binary Compatibility Standard v. 2(iBCS2)也为 /opt 提供了类似的结构。

通常,支持系统上的软件包所需的所有数据都必须存在于 /opt/ 中,包括旨在复制到 /etc/opt//var/opt/ 中的文件以及 /opt 中的保留目录。

对使用 /opt 的发行版进行一些小限制是必要的,因为发行版安装的软件和本地安装的软件之间可能会发生冲突,特别是在某些二进制软件中找到固定路径名的情况下。

/opt/ 下面的目录结构由软件打包者决定,尽管建议将软件包安装在 /opt// 中,并遵循与 /opt/ 指南类似的结构 。与此结构不同的一个有效原因是支持包可能在 /opt//lib/opt//bin 中安装了文件。

3.14. /root:root 用户的主目录(可选)

3.14.1. 目的

root 帐户的主目录可能由开发人员或本地偏好决定,但这是推荐的默认位置。[16]

3.15. /run:运行时可变数据

3.15.1. 目的

此目录包含描述系统自启动以来的系统信息数据。该目录下的文件必须在引导过程开始时清除(根据需要删除或截断)。

该目录的用途曾经由 /var/run 提供。通常,为了向后兼容,程序可能会继续使用 /var/run 来满足为 /run 设定的要求。已迁移到使用 /run 的程序应停止使用 /var/run,除非在 /var/run 部分中有所说明。

在一些 Linux 发行版(比如 CentOS 7)中,/var/run 是一个执行 /run 的符号链接。

应用程序可能在 /run 中有一个子目录。对于使用多个运行时文件的程序,鼓励这样做。用户也可能有 /run 的子目录,但必须注意适当限制访问权限以防止未经授权使用 /run 本身和其他子目录。[17]

3.15.2. 必要内容

进程标识符(PID)文件最初放在 /etc 中,现在必须放在 /run 中。 PID 文件的命名约定是 .pid。例如,crond PID 文件名为 /run/crond.pid

PID 文件的内部格式保持不变。该文件必须包含 ASCII 编码的十进制进程标识符,后跟一个换行符。例如,如果 crond 是进程号 25,则 /run/crond.pid 将包含三个字符:二、五和换行符。

读取 PID 文件的程序在接受的内容方面应该有些灵活;即,它们应该忽略额外的空格、前导零、缺少尾随换行符或 PID 文件中的其他行。创建 PID 文件的程序应使用上一段中的简单规范。

维护瞬态 UNIX 域套接字的系统程序必须将它们放在这个目录或上述适当的子目录中。

3.16. /sbin:系统二进制文件

3.16.1. 目的

用于系统管理(和其他仅限 root 的命令)的实用程序存储在 /sbin/usr/sbin/usr/local/sbin 中。除了 /bin 中的二进制文件之外,/sbin 还包含启动、恢复(restoring)、恢复(recovering)和/或修复系统所必需的二进制文件。 [18] 得知 /usr 挂载之后而执行的程序(当没有问题时)一般放在 /usr/sbin 中。本地安装的系统管理程序应该放在 /usr/local/sbin 中。 [19]

3.16.2. 必要内容

/sbin 中不能有子目录。

/sbin 中需要以下命令或命令的符号链接:

命令 描述
shutdown 命令关闭系统

3.16.3. 特定选项

如果安装了相应的子系统,则以下文件或文件的符号链接必须在 /sbin 中:

命令 描述
fastboot 重新启动系统而不检查磁盘(可选)
fasthalt 停止系统而不检查磁盘(可选)
fdisk 分区表操作器(可选)
fsck 文件系统检查和修复实用程序(可选)
fsck.* 特定文件系统的文件系统检查和修复实用程序(可选)
getty getty 程序(可选)
halt 停止系统的命令(可选)
ifconfig 配置网络接口(可选)
init 初始化流程(可选)
mkfs 构建文件系统的命令(可选)
mkfs.* 构建特定文件系统的命令(可选)
mkswap 设置交换区的命令(可选)
reboot 重启系统的命令(可选)
route IP 路由表实用程序(可选)
swapon 启用分页和交换(可选)
swapoff 禁用分页和交换(可选)
update 守护进程定期刷新文件系统缓冲区(可选)

3.17. /srv:本系统提供的服务数据

3.17.1. 目的

/srv 包含此系统提供的特定于站点的数据。

基本原理

指定此项的主要目的是为了让用户可以找到特定服务的数据文件的位置,并且可以合理放置需要单个树的只读数据、可写数据和脚本(例如 cgi 脚本)的服务。仅特定用户感兴趣的数据应该放在该用户的主目录中。如果数据的目录和文件结构没有暴露给消费者,它应该放在 /var/lib 中。

用于命名 /srv 的子目录的方法未指定,因为目前尚未就如何完成此操作达成共识。在 /srv 下构造数据的一种方法是通过协议,例如,ftprsyncwwwcvs。在大型系统上,通过管理上下文来构建 /srv 会很有用,例如 /srv/physics/www/srv/compsci/cvs 等。此设置将因主机而异。因此,任何程序都不应依赖 /srv 现有的特定子目录结构或必须存储在 /srv 中的数据。但是,/srv 应始终存在于 FHS 兼容系统上,并应该用作此类数据的默认位置。

发行版必须注意不要在没有管理员许可的情况下删除这些目录中本地放置的文件。[20]

3.18. /tmp:临时文件

3.18.1. 目的

/tmp 目录必须可供需要临时文件的程序使用。

程序不得假定 /tmp 中的任何文件或目录在程序调用之间都保留了下来。

基本原理

IEEE 标准 POSIX.1-2008 列出了与上述部分类似的要求。

尽管存储在 /tmp 中的数据可能会以特定于站点的方式被删除,但建议在系统启动时删除位于 /tmp 中的文件和目录。

FHS 根据历史先例和惯例添加了此建议,但并未将其作为一项要求,因为系统管理不在本标准的范围内。


引用

[1] 不能放入 /bin 中的命令二进制文件必须放入 /usr/bin 中。仅由非 root 用户(X Window System、chsh 等)需要的条目通常不足以放入 root 分区。

[2] 需要明确的是,/etc 可能包含可执行脚本,例如 init 通常调用的命令脚本来启动和关闭系统以及启动守护进程。在此上下文中,“可执行二进制文件”是指非人类可读格式的直接机器代码或伪代码,例如本机 ELF 可执行文件。

[3] 使用遮盖密码套件的系统将在 /etc/etc/shadow 等),以及在 /usr/sbin 中的程序(useraddusermod 等)中具有额外的配置文件。

[4] 在某些 Linux 系统上,这可能是指向 /proc/mounts 的符号链接,在这种情况下,不需要此异常。

[5] /etc/X11/xdm 保存 xdm 的配置文件。这些是以前在 /usr/lib/X11/xdm 中找到的大部分文件。 xdm 的一些局部变量数据存储在 /var/lib/xdm 中。

[6] 不同的人更喜欢将用户帐户放置在不同的地方。本节仅描述用户主目录的建议放置位置;尽管如此,我们建议所有符合 FHS 的发行版都使用它作为用户主目录的默认位置。出于管理目的而创建的非登录帐户通常在其他地方拥有它们的主目录。

在较小的系统上,每个用户的主目录通常作为 /home 下的子目录直接实现,例如 /home/smith/home/torvalds/home/operator 等。在大型系统上(特别是当 /home 目录共享时)在许多使用 NFS 的主机中)细分用户主目录很有用。细分可以通过使用子目录来完成,例如 /home/staff/home/guests/home/students 等。

[7] 要查找用户的主目录,请使用 fgetpwentgetpwentgetpwent_r 等库函数,而不是依赖 /etc/passwd,因为用户信息可能会使用 NIS 等系统远程存储。

[8] 建议除了自动保存和锁定文件外,程序应避免在未经用户同意的情况下在主目录中创建非点文件或目录。

[9] 可在 http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 和 http://www.freedesktop.org/wiki/Software/xdg-user-dirs 找到。

[10] GLib 约定的描述可以在 GUserDirectory 的文档中找到,网址为 http://developer.gnome.org/glib/unstable/glib-Miscellaneous-Utility-Functions.html#GUserDirectory。

[11] 只有 /usr 中的二进制文件(例如任何 X Window 二进制文件)才需要的共享库不能在 /lib 中。这里可能只有在 /bin/sbin 中运行二进制文件所需的共享库。特别是,如果 /bin/sbin 中的任何内容都不需要,库 libm.so.* 也可以放在 /usr/lib 中。

[12] 这个二进制文件的通常位置是 /usr/bin/cpp

[13] 这通常用于支持多种二进制格式但需要同名库的系统上的 64 位或 32 位支持。在这种情况下, /lib32/lib64 可能是库目录,而 /lib 是其中之一的符号链接。

[14] /lib/cpp 仍然是允许的:这允许 /lib/lib 相同的情况(一个是到另一个的符号链接)。

[15] 具有两个 CDROM 驱动器的兼容发行版可能具有 /media/cdrom0/media/cdrom1 以及 /media/cdrom 到其中任何一个的符号链接。

[16] 如果 root 帐户的主目录未存储在 root 分区上,如果无法定位,则有必要确保它默认为 /

我们建议不要将 root 帐户用于可以作为非特权用户执行的任务,而应仅将其用于系统管理。出于这个原因,我们建议邮件和其他应用程序的子目录不要出现在 root 帐户的主目录中,并将管理角色(例如 root、postmaster 和 webmaster)的邮件转发给适当的用户。

[17] /run 对于非特权用户不应该是可写的;如果任何用户都可以在此目录中写入,这是一个主要的安全问题。特定于用户的子目录应该只能由每个目录的所有者写入。

[18] 最初,/sbin 二进制文件保存在 /etc 中。

[19] 决定什么东西进入“sbin”目录很简单:如果普通(不是系统管理员)用户会直接运行它,那么它必须放在“bin”目录之一中。普通用户不必在他们的路径中放置任何 sbin 目录。

比如 chfn 等用户只是偶尔使用的文件,还是必须放在 /usr/bin 下。 ping,虽然它对 root 是绝对必要的(网络恢复和诊断),但用户经常使用它,因此必须位于 /bin 中。

我们建议用户对 /sbin 中的所有内容都具有读取和执行权限,某些 setuidsetgid 程序除外。 /bin/sbin 之间的划分不是出于安全原因或防止用户看到操作系统,而是为了在每个人都使用的二进制文件和主要用于管理任务的二进制文件之间提供一个良好的分区。禁止用户访问 /sbin 并没有内在的安全优势。

[20] 这一点特别重要,因为这些区域通常包含最初由发行版安装的文件和由管理员添加的文件。

第四章:/user 层级结构

4.1. 目的

/usr 是文件系统的第二个主要部分。/usr 是可共享的只读数据。这意味着 /usr 应该可以在各种符合 FHS 的主机之间共享,并且不得写入。任何特定于主机或随时间变化的信息都存储在别处。

大型软件包不得使用 /usr 层次结构下的直接子目录。

4.2. 必要内容

/usr 中需要以下目录或目录的符号链接。

目录 描述
bin 大多数用户命令
lib
local 本地层次结构(主安装后为空)
sbin 非重要系统二进制文件
share 与架构无关的数据

4.3. 特定选项

目录 描述
games 游戏和教育二进制文件(可选)
include C 程序包含的头文件
libexec 其他程序运行的二进制文件(可选)
lib 替代格式库(可选)
src 源代码(可选)

由于大量的先例和广泛接受的实践,X Window 系统是一个例外。

可能存在以下指向目录的符号链接。这种可能性是基于需要保持与旧系统的兼容性,直到可以假定所有发行版都使用 /var 层次结构。

    /usr/spool -> /var/spool
    /usr/tmp -> /var/tmp
    /usr/spool/locks -> /var/lock

一旦系统不再需要上述任何一种符号链接,如果需要,可以删除该链接。

4.4. /usr/bin:大多数的用户命令

4.4.1. 目的

这是系统上可执行命令的主目录。

4.4.2. 必要内容

/usr/bin 中不能有子目录。

4.4.3. 特定选项

如果安装了相应的子系统,则以下文件或文件的符号链接必须在 /usr/bin 中:

命令 描述
perl 实用提取和报告语言(可选)
python Python 解释型语言(可选)
tclsh 包含 Tcl 解释器的简单 shell(可选)
wish 简单的 Tcl/Tk 窗口外壳(可选)
expect 交互式对话程序(可选)

基本原理

在许多可执行脚本中,要调用以执行脚本的解释器是在脚本的第一行使用 #!path_to_interpreter 指定的。为了使这些脚本在不同系统之间可移植,标准化解释器位置是有利的。shell 解释器已经被这个规范固定在 /bin 中,但是 Perl、Python、Tcl 和 expect 的解释器可能安装在不同的地方。此处指定的位置可以实现为到解释器物理位置的符号链接。

4.5. /usr/include:标准包含文件的目录

4.5.1. 目的

这是所有系统通用的 C 编程语言的包含文件应该放置的地方。

4.5.2. 特定选项

如果安装了相应的子系统,以下目录或目录的符号链接必须在 /usr/include 中:

目录 描述
bsd BSD 兼容性包含文件(可选)

4.6. /usr/lib:用于编程和程序包的库

4.6.1. 目的

/usr/lib 包括目标文件和库。[21] 在某些系统上,它还可能包含不打算由用户或 shell 脚本直接执行的内部二进制文件。[22]

应用程序可以使用 /usr/lib 下的单个子目录。如果应用程序使用子目录,则该应用程序专门使用的所有与体系结构相关的数据都必须放置在该子目录中。[23]

4.6.2. 特定选项

由于历史原因,/usr/lib/sendmail 必须是一个符号链接,它解析为系统邮件传输代理提供的与 sendmail 兼容的命令,如果后者存在的话。[24] [25]

4.7. /usr/libexec:其他程序所运行的二进制文件(可选)

4.7.1. 目的

/usr/libexec 包含不打算由用户或 shell 脚本直接执行的内部二进制文件。应用程序可以使用 /usr/libexec 下的单个子目录。

以这种方式使用 /usr/libexec 的应用程序不得也使用 /usr/lib 来存储内部二进制文件,尽管它们可以将 /usr/lib 用于此处记录的其他目的。

基本原理

本文档的一些先前版本不支持 /usr/libexec,尽管它是许多环境中的标准做法。[26] 为了适应这个限制,使用 /usr/lib 代替成为普遍的做法。两种做法现在都可以接受,但每个应用程序都必须选择一种方式来组织自己。

4.8. /usr/lib:可替代(alternate)格式的二进制文件(可选)

4.8.1. 目的

对于可替代格式的二进制文件,除了不需要符号链接 /usr/lib/sendmail/usr/lib/X11 之外,/usr/lib 执行与 /usr/lib 相同的角色。[27]

4.9. /usr/local:本地层级结构

4.9.1. 目的

/usr/local 层次结构供系统管理员在本地安装软件时使用。它需要在系统软件更新时不会被覆盖。它可用于可在一组主机之间共享但在 /usr 中找不到的程序和数据。

本地安装的软件必须放在 /usr/local 而不是 /usr 中,除非安装它是为了替换或升级 /usr 中的软件。[28]

4.9.2. 必要内容

以下目录或目录的符号链接必须在 /usr/local 中。

目录 描述
bin 本地二进制文件
etc 本地二进制文件的特定于主机的系统配置
games 本地游戏二进制文件
include 本地 C 头文件
lib 本地库
man 本地在线手册
sbin 本地系统二进制文件
share 与本地架构无关的层次结构
src 本地源代码

在首次安装符合 FHS 的系统后,/usr/local 中可能没有其他目录,除了下面列出的目录。

4.9.3. 特定选项

如果目录 /lib/usr/lib 存在,则 /usr/local 中也必须存在等效目录。

/usr/local/etc 可能是 /etc/local 的符号链接。

基本原理

/usr/local/etc 的一致性对安装者有利,并且已经在其他系统中使用。由于所有 /usr/local 都需要备份以重现系统,因此不会引入额外的维护开销,但如果系统希望将所有配置置于一个层次结构下,则指向 /etc/local 的符号链接是合适的。

注意 /usr/etc 仍然是不允许的:/usr 中的程序应该将配置文件放在 /etc 中。

如果本文档中指定的目录 /usr/share/color 存在,则目录 /usr/local/share/color 也必须存在,其管理规则与 /usr/share/color 相同。

基本原理

这种用法允许系统管理员在必要时手动安装颜色配置文件。

4.9.4. /usr/local/share:本地与体系结构无关的层级结构

该目录内容的要求与 /usr/share 的要求相同。

4.10. /usr/sbin:不重要的标准系统二进制文件

4.10.1. 目的

此目录包含系统管理员专门使用的任何非必要二进制文件。系统修复、系统恢复、挂载 /usr 或其他基本功能所需的系统管理程序必须放在 /sbin 中。[29]

4.10.2. 必要内容

/usr/sbin 中不能有子目录。

4.11. /usr/share:与体系结构无关的层级结构

4.11.1. 目的

/usr/share 层次结构适用于所有与只读体系结构无关的数据文件。[30]

此层次结构旨在在给定操作系统的所有架构平台之间共享;因此,例如,具有 i386、Alpha 和 PPC 平台的站点可能会维护一个集中安装的单个 /usr/share 目录。但是请注意,/usr/share 通常不打算由不同的操作系统或同一操作系统的不同版本共享。

任何包含或需要不必修改的数据的程序或包都应将该数据存储在 /usr/share(或 /usr/local/share,如果安装在本地)。为此,建议在 /usr/share 中使用一个子目录。使用单个文件的应用程序可以使用 /usr/share/misc

/usr/share/games 中存储的游戏数据必须是纯静态数据。任何可修改的文件,例如分数文件、游戏日志等,都应该放在 /var/games

4.11.2. 必要内容

以下目录或目录的符号链接必须在 /usr/share 中。

目录 描述
man 在线手册
misc 其他与架构无关的数据

4.11.3. 特定选项

如果安装了相应的子系统,以下目录或目录的符号链接必须在 /usr/share 中:

目录 描述
color 色彩管理信息(可选)
dict 单词列表(可选)
doc 其他文件(可选)
games /usr/games 的静态数据文件(可选)
info GNU 信息系统的主目录(可选)
locale 区域设置信息(可选)
nls 本地语言支持的消息目录(可选)
ppd 打印机定义(可选)
sgml SGML 数据(可选)
terminfo terminfo 数据库的目录(可选)
tmac 不随 groff 分发的 troff 宏(可选)
xml XML 数据(可选)
zoneinfo 时区信息和配置(可选)

建议将特定于应用程序的、与体系结构无关的目录放在此处。此类目录包括 groffperlghostscripttexmfkbd(Linux) 或 syscons(BSD)。然而,它们可以放在 /usr/lib 中以便向后兼容,由分发者(distributor)决定。类似地,如果分发者希望在那里放置一些游戏数据,除了 /usr/share/games 层次结构之外,还可以使用 /usr/lib/games 层次结构。

4.11.4. /usr/share/color:颜色管理信息(可选)

4.11.4.1. 目的

此目录是系统安装的 ICC 颜色管理文件的主目录。

4.11.4.2. 特定选项

如果安装了相应的子系统,以下目录必须在 /usr/share/color 中:

目录 描述
icc ICC 颜色配置文件(可选)

顶级目录 /usr/share/color 不得包含任何文件;所有文件都应该在 /usr/share/color 的子目录中。

4.11.5. /usr/share/dict:单词列表(可选)

4.11.5.1. 目的

这个目录是系统上单词列表的主目录;传统上,该目录仅包含由 look(1) 和各种拼写程序使用的英文单词文件。单词可以使用美式或英式拼写。

基本原理

仅单词列表位于此处的原因是它们是所有拼写检查器通用的唯一文件。

4.11.5.2. 特定选项

如果安装了相应的子系统,以下文件或文件的符号链接必须在 /usr/share/dict 中:

文件 描述
words 英文单词列表(可选)

需要美式和英式拼写的站点可能会将单词链接到 /usr/share/dict/american-english/usr/share/dict/british-english

可以使用该语言的英文名称添加其他语言的单词列表,例如 /usr/share/dict/french/usr/share/dict/danish 等。如果可能,这些应该使用基于Unicode,UTF-8 字符集是首选选项。

此处必须包含其他单词列表(如果存在)。

4.11.6. /usr/share/man:Man page

4.11.6.1. 目的

本节详细介绍了整个系统中手册页的组织,包括/usr/share/man。另请参阅有关的部分 /var/cache/man

系统的主要内容是 /usr/share/man/usr/share/man 包含 //usr 文件系统下的命令和数据的手册信息。[31]

手册页存储在 //man

/ 的解释
,并 在下面给出。

每个部分的描述如下:

  • man1:用户程序。描述可公开访问命令的手册页包含在本章节中。用户需要使用的大多数程序文档都位于此处。
  • man2:系统调用。这部分描述了所有的系统调用(请求内核执行操作)。
  • man3:库函数和子例程。第 3 节描述了不是直接调用内核服务的程序库例程。这和第 2 章只有程序员真正感兴趣。
  • man4:特殊文件。第 4 节描述了系统中可用的特殊文件、相关驱动程序功能和网络支持。通常,这包括在 /dev 网络协议支持中找到的设备文件和内核接口。
  • man5:文件格式。许多数据文件的格式记录在第 5 节中。这包括各种包含文件、程序输出文件和系统文件。
  • man6:游戏。本章记录了游戏、演示和一般琐碎的程序。不同的人对这有多重要有不同的看法。
  • man7:其他用户手册。难以分类的被指定为第 7 节。troff 和其他文本处理宏包可以在这里找到。
  • man8:系统管理系统管理员用于系统操作和维护的程序记录在此。其中一些程序偶尔也对普通用户有用。

4.11.6.2. 特定选项

以下目录或目录的符号链接必须在中 /usr/share//,除非它们为空:[32]

目录 描述
man1 用户程序(可选)
man2 系统调用(可选)
man3 库调用(可选)
man4 特殊文件(可选)
man5 文件格式(可选)
man6 游戏(可选)
man7 杂项(可选)
man8 系统管理(可选)

部分描述了手册部分。

必须在 /usr/share/man 的结构中做出规定以支持以不同(或多种)语言编写的手册页。这些规定必须考虑到这些手册页的存储和引用。相关因素包括语言(包括基于地域的差异)和字符代码集。

/usr/share/man 的语言子目录的命名基于 POSIX 1003.1 标准的附录 E,该标准描述了语言环境标识字符串——描述文化环境的最广为接受的方法。 字符串是:

[_][.][,]

字段必须取自 ISO 639(一种表示语言名称的代码)。它必须是两个字符宽,并且只能用小写字母指定。

如果可能,该字段必须是 ISO 3166(国家表示规范)的两个字母代码。(大多数人都熟悉用于电子邮件地址中的国家/地区代码的两个字母代码。)它必须是两个字符宽,并且只能用大写字母指定。 [33]

字段必须代表描述字符集的标准。如果 ­ 字段只是一个数字规范,则数字代表描述字符集的国际标准编号。如果可能,建议使用数字表示(尤其是 ISO 标准),不包括额外的标点符号,并且任何字母都为小写。

指定 配置文件的参数可以放在 ­ 字段之后,用逗号分隔。这可用于区分不同的文化需求;例如,字典顺序与更面向系统的整理顺序。本标准建议不要使用该 字段,除非有必要。

对所有手册页使用唯一语言和代码集的系统可能会省略 子字符串并将所有手册页存储在 。例如,只有用 ASCII 编码的英文手册页的系统可以将手册页( man

目录)直接存储在 /usr/share/man。(事实上,这是传统的情况和安排。)

具有广为接受的标准字符代码集的国家/地区可能会省略该 ­ 字段,但强烈建议将其包括在内,尤其是对于具有多个竞争标准的国家/地区。

各种例子如下:

Language Territory Character Set Directory
English ASCII /usr/share/man/en
English United Kingdom Unicode UTF-8 /usr/share/man/en_GB.10646
English United States ASCII /usr/share/man/en_US
French Canada ISO 8859-1 /usr/share/man/fr_CA.88591
French France ISO 8859-1 /usr/share/man/fr_FR.88591
German Germany ISO 646 /usr/share/man/de_DE.646
German Germany ISO 6937 /usr/share/man/de_DE.6937
German Germany ISO 8859-1 /usr/share/man/de_DE.88591
German Switzerland ISO 646 /usr/share/man/de_CH.646
Japanese Japan JIS /usr/share/man/ja_JP.jis
Japanese Japan SJIS /usr/share/man/ja_JP.sjis
Japanese Japan UJIS (or EUC-J) /usr/share/man/ja_JP.ujis
Japanese Japan Unicode UTF-16 /usr/share/man/ja_JP.10646

同样,必须为依赖于体系结构的手册页做出规定,例如关于设备驱动程序或低级系统管理命令的文档。这些必须放在适当的 man

目录中的 目录下;例如,i386 ctrlaltdel(8) 命令的手册页可能放在 /usr/share/man//man8/i386/ctrlaltdel.8 中。

/usr/local 下的命令和数据的手册页存储在 /usr/local/man/usr/local/share/man 中。系统中的所有手册页层次结构都必须具有与 /usr/share/man 相同的结构,因为使用手册页内容的命令需要这种结构。[34]

包含格式化手册页条目的 cat 页面部分(cat

)也可以在 / 的子目录中找到,但不是必需的,也不能代替 nroff 源手册页分发。
编号部分“1”到“8”是传统定义的。通常,位于特定部分中的手册页的文件名以 .
结尾。

此外,一些大型的特定于应用程序的手册页在手册页文件名后附加了一个附加后缀。例如,MH 邮件处理系统手册页必须将 mh 附加到所有 MH 手册。所有 X Window System 手册页都必须在文件名后附加一个 x。

将各种语言手册页放在 /usr/share/man 的适当子目录中的做法也适用于其他手册页层次结构,例如 /usr/local/man。(标准的这一部分也适用于后面关于可选 /var/cache/man 结构的部分。)

4.11.7. /usr/share/misc:与架构无关的杂项数据

此目录包含各种与体系结构无关的文件,这些文件不需要 /usr/share 下的单独子目录。

4.11.7.1. 特定选项

如果安装了相应的子系统,则以下文件或文件的符号链接必须位于 /usr/share/misc 中:

文件 描述
ascii ASCII 字符集表(可选)
termcap 终端能力数据库(可选)
termcap.db 终端能力数据库(可选)

其他(特定于应用程序的)文件可能会出现在这里,但分发者可以自行决定将它们放在 /usr/lib 中。[35] [36]

4.11.8. /usr/share/ppd:打印机定义(可选)

4.11.8.1. 目的

/usr/share/ppd 包含 PostScript 打印机定义 (PPD) 文件,许多打印系统将这些文件用作打印机驱动程序的描述。 PPD 文件可以放置在此目录中,也可以放置在子目录中。

4.11.9. /usr/share/sgml:SGML 数据(可选)

4.11.9.1. 目的

/usr/share/sgml 包含 SGML 应用程序使用的与体系结构无关的文件,例如普通目录(不是集中目录,请参阅 /etc/sgml)、DTD、实体或样式表。

4.11.9.2. 特定选项

如果安装了相应的子系统,以下目录或目录的符号链接必须在 /usr/share/sgml 中:

目录 描述
docbook docbook DTD(可选)
tei tei DTD(可选)
html html DTD(可选)
mathml mathml DTD(可选)

不特定于给定 DTD 的其他文件可能驻留在它们自己的子目录中。

4.11.10. /usr/share/xml:XML 数据(可选)

4.11.10.1. 目的

/usr/share/xml 包含 XML 应用程序使用的与体系结构无关的文件,例如普通目录(不是集中目录,请参阅 /etc/sgml)、DTD、实体或样式表。

4.11.10.2. 特定选项

如果安装了相应的子系统,则以下目录或目录的符号链接必须位于 /usr/share/xml 中:

目录 描述
docbook docbook XML DTD(可选)
xhtml XHTML DTD(可选)
mathml MathML DTD(可选)

4.12. /usr/src:源代码(可选)

4.12.1. 目的

源码可能放在这个子目录下,仅供参考。[37]


[21] 其他与体系结构无关的特定于应用程序的静态文件和子目录必须放在 /usr/share 中。

[22] 请参阅下面的 /usr/libexec 部分,了解 /usr/lib/usr/libexec 对可执行二进制文件的讨论。

[23] 例如,Perl 5 模块和库的 perl5 子目录。

[24] 一些可执行命令,例如 makewhatissendmail 传统上也被放置在 /usr/lib 中。 makewhatis 是内部二进制文件,必须放在二进制目录中;用户只能访问 catman。较新的 sendmail 二进制文件现在默认放置在 /usr/sbin 中。此外,使用与 sendmail 兼容的邮件传输代理的系统必须提供 /usr/sbin/sendmail 作为 sendmail 命令,作为可执行文件本身或作为适当可执行文件的符号链接。

[25] X Window 系统的主机特定数据不得存储在 /usr/lib/X11 中。特定于主机的配置文件(例如 xorg.conf)必须存储在 /etc/X11 中。这包括诸如 system.twmrc 之类的配置数据,即使它只是一个指向更全局配置文件(可能在 /usr/lib/X11 中)的符号链接。

[26] 例如,参见自由软件基金会的“GNU 编码标准”。

[27] 如果 /usr/lib/usr/lib 相同(一个是到另一个的符号链接),这些文件和每个应用程序的子目录将存在。

[28] 放置在 //usr 中的软件可能会被系统升级覆盖(尽管我们建议在这些情况下发行版不要覆盖 /etc 中的数据)。出于这个原因,本地软件不得在没有充分理由的情况下放置在 /usr/local 之外。

[29] 本地安装的系统管理程序应该放在 /usr/local/sbin 中。

[30] 这些数据的大部分最初位于 /usrmandoc) 或 /usr/libdictterminfozoneinfo)中。

[31] 显然, / 中没有手册页,因为它们在启动时不需要,在紧急情况下也不需要。真的。

[32] 例如,如果 /usr/share/man 在第 4 节(设备)中没有手册页,则可以省略 /usr/share/man/man4

[33] 此规则的一个主要例外是英国,在 ISO 3166 中为“GB”,但在大多数电子邮件地址中为“UK”。

[34] /usr/local/man 已弃用,可能会在本规范的未来版本中删除。

[35] 一些此类文件包括:airportbirthtokeneqnchargetoptgprof.callggprof.flatinter.phoneipfw.samp.filtersipfw.samp.scriptskeycap.pcvtmail.helpmail.tildehelpman.templatemap3270mdoc.templatemore.helpna.phonenslookup.helpoperatorscsi_modessendmail.hfstyleunits.libvgrindefsvgrindefs.dbzipcodes

[36] 过去,magic 文件被放置在 /usr/share/misc 中,但是 file 命令的现代变体使用多个文件并将它们放置在 /usr/share/file 中。为了兼容性,发行版可能会在 /usr/share/misc/magic 处创建一个符号链接,指向 /usr/share/file/magic

[37] 通常,不应在此层次结构中构建源。

第五章:/var 层级结构

5.1. 目的

/var 包含可变数据文件。这包括 spool 目录和文件、管理和日志数据以及瞬态和临时文件

/var 的某些部分不能在不同系统之间共享。例如,/var/log/var/lock/var/run。其他部分可以共享,特别是 /var/mail/var/cache/man/var/cache/fonts/var/spool/news

此处指定 /var 是为了可以将 /usr 挂载为只读。进入过 /usr 并在系统操作(与安装和软件维护相对)期间写入的所有内容都必须在 /var 中。

如果 /var 不能成为一个单独的分区,通常最好将 /var 从根分区移到 /usr 分区中。(有时这样做是为了减小根分区的大小,或者当根分区中的空间不足时。)但是,/var 不能链接到 /usr,因为这会使 /usr/var 的分离更加困难,而且很可能造成命名冲突。相反,将 /var 链接到 /usr/var

应用程序通常不得将目录添加到 /var 的顶层。仅当此类目录具有某些系统范围的影响时才应添加,并与 FHS 邮件列表协商

5.2. 必要内容

/var 中需要以下目录或目录的符号链接:

目录 描述
cache 应用缓存数据
lib 可变状态信息
local /usr/local 的变量数据
lock 锁文件
log 日志文件和目录
opt /opt 的变量数据
run 与正在运行的进程相关的数据
spool 应用程序 spool 数据
tmp 在系统重新启动之间保留的临时文件

一些目录是“保留(reserved)”的,因为它们不能被某些新应用随意使用,因为它们会与历史和/或本地实践相冲突。他们是:

/var/backups
/var/cron
/var/msgs
/var/preserve

5.3. 特定选项

如果安装了相应的子系统,以下目录或目录的符号链接必须在 /var 中:

目录 描述
account 处理统计日志(Process accounting logs)(可选)
crash 系统崩溃转储(dumps)(可选)
games 可变游戏数据(可选)
mail 用户邮箱文件(可选)
yp 网络信息服务 (NIS) 数据库文件(可选)

5.4. /var/account:进程统计日志(可选)

5.4.1. 目的

此目录保存当前活动进程统计日志(process accounting log)和复合进程使用数据(如 lastcommsa 在某些类 UNIX 系统中使用的)。

5.5. /var/cache:应用缓存数据

5.5.1. 目的

/var/cache 用于缓存来自应用程序的数据。由于耗时的 I/O 或计算,此类数据是在本地生成的。应用程序必须能够重新生成或恢复数据。与 /var/spool 不同,可以删除缓存文件而不会丢失数据。数据必须在应用程序调用和重新启动系统之间保持有效。

位于 /var/cache 下的文件可能以特定于应用程序的方式过期,由系统管理员或两者兼而有之。应用程序必须始终能够从手动删除这些文件中恢复(通常是因为磁盘空间不足)。对缓存目录的数据格式没有其他要求。

基本原理

缓存数据的单独目录的存在允许系统管理员设置与 /var 中其他目录不同的磁盘和备份策略。

5.5.2. 特定选项

目录 描述
fonts 本地生成的字体(可选)
man 本地格式的手册页(可选)
www WWW 代理或缓存数据(可选)
打包特定缓存数据(可选)

5.5.3. /var/cache/fonts:本地生成的字体(可选)

5.5.3.1. 目的

The directory /var/cache/fonts should be used to store any dynamically-created fonts. In particular, all of the fonts which are automatically generated by mktexpk must be located in appropriately-named subdirectories of /var/cache/fonts. [38]

5.5.3.2. 特定选项

Other dynamically created fonts may also be placed in this tree, under appropriately-named subdirectories of /var/cache/fonts.

5.5.4. /var/cache/man:本地格式的手册页(可选)

5.5.4.1. 目的

此目录为提供只读 /usr 分区但希望允许缓存本地格式手册页的站点提供标准位置。将 /usr 挂载为可写的站点(例如,单用户安装)可以选择不使用 /var/cache/man 并且可以将格式化的手册页直接写入 /usr/share/man 中的 cat

目录。我们建议大多数网站改用以下选项之一:

  • 预先格式化所有手册页以及未格式化的版本。
  • 不允许缓存格式化的手册页,并要求在每次打开手册页时都进行格式化。
  • 允许在 /var/cache/man 中本地缓存格式化的手册页。

/var/cache/man 的结构需要反映多个手册页层次结构的事实和多语言支持的可能性。
给定一个通常出现在 /man//man

中的无格式手册页,放置格式化手册页的目录是 /var/cache/man///cat< section>,其中 通过删除任何前导 usr 和/或尾随共享路径名组件从 派生而来。 (请注意, 组件可能会丢失。)[39]

写入 /var/cache/man 的手册页最终可能会转移到源 man 层次结构中适当的预先格式化的目录中或过期;如果在一段时间内未访问,源 man 层次结构中的类似格式的手册页可能会过期。

如果预格式化的手册页与只读介质(例如 CD-ROM)上的系统一起提供,则它们必须安装在源 man 层次结构中(例如 /usr/share/man/cat

)。 /var/cache/man 保留作为格式化手册页的可写缓存。

基本原理

此标准的 1.2 版为此层次结构指定了 /var/catman。该路径已移至 /var/cache 下,以更好地反映格式化手册页的动态特性。目录名称已更改为 man 以允许增强层次结构以包含除“cat”之外的后处理格式,例如 PostScript、HTML 或 DVI。

5.6. /var/crash:系统崩溃转储(可选)

5.6.1. 目的

此目录保存系统故障转储。截至本标准发布之日,Linux 不支持系统故障转储,但其他符合 FHS 的系统可能会支持系统故障转储。

5.7. /var/games:可变游戏数据(可选)

5.7.1. 目的

任何与 /usr 中的游戏相关的变量数据都应该放在这里。 /var/games 应该保存之前在 /usr 中找到的变量数据;静态数据,例如帮助文本、关卡描述等,必须保留在其他地方,例如 /usr/share/games

基本原理

/var/games 已经被赋予了自己的层次结构,而不是像本标准的 1.2 版那样将它留在 /var/lib 之下。这种分离允许本地控制备份策略、权限和磁盘使用,以及允许主机间共享和减少 /var/lib 中的混乱。此外,/var/games 是 BSD 传统上使用的路径。

5.8. /var/lib:可变状态信息

5.8.1. 目的

此层次结构保存与应用程序或系统有关的状态信息。状态信息是程序在运行时修改的数据,它与一个特定的主机有关。用户永远不需要修改 /var/lib 中的文件来配置包的操作,并且用于存储数据的特定文件层次结构不能暴露给普通用户。[40]

状态信息通常用于在调用之间和同一应用程序的不同实例之间保存应用程序(或一组相互关联的应用程序)的条件。状态信息通常应在重新启动后保持有效,不应记录输出,也不应是 spool 数据。

一个应用程序(或一组相互关联的应用程序)必须使用 /var/lib 的子目录来保存其数据。有一个必需的子目录,/var/lib/misc,用于不需要子目录的状态文件;其他子目录仅应在相关应用程序包含在分发中时才存在。 [41]

/var/lib/ 是必须用于所有分发打包支持的位置。当然,不同的发行版可能使用不同的名称。

5.8.2. 必要内容

/var/lib 中需要以下目录或目录的符号链接:

目录 描述
misc 其他状态数据

5.8.3. 特定选项

如果安装了相应的子系统,则以下目录或目录的符号链接必须在 /var/lib 中:

目录 描述
编辑器备份文件和状态(可选)
打包支持文件(可选)
包和子系统的状态数据(可选)
color 色彩管理信息(可选)
hwclock hwclock 的状态目录(可选)
xdm X 显示管理器变量数据(可选)

5.8.4. /var/lib/:编辑器备份文件和状态(可选)

5.8.4.1. 目的

这些目录包含由编辑器(例如 elvisjovenvi)的任何意外终止生成的保存文件。

其他编辑器可能不需要用于崩溃恢复文件的目录,但可能需要一个明确定义的位置来在编辑器运行时存储其他信息。此信息应存储在 /var/lib 下的子目录中(例如,GNU Emacs 会将锁定文件放在 /var/lib/emacs/lock 中)。

未来的编辑器可能需要除了崩溃恢复文件和锁定文件之外的其他状态信息——这些信息也应该放在 /var/lib/ 下。

基本原理

以前的 Linux 发行版以及所有商业供应商都将 /var/preserve 用于 vi 或其克隆版本。但是,每个编辑器对这些崩溃恢复文件使用自己的格式,因此每个编辑器都需要一个单独的目录。

特定于编辑器的锁定文件通常与存储在 /var/lock 中的设备或资源锁定文件大不相同,因此存储在 /var/lib 下。

5.8.5. /var/lib/color:色彩管理信息(可选)

5.8.5.1. 目的

此目录是动态安装的 ICC 颜色管理文件的主目录。该目录应使用与 /usr/share/color 目录相同的规则进行布局。

5.8.6. /var/lib/hwclock:hwclock 的状态目录(可选)

5.8.6.1. 目的

该目录包含文件 /var/lib/hwclock/adjtime

基本原理

在 FHS 2.1 中,这个文件是 /etc/adjtime,但是随着 hwclock 更新它,这显然是不正确的。

5.8.7. /var/lib/misc:杂项变量数据

5.8.7.1. 目的

此目录包含未放置在 /var/lib 子目录中的变量数据。应尝试在此目录中使用相对唯一的名称以避免名称空间冲突。[42]

5.9. /var/lock:锁文件

5.9.1. 目的

锁定文件应存储在 /var/lock 目录结构中。

由多个应用程序共享的设备和其他资源的锁定文件,例如最初在 /usr/spool/locks/usr/spool/uucp 中找到的串行设备锁定文件,现在必须存储在 /var/lock 中。必须使用的命名约定是“LCK..”后跟设备的基本名称。例如,要锁定 /dev/ttyS0,将创建文件“LCK..ttyS0”。[43]

用于此类锁定文件内容的格式必须是 HDB UUCP 锁定文件格式。 HDB 格式是将进程标识符 (PID) 存储为十字节 ASCII 十进制数,并带有一个尾随换行符。例如,如果进程 1230 持有一个锁定文件,它将包含十一个字符:空格、空格、空格、空格、空格、空格、一、二、三、零和换行符。

5.10. /var/log:日志文件和目录

5.10.1. 目的

此目录包含各种日志文件。大多数日志必须写入此目录或适当的子目录。

5.10.2. 特定选项

如果安装了相应的子系统,则以下文件或文件的符号链接必须位于 /var/log 中:

文件 描述
lastlog 每个用户上次登录的记录
messages 来自 syslogd 的系统消息
wtmp 所有登录和注销的记录

5.11. /var/mail:用户邮箱文件(可选)

5.11.1. 目的

必须可以通过 /var/mail 访问邮件假脱机文件,并且邮件假脱机文件必须采用 形式。[44]

此位置中的用户邮箱文件必须以标准 UNIX 邮箱格式存储。

基本原理

该目录的逻辑位置已从 /var/spool/mail 更改,以使 FHS 与几乎所有 UNIX 发行版一致。此更改对于互操作性很重要,因为单个 /var/mail 通常在多个主机和多个 UNIX 发行版之间共享(尽管存在 NFS 锁定问题)。

请务必注意,不需要将邮件假脱机物理移动到此位置。但是,必须将程序和头文件更改为使用 /var/mail

5.12. /var/opt:/opt 的可变数据

5.12.1. 目的

/opt 中软件包的变量数据必须安装在 /var/opt/ 中,其中 /opt 中存储来自附加软件包的静态数据的子树的名称,除非被 /etc 中的另一个文件取代。 /var/opt/ 的内部安排没有强加任何结构。

基本原理

请参阅 /opt 的基本原理。

5.13. /var/run:运行时可变数据

5.13.1. 目的

该目录曾经用于描述系统启动后的系统信息数据。这些功能已移至 /run;该目录的存在是为了确保与使用本规范旧版本的系统和软件兼容。

5.13.2. 必要内容

通常,/run 的要求也适用于 /var/run。将 /var/run 实现为 /run 的符号链接是有效的。

utmp 文件位于此目录中,该文件存储有关当前正在使用系统的人员的信息。

程序不应直接访问 /var/run/run,除非访问 /var/run/utmp。[45]

5.14. /var/spool:应用 spool 数据

5.14.1. 目的

/var/spool 包含等待某种稍后处理的数据。 /var/spool 中的数据代表将来要完成的工作(由程序、用户或管理员);数据通常在处理后被删除。[46]

5.14.2. 特定选项

如果安装了相应的子系统,则以下目录或目录的符号链接必须位于 /var/spool 中:

目录 描述
lpd 打印机 spool 目录(可选)
mqueue 外发邮件队列(可选)
news 新闻 spool 目录(可选)
rwho Rwhod 文件(可选)
uucp UUCP 的 spool 目录(可选)

5.14.3. /var/spool/lpd:行式打印机守护进程打印队列(可选)

5.14.3.1. 目的

lpd 的锁文件 lpd.lock 必须放在 /var/spool/lpd 中。建议将每台打印机的锁文件放置在该特定打印机的 spool 目录中,并命名为 lock

5.14.3.2. 特定选项

目录 描述
printer 特定打印机的 spool(可选)

5.14.4. /var/spool/rwho:Rwhod 文件(可选)

5.14.4.1. 目的

此目录保存本地网络上其他系统的 rwhod 信息。

基本原理

一些 BSD 发行版使用 /var/rwho 来存储这些数据;鉴于它在其他系统上的 /var/spool 中的历史位置以及它与 spooled 数据的定义大致相符,这个位置被认为更合适。

5.15. /var/tmp:在系统重新启动之间保留的临时文件

5.15.1. 目的

/var/tmp 目录可用于需要在系统重新引导之间保留的临时文件或目录的程序。因此,存储在 /var/tmp 中的数据比 /tmp 中的数据更持久。

系统启动时不得删除位于 /var/tmp 中的文件和目录。尽管存储在 /var/tmp 中的数据通常以特定于站点的方式删除,但建议删除发生的频率低于 /tmp

5.16. /var/yp:网络信息服务 (NIS) 数据库文件(可选)

5.16.1. 目的

网络信息服务 (NIS) 的变量数据(以前称为 Sun 黄页(YP))必须放在此目录中。

基本原理

/var/yp 是 NIS(YP)数据的标准目录,几乎专门用于 NIS 文档和系统。[47]


[38] 该标准目前没有包含 TeX 目录结构(一个描述 TeX 文件和目录布局的文档),但它可能是有用的阅读。它位于 ftp://ctan.tug.org/tex/

[39] 比如 /usr/share/man/man1/ls.1 被格式化成 /var/cache/man/cat1/ls.1/usr/X11R6/man//man3/XtClass.3x 被格式化成 /var/cache/man/X11R6//cat3/XtClass.3x

[40] 具有公开文件系统结构的数据应存储在 /srv 中。

[41] 本标准的这个版本与以前的版本之间的一个重要区别是,现在要求应用程序使用 /var/lib 的子目录。

[42] 此层次结构应包含存储在当前 BSD 版本中的 /var/db 中的文件。其中包括 locate.databasemountdtab,以及内核符号数据库。

[43] 然后,任何希望使用 /dev/ttyS0 的东西都可以读取锁文件并采取相应的行动(/var/lock 中的所有锁都应该是全局可读的)。

[44] 请注意, /var/mail 可能是到另一个目录的符号链接。

[45] 这是为了防止混淆临时文件的位置。通常,程序应该使用 /var/run/run 来访问这些文件,而不是两者都使用。

[46] UUCP 锁文件必须放在 /var/lock 中。请参阅以上关于 /var/lock 的部分。

[47] NIS 不应与 Sun NIS+ 混淆,后者使用不同的目录 /var/nis

第六章:操作系统特定 Annex

本节是针对仅适用于特定操作系统的附加要求和建议。本节中的材料不应与基本标准发生冲突。

6.1. Linux

这是 Linux 操作系统的附件。

6.1.1. /:根目录

在 Linux 系统上,如果内核位于 / 中,我们建议使用名称 vmlinuxvmlinuz,这些名称已在最近的 Linux 内核源包中使用。

6.1.2. /bin:重要的用户命令二进制文件(供所有用户使用).

需要它们的 Linux 系统将这些附加文件放入 /bin

  • setserial

6.1.3. /dev:设备和特殊文件

/dev 下必须存在以下设备。

The following devices must exist under /dev.

  • /dev/null

    写入此设备的所有数据都将被丢弃。从该设备读取将返回 EOF 条件。

  • /dev/zero

    该设备是归零数据的来源。写入此设备的所有数据都将被丢弃。从该设备读取将返回与请求的一样多的包含零值的字节。

  • /dev/tty

    该设备是进程控制终端的同义词。一旦这个设备被打开,所有的读和写操作都会像实际的控制终端设备被打开一样。

基本原理

以前版本的 FHS 对 /dev 有更严格的要求。 /dev 中也可能存在其他设备。设备名称可以作为指向位于 /dev/dev 子目录中的其他设备节点的符号链接存在。对主要/次要数值没有要求。

6.1.4. /etc:主机特定的系统配置

需要它们的 Linux 系统将这些附加文件放入 /etc 中。

  • lilo.conf

6.1.5. /proc:内核和进程信息虚拟文件系统

proc 文件系统是 Linux 处理进程和系统信息的事实上的标准方法,而不是 /dev/kmem 和其他类似方法。我们强烈鼓励将其用于进程信息以及其他内核和内存信息的存储和检索。

6.1.6. /sbin:重要的系统二进制文件

Linux 系统将与文件系统维护和引导加载程序管理相关的命令放入 /sbin

/sbin 的可选文件:

  • 静态二进制文件:

    • ldconfig
    • sln
    • ssync

    当出现问题时,静态 ln(sln) 和静态 sync(ssync) 很有用。由于 ldconfig 程序(通常位于 /usr/sbin 中)存在并且可以作为升级的指导帮手,因此 sln 的主要用途(在精心编排的升级后修复 /lib 中的错误符号链接)不再是主要问题动态库。静态 sync 在某些紧急情况下很有用。请注意,这些不需要是标准 lnsync 的静态链接版本,但可能是。

    ldconfig 二进制文件对于 /sbin 是可选的,因为站点可能会选择在启动时运行 ldconfig,而不仅仅是在升级共享库时。 (不清楚在每次启动时运行 ldconfig 是否有利。)即便如此,有些人还是喜欢 ldconfig 用于以下(太常见)情况:

    • 我刚刚删除了 /lib/
    • 我找不到库的名称,因为 ls 是动态链接的,我使用的是没有内置 ls 的 shell,而且我不知道使用 echo * 作为替代。
    • 我有一个静态 sln,但我不知道如何称呼链接。
  • 其他:

    • ctrlaltdel
    • kbdrate

    为了应对某些键盘的重复率太高而无法使用的情况,在某些系统上可能会在 /sbin 中安装 kbdrate

    由于内核中 Ctrl-Alt-Del 组合键的默认操作是即时硬重启,因此通常建议在以读写模式挂载根文件系统之前禁用该行为。一些 init 套件能够禁用 Ctrl-Alt-Del,但其他套件可能需要 ctrlaltdel 程序,该程序可能安装在这些系统的 /sbin 中。

6.1.7. /sys:内核和系统信息虚拟文件系统

sys 文件系统是公开有关设备、驱动程序和某些内核功能的信息的位置。它的底层结构由当前使用的特定 Linux 内核决定,否则未指定。

6.1.8. /usr/include:C 程序所要包含的头文件

如果安装了 C 或 C++ 编译器,并且仅用于不基于 glibc 的系统,则需要这些符号链接。

/usr/include/asm -> /usr/src/linux/include/asm-
/usr/include/linux -> /usr/src/linux/include/linux

6.1.9. /usr/src:源代码

对于基于 glibc 的系统,此目录没有特定的指南。对于基于 glibc 之前的 Linux libc 修订版的系统,以下准则和基本原理适用:应该放在特定位置的唯一源代码是 Linux 内核源代码。它位于 /usr/src/linux 中。

如果安装了 C 或 C++ 编译器,但未安装完整的 Linux 内核源代码,则内核源代码中的包含文件必须位于以下目录中:

/usr/src/linux/include/asm-
/usr/src/linux/include/linux

是系统架构的名称。

注意

/usr/src/linux 可能是内核源代码树的符号链接。

基本原理

内核包含文件位于 /usr/src/linux 而不是 /usr/include 中很重要,这样系统管理员第一次升级内核版本时不会出现问题。

6.1.10. /var/spool/cron:cronat

该目录包含 cronat 程序的变量数据。

你可能感兴趣的:(FHS 3.0 翻译)