磁盘的物理结构
一个盘片都有正反两面,一面都会对应一个读写磁头,假设有5个盘片,就是有10个面,那么就会存在10个磁头,这个磁头是一起摆动的,不能单独动,一个磁头负责一面磁片的读写。
那么磁头是怎么进行读写的呢?
其实在磁片上有很多个微小单元,这些微小单元其实就是一个小磁铁,我们都知道磁铁有南北极,南极表示1,北极表示0,如果要写入数据,就把北极改为南极,对内容做磁化,如果要删除数据就是把南极改为北极
磁片上的结构
把磁盘的物理构造图像抽象出来后为下图:
- 每个盘片被分为很多个同心圆,每一个圆都是一个磁道。
- 每一个磁道会分为若干个扇区。
- 每个扇区的存储容量都是
512
字节,不论离圆心斤或是远。- 文件系统访问磁盘的基本单位是
4kb
。
逻辑抽象
可以把盘面抽象为一个线性结构,每一个盘面上面有很多个磁道,每个磁道又有8个扇区,每个扇区是
512
字节,那么8个扇区就是一个磁道就是
4kb
。
Linux中EXT2文件系统的存储方案
磁盘分区好了之后,每一个分区的头部都会有一个引导块
Boot Block
,其余部分
EXT2
文件系统会根据分区的大小分配块组(Block Group)
引导块(boot block)是存储在计算机硬盘的特定扇区中的一段代码。它是计算机启动过程中的第一个扇区,也被称为主引导记录(Master Boot Record,MBR)。
引导块的主要作用是引导计算机的操作系统。当计算机启动时,BIOS(Basic Input/Output System)会读取硬盘的引导块,并将控制权转交给引导块中的引导程序。
引导程序是一段特定的机器码,它能够加载操作系统的核心代码(内核)到计算机的内存中,并将控制权交给操作系统。引导程序通常位于引导块的开头位置,其大小一般为512字节。
引导块还包含了分区表(Partition Table),它记录了硬盘上的分区信息。分区是硬盘被划分成多个逻辑部分,每个分区可以包含一个操作系统或其他数据。分区表中的记录描述了每个分区的起始位置和大小。
通过引导块中的引导程序和分区表,计算机能够正确加载并启动操作系统,从而使计算机能够正常运行。
而每一个分区当中的头部都会存在一个
Super Block
,这个块主要存放文件的很多重要信息,一旦丢失,那么文件也全部都丢失了,所以需要在每一个块组前面设置一个当作备份,防止文件丢失。
Super Block
:记录了文件系统的大小,包括所有的数据块和inode结构的大小、每个数据块的大小、
inode
表起始的位置等等…
Group Descriptor Table
:该组中第一个数据块的块号、该组中哪些数据块被使用的位图的起始块号、组中未被使用的数据块数量、组中未被使用的inode数量、组中目录的数量。
Block Bitmap
:记录
Data Blocks
中哪些数据块被占用,哪些没有被占用。
inode Bitmap
:
inode
节点的分配情况。
inode Table
:存放文件的属性,每个文件的
inode
,文件内容在
Data Blocks
中的分布情况。
Data Block
:存放文件内容。
如何创建一个空文件?
1.首先在
inode bitmap
当中找到一个没有被使用的
inode
。
2.在
inode
表当中找到对应的
inode
结构体,并且把文件信息写入到
inode
结构体当中。
3.将该文件的文件名和指向
inode
结构体的指针添加到目录文件的数据块中。
如何理解对文件进行写入?
1.通过
inode
找到
inode
结构体
2.通过
inode
结构体找到文件对应的
Data Blocks
。
如何理解删除一个文件?
1.将文件的
inode
在
inode
位图中设置为0。
2.将文件的对应的数据块的数据块位图设置为0。
这也就是为什么下载很慢,删除很快,因为操作系统并没有删除数据,而是把映射关系取消掉了。
文件名存在哪里?
前面说到了,
inode
保存了文件的属性,那么
inode
是否也保存了文件名呢?
答案是没有。
文件名其实是保存在目录的数据块当中,当然,也会保存文件的
inode
,不保存
inode
的话那还怎么去找到文件呢。
同时,这也是为什么同一个目录下不能出现名字一样的文件的原因。
软连接
现在我要为
d1/d2/d3/test
这个文件创建一个软链接。
ln-s d1/d2/d3/test soft
我现在去执行这个
test
程序,看会打印什么
我再执行
soft
呢?
接下来看一下文件信息
soft
的
inode
是1576022,而
test
的
inode
是15706021,可以说明它们并不是同一个文件,但是
soft
文件其实是指向
test
文件的,
soft
文件内容就是
test
文件的地址。
这可以联想到
windows
的桌面,其实基本都不是原文件,而是建立了一个软链接。
硬链接
ln d1/d2/d3/test hard
可以看到这两个的
inode
是一样的,其实他两都是同一个文件,只是在当前目录下同一个
inode
,不同的文件名罢了,其实
inode
当中是有一个引用计数的,如果创建了一个硬链接,那么计数就会+1,当计数为0的时候才会删除文件。
那么再来看到隐藏文件当中的
.
和
..
,就是当前文件目录和上一级文件目录,它们是怎么实现的呢?
这里
.
的硬链接数是3,
inode
为1576016,
..
的硬链接数是8,
inode
为786757。
可以看到
.
的
inode
和当前目录
link
的
inode
一模一样,而
..
的
inode
和上级目录
study
的
inode
一模一样,就说明其实它们两就是一个硬链接,那硬链接数是怎么回事呢?
这是由于
study
目录下有6个文件,因为创建一个文件它的硬链接是1,就是它自己,那么目录也是如此,也有一个自己的硬链接,然后就是目录下的
.
文件以及其它文件,1+1+6=8,所以是8个硬链接。
软硬链接的区别
- 软链接是一个独立的文件,有独立的inode,而硬链接没有独立的inode。
- 软链接相当于快捷方式,硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录。
版权归原作者 Sudo_Wang 所有, 如有侵权,请联系我们删除。