Provided by: manpages-zh_1.6.3.2-1_all bug

NAME

       file-hierarchy - 文件系统层次结构概览

描述

       对于使用 systemd(1) 的操作系统来说, 其文件系统层次结构遵守 File System Hierarchy[1] 与
       hier(7) 规范。 本手册仅描述一个符合上述规范的子集, 该子集较小也较现代, 并且更加严格的遵
       守上述规范。

       许多本文所描述的路径都可以通过 systemd-path(1) 工具来查询。

总体结构

       /
           文件系统的根。 通常是可写的(也可以是只读的), 并且可以是一个 "tmpfs" 文件系统。 除非是
           只读的,否则不与其他主机共享。

       /boot
           启动分区。 在UEFI系统上通常是"EFI System Partition", 参见 systemd-gpt-auto-
           generator(8) 手册。 该目录通常严格位于本机的内置存储上, 并且应该是只读的(除非需要安装
           内核或引导管理器)。 仅当操作系统运行在物理机或者虚拟硬件上时才需要此目录, 因为这种情
           况下必须使用引导管理器。

       /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[2] )。

运行时数据

       /run
           一个用于存放系统软件运行时数据的 "tmpfs" 文件系统。 该目录在系统启动过程中会被清空。
           该目录必须总是可写的, 但是通常又应该仅赋予特权应用写入权限。

       /run/log
           运行时系统日志。 系统组件可以在这个目录中存放私有日志。 该目录必须总是可写的(即使
           /var/log 目录尚不能访问)。

       /run/user
           针对每个用户的运行时目录。 通常针对每个用户单独挂载一个 "tmpfs" 文件系统实例。 该目录
           必须总是可写的, 并且在系统启动过程中以及对应的用户登出后会被自动清空。 应用程序不应该
           直接引用该目录,而是应该通过针对每个用户设置的 $XDG_RUNTIME_DIR 环境变量来引用。 详见
           XDG Base Directory Specification[3]

发行商提供的操作系统资源

       /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)[4] 列表的规范。 传统上,$libdir 通常是 /usr/lib/usr/lib64 目
           录。 该目录不应该用于存放特定于某个软件的专属数据, 除非这些数据是专属于特定体系结构
           的。 可以使用下面的命令查询用于该系统的首选体系结构的 $libdir 的值:

               # systemd-path system-library-arch

       /usr/share
           在多个软件包之间共享的资源, 例如文档、手册、时区数据、字体等资源。 此目录下的子目录结
           构及文件格式, 取决于确保软件之间正常相互操作的各种规范。

       /usr/share/doc
           操作系统以及各种软件包的文档。

       /usr/share/factory/etc
           发行商提供的默认配置文件仓库。 该目录中应该放置发行商提供的、 所有可能放入 /etc 目录的
           配置文件的原始默认文件。 这个目录主要是为了方便恢复默认设置 以及对比当前配置与默认配置
           的不同。

       /usr/share/factory/var
           与 /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
           通过 shm_open(3) 创建的POSIX共享内存。 因为它其实是一个 "tmpfs" 文件系统, 所以在系统
           启动过程中会被清空。 因为系统上的所有用户都可以读写该目录, 所以必须注意避免文件名冲突
           以及安全漏洞(也就是注意权限设置)。 对于普通用户,当其退出登录时,其在该目录下创建的文
           件也会被删除。 通常,在 /run 目录(针对系统进程) 或 $XDG_RUNTIME_DIR 目录(针对用户进
           程)中使用内存映射文件, 是比使用POSIX共享内存更好的解决方案。 因为这些目录不是全局可写
           的, 所以不存在文件名冲突以及安全漏洞的问题。

       /proc
           显示进程信息以及其他功能的虚拟文件系统。 此文件系统主要用作内核与用户交互的界面。 详见
           proc(5) 手册。 可以在该目录的子目录中再挂载其他特定用途的虚拟文件系统。

       /proc/sys
           调整内核各项参数的一个界面。 主要通过 sysctl.d(5) 中的配置文件进行设置。 但在沙盒或容
           器中该目录通常以只读方式挂载(也就是禁止修改内核参数)。

       /sys
           显示所有已发现设备以及其他功能的虚拟文件系统。 此文件系统主要用作内核与用户交互的界
           面。 在沙盒或容器中该目录通常以只读方式挂载。 可以在该目录的子目录中 再挂载其他特定用
           途的虚拟文件系统。

兼容性软连接

       /bin, /sbin, /usr/sbin
           这三个软连接都指向 /usr/bin 以确保对传统路径的兼容。

       /lib
           这个软连接指向 /usr/lib 以确保对传统路径的兼容。

       /lib64
           在64位系统上, 这个软连接指向 $libdir 以确保对传统路径的兼容。 此软连接仅存在于动态加
           载器位于此路径的系统架构上。

       /var/run
           这个软连接指向 /run 以确保对传统路径的兼容。

家目录

       用户应用如果想要在用户的家目录中保存文件或目录,那么应该遵守下面的规范。 注意,下面的某些
       目录虽然比较脆弱, 但是已经被 XDG Base Directory Specification[3] 标准化了。 其他为高层次
       用户资源定义的位置参见 xdg-user-dirs[5] 文档。

       ~/.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)[4] 列表的规范。

       ~/.local/share
           在多个软件包之间共享的资源,例如图标、字体等资源。 此目录下的子目录结构及文件格式, 取
           决于确保软件之间正常相互操作的各种规范。 如果应用程序发现 $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) 在系统启动时先创建该目录, 或者通过服务单元文件中的
       RuntimeDirectory= 指令(详见 systemd.unit(5) 手册)创建该目录。

文件类型

       Unix文件系统支持不同的文件节点类型: 普通文件、目录、软连接、字符设备、块设备、 套接
       字(socket)、管道(FIFO)。

       强烈建议仅将设备文件放置在 /dev 目录中、 仅将套接字(socket)与管道(FIFO)文件放置在 /run 目
       录中。 而普通文件、目录、软连接则可以放置在所有目录中。

系统软件包

       系统软件包的开发者应该严格遵守下面的文件布局规范。 下面列出了发行商提供的系统软件包中各类
       文件的推荐位置:

       Table 1. 系统软件包中静态文件的推荐位置
       ┌─────────────────────────┬──────────────────────────────────┐
       │目录用途                             │
       ├─────────────────────────┼──────────────────────────────────┤
       │/usr/bin                 │ 应该出现在 $PATH 搜索路径中且与  │
       │                         │ 体系结构无关的可执行文件。不要将 │
       │                         │ 软件包内部使用的可执行文件或非命 │
       │                         │ 令行工具(例如守护进程之类)放到此 │
       │                         │ 目录中。因为众多的软件包都使用此 │
       │                         │ 目录,所以必须选择独一无二的可执 │
       │                         │ 行文件名称,以避免冲突。         │
       ├─────────────────────────┼──────────────────────────────────┤
       │/usr/lib/arch-id         │ 全局通用的体系结构相关的共享     │
       │                         │ 库。因为众多的软件包都使用此目   │
       │                         │ 录,所以必须选择独一无二的共享库 │
       │                         │ 名称,以避免冲突。               │
       ├─────────────────────────┼──────────────────────────────────┤
       │/usr/lib/package         │ 发行商提供的该软件包专属的体系结 │
       │                         │ 构无关的静态资源(可执行文件、库  │
       │                         │ 文件、只读数据)。                │
       ├─────────────────────────┼──────────────────────────────────┤
       │/usr/lib/arch-id/package │ 发行商提供的体系结构相关的该软件 │
       │                         │ 包专属的资源(通常不包括软件包内  │
       │                         │ 部使用的可执行文件)。            │
       ├─────────────────────────┼──────────────────────────────────┤
       │/usr/include/package     │ 该软件包提供的共享库的 C/C++ 头  │
       │                         │ 文件。                           │
       └─────────────────────────┴──────────────────────────────────┘

       发行商提供的其他静态资源应该存放在 /usr/share 目录下, 具体的存放位置应该遵守其他的相关规
       范。

       存放软件包运行时数据以及配置文件的相关目录如下:

       Table 2. 系统软件包的运行时数据以及配置文件的推荐位置
       ┌───────────────────┬──────────────────────────────────┐
       │目录用途                             │
       ├───────────────────┼──────────────────────────────────┤
       │/etc/package       │ 特定于该系统的配置文件。如果该目 │
       │                   │ 录不存在,那么软件包应该尽可能回 │
       │                   │ 退到安全的默认设置,而不应该罢   │
       │                   │ 工。可选地,可以设置一个         │
       │                   │ tmpfiles.d(5) 配置文件,以实现在 │
       │                   │ 系统启动过程中,从               │
       │                   │ /usr/share/factory 目录中复      │
       │                   │ 制("C"指令)或软连接("L"指令)所需 │
       │                   │ 的文件到该目录中。               │
       ├───────────────────┼──────────────────────────────────┤
       │/run/package       │ 软件包的运行时数据。因为该目录会 │
       │                   │ 在系统启动过程中被清空,所以软件 │
       │                   │ 包必须有权限在此目录中创建子目录 │
       │                   │ 及文件。可选的,可以设置一个     │
       │                   │ tmpfiles.d(5) 配置文件,以实现在 │
       │                   │ 系统启动过程中自动在此目录中创建 │
       │                   │ 所需的子目录及文件。或者可选     │
       │                   │ 的,在服务单元文件中使用         │
       │                   │ RuntimeDirectory= 指令(详见      │
       │                   │ systemd.unit(5) 手册)以达到上述  │
       │                   │ 目的。                           │
       ├───────────────────┼──────────────────────────────────┤
       │/run/log/package   │ 软件包的运行时日志。因为该目录会 │
       │                   │ 在系统启动过程中被清空,所以软件 │
       │                   │ 包必须有权限在此目录中创建子目录 │
       │                   │ 及文件。                         │
       ├───────────────────┼──────────────────────────────────┤
       │/var/cache/package │ 软件包的持久缓存。清空该目录必须 │
       │                   │ 不影响软件包的正常工作(但软件包  │
       │                   │ 可以花费额外的时间重建这些缓     │
       │                   │ 存)。软件包必须有权限在此目录中  │
       │                   │ 创建子目录及文件。               │
       ├───────────────────┼──────────────────────────────────┤
       │/var/lib/package   │ 软件包的持久专属数据。存放无法明 │
       │                   │ 确分类的持久数据。软件包必须有权 │
       │                   │ 限在此目录中创建子目录及文件,因 │
       │                   │ 为在系统启动时该目录可能为空。可 │
       │                   │ 选的,可以设置一个 tmpfiles.d(5) │
       │                   │ 配置文件,以实现在系统启动过程中 │
       │                   │ 自动在此目录中创建所需的子目录及 │
       │                   │ 文件。                           │
       ├───────────────────┼──────────────────────────────────┤
       │/var/log/package   │ 软件包的持久日志数据。软件包必须 │
       │                   │ 有权限在此目录中创建子目录及文   │
       │                   │ 件,因为在系统启动时该目录可能为 │
       │                   │ 空。                             │
       ├───────────────────┼──────────────────────────────────┤
       │/var/spool/package │ 软件包的持久队列数据。软件包必须 │
       │                   │ 有权限在此目录中创建子目录及文   │
       │                   │ 件,因为在系统启动时该目录可能为 │
       │                   │ 空。                             │
       └───────────────────┴──────────────────────────────────┘

用户软件包

       对于专属于特定用户的软件包, 其存贮在用户家目录中的文件必须严格遵守下面的文件布局规范。 注
       意,当安装属于系统范围的软件包时, 应该遵守前面"系统软件包"小节的布局规范。 下面列出了当用
       户在其家目录中安装专属软件包时, 由发行商提供的各种类型的文件在用户家目录中应该存放的位
       置:

       Table 3. 用户软件包中静态文件的推荐位置
       ┌─────────────────────────────┬──────────────────────────────────┐
       │目录用途                             │
       ├─────────────────────────────┼──────────────────────────────────┤
       │~/.local/bin                 │ 应该出现在 $PATH 搜索路径中且与  │
       │                             │ 体系结构无关的可执行文件。不要将 │
       │                             │ 软件包内部使用的可执行文件或非命 │
       │                             │ 令行工具(例如守护进程之类)放到此 │
       │                             │ 目录中。因为众多的软件包都使用此 │
       │                             │ 目录,所以必须选择独一无二的可执 │
       │                             │ 行文件名称,以避免冲突。         │
       ├─────────────────────────────┼──────────────────────────────────┤
       │~/.local/lib/arch-id         │ 全局通用的体系结构相关的共享     │
       │                             │ 库。因为众多的软件包都使用此目   │
       │                             │ 录,所以必须选择独一无二的共享库 │
       │                             │ 名称,以避免冲突。               │
       ├─────────────────────────────┼──────────────────────────────────┤
       │~/.local/lib/package         │ 发行商提供的该软件包专属的体系结 │
       │                             │ 构无关的静态资源(可执行文件、库  │
       │                             │ 文件、只读数据)。                │
       ├─────────────────────────────┼──────────────────────────────────┤
       │~/.local/lib/arch-id/package │ 发行商提供的体系结构相关的该软件 │
       │                             │ 包专属的资源(通常不包括软件包内  │
       │                             │ 部使用的可执行文件)。            │
       └─────────────────────────────┴──────────────────────────────────┘

       发行商提供的其他静态资源应该存放在 ~/.local/share 目录下, 具体的存放位置应该遵守其他的相
       关规范。

       存放软件包运行时数据以及配置文件的相关目录如下:

       Table 4. 用户软件包的运行时数据以及配置文件的推荐位置
       ┌─────────────────────────┬──────────────────────────────────┐
       │目录用途                             │
       ├─────────────────────────┼──────────────────────────────────┤
       │~/.config/package        │ 特定于该用户的配置文件。如果该目 │
       │                         │ 录不存在,那么软件包必须能够安全 │
       │                         │ 的回退到默认设置,而不能罢工。   │
       ├─────────────────────────┼──────────────────────────────────┤
       │$XDG_RUNTIME_DIR/package │ 特定于该用户的运行时数据。       │
       ├─────────────────────────┼──────────────────────────────────┤
       │~/.cache/package         │ 软件包的持久缓存。清空该目录必须 │
       │                         │ 不影响软件包的正常工作(但软件包  │
       │                         │ 可以花费额外的时间重建这些缓     │
       │                         │ 存)。软件包必须有权限在此目录中  │
       │                         │ 创建子目录及文件。               │
       └─────────────────────────┴──────────────────────────────────┘

参见

       systemd(1), hier(7), systemd-path(1), systemd-gpt-auto-generator(8), sysctl.d(5),
       tmpfiles.d(5), pkg-config(1), systemd.unit(5)

NOTES

        1. File System Hierarchy
           http://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html

        2. IEEE Std 1003.1
           http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03

        3. XDG Base Directory Specification
           http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html

        4. Multiarch Architecture Specifiers (Tuples)
           https://wiki.debian.org/Multiarch/Tuples

        5. xdg-user-dirs
           http://www.freedesktop.org/wiki/Software/xdg-user-dirs/

       本页面中文版由中文 man 手册页计划提供。

       翻译人员:金步国
       金步国作品集:http://www.jinbuguo.com
       中文 man 手册页计划:https://github.com/man-pages-zh/manpages-zh