目录
3.group descriptor block(块组描述符)
前面我们学习到了一个被打开的文件,那如果一个文件没有被打开呢??
我们可以知道它将在磁盘中进行存储,可以通过如下角度进行思考:
- 路径问题
- 存储问题
- 获取的问题(属性+文件内容)
- 效率
引出了我们的学习路线:
- 认识硬件--磁盘
- 对硬件进行抽象理解
- 文件系统
1.认识磁盘
1.1 理论
磁盘上存储文件属性+内容
- 文件的内容--数据块
- 文件属性--inode
sum: linux 文件在磁盘中存储,是将属性和内容分开存的
当下磁盘存储的运用场景
1.现在电脑上装的都是ssd了
- ssd代表固态硬盘(solid state drive),是一种使用闪存芯片作为存储介质的电脑存储设备。目前个人电脑或工作站等设备普遍采用ssd作为主要的存储介质。ssd相比传统的机械硬盘(hdd,hard disk drive)有更快的读写速度、更低的功耗和更小的噪音,同时因为没有机械运动部件,所 以更耐震动,故障率也相对较低。
2.公司服务器长时间存储还是使用磁盘,进行存储分级:冷热分离
- 在公司或企业的服务器存储解决方案中,尽管ssd在性能上有明显优势,但出于成本和容量考虑,长时间存储大量数据通常还是使用机械硬盘(hdd)。hdd的成本较低,存储容量较大,适合用来存储那些不经常访问但需要长期保存的数据。
- 存储分级:这是指根据数据的访问频率和重要性将存储分为不同的级别。通常分为热存储(hot storage)和冷存储(cold storage)。
意义:优化了成本和性能,确保经常访问的数据能够快速访问,而不常用的数据则以较低的成本进行存储
- 磁盘是一个机械设备:
-
- 这里的“磁盘”通常指的是机械硬盘(hdd,hard disk drive),它是由多个机械部件组成的存储设备。在个人电脑或服务器中,尽管还有其他可能包含机械部件的设备(如光盘驱动器、软盘驱动器等),但在现代计算机系统中,机械硬盘往往是唯一的主要机械存储设备。这是因为其他类型的存储设备,如固态硬盘(ssd)、内存条(ram)、u盘等,都不包含机械运动部件。
- 也是一个外设:
-
- “外设”是外部设备的简称,指的是连接到计算机主机的硬件设备,用于扩展计算机的功能。磁盘(如hdd)作为存储设备,通常被视为计算机的外设,因为它位于计算机主机的机箱外部(或者至少是可分离的),并通过数据传输接口(如sata、sas等)与主板连接。尽管它是计算机运行所必需的组成部分,但它并不直接集成在主板上,因此被分类为外设。
1.2 磁盘的物理结构
可以先根据下面的图片,有一个直观的感受
最后一张图的磁盘,类似于三张两面都光的光盘
主轴下面有马达,一秒钟两万转都有可能
- 磁头是一面一个,左右摆动,两个整体移动的,有磁头停靠点
- 磁头和盘面不接触,所以物理上不适用于笔记本,开机状态移来移去,磁头刮花了磁盘,属于硬件问题
- 机械磁盘要在无尘环境下,灰尘落上去就像一座大山,可能会把数据都磨没了
- 所有的数据都在盘片上以二进制存储,磁头通过充放电写入
- 内存掉电易失设备,磁盘永久性存储介质
- 通过充放电/强弱/波,在磁盘上写入 01 数据,像吸铁石的 n s 级
- 高温消磁
- 大型互联网公司淘汰磁盘,国家规定不能数据泄露,磁盘擦除并不完全,局部数据的残留也可以被恢复,磁盘上的影子数据也挺危险的,解决方法:和厂商协商,调用接口去除~
- 磁盘被访问的最基本单元是扇区---大小有可能 512 字节/ 4kb
- 我们可以把磁盘看作由无数个扇区构成的存储介质
3. 第一步:定位一个扇区:哪一面(哪个磁头),哪一个磁道(纵向上形成柱面),哪一个扇区
4. 磁头摆动:定位磁道和柱面的过程
盘片转动:定位扇区的过程
5. 软件寻址,相关内容还是尽量放在一起,因为运动越少,效率越高
chs 寻址
三个参数:cylinder(柱面)header(磁头)sector(扇区)==》chs 寻址方式
1.3 磁盘的逻辑抽象结构
我们可以类比于磁带,将扇区线性来看
将一个圆延展开来进行扇形分区(struct 来实现):存储 lba 信息
可以借助上图了解,基于对磁盘的理解建模的过程
磁盘对扇区一视同仁的划分,管理好了 10 g 的一个扇形,就能管理好 800 g--分治的思想 化大为小
2. inode 结构
1.boot block 启动块
文件系统不仅需要存储文件内容,还需要存储文件的元数据,如文件大小、所有者、权限等。这些元数据存储在索引节点(inode)中。
结合上部分,先来看一下这个 10g 的分区
在linux文件系统中,boot block(启动块)是一个非常重要的组成部分,尤其是在传统的磁盘驱动器中。boot block位于磁盘的最前端,通常是磁盘的第一个扇区,也被称作主引导记录(master boot record, mbr)。
如何查看boot block
尽管查看boot block的内容通常不是日常管理任务的一部分,但如果需要,可以使用特定的工具来进行。例如,使用dd
命令可以从磁盘复制第一个扇区:
sudo dd if=/dev/sda of=mbr bs=512 count=1
这将把磁盘/dev/sda
的第一个扇区(即boot block)复制到文件mbr
中。随后,可以使用十六进制编辑器或特定的工具来查看该扇区的内容。
2.super block(超级块)
超级块是文件系统中的一种特殊的数据结构,它包含了整个文件系统的全局信息。这些信息包括但不限于:
超级块对于文件系统的正确操作至关重要。如果超级块损坏,可能导致文件系统无法被识别或挂载。大多数文件系统都会在不同的位置保存多个超级块副本,以防止单点故障。
3.group descriptor block(块组描述符)
在某些文件系统中,如ext2、ext3和ext4,文件系统被分割成多个块组,以提高性能和简化管理。每个块组都包含一个块组描述符,该描述符包含了该块组的一些重要信息,例如:
块组描述符使得文件系统能够快速访问每个块组的状态信息,而无需每次都访问超级块。这对于大型文件系统尤其有用,因为它减少了对超级块的访问频率,提高了性能。
总结一下:
- super block:包含整个文件系统的全局信息,如总块数、总inode数等。
- group descriptor block:针对文件系统中的每个块组,包含该块组内的数据块和inode的数量和位置等信息。
这些信息对于文件系统的管理和维护至关重要,确保了文件系统能够正确地处理文件和目录的存储、检索和删除等操作。
4.data blocks (数据块)
数据块是文件系统中用于存储文件实际内容的基本单位。每个文件的内容都分布在磁盘上的一个或多个数据块中。数据块的大小取决于文件系统的配置,通常为1024字节、2048字节或4096字节等。
5.inode table (inode表)
inode是文件系统中的一个数据结构,用于存储文件的元数据。每个文件都有一个与之对应的inode。inode表则是inode的集合,它包含了文件系统中所有inode的列表。
stat
用法查看文件具体信息
stat [option]... file...
- file:可以是一个文件名或目录名。
- option:可以是多个选项,用于定制输出信息。
选项
使用场景
- 文件调试:当需要了解文件的具体信息时,比如权限、所有者等。
- 脚本编写:在编写 shell 脚本时,可以利用
stat
获取文件的详细信息,进行条件判断或动态生成文件列表。 - 系统监控:监控文件的访问、修改或状态改变时间,用于安全审计或性能分析。
stat
命令是 linux 系统管理员和开发者不可或缺的工具之一,它提供了文件系统的深入视图,有助于更好地理解和管理文件和文件系统。
会显示 acm(时间戳)
下面解释一下文件的三个时间:
示例
实现操作的融会贯通:
1. 查看文件example.txt
的inode信息
stat example.txt
这个命令将显示文件example.txt
的inode信息,包括inode编号、文件大小、权限等。
2. 查找文件example.txt
的inode编号
回顾:ls -l
做的就是读取存储在磁盘上的文件信息,然后把它们显示出来
ls -i example.txt
这个命令将显示文件example.txt
的inode编号。
3. 查看文件example.txt
的内容
cat example.txt
这个命令将输出文件example.txt
的内容到标准输出。
4. 假设需要直接访问数据块200(通常不建议这样做,因为它绕过了文件系统)
首先,需要确定文件系统的设备文件,比如/dev/sda1
。然后使用dd
命令读取数据块。以下是一个示例命令,假设每个数据块大小为4096字节,数据块200的偏移量计算方式为200 * 4096
。
dd if=/dev/sda1 bs=4096 skip=200 count=1 of=data_block_200.bin
这里:
5. 假设需要修改文件权限
chmod 644 example.txt
这个命令将设置文件example.txt
的权限,使得所有者有读写权限,组和其他用户只有读权限。
6. 假设需要修改文件所有者
chown user:group example.txt
这个命令将更改文件example.txt
的所有者为user
,所属组为group
。
注意:
- 直接访问数据块的操作通常不应该在正常操作中进行,因为它可能破坏文件系统结构。
- 在执行这些操作之前,请确保备份重要数据,避免数据丢失。
- 这些命令可能需要root权限才能执行。
- 文件系统的具体实现可能会有所不同,上述命令是在一般情况下的示例。
总结
通过这种方式,文件系统可以有效地管理文件的内容和元数据,同时也提供了灵活的方式来处理文件的存储和检索。
6.bitmap 位图
inode bitmap (属性)位图:
比特位的内容 inode 是否有效的
block bitmap (文件内容)位图
和块号联系起来,申请和释放有关,内容块是否存在
思考:
3.文件系统
3.1 增/删/查/改 一个文件
❗ 思路:
linux 系统中,一个文件,一个 inode ,每个 inode 都有自己的编号(不能跨分区),文件名不属于 inode 内的文件属性!
通过路径能确定 200g ,存到 10g 的块里面了,找组后,在 inode map 里面找空的块
把文件误删了,是把位图删了,删除=允许被覆盖
✔️ 步骤:
系统会执行一系列底层操作来完成这些任务。下面是每个操作涉及的主要步骤:
新建文件
创建一个新文件,操作系统主要会做如下四个操作:
① 存储属性:内核找到一个空闲的结点 (这里是 263466),内核把文件信息记录到其中。
② 存储数据:该文件需要存储在三个磁盘块,内核找到了三个空闲块,300,500,800。将内核缓冲区的第一块数据复制到 300,下一块复制到 500,最后复制到 800……
③ 记录分配情况:文件内容按顺序 300,500,800 存放,内核在 inode 上的磁盘分布区记录了上述块列表。
④ 添加文件名到目录:新的文件名 abc。linux 在当前目录中记录该文件,通过内核将入口 (263466, abc) 添加到目录文件,文件名和 inode 之间的对应关系将文件名和文件的内容及属性链接起来。
删除文件
- 查找 inode:通过文件名找到对应的 inode。
- 释放 inode 引用:减少 inode 的链接计数。
- 删除目录项:从父目录中删除指向该 inode 的条目。
- 回收资源:如果 inode 的链接计数降为 0,则回收 inode 和其关联的数据块。
- 更新文件系统元数据:更新文件系统的其他元数据,比如文件系统的块使用情况。
ls -i 可查看,but 使用者基本不关心 inode ,用的是文件名
3.2 理解目录
目录也是文件,也有自己的 inode ,目录也要有自己的属性
要,该目录下,文件的文件名 和 对应文件的 inode 的映射关系
ll 查看时,先找到目录的 inode, 目录内容中存储了文件的 inode,找到对应文件的 inode,就可以访问文件内容啦,例如说删除文件实际上是删除文件名与 inode 的关联,也就是从目录项中移除该文件名。这个操作需要对目录进行写操作,因为目录项(包含文件名)存储在磁盘上,并且需要被修改。但是我们限制了这一操作
因为想读取,目录不让读,拿什么查找到 inode,还有没有 x 无法 cd,都是通过对目录中 对文件 inode 的访问设置来管理的
往上会一直访问到根目录,相当于是一个递归的实现
dentry 缓存:
- 目录项对象:dentry代表文件系统中的一个目录项,即一个文件或目录的名称与其inode(索引节点)之间的关联。
- 路径解析:当用户或程序请求访问一个文件或目录时,文件系统需要解析路径名,dentry缓存可以快速地定位到对应的inode,从而避免了每次都从磁盘读取目录信息
递归是我们从内部讲起的,就说要一路找上去,实际拿着文件路径从左到右解析就行,因为我们的任何一个文件,在进程内部都有路径,按照路径,应用层是知道文件和路径的
发表评论