2.1.3 文件及Linux目录结构
1. 什么是文件
在Linux系统上,文件被看作是字节序列。这种概念使得所有的系统资源有了统一的标识,这些资源包括普通文件或目录、磁盘设备、控制台(键盘、显示器)、打印机等。对这些资源的访问和处理都是通过字节序列的方式实现的。Linux系统下的文件类型包括:
●普通文件(-)。
●目录(d)。
●符号链接(l)。
●字符设备文件(c)。
●块设备文件(b)。
●套接字(s)。
●命名管道(p)。
2. 普通文件
普通文件就是字节序列,Linux并没有对其内容规定任何的结构。普通文件可以是程序源代码(如C、C++、Python、Perl等)、可执行文件(如文件编辑器、数据库系统、出版工具、绘图工具等)、图片、声音、图像等。Linux不会区别对待这些文件,只有处理这些文件的应用程序才会根据文件的内容为它们赋予相应的含义。
在DOS或Windows环境中,所有的文件扩展名就能表示该文件的类型,如*.exe表示可执行文件,*.bat表示批处理文件。在Linux环境下,只要是可执行的文件并具有可执行属性就能执行,无论其文件名后缀是什么。但是对一些数据文件一般也遵循一些文件名后缀规则,表2-6中列出了一些常用的文件后缀。
表2-6 常用的文件后缀举例
3. 目录和硬链接
目录文件是由一组目录项组成,目录项可以是对其他文件的指向,也可以是其下的子目录指向。
实际上,一个文件的名称是存储在其父目录中的,而并非同文件内容本身存储在一起。
将两个文件名(存储在其父目录的目录项中)指向硬盘上一个存储空间,对两个文件中的任何一个的内容进行修改都会影响到另一个文件,这种链接关系称为硬链接。硬链接文件实际上就是在某目录中创建目录项,从而使不止一个目录可以引用到同一个文件。它可以由ln命令建立。首先查看目录中的文件情况。
使用ln命令建立文件file1的硬链接文件file2。
该命令产生一个新的文件file2,和已经存在的文件file1建立起硬链接关系:
可以看出,file2和file1的大小相同、内容相同、再看详细信息的第2列,原来file1的链接数是1,说明这一块硬盘存储空间只有file1一个文件指向它,而建立起file1和file2的硬链接关系之后,这块硬盘空间就有file1和file2两个文件同时指向它,所以file1和file2的链接数就都变为了2。因为两个文件指向一块硬盘空间,所以如果现在修改file2的内容为This is file2.,再查看file1的内容,就会有:
如果删除其中的一个文件(无论是哪一个),就是删除了该文件和硬盘空间的指向关系,该硬盘空间不会释放,另外一个文件的内容也不会发生改变,但是目录详细信息中的链接数会减少,见如下信息。
硬链接并不是一种特殊类型的文件,只是在同一个文件系统中允许多个目录项指向同一个文件的一种机制。
4. 符号链接
符号链接又称软链接,是指将一个文件指向另外一个文件的文件名。这种符号链接的关系由ln-s命令行建立。首先查看目录中的文件信息。
使用ln命令和-s选项建立文件file1的符号链接文件file2。
该命令产生一个新的文件file2,和已经存在的文件file1建立起符号链接关系。
可以看出file2这个文件很小,因为它只是记录了要指向的文件名而已,请注意从文件file2指向文件file1的指针。
为什么cat命令显示的file2的内容与file1相同呢?因为cat命令在寻找file2的内容时,发现file2是一个符号链接文件,根据file2记录的文件名找到了file1文件,然后将file1的内容显示出来。
明白了file1和file2的符号链接关系,就可以理解为什么file1的链接数仍然为1,这是因为file1指向的硬盘空间仍然只有file1一个文件在指向。
如果现在删除了file2,对file1并不产生任何影响;而如果删除了file1,那么file2就因无法找到文件名称为file1的文件而成为死链接。
5. 设备文件
设备是指计算机中的外围硬件装置,即除了CPU和内存以外的所有设备。通常,设备中含有数据寄存器或数据缓存器、设备控制器,用于完成设备同CPU或内存的数据交换。
在Linux下,为了屏蔽用户对设备访问的复杂性,采用了设备文件,即可以通过像访问普通文件一样的方式对设备进行读写访问。
设备文件用来访问硬件设备,包括硬盘、光驱、打印机等。每个硬件设备至少与一个设备文件相关联。设备文件分为字符设备(如键盘)和块设备(如磁盘)。Linux下设备名以文件系统中的设备文件的形式存在。所有的设备文件存放在/dev目录下。
下面对常用设备文件说明,如表2-7所示。
表2-7 常用设备文件说明
在/dev目录下有许多链接文件,使用这些链接能够方便地使用系统中的设备。例如,可以通过/dev/cdrom而不是/dev/sr0来访问光驱。
6. 套接字和命名管道
套接字和命名管道是Linux环境下实现进程间通信(IPC)的机制。
命名管道(FIFO)文件允许运行在同一台计算机上的两个进程之间进行通信。套接字(Socket)允许运行在不同计算机上的进程之间相互通信。
套接字和命名管道通常是在进程运行时创建或删除的,一般无需系统管理员干预。
7. 熟悉Linux的目录结构
Linux的目录结构遵从文件系统层次结构标准(File system Hierarchy Standard,FHS)。表2-8中解释了由FHS所规定的存放特定类型的文件位置。
表2-8 由FHS所规定的Linux文件系统布局
提示
1. 在Linux环境下,文件是归类存放的。初学Linux的朋友应该熟悉特定类型的文件的存放位置。
2. 对于Linux的初学者而言,在不知道自己究竟在做什么的情况下,不要轻易操作系统目录,如/proc、/boot、/etc、/usr、/var等。
3. 用户可以使用如下命令获得Linux文件层次结构的说明: