上一篇文章主要从理论上分析了Linux的Ext2文件系统,这一篇主要讲解如何查看Linux的文件系统的容量以及讲解Linux文件系统中的连接文件。
可以通过df和du命令来查看磁盘与目录的容量,df命令用来列出文件系统的整体磁盘容量,df命令的用法是 df [-ahikHTm] 目录或文件名,如果df命令不加任何参数,则默认将系统内所有的文件系统的容量以及使用情况都列出来。关于df命令还需要说明的是 df命令是查看文件系统的整体使用情况,因此是从Super block(见前一篇文章)中读取信息,因此df命令的执行速度非常快。
以下是df命令的使用举例:
从图中可以看到,虽然用df命令查看/etc目录的使用情况,但是df命令会自动分析该目录所在的分区,然后将该分区的使用情况列举出来。这里不要犯迷糊,只要不进行磁盘限额,那么/etc目录能够使用的容量就是该目录所在文件系统的容量。
那如果我就是要看当前/etc目录已占用的文件系统容量,那就得通过 du命令,du命令主要用来查看目录所占的容量。不同于df命令,du命令是直接到文件系统内去查看所有的文件系统数据,因此执行时间可能会久一点。关于du命令还是多讲一点,可能鸟哥书上讲的不是很清楚,du命令默认会显示该目录下各个子目录的容量,而显示的总目录容量是已经将该目录下各个子目录的容量加和的。
举个例子,如图所示:
/home目录下总共有三个子目录: /home/hw , /home/test_one ,/home/fuchencong ,它们的容量(已经算上子目录)分别是4k,52k,240k,而且可以查看到 /home 目录自己本身(不算子目录的容量)是4k,所以最终显示的/home目录的容量是 4k + 52k + 240k + 4k= 300k。
另外在使用du命令时,如果加上-S参数,则显示的目录容量就不会加上子目录的容量,此时只是显示该目录本身占用的容量(当然还包括该目录下的直接文件),如下图所示: /home目录显示的占用容量为4k,这就是/home目录本身所占用的容量,而不包括其子目录所占用的容量。
接下来讲解Linux中的连接文件,如果已经理解了Linux的Ext2文件系统,那么理解连接文件就非常简单了。
在Linux操作系统中,连接文件分为两种,硬连接(实际连接)和 符号连接。可以使用ln命令创建连接文件,ln命令的使用方法为 ln [-sf] 源文件 目标文件,如果不加任何参数制作连接文件,就是默认创建硬连接,如果加上-s参数,就是代表创建符号连接文件。那硬连接和符号连接有什么区别呢?
上一篇文章已经讲过,Linux读取一个文件时,首先要从目录block里找出该文件名对应的inode号码,那如果同时有多个文件名同时对应一个inode号码,那么无论通过哪个文件名实际上都访问到同一个文件,其实这就是硬连接。 简单的说,硬链接只是在某个目录下新建一条文件名关联到某个inode号码的关联记录而已。当有多个文件名关联到同一个inode号码,就可以通过其中的任意一个文件名来访问该文件的数据,而且无论通过哪个文件名来修改数据,最终都会修改到实际的文件数据。类似的,当删除一个文件时,其实只是将对应的inode里的引用计数-1,并不会真的删除文件数据,只有当该文件inode里的引用计数减为0,该文件数据才会真的被删除。
但是硬连接也是有限制的,因为每个文件系统都有自己的inode编号,所以目录项里文件名对应的inode号码只能是同一文件系统里的inode号码,因此硬连接只能针对同一文件系统创建,不能跨文件系统建立。而且硬连接也不能连接到目录。一方面对目录创建硬连接会增加系统环境的复杂度,另一方面对目录创建硬连接容易造成循环。因此不支持硬连接到目录。
Linux中还有一类连接,称为符号连接。不同于硬连接,符号连接是创建了一个独立的文件,只不过对这个文件的数据读取会被转向为对它指向文件的数据读取。因此当源文件被删除时,符号连接就会“开不了”。而且对于一个符号连接,它的文件长度就是它所引用文件的文件名长度,因为在连接文件中,它的内容就是目标文件的“文件名”。
以下是硬连接和符号连接的一个实例:
图中可以清晰的观察到hard_link 和 test.file关联到同一个inode号码,因此这两个文件代表的是同一个文件,而且引用计数为2。而symbol_link文件的inode不同于test.file,因为symbol_link是一个独立的文件,只不过它是一个指向test.file的连接文件,而且可以观察到symbol_link的文件长度为9字节,其实就是test.file这个文件的文件名长度。
最后讲解一下关于目录的连接数量。每当新建一个空目录时,该新目录的连接数量为2。为什么呢?首先目录本身占据一个连接,然后该目录里还有一个特殊目录“.”,它也是代表该目录,因此该目录的连接数量为2。 如果在该新的目录里创建一个子目录,该目录的连接数又将+1。因为新建的子目录里有一个特殊目录“..”,代表上级目录,它也指向该目录,因此该目录的连接数+1。
本章Linux命令总结:
df, du, ln。