目录
📕.什么是inode
当我们创建一个文件时,我们不对文件中写入任何内容,请问该文件是否占磁盘空间?答案是肯定的,因为文件中的属性信息也占了磁盘空间。
首先我们得认清一个概念:
文件构成=文件属性信息+文件里存储的内容。
文件属性:文件的权限,文件文件里存储的内容的空间大小,文件的创建时间等等。
在linux中,文件的属性和内容是分开存储的,我们把把存储文件属性信息的结构称为inode,inode是任何一个文件的属性集合,linux中几乎每一个文件都有一个inode,在linux可能存在大量的inode,所以系统就会给inode分配一个编号,这个编号叫做inode编号。
我们通常需要对一个磁盘分成若干个区域,例如我们电脑上的c盘,d盘,e盘等都是磁盘被划分的区域,每个区域的构成是类似的,只要我们知道其中一个区域怎么划分,我们就知道其他区域怎么划分,然后每个区域会分成若干个组,每个组的组成也是类似的,所以我们只要我们了解了磁盘上的一个组,我们就能理解文件系统。如下:
1.
- 超级区块(super block):记录此文件的系统的整体信息,包括inode与数据区块的总量,使用量,剩余量,以及文件系统的格式与相关信息等。
- Filesystem Description(文件系统描述说明):这个区段可以描述每个群组的开始与结束的区块,以及说明每个区段(超级区块,对照表,inode对照表,数据区块)分别介于哪一个区间中。
- inode table:当我们整个块组里面可能包括多个文件,在inode table中可以存在多个inode,在inode table中的inode数量一开始就已经被文件系统给划分好了,·当我们在块组里面创建文件test的时候,首先需要在inode table申请一个inode去记录该文件的信息。
- 数据区块(data table):数据区块是用来放置文件数据的地方,在区块里面有若干个数据区块,每个区块都有自己的编号,以方便的记录。在etc2文件系统中所支持的数据区块大小有1k,2k及4k三种,在格式化时区块就已经确定了,常见的是4kb。分区之后,数据区块的个数是确定的。
当我们要在往test文件中写数据的时候,我们要在块里面写,假设我们要写的内容是12kb,我们就需要在其中的三个数据区块中进行写数据,然后将在哪三个块中写的数据记录到test的inode结构去里面去。
每个inode里面都有一个数组,这个数组是记录文件相对应的数据区块的编号

Block Bitmap中的bit位置代表的是哪一个区块,内容代表的是是否被占用。
创建一个文件就需要去某个块组中的inode table中申请一个inode给给该文件,并将inode位图里面中相对应的bit位置为1,表示该inode空间已经被占用了,然后将文件的属性信息写入到我们的inode里面。
在文件中写入1kb数据的过程是去区块中申请一个数据区块中,并在块位图中将相对应的的bit位置为1,表示该区块已被占用,然后将数据区块中。
先将该文件的在块位图中的相关的bit为置为0,然后将inode位图中相关的bit位置为0。这样就表示该文件已经被删除,不用清空inode和数据块中的内容,当另一个文件创建的时候分配到相对应的inode和数据块时,再清空inode和数据块再进行写数据。当我们要恢复文件时,我们只要把之前删掉的文件中位图相对应的bit位和块位图相对应的bit位给恢复出来即可。这就是为什么文件中的数据可以被恢复的原因,当我们误删了公司某个文件的时候,不要再创建文件或者写数据,我们可以需要上级汇报,也许他可以帮我们恢复数据。
当我们ll -i的时候,最前面的数字代表的时inode编号,一个inode都有一个inode编号。

📕.目录
文件我们讲完了,在linux中,一切皆文件,那么目录也是文件。
我们该如何理解目录呢?
我们先创建一个目录dir1,ll -i发现,目录也有一个inode编号。
说明创建目录的时候,文件系统会给目录申请一个inode,这个inode也是放目录的属性信息,那么目录中的内容放的是什么。
目录:放的是当前目录下的 文件名和对应的文件的inode编号(inode号)
ls lesson20 -i 查看lesson20目录下文件名和相对应的inode编号。
所以当我们要查看文件里面的内容时,我们只需要拿到该文件的名字,找到该文件的当前目录,然后就找到该目录的inode,在找出相对应的数据区块,在数据区块中再通过文件名和inode映射关系找到该文件的inode编号,在找到相对应的inode,然后通过inode找到相对应的数据区块,就可以查看该文件的内容了。
结论:
1.inode结构中不包括文件名,包括目录本身,操作系统不认识什么文件名。操作系统要找到相对应的文件的inode,只需要知道inode编号即可。文件名是放在当前目录下的内容里。
总结:
创建一个文件,我们就需要在一个组中的inode table申请一个inode,放该文件的属性信息,然后在inode位图中相对应的bit位置为1,表示该inode已被占用,然后将inode编号和文件名放在当前目录下进行映射起来。
📕.硬链接
真正在区分磁盘的不是磁盘的文件名而是inode,因为一个文件只有只有一个inode编号,文件内容是由inode记录指向的,而文件名只与目录有关,在linux下一个inode是可以对应多个文件名。当我们给文件创建另外一个名字的方式叫做硬链接。
创建硬链接的方式:
ln test.c test.1 :给test.c文件进行硬链接,test.1是test.c的别名。test.1和test.c的inode编号是一样的,说明这两个文件是同一个文件。
一个文件有几个名字就有多少次硬链接。
所以无论是test.c还是文件的test.1文件都可以找到编号为1835850的inode编号的文件。
我们在删除文件时干了两件事情: 1. 在目录中将对应的记录删除, 2. 将硬连接数 -1 ,如果为 0 ,则将对应 的磁盘释放。
📕.软链接
创建软连接的方式:
test-s文件是test.c文件软链接生成的,我们发现它们两个的inode的编号是不同的,说明这两个文件是不同的,但是我们查看这两个文件内容时发现它们的内容时一样的。
软链接就是建立一个独立文件,这个文件会让数据的读取指向它链接的那个文件的文件名。
软链接就相当于我们windows上给软件建立快捷方式。
好啦,今天的分享就到这里了,觉得有用的小伙伴们麻烦你们帮我点个赞加关注,谢谢你们~