目录
一.inode
1.1 什么是inode
1.2 简单了解文件系统
1.2.1 硬盘硬件结构
1.2.2 简单了解文件系统
1.2.3 目录文件
2. 总结
二.硬链接
三.软链接
文件包含属性和数据。inode是文件一个文件的属性集合,它和文件的关系是1对1的关系。一个文件只有一个inode。
文件的数据,保存在数据块中,文件数据和文件的关心是多对1的关系。一个文件可以有很多内容。
文件保存在硬盘中,为了理解首先我们先来了解一下硬盘的物理结构。
一个磁盘具有两个磁盘面,每个磁盘面都可以保存数据。磁盘读写的最小单位为扇区,一般含有512字节。很明显,如果每次读写都以这么小为单位,那这读写的效率会非常低。
所以,文件系统把多个扇区组成了一个逻辑块,每次读写的最小单位就是逻辑块(数据块),Linux 中的逻辑块大小为 4KB
,也就是一次性读写 8 个扇区,这将大大提高了磁盘的读写的效率。
读写磁盘数据时,首先由先确定好数据在哪个磁盘面,每一个磁盘面都有一个磁头,使用哪一个磁头确定了哪个磁盘面。
然后确定好柱面,在磁盘面上可以形成很多同心圆。每一个磁盘同一个位置的同心圆确定一个柱面。
最后确定数据在哪个扇区,即找到数据。
为了很好的管理硬盘上的文件。我们可以将硬盘抽象成一个逻辑结构,抽象成一个数组。数组元素的大小为512字节。我们知道一个硬盘大小很大,为了更好管理硬盘,我们将硬盘进行了分区。但是,一个分区的大小还是太大了,于是在分区里,还需要进行分块组。
- boot blocks(启动块):大小是确定的,占据一个扇区,512字节。它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用 446 字节,分区表为 64 字节,结束符占用 2 字节。其中分区表每记录一个分区信息就需要 16 字节,这样一来,最多就只有4个分区信息可以写到第一扇区中,这4个分区就是4个主分区。
块组:
- super block(超级块):存放文件系统本身的信息。与文件系统有关。记录的信息由block和inode的总数等。每一个块组都由一份super block,备份。防止一份损坏后,导致其它块组也不能使用。super block里的信息被破坏,整个文件系统结构就被破坏了。
- Group Descriptor Table(块组描述符):简称GDT,描述块组的属性信息。有多少inode被使用了和没被使用,有多少数据块被使用和没被使用等。
- block bitmap(块位图):记录data blocks中哪个数据块被使用,哪个数据块没被使用。
- inode bitmap(inode 位图):记录inode table中哪个被使用,哪个没被使用。
位图:用每一位的0或者1状态表示未使用和使用。
- inode table(i结点表):存放文件属性。
- data blocks(数据区):存放文件内容。
注意:inode 名称是存在inode里的。一个inode就会有一个数组,与数据块产生对应关系。
如果想知道inode table和data blocks中有多少使用了,有多少没有使用,可以遍历对应位图,找有多少0,多少1。但是在块组中,也可以通过GDT得到。
一个目录也是文件。是文件就会有inode和数据。
目录的属性保存的是目录船舰时间,修改时间等。
目录的数据保存的是目录里的文件的文件名和对应文件inode 名称的一种对应关系。
- 如何让在目录下建立一个文件
找到该目录所在的分区和块组。
1.在inode bitmap中找到一未使用的位,将该位置1。在inode table中找到对应位的空间,保存要创建文件的属性。
2.在block bitmap中找到一个或者多个未使用的位,将该位置1。在data blocks中找到对应数据块,保存要创建文件的内容。
3.在inode table新创建文件的inode的数组中填入数据块信息,建立映射关系。
4.将inode 名称和文件名对应关系保存到目录的数据块中。
- 如何找到文件
找到该目录所在的分区和块组。
1.在找到目录的inode 名称,通过inode 名称找到inode table目录的inode,通过里面的数组,找到目录的数据。目录的数据保存的是文件名和对应文件名inode 名称的对应关系。
2.我们知道文件名后,通过目录数据找到文件的inode 名称,就可以找到文件inode,通过文件inode里的数据,可以找到文件数据。
- 如何删除文件
知道文件的inode,就可以得到数据块。只需要将inode bitmap对应位置0,将blocks bitmap对应位置0,即可。删除文件并未将数据真正删除。
- 恢复一个文件
需要得到文件的inode id,就可以找到inode和数据块,找到块位图和inode位图对应位置为1,即可。
Linux系统允许多个文件指向一个inode 名称。可以用不同的名称访问同一文件的内容,这种方式叫做硬链接。硬链接和指向的文件共享一个inode,没有独立的inode,不是一个独立的文件。
怎么实现硬链接?
通过命令 " ln 指向文件 链接文件 "
目录里面数据块保存的是文件名和inode的对应关系,增加一个硬链接,说明在该目录的数据块中,该inode同时对应了另外一个文件名。意思就是一个inode,对应两个文件名。(文件名并不代表真正的文件,inode才代表真正的文件)。这说明文件系统中只有一个文件,只是在目录的数据块中增加了一层对应关系。
将硬链接中的某个文件内容改变,硬链接的所有文件内容都会改变。但是删除一个硬链接中的文件,并不会对其它文件产生影响。
我们平时使用的"ls -l"命令
从上图中我们发现,创建一个目录后,硬链接数为2,这是因为,目录里有两个隐藏文件,分别是"."和"..",分别标识当前目录和上一级目录。"."增加了一个当前目录的硬链接数,所以为2。
硬链接是通过inode引用另外一个文件,软连接是通过文件名引用另外一个文件。
软连接具有独立的inode,说明是一个独立的文件。
实现软连接:ln -s 指向的文件 链接文件
软连接文件具有独立的inode,是一个独立的文件。说明在文件系统中,增加了一个文件。
假设文件A是软连接文件,文件B是连接的对象文件。
文件A的内容是文件B的路径,读取文件A时,会直接读取到文件B。
如果删除文件B,读取文件A时会报错
文件A引用的是文件B的文件名,并不是文件B的inode,所以文件B的链接数不变。
软链接的应用场景:当一个可执行程序的路径很深,但是你想在当前目录下执行那个可执行程序,可以使用软链接。这个相当于windows下的快捷方式。
软硬链接的区别:
软连接是一个单独的文件,具有独立的inode,实际是在文件系统中增加了一个文件。
硬链接不是一个独立的文件,实际是在存在的目录的数据块中,增加了链接文件的inode与链接文件名的对应关系。