Linux和UNIX中的文件系统是一个以/为根的树状式文件结构,/是Linux和UNIX中的根目录,同样它也是文件系统的起点。所有的文件和目录都位于/路径下,包括我们经常听到的/usr、/etc、/bin、/home等。
在早期的UNIX系统中,各个厂家都定义了自己文件系统的命名构成,比较混乱,而且难以区分。
为了避免在Linux系统上也出现这种命名混乱的问题,在1994年推出了 FSSTND(FileSystem Standard) 的Linux文件系统层次结构标准,后来UNIX团队把FSSTND发扬光大,成为了后来的FHS(FileSystem Hierarchy Standard) 。
FHS标准使得众多的Linux distributions(Linux 发行版) 有了统一的文件系统命名标准,换一种说法:FHS就是一种文件系统的命名标准。一般来说,Linux distributions都需要遵循FHS规定的目录结构和目录内容,文件类型的权限。
但是,FHS仅仅定义了两层规范:
第一层是/下面的各个目录要放什么文件数据,比如/etc下面需要放设置文件,/bin和/sbin下面需要放可执行文件等;
第二层是针对/usr和/var这两个目录来定义的,比如/usr/share需要放共享数据,/var/log需要放系统登录文件等。
下面我就来为你介绍一下Linux在/下都有哪些定义和规范。
2 FHS 规范我下面介绍的这些规范,只是FHS文档指定的目录和文件的一部分,完整的标准可在FHS规范标准在线获得。
首先先来介绍一下根目录的重要性和意义:
根目录是整个系统中最重要的一个目录,后续的目录都是以根目录为基础进行衍生,更重要的一点,根目录与开机、还原、系统修复有关,由于系统开机需要特定的环境,所以系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。所以FHS规定不要将根目录的分区大小设置的过大,实际上是越小越好,以减少出错率。
FHS同样规定了根目录下面应该要有这些目录的存在。
2.1 /home目录/home目录是系统默认的使用者主文件夹(home directory)。
2.2 /boot目录/boot目录包含启动操作系统所需的静态文件,比如Linux内核,这些文件对系统的启动至关重要。
Linux Kernel常用的文件名为vmlinuz, 但是如果你使用的是grub2这个开机程序,还会存在/boot/grub2这个目录。
搭建完成的Linux ,boot下面是这样的。
千万不要删除/boot目录,这样做可能会导致系统无法启动。
/dev目录都是一些设备节点,这些设备节点是Linux系统中的设备或者是内核提供的虚拟设备。这些设备节点同样也对系统正常运行至关重要。
/dev目录和子目录下的设备是字符设备和块设备。
字符设备就是鼠标、键盘、调制解调器。
块设备就是硬盘、软盘驱动器。
存储/dev目录下的文件就相当于是存储某个设备。
比较重要的文件有
(1)/dev/hda:主IDE通道上的主设备,当提到IDE/ATA硬盘时,主通道是第一和第二驱动器连接到主板或接口卡的通道。
(2)/dev/hdb:主IDE通道上的从设备。
(3)/dev/tty0:第一个虚拟控制台。虚拟控制台又被称为VC,也称为虚拟终端VT,是用于计算机用户界面的键盘和显示器的概念组合。
(4)/dev/tty1:第二个虚拟控制台。
(5)/dev/sda:主SCSI和SATA通道上的第一个设备。
(6)/dev/lp0:第一个并行端口。
下面是我Linux下面的目录。
/etc目录是为计算机本地的配置文件保留的,系统主要的配置文件都放在这个目录下,比如账号密码,服务的启停,一般来说,这个目录下面一般用户只有读权限,只有root用户具有修改权限。
/etc下比较重要的几个文件有:
(1)/etc/modprobe.d 内核驱动模块
(2)/etc/passwd 存储用户密码
(3)/etc/fstab 存储挂载信息
(4)/etc/issue 存储系统启动显示的内容
/etc目录下不要存放二进制文件,二进制文件最好放在/sbin和/bin中。
/etc目录下有两个重要的文件:
(1)/etc/x11用于存放X Window系统配置文件,例如xorg.conf。
(2)/etc/opt这个主要存放第三方协力软件/op 的相关配置文件。
系统的函数库有很多,而/lib目录就像一个仓库,它用于存放执行/bin和/sbin中二进制文件所需要的库,这些共享库映像对于系统boot和执行根文件系统中的命令特别重要。
media媒体的英文,也就是说/media下可以存放用于可移动媒体(例如 USB、DVD、CD-ROM 和 Zip 磁盘)的安装点和子目录。
2.7 /mnt目录如果你想要暂时挂载某些额外的设备,你可以放在/mnt这个目录下,其实最早的时候,/mnt用途和/media 一样,只是后来有了/media 之后,这个目录就被用来临时挂载了。
2.8 /opt目录/opt/目录为大多数应用程序软件包提供存储空间,将文件放置在/opt/目录中的包会创建一个与包同名的目录。反过来,该目录保存了原本会分散在整个文件系统中的文件,从而为系统管理员提供了一种简单的方法来确定特定包中每个文件的角色。
例如,如果sample是位 /opt/目录中的特定软件包的名称,那么所有文件都放置在/opt/sample/目录中的目录中,例如/opt/sample/bin/表示二进制文件和/opt/sample/man/用于手册页。
/proc目录本身是一个虚拟文件系统(virtual filesystem),他放置的数据是在内存中,比如系统核心信息,行程信息,周边设备网络状态等。因为这个目录下的数据都是在内存中的,所以本身不占用磁盘空间。
这个目录下比较重要的文件有 /proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/net/。
/sbin目录存储root用户使用的可执行文件。
/sbin中的可执行文件在启动时使用,用于系统管理和执行系统恢复操作。除了/bin中的二进制之外,/sbin还包含启动、恢复和修复系统所需要的二进制文件。
/sbin目录下包含 arp、clock、halt、init、grub、ifconfig、route、shutdown等。
这个目录下面存放的都是一些临时文件,这些文件在系统重新启动时被清除。
这个目录其实和/proc非常类似,也是一个虚拟文件系统,主要是记录核心与系统硬件相关信息。这个目录同样也不占用磁盘空间。
/usr目录是需要好好聊聊的一个目录了,很多读者都误以为/usr是user 的缩写,其实usr是Unix Software Resource的缩写,FHS建议软件开发者应该将数据合理的放置在这个目录的次目录下,不要自己创建软件独立的目录。
所有系统默认的软件都会放在/usr下面,因此这个目录有点类似Windows中的C:Windows + C:Program files这两个目录的综合,一般来说,系统刚安装完毕后,这个目录会占用较多的磁盘容量,/usr的次目录建议有下面这些内容:
(1)/usr/bin/
一般用户能够使用的指令都放在这个目录下,CentOS 7开始,/usr/bin下指令和/bin目录下指令一毛一样。
(2)/usr/lib/
基本上,与/lib功能相同,所以/lib就是链接到这个目录中的。
(3)/usr/local
系统管理员在在本机下载的软件都建议安装到这个目录下,便于管理。
(4)/usr/sbin
非系统正常运行所需要的系统指令,最常见的就是某些网络服务器软件的服务指令,不过基本功能与/sbin差不多,因此目前/sbin就是链接到此目录中的。
(5)/usr/share
共享文件放置区,这个目录下还有这些次目录/usr/share/man、/usr/share/doc、/usr/share/zoneinfo。
(6)/usr/games
与游戏相关的数据放置处
(7)/usr/include
C/C++ 等程序语言的header和include放置处,也是直接链接的。
(8)/usr/src
一般源码建议放在这,src是source的意思,至于核心源码则建议放在/usr/src/linux目录下。
早期的FHS规定系统开机后所产生的各项信息应该要放置到/var/run目录下,新版的FHS则规范到/run下面。
如果说/usr是安装时会占用较大磁盘容量的目录,那么 /var就是在系统运行后才会渐渐占用磁盘容量的目录。/var主要包括高速缓存、登录文件以及某些软件运行所产生的的目录,包括程序文件,例如MySQL数据库文件等,常见的目录有:
(1)/var/cache 应用程序缓存目录
(2)/var/crash 系统错误信息
(3)/var/log 日志记录
(4)/var/run 进程的标识数据
(5)/var/tmp 临时文件目录
(6)/var/lock 文件锁定记录
srv可以看做service的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录,常见的服务例如WWW, FTP 。
CentOS 7在目录的编排上与过去的版本不同,上面已经大致描述过了,这里做个汇总,比较大的差异就是将许多原本应该在根目录里面的目录,将全部数据挪到了/usr 里面去,然后进行链接设置,这些内容包括:
/bin -> /usr/bin/sbin -> /usr/sbin/lib -> /usr/lib/lib64 -> /usr/lib64/var/lock -> /run/lock/var/run -> /run
3 目录树为了方便大家直观的看到这些目录都是做什么的,我手绘了一个图,图中的这些目录之间的关系很像一棵树,所以这个目录又叫做目录树。