
1.7 Linux文件系统
在命令行的操作中,命令提示符会提示当前的工作目录,在操作中也经常需要在不同的目录之间跳转,一些命令需要在正确的工作目录下执行才能获得预期的结果,为了能够更快捷地跳转到目标目录中,就需要了解整个系统中文件的结构。
1.7.1 Linux文件系统结构
在Linux系统的设计理念中,有一个重要的概念叫作“一切皆文件”,即把计算机上的一切资源都视为文件来处理。普通文件是文件(例如文本文档、视频文件),目录(也就是常说的文件夹)是文件,硬件设备(例如摄像头、传声器)是文件,符号链接是文件(类似在Windows下的快捷方式)。在Linux中可以通过查看文件属性的方式了解文件所属的类型。例如在用户主目录下创建一个文件bingda_file,再创建一个目录bingda_directory,然后通过ls-l来检查文件的属性。
如图1-50所示,在文件属性一栏中,刚创建的bingda_file文件是以‘-’开头,而bingda_directory目录文件是以字母‘d’开头。

图1-50 bingda用户主目录下的文件
Linux中就是通过这样的方式来标识文件属性的,常见的文件类型有以下几种。
1)普通文件:以‘-’标识,文本文档、压缩包、视频文件等都是属于普通文件。
2)目录文件:以‘d’标识,目录也是一个文件,目录文件中存储的信息类似于一张清单列表,记录了归属在该目录下的文件。
3)设备文件:设备文件分为两种,一种是块(block)设备文件,例如硬盘等,以‘b’标识;另一种是字符设备文件,例如鼠标、键盘等,以‘c’标识。两者的区别在于块设备文件支持以块为单位的访问方式。在Linux中一个块为4KB大小,即一次可以存取4096或其倍数字节的数据。字符设备文件以字节流的方式进行访问,由字符设备驱动程序来实现这种特性,这通常要用到open、close、read、write等系统调用。
4)链接文件:以‘l’标识,链接文件一般指的是一个文件的软链接(或符号链接),即源文件的快捷方式。删除源文件则链接文件也会消失。除了软链接外还有一种硬链接,硬链接文件不会显示为链接文件,而是会显示为普通文件。
可以通过下面的实验来验证,ln为创建链接,默认为创建硬链接,加上-s参数则为创建软链接。对bingda_file分别创建硬链接和软链接,然后查看文件属性。如图1-51所示,创建的软链接被标识为链接文件,且会通过“→”来指向链接的源文件,而硬链接则显示为普通文件。

图1-51 链接文件
Linux中除了这几种文件类型外,还有管道文件、套接字文件等,因为后文中不会涉及,这里不做展开。
操作系统中的文件种类繁多、数量庞大,如果每个开发者或者公司都按照自己的想法来组织文件,那必然会造成很大的混乱,所以就有了文件系统目录标准(Filesystem Hierarchy Standard,FHS),FHS的目的是规范文件的组织形式,减少不同公司、不同操作系统之间的文件系统组织命名形式的差异。
在FHS中规定了Linux的文件系统以“/”目录作为根目录,也就是最高一级的目录,并且“/”目录是唯一的。可以通过cd..命令进行跳转到上一层的目录,然后通过pwd命令来输出当前的路径,则无论从什么目录开始执行,最终都会到达“/”目录,并且到达“/”目录后再执行跳转上一层命令也会始终停留在“/”目录,这也就意味着已经到达了顶层目录。在“/”目录下,可以执行ls-l命令来列出当前目录下的所有文件。
如图1-52所示,普通文件只有一个swapfile,大多数都是目录文件,另外还有几个链接文件分别是bin、lib、lib32、lib64、libx32、sbin。这6个链接文件都是指向/usr目录下对应的目录文件,在Ubuntu 18.04中,bin、lib、lib64、sbin文件都是目录文件,而在Ubuntu 20.04中改为链接文件,后文中介绍目录的存放规则时对这4个链接文件依然当作目录文件。libx32和lib32这两个链接文件和所指向的目录文件是Ubuntu 20.04中新增的,目前这两个链接文件所指向的目录文件中并没有内容,所以在后面不再提及。

图1-52 根目录下的文件
1.7.2 目录内容存放规则
前面提到FHS约定了文件的组织规则,也就是说图1-52中各个目录中的文件是按照文件类型或功能的规则来存放的,根据FHS中的约定和Ubuntu的实际操作,将各个目录中存放的文件整理后见表1-9。
表1-9 Ubuntu中目录规则
