Linux操作系统基础解析之——文件系统层次结构标准(FHS)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux操作系统基础解析之——文件系统层次结构标准(FHS)相关的知识,希望对你有一定的参考价值。

  一切皆文件是Linux的最基本的最朴素的哲学思想之一。意思就是说:凡是在Linux操作系统中能够被访问和使用的资源,都会以文件的形式提供给用户,即便是硬件设备、进程互操作、网络访问等这些看似与文件无关的内容,也可以虚拟抽象成文件,这就是Linux操作系统。也就是说,在一个完整意义的Linux操作系统中,存在的大量的、数以万计的文件。这些文件有的是硬件设备,有的是管道,有的是套接字,目录文件,符号链接文件,设备锁文件,进程锁文件,被编译好的二进制文件(可执行应用程序、库文件、内核文件)、压缩包文件和归档文件、各种格式的图片文件、各种格式的视频文件等等,当然用途最广数量最庞大的当属普通的ASCII文本文件。
  如此之多的文件全部都存放在我们的磁盘中,存储这些文件的目的其实只有一个:在有需要的时候能够找到他们,并且要尽可能的准确,尽可能的快才行。如果只是找到他们,难度是非常小的,反正他们就在这里,找就是了,只要存在,就一定能找到。但是如果想要快速高效的查找,就不那么简单了。
  如果想要从数量众多的文件中找到我们所需的那个文件,有两个办法:遍历和分层。遍历的准确性是有的,但是效率和速度是非常差的,而且有时快有时慢,非常不稳定;分层是一个不错的主意,因为这样可以将所有的文件统一起来按照某一特性或某些特性进行分类,每个分类中可以继续根据其他特性进行二次分类,三次分类,...这样逐级的缩小查找范围。一般来讲,只要分层合理,只需要有限的几次就可以定位到要查找的文件的位置了。这种基于层级的方式管理文件的机制,就称之为文件系统。为此,人们推出了FHS(Filesystem Hierarchy Standard,文件系统分层标准)。在FHS中,明确的规定了采用树形结构来组织文件。但FHS仅是定义出最上层目录——根(/)及子层目录(/usr, /var)的目录内容应该要放置的文件数据,因此,在其他子目录层级内,就可以随开发人员自行配置了。FHS定义了系统中每个分层的用途、必须的最小构成的文件和目录,同时还给出了例外处理和矛盾处理。
  该标准做出如是假设:在操作系统中以着一个FHS兼容的文件系统并支持在大多数的UNIX文件系统中能找到的相同的基本安全特性。
  它定义了文件之间的两个独立的特质:可共享和不可共享、可变和静态。一般来说,位于不同目录的文件在这两方面存在着差异。这使得在不同的文件系统上使用不同的特性来存储文件变得简单起来。
  1.可共享和不可共享
    "可共享"的文件:是那些可以存储在当前主机上并且可以在其他主机上使用的文件。
    "不可共享"的文件:是那些存储在当前主机上的然而并不能在其他主机上使用的文件。
    例如,在用户家目录里的文件可以共享,而设备锁文件却不行。
  2.可变和静态
    "静态"文件包括二进制文件,库文件,文档和那些在没有系统管理员干涉下不能被改变的文件。
    "动态"文件就是非静态的文件。

根目录"/"是根分区的挂载点,也是根文件系统的所在。根文件系统所包含的内容必须能够胜任操作系统的启动,还原,恢复或修复等功能。
  1.为了启动系统,根分区必须有足够的空间用来挂载其他的文件系统。这包括应用程序、配置、引导加载信息,和其他的一些基本启动数据。/usr, /opt和/var被设计成可能需要存放在其他文件系统或分区上。
  2.为了恢复或修复系统,那些由经验丰富的运维工程师用来恢复或修复被损坏系统的工具,必须位于根文件系统。
  3.为了还原系统,那些用于从系统备份集中执行还原操作的工具必须放在根文件系统上。
主要是很多人喜欢将文件放置在根文件系统上,出于平衡性考虑,根文件系统应该尽可能小,因为:
  1.偶尔会从一个小存储介质来挂载根文件系统。
  2.根文件系统通常为不可共享的。在一个服务器上,若干根文件系统太大,就会相应减少可共享的数据的存储空间。
  3.大的根文件系统很可能和小的根文件系统出现兼容性的问题。
  4.因磁盘错误导致根文件系统数据损坏要远远比其他文件系统出错导致数据损坏严重的多,而小根文件系统可以最大程度的规避这种由系统崩溃带来的风险。
  应用程序不应该在根目录创建文件或需要一个特殊的文件或子目录。FHS层次结构的其他位置为所有应用程序包,提供了更多的弹性。原因如下:
    1.出于性能和安全性的考虑,系统管理员应该保证根文件系统足够小和足够简单。
    2.它规避了系统管理员可以通过可挂载的卷设置分配标准文件的层次结构带来的任何风险。

以下的目录或目录符号链接应该存在于"/"(根目录)下。
    目录            描述
    bin           基本的二进制命令。
    boot          引导应用程序的静态文件。
    dev           设备文件。
    etc           主机专用的系统配置文件。
    lib           基本的共享库和内核模块。
    media         可移动存储介质挂载点。
    mnt           临时文件系统挂载点。
    opt           附加的应用程序应用程序包
    sbin          基本的系统二进制文件。
    srv           由系统提供的服务数据。
    tmp           临时文件。
    usr           第二层次结构的根。
    var           可变化数据。
    home          普通用户宿主目录。(可选)
    lib<qual>     可替换格式的基础共享库。(可选)
    root          根用户的宿主目录。(可选)

 
/bin:用户基础的二进制命令(由所有用户使用)
  /bin中包含的命令,可以被系统管理员和其他的用户使用,但必须在没有其他文件系统被挂载的情况下(如,单用户模式)。这里边可能还有被脚本间接使用的命令。
  /bin不能有子目录。

/boot:启动引导静态文件
  该文件夹下存储除配置文件外的其他启动时候需要的文件,这些文件用于内核开始执行用户模式应用程序之前。
  操作系统的内核必须位于/或/boot下。
 
/dev:设备文件
  该文件目录是特殊文件或设备文件所在的目录。
  该目录下的设备文件在可能的情况下需要手动建立。该文件下必须包含一个MAKEDEV命令,它用于在需要的时候创建设备,通过这些设备可以访问位于内核的驱动应用程序,该命令是一个脚本应用程序,一般是一个符号链接,链接到/sbin/MAKEDEV。
 
/etc:主机特定的系统配置
  /etc目录下包含配置文件,本地配置文件用于控制应用程序的操作,它必须是静态的且不能是可执行二进制文件,/etc下不能存放二进制文件。
  以下目录或符号链接目录在/etc中是需要的:
    opt(用于配置/opt目录)、X11(用于配置X窗口系统(可选))、sgml(用于配置SGML(可选))、xml(用于配置XML(可选))
    /etc/opt:/opt的配置文件
      作为主机特定配置文件,在安装了应用程序包后相应配置文件必须放在/etc/opt目录或其子目录下。子目录里存储来自安装包的静态数据。
      没有任何结构是强制要求安排在/etc/opt/<subdir>。
      如果一个配置文件必须位于不同地方,以使应用程序或系统正常运行,那么可以将它放在/etc/opt/<subdir>以外的地方。
    /etc/X11:用于配置X窗口系统(可选)
      /etc/X11是X11特定的配置文件的存放位置。
      /etc/X11的子目录包括xdm和其他一些应用程序(如,窗口管理器)的配置文件。一般情况下,建议只有一个窗口管理器配置文件.*wmrc作为默认配置文件,并且应该命名为system.*wmrc。窗口管理器子目录必须和它的二进制文件同名。
    /etc/sgml:用于配置SGML的配置文件。(可选)
      一般用于配置关于SGML上层参数的文件被存放在这里。文件命名为*.conf表明是通用配置文件。文件命名为*.cat表明是DTD-specific的集中目录文件,其中包括了给定的DTD会用到的所有其他目录。超级目录文件编辑引用的所有集中目录。
    /etc/xml:用于配置XML的配置文件。(可选)
      一般用于配置关于XML上层参数的文件被存放在这里。文件命名为*.conf表明是通用配置文件。超级目录文件编辑引用的所有集中目录。
 
/home:普通用户宿主目录。(可选)
  /home是一个标准的概念,不同主机的对该文件系统的组织是不同的。因此,没有应用程序会依赖于这个目录。
  用户应用程序的特定配置文件以‘.‘开头来命名,并存储在用户的家目录里。如果一个应用程序需要多个配置文件,那么这些配置文件应该放在一个以‘.‘开头来命名的子目录中。在这种情况下,子目录中的文件就不用以‘.‘开头来命名了。
 
/lib:基本共享库和内核模块
  在/lib目录下包含了启动系统和运行根文件系统下的命令所需要的共享库等。这些命令的二进制文件位于/bin和/sbin下。
    至少需要以下两种命名方式的一种(它们可以是文件或符号链接):
       libc.so.*     C库的动态链接。(可选)
       ld*           运行时链接器。(可选)
  由于历史的原因,如果装载了C预处理器,那么/lib/cpp必须引用它

/media:可移动存储介质挂载点
  该目录包含用于挂载像软盘、光盘等的子目录。在历史上存在其他的移动媒介挂载点(像/cdrom,/mnt和/mnt/cdrom等)。现在也常用/mnt子目录来挂载移动存储介质。
  当系统中挂载了多种同一类型的媒介时,目录名需要加上一个数字用以区分,这个数字从0开始。(如/dev/sr0)
 
/mnt:临时文件系统挂载点
  该目录被提供用于系统管理员挂载临时文件系统。此目录的内容是一个位置问题,它不能影响其他应用程序的运行方式。
  此目录一定不能用来安装应用程序,如果真的要安装应用程序,可以用一个系统没有用的合适的临时目录来代替。
 
/opt:用于安装附加应用应用程序包
  /opt曾经是保留给安装附加应用应用程序包的,但现在几近废弃。

/root:跟用户的主目录(可选)
  root用户的主目录可能由开发商和个人喜好,而位于不同位置,但是这个位置推荐的默认位置。
 
/sbin:系统二进制文件
  系统管理(仅root用户可执行的命令)使用的应用程序被存放在/sbin, /usr/sbin, 和/usr/local/sbin中
  /sbin中包含引导,备份,恢复等至关重要的二进制文件。修复系统的二进制文件位于/bin中。普通用户可用的系统工具位于/usr/sbin中。本地安装的系统管理应用程序应该放在/usr/local/sbin中。
    以下命令或命令的符号链接在/sbin中是需要有。
      shutdown
    如果安装了相应的子系统,那么以下文件或文件符号链接必须位于/sbin目录下:
      fastboot       不检查磁盘的方式重启电脑。(可选)
      fasthalt       不检查磁盘的方式关闭系统。(可选)
      fdist          分区表工具。(可选)
      fsck           文件系统检查和修复工具。(可选)
      fsck.*         特殊文件系统检查和修复工具。(可选)
      getty          getty应用程序。(可选)
      halt           关闭系统。(可选)
      ifconfig       配置网络接口。(可选)
      init           初始化进程。(可选)
      mkfs           创建文件系统命令。(可选)
      mkfs.*         特殊文件系统创建命令。(可选)
      mkswap         设置交换分区。(可选)
      reboot         重启系统。(可选)
      route          ip路由表共用应用程序。(可选)
      swapon         使能交换分区。(可选)
      swapoff        停止交换分区。(可选)
      update         定期刷新磁盘缓存守护进程。(可选)
 
/srv:系统提供的服务数据
  存储由有系统提供的特定的数据,可以用于存储像www,ftp,rsync,cvs这些协议支持下的数据,但不同主机方法不同。
 
/tmp:存放临时文件
  /tmp目录必须能够存储应用程序执行过程中产生的临时文件。
    应用程序不能假设在应用程序调用过程中存在于/tmp中的文件和目录会被保留。通常情况下,在重启之后/tmp中的文件或目录应该被删除。

/usr层次结构
  /usr是文件系统的第二个主要部分,甚至有的时候我们称其为"第二根"。/usr下的数据是可共享,且只读的。这意味着/usr能够和各种FHS标准兼容的主机共享数据,但是为只读。任何主机相关和随时间变化的数据存储在其他地方。
  对于大的应用程序包,在/usr层次结构下不能使用直接子目录。
    下面的目录或者目录符号链接,应该在/usr下。
       bin           绝大多数用户命令。
       include       C应用程序头文件。
       lib           库文件
       local         本地层次结构
       sbin          非关键的系统二进制文件。
       share         体系结构无关数据。
       X11R6         X窗口系统,11版第6版。(可选)
       game          游戏或教育相关的二进制文件。(可选)
       lib<qual>     其他格式的库文件。(可选)
       src           源代码。(可选)

  以下目录的符号链接可能会存在。这主要是要保持与旧系统的兼容性,直到所有的实现都被假设使用/var层次结构。
    /usr/spool -> /var/spool
    /usr/tmp -> /var/tmp
    /usr/spool/locks -> /var/lock
    一旦系统不再需要上述符号链接,在需要的情况下这些链接会被删除。
 
  /usr/X11R6: X窗口系统,11版第6版。(可选)
    这个目录层次结构是为了保存X窗口系统11版第6版和相关文件的。
    为了简单化问题和使Xfree86在不同的系统上与X窗口系统兼容,下边的符号链接必须存在,前提是/usr/X11R6存在。
      /usr/bin/X11 –> /usr/X11R6/bin
      /usr/lib/X11 -> /usr/X11R6/lib/X11
      /usr/include/X11 -> /usr/X11R6/include/X11
    一般来说,应用程序不能通过上述符号链接安装或管理。它们只供用户使用。在整个过渡期内,应用程序不可能知道系统正在使用哪个X11的发行版。
    在/usr/X11R6/lib/X11中的特定文件会被解释为演示文件。应用程序需要关于当前主机的信息,必须引用/etc/X11下的配置文件。/etc/X11下的配置文件可能被链接到/usr/X11R6/lib下的相应文件(如:Xconfig, XF86Config, 或 system.twmrc等配置文件)。
 
  /usr/bin: 绝大多数用户命令。
    这是系统可执行命令的主目录。
    如果/usr/X11R6存在,则/usr/bin/X11必须是/usr/X11R6的符号链接。

  /usr/include:标准头文件目录
    这里是系统所有的一般应用的C语言头文件的所在地。
    如果/usr/X11R6/include/X11存在,则/usr/include/X11必须是/usr/X11R6/include/X11的符号链接。
 
  /usr/lib:应用程序和包的库文件
    /usr/lib包含对象文件,库和不能被用户或shell脚本直接运行的内部二进制文件。
    应用程序可以使用/usr/lib下的单独的子目录。如果一个应用程序使用了一个子目录,那么所有与这个应用程序的架构相关的专用数据必须位于该子目录内。
    由于历史的原因,如果/usr/sbin/sendmail存在,则/usr/lib/sendmail必须是一个/usr/sbin/sendmail的动态链接。
    如果/lib/X11存在,usr/lib/X11必须是/lib/X11的动态链接。
 
  /usr/lib<qual>:其他格式的库文件。(可选)
    /usr/lib<qual>是一种替代二进制格式的库文件,除了不需要/usr/lib<qual>/sendmail和/usr/lib<qual>/X11之外,它和/usr/lib没什么区别。
 
  /usr/local:本地层次结构
    /usr/local目录里面的文件都是由系统管理员在本地安装应用程序。当系统应用程序升级时它需要被安全的覆盖。它可以用于在一组主机之间共享的应用程序或数据,且应用程序和数据/usr下不能被找到。
    本地应用程序安装必须位于/usr/local下而不是/usr,除非应用程序是用来替换或更新/usr下已有的应用程序。
    以下目录或符号链接目录,必须位于/usr/local下。
       bin           本地二进制文件。
       etc           为本地二进制文件的主机特定的系统配置。
       games         本地游戏二进制文件。
       include       本地C头文件。
       man           本地在线帮助。
       sbin          本地系统二进制文件。
       share         本地体系结构无关层次结构。
       src           本地源代码。
    第一次安装系统之后,/usr/local除了下边列出的目录以外,没有其他的目录。
      如果/lib<qual>或/usr/lib<qual>目录存在,那么/usr/local下应该有等价的目录。
      /usr/local/etc可能是/etc/local的符号链接。
      /usr下的应用程序的配置文件必须在/etc下,而在/usr/local下的应用程序配置文件放在/usr/local/etc中。
    /usr/local/share
      该目录的内容要求和/usr/share一样。唯一的限制是/usr/local/share/man和/usr/local/man目录必须是同一个(这也就意味着其中一个是一个符号链接)。
 
  /usr/sbin:非关键的系统二进制文件
    该目录包含一些由系统管理员专用的非关键的系统二进制文件。这些系统管理应用程序用于修复,系统恢复,挂载/usr。其他关键的应用必须位于/sbin。
 
  /usr/share:体系结构无关数据
    /usr/share用于存放所有只读的且是架构无关的数据文件。该层次结构用于在一个给定的操作系统的所有架构平台的数据共享。因此,例如,基于i386,Alpha和PPC硬件平台的网站共同维护一个集中挂载的/usr/share目录。但是请注意,/usr/share通常不会在不同操作系统或是同一个操作系统的不同发行版实现共享。
    一些应用程序或包所包含或需求的数据如果不需要改变,那么它们可以放在/usr/share(或 /usr/local/share,如果安装在本)。建议在/usr/share下用相应的子目录。
    游戏数据存储在/usr/share/games下,必须确保是纯粹的静态数据。一些可修改的文件,如评分文件,游戏日志等,应该放在/var/games下。
    如果安装了相应的子系统,那么以下目录或目录符号链接必须位于/usr/share。
       dict          词汇表。(可选)
       doc           杂项文件。(可选)
       games         游戏静态文件。(可选)
       info          GNU信息系统主目录。(可选)
       locale        本地信息。(可选)
       nls           本地语言支持信息目录。(可选)
       sgml          SGML数据。(可选)
       terminfo      terminfo数据库目录。(可选)
       tmac          troff macros not distributed with groff (optional)
       xml           XML数据。(可选)
       zoneinfo      时区信息和配置。(可选)
    具体应用及独立架构目录建议放置在/usr/share。这样的目录包括:groff, perl, ghostscript, texmf和kbd(linux)或syscons(BSD)。为了向后兼容,他们可能被放置在/usr/lib,这取决于发布商的意愿。如果发布商愿意,也可以把/usr/lib/game层次结构换到/usr/share/games层次结构中。
 
      /usr/share/dict:词汇表(可选)
        该目录为系统词汇表的主目录。传统情况这里只包含英文单词文件,这些文件用于look命令和各种拼写规则。单词可以采用美式或英式拼写。
      /usr/share/man:帮助手册页
        这里介绍了整个系统帮助手册的组织细节,也包括/usr/share/man,同时还参考/var/cache/man。
        每一节的描述如下:
          man1:用户应用程序可公开访问的命令的描述手册页都包含在此章。绝大多数用户需要用到的应用程序文档都在这里。
          man2:系统调用手册页,这里描述了所有的系统调用(请求内核执行操作)。
          man3:库函数和子应用程序,本章描述了不直接调用内核服务的库例程。本章节和第二章节只有应用程序员会真正的感兴趣。
          man4:特殊文件章节,他描述了特殊文件,有关驱动应用程序的功能和系统中对网络的支持。典型情况,这里包含在/dev下的设备文件和对网络协议支持的内核接口的描述。
          man5:文件格式,关于绝大数的数据文件的格式记录在这里。这里包括各种头文件,应用程序输出文件和系统文件。
          man6:游戏,本章介绍游戏,演示和一般简单应用程序。对于本章节的的重要性,不同的人有着不同的观点。
          man7:杂项手册页,它包含一些难以被分类的手册。Troff和其他文本处理宏包可以在这里找到。
          man8:这里记录了由系统管理员用于系统操作和维护的系统管理应用程序。其他偶尔被用户用到的应用程序也记录在这里。

      /usr/share/misc:其他与架构无关的数据(杂项)
        包含了那些不需要在/usr/share下单独划分子目录的架构无关的数据。

      /usr/share/sgml:SGML数据(可选)
        /usr/share/sgml包含架构无关的SGML应用程序的文件。如,普通目录,DTDs(Documnet Type Definition),样式表。

      /usr/share/xml:XML 数据(可选)
        /usr/share/sgml包含架构无关的XML应用的文件。如,普通目录,DTDs,样式表。

    /usr/src:源代码(可选)
      源代码可以放在该目录,仅供参考。

/var层次结构
  /var包含可变数据文件。该目录下包含后台打印目录和文件,管理和日志数据,临时文件。
  /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,因为这样是/var和/usr不易区分,并且容易造成命名冲突。作为替代,/var应该链接到/usr/var。

  /var/account:进程日志记录(可选)
    该目录保存当前活动进程的日志记录和复合进程使用的数据。
 
  /var/cache:应用程序缓存数据
    该目录用于缓存来自于应用程序的数据。这些数据是本地生产的作为费时的I/O和计算数据的结果。应用程序必须能够再生和恢复这些数据。不像/var/spool,缓存文件可以被删除而不丢失数据。这些数据必须在应用程序调用和系统重启之间是持续有效的。

    /var/cache/fonts:本地生成的字体(可选)
      /var/cache/fonts目录用于存储一些动态生成的字体。特别是由"mktexpk"自动生成的字体,必须放在/var/cache/fonts下的合适的子目录中。
      其他动态生成的字体也位于/var/cache/fonts下的合适子目录中。

    /var/cache/man:本地格式的手册页(可选)
      该目录为提供一个只读/usr分区的站点提供一个标准的位置,但是允许缓存本地格式的手册页。以可写方式挂载/usr的站点可以选择选择不使用/var/cache/man并且可以有格式地将手册页直接写在/usr/share/man的cat<section>目录中。我们建议大多数站点用以下的其中一个选项来代替:
        预格式化所有没有格式化版本。
        不允许缓存已经格式化的手册页,在每次手册页被提请时候需要完成格式化过程。
        允许在/var/cache/man中已经格式化的手册页的本地缓存。

  /var/crash:系统崩溃转存(可选)
    该目录存放系统崩溃转存。在FHS标准公布之前,Linux系统是不支持系统崩溃转存的,但是其他符合FHS标准的系统会支持。
 
  /var/games:可变游戏数据(可选)
    任何在/usr中的与游戏相关的可变数据应该放在这里。/var/games存储以前能在/usr找到的动态数据。静态数据,如帮助文档,游戏等级等则必须存储在其他地方,如/usr/share/games。
 
  /var/lib:可变状态信息
    该目录保存与应用程序或系统的状态相关的信息。这些状态是应用程序运行时被修改的数据,且它们是与特定主机有关的。用户永远都不必为了配置一个数据包的操作而修改/var/lib中的文件。
       状态信息通常用来维持一组相互关联的应用程序之间调用的条件或同一个应用程序的不同实例之间调用的条件。状态信息在重启后应该保持有效。
       一个应用程序(或一组相互关联的应用程序)必须用/var/lib下的一个子目录来存储它的数据。这里有个子目录,/var/lib/misc, 用它来存放状态文件而无需创建一个新的子目录。只有在发布应用程序的时候包含了问题才有其他子目录存在的必要。

    /var/lib/<editor>:编辑器备份文件和状态文件(可选)
      该目录用于保存所有因为编辑器意外终止而生成的文件。(如elvis, jove, nvi等)。
      其他的编辑器不需要崩溃恢复文件目录,但是需要一个明确的位置用于存储编辑器运行过程中产生的其他信息。这类信息会被存放在/var/lib下的子目录中(GNU Emacs将在/var/lib/emacs/lock中放置的锁文件)。
      未来的编辑器可能需要额外的超越崩溃恢复文件和锁文件的状态信息。这种信息也应该放在/var/lib/<editor>下。
 
    /var/lib/hwlock:hwlock的状态目录(可选)
      该目录包含/var/lib/hwlock/adjtime文件。
 
    /var/lib/misc:其他各种可变数据
      该目录包含不放置在/var/lib的其他子目录中的可变数据。应该尝试使用这个目录,以避免命名空间冲突。
 
  /var/lock:锁文件
    锁文件应该保存在/var/lock目录结构中。
    设备和其他资源的锁文件被多个应用程序共享,比如早期串行设备的锁文件存储在/usr/spool/locks或/usr/spool/uucp中,而现在被存储在/var/lock下。必须使用"LCK.."接设备的基础名称的命名规则。如,/dev/ttyS0的锁文件将被创建为"LCK..ttyS0"。
    每个锁文件的内容格式必须是HDB UUCP锁文件格式。HDB格式用十字节存放进程ID,再加上一个换行符结尾。例如:一个PID为1230的进程持有一个锁文件,它将包含十一个字:空格, 空格, 空格, 空格, 空格, 空格, 1, 2, 3, 0, 换行符。
 
  /var/log:日志文件和目录
    该目录包含各种日志文件。大多数日志必须被写入到这个目录或相应的子目录中。

  /var/mail:用户邮箱文件(可选)
    邮箱池必须可以通过/var/mail访问,并且邮箱池文件必须采用<username>格式。
    在这里的用户邮箱文件必须以标准UNIX邮箱格式存储。
 
  /var/opt:/opt的可变数据
    /opt下应用程序包的可变数据必须安装在/var/opt/<subdir>,其中<subdir>是/opt下被存储的附加应用程序包的静态数据的子目录名称。
 
  /var/run:运行时变量数据
    该目录包含系统自启动以来的系统描述信息。该目录下的文件必须在引导进程开始运行时被清空(删除或适当截断)。应用程序可能会拥有/var/run中的一个子目录。鼓励一个应用程序使用多个运行时文件。原来放在/etc的PID文件,现在必须放在/var/run中。进程标识符(PID)文件的命名惯例是<program-name>.pid。如,crond的PID文件被命名为/var/run/crond.pid。
    PID文件的内部格式保持不变。该文件必须以十进制ASCII编码后接一个换行符的格式来包含PID。例,如果crond的进程号为1125,那么/var/run/crond.pid将包含五个字符:1,1,2,5,换行符,实际内容为1125。
    读取PID文件的应用程序将会比较灵活的处理他们读到的数据,它们会忽略多余的空白字符,前导零,去掉末尾的换行符或者PID文件中额外的行。应用程序应该之前介绍过的比较简单的规范来创建PID文件。
    当前正在使用系统的用户的信息存储在utmp文件中,该文件也位于这个目录下。
    系统应用程序维护的临时UNIX域套接字也必须位于这个目录下。
 
  /var/spool:应用程序后台数据
    该目录包含等待稍后处理的一类数据。在/var/spool中的数据指的是在之后的工作中会用的(由应用程序, 用户, 系统管理员用),这些数据在处理后会被删除。

    /var/spool/lpd:行式打印机后台打印队列(可选)
      Lpd的锁文件lpd.lock必须位于/var/spool/lpd中。通常建议将每个打印机的锁文件放在spool目录下。

  /var/spool/rwho:Rwhod文件(可选)
    该目录为本地网络的其他系统保存rwhod信息。
 
  /var/tmp:保存系统重启时的临时文件。
    在系统重启时,/var/tmp目录为应用程序保存所需的临时文件或目录。因此,存储在/var/tmp中的数据比/tmp中的数据保存的更久。
    位于/var/tmp的文件和目录在系统启动的时候不能被删除。虽然保存在/var/tmp的内容总是会以一种特殊的方式被删除,但建议这样的删除事件的执行频率要少于/tmp。
 
  /var/yp:网络信息服务(NIS)数据库文件(可选)
    网络信息服务(NIS)的可变数据,前身为SUN公司的Yellow Pages(YP),必须放在这个目录。



以下是特定操作系统的其他要求和建议。这里所提到的内容不会反应到基本标准里面。
 
/:根目录
  一个Linux操作系统,如果内核在根目录下,我们建议内核的名字命名为vmlinux或vmlinuz,该命名方式的内核已经在最近的Linux内核源码包里用了。
 
/bin:用户基本命令二进制文件(被所有用户使用)
  Linux系统需要将以下额外的文件放在/bin中:
 
/dev:设备文件和特殊文件
  下述所有的设备必须存在于/dev下。
    /dev/null
      所有写入这个设备的数据都被丢弃。从该设备读数据将返回EOF条件。
    /dev/zero
      该设备是一个归零输出的数据源。所有写入这个设备的数据都被丢弃。读取该设备将返回和请求一样多的零值。
    /dev/tty
      该设备是一个进程的控制终端的代称。一旦该设备被打开,所有的读和写操作就像在一个实际的控制终端操作一样。
 
/etc:主机特定的系统文件
  Linux系统需要将一些额外的文件放在/etc中:
 
/lib64和/lib32:64位32位库文件(架构相关)
  64位架构的PPC64, s390x, sparc64, 和AMD64必须把他们的64位库文件放在/lib64下,32位(或s390的31位)库文件放在/lib下。
  64位架构的IA64必须放置它的64位库在/lib下。
 
/proc:内核和进程信息的虚拟文件系统
  /proc文件系统是处理进程和系统信息的事实上的标准Linux方法,而不是/dev/kmem或其他类似的方法。我们强烈支持除了进程信息的存取之外还包括内核和内存的其他信息。

/sbin:基本的系统二进制文件
  Linux系统需要将一些额外的文件放在/sbin中,如管理类操作命令。

/usr/include:C应用程序包含的头文件
  如果安装了C和C++编译器,并且系统不是基于Glibc,那么是需要以下这些符号链接的。
    /usr/include/asm -> /usr/src/linux/include/asm-<arch>
    /usr/include/linux -> /usr/src/linux/include/linux
 
/usr/src:源代码
  如果系统是基于glibc,该目录没有明确的使用规范。
  如果系统是基于glibc的以前版本linux libc,那么就有以下准则和基本应用:
    Linux的内核源码应该放在一个特定位置:/usr/src/linux。
    如果安装了C和C++编译器,但是没有安装完整的内核源代码,那么内核源代码的头文件应该被放到以下目录:
      /usr/src/linux/include/asm-<arch>
      /usr/src/linux/include/linux
        <arch>是系统架构的名称。
  注意:
    /usr/src/linux也许是内核源码树的一个符号链接。
    内核头文件被放在/usr/src/linux而不是/usr/include是很重要的,正因如此当系统管理员第一次更新内核版本的时候才不会出现问题。
 
/var/spool/cron:cron和at应用程序
  该目录包含cron和at应用程序的可变数据。

本文出自 “运维者的家” 博客,请务必保留此出处http://zhaotianyu.blog.51cto.com/132212/1782709

以上是关于Linux操作系统基础解析之——文件系统层次结构标准(FHS)的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统基础目录名称及功用

Android系统层次解析

计算机基础学习笔记:操作系统篇之硬件结构,存储层次结构

Linux操作系统基础解析之——Bash(Shell)基础知识

Linux操作系统基础解析之——bash基础知识和基本使用技巧

linux基础day05