本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
file-hierarchy — 文件系统层次结构概览
对于使用 systemd(1) 的操作系统来说, 其文件系统层次结构在遵守 File System Hierarchy 与 hier(7) 规范的基础上, 又按照 XDG Base Directory Specification 与 XDG User Directories 规范进行了扩展。本手册描述了这些规范的一个更通用的、最小的、现代化的子集, 它更严格的定义了 systemd 对文件系统层次结构所做的 建议和限制。
许多本文所描述的路径都可以 通过 systemd-path(1) 工具来查询。
/
¶文件系统的根。
通常是可写的(也可以是只读的),
并且可以是一个 "tmpfs
" 文件系统。
除非是只读的,否则不与其他主机共享。
/boot/
¶启动分区。 在UEFI系统上通常是 ESP(EFI System Partition), 参见 systemd-gpt-auto-generator(8) 手册。 该目录通常严格位于本机的内置存储上, 并且应该是只读的(除非需要安装内核或引导管理器)。 仅当操作系统运行在物理机或者虚拟硬件上时才需要此目录, 因为这种情况下 必须使用引导管理器。
/efi/
¶如果启动分区 /boot/
与 ESP(EFI System Partition) 不是同一个分区,
那么应该将 ESP 挂载到此目录。操作 ESP 的工具应该首先使用此挂载点,
仅在失败后才允许回退到 /boot/
(例如
/efi/
不是挂载点,或者文件系统类型不是
MSDOS_SUPER_MAGIC
)。
/etc/
¶特定于该操作系统的配置。 该目录可以是只读的(也可以是可读写的)。 通常用于存储操作系统发行商预设的配置文件, 但是应用程序 不应该假设该目录中必然存在某个配置文件, 而是应该在期望的配置文件不存在的情况下, 回退到默认设置。
/home/
¶存储普通用户的家目录。
可以与其他操作系统共享,
并且必须是可读写的(不能是只读的)。
该目录必须仅用于普通用户,
切勿用于系统用户(系统用户不只有"root")。
该目录及其子目录可以在启动过程的末尾才变得可用,
甚至可以在完成用户身份认证之后才变得可用。
该目录可以位于功能受限的网络文件系统上,
因此,应用程序不应该假定所有文件系统API在此目录上都可用。
应用程序不应该直接引用该目录及其子目录,
而是应该通过针对每个用户设置的 $HOME
环境变量来引用,
或者
根据用户数据库中的"家目录"字段的值来引用。
/root/
¶"root"用户的家目录。
将根用户的家目录放到
/home/
之外是为了确保即使在
/home/
目录不可用的情况下,
"root"用户依然可以正常登录。
/srv/
¶存储常规服务器数据(载荷)的目录, 由服务器管理员管理。 其中的子目录如何组织,没有明确的规范。 该目录通常是可写的, 并且可以与其他操作系统共享。 该目录可以在启动过程的末尾才变得可用。
/tmp/
¶存放小临时文件的目录。
通常挂载为一个 "tmpfs
" 文件系统。
切勿在此目录中存放体积较大的临时文件
(应该使用 /var/tmp/
目录)。
因为系统上的所有用户都可以访问该目录,
所以必须确保该目录仅对
mkstemp(3),
mkdtemp(3)
相关系统调用可写。
该目录在系统启动过程中会被清空。
并且,如果其中的某些文件持续长时间不被访问,通常也会被自动删除。
如果应用程序发现 $TMPDIR
环境变量已经被设置,
那么应该使用 $TMPDIR
环境变量的设置,
而不应该直接使用 /tmp/
目录(参见
environ(7)
与
IEEE
Std 1003.1 )。
/run/
¶一个用于存放系统软件运行时数据的 "tmpfs
" 文件系统。
该目录在系统启动过程中会被清空。
该目录必须总是可写的,
但是通常又应该仅赋予特权应用写入权限。
/run/log/
¶运行时系统日志。
系统组件可以在这个目录中存放私有日志。
该目录必须总是可写的(即使 /var/log/
目录尚不能访问)。
/run/user/
¶针对每个用户的运行时目录。
通常针对每个用户单独挂载一个 "tmpfs
" 文件系统实例。
该目录必须总是可写的,
并且在系统启动过程中以及对应的用户登出后会被自动清空。
应用程序不应该直接引用该目录,而是应该通过针对每个用户设置的
$XDG_RUNTIME_DIR
环境变量来引用。
详见 XDG
Base Directory Specification
/usr/
¶发行商提供的操作系统资源。 通常应该是只读的(但非必须是只读)。 可以与其他主机共享。 系统管理员不应该修改此目录中的内容, 除非需要安装或卸载发行商提供的软件包。
/usr/bin/
¶存放
应当出现在 $PATH
搜索路径中的用户命令(可执行文件)。
建议仅将命令行工具放到此目录中,
而例如守护进程之类的非命令行工具,
则应该放到
/usr/lib/
下的子目录中。
/usr/include/
¶系统库的 C 与 C++ API 头文件目录。
/usr/lib/
¶存放
通用于所有体系结构的、静态的发行商专属数据。
这包括软件包内部使用的可执行文件、
以及例如守护进程之类的非命令行工具。
这些二进制文件可用于该操作系统支持的所有体系结构。
不要在此目录中放置公共库,
而应该将它们放到 $libdir
目录中
(参见下文)。
/usr/lib/arch-id
/
¶存放动态链接库,
又被称为 $libdir
目录。
arch-id
的具体名称遵守 Multiarch
Architecture Specifiers (Tuples) 列表的规范。
传统上,$libdir
通常是
/usr/lib/
与
/usr/lib64/
目录。
该目录不应该用于存放特定于某个软件的专属数据,
除非这些数据是专属于特定体系结构的。
可以使用下面的命令查询用于该系统的首选体系结构的
$libdir
的值:
# systemd-path system-library-arch
在多个软件包之间共享的资源, 例如 文档、手册、时区数据、字体等资源。 此目录下的子目录结构及文件格式, 取决于确保软件之间正常相互操作的各种规范。
操作系统以及各种软件包的 文档。
发行商提供的默认配置文件仓库。
该目录中应该放置发行商提供的、
所有可能放入
/etc/
目录的配置文件的
原始默认文件。
这个目录主要是为了方便恢复默认设置
以及对比当前配置与默认配置的不同。
与
/usr/share/factory/etc/
类似,
用于存放发行商提供的 /var/
目录内容的原始默认文件。
/var/
¶应该持久保存的易变系统数据。 该目录必须可写。 该目录可以 预先填充发行商预设的数据, 但是应用程序可以自行创建所需的文件和目录。 强烈推荐(但非必须)持久保存该目录中的数据, 系统必须在该目录为空时依然能够正常启动, 以支持临时运行的系统。 该目录可以在启动过程的末尾才变得可用, 因此那些在系统启动早期运行的组件 不应该依赖于此目录的存在。
/var/cache/
¶应该持久保存的系统缓存。 系统组件可以在该目录中放置非关键的缓存。 清空该目录必须不影响应用的正常工作 (但应用可以花费额外的时间 重建这些缓存)。
/var/lib/
¶应该持久保存的系统数据。 系统组件可以在该目录中放置专属的数据。
/var/log/
¶应该持久保存的系统日志。 系统组件可以在该目录中放置专属的日志。 不过,推荐的方式是通过 syslog(3) 与 sd_journal_print(3) 接口记录日志。
/var/spool/
¶应该持久保存的系统队列。 例如邮件队列或打印队列。
/var/tmp/
¶应该持久保存的临时文件(通常体积也比较大)。
此目录通常位于持久存储设备上,
并且可以存储较大的临时文件。
相比较而言,/tmp/
一般位于内存中,
并且仅用于存储较小的临时文件。
该目录在系统启动过程中一般不会被清空,
但是,如果其中的某些文件持续长时间不被访问,通常也会被自动删除。
因为系统上的所有用户都可以访问该目录,
所以必须确保该目录仅对
mkstemp(3),
mkdtemp(3)
相关系统调用可写。
如果应用程序发现 $TMPDIR
环境变量已经被设置,
那么应该使用 $TMPDIR
环境变量的设置,
而不应该直接使用
/var/tmp/
目录(参见
environ(7)
手册)。
/dev/
¶设备节点的根目录。
通常被挂载为一个
"devtmpfs
" 文件系统实例
(但在沙盒或容器中可能是其他类型)。
该目录中的内容由内核与
systemd-udevd.service(8)
共同管理,其他任何组件都不应该修改此目录中的内容。
可以在该目录的子目录中
再挂载其他特定用途的虚拟文件系统。
/dev/shm/
¶ POSIX
共享内存(通过
shm_open(3)
创建)。
因为它其实是一个 "tmpfs
" 文件系统,
所以在系统启动过程中会被清空。
因为系统上的所有用户都可以读写该目录,
所以必须注意避免文件名冲突以及安全漏洞(也就是注意权限设置)。
对于普通用户,当其退出登录时,其在该目录下创建的文件也会被删除。
通常,在 /run/
目录(针对系统进程)
或 $XDG_RUNTIME_DIR
目录(针对用户进程)中使用内存映射文件,
是比使用POSIX共享内存更好的解决方案。
因为这些目录不是全局可写的,
所以不存在文件名冲突以及安全漏洞的问题。
/proc/
¶显示进程信息以及其他功能的 虚拟文件系统。 此文件系统主要用作内核与用户交互的界面。 详见 proc(5) 手册。 可以在该目录的子目录中 再挂载其他特定用途的虚拟文件系统。
/proc/sys/
¶调整内核各项参数的 一个界面。 主要通过 sysctl.d(5) 中的配置文件进行设置。 但在沙盒或容器中该目录通常以只读方式挂载(也就是禁止修改内核参数)。
/sys/
¶显示所有已发现设备以及其他功能的 虚拟文件系统。 此文件系统主要用作内核与用户交互的界面。 在沙盒或容器中该目录通常以只读方式挂载。 可以在该目录的子目录中 再挂载其他特定用途的 虚拟文件系统。
用户应用如果想要在用户的家目录中保存文件或目录, 那么应该遵守下面的规范。 注意,下面的某些目录虽然比较脆弱, 但是已经被 XDG Base Directory Specification 标准化了。 其他为高层次用户资源定义的位置参见 xdg-user-dirs 文档。
~/.cache/
¶应该持久保存的用户缓存。
应用可以在该目录中放置非关键的用户缓存。
清空该目录中的缓存必须不影响应用的正常工作
(但应用可以花费额外的时间重建这些缓存)。
如果应用程序发现 $XDG_CACHE_HOME
环境变量已经被设置,
那么应该使用 $XDG_CACHE_HOME
环境变量的设置,
而不应该直接使用 ~/.cache/
目录。
~/.config/
¶应该持久保存的用户配置与状态。
当新用户刚被创建时,该目录应该初始为空或根本不存在。
如果期望的配置文件不存在于该目录中,
那么应用程序应该回退到默认设置,而不应该罢工。
如果应用程序发现 $XDG_CONFIG_HOME
环境变量已经被设置,
那么应该使用 $XDG_CONFIG_HOME
环境变量的设置,
而不应该直接使用 ~/.config/
目录。
~/.local/bin/
¶存放应当出现在用户专属的
$PATH
搜索路径中的
用户命令(可执行文件)。
建议仅将命令行工具放到此目录中,
而例如守护进程之类的非命令行工具,
则应该放到 ~/.local/lib/
下的子目录中。
注意,
当在此目录中存放特定于体系结构的可执行文件时,
可能会因为与其他不同体系结构的系统共享家目录而出现故障。
~/.local/lib/
¶存放通用于所有体系结构的、静态的用户专属数据。这包括软件包内部使用的可执行文件、以及例如守护进程之类的非命令行工具。这些二进制文件可用于该操作系统支持的所有体系结构。
不要在此目录中放置公共库,而应该将它们放到 ~/.local/lib/
目录中(参见下文)。arch-id
/
~/.local/lib/arch-id
/
¶存放专属于特定体系结构的动态链接库。
arch-id
的具体名称遵守 Multiarch
Architecture Specifiers (Tuples)
列表的规范。
在多个软件包之间共享的资源,例如图标、字体等资源。
此目录下的子目录结构及文件格式,
取决于确保软件之间正常相互操作的各种规范。
如果应用程序发现 $XDG_DATA_HOME
环境变量已经被设置,
那么应该使用 $XDG_DATA_HOME
环境变量的设置,
而不应该直接使用 ~/.local/share/
目录。
非特权进程通常对大多数目录 都没有写权限。
但对于普通用户的非特权进程来说,可以写入
/tmp/
,
/var/tmp/
,
/dev/shm/
,
$HOME
(通常位于
/home/
下),
$XDG_RUNTIME_DIR
(通常位于
/run/user/
下)
目录。
而对于系统的非特权进程来说,则仅可以写入
/tmp/
,
/var/tmp/
,
/dev/shm/
目录。
如果系统的非特权进程需要在
/var/
或 /run/
目录中创建一个专属的、可写入的目录,
那么可以在守护进程丢弃特权之前先创建该目录,或者通过
tmpfiles.d(5)
在系统启动时先创建该目录,或者通过服务单元文件中的
StateDirectory=
与 RuntimeDirectory=
指令(详见
systemd.unit(5)
手册)创建该目录。
Unix文件系统支持不同的文件节点类型: 普通文件、目录、软连接、字符设备、块设备、 套接字(socket)、管道(FIFO)。
强烈建议仅将设备文件放置在 /dev/
目录中、
仅将套接字(socket)与管道(FIFO)文件
放置在 /run/
目录中。
而普通文件、目录、软连接
则可以放置在所有目录中。
系统软件包的开发者 应该严格遵守下面的文件布局规范。 下面列出了发行商提供的系统软件包中 各类文件的推荐位置:
表 1. 系统软件包中静态文件的推荐位置
目录 | 用途 |
---|---|
/usr/bin/ | 应该出现在 $PATH 搜索路径中且与体系结构无关的可执行文件。不要将软件包内部使用的可执行文件或非命令行工具(例如守护进程之类)放到此目录中。因为众多的软件包都使用此目录,所以必须选择独一无二的可执行文件名称,以避免冲突。 |
/usr/lib/ | 全局通用的体系结构相关的共享库。因为众多的软件包都使用此目录,所以必须选择独一无二的共享库名称,以避免冲突。 |
/usr/lib/ | 发行商提供的该软件包专属的体系结构无关的静态资源(可执行文件、库文件、只读数据)。 |
/usr/lib/ | 发行商提供的体系结构相关的该软件包专属的资源(通常不包括软件包内部使用的可执行文件)。 |
/usr/include/ | 该软件包提供的共享库的 C/C++ 头文件。 |
发行商提供的其他静态资源应该存放在
/usr/share/
目录下,
具体的存放位置应该遵守其他的相关规范。
存放软件包运行时数据以及配置文件的 相关目录如下:
表 2. 系统软件包的运行时数据以及配置文件的推荐位置
目录 | 用途 |
---|---|
/etc/ | 特定于该系统的配置文件。如果该目录不存在,那么软件包应该尽可能回退到安全的默认设置,而不应该罢工。可以设置一个 tmpfiles.d(5) 配置文件,以实现在系统启动过程中,从 /usr/share/factory/ 目录中复制("C "指令)或软连接("L "指令)所需的文件到该目录中。 |
/run/ | 软件包的运行时数据。因为该目录会在系统启动过程中被清空,所以软件包必须有权限在此目录中创建子目录及文件。可以设置一个 tmpfiles.d(5) 配置文件,以实现在系统启动过程中自动在此目录中创建所需的子目录及文件,或者在服务单元文件中使用 RuntimeDirectory= 指令(详见 systemd.unit(5) 手册)在服务启动时创建它们。 |
/run/log/ | 软件包的运行时日志。因为该目录会在系统启动过程中被清空,所以软件包必须有权限在此目录中创建子目录及文件。 |
/var/cache/ | 软件包的持久缓存。清空该目录必须不影响软件包的正常工作(但软件包可以花费额外的时间重建这些缓存)。软件包必须有权限在此目录中创建子目录及文件。可以设置一个 tmpfiles.d(5) 配置文件,或者在服务单元文件中使用 CacheDirectory= 指令(详见 systemd.unit(5) 手册)来创建此空目录。 |
/var/lib/ | 软件包的持久专属数据。存放无法明确分类的持久数据。软件包必须有权限在此目录中创建子目录及文件,因为在系统启动时该目录可能为空。可以设置一个 tmpfiles.d(5) 配置文件,或者在服务单元文件中使用 StateDirectory= 指令(详见 systemd.unit(5) 手册)来创建此空目录。 |
/var/log/ | 软件包的持久日志数据。软件包必须有权限在此目录中创建子目录及文件,因为在系统启动时该目录可能为空。可以设置一个 tmpfiles.d(5) 配置文件,或者在服务单元文件中使用 LogsDirectory= 指令(详见 systemd.unit(5) 手册)来创建此空目录。 |
/var/spool/ | 软件包的持久队列数据。软件包必须有权限在此目录中创建子目录及文件,因为在系统启动时该目录可能为空。 |
对于专属于特定用户的软件包, 其存贮在用户家目录中的文件必须严格遵守下面的文件布局规范。 注意, 当安装属于系统范围的软件包时, 应该遵守前面"系统软件包"小节的布局规范。 下面列出了当用户在其家目录中安装专属软件包时, 由发行商提供的各种类型的文件在用户家目录中应该存放的位置:
表 3. 用户软件包中静态文件的推荐位置
目录 | 用途 |
---|---|
~/.local/bin/ | 应该出现在 $PATH 搜索路径中且与体系结构无关的可执行文件。不要将软件包内部使用的可执行文件或非命令行工具(例如守护进程之类)放到此目录中。因为众多的软件包都使用此目录,所以必须选择独一无二的可执行文件名称,以避免冲突。 |
~/.local/lib/ | 全局通用的体系结构相关的共享库。因为众多的软件包都使用此目录,所以必须选择独一无二的共享库名称,以避免冲突。 |
~/.local/lib/ | 发行商提供的该软件包专属的体系结构无关的静态资源(可执行文件、库文件、只读数据)。 |
~/.local/lib/ | 发行商提供的体系结构相关的该软件包专属的资源(通常不包括软件包内部使用的可执行文件)。 |
发行商提供的其他静态资源应该存放在
~/.local/share/
目录下,
具体的存放位置应该遵守其他的相关规范。
存放软件包运行时数据以及配置文件的 相关目录如下:
表 4. 用户软件包的运行时数据以及配置文件的推荐位置
目录 | 用途 |
---|---|
~/.config/ | 特定于该用户的配置文件。如果该目录不存在,那么软件包必须能够安全的回退到默认设置,而不能罢工。 |
| 特定于该用户的运行时数据。 |
~/.cache/ | 软件包的持久缓存。清空该目录必须不影响软件包的正常工作(但软件包可以花费额外的时间重建这些缓存)。软件包必须有权限在此目录中创建子目录及文件。 |