Linux文件系统

1.机械磁盘原理

磁道:盘片旋转时,磁头静止划出的同心圆,类似跑道的环形车道,磁道间有间隙避免干扰。

扇区:每条磁道被等分为扇形区域,是 HDD 最小读写单位,常见容量 512 字节或 4096 字节(4K 扇区)。

柱面:所有盘片同一半径的磁道组成的 “圆柱状区域”,寻址时先定位柱面,减少磁头移动距离。

磁盘写入

磁头会通电产生磁场,主动改变目标扇区磁性涂层的极性,将 0/1 数据记录为磁场状态。 写入后主控会立即校验,确保数据记录准确,避免错误。

机械磁盘写入的定位顺序是 先固定盘面、再固定磁道、最后固定扇区,

但是这是磁盘的物理结构(硬件)

那么逻辑结构呢???

逻辑结构是通过数组实现的

任意一个扇区都有下标
每个盘面2w个扇区
每个盘面有 50 个磁道
每个磁道 400 个扇区

那么我们就可以开一个2w空间的数组

每400个空间为一个磁道

每50个磁道为一个盘面

这样我们磁盘的物理结构和逻辑结构实现了映射

那么磁盘的空间这么大是怎么管理的呢

我们假设这个磁盘有200个g

那么怎么管理

答案是分治

200个g我们可以分别分成50个4个g去管理

如果4个g也觉得太大难管理怎么办???

那就每4个g再分成5个1g去管理

依次类推

我们把很大一个空间  分成很多小空间去管理

每个空间管理方法 大致是一样的

这和磁盘划分很多个扇区本质上不就是映射关系

2.文件管理

我们来看每个小空间是怎么管理的

Data blocks 用来存文件的内容

inode Table  用来存文件的属性

Block Bitmap   用来标记这个block有没有被使用

inode Bitmap  用来标记这个inode有没有被使用

Group Descriptor Table 每个组描述符对应一个块组,

记录: 该块组的 Block Bitmap(块位图) 起始块号(用于跟踪数据块的空闲 / 占用状态)。

该块组的 inode Bitmap(inode 位图) 起始块号(用于跟踪 inode 的空闲 / 占用状态)。

该块组的 inode Table(inode 表) 起始块号(存储该块组所有 inode 的结构)。

该块组的空闲块数、空闲 inode 数等资源统计信息。

Super Block

它是文件系统的 **“全局元数据中枢”**,存储整个文件系统的核心配置与状态信息,是文件系统识别和运行的关键。

存储内容 文件系统基本参数:总块数、总 inode 数、块大小(如 1KB/2KB/4KB,决定磁盘空间分配的粒度)、每个块组的块数。

状态与时间戳:挂载时间、最后一次写入时间、最后一次磁盘检查时间

容错与标识:超级块的备份位置(在多个块组中备份,防止单点故障)、文件系统 “魔数”(如 Ext2 魔数 0xEF53,用于识别文件系统类型)。

所以为什么我们u盘拷贝的时候需要很多时间

但是实际删的时候很快

本质上真的删了吗

没有 只是把要删的内容对应的block bitmap和inode bitemap置为0了

Linux系统中,一个文件,一个inode。

每一个inode都有自己的inode编号(inode的设置,是以分区为单位的,不能跨分区)
inode表示文件的所有属性,文件名,并不属于inode内的属性!

因为如果文件名属于innode的属性 inode的属性我们是先找到innode才能找到文件名

但是对用户来说 压根不知道inode 基本都是用文件名去找inode 通过inode找到文件的属性和内容

这也是为啥同一个目录下为啥不能有同名文件

因为我们是通过文件去找inode 如果有同名文件 那么我通过这个文件名去找哪个inode呢?

目录本质是也是文件也有自己的inode

目录的核心数据就是 “文件名 + 对应 inode 号” 的映射列表,无其他文件元数据。

映射中还包含两个特殊条目:. 对应当前目录的 inode 号,.. 对应父目录的 inode 号。

访问文件时,系统先通过目录找到文件名对应的 inode 号,再通过 inode 号读取文件的实际数据和元信息(权限、大小等)。

我们可以可以通过ls -di

ls-di

查看目录的inode 

我们要查看当前目录下文件的inode可以直接ls -i

ls -i

目录不直接存储文件内容,也不存储 inode 的完整元数据(如文件大小、修改时间)—— 这些元数据存于inode中;

目录本身也有自己的inode(记录目录的元数据:如目录大小、创建时间、所属用户组等),系统通过目录的 inode 找到目录文件的存储位置,再读取其中的 “文件名 - inode 映射”。

了解这些

我们对以前的一些问题有了更深刻的了解

1.为什么同一个目录下不能有同名文件 

如果同一目录下出现同名文件,相当于映射表中出现了重复的 “键(文件名)”,系统无法通过该文件名唯一确定对应的 inode,会导致文件识别冲突。

因此,文件系统强制要求同一目录下文件名必须唯一。

2.没有 权限w,我们无法创建文件 

创建文件时,需要向目录的 “文件名→inode 映射表” 中添加一条新记录(即创建一个新的目录项,关联新文件的文件名和 inode)。

w 权限控制的是 **“修改目录内容” 的能力 **(包括添加、删除目录项)。

如果目录没有w权限,就无法修改这个映射表,自然无法添加新的文件名 - inode 映射,也就无法创建文件。

3.没有 权限x,我们无法查询文件 

“查询目录中的文件” 本质是读取目录的 “文件名→inode 映射表”,获取有哪些文件名及其对应的 inode。

r 权限控制的是 **“读取目录内容” 的能力 **。

如果目录没有r权限,就无法读取这个映射表,也就无法知道目录里有哪些文件,即无法查询。

4.没有 权限r,我们无法进入这个

x 权限是 **“执行目录” 的权限 **(与进入目录的操作强相关)。

虽然它不直接操作 “文件名→inode 映射表”,但 “进入目录” 是后续基于目录映射关系访问文件的前提(比如进入目录后才能通过文件名找 inode 来打开文件)。

如果目录没有x权限,系统会阻止 “进入目录” 的操作,自然也无法基于目录的映射关系去访问其中的文件。

3.软链接和硬链接

ln -s file1 file1_soft  #软链接
ln file2 file2_hard     #硬链接

我们首先要知道上图文件属性1的那一列代表的是文件的硬链接数量(看下图同样可以验证)

我们可以观察到

硬链接的inode和原文件相同 属于同一个文件

但是软链接的inode和原文件不同 不属于同一个文件

软链接存放的是原文件的路径 我们可以通过代码测试

比如这个地方 我们向log.txt软链接的文件写入“hello soft_link” 但是实际我们还是写入到log.txt

换言之

硬链接是不同文件名用同一个inode本质是同一个文件

但是软链接是存放的是源文件的路径

软链接应用场景:

最经典的我们windos电脑上用的是就是快捷方式

我们桌面上的一个个软件图标就是快捷方式 也就是软链接

不然的话我们每次打开一个软件 要用他的位置 也就是C盘那么长的路径很不方便

硬链接应用场景:

. 是目录自身的硬链接,.. 是父目录的硬链接,二者均符合硬链接 “共享 inode、不跨文件系统” 的核心特征。

在 Linux 文件系统中,目录的 “硬链接数” 由两部分组成,这就是 hard_test 硬链接数为 2 的原因: 第一部分:目录自身的 .(当前目录的硬链接,指向目录自己)。

第二部分:父目录中指向它的 ..(父目录里的硬链接,关联到 hard_test)。

也正是如此我们cd ..才能找到上一层目录

思考:目录可以加硬链接吗

不可以 因为这样会造成循环链接

但是目录的. 和..这两个编译器做出特殊处理会专门维护

所以不会造成循环链接

但是对于用户来说是不可以的

哪怕是root用户也不行

硬链接相当于智能指针的引用计数 只有当引诱计数为1的时候才会把文件删除

目录可以创建硬链接吗

不可以 这会导致循环链接

编译器对.和..两个硬链接做了特殊处理 这两个硬链接不会导致循环链接

Linux 中,我们的每一个进程,打开的每一个文件都要有自己的 inode 属性和自己的文件页缓冲区
 操作系统如何管理内存 能看到内存的物理地址的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值