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