Linux随笔2( 五 )


2.2 stat命令查看文件的元数据信息
stat命令的输出更加直接,同样可以查看文件和目录的元数据信息,具体如下所示:
3. Linux文件系统的符号链接与硬链接
Linux文件系统的链接主要有两种,分别为:符号链接( link)和硬链接(hard link),前者类似于系统的快捷方式,可以连接到文件或者目录上;后者是通过文件系统的inode链接产生新的文件名,而不是产生新的文件 。
3.1 硬链接(hard link)
由于文件是存储在文件系统中的,所以每个文件在创建的时候都会被分配一个inode,来指向文件内容实际存储的块(block) 。所以要读取该文件的内容,就需要通过目录记录的文件名指向到正确的inode号码,通过inode号码定位到文件内容所在的区块 。换句话说,文件名只与该文件所在的目录相关,而文件内容则与inode号相关 。前面提到硬链接不产生新文件,而是通过inode链接产生新的文件名的方式形成到原始文件的链接 。其实质就是有多个文件名指向同一个inode号,而文件名是与inode不相关的,而是与目录相关的,所以创建一个新的文件名就是在目录中创建一个新的名字而已,并不会产生新的inode,所以也就不会产生新的文件了 。
通常来说,使用硬链接设置文件链接的时候,磁盘空间与inode数都不会发生改变,硬链接只是在某个目录的区块内多写入一个关联数据(指向被链接文件inode号的文件名),所以并不会增加inode数也不会增加磁盘区块数量的消耗 。
注意:如果目录区块中增加的指向被链接文件的inode号的文件名刚好填满目录的区块时,就可能为目录增加一个新的区块记录文件名与inode的关联,从而导致磁盘空间的变化,但是硬链接的文件名用掉的数据量很小,所以通常不会改变inode与磁盘空间的大小 。
硬链接不应该跨越文件系统而存在,只能存在于单一文件系统中,所以硬链接是有限制的:
那么应该如何创建文件的硬链接呢?可以通过两个命令来完成:
使用硬链接的好处就是在不增加磁盘空间占用的情况下,可以增加文件的冗余,即便此时将原始的文件file.txt删除,此时仍然可以通过创建的2个硬链接访问到文件内容 。增加了文件的安全性 。只要该inode号的链接数不为0,那么该文件就不会从文件系统中被删除 。具体如下所示:
查看file.txt文件的内容,然后删除原始的file.txt文件,然后查看两个链接文件的状态,具体如下所示:
~]# cat file.txt 43 - 44 - 45spam[1, 2, 3]{'a': 1, 'b': 2}~]# rm -f file.txt~]# ls -li file*402846113 -rw-r--r-- 2 root root 45 Feb 23 22:51 file_hardlink_1.txt402846113 -rw-r--r-- 2 root root 45 Feb 23 22:51 file_hardlink.txt
上述代码框中,第一行查看了文件内容,第6行删除了原始的文件file.txt,第7行查看了两个硬链接的元数据信息,inode号并没有发生改变,改变的只是链接数,从此前的3变为了此处的2,表示此时还有2个硬链接指向这个inode号 。此时应该仍然是可以访问该文件中的内容的,具体如下所示:
~]# cat file_hardlink.txt 43 - 44 - 45spam[1, 2, 3]{'a': 1, 'b': 2}~]# cat file_hardlink_1.txt 43 - 44 - 45spam[1, 2, 3]{'a': 1, 'b': 2}
此时可以看出,仍然可以通过这两个硬链接查看inode号所指向的区块中记录的内容 。因为inode并没有被删除,文件名与inode的关联也仍然存在,所以自然能够通过这两个硬链接查看原始的文件内容了 。
3.2 符号链接( link)
不同于硬链接是在目录中创建一个文件名指向目标文件的inode号,符号链接则是创建一个独立的文件,使这个文件指向它链接的那个文件的文件名 。由于只是利用文件来作为指向的操作,所以当目标文件被删除之后,符号链接就无法被打开了,其实就是找不到原始文件名了,因为原始文件名与其对应的inode之间的链接关系被打破了,文件内容仍然存在于对应的区块中,只是由于没有到该inode的链接关系,所以无法访问目标区块中存储的内容了 。当符号链接的目标文件存在的时候,既可以通过目标文件访问inode指向的区块中存储的文件内容,也可以通过符号链接访问该inode指向的区块中存储的文件内容 。同时,由于符号链接并不是连接到目标文件的inode号,只是创建了一个新的文件,并将这个文件指向了目标文件所在目录的文件名,所以符号链接通常比目标文件小 。另外,由于符号链接所建立的文件是一个独立的新文件,所以会占用inode资源和实际的存储区块 。符号链接除了可以链接到文件之外,还可以链接到目录上 。