磁盘文件系统
- 一、磁盘结构
- 1.1 认识一下基础的硬件设备以及真实的机房环境
- 1.2 磁盘物理结构与存储结构
- 1、磁盘物理结构
- 2、磁盘的存储结构
- 3、CHS地址定位
- 4、磁盘的逻辑结构(LBA)
- 5 磁盘真实过程
- 5 CHS && LBA地址
- 二、理解分区、格式化
- 1 引⼊"块"概念
- 2 引⼊"分区"概念
- 三、学习Ext*系列文件系统(inode号与inode)
- 四、理解系统中的文件、目录
- inode与block如何映射?
- 相关问题
- 凭什么拿到inode?我们在系统层面访问的好像都是文件名啊???
- 再次理解文件名
- 你怎么确定自己在哪一个分区?
- 五、深刻理解软硬链接
- 5.1 软链接
- 5.2 硬链接
- 5.3 理解软硬链接
- 5.4 软硬链接的使用场景
1、文件可以分为打开的文件和没有被打开的文件,之前我们谈的进程中的文件就是打开的文件,这一节的内容我们要讲的就是没有被打开的文件
2、首先我们需要明白对于所有的文件,其实没有被打开的文件占大多数,所以对没有被打开的文件的管理是非常重要的,其次我们需要知道打开的文件是被加载到内存的,那没有被打开的文件在哪里?—很显然就是磁盘
3、磁盘上的文件被打开的前提是什么?当然是需要找到这个文件的位置,也就是路径,当然每一个文件都有自己的路径,操作系统对每一个文件的路径,属性等的管理就叫做磁盘级文件系统,严格意义上文件系统分内存级、磁盘级两种。
4、文件系统类似于我们生活中的菜鸟驿站,每一个快递都有自己的货柜号(例如,12-3-1012),驿站通过一系列方式管理我们的快递,驿站我们可以简单理解为快递系统,管理文件的系统我们称为文件系统,它们的管理方式类似,(12-3-1012)就类似于快递路径,文件的路径也是类似的路径,快递系统的工作就是增加快递,取走快递,遗失快递等进行管理,文件系统也是如此。
5、这一节的目的就是
(1)文件系统是怎样管理未打开文件的?
(2)路径怎么理解—(定位文件)
一、磁盘结构
1.1 认识一下基础的硬件设备以及真实的机房环境
(1)磁盘(机械磁盘------便宜、但是容量大)-----唯一的机械设备
上图打开圆盘后如下图
我们所有的数据都被保存在图二中的盘片上的,盘片上有一个探头,叫做磁头
(2)服务器
没有键盘没有显示器,服务器上的许多空格就是存放磁盘的地方,如图中的服务器就有24个盘
(3)服务器机柜(里面存放服务器)
(4)机房(存放许多服务器机柜)
(5)我们一直畅谈二进制,那磁盘上的二进制我们该如何理解?
我们生活中磁铁是很常见的吧,磁铁分为N,S极,磁盘我们可以理解为上面有无数个小磁铁,我们可以规定(N为1,S为0),向磁盘中写入数据,其实就是更改某个小磁铁的N/S极,当我们需要销毁磁盘时,我们不能直接销毁,比如我们将所有文件全部删除,但是后面我们会学习到磁盘中的文件是可以恢复的,特别容易造成信息泄露,最好的方式是火烧消磁。
1.2 磁盘物理结构与存储结构
1、磁盘物理结构
2、磁盘的存储结构
磁片每一面都有磁头
3、CHS地址定位
扇区:是磁盘存储数据的基本单位,512字节,块设备
磁头摆动的本质:定位磁道或者(柱面)
磁盘盘片旋转的本质:定位扇区
所以通过磁盘盘片的旋转再加上磁头左右的摆动,就可以在任意磁盘面、任意扇区上读写存取数据
如何定位⼀个扇区呢?
• 可以先定位磁头(header)
• 确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
• 定位⼀个扇区(sector)
上面这种定位扇区的方法我们可以叫做CHS地址定位法
• CHS地址定位
⽂件 = 内容+属性 都是数据,⽆⾮就是占据那⼏个扇区的问题!能定位⼀个扇区了,能不能定位多个扇
区呢?当然是可以的
知识点:
• 扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。
• 磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头
• 磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道…,靠近主轴的同⼼圆⽤于停靠磁
头,不存储数据
• 柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数
• 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
• 圆盘(platter)数:就是盘⽚的数量
• 磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数
• 细节:传动臂上的磁头是共进退的(这点⽐较重要,后⾯会说明)
4、磁盘的逻辑结构(LBA)
CHS地址定位是磁盘真实的地址操作方法,但设计师设计了一种更简便的方法,下面我们来学习。
这个东西大家应该见过,里面黑色的带子叫做磁带,磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性结构
那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻
辑存储结构我们也可以类似于:
这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA
通过这种方式我们可以将磁盘抽象为一个特别大的线性数组,但是真正访问磁盘还是CHS方式,所以我们需要将LBA<—>CHS
转化
5 磁盘真实过程
上面我们说了传动臂上的磁头是共进退的,但没有解释原因,下面就给大家简单回答一下:
根据上面的理解我们或许会认为磁盘是一片一片的,但那只能是初步理解,真实的磁片其实是一圈一圈的,每一圈被称为一个柱面
磁道:
某⼀盘⾯的某⼀个磁道展开:
即:⼀维数组
柱⾯:
整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:
• 柱⾯上的每个磁道,扇区个数是⼀样的
• 这不就是⼆维数组吗
整盘:
整个磁盘不就是多张⼆维的扇区数组表(三维数组?)
所有,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder) ,在确定柱⾯内哪⼀个磁道(其实就是磁头位置,
Head),在确定扇区(Sector),所以就有了CHS,CHS的顺序就是查找扇区的顺序。
我们之前学过C/C++的数组,在我们看来,其实全部都是⼀维数组:(二维数组本质也是一维数组)
所以,每⼀个扇区都有⼀个下标,我们叫做LBA(Logical Block Address)地址,其实就是线性地址。所以
怎么计算得到这个LBA地址呢?
OS只需要使⽤LBA就可以了!!LBA地址转成CHS地址,CHS如何转换成为LBA地址。谁做啊??磁盘
⾃⼰来做!固件(硬件电路,伺服系统)
对于操作系统只需要LBA地址,但是对于磁盘来说CHS还是必须要的,所以我们需要两者进行转化.
5 CHS && LBA地址
二、理解分区、格式化
1 引⼊"块"概念
OS与磁盘进行IO的时候,以扇区为基本单位,512字节,但是这是不是有点少啊,所以操作系统选择以1k、2k、4k、8k等单位来IO的,大多数情况下操作系统以4k(8个扇区)为一个基本IO单位,我们称这样4k的区域叫做块
• 知道LBA:块号 = LBA/8
• 知道块号:LAB=块号*8 + n. (n是块内第⼏个扇区)
2 引⼊"分区"概念
学习这一部分之前我们先引入一个问题OS如何管理1000G、5000G、甚至50T的磁盘空间?
当操作系统要管理这么大的空间,成本非常的高,对于文件系统管理难度也是非常的高,那真实是如何管理的?
这种管理方式类似于我们现实生活中的省、市、县的划分,一个国家要一次性全部管理确实有难度,但我们分成市、县,我们只需要管理好一个市、县,其他市县也按这种方式管理,就轻松很多,操作系统也类似。
磁盘要管理其实首先应该划分区域(分区:c盘、d盘),分区与分区之前是可以使用不同的文件系统,这样一个分区挂掉,不至于整个磁盘出问题
光是分区还不够,操作系统又将一个分区分为不同的组,这样管理好每一个组就等同于管理好一个区,管理好每一个区就等同于管理好整个磁盘空间,这种管理方式我们称为分治
所以现在我们只需要学习管理每一个组:
我们在Ext*文件系统中来学习分区
三、学习Ext*系列文件系统(inode号与inode)
补充知识:
文件==内容+属性(也是数据)属性会以结构体的方式构建出来----inode
因此一个文件一个inode(一个文件的属性集,128字节)互不重复
一个块就(有4k/128字节)个inode
由于磁盘上的文件非常的多,为了存储大量的inode所以我们需要一个inode table
当然磁盘更重要的还是储存文件内容,所以磁盘还有数据块,数据块中每一个小块都是4kb
所以linux下文件属性与文件内容分开存储。其中inode与数据块存在着映射关系,所以找到inode就找到了存储数据的数据块
一、inode bitmap类似于位图,通过二进制位的值来查看此处有没有inode存在,但是现在问题来了,我们上面说过磁盘是以块为单位来存储的,最小的访问单位是扇区,磁盘与文件系统最小IO单位是4kb,我们根本就不能直接操作一个bit位,那我们该如何理解呢?
1、inode table也是以4kb(块)为单位的方式存储的
2、磁盘上的所有数据要修改都要读到内存中(哪怕修改一个bit位都会读到内存在操作,最后写回)
根据我们上面的学习其实我们就可以简单来谈一下新建一个文件在磁盘上的过程:
1、分配一个inode(在inode bitmap中查找一个未被分配的位置),然后再向inode写入文件属性,例如时间,大小等
2、在block bitmap里申请一个块,再向该块写入文件内容
3、最后在inode table中写入inode号
所以我们找到inode编号就可以找到文件了。
二、删除文件的理解:
删除一个文件根本不需要删除属性inode,和存储内容的块做清空,删一个文件只需要在inode bitmap 和 block bitmap里把bit位由1->0 ,所以删除一个文件可以恢复,所以只需要找到原本inode编号然后在inode bitmap和block bitmap里对应位置的bit位由0->1就恢复了,删除本质就是inode, block无效
三、GDT:块组描述符
描述当前区一共有多少inode,还剩多少inode,还剩多少block等等
四、super block:
我们的一个分区一共分了多少组?一个组的开始扇区,开始块号,结束块号,一共有多少个inode,多少个块?。。。。。。
我们都需要知道,super block会把这些东西都记录下来,所以super block表示对整个分区管理的数据结构,超级块就表示文件系统。并不是一个分区一个super block,但也不是一个所有组都有super block,拥有super block的组是混杂在所有组之间的,并且所有的super block的内容完全一致,为什么?因为一个分区如果只有一个super block的话,一旦这个superblock挂掉后果太严重了,整个文件系统就等同于挂掉了,所以为了防止这种情况出现,会有多份
文件系统以分区为单位,每一个分区可以设置不同的文件系统
五、boot block:
在所有分组之前,它与磁盘启动有关,这里我们不做了解,自己下来了解
文件名不在inode中,下面讲解原因
格式化:向一个分区中写入操作系统(将bit map,block map清空等)
四、理解系统中的文件、目录
1、在一个分区中,每一个组的inode号的个数,block个数都是固定的,所以inode号个数等在整个文件系统中都是固定的,那有没有inode用完了,block没用完?这种情况是有可能的,这种情况其实很简单就直接使用其他分区即可
2、关于inode
(1)inode以分区为单位,一套inode
(2)inode分配时,只需要确定每个组起始inode即可,所以每个组inode都是固定的,起始inode存于GDT里面
3、关于块
(1)块号也是统一分配的
(2)所以对于每一个组我们也只需记录起始块号就可以了,这个记录与GDT中
4、所以对于一个具体的组,我们是如何分配inode?
每一个组都有各自的inode bitmap,我们用当前bitmap的值加上组起始inode,这个就是当前inode,再存于inode table
5、如何分配块号的呢?
与上面相同-- start-block+block bitmap即可,之前我们知道inode与块会存在映射关系(允许跨组),这两者都是全局建立的,这允许我们跨组保存文件,故此允许我们大文件创建。
文件管理就是管理SB&&GDT
上面inode查找啊,分配inode啊全部都是内存级操作。
所以为了对应磁盘最小存储单位为块,其实内存也被划分为4k的块
如果我们知道inode如何增删查改文件?
对于上面的四个操作,我认为只需要知道增和查,其他两个操作就很简单来了,增上面已经谈过,找其实也就是将当前的inode号与每一个组中的其实inode对比,找所属组,然后再用当前inode-起始inode就找到了其在当前组中的inode bitmap,然后在找到inode table,其他就知道了。
inode与block如何映射?
(1)一个inode映射有15个位置,前12个直接映射,也就是一个指针对应一个块
(2)一级间接指针它不存文件数据,存其他块号(4MB–4k*1024)
(3)二级间接指针,存其他索引的块号 (4GB)
(4)三级间接指针同理
相关问题
凭什么拿到inode?我们在系统层面访问的好像都是文件名啊???
上面我们说过文件名不在inode中,那它到底存于哪里?
首先我们由一个问题引入,我们上面一直都谈论的是普通文件,但是我们知道还有一种文件叫做目录啊?对于目录也需要inode与data block,目录的内容也要有对应的目录块(存文件名—inode的映射关系、互为映射)
所以我们来重新谈一下文件属性(rwx)
无r:无法读取目录的data block,拿不到inode
无w:无法将inode与文件映射关系写到数据块里
无x:打不开
再次理解文件名
我们要操作文件需要找到文件名,首先要打开当前目录,然后需要找到当前目录的inode编号,但是当前inode编号也是由目录inode存着的,也有文件名(/,根目录的inode是固定写死的)
所以为什么每一个进程都有CWD就是因为我们要访问一个文件必须要找到完整的路径
为了防止操作系统进行大量重复的路径操作,linux需要对路径进行缓存,linux以多叉树的形式进行缓存我们的操作路径(内存级)----dentry
其中不光目录有自己的dentry,其实普通文件也有自己的dentry
你怎么确定自己在哪一个分区?
多个分区,都会有自己的根目录,其必须包含10个普通的目录,在分区被分好之后,linux默认该分区无法使用(除了 / )
分区必须通过挂载,分区才能以路径方式进行访问。
ls /dev/vda* 查看分区
df -h 查看磁盘详细情况
路径的前缀就表示着自己在哪一个分区。
五、深刻理解软硬链接
5.1 软链接
1、命令:ln -s file.txt file-soft.link
软链接本质上是独立的新建文件(在用户层,软链接的文件与原本文件具有相同的效应),我们可以将其理解为win上的快捷方式
5.2 硬链接
硬链接本质不是独立文件
5.3 理解软硬链接
1、软链接有独立的inode,软链接内容上保存的是目标文件的路径(win下的快捷方式)
2、硬链接不是独立文件,无独立inode,本质上是文件名和以及存在的文件的映射关系
3、硬链接权限后面的数字叫做inode的引用计数(硬链接数)
5.4 软硬链接的使用场景
1、软(目录也可以建立软链接):
让我们的程序不带 ./ 就能使用前面已经介绍过很多方法了,这里介绍一种–建立软链接在user/bin目录下
删除软链接
2、硬链接
现在我们创建了一个目录和一个文件,默认文件硬链接数是1,这个没什么问题,但是目录默认却是2,并且我们在该目录下又建一个目录,链接数又变成3了?
我们之前不是学过隐藏文件. 和 … ,之前我们只知道 . 代表自己,但我们不知道为什么,今天就可以给大家解释了 . 其实就是对自己的一个硬链接,所以目录默认为2,新建目录为什么变为3? 是因为dir目录中还有一个 … ,它也指向该目录
需要注意的是 根目录下的 … 是被特殊处理的,并不是指向自己.
硬链接也可以用作硬链接,当我们删除时只删除的一个引用计数,只要不完全清空,就可以使用文件。
linux中,不允许对目录新建硬链接(可能会出现环状链接)