Linux文件系统:从硬件到软硬链接

1. 理解硬件

  • 机械磁盘是计算机中唯一的一个机械设备
    • 扇区:每个磁道被切分成很多扇形区域;磁盘存储数据的基本单位,512字节,块设备
    • 磁头:每个盘片一般有上下两面,分别对应一个磁头,共两个磁头
    • 磁道:从盘片外圈往内圈编号0,1...,靠近主轴的同心圆;用于停靠磁头,不存储数据
    • 柱面:磁道构成柱面,数量上等于磁道个数
    • 圆盘数:盘片的数量
  • CHS地址定位
    • 先确定磁头(header)
    • 再确定柱面(磁道)(cylinder)
    • 定位扇区(sector)
  • LBA地址
    • 把磁道展开就是一个数组,每个下标对应一块扇区;多个磁道就构成了一个二维数组;多个柱面就形成了三位数组
    • LBA = 柱面号C * 单个柱面的扇区总数 +磁头号H*每磁道扇区数 + 扇区号S -1;
  • LBA转CHS
    • 柱⾯号C=LBA//(磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】
    • 磁头号H=(LBA%(磁头数*每磁道扇区数))【每磁道扇区数】
    • 扇区号S=(LBA%每磁道扇区数)+1【扇区号从1开始,在LBA中是从0开始】

2. 引入文件系统

2.1 引入"块"的概念

  • 操作系统读取硬盘数据的时候,一次读取一个"块"
  • "块"是文件存取的最小单位
    • 8个扇区组成一个"块",通常为 4KB

2.2 引入"分区"的概念

  • 柱面是分区的最小单位
  • 柱面大小一致,扇区个位一直

2.3 引入"inode"概念

  • 每行包括7列

    • 模式,硬连接数,文件所有者,组,大小,最后修改时间,文件名
  • 每个文件都有对应的inode,里面包含了与该文件相关的一些信息

  • Linux下文件的存储时属性和内容分离存储的

  • Linux下,保存文件属性的集合叫inode

  • 一个文件对应一个inode,inode内有唯一的标识符名叫作inode号

  • 文件名不会作为属性,保存在inode中

  • inode的大小一般是128字节或者256字节,后面统一为128字节

  • 任何文件的内容大小可以不同,但是属性大小一定是相同的

  • 三个时间

    • Access 最后访问时间
    • Modify 文件内容最后修改时间
    • Change 属性最后修改时间

3. ext2 文件系统

3.1 Block Group

  • ext2 系统会根据分区的大小划分为多个Block Group,每个 Block Group 都有着相同的结构组成

3.2 块组内部构成

3.2.1 超级块(Super Block)

  • Super Block存放文件系统本身的结构信息,描述整个分区的文件系统信息
  • 不是所有分组都要包含 Super Block,只有个别对应分组需要,而且 Super Block里面的内容是完全一样的
  • 每个块的第一个块组必须有,后面的块组可以没有

3.2.2 GDT

  • 块组描述符表,描述块组属性信息,整个分区有多少个块组就对应多少个块组描述符
  • 每个块组描述符存储一个块组的描述信息
    • 这个块组是从哪里开始是 inode Table
    • 从哪里开始时 Data Blocks
    • 空闲的 inode 和 数据块 还有多少个等等
  • 块描述符在每个块组的开头都有一份拷贝

3.2.3 块位图(Block Bitmap)

  • 记录 Data Block 中哪个数据块已经被占用,哪个数据块没有被占用

3.2.4 inode位图(Inode Bitmap)

  • 每个 bit 表示一个 inode 是否空闲可用

3.2.5 i节点表(Inode Table)

  • 存放文件属性,文件名不会作为属性保存在 inode 中
  • inode 编号以分区为单位,整体划分,不可划分区

3.2.6 Data Block

  • 存数据时以 4KB 为单位存
  • Block 号按照分区划分,不可跨分区

3.2.7 inode和datablock映射

  • inode 内部可以和datablock可以进行映射

3.2.8 总结

  • 分区之后的格式化操作,就是对分区进行分组,在每个分组中写入 SB、GDT、Block Bitmap、Inode Bitmap等管理信息,这些管理信息,统称为文件系统
  • 只要知道文件的 inode 号,既能在指定分区中确定是哪一个分组,进而在哪一个分组确定 inode
  • 拿到inode 文件属性和内容就全部都有了

3.3 目录和文件名

  • 目录也是文件
  • 内容保存的是:目录下文件名和inode的映射关系
  • 访问文件,必须打开当前目录,根据文件名,获得对应的 inode 号,然后进行文件访问
  • 访问文件必须知道文件所在目录 -》 必须能打开对应目录文件,查看文件内容

3.4 路径解析

  • ==从根目录开始,依次打开每一个目录,根据目录名,依次访问每个目录下指定的目录,直到访问到 test.c,==这个过程叫做Linux路径解析
  • 根目录固定文件名,固定inode号,无需查找,系统开机后就必须知道

3.5 路径缓存

  • linux 会缓存历史路径结构
  • 打开的文件是目录的话, 由 OS 自己在内存进行路径维护
  • Linux中,在内核中维护树状路径结构的内核结构体叫做:struct dentry
  • 每个文件都有对应的 dentry 结构,包括普通文件
  • 整个树形节点同时会隶属于LRU(最近最少使用),进行节点淘汰
  • 整个属性节点也同时会隶属于 Hash,方便快速查找

3.6 挂载分区

  • 分区写入文件系统,无法直接使用,需要和指定目录关联,进行挂载才能使用
  • 可以根据访问文件的"路径前缀",准确判断我在哪一个分区

4. 软硬链接

4.1 硬链接

  • 硬链接只能给普通文件进行建立,Linux系统不支持给目录建立硬链接
  • 硬链接本质不是一个独立的文件,没有自己的inode,本质是一组新的文件名和 inode number的映射关系
  • ==ln 源文件 硬链接
linux 复制代码
[root@localhost linux]# touch abc 
[root@localhost linux]# ln abc def #给abc建立硬链接def
[root@localhost linux]# ls -li abc def 
263466 abc 
263466 def

#inode号相同
  • 删除文件时
    • 1.在目录中将对应的记录删除
    • 2.硬链接数-1,如果为0,则将对应磁盘释放

4.2 软链接

  • 软链接是通过 inode 引用另外一个文件,软连接是通过名字引用另外一个文件
  • 软链接是一个独立的文件,新的文件和被引用的文件的 inode 不同
  • 相当于 windows 下的快捷方式,删除不会影响源文件
  • ln -s 源文件 软链接
linux 复制代码
[root@localhost linux]# ln -s abc.s abc
[root@localhost linux]# ls -li 
263563 -rw-r--r--. 2 root root 0 9 ⽉ 15 17:45 abc 
261678 lrwxrwxrwx. 1 root root 3 9 ⽉ 15 17:53 abc.s -> abc 263563 -rw-r--r--. 2 root root 0 9 ⽉ 15 17:45 def
  • 删除软链接(两种方式)
    • rm abc.s
    • unlink abc.s

4.3 软硬链接对比

  • 软链接是独立文件
  • 硬链接只是文件名和目标文件inode的映射关系

4.4 软硬连接的用途

  • 硬链接:
    • . 和 ... 就是硬链接 -》 创建的文件夹初始连接数就是2
      • 父目录的文件名 + 自己的 .
      • 虽然. 和 ... 就是硬链接,但是不支持给目录建立硬链接
        • 防止出现路径环问题
        • . 和 ... 是特殊目录,平时用到不会解析,方便操作
    • 文件备份
  • 软连接:
    • 类似快捷方式
相关推荐
HalvmånEver2 小时前
Linux:初始网络(上)
linux·网络·学习·通信
REDcker2 小时前
Linux C++ 内存泄漏排查分析手册
java·linux·c++
Hello World . .2 小时前
Linux:网络编程-基于HTTP协议的天气预报查询系统开发详解
linux·网络·http
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-03-12
大数据·数据库·人工智能·经验分享·搜索引擎
艾莉丝努力练剑3 小时前
【Linux进程间通信:共享内存】为什么共享内存的 key 值由用户设置
java·linux·运维·服务器·开发语言·数据库·mysql
微露清风3 小时前
系统性学习Linux-第四讲-进程控制
linux·服务器·学习
不脱发的程序猿3 小时前
嵌入式Linux:阻塞式I/O与非阻塞式I/O
linux·服务器·单片机·嵌入式硬件·嵌入式
@蓝莓果粒茶3 小时前
OpenClaw 最终安装指南:Windows 下用 WSL2 + Ubuntu 跑通源码版
笔记·ai
Qt程序员3 小时前
基于 C++ 实现自定义字符串 string 类
linux·c++·容器·指针·内存管理·运算符重载