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

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会去根据路径找到目标文件

http://www.xdnf.cn/news/8075.html

相关文章:

  • Linux 玩转nfs
  • DeepSeek Mermaid:如何将文本直接转化为精美图表? -优雅草卓伊凡
  • JavaScript中从原数组中删除某个元素
  • 用对称化与chaining技术bound经验过程上确界的期望(Guntuboyina理论统计学笔记)
  • Python打卡训练营day29-类的装饰器
  • 深入学习和对比Python 列表与元组
  • 测量尺子:多功能测量工具,科技改变生活
  • PP-YOLOE-SOD学习笔记1
  • ThreadLocal线程本地变量在dubbo服务使用时候遇到的一个坑
  • Docker Compose`down`和`stop`命令的区别
  • 【RocketMQ 生产者和消费者】- 生产者启动源码-上报生产者和消费者心跳信息到 broker(3)
  • Modelsim的入门使用和Verilog编写
  • 【电流探头】LOTO电流探头线性度测量
  • Docker-mongodb
  • JavaWeb Web基础
  • 零碳办会新范式!第十届国际贸易发展论坛——生物能源和可持续发展专场,在京举办
  • 前端性能优化方案
  • 亚马逊英国站海关新规深度解读与合规指南
  • 中级统计师-统计学基础知识-第六章 回归分析
  • 快速部起一个Openwhisk平台,使用telego k8s服务部署能力内网部署
  • 中小制造企业网络安全防护指南
  • Linux Docker下安装tomcat
  • Spring3+Vue3项目中的知识点——跨域与解决方案
  • Gartner《如果有效评估Generative AI项目的投资回报》学习心得
  • DeepSeek快速搭建个人网页
  • vue3基本介绍
  • 220V转1.25V-12V输出电路Multisim仿真
  • 【设计模式】责任链+模板+工程模式使用模板
  • indicator-sysmonitor 在Ubuntu 右上角实时显示CPU/MEM/NET的利用率
  • C#对集合进行分组IGroupingout TKey, out TElement>