前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!!
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》
文章目录
- 一、先搞懂:文件存磁盘里,怎么找到它?
- 二、磁盘的“朋友圈”:从单个磁盘到机房
- 1. 磁盘的基本能力
- 2. 磁盘里的数据怎么存?靠“小磁铁”
- 三、磁盘的“内部地图”:磁道、扇区与柱面
- 1. 最基本的“存储单元”:扇区
- 2. 双面磁盘与“磁头”
- 3. 逻辑上的“柱面”
- 四、怎么找到磁盘里的“扇区”?两种寻址方式
- 1. 早期的“三维定位”:CHS寻址
- 2. 更简单的“线性定位”:LBA寻址
- 3. CHS和LBA的转换:磁盘自己搞定
- 五、操作系统怎么管磁盘?引入“文件系统”
- 1. 比扇区大的“管理单元”:块
- 2. 磁盘分“组”:块组管理
- 3. 块组里有什么?
- 六、实战:在Linux里看磁盘和inode信息
- 1. 查看磁盘分区和扇区信息
- 2. 查看文件的inode信息
- 总结
一、先搞懂:文件存磁盘里,怎么找到它?
咱们电脑里的每个文件,其实都很“简单”——单个文件 = 内容(比如文档里的字、图片的像素)+ 属性(比如文件大小、创建时间)。
但问题来了:没打开的文件都存在磁盘里,磁盘里文件那么多,咱们怎么精准找到想要的?
答案藏在“磁盘的目录结构”里——磁盘是用树状目录来存文件的,就像你电脑里“此电脑→D盘→学习资料→Linux笔记.txt”这样的一串地址,这串地址叫“路径”。只要顺着路径找,就能定位到文件。
就像下面这张图里展示的那样,树状的目录结构+明确的路径,是咱们找到磁盘里文件的“导航图”:
而这一切能实现,背后全靠“文件系统”——它最核心的工作,就是帮咱们管好磁盘里的文件,让咱们能快速找到、读写文件。
二、磁盘的“朋友圈”:从单个磁盘到机房
要懂文件系统,得先搞懂它“管理的对象”——磁盘,以及磁盘所在的硬件环境。
1. 磁盘的基本能力
磁盘就像一个“可擦写的笔记本”:能存数据(写)、能读数据(读)、也能删数据(擦除)。但它不是孤立存在的,通常和这些硬件搭伙干活:
- 服务器:磁盘一般装在服务器里,服务器靠“网卡”连网,咱们才能通过网络访问服务器里的文件(比如云盘里的文件)。
- 机柜:服务器不是散着放的,而是放进“机柜”里——机柜就像服务器的“多层书架”,能塞很多台服务器,节省空间还方便管理:
- 机房:多个机柜连起来,再配上电源、空调、网络设备,就成了“机房”——一般只有大公司(比如阿里、腾讯)或云服务商才会建自己的机房,用来放大量服务器和磁盘:
2. 磁盘里的数据怎么存?靠“小磁铁”
不同硬件存数据的原理不一样,磁盘靠的是“磁铁”——可以把磁盘看成无数个“小磁铁”组成的平面:
- 写数据时:改变小磁铁的“磁性方向”(比如“N极朝上”代表1,“S极朝上”代表0),用0和1记录数据;
- 删数据时:用高温让小磁铁失去磁性,数据就没了。
三、磁盘的“内部地图”:磁道、扇区与柱面
磁盘的物理结构没那么复杂,咱们拆开来看看:
1. 最基本的“存储单元”:扇区
把磁盘的一个“盘面”(像光盘一样的圆形平面)放大,会看到一圈圈的“同心圆跑道”,这叫磁道;每个磁道又被分成很多“小段”,每一小段就是扇区——这是磁盘最小的存储单元,默认大小是512字节(比如一个文字、一个小图标碎片,可能就存在一个扇区里):
2. 双面磁盘与“磁头”
实际的磁盘不是“单面”的,而是像“叠起来的光盘”,有很多个“盘面”(比如双面磁盘有2个盘面)。每个盘面都需要一个“读/写头”(简称磁头),就像唱片机的针头一样,负责读/写这个盘面的数据:
而且这些磁头是“同步行动”的——比如所有磁头一起往“外圈”移动,或者一起往“内圈”移动,不会各自为政。
3. 逻辑上的“柱面”
当所有磁头同步移动到同一个“磁道位置”时,这些盘面的“同位置磁道”会组成一个“圆柱形”的结构,这就是柱面——柱面是个“逻辑概念”,不是真的有个柱子,而是为了方便管理多个盘面的磁道:
比如写数据时,磁盘会让多个盘面的扇区“同时写”(比如6个扇区一起写),效率更高。
四、怎么找到磁盘里的“扇区”?两种寻址方式
知道了磁盘的结构,接下来的问题是:怎么精准定位到一个扇区(比如要把512字节的数据写入某个扇区)?
1. 早期的“三维定位”:CHS寻址
早期磁盘用的是CHS寻址,靠三个参数定位扇区,就像找教室要“哪栋楼(C)、哪一层(H)、哪个教室(S)”:
- C(Cylinder):柱面号——确定是“哪栋楼”(哪个柱面);
- H(Head):磁头号——确定是“哪一层”(哪个盘面);
- S(Sector):扇区号——确定是“哪个教室”(哪个扇区)。
定位时,磁头会先移动到指定柱面,然后磁盘旋转,等指定扇区转到磁头下方,就能读/写数据了:
简单说:文件的本质,就是存在一个或多个扇区里——比如一个1KB的文件,就需要2个512字节的扇区。
2. 更简单的“线性定位”:LBA寻址
CHS寻址有个问题:磁盘容量变大后,柱面、磁头、扇区的数量会变得很复杂,操作系统管理起来很麻烦。于是就有了LBA寻址(Logical Block Addressing,逻辑块地址)。
LBA的思路很简单:把磁盘所有扇区“拉直”,看成一个“线性数组”,每个扇区给一个唯一的“编号”(从1开始,不是从0),这个编号就是LBA地址。比如磁盘有1000个扇区,LBA编号就是1~1000:
操作系统怎么算LBA总数?很简单:用磁盘总容量除以每个扇区的大小(512字节)。比如一个10GB的磁盘,总容量是10×1024×1024×1024字节,除以512字节/扇区,就能算出LBA总数:
注意:扇区的LBA编号是从1开始的,不是从0开始——这是硬件规定的:
3. CHS和LBA的转换:磁盘自己搞定
操作系统只需要用LBA地址(比如“写数据到LBA=100的扇区”),不用管CHS。那LBA怎么对应到实际的CHS位置?
不用咱们操心——磁盘硬件会自动完成“CHS和LBA的转换”:
- 已知CHS,转LBA:用公式算出对应的LBA编号;
- 已知LBA,转CHS:把LBA编号拆成C、H、S三个参数;
最终结论:操作系统只需要跟LBA打交道,复杂的硬件细节(CHS)交给磁盘自己处理,效率更高:
五、操作系统怎么管磁盘?引入“文件系统”
前面说过,扇区是磁盘最小的存储单元(512字节),但操作系统读/写磁盘时,不会以扇区为单位——因为每次读512字节太慢了,效率太低。
于是文件系统引入了“块”的概念:
1. 比扇区大的“管理单元”:块
文件系统把多个扇区“打包”成一个“块”(Block),默认大小是4KB(也就是8个512字节的扇区)。操作系统读/写磁盘时,都以“块”为单位——就像搬砖,一次搬8块比一次搬1块快多了:
比如一个10KB的文件,需要3个4KB的块(前两个块存满4KB,第三个块存2KB,剩下的2KB空闲)。
2. 磁盘分“组”:块组管理
如果磁盘容量很大(比如300GB),直接管理所有块会很混乱。文件系统会把磁盘分成多个“块组”(Block Group),比如把300GB分成10个30GB的块组——每个块组相当于一个“小区”,管理自己的块,找文件时不用翻遍整个磁盘:
3. 块组里有什么?
每个块组里都有这些核心部分,负责管理文件的“属性”和“内容”:
重点说两个关键角色:
- 数据块(Data Blocks):存文件的“内容”(比如文档里的文字、图片的像素),每个块4KB;
- inode:存文件的“属性”(比如文件大小、创建时间、修改时间、所有者)。
文件系统会把“内容”和“属性”分开存——属性存在inode里,内容存在数据块里。inode就像文件的“身份证”,是一个固定大小的“结构体”(编程里的struct),默认128字节:
比如一个文件的inode里,会记录“这个文件的内容存在哪些数据块里”——操作系统找到inode,就能顺着inode里的“块地址”,找到文件的内容:
六、实战:在Linux里看磁盘和inode信息
光说理论不够,咱们用Linux命令实际看看磁盘和inode的情况(云服务器或本地Linux都能执行):
1. 查看磁盘分区和扇区信息
用 lsblk
命令查看系统里的磁盘和分区(比如云服务器的磁盘):
# 列出所有磁盘和分区的信息(包括大小、类型)
lsblk
执行后会看到类似这样的结果(对应前面“云服务器查看磁盘”的图):
vda
是磁盘名,vda1
是磁盘的第一个分区;- 能看到分区大小(比如200GB),以及是否挂载(Mounted)。
如果想更详细地看扇区信息,用 fdisk -l
命令:
# 查看磁盘分区的详细信息(包括扇区大小、LBA总数)
fdisk -l /dev/vda # /dev/vda 是磁盘路径
执行后能看到“扇区大小”(512字节)、“总扇区数”(比如419430400,对应200GB),这些就是咱们前面说的LBA相关信息。
2. 查看文件的inode信息
用 ls -i
命令查看文件的inode编号(每个文件的inode编号唯一):
# 查看当前目录下所有文件的inode编号和文件名
ls -i
比如执行后会看到:
123456 Linux笔记.txt 789012 图片.jpg
其中 123456
就是 Linux笔记.txt
的inode编号。
如果想查看inode里的详细属性(比如文件大小、创建时间),用 stat
命令:
# 查看指定文件的inode详细信息
stat Linux笔记.txt
执行后会看到类似这样的结果(对应前面inode存属性的图):
File: Linux笔记.txtSize: 10240 Blocks: 24 IO Block: 4096 regular file
Device: 801h/2049d Inode: 123456 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2024-05-01 10:00:00.000000000 +0800
Modify: 2024-05-01 10:30:00.000000000 +0800
Change: 2024-05-01 10:30:00.000000000 +0800Birth: -
其中:
Inode: 123456
是inode编号;Size: 10240
是文件大小(10KB);Blocks: 24
是占用的块数(24×4KB=96KB?这里要注意:实际占用块数会比文件大小略大,因为即使文件没填满块,也会占用整个块);Access/Modify/Change
是文件的访问、修改、属性变更时间,这些都存在inode里。
总结
咱们从“找文件”到“懂磁盘”,其实就绕了这几个圈:
- 文件=内容+属性,靠路径找到磁盘里的文件;
- 磁盘是硬件,靠磁道、扇区存数据,用CHS/LBA定位扇区;
- 文件系统用“块”管理磁盘,用“inode”存属性,把内容和属性分开管,让操作系统效率更高。
下次再用电脑存文件、看云盘,就知道背后是这么一套逻辑在干活啦~