定位磁盘中的扇区的两种地址
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



4233

被折叠的 条评论
为什么被折叠?



