目录

Filesystem Hierarchy Standard

FHS介绍

FHS(Filesystem Hierarchy Standard),文件系统层次化标准:http://www.pathname.com/fhs


FHS主要目的是希望让用户了解安装文件通常放置的目录。所以希望软件开发商、系统制定者以及维护系统的用户,都能够遵循FHS的标准。

FHS-compliant system:

  •           |	可分享的(shareable)			   |	不可分享的(unshareable)
    
  •           |	-				   			  |	-
    

不变的(static) | /usr
/opt | /etc
/boot 可变的(variable) | /var/mail
/var/spool/news | /var/run
/var/lock

  • shareable: 可分享给其他系统(主机)挂载使用;
  • unshareable: 不适合分享给其他主机;
  • static: 有些数据基本是不会变化的;
  • variable: 进程变更的数据。

FHS针对目录树架构仅定义出三层目录下应该放置什么数据,这三个目录下所应该放置的目录也都有特定规定。
  • /: The root filesystem, 与开机系统有关;
  • /usr: The /usr hierarchy, Unix software resource;
  • /var: The /var hierarchy, 与系统运行过程有关。


# The Root Filesystem

根目录(/)是系统最重要的一个目录。不但所有目录都是由根目录衍生出来,同时根目录还与系统的启动、还原、修复等操作相关。 若系统出现问题,根目录必须要包含能够修复文件系统的程序才行。 破坏根文件系统上的数据的错误比破坏其他任何分区都要严重!

为了平衡这些考虑,建议尽可能保持根分区小。 应用程序不应在根目录中创建特殊文件或子目录!


The following dirs or symbolic-links, are required in /

目录 | 描述

  •       |		-
    

/bin | 必要的二进制命令 /boot | boot-loader的静态文件 /dev | 设备文件 /etc | 主机特定的系统配置文件 /lib | 基本的共享库(shared libraries)和内核模块(kernel modules) /media | 可移除媒体的挂载点 /mnt | 临时挂载文件系统的挂载点 /opt | 第三方软件包放置目录 /sbin | 必要的系统二进制命令 /srv | 系统提供的服务数据 /tmp | 临时文件 /usr | /usr层次结构 /var | /var层次结构


除了上面列出必须存在的目录,下面这些目录很也很重要。

目录 | 描述

  •       |		 -
    

/lost+found | 在ext文件系统里,当文件系统发生错误时,将一些遗失的片段放置到此目录下 /home | 用户家目录 /root | root用户家目录 /proc | 虚拟文件系统,放置的数据都在内存当中,不占磁盘空间 /sys | 虚拟文件系统,记录内核相关信息,不占磁盘空间


另外需要注意的是,因为根目录与开机有关,开机过程中仅有根目录被挂载。其他分区则是在开机完成后才会持续进行挂载。 因此,根目录下与开机过程有关的目录就不能放到不同的分区中去。

如:

  • /etc
  • /bin
  • /sbin
  • /dev
  • /lib

## /bin

/bin, 基本用户二进制命令文件,供所有用户(系统管理员和用户)使用。

/bin下不能有子目录(subdirectory)。


The following commands or symbolic-links to commands, are required in /bin

命令 | 描述

  •    |		-
    

cat | 将文件连接到stdout的实用程序(Utility) chgrp | 更改文件所有权 chmod | 更改文件访问权限 chown | 更改文件所有者和和组 cp | 复制文件和目录 date | 打印或设置系统数据和时间 dd | 转换和复制文件 df | 磁盘使用情况 dmesg | 打印或控制kernel消息缓冲区 echo | 显示一行文本 false | do nothing, 不成功 true | do nothing, 成功 hostname| 系统主机名 kill | 发送信号到进程 ln | 在文件之间创建链接 login | 在系统上开始会话 ls | 列出目录内容 mkdir | 创建目录 mknod | 创建block或character特殊文件 more | 文本翻页 mount | 挂载文件系统 umount | 解挂文件系统 mv | move/rename文件 ps | 报告进程状态 pwd | 打印当前工作目录 rm | remove文件或目录 sed | sed流编辑器 sh | Bourne command shell stty | 更改或打印终端设置 su | change uid sync | 刷新文件系统缓冲区 uname | 打印系统信息


The following programs or symbolic-links to programs, must be in /bin if the corresponding-system is installed:

命令 | 描述

  •   |		-
    

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


## /boot

/boot :static file of the boot-loader

该目录包含引导过程所需所有内容,处理引导是不需要的配置文件和映射安装文件外。 因此,/boot储存kernel开始执行用户模式之前使用的数据。

** 操作系统kernel必须位于 / or /boot**


## /dev

/dev :device files

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


## /etc

/etc :host-specific system configuration

配置文件是用来控制程序操作的本地静态文件,不能是可执行的二进制文件。


The following files or symbolic-links to files, must be in /etc if the corresponding-subsystem is installed.

文件 | 描述 | 备注

  • | - csh.login | C shell登录的系统范围初始化文件 | Optional exports | NFS文件系统访问控制列表 | Optional fstab | 文件系统静态信息 | Optional ftpusers | FTP守护进程用户访问控制列表 | Optional gateways | 路由网关文件 | Optional gettydefs | getty终端设置 | Optional group | 用户组文件 | Optional passwd | 密码文件 | Optional host.conf | 解析器配置文件 | Optional hosts | 主机域名的静态信息 | Optional hosts.allow | Tcp-wrapper的主机访问文件 | Optional hosts.deny | Tcp-wrapper的主机禁止文件 | Optional hosts.equiv | rlogin, rsh, rcp的可信主机列表 | Optional hosts.lpd | lpd的可信主机列表 | Optional inetd.conf | inetd配置文件 | Optional inittab | init配置文件 | inittab is no longer used when using systemd id.so.conf | 搜索共享库的额外目录 | Optional issue | 预登录消息和 | CentOS Linux 7(core) kernel \r on an \m motd | 登录后信息 | Welcome to $host mtab | 文件系统动态信息 | Optional mtools.conf | mtools配置文件 | Optional networks | 网络名称的静态信息 | Optional printcap | lpd打印机功能数据库 | Optional profile | sh shell login的系统范围初始化文件 | Optional protocols | IP协议列表 | Optional resolv.conf | 域名服务器解析文件 | Optional rpc | RPC协议列表 | Optional securetty | root登录的TTY访问控制 | Optional shells | 有效登录shell的路径名 | Optional syslog.conf | syslogd配置文件 | Optional

## /etc/opt

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

第三方应用程序软件的特定主机配置文件,必须安装在/etc/opt/ 中。


## /etc/xml

/etc/xml :XML的配置文件

这里安装和定义XML系统的高级参数同通用配置文件。


## /home (Optional)

/home :用户主目录

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


## /lib

/lib :基本的共享库和内核模块

/lib目录中包含引导系统和运行在根文件系统的命令,即/bin/sbin中的命令。


至少需要包含以下文件(链接):

文件 | 描述

  • | - libc.so.* | 动态链接C库 ld* | 执行时间 链接器/加载器

## /lib (Optional)

/lib<qual> : 不同格式的基本共享函数库 如:64位的/lib64; 32位的/lib32

用来存放与/lib不同格式的二进制函数库,如支持64位的/lib64函数库等。


## /media

/media :可移除媒体的挂载点

此目录包含的子目录,可作为各移动介质(USB,cdrom,floppy…)的挂载点。

尽管在 /mnt 中使用子目录作为挂载点已经很常见了,但与直接使用/mnt作为临时挂载点的传统相去甚远。


## /mnt

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


## /opt

/opt :为第三方软件包保留的目录

要安装在/opt中的软件包必须将其静态文件放置在单独的/opt/<packge>目录树中。

目录/opt/bin, /opt/doc, /opt/include, /opt/info, /opt/lib, /opt/man 是保留给本地系统管理员使用。 如果第三方软件包含Unix手册,而手册必须放置于/opt//share/man/,必须使用与/usr/share/man相同的子结构。


## /root (Optional)

/root :root用户的主目录


## /sbin

/sbin :系统二进制文件

系统管理的实用程序(命令),存储在/sbin, /usr/sbin, /usr/local/sbin中。 /sbin包含启动,恢复,修复系统,以及/bin中二进制文件所必须的二进制文件。 本地安装的系统管理程序应放置在/usr/local/sbin中。


The following commands or symbolic-links to commands are required in /sbin ``` shutdown #关闭系统 ```
The following files or symbolic-links to files,must be in /sbin if the corresponding subsystem is installed

命令 | 描述 | 备注

  • | - | - fastboot | 重启系统而不检查磁盘 | Optional fasthalt | 停止系统而不检查磁盘 | Optional fdisk | 分区表操作器 | Optional fsck | 文件系统检查和修理工具 | Optional fsck.* | 针对特定文件系统检查和修复 | Optional
    eg:fsck.ext3 getty | getty程序 | Optional half | 停止系统 | Optional ifconfig | 配置网络接口 | Optional init | 初始化进程 | Optional mkfs | 创建文件系统 | Optional mkfs.* | 创建特定文件系统 | OPtional
    eg: mkfs.ext4 mkswap | 设置swap分区 | OPtional reboot | 重启系统 | OPtional route | IP路由表实用程序 | OPtional swapon | 启用分页和交换 | OPtional swapoff | Disable paging and swapping | Optional update | 守护进程定期刷新文件系统缓冲区 | Optional

## /srv

/srv :系统提供的服务(service)的数据


## /tmp

/tmp :临时文件

/tmp目录为临时需要文件的程序提供。 程序不能在程序的调用之间保留/tmp中的任何文件或目录。 尽管/tmp中数据可能会以某种特定方式删除,但建议在系统启动时删除/tmp中所有文件。



# The /usr Hierarchy

/usr 里面放置的数据是可分享与不可变动的。 这就意味着可在各种符合FHS的主机之间共享,但不能写入。 大型软件包不应在/usr层次结构下使用直接子目录。


The following dirs of symbolic-links to dirs are required in /usr

目录 | 描述

  • | - /usr/bin | 大多数用户命令 /usr/include | C程序包含的头文件 /usr/lib | 库文件 /usr/local | 本地层次结构 /usr/sbin | 非重要的系统二进制文件 /usr/share | 独立于架构的数据

其他选项:

目录| 描述 | 备注

  • | - | - /usr/lib<qual> | 可选格式库 | Optional /usr/src | 源代码 | OPtional /usr/games | 游戏和教育二进制文件 | OPtional

## /usr/bin

/usr/bin :大多数用户命令 这是系统上可执行命令的主要目录。


The following files or symbolic-links to files must be in /usr/bin, if the corresponding subsystem is installed

命令 | 描述 | 备注

  • | - | - perl | 实用提取和报告语言 | OPtional python | python解释语言 | Optional tclsh | tcl解释器的简单shell | OPtional wish | 简单 tcl/tk windowing shell | Optional expect | 程序交互式对话 | Optional

因为shell script解释器(在shell script脚本的第一行 #!)不能依赖路径,所以标准化它们的位置是有利的。 Bourne shell 和 C-shell解释器已经被固定在/bin中,但 perl,python,tcl经常在许多不同的地方。


## /usr/include

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

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


## /usr/lib

/usr/lib :编程和包的所需要的库

/usr/lib包括 不打算由用户或shell script直接执行的目标文件、库和内部二进制文件。


## /usr/lib (Optional)

/usr/lib<qual> :可选格式库


## /usr/local

/usr/local :本地层次结构

/usr/local是给系统管理员安装本地软件使用。当系统软件更新时,需保证安全。 它可以用于在一组主机之间共享,但在 usr中找不到的程序和数据。

本地安装软件必须放在 /usr/local 而不是 /usr,除非安装它来升级或替换usr的软件


The following dirs or symbolic-links to dis must be in `/usr/local`

目录 | 描述 |

  • | - /usr/local/bin | 本地二进制文件 /usr/local/etc | 本地二进制文件的特定配置文件 /usr/local/games | 本地游戏二进制文件 /usr/local/include | 本地C头文件 /usr/local/lib | 本地库 /usr/local/man | 本地在线手册 /usr/local/sbin | 本地系统二进制文件 /usr/local/share | 本地独立架构层次结构 /usr/local/src | 本地源码

/usr/local/share目录内容的要求应与/usr/share相同,唯一附加约束是/usr/local/share/man/usr/local/man目录必须是同步的。(基本上就是符号链接了!)


## /usr/sbin

/usr/sbin :非必要的标准系统二进制文件

该目录包含系统管理员专门使用的任何非必要的二进制文件。 系统修复、恢复、挂载/usr等其他重要必要功能必须放在/sbin中。


## /usr/share

/usr/share :独立于架构的数据

/usr/share层次 是为了所有只读架构独立数据。 该层次可以在给定OS的所有体系架构平台之间共享。如具有i386和PPC平台站点可能会维护一个集中安装的/usr/share目录。 但/usr/share一般不打算由不同的操作系统共享,或由同一操作系统的不同版本共享。


The following dis or symbolic-links to dirs must be in /usr/share

目录 | 描述

  • | - man | 在线手册 misc | 其他独立于架构的数据

The following dis or symbolic-links to dirs must be in /usr/share, if the corresponding subsystem is installed

目录 | 描述 | 备注

  • | - | - dict | 单词列表 | Optional doc | 各种文档 | Optional games | /usr/games的静态文件 | Optional info | GNU Info system’s primary dir | Optional locale | 支持的区域信息 | Optional zoneinfo | Timezone info and conf | Optional NLS | Native language support | Optional sgml | SGML数据 | Optional terminfo | terminfo数据库目录 | Optional xml | xml数据 | Optional

### /usr/share/dict

/usr/share/dict :单词列表 这个目录是系统上单词列表的家目录,只包含英文单词,它们由look和各种拼写程序使用。 它们是所有拼写检查器唯一通用的文件。

文件 | 描述 | 备注

  • | - | - words | 单词列表 | Optional linu.words | linux可用单词列表 | Optional

### /usr/share/man

/usr/share/man :手册页 它包含了/, /usr文件系统下的命令和数据的手册信息

手册页存储在 /usr/share/man/<locale>/man<section>/<arch>中。

每个部分的描述:

  • man1: 可公开访问的命令的手册页,用户需要使用的大多数程序文档放置于此;
  • man2: 系统调用部分,描述所有的系统调用(请求内核执行操作);
  • man3: 函数库和子例程部分,描述不直接调用内核服务的程序库例程;
  • man4: 特定文件部分,描述系统中特定文件,相关驱动程序和网络支持。通常,这包含/dev中找到的设备以及网络协议支持的内核接口;
  • man5: 文件格式部分,许多数据文件的格式记录在此;
  • man6: 游戏,演示和一般小程序;
  • man7: 各种难以分类的手册页;
  • man8: 系统管理员用于操作和维护系统的程序记录在这。

The following dirs or symboli-link to dirs must be in `/usr/share/man/`, unless they are empty

目录 | 描述 | 备注

  • | - | - man1 | 用户程序 | Optional man2 | 系统调用 | Optional man3 | 函数库调用 | Optional man4 | 特定文件 | Optional man5 | 文件格式 | Optional man6 | 游戏 | Optional man7 | 混杂的手册页 | Optional man8 | 系统管理 | Optional

必须在`/usr/share/man`结构中作出规定,以支持用不同语言编写的手册页。这些规定必须考虑到手册页的存储和参考,相关因素包括语言和字符编码集。

栗子:

Language | Country | CharacterSet | Dir

  • | - | - | - English | - | ASCII | /usr/share/man/en English | United Kingdom | ISO 8859-15 | /usr/share/man/en_GB English | United States | ASCII | /usr/share/man/en_US

### /usr/share/misc

/usr/share/misc :与架构无关的数据


### /usr/share/sgml

/usr/share/sgml :SGML数据


### /usr/share/xml

/usr/share/xml :XML数据


## /usr/src

/usr/src :源代码 Source Code可能放置在此目录的子目录中,仅供参考。



# /var Hierarchy

/var 包含可变数据文件,包括假脱机目录和文件,系统管理和登录数据,以及临时文件。

如果/var不能成为一个单独的分区,最好将/var移出/分区并移入/usr分区。(为了减小根分区大小或当根分区空间不足时) 也可将/var链接到/usr/var


The following dirs or symbolic-link to dirs are required in `/var`.

目录 | 描述

  • | - /var/cache | 应用程序缓存数据 /var/lib | 可变状态信息 /var/local | /usr/local的可变数据 /var/lock | 锁文件 /var/log | 日志文件 /var/opt | /opt的可变数据 /var/run | 与运行进程相关的数据 /var/spool | 应用程序队列数据 /var/tmp | 为系统重启保留的临时文件

The following dirs or symbolic-link to dir must be in /var,if the corresponding subsystem is installed.

目录 | 描述 | 备注

  • | - | - /var/account | 进程账户日志 | 可选 /var/crash | 系统奔溃转储 | 可选 /var/games | 可变游戏数据 | 可选 /var/mail | 用户邮箱文件 | 可选 /var/yp | 网络信息服务数据库文件

## /var/account

/var/account :该目录保存当前活动的进程记账日志和复合进程数据。


## /var/cache

/var/cache :保存应用程序缓存的数据。应用程序必须能够重新生成或回复数据。 与/var/spool不同,删除了缓存文件不会丢失数据。数据必须在应用程序调用和系统重启间保持有效。 缓存目录的数据格式没有其他要求。

对于缓存数据单独存在的目录,系统管理员可从/var下其他目录设备不同的磁盘和备份策略。

目录 | 描述 | 备注

  • | - | - /var/cache/fonts | 本地生成的字体 | 可选 /var/cache/man | 本地格式化的手册页 | 可选 /var/cache/www | www代理或缓存数据 | 可选 /var/cache/<package> | 特定包缓存数据 | 可选

## /var/lib

/var/lib :可变状态信息。目录保存于应用程序或系统有关的状态信息。 状态信息(state infofmation),是程序在运行时修改的数据,属于一个特定的主机。

应用程序必须为其数据使用/var/lib/<subdir>,有一个必须的子目录/var/lib/misc用于不需要子目录的状态文件。


## /var/lock

/var/lock :锁文件,锁文件应该存储在此目录中。 锁文件锁定多个应用程序共享的设备和其他资源。

这种锁文件内容的格式必须是HDB UUCP锁文件格式。 HDB格式是将进程标识符(PID)存储为ASCII十进制数,并带有换行符。


## /var/log

/var/log :日志文件和目录,大多数日志必须写入此目录或适当子目录。


The following file or symbolic-link to file must be in /var/log.

文件 | 描述

  • | - lastlog | 每个用户上次登录信息的记录 message | syslogd的系统信息 wtmp | 所有登录和注销的记录

## /var/mail

邮件缓存区必须通过/var/mail访问,邮件缓冲区文件必须采用的形式。


## /var/run

/var/run :运行时变化数据,此目录包含系统信息数据,描述系统启动以来的情况。 此目录下的文件必须在引导过程开始时被清除。 进程标识符(PID)文件放置于此目录或下的子目录里面。


## /var/spool

/var/spool :应用程序队列数据。 此目录包含正在等待某种稍后处理的数据,/var/spool中的数据表示工作将在将来执行(通过程序,用户或管理员),数据通常会在工作处理后被删除。


The following dirs or symbolic-link to dirs must be in /var/spool,if the corresponding subsystem is installed.

目录 | 描述 | 备注

  • | - | - lpd | 打印机队列目录 | 可选 mqueue | 发送邮件队列 | 可选 news | 新闻假脱机目录 | 可选 rwho | rwhod文件 | 可选 uucp | uucp的假脱机目录 | 可选

## /var/tmp

/var/tmp :在系统重启之间保存的临时文件。存储在/var/tmp的数据比/tmp中的数据更持久。



# OS Specific Annex

本节是针对仅适用于特定OS的其他建议和要求。

Linux

Linux操作系统的附件

/ :根目录

在Linux系统上,如果内核位于/,建议使用Linux内核源代码包中使用的名称vmlinux或vmlinuz

我的CentOS7中,内核文件默认是/boot/vmlinuz-$kernel-version.$arch


### /bin :基本用户命令二进制文件(供多有用户使用)
### /dev :设备和特殊文件
  1. /dev/null : 写入该设备的所有数据都被丢弃。从这个设备读取将返回一个EOF条件。
  2. /dev/zero : 该设备是归零数据的来源,写入该设备的所有数据被丢弃。从这个设备读取将返回包含zero的请求的字节数。
  3. /dev/tty : 该设备类似于进程控制终端。一旦这个设备被打开,所有读写操作就好像实际的控制终端以及被打开一样。

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

Linux系统要将附件文件放置到/etc中。


### /lib64 和 /lib32 :64/32位库(依赖于体系结构)

64位体系结构PPC64,AMD64,x86_64必须将64位库放置于/lib64中,将32位库放置于/lib中; 64位体系结构IA64必须将64位库放置于/lib中。


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

PROC文件系统是用于处理进程和系统信息的标准Linux方法,而不是/dev/kmem和其它类似方法。 强烈建议使用PROC文件系统获取 存储,进程,内存,内核等信息。


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

Linux系统将这些附加文件放置于/sbin中:

第二扩展文件系统命令(可选):

1
2
3
4
5
6
badblocks
dumpe2fs
e2fsck
mke2fs
mklost+found
tune2fs

boot-loader 映射安装程序(可选): lilo

静态二进制文件:

1
2
3
ldconfig
sln(static ln)
ssync(static sync)

出现问题时,sln(静态ln)和ssync(静态同步)非常有用; idconfig程序可以作为升级知道的手段; sln的主要用途,修复不良协调升级后/lib中不正确的符号链接动态库。

对于/sbin, idconfig二进制文件是可选的。因为站点可能会在启动时选择运行idconfig而不是仅在升级共享库时。 以下是一些常见问题:

  • 我刚刚删除了/lib/
  • 我无法找到库的名称,因为ls是动态链接。我使用的shell没有内置ls,我也不知道使用echo *作为替换;
  • 我有一个静态ln,但我不知道怎么称呼这个链接。

杂项:

1
2
3
4
5
#ctrl+alt+del
ctrlaltdel

#keyboard rate
kbdrate

为了应对某些键盘出现如此高的重复速率一致无法使用,kbdrate可以安装在某些系统上的/sbin中;

由于ctrl+alt+del组合键在内核中的默认操作是硬重启,因此通常建议在将根文件系统挂在到读写模式之前禁用该行为。这就可能需要ctrlaltdel程序,它可以安装在系统的/sbin中。


## /usr/include :C程序包含的头文件

如果安装了C或C++编译器,则只有非 基于glibc的系统才需要这些链接符号。

1
2
/usr/include/asm  -> /usr/src/linux/include/asm-<arch>
/usr/include/linux  -> /usr/src/linux/include/linux

## /usr/src :源代码

对于基于glibc的系统,此目录没有具体指导。

对于glibc之前基于linux libc修订版的系统: /usr/src/linux是唯一放置Linux内核源代码的位置。


## /usr/spool/cron :cron和jobs

此目录包含了cron和程序的可变数据。