当前位置: 首页 > news >正文

ext2文件系统详讲

磁盘是由许多个扇区组成的,如何定位一个扇区?

1.CHS地址

C:cylinder,确定一个柱面

H:   header, 确定一个磁头,也就是磁道

S:   sector,  确定扇区

凭借(c,h,s)就可以定位一个扇区

2.LBA地址

LBA地址又叫做逻辑块地址,这样理解:

一个柱面看成一个扇区的二维数组,假设从编号是1~100,那下一个柱面同理,编号101~200.......

这样磁盘就变成了一个扇区的一维数组,编号就是LBA地址

块的概念

一个扇区太小,一般512字节,于是我们将8个扇区作为一个整体,称为块,大小4KB

这样,磁盘这个一维扇区数组就可以看作是一维块数组

分区概念

我们将磁盘分成多个分区,每个分区以柱面为单位,由多个柱面组成

磁盘级inode概念

inode保存的是文件的元数据,也就是属性

1.inode中没有文件名这个属性

2.inode大小一般是128字节

命令行如何查看文件属性

1. ls -l file

2.stat file

ext2文件系统

1.磁盘被分成了几个分区,分区被分成了boot block启动块和多个块组,块组被分成超级块,组描述符表,inodebitmap,blockbitmap,还有inode表和data block数据块

2.一个文件由属性和数据组成,inode保存属性,block保存数据

3.文件系统其实就是超级块,组描述符表,两个位图,其实就是管理文件的格式化数据

4.超级块第一个块组必须有,其他块组可有可没有

5.inode编号和block编号以分区为单位整体划分

inode映射datablock

inode里面有一个指针数组,一共有15个指针,说是指针,其实就是block号

前12个是直接映射,也就是48KB

第13个是二级指针,指向的datablock里全是指针,于是有4KB/4B=1024个指针,则有1024*4KB=4MB

第14个指针是三级指针,共有1024*1024个指针,4GB空间

第15个指针是四级指针,有1024*1024*1024个指针,4TB空间

inode可以映射datablock,所以我们只要确定一个文件的分区和inode,就可以在磁盘上找到这个文件

目录的文件内容

目录的datablock里保存的是该目录下的文件名和对应的inode号的映射

路径解析

操作系统必须有文件的inode号才能访问磁盘里的文件,我们怎么得到文件对应inode号呢?

根目录的文件名和inode号都是固定的,无需查找

通过文件的绝对路径,我们可以从/根目录开始,去磁盘查目录的datablock,找路径里下个目录的inode,然后重复,直到拿到文件inode。

通过路径不断去磁盘查下一级文件inode直到拿到目标文件inode,这就是路径解析

路径缓存

每次拿文件的inode都要从根目录开始不断访问磁盘,路径有多少级就要访问几次磁盘,这效率也忒低了,所以操作系统会自己维护一个多叉树结构,每个节点是struct dentry,用这个树来快速通过路径得到文件inode

struct dentry {
    struct inode *d_inode;          // 关联的 inode
    struct dentry *d_parent;        // 父目录的 dentry
    struct qstr d_name;             // 文件名
    struct super_block *d_sb;       // 所属超级块(文件系统全局信息)

    struct list_head d_subdirs; // 子目录dentry链表        
};

struct inode {
    unsigned long    i_ino;         // inode 编号
    // ... 其他字段
};

操作系统查找文件inode号会先去dentry树中查找,找到对应dentry后,去struct inode里得到inode编号

如果找不到对应dentry则会通过路径去磁盘中查每一级目录的datablock,得到下一级目录的inode,直到得到目标文件的inode,并且还会创建对应文件的dentry结构加入进多叉树

实际上访问磁盘里的文件光有inode还不够,还得知道是哪个分区,怎么得到分区呀?

分区需要挂载到目录才能使⽤,所以,可以根据⽬标⽂件的路径中前缀目录准确判断在哪⼀个分区

软硬连接

硬链接

ln link file可以给file创建一个硬链接link,底层就是创建新dentry,dentry里文件名设为link,struct inode与file共享,硬连接数++,并且父目录要添加link的文件名与inode号映射

软连接

ln -s link file给file创建一个软连接link,底层是在磁盘里创建新文件,link有自己的inode和datablock,数据块里是目标文件路径,父目录里也添加link文件名inode号映射。在内核里会有link的dentry结构,有自己的内核数据结构struct inode,调用link会去根据路径找到目标文件

相关文章:

  • HashMap的hash方法是如何实现的
  • Vue 3.0中自定义指令
  • 【Python socket模块深度解析】网络通信的核心工具
  • 使用pm2 部署react+nextjs项目到服务器
  • 【IC_Design】跨时钟域的寄存器更新后锁存
  • RK3588 RGA 测试
  • 解决leetcode第3548题.等和矩阵分割II
  • 推测解码算法在 MTT GPU 的应用实践
  • C++23 容器推导指引中对于分配器的非推导语境(P1518R2)
  • MCP协议:AI时代的“万能插座”,如何重塑互联网技术生态?
  • 【1004. 最大连续1的个数 III】
  • Redis进阶之高可用
  • 操作系统学习笔记第1章 操作系统概述(灰灰题库
  • SAR ADC 的常见架构
  • Spring Task
  • 结课作业自选01. 内核空间 MPU6050 体感鼠标驱动程序(二)(完整实现流程)
  • 服务器硬盘分类
  • 服务器磁盘按阵列划分为哪几类
  • 【Vue】将响应式对象转为非响应式对象
  • (37)服务器增加ipv6配置方法
  • 景区网站建设原则/百度号码认证申诉平台
  • 做平台的网站有哪些内容/故事型软文广告
  • 网站建设视频教程bt/海门网站建设
  • 厦门网站建站/科技网站建设公司
  • 无锡企业如何建网站/长沙免费网站建站模板
  • 手机网站关键/2023年12月疫情又开始了吗