Linux内核级文件系统分析——文件系统入门内核级文章! bit::Shadow✧(≖ ◡ ≖✿目录物理机械磁盘主体部分抽象图示磁盘LBALogical Block Addressing定址法柱面CHS定址法CHS-LBA*文件Access Modify Change内核Linux文件属性内容分析属性内容☆☆☆内核中文件管理整体的分治管理链路核心关系Super BlockGDTGroup Descriptor Table块组描述符表块组内部元素*文件名在哪链接软链接悬空链接⚠️ 恢复前最重要的第一原则硬链接为什么不能对目录建立硬链接呢“ . ”的引用计数为什么是2gitee物理机械磁盘目标探寻物理磁盘内数据的组织方式。硬盘读取是如何实现的尽量高效读取主体部分抽象图示传动臂统一控制多个磁头臂磁盘磁盘上以“同心圆”的形式组织数据每个同心圆称为磁道磁道常被分作8分份每份称为一个“扇面”。在读/写磁盘数据时磁头精准定位于高速旋转的(每秒120转左右)磁盘特定磁道的特定扇面通过识别扇面上凸起的类型来读写信息。LBALogical Block Addressing定址法柱面柱面扇区组成类似于“数组”的区块结构从而据此来实现初步定址法“CHS定址法”。CHS定址法例1号柱面Cylind、2号磁头header及3号扇区Sector通过三者编号-构成“CHS定址法”。CHS-LBA原理“分治思想”将大块数据逐步划分渐渐缩小。OS操作系统访问磁盘不以扇区为单位而是以“块”为单位一般是4KB的。此“块”是独立于磁盘的扇区等的是操作系统自定义大小的规划结果。文件属性查询指令stat*文件Access Modify Changestat [文件名]Access读取文件内容less cat headModify修改文件内容cat vimChange文件属性改变chmod chown mv注意随Modify数据改变Change对应数据也通常会改变。像文件大小修改时间等元数据改变。内核Linux文件属性内容分析文件 文件内容文件属性。属性组织形式——struct inode{ // ………… }struct inode { //type //size //pri //………… int inode_number; // inode编号-文件/目录的身份证号 }inode查询方式ls -i # i 是Linux下文件/目录的inode查询选项。内容多级指针管理Data Blocks来扩展内容存储量指针类型指向内容直接指针数据块12*4KB 48KB一级指针指向存有直接指针的块256*4KB 1MB二级指针指向存在一级指针的块256*1MB 256MB三级指针指向存在二级指针的块256*256MB 64GB☆☆☆内核中文件管理整体的分治管理链路分治的目的将大块数据逐步划分为更小的内存块。Super Block就是作为“更小的内存块”存在核心关系Super Block功能作为文件系统的身份证类似于一本书的总目录/版权页记录文件系统的全局信息块大小、总块数、空闲块数、inode总数、空闲inode数、每块组包含的块数等。内核挂载文件系统时首先读取它。位于Block Group内但不一定可以存储全部的Block Group的目标特定信息只有一份。有备份GDTGroup Descriptor Table块组描述符表功能基于文件系统把磁盘分成若干块组Block Group分块信息就存储于GDT中。记录该块组中四个关键结构的起始块号inode Bitmap、Data Block Bitmap等以及数据块区域的起始位置。Super Block描述整体有多大GDT描述“每组东西的分配位置”。块组内部元素Ⅰ• inode Bitmap 一个位图每位对应一个inode槽1 已分配0 空闲。创建文件时内核扫描它找一个空位。Ⅱ• Data Block Bitmap同理每位对应一个数据块管理数据块的占用状态。Ⅲ• inode Table一张固定大小的表每行是一个inode存储文件的元数据权限、大小、时间戳、uid/gid以及若干块指针直接指针*12一/二/三级间接指针。Ⅳ• Data Blocks存放真实内容。对普通文件是字节流对目录文件是文件名-inode号的映射表对应间接指针是下一级块号的列表。☆☆☆查找一个文件的完整路径就是Super Block确认块大小--GDT找到对应块组的inode Table位置--读取inode Table位置--读取inode--顺着块指针--读取Data Blocks*文件名在哪在Linux文件系统内文件名不属于inode而是存在于“目录”这个特殊文件内。链接“链接”是针对于目录、文件单元各自的独立链接。例如通过链接可实现文件路径的快速切换不同目录下可执行文件的直接运行。链接情况查询方式 ls -i软链接链接性质建立后操作单个对象数据自动同步到另一对象。创建方式ln -s [路径/文件] [新对象]删除方式unlink [对象名]以文件链接为例软链接后链接目标加以“-”表示链接对象ln -s test.cc test由于文件无后缀所以失去属性打开文件链接后对对象操作相互同步在test文件下新增一行保存退出发现test.cc下已同步。软链接可以看作为一种“快捷方式”通过访问此快捷方式就可以对原对象操作。作为一个独立的文件依据inode不同上图中新链接文件1052423 链接对象1052424同样的对于目录操作也是如此不同目录下指定进行链接。悬空链接⚠️ 恢复前最重要的第一原则立刻停止任何写入操作包括不要创建新文件、不要下载东西、不要编辑和保存其他文件、甚至尽量避免在当前目录下执行大型命令。任何写入行为都可能把你想恢复的test.cc内容给“覆盖”掉一旦覆盖神仙也难救了。硬链接创建方式ln [文件] [目标文件] //软链接去除“-s”的结构硬链接创建的文件本质上并不是一个独立的文件而是原链接文件的拷贝对象从“二者inode一致、甚至创建时间都继承自原对象可以看出”。unlink直接对ccode.c操作发现inode没有改变这也符合预期。且“2-1”可以发现若我们再次进行创建链接1--2--3---4渐增我们有理由推断这其实就是“引用计数”的具体应用。因此由于硬链接的unlink性质我们常用硬链接作“备份文件”的作用。为什么不能对目录建立硬链接呢易形成“环装链路”当我们再执行文件时由于inode一样。就可能因为查找路径时的多叉树结构而无限循环因此不允许对目录间建立硬链接。“ . ”的引用计数为什么是2自己创建时 . 1 1 2感谢观看求关注