目录
理解硬件
看看硬件
- 机械磁盘是计算机中唯⼀的⼀个机械设备。
- 磁盘---外设。
- 慢。
- 容量⼤,价格便宜。
磁盘内部:
服务器:
无需鼠标,键盘,只需要插网卡即可,也就是说主要是通过网络和外界沟通。
机柜:
机房:
磁盘是机械设备,用南北极表示0,1(二进制)。
磁盘物理结构
磁盘的存储结构
讲解:
1.扇区:是磁盘存储数据的基本单位,512字节,块设备。
基本单位意味着,如果OS想修改某个扇区上的数据(哪怕是一个比特位),就必须将这个扇区全部加载到内存中,然后再去修改,最终写回扇区。
2. 3片6面,每面都有一个磁头(它们和传动臂共进退)。
3.那怎么去寻找某一个扇区?
首先先定位磁头,定位到这个扇区在哪个盘面上(也就是找在哪个磁头下),再确定磁头要访问哪一个柱面(也就是磁道)(是传动臂带着磁头定位的),最后确定是在哪块扇区(盘片旋转定位的)。所以说磁头摆动和盘片旋转取决着寻找效率,这就是CHS地址定位。
当然,盘片快速旋转有可能错过!一次读取成功的是企业磁盘(成本更高),多次读取出来是桌面磁盘。
对文件的存储其实就是磁盘中存入一个或多个扇区中。
CHS地址定位
⽂件=内容+属性都是数据,⽆⾮就是占据那⼏个扇区的问题!
- 扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。
- 磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头。
- 磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道...,靠近主轴的同⼼圆⽤于停靠磁 头,不存储数据。
- 柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数。
- 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同。
- 圆盘(platter)数:就是盘⽚的数量。
- 磁盘容量=磁头数× 磁道(柱⾯)数× 每道扇区数× 每扇区字节数
柱⾯(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)⽅ 式之⼀,CHS寻址⽅式。
理解磁盘逻辑
我们知道磁带可以播放音乐,显然里面的"线条"就存储着数据。
磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性结构。
那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻 辑存储结构我们也可以类似于:
这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA。
柱⾯是⼀个逻辑上的概念,其实就是每⼀⾯上,相同半径的磁道逻辑上构成柱⾯。 所以,磁盘物理上分了很多⾯,但是在我们看来,逻辑上,磁盘整体是由“柱⾯”卷起来的。
所以,磁盘的真实情况是:
某⼀盘⾯的某⼀个磁道展开:
即:⼀维数组。
整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:
整盘:
整个磁盘不就是多张⼆维的扇区数组表(三维数组?)
所以,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder),在确定柱⾯内哪⼀个磁道(其实就是磁头位置, Head),在确定扇区(Sector),所以就有了CHS。
我们之前学过C/C++的数组,在我们看来,其实全部都是⼀维数组:
OS只需要使⽤LBA就可以了!! LBA地址转成CHS地址,CHS如何转换成为LBA地址。谁做啊??磁盘 ⾃⼰来做!固件(硬件电路,伺服系统)
CHS&&LBA地址
CHS转成LBA:
- 磁头数*每磁道扇区数=单个柱⾯的扇区总数
- LBA=柱⾯号C*单个柱⾯的扇区总数+磁头号H*每磁道扇区数+扇区号S-1
- 即:LBA=柱⾯号C*(磁头数*每磁道扇区数)+磁头号H*每磁道扇区数+扇区号S-1
- 扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的
- 柱⾯和磁道都是从0开始编号的
- 总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参 数。
LBA转成CHS:
- 柱⾯号C=LBA//(磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】
- 磁头号H=(LBA%(磁头数*每磁道扇区数))//每磁道扇区数
- 扇区号S=(LBA%每磁道扇区数)+1
- "//": 表⽰除取整
所以:从此往后,在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰ 转换。
所以: 从现在开始,磁盘就是⼀个元素为扇区的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤ 磁盘,就可以⽤⼀个数字访问磁盘扇区了。
引⼊⽂件系统
引⼊"块"概念
其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样 效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)。
硬盘的每个分区是被划分为⼀个个的”块”。⼀个”块”的⼤⼩是由格式化的时候确定的,并且不可 以更改,最常⻅的是4KB(存数据也是4KB为单位存的),即连续⼋个扇区组成⼀个”块”。”块”是⽂件存取的最⼩单位。
注意:
- 磁盘就是⼀个三维数组,我们把它看待成为⼀个"⼀维数组",数组下标就是LBA,每个元素都是扇 区
- 每个扇区都有LBA,那么8个扇区⼀个块,每⼀个块的地址我们也能算出来。
- 知道LBA:块号=LBA/8
- 知道块号:LAB=块号*8+n.(n是块内第⼏个扇区)
引⼊"分区"概念
其实磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有⼀块磁盘并且将 它分区成C,D,E盘。那个C,D,E就是分区。分区从实质上说就是对硬盘的⼀种格式化。但是Linux的设备 都是以⽂件形式存在,那是怎么分区的呢?
柱⾯是分区的最⼩单位,我们可以利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起 始柱⾯和结束柱⾯号码。
引⼊"inode"概念
之前我们说过 ⽂件 = 数据 + 属性 ,我们使⽤ls -l 的时候看到的除了看到⽂件名,还能看到⽂件元数据(属性)。
ls-l读取存储在磁盘上的⽂件信息,然后显⽰出来。
其实这个信息除了通过这种⽅式来读取,还有⼀个stat命令能够看到更多信息。
到这我们要思考⼀个问题,⽂件数据都储存在”块”中,那么很显然,我们还必须找到⼀个地⽅储存 ⽂件的元信息(属性信息),⽐如⽂件的创建者、⽂件的创建⽇期、⽂件的⼤⼩等等。这种储存⽂件 元信息的区域就叫做inode,中⽂译名为”索引节点”。
两个问题:
1.我们已经知道硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,读取的基本单位 是”块”。“块”⼜是硬盘的每个分区下的结构,难道“块”是随意的在分区上排布的吗?那要怎 么找到“块”呢?
2.还有就是上⾯提到的存储⽂件属性的inode,⼜是如何放置的呢?
⽂件系统就是为了组织管理这些的!!
inode在内存中形成,将来会将这个结构体对象直接写入磁盘中(以二进制形式写入)。
一个数据块(4KB)可保存32个inode(1个inode128个字节),文件系统和内存交互时,会将32个inode全部导入内存或磁盘。
ext2 ⽂件系统
宏观认识
我们想要在硬盘上储⽂件,必须先把硬盘格 式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。
在 Linux 系统中,最常⻅的是ext2系列的⽂件系统。其早期版本为ext2,后来⼜发展出ext3和ext4。 ext3 和ext4虽然对ext2进⾏了增强,但是其核⼼设计并没有发⽣变化,我们仍是以较⽼的ext2作为 演⽰对象。
注意:文件系统的载体是分区,而不同分区可能使用多套文件系统。
ext2⽂件系统将整个分区划分成若⼲个同样⼤⼩的块组(BlockGroup),如下图所⽰。只要能管理⼀个 分区就能管理所有分区,也就能管理所有磁盘⽂件。
上图中启动块(BootBlock/Sector)的⼤⼩是确定的,为1KB,由PC标准规定,⽤来存储磁盘分区信 息和启动信息,任何⽂件系统都不能修改启动块。启动块之后才是ext2⽂件系统的开始。
ext2⽂件系统会根据分区的⼤⼩划分为数个BlockGroup。⽽每个BlockGroup都有着相同的结构组 成。
下面我们来仔细讲解一下。
块组内部构成
i节点表(InodeTable),Data Block
- 存放⽂件属性如⽂件⼤⼩,所有者,最近修改时间等
- 当前分组所有Inode属性的集合
- inode编号以分区为单位,整体划分,不可跨分区
数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:
- 对于普通⽂件,⽂件的数据存储在数据块中。
- 对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls-l命令 看到的其它信息保存在该⽂件的inode中。
- Block号按照分区划分,不可跨分区
文件的属性存放在inode Table中,文件内容存放在Data Blocks中,也就是说,linux下,文件属性和内容是分开存储的。
inode和数据块,是跨组编号的,但不跨分区,所以,在同一个分区内部,inode编号,和块号都是唯一的。
块位图(BlockBitmap)
- BlockBitmap中记录着DataBlock中哪个数据块已经被占⽤,哪个数据块没有被占⽤
当拷贝几个G的文件时,需要很久,但是删除1s就删除完了,为什么???
拷贝时,需要真实地往Data Blocks中写入,而删除时,只需要将对应块位图的比特位清0即可!
inode位图(InodeBitmap)
- 每个bit表⽰⼀个inode是否空闲可⽤。
超级块(SuperBlock)
存放⽂件系统本⾝的结构信息,描述整个分区的⽂件系统信息。记录的信息主要有:bolck和inode的 总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写 ⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。SuperBlock的信息被破坏,可 以说整个⽂件系统结构就被破坏了。
超级块在每个块组的开头都有⼀份拷⻉(第⼀个块组必须有,后⾯的块组可以没有)。为了保证⽂ 件系统在磁盘部分扇区出现物理问题的情况下还能正常⼯作,就必须保证⽂件系统的superblock信 息在这种情况下也能正常访问。所以⼀个⽂件系统的superblock会在多个blockgroup中进⾏备份, 这些superblock区域的数据保持⼀致。
超级块表示一个分区的整体情况!并不是所有组都有super Block,只有个别组有,其实它作用还有备份作用。
GDT(GroupDescriptorTable)
块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描 述符存储⼀个块组的描述信息,如在这个块组中从哪⾥开始是inodeTable,从哪⾥开始是Data Blocks,空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。
它表示这一组宏观整体表述情况。
问题:在一个分区内部,OS是怎么管理分区的?
先描述,在组织。
OS需要把分区的super Block(它是分区整体描述信息)拷贝到内存中,然后用链表将一个个super Block管理起来,而当我们需要删除某个文件时,一定是将Block Bitmap和inode Bitmap加载到内存中去,然后清空对应文件的比特位,再刷新到磁盘中。
inode和datablock映射(弱化)
- inode内部属性存在一个索引表,是⽤来进⾏inode和block映射的。
- 这样⽂件=内容+属性,就都能找到了。
因为inode大小是固定的,所以需要层层索引,以确保inode大小不足。
请解释:知道inode号的情况下,在指定分区,请解释:对⽂件进⾏增、删、查、改是在 做什么?
- 分区之后的格式化操作,就是对分区进⾏分组,在每个分组中写⼊SB、GDT、Block Bitmap、InodeBitmap等管理信息,这些管理信息统称:⽂件系统
- 只要知道⽂件的inode号,就能在指定分区中确定是哪⼀个分组,进⽽在哪⼀个分组确定 是哪⼀个inode
- 拿到inode⽂件属性和内容就全部都有了
⽬录与⽂件名
问题:
我们访问⽂件,都是⽤的⽂件名,没⽤过inode号啊?⽬录是⽂件吗?如何理解?
⽬录也是⽂件,但是磁盘上没有⽬录的概念,只有⽂件属性+⽂件内容的概念,⽬录的属性不⽤多说,内容保存的是:⽂件名和Inode号的映射关系。
访问⽂件,必须打开当前⽬录,根据⽂件名,获得对应的inode号,然后进⾏⽂件访问。
访问⽂件必须要知道当前⼯作⽬录,本质是必须能打开当前⼯作⽬录⽂件,查看⽬录⽂件的内容。
都要从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问 到你需要访问的文件。这个过程叫做Linux路径解析。
问题1:Linux磁盘中,存在真正的⽬录吗?
答案:不存在,只有⽂件。只保存⽂件属性+⽂件内容
问题2:访问任何⽂件,都要从/⽬录开始进⾏路径解析?
答案:原则上是,但是这样太慢,所以Linux会缓存历史路径结构
问题3:Linux⽬录的概念,怎么产⽣的?
答案:打开的⽂件是⽬录的话,由OS⾃⼰在内存中进⾏路径维护
Linux中,在内核中维护树状路径结构的内核结构体叫做:struct dentry
注意:
- 每个⽂件其实都要有对应的dentry结构,包括普通⽂件。这样所有被打开的⽂件,就可以在内存中 形成整个树形结构
- 整个树形节点也同时会⾪属于LRU(LeastRecentlyUsed,最近最少使⽤)结构中,进⾏节点淘汰
- 整个树形节点也同时会⾪属于Hash,⽅便快速查找
- 更重要的是,这个树形结构,整体构成了Linux的路径缓存结构,打开访问任何⽂件,都在先在这 棵树下根据路径进⾏查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry 结构,缓存新路径
软硬连接
硬链接
真正找到磁盘上⽂件的并不是⽂件名,⽽是inode。其实在linux中可以让多个⽂件名对应 于同⼀个inode。
它是同一文件的多个入口,它并不是独立的文件(因为它没有独立的inode),它是一个新的文件名和目标文件inode number的映射关系,它决定了它和拷贝文件不一样,它们甚至会同步更新,而且它们不像拷贝文件那样消耗内存,所有硬链接共享相同的磁盘数据块,适合需要多个路径访问同一文件但不想占用额外空间的场景。
删除一个硬链接不会影响其他链接指向的文件数据。只有当所有硬链接(包括原始文件名)被删除,且无进程打开文件时,系统才会释放磁盘空间。
原始文件也算一次硬链接次数。
我们在删除⽂件时⼲了两件事情:1.在⽬录中将对应的记录删除,2.将硬连接数-1,如果为0,则 将对应的磁盘释放。
再看:
一个目录下的 . 和 .. 的目录文件本质就是一个硬链接。
所以说一个空目录,它的硬链接引用计数为2。(它本身的目录和它目录下的 . 文件)
软硬接
硬链接是通过inode引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和 被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。
可以看到,硬链接引用数并没有增加!
软链接是一个独立的文件,它有独立的inode number,它保存着目标文件的文件路径,相当于windows下的一个快捷方式。
好了,我们下期见!!!