在之前一篇文章里,我们讲了文件的部分属性,现在我们来了解一下文件系统。
点击打开链接
一、inode
1、什么是inode
理解inode,要从文件存储说起。
文件储存在硬盘上,硬盘的最小存储单位叫做“扇区“(Sector),每个扇区储存512字节,操作系统读取硬盘的时候,不是一个一个扇区读取的,而是一次性读取多个扇区,即一次性读取一个块(block)。
这种由多个扇区组成的块,是文件存取的最小单位。
而储存一个文件,我们应该保存其内容和属性。
文件数据都存储在块中,很显然,我们必须找到一个地方储存文件的属性,比如文件的创建者、创建日期、大小等,这种存储文件属性的区域就叫inode。
2、inode的内容
inode包含文件的属性,有下列内容:
文件的字节数
文件拥有者的User ID
文件的Group ID
文件的时间戳,包含ctime(inode上一次变动的时间)、mtime(文件内容上次变动的时间)、atime(文件上次打开的时间)
链接数(下面会介绍)
文件数据block的位置
我们可以用一个命令stat,查看文件,如下图:
3、inode的结构
当文件系统创建完成之后,会在整个元数据区域为每一个 inode 创建一个位图( bitmap )区域。每一个 inode 都在 bitmap 中占据一位。已使用的 inode ,其标志位置为 1 ,未使用的 inode ,其标志位置为 0 。
当我们需要找一个空闲的 inode 时,只需要扫描一下 bitmap 。同理数据区也是用 bitmap 来管理 block 。前者称为节点位图,后者称为块位图。
同理:
删除文件时只需要在节点位图中把文件对应的inode标记为0就可以了,所以在Linux系统删文件是特别快的哦!
当要统计硬盘已使用空间时,扫描节点位图中inode标志位为1的文件占多少个block,然后乘以每个block的大小就可以了。
为什么删除了的文件能找回来?
是因为数据在block中没有动,只是把block对应的块位图标记为0。当我们在存新的文件进来时,就把块位图标志位为0的block覆盖掉。这也就是为什么当我们删除了文件,如果添加好多新的文件进来后就不容易找回旧文件的原因。
块位图标记为0后,块位图对应的inode也要标记为0。
这个inode以后也可以被其他文件所使用了。
4、创建一个新文件
当创建一个新文件时,会发生什么?
用ls -i 可以查看文件名对应的inode号码
可以看出file4的inode的inode号是926742,那么建立一个新文件是如何将属性与内容分开的呢?
所以,创建一个新文件的操作:
(1)存储属性
内核先找到一个空闲的i节点(上例中是926742),内核把文件信息记录在其中。
(2)存储数据
该文件需要存储在三个磁盘块,内核找到三个空闲块,将内核缓冲区的数据依次复制。
(3)记录分配情况
文件内容按顺序300,500,800存放,内核在inode的磁盘分区记录上述块链表。
(4)添加文件名到目录
新的文件名为file4,内核将入口(926742,file4)添加到目录文件。文件名和inode的对应关系将文件名的内容和属性连接起来。
注意:每个文件都 有自己的编号,inode,且一个文件只有一个inode
5、目录文件
注意目录也是文件,不过目录的数据区存放的是目录下的文件名及该文件的inode的对应关系。
二、硬链接
经过上面的学习,我们知道,真正找到磁盘上文件的并不是文件名,而是inode。
其实在Linux中可以让多个文件名对应同一个inode。
这就意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响所有的文件名;删除一个文件名,不影响另一个文件名的访问。
这就称为硬链接。
ln命令可以用来创建硬链接:
可以发现,file1与h_file1的inode一样,且链接数(记录指向该inode的文件名总数)增加了1,变成了2。
我们来看一下修改其中一个文件时另一个的变化:
上图中,我们先将"hello world"写入了file1中,用cat查看h_file1,发现内容一致。
接下来,修改了file1的权限,h_file1也相应发生了变化。
都可以证明它们其实是同一文件,和我们之前接触的引用计数很像,回忆一下引用计数的删除,硬链接也遵守这个规则。
若删除一个文件名,inode节点的链接数就会减一,当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode,以及所对应的block区域,如下,链接数变为1。
注:对于目录的链接数,由于目录创建时会自动生成两个目录项"."和"..",前者的inode号码就是当前目录文件的inode号码,相当于当前目录的硬链接,那么后者就是父目录的inode,等同于父目录的硬链接。
所以,任何一个目录文件的链接数,总是等于2加上它的子目录总数(包括隐藏目录),这里的2指的是父目录对其的硬链接和当前目录的硬链接:
三、软链接
有一种情况,文件1与文件2,虽然inode号码不一样,但文件1的内容是文件2的路径。读取文件1时,系统会自动将访问者导向2。也就是说,不管打开哪一个文件,最终读取的都是文件2。这时,文件1就称为文件2的软链接。
这就意味着,文件1是依赖文件2存在的,如果删除了文件2,打开文件1就会报错,找不到文件2,可以理解为文件1 存放的是如何找到file2,和Windows的快捷方式特别像。所以它们都 有自己的inode:如下图,
创建软链接:
s_file2是file2的软链接,可以看出inode是不一样的。
给file2写入hello world,查看s_file2:
那么删除呢?
再次创建,试一下删除file2会不会报错: