尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【知识讲解】 Linux磁盘与文件系统认识

【知识讲解】 Linux磁盘与文件系统认识 目录前言Part1. 磁盘硬件底层CHS 与 LBA 寻址Part1.1. 磁盘硬件结构Part1.2. LBA线性块寻址Part1.3. 块--操作系统的IO单元Part2. 磁盘分区--分治管理空间Part3. 文件的两大组成内容 元信息Part4. VFS虚拟文件系统向上统一抽象Part4.1. 进程描述符Part4.2. struct file 打开文件对象Part4.3. struct dentry 目录项Part4.4. struct inode 索引节点Part4.5. super_block 超级块Part4.6. 底层文件系统驱动Part5. fsyncPart6. 概念总结Part7. 结语前言Linux下一切皆文件对于文件与储存文件的磁盘的认识是非常重要的接下来来跟随小编的视角来看看吧。lets go!!!!!!!!Part1. 磁盘硬件底层CHS 与 LBA 寻址Part1.1. 磁盘硬件结构机械硬盘由盘片、磁头、磁道、扇区构成• 盘片圆形金属薄片上下两面都可以存储数据每一面有一个对应的磁头head负责读写。• 磁道track盘片上一圈一圈同心圆。磁头不动、盘片旋转磁头就沿着磁道读写。• 扇区sector磁道上切分出最小读写单元标准扇区大小 512字节。磁盘硬件最小读写单位是扇区一次IO最少读/写一个扇区。CHS 寻址Cylinder-Head-Sector柱面-磁头-扇区是老式硬盘寻址方式• C柱面Cylinder所有盘片同一半径位置的磁道合起来称为一个柱面• H磁头Head选择哪个盘面• S扇区Sector该磁道上第几个扇区磁盘总容量计算公式磁盘容量 柱面数 × 磁头数 × 每磁道扇区数 × 扇区字节数Part1.2. LBA线性块寻址CHS是三维坐标不方便操作系统管理。现代硬盘对外统一抽象成一维连续编号这个编号就是LBALogical Block Address逻辑块地址。把磁盘所有扇区从头到尾排成一条长数组LBA编号从0开始每一个LBA编号对应一个物理扇区。LBA ↔ CHS 转换公式设• a 每个柱面包含的扇区总数磁头数 × 每磁道扇区数• b 每条磁道的扇区数量1. CLRA/a 柱面号2. H(LBA%a)/b 磁头号3. S(LBA%a)%b 扇区号注意S从1开始计数不是0核心理解LBA就是把三维磁盘空间拍平成一维数组操作系统只需要给硬盘下发LBA编号硬盘固件内部自动转换成CHS不需要OS关心磁头、柱面细节。写入磁盘把512字节数据 LBA编号交给磁盘控制器硬件内部完成CHS转换找到对应的扇区完成写入。Part1.3. 块--操作系统的IO单元硬件最小单元是扇区(512B)但操作系统不会每次只读写1个扇区效率太低。Linux引入块block文件系统层面的最小读写单位。• 常见块大小4KB等于连续8个扇区8 × 512B 4KB•块号 ×8 (0~7)就可以定位这个块内部对应的LBA扇区。重点考点扇区是硬件最小读写单位块是Linux文件系统最小IO单位。Linux对文件的所有读写全部转化成对块的读写。Part2. 磁盘分区--分治管理空间一块大容量磁盘不会直接裸给文件系统使用会做分区。举例800GB磁盘可以划分成300G、300G、200G三个分区。操作系统内部维护一张分区表记录每个分区的start起始LBA、end结束LBA。分区本质对磁盘连续LBA空间做切分隔离不同文件系统便于管理。分区是硬件/磁盘层面划分分区内部再去部署文件系统ext4。Part3. 文件的两大组成内容 元信息Linux里一句话文件 文件内容数据 文件属性元信息两者分开存储1.文件内容就是你写入的文本、二进制数据放在数据块中2.文件元信息文件大小、权限rwx、uid/gid、时间戳、数据块指针这些全部存在 inodeinode核心概念• inode本质一个结构体固定大小ext4默认128字节。• 一个文件对应唯一一个inode。inode不保存文件名文件名保存在目录项dentry里面。• inode里面存放指向磁盘上数据块的指针用来找到存放文件内容的那些块。面试高频删除文件本质是删除目录项的文件名链接inode引用计数减一引用计数归零才会释放inode和数据块。区分两个容易混淆结构体• struct inode磁盘文件的元信息描述磁盘上的文件本身所有进程共享• struct file进程打开文件之后在内核中创建的对象描述本次打开的文件实例包含文件偏移量、读写标志不同进程打开同一个文件会生成多个独立struct file。Part4. VFS虚拟文件系统向上统一抽象VFS的目标给上层用户/进程提供一套统一的文件操作接口open/read/write屏蔽底层差异ext4、xfs、ntfs、设备文件。不管什么文件系统上层调用接口完全一致。整条链路进程 → fd → struct file → dentry → inode → super_block → 磁盘Part4.1. 进程描述符每个进程都维护一个files_struct里面存放fd_array[]文件描述符数组也就是我们熟悉的fd。stdin(0)、stdout(1)、stderr(2)都在这里。fd本质就是数组下标。Part4.2. struct file 打开文件对象进程调用open成功后内核创建struct file里面保存当前文件读写偏移量f_pos、文件操作函数指针表file_operations、引用计数并且关联目录项dentry。同一个文件多个进程多次open会生成多个独立struct file各自拥有独立的文件偏移。Part4.3. struct dentry 目录项dentry保存文件名以及指向inode的指针。目录也是文件目录文件里面存放一堆dentry记录这个目录下所有文件/子目录名字以及对应的inode编号。Part4.4. struct inode 索引节点对应磁盘上文件的元数据。inode_operations 是inode层面操作函数集创建、删除、查找。一个inode对应磁盘上真实文件。Part4.5. super_block 超级块一个分区一个文件系统对应一个超级块super block。超级块记录整个文件系统全局信息总块数、空闲块、inode总数、空闲inode以及文件系统类型ext4。super_operations 是超级块操作函数挂载、卸载文件系统时使用。Part4.6. 底层文件系统驱动VFS只是抽象层真正的实现由ext4/xfs等文件系统驱动实现把VFS的接口翻译成对块设备的读写。一句话串起全链路用户态进程调用open → 内核分配fd创建struct file → 路径解析查找目录项dentry → dentry找到磁盘inode → 加载inode到内存关联超级块super_block。read/write的时候通过inode里的块指针找到磁盘数据块完成读写。Part5. fsyncint fsync(int fd);缓存机制Linux读写文件会经过页缓存page cache。我们write写入数据不会立刻写到磁盘先写到内存页缓存返回成功。内核后台线程pdflush会异步刷盘。问题断电时内存数据丢失造成文件损坏。fsync(fd)作用强制把fd对应的文件所有缓存数据、文件元信息一次性同步刷入磁盘调用返回时磁盘已经持久化完成。区分• fsync刷数据 inode元信息• fdatasync只刷文件内容数据不强制刷元信息速度更快。Part6. 概念总结1. 扇区磁盘硬件最小读写单元512字节块OS文件系统最小IO单元4KB。2. LBA一维线性扇区编号现代硬盘标准寻址CHS是老式三维寻址。3. 分区切分磁盘LBA空间分区表记录起止位置。4. 文件 数据块内容 inode元信息文件名保存在dentry目录项。5. struct file进程打开文件实例inode磁盘上文件本体。6. VFS虚拟文件系统统一接口屏蔽不同底层文件系统差异。7. page cache页缓存write先写内存fsync强制落盘持久化。Part7. 结语这篇文章我们知道了文件与磁盘的联系接下来小编还会带来更多Linux相关的知识敬请期待~最后祝大家可以春风得意马蹄疾一日看尽长安花最后的最后要是觉得本文还可以的话可以点点赞关注小编一波谢谢大家~
返回列表