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启动块和文件系统,文件系统将分区划分成块组,块组中有超级块,块组描述符表,inode bitmap即inode位图,block  bitmap即块位图,还有inode表和 块表,其中超级块和块组描述符表是文件系统的核心结构

2.一个磁盘文件由属性和数据组成,inode保存属性, block保存数据,inode一个128字节,block一个4KB

3.文件系统底层其实就是超级块,组描述符表,inode位图和block位图这些管理文件inode和块的数据结构。

4.超级块和块组描述符表在第一个块组中肯定有,在后面的块组中可能会备份,不是每个块组都有的,是文件系统的核心结构,inode位图和block位图每个块组都有。

5.inode编号和 block编号以分区为单位整体划分,也可以说是以文件系统为单位,所以我们只要知道一个文件的文件系统还有文件的inode号,那么就可以找到文件对应的inode,inode中有数据块指针,就可以找到对应的数据块

6、一个超级块包含一个文件系统的基本属性,例如:

  • ​文件系统类型​​(ext2/ext3/ext4)

  • ​文件系统大小​​(总块数、块大小)

  • ​块组(Block Group)的数量​

  • ​inode 总数及空闲 inode 数量​

  • ​数据块总数及空闲块数量​

  • ​文件系统状态​​(是否干净卸载、是否需要检查)

  • ​挂载时间、最后写入时间​

  • ​日志信息(ext3/ext4)​

7、组描述符表是块​​组描述符数组,对应着一个个块组​,块组描述符存储以下信息:

  • ​块位图(Block Bitmap)的位置​​:记录该块组中哪些数据块已被占用或空闲。

  • ​inode 位图(inode Bitmap)的位置​​:记录该块组中哪些 inode 已被使用。

  • ​inode 表(inode Table)的位置:指向存储 inode 结构的区域。

  • ​块组中空闲数据块和空闲 inode 的数量​​:帮助文件系统快速分配资源,避免遍历整个块组。

inode映射data block

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 file {
    struct path f_path;          // 文件路径(含dentry和挂载点)

};


struct path {
    struct dentry *dentry;       // 目录项(指向管道文件的dentry)
};

struct dentry {
    struct inode *d_inode;          // 内核级 inode,可不是磁盘级的那个inode
    struct dentry *d_parent;        // 父目录的 dentry

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


    struct qstr d_name;             // 文件名,在struct dentry里、在目录的数据块里,就是不在磁盘inode里
    struct super_block *d_sb;       // 内核级超级块(文件系统全局信息),可不是磁盘级的那个超级块


};

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

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

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

挂载操作

访问磁盘文件光有inode号还不够,还得先知道是哪个分区

操作系统要访问分区,首先要创建一个目录,然后分区挂载到这个目录,这样我们对目录的操作都会由操作系统变成对分区的操作

软硬连接

硬链接

ln link file可以给file创建一个硬链接,底层就是创建一个特殊文件link,这个特殊文件也有对应内核级数据结构struct file、struct dentry那些,dentry里文件名设为link,struct inode与file共享,硬连接数++,并且父目录要添加link的文件名与inode号映射在其磁盘的datablock中

软连接

ln -s link file给file创建一个软连接link,底层是创建了一个磁盘文件,link有自己的磁盘级inode和datablock,数据块里是file文件路径,link的父目录的datablock里也添加link文件名inode号映射。在内核里会有link的struct file结构,有自己的内核数据结构struct inode。struct inode里不但有inode号,实际上还有文件的操作集 struct inode_operations,不同文件会有不同的操作集,这个实际上是用来初始化struct file里的struct file_operations 的,通过不同的操作集,就可以实现操作link如同操作file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值