inode
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点”。
文件=属性+内容,属性的集合就是inode
在inode里面,有一个inode id,是标识一个文件的标志,一般一个文件只有一个inode,inode id也是唯一的,看到inode id命令:ls -i
文件系统会根据不同的分区划分为数个的block group(块组),每个block group都有相同的结构。
1.data blocks(数据块):有很多小数据块,用来存放数据
2.inode Table(inode表):存放很多个inode的集合。inode table 和data blocks是有对应关系的
3.inode Bitmap(inode位图):是比特位存储,每一个比特位表示inode是否被占用,占用为1,不占用为0,inode位图和inode表是对应着的。
4.Block Bitmap(Block位图):同inode Bitmap,每一个比特位表示Data Blocks中数据块的数据块是否被占用,占用为1,不占用为0,Block位图和Data Blocks是对应着的。
5.Group Descriptor Table(块组描述符表):对每一个块组的属性的集合
6.Super Block(超级快):存放文件系统本身的结构信息
问题:
我们都知道,Linux下,一切皆文件,那么目录也是文件,那么就有一个问题,目录的属性放在inode table里面,那么目录的内容是什么呢?当我们在一个目录下ls时,看到的该目录下的所有文件的名字及相关属性信息,那么目录是找到这些文件的?怎么显示这些内容的呢?
答案:
其实目录的内容就是该目录下的文件对所对应的inode id的映射关系。
在ls之后,文件系统读取目录的内容,读取文件名和inode id的映射关系,通过inode id就能找到inode,所以就会得到该文件的属性,并显示出来
创建文件的过程
1.在inode Bitmap找未被占用的位置,找到就把该位置的比特位置1
2.在inode table里对应的inode位置写入文件属性
3.在Block Bitmap找未被占用的位置,找到就把该位置的比特位置1 4在data Block里对应的block位置写入文件内容
5.建立inode和block的对应关系
6.文件名和inode id的映射关系,写入该目录下的内容里
删除文件的过程
1.在inode Bitmap 和 Block Bitmap 里把对应位置的比特位从1置0
2.在该目录下把该文件名和inode id的映射关系删除
查找文件的过程
1.在该目录的内容里查找文件名与inode id的映射关系,找到inode,即找到文件的属性
2.通过inode和data block的对应关系就可得到文件的内容
软硬链接
1.硬链接
一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode 号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的 访问。这种情况就被称为"硬链接"(hard link)。
硬链接命令 ln file1 file2
图中所标的数字就是该文件的硬链接数文件
可以看到两个文件的inode id一样,说明硬链接并没有创建新文件
2.软链接
文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链 接"(soft link)或者"符号链接(symbolic link)。 这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。
软链接命令 ln -s file1 file2
可以看到,a.out和cmd的inode id 不一样,说明软链接会创建新文件,此时cmd里的内容就是a.out的路径,运行cmd就等于运行a.out