Linux 文件系统是如何组织磁盘数据的?
发布时间 - 2026-01-23 00:00:00 点击率:次CHS与LBA是磁盘寻址的两种方式,CHS为物理三维坐标,LBA为其线性映射;现代系统仅用LBA,由固件或驱动完成转换,文件系统如ext4直接基于LBA分配数据块。
磁盘物理结构决定寻址方式:CHS 和 LBA 是什么关系?
Linux 文件系统不直接操作磁盘的物理表面,但它的底层设计必须适配磁盘的硬件组织逻辑。机械磁盘(HDD)由多个盘片、磁头、磁道、扇区和柱面构成,而定位任意一个 512字节 的扇区,传统上靠 CHS(柱面-磁头-扇区)三维坐标——比如 C=100, H=3, S=12。现代驱动固件早已把这套映射转为线性地址 LBA(Logical Block Address),操作系统只跟 LBA 打交道。
关键点在于:ext4 等文件系统分配数据块时,用的不是 CHS,而是从 0 开始编号的 LBA 块号;但内核 I/O 子系统最终仍需通过设备驱动将 LBA 转回 CHS(或由 SSD/NVMe 控制器内部再转译)。如果你在 dmesg 里看到 "I/O error on device sda, logical block 0x1a2b3c",那个十六进制数就是 LBA。
- 不要手动算 CHS → LBA 公式(
LBA = C × H × S + H × S + (S−1)),BIOS/固件已封装;但调试磁盘坏道时,hdparm --read-sector或dd if=/dev/sda of=/dev/null bs=512 skip=123456依赖的就是 LBA 偏移 - SSD 虽无物理磁道,但仍模拟 LBA 接口,所以文件系统层无需修改;但“写放大”“磨损均衡”等行为发生在固件层,
ext4不知情 -
/sys/block/sda/queue/logical_block_size查到的未必是 512 —— 很多新盘标称4096(4K 扇区),此时一个逻辑块 = 8 个传统扇区,fdisk对齐错误会导致性能暴跌
文件系统如何把“文件”变成磁盘上的块?inode 是核心枢纽
你在 ls -li 看到的第一列数字,就是 inode 编号。它不是文件名,而是指向一个固定大小(通常 256 字节)元数据结构的指针。这个结构里存着:文件类型、权限、所有者、时间戳、链接数,最关键的是——指向实际数据块的指针列表。
也就是说,/home/user/doc.txt 这个路径只是目录项(dirent)里的一个名字+inode号映射;真正读取内容时,内核先查目录找到 inode 号,再查 inode table 拿到数据块编号,最后去对应 LBA 位置读取。
- 小文件(≤60 字节)可能直接塞进 inode 里(
ext4支持 inline data),不占额外数据块 - 大文件用三级间接块:直接块(12 个)、一次间接块(指向块表)、二次间接块(指向块表的块表)……层级越多,访问延迟越高
-
stat /path/to/file显示的Blocks:是按 512 字节单位统计的,和du -b不同;而文件系统分配是以block size(如 4096)为单位,ls -l显示的大小
≠ 占用空间
超级块、块组、位图:文件系统怎么管理“空闲”与“已用”?
整个分区格式化成 ext4 后,开头第一个块就是 superblock,它记录了总块数、空闲块数、块大小、inode 总数等全局信息。但只靠一个超级块太危险——损坏就全盘崩溃。所以 ext4 在每个 block group(默认每 16384 个块一组)开头都备份一份超级块,并附带该组的 inode bitmap 和 block bitmap。
这两个位图就是开关阵列:每个 bit 对应一个 inode 或一个数据块,“1”表示已用,“0”表示空闲。创建文件时,文件系统扫描位图找第一个 0,设为 1,再更新超级块里的空闲计数。
-
dumpe2fs -h /dev/sda1看超级块摘要;dumpe2fs -x /dev/sda1可导出位图二进制,但一般没必要——e2fsck -n就能检查一致性 - 删除文件 ≠ 清空数据块,只是把 inode 标记为未用、对应位图 bit 置 0;原数据还在,直到被新文件覆盖——这就是恢复工具(如
extundelete)的原理 - 频繁小文件写入容易导致位图碎片化,
ext4默认启用flex_bg(弹性块组)缓解,但 SSD 上影响不大
挂载与 VFS:为什么 /proc 和 /sys 看起来像文件却不在磁盘上?
Linux 用虚拟文件系统(VFS)抽象所有存储后端:无论是真实磁盘上的 ext4、网络存储的 nfs,还是纯内存的 tmpfs,都统一提供 open()/read()/write() 接口。而 /proc 和 /sys 是典型的伪文件系统(procfs、sysfs),它们根本没数据块,每次 cat /proc/meminfo 都是内核现场拼字符串返回。
这解释了为什么 df 显示 /proc 占用 0 字节,而 ls /proc 却能看到几百个“目录”——它们是内核数据结构的实时投影,不是磁盘映射。
-
mount -t proc proc /proc是必需步骤,否则/proc下为空;但多数发行版启动时自动完成 - 你不能对
/proc/sys/net/ipv4/ip_forward执行ln -s,因为它是只读接口;写入生效靠echo 1 > ...触发内核回调,不是改磁盘 -
/dev下的设备文件(如/dev/sda)也不是磁盘内容,而是内核设备模型的入口节点,访问它会触发驱动程序,而非读块设备
data=ordered vs data=writeback)、日志何时刷写(jbd2)、甚至 CPU 缓存行对齐是否影响 inode 访问效率。这些细节不常暴露,但一旦出问题(如断电后 ext4 报错 requiring fsck),根源几乎都在元数据与物理块映射的衔接环节。
# linux
# node
# 操作系统
# 字节
# 工具
# 后端
# ios
# bios
# 为什么
# red
# echo
# NULL
# if
# 封装
# Error
# 字符串
# 指针
# 数据结构
# 接口
# table
# li
# 文件系统
# 扇区
# 固件
# 磁道
# 第一个
# 你在
# 盘片
# 的是
# 都是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
详解jQuery中的事件
深入理解Android中的xmlns:tools属性
动图在线制作网站有哪些,滑动动图图集怎么做?
如何为不同团队 ID 动态生成多个“认领值班”按钮
如何在Windows服务器上快速搭建网站?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
佛山企业网站制作公司有哪些,沟通100网上服务官网?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
如何在VPS电脑上快速搭建网站?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
个人摄影网站制作流程,摄影爱好者都去什么网站?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
打造顶配客厅影院,这份100寸电视推荐名单请查收
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
如何在阿里云香港服务器快速搭建网站?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
Python高阶函数应用_函数作为参数说明【指导】
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何快速查询网址的建站时间与历史轨迹?
如何在万网自助建站平台快速创建网站?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
node.js报错:Cannot find module 'ejs'的解决办法
网站制作报价单模板图片,小松挖机官方网站报价?
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
JavaScript Ajax实现异步通信
javascript中闭包概念与用法深入理解
Thinkphp 中 distinct 的用法解析
如何在万网主机上快速搭建网站?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何在香港免费服务器上快速搭建网站?
Python文件异常处理策略_健壮性说明【指导】
详解Android——蓝牙技术 带你实现终端间数据传输


