linux之文件系统(2)

1.块概念

块设备:支持随机访问,能以块大小为单位进行读取/写入。

字符设备:不支持随机访问,只能以字符大小为单位进行读取/写入。

OS与磁盘之间采用的是以"块"为单位交流,一般是4KB(8个扇区大小)

LBA与块号下标之间支持相互转换.

块号 = LBA / 8.

LBA = 块号 * 8 + n(n是块内第几个扇区,也就是支持任意扇区的随机访问).

OS对磁盘扇区的管理就转换为了对"块"的管理(可以说"块"的出现就是为了用于提高效率的)

分区:将整个磁盘分成多个区域且不同区域都用同一种方式进行管理。(也就是如C.D.E盘这种)

2.linux管理磁盘的方式

OS其实将Disk分成哼很多个分区,每一个分区中又有一块区域为给文件系统的空间,一个文件系统的空间又被拆分分成很多个组,一个组中就是用于管理存储文件数据的地方了。

文件内容全部存在Data Blocks这部分区域(图有问题,实际应该是存在其所在的组的前面,也就是夹在两个组的中间独立出来的)

文件属性的数据存在inode table中(磁盘中的数据形式并不是以struct的形式存储的)

(1)linux中任何正常文件都要有自己的属性集合。

从内存的角度上看属性的本质就是一个struct,不同文件的属性内容不同,但底层的属性类型是相同的,这个struct就叫struct inode,也就是说不同文件的属性空间大小是固定的(128字节)。

(2)OS不以盘区大小为单位而以块单位的另一个原因

是耦合度:即如果OS的基本大小与此时的磁盘大小保持一致的话,当磁盘更新是一个扇区的大小改变了,OS也就必须跟着一起更新,因此由OS自己定基本单位为4KB,那么磁盘结构的更新就不会很大程度上影响OS的底层代码。

(3)Inode Table,Block Bitmap,Inode Bitmap,Data Blocks的基本介绍

文件不会作为属性保存在文件的inode中。

磁盘中的一个inode table是一个4KB的数据块,也就是其可以保存32个inode.所以我们读取一个文件时OS会给我们传32个inode,我们选出要用的那些即可。

每一个struct inode中都有一个inode_number成员来区分不同的struct inode.

复制代码
//使用ls -li既可以查看一个文件的编号
[root@VM-0-2-centos lesson]# ls -li
total 256
656331 -rw-r--r-- 1 root root      0 Apr  1 13:54 gal

block bitmap(位图块):记录着一个data block中哪个数据块已经被占用,哪些数据块未被占用(每个bit位的0/1来表示)(并不只有这些数据),同时data blocks有多少个数据块,block bitmap就是有多少个bit位,也就是block bitmap的空间是可以动态变化的。

inode bitmap:用bit位表示inode table中哪些inode被占用,哪些inode未被占用。

删除一个文件的本质:删除一个文件其实只删除了block bitmap和inode bitmap而已,那些数据本身其实并没有被删除,这也就是一个文件删除比下载快很多的原因(删除的操作就是把block bitmap和inode bitmap初始化一下)。

GDT:大体上讲就是管里一个组块中每个成员的开始和结束位置以及每个成员内部具体的使用情况(例:说明inode table的开始,结尾和其空闲的inode).

Super Block:描述整个分区的文件系统信息(详细说明)

file system从另一个角度讲就是所有组的集合,每个组在形式上相同。

super block通过存储inode table和data blocks的大小从而间接得到了block bitmap和inode bitmap的大小,GDT的大小是固定的,最后推出了一个group的大小。根据整个分区的大小就能整个分区中组的个数来间接推导出每个组开始和结束的位置。

因此super block就能帮助文件系统管理所有分区的整体情况。

(4)零碎的知识

(1)格式化本质:将一个文件系统中的所有管理信息统一初始化。

(2)每个组都有一个super block的原因,虽然一个super block就可以管理整个file system,但如果该super block丢失了,会导致整个file system崩溃,因此多个super block的目的就是为了备份多个以便于一个super block出问题时有备份来恢复正常。

(3)在同一个分区内部,inode编号和数据块号都是唯一的,也就是不同分区的inode编号和数据块号可以相同,但不同分区的数据基本不互通。

(4)OS还是要通过先描述,再组织的方式管理磁盘的各个分区,也就是OS还是要把磁盘中的管理信息加载到内存里来操作。

(5)总结

disk有多个分区,每个分区中有一部分为文件系统,一个文件系统中有很多个组(分治的思想),每个组里面就有一个SB,GDT文件体系。

3.具体寻找各成员的方式

inode中存着一个成员int datablocks[N],用于存储该inode对应文件数据块的编号。

通过inode_number找到该inode所在分组和inode bitmap中的存储位置:

每一个组的数据块数量是固定的(设为n),对inode_number/n就可以得到其分组,%就可以得到其位图位置了(用一个数据块编号得到其的位置与位图位置的方式也是一样的)

相关推荐
手打猪大屁1 小时前
使用claude code 接入deepseek-v4pro
linux·windows·ai·deepseek·claude code
爱网络爱Linux1 小时前
华为HCIP——BGP 基础配置
服务器·前端·华为·hcip·hcip datacom·华为数通认证
沧州刺史1 小时前
有域名但是没有带公网IP的服务器,怎么能够让服务通过域名暴露出去?
服务器·网络协议·tcp/ip·cloudflared
心止水j2 小时前
拷贝完虚拟机的操作
linux·运维·服务器
我先去打把游戏先2 小时前
【虚拟机专用】Ubuntu 22.04 LTS 服务器版本镜像下载
linux·服务器·ubuntu
#山间清泉#2 小时前
VMWare虚拟机mac地址自定义配置
运维·macos·架构·vmware
emiya_saber2 小时前
docker标签
运维·docker·容器
菜_小_白2 小时前
高性能线程池
linux·c++·设计模式
微信api接口介绍2 小时前
WTAPI与AI集成:下一代个微自动化解决方案
运维·开发语言·人工智能·微信