Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。
本篇导航
- 0. 磁盘物理结构介绍
- 1. 磁盘逻辑结构
- 2. 文件系统划分
- 3. 如何理解文件目录
- 4. 对文件的增删查改
- 5. 软链接与硬链接
- 5.1 软链接
- 5.2.1 软链接应用场景
- 5.2 硬链接
- 5.2.1 硬连接的应用场景
- 5.2.1 硬连接的应用场景
0. 磁盘物理结构介绍
在老式的电脑中,或服务器后台上使用的并不是如今的高速磁盘SSD,而是机械硬盘.
他有磁头,盘片,磁头臂等机械结构组成… 其中每一个盘面上都有一个磁头,磁头和盘面上有很小的间隙,方便高速读取.所以磁盘封装的时候需要进行无尘处理,一旦落入灰尘就会火花带闪电…
磁盘是一个永久性存储截至.其存储原理为,磁头是带电的,磁盘上有无数个磁点,一个点的正负性可以代表一个0或者1,磁头通过充放电,就可对磁盘写入01,进而将数据存储.
磁盘进行读取的时候,是通过访问扇区.确定一个扇区需要经历以下二个步骤:
- 确定是哪一个盘面(确定使用哪一个磁头)
- 确定是哪一个柱面(磁道)
也就是 Cylinder Header Sector CHS寻址法.
那么CPU是如何与磁盘进行连接读取数据的呢?
CPU通过读取这几个寄存器的信息.
- 控制寄存器:控制IO方向
- 数据寄存器:将什么数据 写入/读取 磁盘
- 地址寄存器:从什么地址写入/读取
- 状态寄存器:是否完成了该任务
1. 磁盘逻辑结构
这一条磁带实际上可以看成一个下标从0开始的数组.其为一个线性的结构.而磁盘每一个盘面可以看成若干个磁带拼接在一起.
其为一个基于扇区的数组.也就是我们可以通过给定一个数组编号,来确定是哪一个扇区.通过扇区确定在哪一个盘面.在哪一个磁道,进而确定在该磁道上的第几个扇区.这是 LBA逻辑地址与HCS地址可以进行互相转换.
2. 文件系统划分
那么操作系统是如何去管理这个文件的呢?
我们通常会将我们的磁盘进行分区.例如将一个800GB的磁盘分为,200GB,300GB,100GB,200GB大小的分区.
WINDOWS下我们是这样分区的,分为磁盘C D E F…
其本质还是一块物理磁盘,仅仅是加了一段描述符规定从哪到哪是属于哪个逻辑磁盘
struct partion{
int start;
int end;
};
partion num[4];
以下我们以200GB为例子,这200GB会被系统分为 若干个BLOCK+一个BOOT BLOCK
而一个BLOCK又被划分为了 SUPER BLOCK,GROUP DESCRIPTOR TABLE,BLOCK BITMAP,INODE BITMAP,INODE TABLE,DATA BLOCKS.
我们利用分治的思想,就将管理一个大磁盘,划分为了如何管理一个小块。
那么每一个区块是什么意思呢?
Inode Table:存储了一个文件的所有属性包括在磁盘的物理地址
此为一个Inode的信息,而InodeTable存储了若干个Inode 注意这里不存储文件名!!
struct Inode{
所有者
所属组
权限
大小
ACM修改之间
在磁盘上的物理地址[15]
};
Inode BitMap:通过Bit位的方法,存储了InodeTable中哪一个位置的Inode没有被使用
Data Blocks:存储了文件内容,在磁盘中存储的最小单位为一个块,一个块的大小通常为4KB,而DataBlocks存储了若干个这样的块
文件是被存储在扇区上,一个扇区可以划分为很多很多个块.所以一个文件可能由多个块来存储.即使一个文件的大小为1KB,为了方便管理,也会分配一个块来存储.
而Inode中存储的磁盘物理地址数组大小通常为15,并不代表一个文件仅能占15个块,当文件刚好占15个块及以下时,这些块的地址会被直接填入该数组当中.当超过时,就会采用两级索引,三级索引的方法.
例如在第13个块当中存储一个不存储数据的块地址,由该块再次进行,映射到真实的物理地址,这是二级索引,
例如在第14个块当中存储一个不存储数据的块地址,由该块再次存储二级索引,再映射到真实物理地址,这是三级索引
Block BitMAP:通过Bit位的方法,存储了Data Blocks中哪一个位置的没有被使用
Group Descriptor Table:记录了整个块中资源数量(总共inode blocks的数量 已使用的inode,blocks数量)
SuperBlocks:记录了整个分区存储的存储规则(有多少个Block group,具体的BlockGroup结构是怎么样的)也存储了整个块中的资源数量,该块不会在每一个Block group中存在,会随机在几个Block Group中存在,防止意外损坏.
所以,我们在使用磁盘之前,一定需要对其进行格式化,选择不同的文件系统,进行预先载入信息.
3. 如何理解文件目录
在Linux下,我们可以通过 ls -i 来查看文件所属的inode.
可以看到,文件目录也有自己的Inode.所以 文件目录也是一个文件!
其内容为该目录下的文件名与Inode的kv结构,所以我们平常使用的是文件名,系统可以为我们找到其对应的Inode,并进行进一步操作.
所以我们就可以理解了:
-
为什么我们没有R权限无法获取当前目录下的文件内容 其本质为无法对data blocks进行读取
-
为什么我们没有w权限无法在当前目录下创建文件 其本质为无法对data blocks进行写入 创建KV结构
-
为什么我们没有x权限无法进入当前目录 其本质为无法执行进入当前目录这一操作
4. 对文件的增删查改
-
新建一个文件时,系统要做什么?
首先在当前目录下创建对应的KV结构,为其文件名分配对应的Inode.
根据Inode来确定存储在哪一个分区,将对应的Inode BitMap置为1,表示该Inode已经被使用
进入InodeTable修改其权限信息,为其分配磁盘块.
进入Block BitMap修改使用情况
进入DataBlock里修改文件内容
-
删除一个文件时,系统要做什么?
存储当前路径,然后从当前目录往根目录进行遍历,然后存储的路径往回遍历,即可拿到该文件的Inode.
根据Inode来确定存储在哪一个分区.
将对应的BitMap置为空即可,不需要手动删除DataBlock里的内容
-
查找一个文件时,系统要做什么?
存储当前路径,然后从当前目录往根目录进行遍历,然后存储的路径往回遍历,即可拿到该文件的Inode.
根据Inode来确定存储在哪一个分区.
-
修改一个文件时,系统要做什么
存储当前路径,然后从当前目录往根目录进行遍历,然后存储的路径往回遍历,即可拿到该文件的Inode.
根据Inode来确定存储在哪一个分区.
依次查找InodeBitMap(确定文件是否存在),InodeTable(访问文件信息),BlocksBitMap(判断文件内容是否存在),DataBlocks(访问文件内容)
5. 软链接与硬链接
5.1 软链接
我们可以使用以下命令来创建软链接
ln -s src target
会创建一个target指向src的软链接.
例如:
我们在当前目录下创建了一个名为hello.txt的文件,其内容为hello.
在创建软连接时,src文件需要带上绝对路径,否则会出现无法访问的错误
执行
ln -s $PWD/hello.txt soft-hello
我们查看一下其inode属性,其inode不同,则为不同的文件
那么我们访问一下这个软连接的内容
其内容一致.那么这是一个对src文件的一个复制嘛?
我们执行一个循环脚本,一直往src也就是hello.txt文件里输入"hello"
while :; do echo "hello" >> hello.txt ; done
等待若干秒后,hello.txt文件里已经有很多字符串,我们来查看下每个文件的大小
这不是拷贝.可以理解为是一个"快捷方式",其文件内容为对应链接文件的路径.每次访问该文件时,实际在通过该文件内容中的路径访问src文件.
5.2.1 软链接应用场景
其应用场景和windows下的快捷方式差不多.
当我们把一个文件的可执行文件藏在很深的路径下时,我们可以在一个方便的地方常见指向这个文件的软链接,让其能够快捷的访问.
例如:
在该路径下有一个myls的可执行程序 我想要在home中可以直接执行.
那么
ln -s $PWD/myls ~/mylsq
此时不需要带上绝对路径即可执行.
5.2 硬链接
我们可以使用以下命令来创建硬链接
ln src target
同样,我们创建一个hello.txt,当中有一段hello
ln hello.txt hard-link
分别打印这两段内容,会发现两段中的内容是一样的.
同样,我们再次执行上面的循环脚本看看会发生什么
两个文件的内容都增加了.
所以,硬链接是对原文件的引用,类似于C++中的&.修改硬链接文件,会导致原文件被修改
权限后面的数字表示当前文件的硬链接数,类似于引用计数.
一个文件夹中的内容为文件名与inode的KV结构.硬链接的本质是多个文件名指向相同的inode
5.2.1 硬连接的应用场景
硬链接的应用场景较为少.
但其可以节省空间,因为其不占用额外的数据块,可以保护特定的数据,仅当该文件inode指向的所有文件被删除了,这个inode才会被删除.
在文件夹中的…与.分别代表的是上级目录,与当前目录.他们都是对目标文件夹创建的硬链接.所以我们可以自由的采用相对路径来访问文件.
当前文件夹下的每个子文件夹都会对其硬链接.
结构.硬链接的本质是多个文件名指向相同的inode
5.2.1 硬连接的应用场景
硬链接的应用场景较为少.
但其可以节省空间,因为其不占用额外的数据块,可以保护特定的数据,仅当该文件inode指向的所有文件被删除了,这个inode才会被删除.
在文件夹中的…与.分别代表的是上级目录,与当前目录.他们都是对目标文件夹创建的硬链接.所以我们可以自由的采用相对路径来访问文件.
[外链图片转存中…(img-anLwkhlV-1701877678457)]
当前文件夹下的每个子文件夹都会对其硬链接.