FHS 是什么东西?

Posted on 2018 September 4
Words 846

文件系统层次结构标准(Filesystem Hierarchy Standard)是由 Linux 基金会定义的,该标准对类 UNIX 系统的文件目录放置的位置定义了一系列要求,目前版本是 FHS 3.0,于 2015 年发布。

大多数的 Linux 发行版都遵循 FHS 并加入了自己的策略来符合 FHS 的要求。但也有不遵循 FHS 的,例如 GoboLinux 和 NixOS。

Linux 发行版普遍都有一些偏离 FHS,其中普遍包括:

  • 现代 Linux 发行版都包括一个 /sys 目录来作为虚拟文件系统(sysfs,类似 /proc 的 procfs),它存储并允许修改连接到系统的设备,而传统的类 UNIX 系统使用 /sys 作为内核源码书的符号链接。
  • 许多现代类 UNIX 系统(例如 FreeBSD 通过它的 ports 软件包管理工具)将第三方软件包安装到 /usr/local 中并认为这些是操作系统中 /usr 的一部分。
  • 一些 Linux 发行版不再区分 /lib/usr/lib 并且 /lib/usr/lib 的符号链接。
  • 一些 Linux 发行版不再区分 /bin/usr/bin/sbin/usr/sbin。且可能 /bin/usr/bin 的符号链接,/sbin/usr/sbin 的符号链接,也有可能把它们都连接到 /usr/bin

文件系统

文件可以分为:

  • 共享的(shareable)
  • 不可共享的(unshareable)

或:

  • 可变的(variable)
  • 静态的(static)

“共享的” 文件是那些被存储在一个 host 中且可以被其他 host 使用的文件。“不可共享的” 文件是不可以和其他 host 共享的。例如,在用户 home 目录下的文件是共享的,而 device lock 文件则不是。

“静态” 文件包括二进制文件、库文件、文档文件和其他那些除了系统管理员之外,谁都不可以改变的文件。“可变的” 文件是那些不是静态的文件。

静态文件和可变文件应该分离开来,因为不像可变文件那样,静态文件可以被存储在只读介质中并且不需要向可变文件那样做备份。

之前的类 UNIX 系统的文件系统层次结构都包含静态和可变文件在 /usr/etc 中。为此,创建了 /var 目录来将 /usr 目录下的可变文件转移到 /var 中。现在 /usr 目录通常用来存储只读文件,对于 /etc 目录中的可变文件,其很早之前就转移到了 /var 目录下。

下面是一个符合 FHS 的操作系统的例子:

shareable unshareable
static /usr
/opt
/etc
/boot
variable /var/mail
/var/spool/news
/var/run
/var/lock

根文件系统

根文件系统中的内容必须能够启动、恢复和修复系统。

为了启动一个系统,必须要有足够的软件和数据放在根文件系统下其他文件系统中。/usr/opt/var 就是这些文件系统。包括实用工具、配置、启动信息和其他基本的初始数据。

为了恢复系统,这些实用工具必须放在根文件系统下。

必须的目录

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

目录 描述
bin 基本的二进制命令
boot boot loader 的静态文件
dev 设备文件
etc 特定主机的系统配置文件
lib 共享的基本库文件和内核模块
media 可移除媒体的挂载点
mnt 临时文件系统的挂载点
opt 附加的应用程序软件包
run 与运行中的进程有关的数据
sbin 基本的系统二进制文件
srv 该系统提供的服务的数据
tmp 临时文件
usr 第二级层次结构(User System Resource?)
var 可变文件

可选的命令

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

目录 描述
home 用户主目录(可选)
lib<qual> 基本共享库的替换格式(可选)
root root 用户的主目录

/bin:基本的用户二进制命令(可供所有用户使用)

不是基本的二进制命令文件不会放在 /bin 中。只有非 root 用户才使用的命令会放在 /usr/bin 中。

/bin 中必须要有下列的命令或命令的符号链接:

命令 描述
cat Utility to concatenate files to standard output
chgrp Utility to change file group ownership
chmod 改变文件访问权限的实用工具
cp 复制文件或目录的实用工具
date 打印或设置系统日期和时间的实用工具
dd Utility to convert and copy a file
df 报告文件系统硬盘的使用情况的实用工具
dmesg Utility to print or control the kernel message buffer
echo 显示一行文本的实用工具
false Utility to do nothing, unsuccessfully
hostname Utility to show or set the system’s host name
kill Utility to send signals to processes
ln 在文件之间创建链接的使用工具
login Utility to begin a session on the system
ls 列出目录内容的实用工具
mkdir 创建目录的实用工具
mknod Utility to make block or character special files
more Utility to page through text
mount 挂载一个文件系统的实用工具
mv 移动或重命名文件的实用工具
ps 包括进程状态的实用工具
pwd 打印当前工作目录的名字的实用工具
rm 移除文件或目录的实用工具
rmdir 移除空的目录的实用工具
sed The `sed’ stream editor
sh POSIX compatible command shell
stty Utility to change and print terminal line settings
su 改变用户 ID 的实用工具
sync Utility to flush filesystem buffers
true Utility to do nothing, successfully
unmount Utility to unmount file systems
uname 打印系统信息的实用工具

如果 /bin/sh 不是兼容 POSIX 的 shell 命令本身,则它必须是硬链接或符号链接连接到真正的 shell 命令。

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

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

命令 描述
csh The C shell (optional)
ed The `ed’ editor (optional)
tar tar 归档实用工具 (optional)
cpio cpio 归档实用工具 (optional)
gzip GUN 压缩实用工具(可选的)
gunzip GUN 解压缩实用工具(可选的)
zcat GUN 解压缩实用工具(可选的)
netstat 网络统计实用(可选的)
ping ICMP 网络测试实用工具(可选的)

/bin/csh 必须是连接到 /bin/tcsh/usr/bin/tcsh 的符号链接。

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

/etc 包含配置文件,配置文件是用来控制程序的本地文件,不应包含可执行的二进制文件。

推荐配置文件存储在 /etc 的子目录下,而不是直接存在 /etc 目录下。

/etc 目录下需要有下列的目录或连接目录的符号链接:

目录 描述
opt /opt 目录的配置文件

如果对应的子系统安装了,则下列的目录或目录的符号链接需要放在 /etc 下:

目录 描述
X11 X Window system 的配置文件(可选)
sgml SGML 的配置文件(可选)
xml XML 的配置文件(可选)

如果对应的子系统安装了,则下列的文件或文件的符号链接需要放在 /etc 下:

文件 描述
csh.login C shell 登录的初始化文件(可选的)
exports NFS filesystem access control list (optional)
fstab 文件系统的静态信息(可选的)
ftpusers FTP daemon user access control list (optional)
gateways File which lists gateways for routed (optional)
gettydefs Speed and terminal settings used by getty (optional)
group User group file (optional)
host.conf DNS 解析器配置文件(可选的)
hosts Static information about host names (optional)
hosts.allow Host access file for TCP wrappers (optional)
hosts.deny Host access file for TCP wrappers (optional)
hosts.equiv List of trusted hosts for rlogin, rsh, rcp (optional)
hosts.lpd List of trusted hosts for lpd (optional)
inetd.conf inetd 的配置文件(可选)
inittab init 的配置文件(可选)
issue Pre-login message and identification file (optional)
ld.so.conf List of extra directories to search for shared libraries (optional)
motd Post-login message of the day file (optional)
mtab 文件系统的动态信息(可选)
mtools.conf mtools 的配置文件(可选)
networks Static information about network names (optional)
passwd The password file (optional)
printcap The lpd printer capability database (optional)
profile Systemwide initialization file for sh shell logins (optional)
protocols IP protocol listing (optional)
resolv.conf DNS 解析器的配置文件(可选)
rpc RPC protocol listing (optional)
securetty TTY access control for root login (optional)
services Port names for network services (optional)
shells Pathnames of valid login shells (optional)
syslog.conf Configuration file for syslogd (optional)

由于历史原因,mtab 可能不是符合 /etc 目录下静态文件的特性。在某些 Linux 系统上,它可能是 /proc/mounts 的符号链接。

如果系统使用了 shadow password suite,则会有额外的配置文件在 /etc/etc/shadow 和其他)中与程序在 /usr/sbinuseraddusermod 和其他)中。

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

应用的特定用户配置文件放在用户的主目录下且以一个 “.” 符号开始(“dot file”),如果一个应用有多个配置文件,则它们应放在以一个 “.” 符号开始命名的目录(“dot directory”)下,且里面的配置文件不需要以 “.” 符号开始命名。

/opt:额外的应用软件包

软件包应该分开放在 /opt/<package>/opt/<provider> 的目录下,其中 <package> 是描述软件的包名,<provider> 是软件包供应商的 LANANA 的注册名。

以前,这个目录是由 /var/run 代替的。为了向后兼容,还有程序使用 /var/run,迁移到了 /run 程序不应该继续使用 /var/run

/sbin:系统的二进制文件

管理系统的实用工具应该存储在 /sbin/usr/sbin/usr/local/sbin 中。本地安装管理系统的程序应放在 /usr/local/sbin 中。

/sbin 中不能有子目录。

/sbin 中须有以下命令或命令的符号链接:

命令 描述
shutdown Command to bring the system down.

如果安装了对应的子系统,则下列的文件或文件的符号链接需放在 /sbin 中:

命令 描述
fastboot Reboot the system without checking the disks (optional)
fasthalt Stop the system without checking the disks (optional)
fdisk Partition table manipulator (optional)
fsck File system check and repair utility (optional)
fsck.* File system check and repair utility for a specific filesystem (optional)
getty The getty program (optional)
halt Command to stop the system (optional)
ifconfig Configure a network interface (optional)
init Initial process (optional)
mkfs Command to build a filesystem (optional)
mkfs.* Command to build a specific filesystem (optional)
mkswap Command to set up a swap area (optional)
reboot 重启系统(可选)
route IP 路由表实用工具(可选)
swapon Enable paging and swapping (optional)
swapoff Disable paging and swapping (optional)
update Daemon to periodically flush filesystem buffers (optional)

用 MindNode 画了 FHS 3.0 的草图,虚线为可选的文件系统:

/images/fhs3.0.png


Also see: