# Linux文件系统结构

Linux系统中我们比较常用的目录是：

* home ：用户目录
* usr ：  Unix Software Resource 安装的软件目录

本文介绍一下Linux根目录的结构以及作用：

### /bin

bin是Binary（二进制）的缩写, 这个目录存放着最经常使用的命令。

### /boot

这里存放的是启动Linux时使用的一些核心文件，包括一些连接文件以及镜像文件。

### /dev

dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备，在Linux中访问设备的方式和访问文件的方式是相同的。

### /etc

这个目录用来存放所有的系统管理所需要的配置文件和子目录，例如人员的账号密码文件、各种服务的起始文件等。一般来说，这个目录下的各个文件属性是可以让一般用户查阅的，但只有 root 有权利修改。比较重要的文件有 /etc/init.d，/etc/inittab，/etc/sysconfig 等。

### /home

用户的主目录，在Linux中，每个用户都有一个自己的目录，一般该目录名是以用户的账号命名的。

### /lib

放置共享的函数库，几乎所有的应用程序都需要用到这些共享库。

### /lost+found

这个目录一般情况下是空的，当系统非法关机后，这里就存放了一些文件。目的相当于**文件系统发生错误时，将一些丢失的片段放置到这个目录下**。这个目录通常会在分区的最顶层存在。

### /media

linux系统会自动识别一些设备，例如U盘、光驱等等，当识别后，linux会把识别的设备挂载到这个目录下。

### /mnt

系统提供该目录是为了让用户临时挂载别的文件系统的，我们可以将光驱挂载在/mnt/上，然后进入该目录就可以查看光驱里的内容了。

### /opt

这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。可以由用户自己指定安装位置。当需要卸载第三方应用程序时，可以直接删除安装目录，而不影响系统其它任何设置。

### /proc

这个目录本身是一个虚拟文件系统（virtual filesystem），它是系统内存的映射。它放置的数据都是在内存当中，例如系统内核、进程、外部设备以及网络状态等。我们可以通过直接访问这个目录来获取系统信息。我们也可以直接修改里面的某些文件，比如可以通过下面的命令来屏蔽主机的ping命令，使别人无法ping你的机器：

```
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
```

### /root

该目录为系统管理员，也称作超级权限者的用户主目录。之所以放在这里，是因为如果进入单用户维护模式而仅挂载根目录时，该目录就能够拥有root的主文件夹，所以我们会希望root的主文件夹与根目录放置在同一个分区中。

### /sbin

s就是Super User的意思，这里存放的是系统管理员使用的系统管理程序。用来“设置”系统，其他用户最多只能用来“查询”而已。放在 /sbin 下面的为开机过程中所需的，里面包括了开机、修复、还原系统所需要的命令。

### /srv

srv 可以视为“service”的缩写，该目录存放一些服务启动之后需要提取的数据。常见的服务例如 WWW、FTP 等。举例来说，WWW 服务需要的网页数据就可以放置在 /srv/www/ 里。

### /sys

这个目录其实跟 /proc 非常类似，也是一个**虚拟的文件系统，主要也是记录与内核相关的信息**。包括目前已加载的内核模块与内核检测到的硬件设备信息等。这个目录同样不占硬盘容量。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候，对应的文件和目录也在内核对象子系统中被创建。

### /tmp

这是让一般用户或者是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够访问，所以你需要定期清理一下。当然，**重要数据不可放置在此目录，因为系统会不定期将 /tmp 目录下的数据全部删除**。

### /usr

Unix Software Resource 的缩写，也就是 “**UNIX 操作系统软件资源**” 所放置的目录。这是一个非常重要的目录，用户的很多应用程序和文件都放在这个目录下，类似于windows下的program files目录。

FHS 建议所有软件开发者应该将他们的数据合理地分别放置到这个目录下的子目录，而不要自行新建该软件的独立目录。

**/usr/bin/**：绝大部分的用户可使用命令都放在这里

**/usr/include/**：C/C++等程序语言的头文件（header）与包含文件（include）放置处

**/usr/lib/**：包含各应用软件的函数库、目标文件以及一些不被一般用户惯用的执行文件或脚本

**/usr/local/**：系统管理员在本机自行安装下载的软件建议安装到此目录

**/usr/sbin/**：非系统正常运行所需的系统命令

**/usr/share/**：放置共享文件的地方

**/usr/src/**：一般源码建议放置到这里

### /var

该目录主要针对常态性可变动文件，包括缓存（cache）、登录文件（log file）以及某些软件运行所产生的文件，包括程序文件（lock file、run file），或者例如MySQL数据库的文件等。

如果 /usr 是安装时会占用较大硬盘容量的目录，那么 /var 就是在系统运行后才会渐渐占用硬盘容量的目录。

**/var/cache/**：应用程序本身运行过程中会产生的一些暂存文件

**/var/lib/**：程序本身执行的过程中，需要使用到的数据文件放置的目录

**/var/lock/**：目录下的文件资源一次只能被一个应用程序所使用

**/var/log/**：放置日志文件

**/var/mail/**：放置个人电子邮件信箱的目录

**/var/run/**：某些程序或服务启动后的PID目录

**/var/spool/**：放置排队等待其他应用程程序使用的数据

## Linux文件类型

linux下一共有**7种**文件类型：

| 文件类型标识 | 文件类型 |                                                                             |
| ------ | ---- | --------------------------------------------------------------------------- |
| -      | 普通文件 |                                                                             |
| d      | 目录   |                                                                             |
| l      | 符号链接 | 这和Windows操作系统中的快捷方式有点相似                                                     |
| s（伪文件） | 套接字  | 这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求，客户端就可以通过套接字来进行数据通信，最常在/var/run目录中看到此种文件类型。 |
| b（伪文件） | 块设备  | 就是存储数据供系统存取的接口设备，比如硬盘，光驱等设备，在`/dev/tty/`目录下可以找到此类文件                         |
| c（伪文件） | 字符设备 | 即串行端口的接口设备，例如键盘，鼠标等，在`/dev/tty/`目录下可以找到此类文件                                 |
| p（伪文件） | 管道   | 主要目的是解决多个程序同时存取一个文件所造成的错误，遵循FIFO，先进先出                                       |

占用存储空间的类型：文件、目录、符号链接。符号链接记录的是路径，路径不长时存在innode里面。

其他四种：套接字、块设备、字符设备、管道是伪文件，不占用磁盘空间。

> 参考：
>
> <https://www.cnblogs.com/woider/p/6618295.html>
>
> <http://www.runoob.com/linux/linux-system-contents.html>
