【基础IO】文件系统 {磁盘的物理结构,存储结构,逻辑结构;CHS 和 LBA 寻址方式;磁盘分区和块组;文件inode;软硬链接}
文件系统
文件分为:
- 内存文件:被进程打开的文件,文件被加载到内存中供进程快速读写。
- 磁盘文件:没有被打开的文件,保存在磁盘上。磁盘文件被分门别类的存储和管理,用于支持更好的存取。
提示:
- 内存文件:就是我们之前学习的进程与文件的关系,文件描述符,虚拟文件系统,缓冲区,重定向等知识。
- 磁盘文件:是我们接下来要学习的内容。
一、磁盘(HDD)

- 内存RAM(Random Access Memory) —— 掉电易失存储介质
- 磁盘HDD(Hard Disk Drive) —— 永久性存储介质
提示:
- 永久性存储介质还有:固态硬盘SSD(Solid State Drive),U盘,flash卡,光盘,磁带
- 磁盘是一个外设,还是计算机中唯一的一个机械设备!其读写速度相对较慢,当然OS存在一些提速方式。
1.1 物理结构

物理结构:
- actuator:伺服电机(音圈马达,包括永磁铁和线圈)
- spindle:主轴(包括轴承与马达)
- read/write heads:磁头(读写头)
- platters(disks):磁盘盘片
- logic board:磁盘主板(逻辑板)
- connections:接口
磁盘存储数据的原理:
- 磁盘存储数据的原理是利用磁性材料在磁场作用下的磁化性质,通过在磁盘表面上划分成许多小区域,根据不同的磁化方向来表示0和1的二进制数据,通过读写磁头在磁盘上的移动,可以实现数据的读取和写入。
- 电脑硬盘拆解全过程 放大100倍 磁头坏道盘片磁道看的门清_哔哩哔哩_bilibili
注意:电脑开机状态下,不要搬运,挪动,碰撞。否则可以由于震动使磁头刮伤高速旋转的磁盘,从而导致数据丢失。
1.2 存储结构

在磁盘存储系统中,扇区(Sector)、磁道(Track)和柱面(Cylinder)是常用的概念。
-
扇区(Sector):扇区是磁盘上最小的存储单位。它是一个固定大小的数据块,通常为512字节或4KB。磁盘上的数据以扇区为单位进行读取和写入。
-
磁道(Track):磁道是磁盘上的一个圆形轨道,它位于磁盘的表面上。磁盘通常由多个同心圆组成,每个同心圆上都有一个磁道。磁道是磁盘上的物理结构,用于存储数据。磁道上的扇区可以被读取或写入数据。
-
柱面(Cylinder):柱面是由多个磁盘盘片(Platter)上的相同磁道组成的垂直堆叠。每个盘片上的相同编号磁道构成一个柱面。柱面是磁盘存储系统中的逻辑概念,用于组织和寻址数据。操作系统和磁盘控制器使用柱面号来定位和访问磁盘上的数据。
总结来说,扇区是磁盘上最小的存储单位,磁道是磁盘上的一个圆形轨道,而柱面是由多个磁盘盘片上的相同磁道组成的垂直堆叠。这些概念在磁盘存储系统中用于组织和管理数据,并提供对数据的读取和写入操作。
1.2.1 CHS寻址
CHS(Cylinder-Head-Sector)寻址方式是一种早期的磁盘寻址方式,用于定位和访问磁盘上的数据。它将磁盘的物理结构抽象为柱面、磁头和扇区的组合。
CHS寻址方式使用柱面号、磁头号和扇区号的组合来定位和访问磁盘上的数据。 通过指定柱面号、磁头号和扇区号,操作系统或磁盘控制器可以精确地定位到磁盘上的特定数据位置。
然而,随着技术的发展,CHS寻址方式逐渐被LBA(Logical Block Addressing)寻址方式取代。LBA寻址方式使用逻辑块号来定位和访问磁盘上的数据,更加简单和灵活,能够支持更大容量的磁盘。
1.3 逻辑结构

将磁带从磁带盒中抽出来,原本卷在一起的圆形结构就变成了线性结构!
类比磁带,我们也可以将磁盘盘片抽象为线性结构(类似于数组),扇区抽象为逻辑块(数组元素),每个逻辑块都有逻辑块号(数组下标):

1.3.1 LBA寻址
LBA是Logical Block Addressing(逻辑块寻址)的缩写。它是一种磁盘寻址方式,用于定位和访问磁盘上的数据。
在LBA寻址方式中,磁盘被抽象为逻辑块的序列,每个逻辑块都有一个唯一的逻辑块号(LBA)。逻辑块是磁盘上的最小可寻址单位,对应磁盘上的扇区,通常为512字节或4KB。
与CHS寻址方式不同,LBA寻址方式不需要考虑磁盘的物理结构,如柱面、磁头和扇区。通过指定逻辑块号,操作系统或磁盘控制器可以直接定位到磁盘上的特定逻辑块,而无需关心磁盘的物理布局。
LBA寻址方式的优点是简单和灵活。它可以支持更大容量的磁盘,并且不受物理结构的限制。此外,LBA寻址方式还可以提供更高的数据传输速率和更好的数据可靠性。
因此,现代计算机系统通常使用LBA寻址方式来管理磁盘上的数据,而不再使用传统的CHS寻址方式。
简单来说,我们可以将逻辑块序列当成数组,逻辑块号作为数组下标。
将数据存储到磁盘 --> 将数据存储到数组
找到磁盘的特定扇区 --> 找到数组的指定下标位置
对磁盘进行管理 --> 对该数组的管理
1.3.2 磁盘分区 & 块组

磁盘分区:
- 磁盘分区是将物理硬盘划分为多个逻辑部分,以便独立地管理和存储数据、操作系统和文件系统。
- Boot Block:引导块,磁盘分区中的引导块是存储引导加载程序、引导信息和分区表的特殊区域。引导加载程序和引导信息用于启动操作系统和提供必要的配置信息;分区表中记录了磁盘上的分区布局和分区的起始位置、大小等信息。boot block有多份拷贝,可在损坏时进行修复。
- Block group:块组,一个磁盘分区可以再划分为多个块组。

块组的结构介绍:
- block:数据块,操作系统和磁盘进行IO操作的基本单位是4KB,即1个block大小,因此磁盘又叫做块设备。block用于保存文件内容,一个文件可能包含多个block。
- inode:索引节点,是一个大小为128B的空间,用于保存对应文件的属性。每个inode节点都有一个唯一的inode编号。一个文件只有一个inode。
- Data blocks:数据块集合,多个4KB大小的block组成的集合,用于保存特定文件的内容。
- inode Table:索引节点表,多个文件的inode节点的集合,用于保存对应文件的属性。
- Block Bitmap:块位图,用于记录Data blocks的占用情况。每个比特位和特定的block是一一对应的,比特位为1表示该block被占用,为0表示可用。
- inode Bitmap:索引节点位图,用于记录inode Table的占用情况。每个比特位和特定的inode是一一对应的,比特位为1表示该inode被占用,为0表示可用。
- Group Descriptor Table (GDT):块组描述符,用于存储该块组的元数据信息。包括块组的起始位置,块组的大小,块位图的位置,索引节点位图的位置,索引节点表的位置,块组中可用空间的大小,块组中可用索引节点的数量,其他块组特定的信息等,以便操作系统能够快速定位和管理文件系统中的数据块和索引节点。
- Super Block:超级块,它存储了该分区文件系统的元数据信息。包括文件系统的大小、块大小、inode数量等,以及文件系统的状态和配置信息。Super Block有多份拷贝,可在损坏时进行修复。
注意:
磁盘存储数据的基本单位是扇区(512B~4KB),而一个block是4KB(8*512B)大小。为什么不以扇区大小作为IO操作的基本单位呢?
512B太小了,可能导致多次IO,进而导致读写效率降低。
磁盘的扇区大小并不总是512B,规定一个block是4KB,就是为了使软硬件解耦合。
Linux文件系统在磁盘上存储文件的时候,将文件的内容和属性分开来保存。文件的内容保存到块组中的Data blocks,文件的属性保存到inode
什么是元数据?
- 元数据是指描述数据的数据,它提供了关于数据的属性、结构、格式、位置和其他相关信息,帮助系统理解和管理数据。
- 对于文件来说,元数据信息可能包括文件的名称、大小、创建时间、修改时间、访问权限等。
- 对于分区文件系统来说,不单单只是保存文件信息,还有一批元数据结构专门负责管理信息,如Bitmap,用于管理Data blocks和inode Table;GDT,用于描述和管理整个块组;super block,用于描述和管理整个分区文件系统;等等。正是因为这些元数据结构的存在才能够让文件的信息可追溯,可管理。
磁盘格式化通常包括以下步骤:分区,创建文件系统(包括创建元数据结构,初始化元数据结构),完成格式化。
磁盘格式化实际上就是在写入文件系统。磁盘格式化是一个重要的步骤,它确保磁盘上的文件系统结构正确创建,并为文件和数据的存储提供了必要的基础。
二、索引节点(inode)

什么是索引节点(inode)?
- 索引节点(inode)是一个大小为128B的空间,用于保存对应文件的属性信息。
- 在同一分区中,每个inode节点都有只有唯一的一个inode编号。
- 在同一分区中,一个文件只有一个inode编号,对应一个inode。
- 每个分区都有自己的inode表,用于存储该分区中所有文件和目录的inode信息。在文件系统中,通过分区和inode编号的组合,可以唯一地标识和定位一个文件或目录。
一个文件可能包含多个block,如何找到属于同一个文件的block?
- 通过文件的inode编号,就可以找到该文件的索引节点。
- 索引节点inode中不仅包含了文件的属性信息,还包含了一部分属于该文件的block编号。
- 对于小文件,通过inode就能定位所有的block。
- 对于大文件,部分block中还会保存其他block的编号。通过这样的多叉树结构,就可以找到文件的所有block。
inode和文件名
- inode属性中没有文件名。
- 目录也是文件,有自己的inode和data block。inode保存目录文件的属性;data block保存目录文件的内容:文件名和inode编号的映射关系。
- 在目录下创建(查看)文件需要目录的w(r)权限,这是因为要向目录文件的data block中写入(读取)数据。
注意:在同一目录下,不能创建同名文件。因为无法建立文件名和inode编号的一一映射关系。
通过对文件系统的学习,解释下面操作的具体步骤:
-
创建文件:
- 在对应的分区中找一块大小合适的块组;
- 遍历inode Bitmap找到第一个为0的比特位并将该位置1,创建文件inode。同时获得文件的inode编号。
- 初始化文件inode,将文件的初始属性信息填入到inode Table对应的编号位置。并清空和data blocks的映射关系(空文件)。
- 向当前目录中写入文件名(用户)和inode编号(文件系统)的映射关系。
-
删除文件:
- 通过文件名,在目录文件的block中找到对应文件的inode编号。
- 再通过inode编号,找到文件的inode。其中包含了一部分属于该文件的block编号。
- 在block bitmap中将文件所属的block位,置0。
- 在inode bitmap中将文件的inode位,置0。
- 删除目录文件中记录的文件名和inode编号的映射关系。
提示:
- 删除文件时,不需要将数据清空,只需要将文件所占的空间标定无效即可。这就是为什么删除文件要比拷贝文件要快。
- 系统会记录文件的删除日志,包括删除文件的文件名及inode编号。如果对应空间没有被覆盖写入的话,是可以利用某些工具恢复已经删除的文件的(其实就是将inode/block bitmap中的对应位置1)。所以如果把重要的文件误删了,最好做法是什么都不做。
-
查看文件(ls -l):
- 通过文件名,在目录文件的block中找到对应文件的inode编号。
- 再通过inode编号,找到文件的inode。inode中包含文件的属性信息。
- 格式化输出文件名及各种属性。
-
修改文件:
- 打开文件,将文件加载到内存,并获取对应的文件描述符。
- 以写入为例,进程先将数据拷贝到缓冲区,再根据某种刷新策略将缓冲区中的数据刷新到文件描述符对应的磁盘文件。
- 在向磁盘写入的过程中,同样是先通过文件名,在目录文件的block中找到对应文件的inode编号。
- 再通过inode编号,找到文件的inode。最后将数据刷新到文件的data block。
为什么分区/块组有剩余空间但无法创建新文件?
因为块组中的inode和data block的大小和个数是固定的,有时会出现inode有空余但data block占满,或data block有空余但inode占满的现象。给人直观的感受就是明明该分区/块组有剩余空间,但无法创建新文件(inode占满),或文件无法进行写入(data block占满)。
三、软硬链接

3.1 创建文件的软硬链接

- 创建软链接的命令:
ln -s filepath softlink - 创建硬链接的命令:
ln filepath hardlink - 软硬链接的区别:软链接有独立的inode,是一个独立的文件;硬链接没有独立的inode,不是一个独立的文件。
3.2 软链接
-
软链接有独立的inode,是一个独立的文件。软链接的文件内容是目标文件的路径。
-
软链接相当于Windows系统下文件的快捷方式。
3.3 硬链接
-
硬链接没有独立的inode,不是一个独立的文件。他与目标文件共享同一个inode,其内容,属性与目标文件完全相同。
-
创建文件的硬链接,本质上就是在指定目录下建立了文件名和目标文件inode的映射关系,并没有创建新文件。简单来说,就是给目标文件起别名。
-
文件属性中的硬链接数表示与文件inode关联的文件名的数量。每创建一个硬链接,硬链接数就+1。
-
当我们删除文件时,如果文件的硬链接数大于1,就将硬链接数-1。如果文件的硬链接数等于1,才真正删除这个文件。
硬链接的作用:为目录文件取别名。
-
.和..其实就是目录文件的硬链接。.表示当前目录,..表示上级目录 -
新创建的普通文件只有1个文件名与其inode关联,因此硬链接数为1。
-
新创建的目录文件硬链接数为2。与其inode关联的文件名有:目录名,目录中的当前目录
. -
在目录中每创建一个子目录都会使硬链接数+1,这是因为在每一个子目录中都有一个上级目录
..
小技巧:不打开目录,只通过目录的硬链接数就能知道目录中有多少个子目录。用硬链接数-2即可。
unlink:用于删除普通文件的系统调用,实际是解除文件名和inode的链接关系

提示:unlink同时也是一个系统命令,可以用来删除一个普通文件。
相关文章:
【基础IO】文件系统 {磁盘的物理结构,存储结构,逻辑结构;CHS 和 LBA 寻址方式;磁盘分区和块组;文件inode;软硬链接}
文件系统 文件分为: 内存文件:被进程打开的文件,文件被加载到内存中供进程快速读写。磁盘文件:没有被打开的文件,保存在磁盘上。磁盘文件被分门别类的存储和管理,用于支持更好的存取。 提示: …...
全角字符和半角字符
全角字符的由来 全角符号是双字节中文编码的历史遗留问题。当年在纯文本的界面中,为了让西文和中日韩的方块字对齐,就让西文字母、数字和标点也占用一个汉字的视觉空间,并使用 2 个字节存储。后来,其中的一些全角字符因为比较有用…...
【java】【经验】java: 错误: 不支持发行版本 6
前言:配置过maven之后,发现原来的一些项目运行提示java: 错误: 不支持发行版本 6或者java: 错误: 不支持发行版本 5,主要原因:是因为项目使用的Java版本和安装的Java版本不符合 目录 1 设置项目java版本 2 设置模块版本 3 set…...
Spring Boot3.0(四):Thymeleaf 使用详解
Thymeleaf 介绍 简单说,Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以…...
杨辉三角【Java二维数组】
这个代码中,我们定义了一个二维数组nums来存储杨辉三角的每一个数字。在for循环中,我们初始化每一行的第一个和最后一个数字,并且根据上一行的数字来计算出中间的数字。 接着,我们使用两个嵌套的for循环来输出杨辉三角。第一个循…...
解决SpringBoot服务返回数据存在$ref $.data等相关问题
1、场景 在日常的开发中,我们数据接口返回数据使用了FastJson序列化数据,当返回一个数据list时候出现" r e f " " ref" " ref"".data" 等类似乱码一样的数据,当时我比较匪夷所思,我写…...
【iOS安全】开启任意app的WebView远程调试
参考:https://mp.weixin.qq.com/s/bNKxQaVrPaXsZ5BPbsXy7w (来自周智老师的公众号) 概述 Safari 有一个内置的前端调试器, 在iPhone通过局域网或者USB连接MacBook 并启用Safari 远程调试之后,前端调试器默认情况下对…...
windows下 java程序无窗口启动、无窗口启动java -jar
创建一个.bat文件,其他照抄,注意一下你自己的jar包路径和日志路径:例:java -jar C:\data\operation-1.0-SNAPSHOT.jar > C:\data\log.log 2>&1 & ------------文件内容 echo off %1 mshta vbscript:CreateObject(…...
锦程消费金融业务生变:App下架,部分自营信贷暂停
来源 | 镭射财经(leishecaijing) 被誉为消金房抵一哥的锦程消费金融,调整旗下自营信贷业务,展业回归房抵场景。 「镭射财经」独家获悉,锦程消费金融已暂停部分自营小额信贷业务,旗下锦囊贷App已经下架&am…...
Python爬虫在框架下的合规操作与风险控制
大家好!作为一名专业的爬虫代理供应商,我今天要和大家分享一些关于Python爬虫在法律框架下的合规操作与风险控制的知识。随着互联网的发展,数据爬取在商业和研究领域扮演着重要的角色,但我们也必须遵守相关法律和规定,…...
前端页面如何创建表格?table的结构、属性有哪些?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML是什么?⭐ table标签的属性⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏…...
神码ai伪原创工具【php源码】
大家好,小编为大家解答python炫酷烟花表白源代码的问题。很多人还不知道html代码烟花特效python,现在让我们一起来看看吧! 火车头采集ai伪原创插件截图: 目录 前言 环境准备 代码编写 效果展示 前言 Python实现浪漫的烟花特效 现在…...
Linux命令200例:mkdir用于创建目录(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...
C语言内嵌汇编
反编译(二进制文件或者so库) objdump --help objdump -M intel -j .text -ld -C -S out > out.txt #显示源代码同时显示行号, 代码段反汇编-M intel 英特尔语法-M x86-64-C:将C符号名逆向解析-S 反汇编的同时,将反汇编代码和源代码交替显…...
《网络是怎样连接的》(三)
《网络是怎样连接的》(二.2)_qq_38480311的博客-CSDN博客 本文主要取材于 《网络是怎样连接的》 第三章。 简述:本文主要内容是解释 通过网线传输出去的包是如何经过集线器、交换机和路由器等网络设备,最终进入互联网的。 信号…...
SpringBoot 配置文件
一、配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的,比如: 数据库的连接信息(包含用户名和密码的设置); 项目的启动端口; 第三方系统的调用秘钥等信息; 用于发现和定位问题的…...
【K8S】 deployment.yaml文件与Service yaml文件详解
目录 deployment.yaml文件详解Service yaml文件详解 deployment.yaml文件详解 apiVersion: extensions/v1beta1 #接口版本 kind: Deployment #接口类型 metadata:name: cango-demo #Deployment名称namespace: cango-prd #命名空间l…...
GMSL 9296芯片对GMSL链路 插损/回损/线束要求
基于美信 9296的芯⽚ 对于GMSL信号链路上的需求如下: 1:插损 频段2M~3.5GHZ 在3G时需要⼩于-21db。通信速率 6Gbps/187Mbps 频段2M~3.5GHZ 在3G时需要⼩于-18db。通信速率 6Gbps/1.5Gbps 频段2M~2GHZ 在1.5G时需要⼩于-19.5db。通信速率 3Gbps/187Mbps …...
用库造一个list的轮子 【C++】
文章目录 list的模拟实现默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数 迭代器迭代器为什么要存在?const_iteratorbegin和end inserterasepush_back && pop_backpush_front &&pop_frontswap 完整代码 list的模拟实现 默认成员函数 构造…...
java中的,>>,<<位运算
目录 二进制 >>,<< & 二进制 计算机内部使用二进制计数 二进制:在数学和数字电路中指以2为基数的记数系统,以2为基数代表系统是二进位制的,这一系统中,通常用两个不同的符号0(代表零)和…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
