目录
一.文件系统
1.文件在磁盘上的存储方式
a.盘面、磁道和扇区
b.分区和分组
2.有关Block group相关字段详解
a.inode编号
b.inode Table(节点表)
c.Data blocks(数据区)
d.小结
二.软硬链接
1.软链接
a.软链接的创建
b.为什么要有软链接?
2.硬链接
a.硬链接的创建
b.硬链接是什么??
c.硬链接的应用场景
一.文件系统
在我们的电脑里,文件按照是否被进程打开可以分成两类:① 已加载到内存的文件;② 保存在磁盘中的文件。
我们知道,操作系统是计算机软硬件资源的管理者,而文件也是资源的一种,所以,操作系统需要对文件进行管理。上一篇博客中,博主主要讲解的是操作系统对第一类文件(加载到内存的文件)的管理;而本篇文章,博主会详解操作系统是如何管理保存在磁盘上的文件的!!
所以,什么是文件系统?--- 操作系统对没被打开的文件也要进行管理(增删查改),其管理的核心工作就是能够快速定位某一文件,这就需要我们有文件的路径,对这些没有被打开的文件进行管理的过程,称为文件系统。
而在学习操作系统对文件(磁盘文件)的管理之前,我们需要了解一个前置知识,即文件在磁盘上的存储方式!!
1.文件在磁盘上的存储方式
在了解文件在磁盘上的存储方式之前,我们可以了解一下磁盘的结构,虽然这涉及到磁盘的物理结构,较为枯燥,但这样可以帮助我们快速理解磁盘上数据存储的底层原理~~
a.盘面、磁道和扇区
盘面 --- 二进制数据都是直接存储在磁盘的盘面上,盘面会告诉转动,我们可以通过磁头读取盘面上的数据,磁盘上会有多个盘面,它们在我们人类的视角中是层状结构;但在计算机的逻辑中,所有的盘面都是线性的(连续的)。
磁道 --- 一个盘面上会有多个同心圆环,它们叫做磁道,是磁盘数据存储的次级单位(相较于盘面),磁头通过上下摆动来读取磁道中的数据,而且,在计算机的视角中,同一个盘面上的所有磁道都是线性的(连续的)。
扇区 --- 一个磁道上会存在多个扇区,扇区是磁盘数据存储的再次级单位(相较于磁道),由于盘面会告诉旋转,所以,即使磁头保持静止,也可以读取扇区中的连续数据,同理,在计算机的视角中,所有的扇区都是线性的(连续的)。
将磁盘的物理结构,抽象成计算机眼中的线性数组结构,这一过程,就是对磁盘理解的建模!!
b.分区和分组
有了分区和分组的概念,操作系统对磁盘上数据(文件)的管理,就变成了对某个 Block group 的管理,所以,我们接下来要学习的就是 Block group 中的各属性字段啦~~
2.有关Block group相关字段详解
格式化:每一个分区或分组在被使用之前,都必须先将这部分文件系统的属性信息写到对应分区或分组的Super block中,方便我们后续管理这个分区或分组!
a.inode编号
一般情况下,每个文件都要有独属自己的inode编号,inode编号在整个分区具有唯一性,Linux内核中,识别文件和文件名无关,只和inode编号有关。
ls -li (Linux系统中,查看文件的inode编号)
b.inode Table(节点表)
存放文件属性数据,如:文件大小、文件的所有者、文件最近修改时间等.
inode Table 内有多个inode结构体,而一个inode结构体如下:
struct inode{
大小、权限、拥有者、所属组、ACM时间、inode编号 ... 等属性数据
int blocks[N]; 存放文件内容数据的所有空间块的编号
};
c.Data blocks(数据区)
数据区就是一块较大的地址空间,该地址空间以一个个地址块为结构单元,每个地址块的大小一般都是4KB,并且每个地址块都有自己的编号,而已被使用了的编号会被保存在inode中的bitmap中和blocks[]数组里。
问:我们怎么知道inode表中有哪些结点已经被使用,哪些没被使用呢?
答:通过 inode Bitmap(位图),bit位的大小表示inode编号,bit位的内容(1/0)表示该inode编号是否存在。
同样的:
Block Bitmap(块位图):bit位的大小表示地址块的编号,bit位的内容(1/0)表示该地址块是否被使用。
所以,文件的删除只需要修改inode Bitmap 与 Block Bitmap这两个位图即可!!
d.小结
通过文件的inode编号 ——> 通过innode bitmap判断该innode是否存在,若存在 ——> 遍历inode table,找到对应的inode结构体——>找到文件的所有属性数据和内容数据(blocks数组)
创建一个文件,计算机的底层都做了哪些事?
一个文件的创建,首先要根据文件的cwd(当前工作目录)确定该文件在哪个分区和分组,然后再查 inode Bitmap,以由低到高的顺序找一个没被使用的bit位,先将该bit位置成1,然后将其换算成inode编号,并通过inode编号在inode Table中创建该inode结点,同时将文件的属性数据写入该inode结点中。接着,在Block Bitmap中找一个或多个没被使用的bit位,并将bit位的值写入inode结点中的blocks[]数组中,然后便可以将我们要写的内容写入数据区中的块地址内。
FILE* pf = fopen("./log.txt","r"); 执行这句代码时,操作系统底层做了些什么??
--- 是由进程打开了文件,通过进程的CWD(当前工作目录)找到log.txt的当前目录(确定文件在磁盘上的某个分区内),在当前目录的数据区内找到文件名和inode的映射关系,找到log.txt的inode编号,将inode内的log.txt文件属性数据加载到内存,在内存里面构建struct file结构体,并将log.txt文件的属性数据填充到struct file里面。同时,通过inode还可以找到log.txt的数据区,将数据区加载到内存构成文件缓冲区!最终将缓冲区里的数据拷贝到应用层,给用户读!
目录的本质也是一个文件,而文件=内容+属性,目录的属性我们知道,那么目录的“内容”是什么??--- 内容就是,该目录下,各文件名和文件inode的映射关系!!
注意:如果我们想要知道文件对应的inode,就要从该文件所在的目录内容中去查找,而想要查看目录的内容,就得先找到目录的innode编号,这就又得去目录的父目录的内容中去找,层层向上,直到根目录!!!
所以我们可以得知:
①为什么同一个目录下不能存在同名文件(因为文件名需要与innode编号构成映射关系).
②目录下,没有"写w"权限,我们就无法在该目录下创建文件(因为目录的内容,就是该目录下的子文件).
③目录下,没有“读r”权限,我们就无法查看文件(理由同上).
④目录下,没有“进入x”权限,我们就无法进入这个目录.
二.软硬链接
1.软链接
a.软链接的创建
ln -s log log.soft.link 表示:为log文件创建一个软链接,并将其命名为 log.soft.link
ls -li (查看文件属性,包括“硬链接数”)
软链接是一个独立的文件,而硬链接不是!!
b.为什么要有软链接?
示例:
即,软链接相当于是给可执行程序创建了一个快捷方式,让我们可以便捷的运行某一程序,它并不影响原文件的“引用计数”,软链接的内容是指向的目标文件的路径!!
通过软链接,我们可以快速找到某个文件,而无需该文件所在的目录,这就是软链接存在的最大价值!
可以用unlink解除软链接,如:unlink log.soft.link
2.硬链接
a.硬链接的创建
ln text text.hard.link 表示:为log文件创建一个硬链接,并将其命名为 log.hard.link
b.硬链接是什么??
---本质就是指定目录内的一组文件名和inode的映射关系!!
c.硬链接的应用场景
在Linux系统中,我们是从一个目录返回到上层目录(cd .. )的底层原理是什么呢?
我们知道,一个目录一定会有两个隐藏文件,即 '.' 和 '..',它们分别表示当前目录和上级目录,当前目录的存在使我们可以用相对路径的方式访问某一文件,上级目录的存在可以使我们回到上级目录,'.' 和 '..' 的本质其实就是当前目录和上级目录的一份硬链接。
所以,硬链接通常用于目录间的切换!!
注意:Linux系统不允许对目录建立“硬链接”---因为目录中若存在硬链接,那么可能会使某一文件路径形成环路!!