绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
APUE读书笔记-00预备知识(01)-Linux文件系统以及目录结构简介
2020-04-26 17:37:36



`Linux` 和 `Windows` 的文件系统有些不同,在学习使用 `Linux` 之前,若能够了解这些不同,会有助于后续学习。本文先对 `Windows` 和 `Linux` 上面文件系统的一些概念进行区分,然后介绍一些 `Linux` 文件系统相关的原理,后较为详细地介绍了 `Linux` 系统的目录结构。

# `Linux` 和 `Windows` 文件系统

下面分别简单介绍一下启动 `Windows` 和 `Linux` 之后,它们是怎样看待自己世界的, 着重介绍 `Linux` 。

## `Windows` 上面的文件系统

`Windows` 系统中一切东西都是存放在硬盘上的。启动系统后,先确定硬盘,再硬盘上的分区和每个分区所对应的文件系统,后是存放在某个分区特定的文件系统中的文件。 也就是说, `Windows` 是通过 **“某个硬盘-硬盘上的某个分区-分区上的特定文件系统-特定文件系统中的文件”** 这样的顺序来访问到一个文件的。

具体点说,假设我们的机器上面有一个硬盘,硬盘分为几个区,那么我们启动系统之后就会看到 `C`, `D`, `E`, 等几个分区(也就是我们启动系统后看到的 `C` 盘, `D` 盘等),每个分区可以被格式化为各自不同的文件系统(例如 `NTFS` 格式, `FAT32` 格式等,文件系统的基本功能就是为了存放文件的,不同文件系统区别一般在于管理其中存放的文件的功能的强弱),分区被格式化成指定格式的文件系统之后,就可以存放任何文件和目录了。这里,我们可以把文件大体分为两种: **系统文件和用户文件** 。一般来说系统文件(例如 `Windows` 操作系统本身,一些系统程序,程序运行所需的库文件,以及一些系统配置文件等)存放的默认位置在 `C` 盘,当然也可以在安装时候指定在其他盘;其它用户文件,包含用户后来安装的程序以及一些数据文件等,用户可以把它们随意存放在任意的分区。

这样组织有优点,更有缺点。

### 优点

优点主要是用户存放东西的位置比较自由,系统结构简单便于新用户上手。

### 缺点

缺点有很多这里只列出几种:

- 目录组织缺乏标准

由于对“系统文件”和“用户文件”存放位置缺乏细致的规定,数据组织的方式显得比较凌乱,并且两种文件之间很容易相互干扰(例如数据文件可能存放在系统区域给系统带来垃圾文件等)。

- 用户的使用经验对系统的使用效率影响很大

一般来说,我们使用 `Windows` 时候合理使用分区会提升的系统效率。例如根据需要设置合理的系统分区(假设为 `C` 分区),尽量少往 `C` 盘存放数据文件,根据具体情况可以将一些 **“重要并且常用的”** 程序安装在 `C` 分区,随时保持系统目录的清洁和大小助于提升系统的运行速度,用户安装的一般软件尽量不要安装在 `C` 盘,安装软件时候指定的位置好采用默认标准目录名称(例如 `X:\Program Files` 目录,这里 `X` 表示盘符而不要自己定义一些奇怪名字的目录,这样便于软件的维护等等。

- 共享不便

`Windows` 上有经验的用户们会将自己的目录结构组织好,但是每个用户组织自己内容的方式是不一样的,所以他的机器上哪里存放了什么内容,别人很难知道,为共享带来了麻烦。

但是这些在 `Linux` 系统中,情况就所不同了。

## `Linux` 上面的文件系统

在 `Linux` 系统中正好相反,一切东西都是存放在一个的 `虚拟文件系统` 中的,这个 `虚拟文件系统` 是树状的结构以一个根目录开始。启动系统后,先有这个 `虚拟文件系统` ,再硬盘, 再把某个硬盘的某个分区做为这个 `虚拟文件系统` 的一部分(用某个子目录表示这个分区),再通过这个 `虚拟文件系统` 中对应硬盘分区的那个子目录确定硬盘分区中的特定文件系统,后的文件就存放在这个特定的文件系统中。 也就是说, `Linux` 系统是通过 **“虚拟文件系统-硬盘-硬盘上的分区-分区上的特定文件系统-特定文件系统中的文件”** 这样的顺序来访问一个文件的。

可能对习惯了使用 `Windows` 的用户来说,这样的组织点不太适应,这里的 `虚拟文件系统` ,实质就是一颗目录树,开始的目录叫做根目录,根目录中又有每一级子目录,或者文件,子目录又有子子目录和文件,其中每个子目录都特定的功能这个功能是约定俗成了的后面会详细说明……和 `Windows` 中把硬盘分成的 `C`, `D`, `E` 分区的概念不同了, `Linux` 中开始根本就没有硬盘的概念,就只有一个纯粹的 `虚拟文件系统` 。如果想要使用哪个硬盘的某个分区,就把那个分区 **“挂载”** 到某个子目录之下,这样硬盘中的分区,文件系统,目录等内容就呈现到了那个子目录里面。也就是说,在 `Linux` 中,我们使用硬盘中的数据,实际是先把硬盘 **“挂载”** 到某个子目录下,然后通过那个子目录来访问硬盘的。硬盘中原的数据组织结构都反映到了子目录上,成为了整个 `虚拟文件系统` 根目录下的一颗子树。

也许人会问,没这个 `虚拟文件系统` 就无法使用硬盘,但是开始没有硬盘,那么这个 `虚拟文件系统` 以及相应的组织结构是怎么存放起来的呢?这个问题,就像先有鸡还是先有蛋这个问题一样看似简单实则……但是,在 `Linux` 中,很轻易地跳出了这个思维循环,问题的答案并没在 `虚拟文件系` 和 `硬盘` 这两者之间徘徊,而是第三者—— `内存` ,Linux系统启动起来之后,整个 `虚拟文件系统` 的组织结构,都是随着每次内核系统的启动自动在内存中建立好了的,根本就不需要硬盘。

`Linux` 这样组织它的目录结构,有缺点当然更多的是优点。

### 缺点

开始 `虚拟文件系统` 中的每个子目录的功能是事先规定好了的,我们需要事先知道那些目录存放哪些文件,然后在相应的位置中创建自己的内容,这也是为什么 `Linux` 系统入门门槛高的一个原因。(当然开始的新手,也可以像 `Windows` 那样随意地创建目录和文件)。

实际上开始的目录也不多,主要就那么几个,花不了多长时间就会明白它们的作用的,而明白这些作用之后带来的好处,远不止付出那么多。 本文后面着重对这些目录进行介绍。

### 优点

这里只说几个优点:

- 目录结构反映系统运行机理

当我们了解了这些目录的功能之后,我们对整个 `Linux` 操作系统的运行机理也会有一个大致的了解。

- 结构清晰避免逻辑混乱

这样的目录结构,有助于我们以一种高效的方式组织自己的数据,分类清晰并且不会对系统运行有任何影响,规定了开始每个目录的功能,并没有限制我们的自由,因为我们知道我们可以在哪里创建自己的子目录并且在子目录中任意创建自己的文件。

- 组织规范便于共享

由于目录具有统一的组织结构,所以 `Linux` 上面的用户在共享数据的时候,能够很容易地猜测出他所需要的数据大致存放在什么位置,同时也不会影响到私有数据的保密性(怎么存放自己的私有数据,那是用户自己决定的)。

## `Linux` 文件系统在操作系统中的位置

在 `Linux` 系统中,主要两个东西: `虚拟文件系统` 中的文件和 `Linux操作系统内核` 本身。逻辑上可以认为前者属于上层,后者在下层,前者基于后者,后者依赖前者而存在。

`Linux` 把除了它本身( `Linux操作系统内核` )以外的一切事物都看作是在 `虚拟文件系统` 中的文件了。无论是键盘,鼠标,数据,程序,CPU,内存,网卡……无论是硬件、软件、数据还是内存中的东西,我们都可以在 `虚拟文件系统` 中的相应子目录对他们进行访问和操作,操作统一。而实现这些管理的幕后就是 `Linux操作系统内核` 本身:启动 `Linux` 系统的时候,首先电脑把 `Linux操作系统内核` 加载到内存中,内核本身提供了文件管理,设备管理,内存管理,CPU进程调度管理,网络管理等功能,等内核运行起来之后,就在内存中建立起相应的 `虚拟文件系统` ,后就是内核利用它提供的那些功能,来管理 `虚拟文件系统` 中的硬件软件等各种资源了。

`Linux` 把提供操作系统本身功能(管理计算机软硬件资源)的那些部分划给了 `Linux操作系统内核` ,使得 `Linux操作系统内核` 成为一个独立的部分,有它自己的开源代码;其上其它的一切(软件,硬件,数据)都根据其特性有自己的开源代码、或者自由地组织并且存放在那个 `虚拟文件系统` 中由 `Linux操作系统内核` 来管理。这样,将系统本身和系统所管理的资源分开,并开放源代码,有助于对系统或者系统所管理的资源进行灵活的定制和扩展,还能按需快速建立起只适合自己使用的操作系统,也利于操作系统本身的发展。实际 `Ubuntu` , `Fedora` , `RedHat` 等各种不同的 `Linux` 操作系统发行版,简单来说就是对其文件系统和内核进行了不同的配置而产生的 **“大众化”** 的操作系统,相比之下, `Windows` 就显得非常地零乱复杂,将系统、软件、硬件都混在了一起,其不同版本只能由 `Mircro` 一家公司发行。

另外,我们还要注意个问题,就是在我们的角度上,是使用路径来访问一个文件的。表示文件的路径由 **“文件所在的目录+各级目录的分隔符+文件”** 三个部分组成,这无论在 `Windows` 还是 `Linux` 上面,都是一样的,所不同的是, `Windows` 下面目录分隔符是 `\` , `Linux` 下面是 `/` ,也许这也是两者之间为了表示其各自立场不同的一个原因吧?^\_^

例如:

Window系统上的文件:D:\Program Files\PPStream\PPStream.exe
Linux系统上的文件:/usr/bin/screen

# `Linux` 上面的虚拟文件系统目录组织

实质上,我们启动系统所看到的 **“根目录”** ,逻辑上是 `Linux` 虚拟文件系统的根目录中的一个子目录,我们看不到除了这个 **“根目录”** 以外的其他的目录,那些目录和操作系统的具体实现相关是被操作系统内核隐藏起来了的,所以这里就介绍我们所能看到的文件系统中的 **“根目录”** 的各个子目录中的作用吧。

在 `Linux` 文件系统中的每一个子目录都有特定的目的和用途。一般都是根据 `FHS` 标准定义一个正式的文件系统结构的,这个标准规定了哪些目录应该哪些作用。这里我们先介绍一些日常经常用到的目录,然后给出 `FHS` 相关的内容。

## 常用的重要目录

这里,根据本人的使用经验,给出比较常见重要的一些目录,开始我们对它们有所了解就可以了。随着对 `Linux` 使用的经验的加深,我们会了解越来越多的目录。对目录的功能知道得越多,我们对 `Linux` 系统的工p作原理就理解的越深刻,理解操作系统的工作原理,更助于我们更为规范地使用和理解系统中每个目录存在的意义,直至后几乎知道系统中的每个文件……

- `/` 根目录

包含了几乎所的文件目录。相当于中央系统。进入的简单方法是:cd /。

- `/boot` 引导程序,内核等存放的目录

这个目录,包括了在引导过程中所必需的文件,引导程序的相关文件(例如 `grub` , `lilo` 以及相应的配置文件)以及 `Linux` 操作系统内核相关文件(例如 `vmlinuz` 等)一般都存放在这里。在开始的启动阶段,通过引导程序将内核加载到内存,完成内核的启动(这个时候, `虚拟文件系统` 还不存在,加载的内核虽然是从硬盘读取的,但是没经过 `Linux` 的 `虚拟文件系统` ,这是比较底层的东西来实现的)。然后内核自己创建好 `虚拟文件系统` ,并且从 `虚拟文件系统` 的其他子目录中(例如 `/sbin` 和 `/etc` )加载需要在开机启动的其他程序或者服务或者特定的动作(部分可以由用户自己在相应的目录中修改相应的文件来配制)。如果我们的机器中包含多个操作系统,那么可以通过修改这个目录中的某个配置文件(例如 `grub.conf` )来调整启动的默认操作系统,系统启动的择菜单,以及启动延迟等参数。

- `/sbin` 超级用户可以使用的命令的存放目录

存放大多涉及系统管理的命令(例如引导系统的 `init` 程序),是超级权限用户 `root` 的可执行命令存放地,普通用户无权限执行这个目录下的命令(但是有时普通用户也可能会用到)。这个目录和 `/usr/sbin` , `/usr/X11R6/sbin或/usr/local/sbin` 等目录是相似的,我们要记住,凡是目录 `sbin` 中包含的都是 `root` 权限才能执行的,这样就行了。后面会具体区分。

- `/bin` 普通用户可以使用的命令的存放目录

系统所需要的那些命令位于此目录,比如 `ls` 、 `cp` 、 `mkdir` 等命令;类似的目录还 `/usr/bin` , `/usr/local/bin` 等等。这个目录中的文件都是可执行的、普通用户都可以使用的命令。作为基础系统所需要的基础的命令就是放在这里。

- `/lib` 根目录下的所程序的共享库目录

此目录下包含系统引导和在根用户执行命令时候所必需用到的共享库。做个不太好但是比较形象的比喻,点类似于 `Windows` 上面的 `system32` 目录。按理说,这里存放的文件应该是 `/bin` 目录下程序所需要的库文件的存放地,也不排除一些例外的情况。类似的目录还 `/usr/lib` , `/usr/local/lib` 等等。

- `/dev` 设备文件目录

在 `Linux` 中设备都是以文件形式出现,这里的设备可以是硬盘,键盘,鼠标,网卡,终端,等设备,通过访问这些文件可以访问到相应的设备。设备文件可以使用 `mknod` 命令来创建,具体参见相应的命令;而为了将对这些设备文件的访问转化为对设备的访问,需要向相应的设备提供设备驱动模块(一般将设备驱动编译之后,生成的结果是一个 `*.ko` 类型的二进制文件),在内核启动之后,再通过 `insmod` 等命令加载相应的设备驱动之后,我们就可以通过设备文件来访问设备了。一般来说,想要 `Linux` 系统支持某个设备,只需要三个东西:相应的硬件设备,支持硬件的驱动模块,以及相应的设备文件。

- `/home` 普通用户的家目录(或 `$HOME` 目录、主目录)

在 `Linux` 机器上,用户主目录通常直接或间接地置在此目录下。其结构通常由本地机的管理员来决定。通常而言,系统的每个用户都有自己的家目录,目录以用户名作为名字存放在 `/home` 下面(例如 `quietheart` 用户,其家目录的名字为 `/home/quietheart` )。该目录中保存了绝大多数的用户文件(用户自己的配置文件,定制文件,文档,数据等), `root` 用户除外(参见后面的 `/root` 目录)。由于这个目录包含了用户实际的数据,通常系统管理员为这个目录单独挂载一个独立的磁盘分区,这样这个目录的文件系统格式就可能和其他目录不一样了(尽管表面上看,这个目录还是属于根目录的一棵子树上),将系统文件和数据文件分开存放,有利于维护。

- `/root` 用户root的 `$HOME` 目录

系统管理员(就是 `root` 用户或超级用户)的主目录比较特殊,不存放在 `/home` 中,而是直接放在 `/root` 目录下了。

- `/etc` 全局的配置文件存放目录

系统和程序一般都可以通过修改相应的配置文件,来进行配置。例如,要配置系统开机的时候启动那些程序,配置某个程序启动的时候显示什么样的风格等等。通常这些配置文件都集中存放在 `/etc` 目录中,所以想要配置什么东西的话,可以在 `/etc` 下面寻找我们可能需要修改的文件。一些大型套件,如 `X11` ,在 `/etc` 下它们自己的子目录。系统配置文件可以放在这里或在 `/usr/etc` 。 不过所有程序总是在 `/etc` 目录下查找所需的配置文件,你也可以将这些文件链接到目录 `/usr/etc` 。另外,还一个需要注意的常见现象就是,当某个程序在某个用户下运行的时候,可能会在该用户的家目录中生成一个配置文件(一般这个文件开始就是 `/etc` 下相应配置文件的拷贝,存放相应于“当前用户”的配置),这样当前用户可以通过配置这个家目录的配置文件,来改变程序的行为,并且这个行为只是该用户特有的。原因就是:一般来说一个程序启动,如果需要读取一些配置文件的话,它会首先读取当前用户家目录的配置文件,如果存在就使用;如果不存在它就到 `/etc` 下读取全局的配置文件进而启动程序。就是这个配置文件不自动生成,我们手动在自己的家目录中创建一个文件的话,也有许多程序会首先读取到这个家目录的文件并且以它的配置作为启动的选项(例如我们可以在家目录中创建 `vim` 程序的配置文件 `.vimrc` ,来配置自己的 `vim` 程序)。

- `/usr` 这个目录中包含了命令库文件和在通常操作中不会修改的文件

这个目录对于系统来说也是一个非常重要的目录,其地位类似Windows上面的 `Program Files` 目录(请原谅我可能这样做比较不太恰当^\_^)。安装程序的时候,默认就是安装在此文件内部某个子文件夹内。输入命令后系统默认执行 `/usr/bin` 下的程序(当然,前提是这个目录的路径已经被添加到了系统的环境变量中)。此目录通常也会挂载一个独立的磁盘分区,它应保存共享只读类文件,这样它可以被运行 `Linux` 的不同主机挂载。

- `/usr/lib` 目标库文件,包括动态连接库加上一些通常不是直接调用的可执行文件的存放位置

这个目录功能类似 `/lib` 目录,理说,这里存放的文件应该是 `/bin` 目录下程序所需要的库文件的存放地,也不排除一些例外的情况。

- `/usr/bin` 一般使用者使用并且不是系统自检等所必需可执行文件的目录

此目录相当于根文件系统下的对应目录( `/bin` ),非启动系统,非修复系统以及非本地安装的程序一般都放在此目录下。

- `/usr/sbin` 管理员使用的非系统必须的可执行文件存放目录

此目录相当于根文件系统下的对应目录( `/sbin` ),保存系统管理程序的二进制文件,并且这些文件不是系统启动或文件系统挂载 `/usr` 目录或修复系统所必需的。

- `/usr/share` 存放共享文件的目录

在此目录下不同的子目录中保存了同一个操作系统在不同构架下工作时特定应用程序的共享数据(例如程序文档信息)。使用者可以找到通常放在 `/usr/doc` 或 `/usr/lib` 或 `/usr/man` 目录下的这些类似数据。

- `/usr/include` C程序语言编译使用的头文件

`Linux` 下开发和编译应用程序所需要的头文件一般都存放在这里,通过头文件来使用某些库函数。默认来说这个路径被添加到了环境变量中,这样编译开发程序的时候编译器会自动搜索这个路径,从中找到你的程序中可能包含的头文件。

- `/usr/local` 安装本地程序的一般默认路径

当我们下载一个程序源代码,编译并且安装的时候,如果不特别指定安装的程序路径,那么默认会将程序相关的文件安装到这个目录的对应目录下。例如,安装的程序可执行文件被安装(安装实质就是复制)到了 `/usr/local/bin` 下面,此程序(可执行文件)所需要依赖的库文件被安装到了 `/usr/local/lib` 目录下,被安装的软件如果是某个开发库(例如 `Qt` , `Gtk` 等)那么相应的头文件可能就被安装到了 `/usr/local/include` 中等等。也就是说,这个目录存放的内容,一般都是我们后来自己安装的软件的默认路径,如果择了这个默认路径作为软件的安装路径,被安装的软件的所文件都限制在这个目录中,其中的子目录就相应于根目录的子目录。

- `/proc` 特殊文件目录

这个目录采用一种特殊的文件系统格式( `proc` 格式),内核支持这种格式。其中包含了全部虚拟文件。它们并不保存在磁盘中,也不占据磁盘空间(尽管命令 `ls -c` 会显示它们的大小)。当您查看它们时,您实际上看到的是内存里的信息,这些文件助于我们了解系统内部信息。例如:

├1/ 关于进程1的信息目录。每个进程在/proc 下一个名为其进程号的目录。
├cpuinfo 处理器信息,如类型、制造商、型号和性能。
├devices 当前运行的核心配置的设备驱动的列表。
├dma 显示当前使用的DMA通道。
├filesystems 核心配置的文件系统。
├interrupts 显示使用的中断,and how many of each there have been.
├ioports 当前使用的I/O端口。
├kcore 系统物理内存映象。与物理内存大小一样,但实际不占这么多内存;
├kmsg 核心输出的消息。也被送到syslog 。
├ksyms 核心符号表。
├loadavg 系统”平均负载”;3个没意义的指示器指出系统当前的工作量。
├meminfo 存储器使用信息,包括物理内存和swap。
├modules 当前加载了哪些核心模块。
├net 网络协议状态信息。
├self 到查看/proc 的程序的进程目录的符号连接。
├stat 系统的不同状态
├uptime 系统启动的时间长度。
└version 核心版本。

- `/opt` 可择的文件目录

这个目录表示的是可择的意思,些自定义软件包或者第方工具,就可以安装在这里。比如在 `Fedora Core 5.0` 中, `OpenOffice` 就是安装在这里。些我们自己编译的软件包,就可以安装在这个目录中;通过源码包安装的软件,可以把它们的安装路径设置成 `/opt` 这样来安装。这个目录的作用一点类似 `/usr/local` 。

- `/mnt` 临时挂载目录

这个目录一般是用于存放挂载储存设备的挂载目录的,比如磁盘,光驱,网络文件系统等,当我们需要挂载某个磁盘设备的时候,可以把磁盘设备挂载到这个目录上去,这样我们可以直接通过访问这个目录来访问那个磁盘了。一般来说,我们好在 `/mnt` 目录下面多建立几个子目录,挂载的时候挂载到这些子目录上面,因为通常我们可能不仅仅是挂载一个设备吧?

- `/media` 挂载的媒体设备目录
挂载的媒体设备目录,一般外部设备挂载到这里,例如 `cdrom` 等。比如我们插入一个U盘,我们一般会发现, `Linux` 自动在这个目录下建立一个 `disk` 目录,然后把U盘挂载到这个 `disk` 目录上,通过访问这个 `disk` 来访问U盘。

- `/var` 内容经常变化的目录

此目录下文件的大小可能会改变,如缓冲文件,日志文件,缓存文件,等一般都存放在这里。

- `/tmp` 临时文件目录

该目录存放系统中的一些临时文件,文件可能会被系统自动清空。的系统直接把 `tmpfs` 类型的文件系统挂载到这个目录上, `tmpfs` 文件系统由 `Linux` 内核支持,在这个文件系统中的数据,实际上是内存中的,由于内存的数据断电易失,当系统重新启动的时候我们就会发现这个目录被清空了。

- `/lost+found` 恢复文件存放的位置

当系统崩溃的时候,在系统修复过程中需要恢复的文件,可能就会在这里被找到了,这个目录一般为空。

以上目录,是常见的重要目录。其中,有些目录初学者容易混淆,这里简单区分一下:

1. `/bin` , `/sbin` 与 `/usr/bin` , `/usr/sbin`
- `/bin` 一般存放对于用户和系统来说“必须”的程序(二进制文件)。
- `/sbin` 一般存放用于系统管理的“必需”的程序(二进制文件),一般普通用户不会使用,根用户使用。
- `/usr/bin` 一般存放的只是对用户和系统来说“不是必需的”程序(二进制文件)。
- `/usr/sbin` 一般存放用于系统管理的系统管理的不是必需的程序(二进制文件)。
2. `/lib` 与 `/usr/lib`
- `/lib` 和 `/usr/lib` 的区别类似 `/bin`, `/sbin` 与 `/usr/bin`, `/usr/sbin` 。
- `/lib` 一般存放对于用户和系统来说“必须”的库(二进制文件)。
- `/usr/lib` 一般存放的只是对用户和系统来说“不是必需的”库(二进制文件)。

其他还一些目录例如: `/home/user/bin`, `/home/user/opt`, `/home/user/etc`, `/usr/local/etc` 等等,其作用都是类似于 `/etc`, `/bin` 等目录的,可能只是层次概念不同了,使用 `Linux` 时间长了,会逐渐体会到其中的含义。

当然,我们可以无视这些目录,像使用 `Windows` 那样自由的,不管啥文件,想往哪存就往哪存,还是那句话,使用 `Linux` 时间长了,会逐渐体会到其中的含义,到时候也许我们想要乱来都不行了呢。^\_^

## 对文件系统目录的分类标准

在大多数 `Linux` 系统上面,我们可以使用一个命令: `man hier` ,通过这个命令的输出,就知道“根目录”中所子目录的作用了。这个命令含义我不多说了,总之这里的 `hier` 就是对 `Linux` 文件系统中各级目录的标准功能,是一个大家都约定俗成了的东西。想要了解每个目录更详细的信息,需要仔细参考 `man hier` 的输出。下面就是一个比较简短的中文描述的对文件系统目录分类的 `FHS` 标准,也就是对 `man hier` 的简单翻译。

NAME 名称
hier - 文件系统描述
DESCRIPTION 描述
一个典型的Linux系统具以下几个目录结构:
/ 根目录,是所目录树开始的地方。
/bin 此目录下包括了单用户方式及系统启动或修复所用到的所执行程序。
/boot 包括了引导程序的静态文件。此目录下包括了在引导过程中所必需的文件。系统装载程序及配制文件在 /sbin 和 /etc 目录中找到。
/dev 对应物理设备的指定文件或驱动程序。参见mknod(1)。
/dos 如果MS-DOS和Linux共存于一台计算机时,这里通常用于存放DOS 文件系统。
/etc 用于存放本地机的配置文件。一些大型套件,如X11,在 /etc 下它们自己的子目录。系统配置文件可以放在这里或在 /usr/etc。 不过所程序总是在 /etc 目录下查找所需的配置文件,你也可以将这些文件链接到目录 /usr/etc.
/etc/skel 当建立一个新用户账号时,此目录下的文件通常被复制到用户的主目录下。
/etc/X11X11 window system所需的配置文件。
/home 在Linux机器上,用户主目录通常直接或间接地置在此目录下。其结构通常由本地机的管理员来决定。
/lib 此目录下包含系统引导和在根用户执行命令所必需用到的共享库。
/mnt 挂载临时文件系统的挂载点。
/proc 这是提供运行过程和核心文件系统 proc 挂载点。这一”伪”文件系统在以下章节中详细叙述 proc(5)。
/sbin 类似于 /bin 此目录保存了系统引导所需的命令,但这些命令一般使用者不能执行。
/tmp 此目录用于保存临时文件,临时文件在日常维护或在系统启动时无需通知便可删除
/usr 此目录通常用于从一个独立的分区上挂载文件。它应保存共享只读类文件,这样它可以被运行Linux的不同主机挂载。
/usr/X11R6 X-Window系统 Version 11 release 6.
/usr/X11R6/bin X-Windows系统使用的二进制文件;通常是在对更传统的 /usr/bin/X11 中文件的符号连接。
/usr/X11R6/lib 保存与X-Windows系统关数据文件。
/usr/X11R6/lib/X11 此目录保存与运行X-Windows系统关其他文件。通常是对来自 /usr/lib/X11 中文件的符号连接。
/usr/X11R6/include/X11 此目录保存包括使用X11窗口系统进行编译程序所需的文件。通常是对来自 /usr/lib/X11 中文件的符号连接。
/usr/bin 这是执行程序的主要目录,其中的绝大多数为一般使用者使用,除了那些启动系统或修复系统或不是本地安装的程序一般都放在此目录下。
/usr/bin/X11
X11执行文件放置的地方;在Linux系统中,它通常是对 /usr/X11R6/bin. 符号连接表
/usr/dict
此目录保存拼写检查器所使用的词汇表文件。
/usr/doc
此目录下应可以找到那些已安装的软件文件。
/usr/etc
此目录可用来那些存放整个网共享的配置文件。然而那可执行命令指向总是使用参照使用 /etc 目录下的文件。 /etc 目录下连接文件应指向 /usr/etc. 目录下适当的文件。
/usr/include
C程序语言编译使用的Include”包括”文件。
/usr/include/X11
C程序语言编译和X-Windows系统使用的 Include”包括”文件。它通常中指向 /usr/X11R6/include/X11. 符号连接表。
/usr/include/asm
申明汇编函数的Include”包括”文件,它通常是指向 /usr/src/linux/include/asm 目录的符号连接
/usr/include/linux
包含系统变更的信息通常是指向 /usr/src/linux/include/linux 目录的符号连接表,来获得操作系统特定信息。(注:使用者应在此自行包含那些保证自己开发的程序正常运行所需的libc 函数库。不管怎样,Linux核心系统不是设计用来执行直接运行用户程序的,它并不知道用户程序需要使用哪个版本的libc库 。如果你随意将 /usr/include/asm 和 /usr/include/linux 指向一个系统核心,系统很可能崩溃。Debian系统不这么做。它使用 libc*-dev运行包中提供的核心系统标识,以保证启动所正确的文件。)
/usr/include/g++
GNU C++编译程序所使用的Include”包括”文件。
/usr/lib
目标库文件,包括动态连接库加上一些通常不是直接调用的可执行文件案。一些复杂的程序可能在此占用整个子目录。
/usr/lib/X11
存放X系统数据文件及系统配置文件的地方。 Linux中通常是指向 /usr/X11R6/lib/X11 目录的符号连接表。
/usr/lib/gcc-lib
GNU C 编译程序所使用的可执行文件案和”包括”文件。 gcc(1).
/usr/lib/groff
GNU groff 文件格式系统所使用的文件。
/usr/lib/uucp
uucp(1) 所使用的文件。
/usr/lib/zoneinfo
关时区信息文件文件。
/usr/local
安装在本地执行程序的地方。
/usr/local/bin
在此地放置本地执行程序的二进制文件。
/usr/local/doc
放置本地文件。
/usr/local/etc
安装在本地程序的配置文件。
/usr/local/lib
安装在本地程序的库文件。
/usr/local/info
安装在本地程序关信息文件。
/usr/local/man
安装在本地程序使用手册。
/usr/local/sbin
安装在本地的系统管理程序。
/usr/local/src
安装在本地程序的原始码。
/usr/man
手册页通常放在此目录,或相关子目录下。
/usr/man//man[1-9]
此目录在指定的地方以原始码形式存放手册页。系统在所的手册页中使用自己独特的语言及代码集,可能会省略 substring 子字符串。
/usr/sbin
此目录保存系统管理程序的二进制码,这些文件不是系统启动或文件系统挂载 /usr 目录或修复系统所必需的。
/usr/share
在此目录下不同的子目录中保存了同一个操作系统在不同构架下工作时特定应用程序的共享数据。使用者可以找到通常放在 /usr/doc 或 /usr/lib 或 /usr/man 目录下的这些数据。
/usr/src
系统不同组成部份的源文件包括参考数据报。不要将你自己与项目关的文件放这里,因为在安装软件外,/usr下的文件属性除通常设为只读。
/usr/src/linux
系统核心资源通常拆包安装于此。这是系统中重要的一环,因为 /usr/include/linux 符号连接表指向此目录。你应当使用其他目录来来编译建立新核心。
/usr/tmp
此目录不再使用了。它应指向目录 /var/tmp。 这个链接只是出于系统兼容的目的,一般不再使用。
/var
此目录下文件的大小可能会改变,如缓冲文件可日志文件。
/var/adm
此目录为 /var/log 甩替代,通常是指向 /var/log 的符号连接表。
/var/backups
此目录用来存放重要系统文件的后备文件
/var/catman/cat[1-9] or /var/cache/man/cat[1-9]
此目录存储根据手册分类预先格式化的参考手册页。(这些参考手册页是相互独立的)
/var/lock
此目录存储锁定文件。依据命名习惯,设备锁定文件是 LCKxxxxx xxxxx与在文件系统中该设备名相同,使用的格式是HDU UUCP锁定文件,例如包含进程标识PID的锁定文件是一个10字节的ASCII格式的数字,后面跟一个换行符。
/var/log
各种日志文件。
/var/preserve
这是 vi(1) 存放正在编辑中的文件,以便以后可以恢复。
/var/run
运行时的变量文件,如存放进程标识和登入使用者信息的文件。 (utmp) 此目录下文件在系统启动时被自动清除。
/var/spool
各种程序产生的缓冲或排除等待的文件
/var/spool/at
at(1) 的作业存缓区
/var/spool/cron
cron(1) 的作业存缓区
/var/spool/lpd
打印缓存文件。
/var/spool/mail
使用者邮箱。
/var/spool/smail
存放 smail(1) 邮件发送程序的缓冲文件。
/var/spool/news
新闻子系统的缓冲目录
/var/spool/uucp
uucp(1) 的缓冲文件
/var/tmp
类似 /tmp, 此目录保存未指定持续时间的临时文件。

# 其它

参考

- <http://www.linuxsense.org/archives/9227.html#more-9227>
- <http://www.myefly.net/linux-dir-fun>

分享好友

点击获得分享链接,复制给好友成功购买后您可以获得2成返利哦~

Linux系统之路
创建时间:2019-12-27 16:09:53
分享Linux系统操作与相关知识
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • QuietHeart
    栈主

小栈成员

查看更多
  • ?
  • 栈栈
  • 飘絮絮絮丶
戳我,来吐槽~