Linux文件存储之inode、硬链接、软链接方法
文件存储
文件存储在硬盘上,扇区(sector)是磁盘中最小的物理存储单位,通常情况下每个扇区的大小是512字节,但为了提高效率,操作系统在读取硬盘的时候往往是一次读取多个扇区(多个扇区组成块),所以块(block)是文件存取的最小单位;最常见的块的大小为4KB;
由于文件存储在块中,所以我们需要一些特殊的东西(inode)来索引这些块,同时也包含了文件的一些元信息,比如创建者、创建日期、创建时间等,这些特殊的东西称之为”索引节点”(inode);可以通过命令:stat 文件名 来查看一个文件的inode信息;
其中Inode:1036334是该文件对应的inode的号码;其它信息在下文说明;
因为inode也要被存储也要消耗磁盘空间,所以在磁盘被格式化的时候,操作系统将其分为两个部分,一部分用于存储inode,一部分用于存储真正的数据;由于inode在格式化磁盘的时候就被设置,且数量有限,所以有可能出现inode被用完,磁盘仍有空间却不能创建文件的情况;可以通过命令:df -i 查看每个硬盘分区的inode总数和已经使用的数量;
其实操作系统查看一个文件并不是通过文件名来打开的,而是通过inode索引到对应的块来找到目标文件,那操作系统是如何找到这些inode的呢?每个inode都有一个对应的ID号。我们打开一个文件,在系统内部实际上分为三个步骤:(1)系统找到这个文件名对应的inode号码;(2)通过inode号码找到对应的inode,获取inode信息,判断权限等;(3)通过inode索引到对应的块,读数据;可以通过命令:ls -i 文件名 来查看一个文件对应的inode号码;
硬链接、软链接、inode、block的关系如下所示(软、硬链接在下文说明):
硬链接和软链接
通常文件名和inode号码是一一对应的,但是Linux系统允许多个文件名指向同一个inode号码;比如我们新建文件file1,通过硬链接的方式新建file2,分别查看这两个文件的inode号码,会发现他们是一样的;那什么是硬链接?与之对应的软链接又是什么?
硬链接:
可以通过不同的文件名访问同样的内容(或是说同一个inode),对文件内容做修改,会在所有的文件名中体现出来(这更像是php中的引用传值),但是删除某一个文件名,并不会对其它的文件名产生影响,文件内容也不会被删除,只有当所有的文件名都被删除时,文件内容才会被删除,这种情况就叫做硬链接,即多个文件名索引同一个inode号码,通过 stat 文件名 可以查看某个文件对应的inode被多少个文件名链接,举例如下:
Links:2说明有两个文件名链接至该inode(1036334),这是因为我创建了文件file1,同时创建了该文件的一个硬链接file2(下文有具体的操作);
创建硬链接举例如下:
新建文件file1:touch file1
创建硬链接file2:ln file1 file2
查看文件信息:ls -li
发现两个文件名对应的inode号码均为:1036334,链接到该inode的链接个数为2(-rw-rw-r–权限后的数字表示指向该inode号码的链接数)
删除file1:sudo rm file1
查看文件信息:ls -li
文件仍存在,且inode号码也未改变,链接到该inode的链接个数变为1;
软链接:
软链接(如下文file3)其实更像windows系统下的桌面快捷方式,它本身也是一个文件(有新的inode号码),只是它保存的不是文件内容(file1),而是软链接指向的文件名的地址(file1的地址),如果删除file3,对文件内容不产生影响,删除file1,会使file3失效;
创建软链接file3:ln -s file1 file3
查看文件:ls -li
链接到1036334inode的链接数仍然为2,说明file3并未链接到1036334
删除file3:sudo rm file3
查看文件:ls -li
并未对file1产生影响;
删除file1:sudo rm file1
查看文件:ls -li
发现file3已变红失效;