当前位置: 首页 > article >正文

Linux文件系统(下)

目录

前言

0.文件的长期存储

1.磁盘如何定位一个扇区

2.虚拟到物理映射

3.分区、分组与inode

4.软硬链接与文件访问


前言

在博主的【Linux文件系统(上)】一文中介绍了有关文件系统在Linux操作系统平台上加载到内存中后是如何进行管理的,本文要介绍的是在磁盘中的文件是如何存储的。

注意:文件系统是管理磁盘上数据读写的重要一环,目前已经有很多成熟的文件管理系统,本文选择以ext2文件系统为例介绍文件系统。


0.文件的长期存储

在高中物理,我们了解到自然界中有一些物质可以磁化且可以长时间保持磁性的物质利用这种物质可以制作一个磁体,磁体具有同性相斥异性相吸引的性质。在计算机中数据最终都会被转化为二进制数据进行存储,一位二进制数只有01两种可能,所以科学家利用磁体的性质制作了磁盘盘片这种可以用来长时间存储数据的介质。给磁盘盘片赋予磁性的是我们的磁头,通过对磁头的通断点来改变磁盘盘片某一部分的极性,就可以实现对磁盘盘片上数据的擦除和写入。

图1        磁盘内部图(图片来源网络)

磁盘的最小的存储单元是扇区,即当我们想要对该扇区中的数据进行修改的时候,需要将整个扇区的内容加载到内存中,传统扇区的大小是512字节(但是现在也出现了4KB扇区的磁盘,感兴趣的读者可自行了解,这不是本文的重点,故不多作介绍)。

1.磁盘如何定位一个扇区

要阐述这个问题,我们先要了解一下磁盘盘片区域划分与名称。

图2        磁盘盘片划分

了解了磁盘盘片的区域划分结构后,那么如何定位一个盘片上的扇区呢?

图3        磁盘概念图

在图1中我们观察右侧的实物图,在图1中包含磁头和摞在一起的磁盘盘片,一个磁盘盘片分为上下两面,每一面都配有一个磁头,磁头与盘片间不接触。将事物图抽象一下就是我们的图3,在图3中可以看到磁臂和机械臂杆,这两者共同作用可以令磁头有一定幅度的摆动,注意所有磁头都是一同摆动的共进退的,磁盘中间的转轴可以令磁盘旋转。所有的磁头一同摆动配合着磁盘的旋转相当于一个柱面,这个时候操作系统选择对应的磁头,就可以定位到对应盘片的扇区。(CHS定位法)

2.虚拟到物理映射

介绍完物理上如何寻找一个扇区,那么在计算机上如何抽象出寻找扇区的逻辑呢?

我们将磁盘中的所有盘片想象成一个线性连续储存结构(数组),该数组的一个下标对应一个扇区。这样对扇区的操作就抽象成了对数组的操作。

如何根据数组下标寻找某个磁盘盘片上的某个扇区(假设数组下标为index):

首先,根据一个盘片容纳数据的总量,可以计算推导出一个盘片包含多少个扇区,我们假设一个盘片可以容纳x个扇区。

int a=index/x;

int b=index%x;

a就是数组中的元素位于哪个盘片,b就是在对应盘片从0开始的偏移量。

前文介绍到了磁盘IO的基础单位是扇区,但是Linux认为一次读取512字节的数据量过小,所以Linux操作系统认为一IO的基本单位是4KB的数据,也就是8个扇区的大小,我们将连续的8个扇区称为一个数据块 。

3.分区、分组与inode

在第一、第二部分主要解释了物理和抽象结构中如何查看定位一个扇区,那么一个文件是如何存储在磁盘上的,为了将数据存储在磁盘上,操作系统需要做哪些工作?

在解释这个问题之前我们可以参考一下我们的Windows平台下的电脑,Windows平台下的图形化界面非常可以非常直观的看到:Windows显示在该电脑上有两块“盘”,可事实真是这样吗?

图4        操作系统分区图

答案是否定的,观察图5不难发现博主的电脑上只有一块SSD,其中对C盘、D盘的描述是基本数据分区,而不是某某磁盘。

图5        SSD空间分配图

实际上一个磁盘,安装后,一定不会被立即使用,其一定会先被进行分区处理,一方面,磁盘中需要装载相应的文件系统,这一部分一般不建议让用户感知到。另外,还可能为恢复文件单独分区,用来存储备份的文件系统等必要的文件,以确保文件系统的发生错误时,可以从恢复区中恢复文件系统。

对于我们用户能接触到的所谓的C盘、D盘其实也是分区,我们称这些分区叫做基本数据区,对于基本数据区,还要对其进行分组处理。而后在所分的块组存储元数据和数据。

图6        分区、分组、块组关系图

关于分组策略的优点、元数据概念、数据存储的解释:

Ⅰ、元数据(inode)

元数据指的是对数据属性、来源、关系等方面信息的集合。在文件系统中,文件的权限、创建时间、修改时间访问时间等信息就是元数据的一部分。

元数据存储在图6所示的inode Table中,通过inode Bitmap来查看标识inode Table某一位置是否被使用。注意:inode在分区内唯一,且文件名不属于元数据。

Ⅱ、数据的存储

一个在计算机上存储的文件包括文件内容和属性,文件的属性也就是我们说的元数据,文件的内容就是我们说的数据,数据存储在Data blocks中,Block Bitmap用来表示对应的数据亏块是否被使用。

对数据进行删除时只需要将对应的inode bitmap和block bitmap对应的位置0即可。

Ⅲ、分组策略的优点:

①独立性:ext系列文件系统的块组与块组相对独立,每个块组独立的管理自己的元数据和数据信息。

②固定结构:每个块组都有相似的管理结构,比如每一块组都含有inode、block和其管理信息,这使得在为块组空间的开辟和管理更加有序,比如需要写入数据时,操作系统可以先查找空闲的inode和数据块。

③局部性原理的体现:文件系统在存储数据的时候会尽量将相关性强的文件存储到一个块组中,这样当操作系统读取数据的时候可以减少磁头在盘片上的摆动耗时,进而提高文件访问效率。

④冗余和恢复机制:虽然每个块相对对立,但是在每个块间存在一些联系和冗余机制,文件系统可能会在一些块组中存储一下重要的元数据,保证磁盘在一定限度内损坏时文件系统的恢复能力,这样的数据通常包含在Group Descriptor Table中。

在图6中还有两个块的组成部分没有谈,它们分别是Super block和Group Descriptor Table。

Super block通常位于文件系统的第一个块组上,存储着有关文件系统本身的结构信息,其主要包含的信息有:整个分区的inode、block的总量、使用情况、剩余情况、最近一次写入时间、最近一次挂载时间等,这一部分数据存在的意义是引导文件系统读取数据。如果这一部分数据发生损毁,可以说文件系统就被损毁了。

Group Descriptor Table中存储了Block Bitmap和inode Bitmap的存储位置信息和其所在块组的inode、bolck的使用情况等信息。

4.软硬链接与文件访问

用户创建的文件一定位于基本数据区,我们可以将某一分区视作一个目录,在这个目录下创建一个文件,这个文件一定会有一个文件名,在第3部分中讲解到inode在某一分区内唯一,所以将创建的文件名与某一inode相绑定,就创建了一个文件,对文件的读写,其实就转换成了对文件名绑定的inode进行读写。

试想一下,在你的Windows电脑上有一些文件的快捷方式,这些快捷方式可以让我们快速访问到目标文件,这个过程就与软连接类似(软连接是支持跨文件系统的而快捷方式不支持跨文件系统访问),软连接创建的文件是一个独立的文件,其有对应的inode。

硬连接不具有一个独立的inode,其与链接的文件同用一个inode,硬连接相当于在原文件的访问额外开辟了一个通道,此时对链接的文件的引用计数加1,当删除文件时,只有当链接的引用计数为0时才会擦除磁盘上的数据。

ln -s [链接文件] [生成的链接文件名]     //软连接
ln [链接文件] [生成的链接文件名]       //硬连接 
图7        查看软硬连接inode差异
图8        利用软硬连接文件向对应文件中写入数据        

http://www.kler.cn/news/305837.html

相关文章:

  • 红黑树前语
  • 存储课程学习笔记5_iouring的练习(io_uring,rust_echo_bench,fio)
  • Unity2D游戏入门
  • [项目][WebServer][解析错误处理]详细讲解
  • JVM字节码
  • MySQL通过备份恢复的方式搭建主从/重建从库
  • 删除Cookie原理
  • 【Unity】在Unity 3D中使用Spine开发2D动画
  • Java | Leetcode Java题解之第404题左叶子之和
  • SQL中的外键约束
  • 获取某宝拍立淘API接口:深度学习图像实现匹配和检索
  • WebGL系列教程八(GLSL着色器基础语法)
  • Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改
  • USB组合设备——鼠标+键盘(两个接口实现)
  • OPENAIGC开发者大赛企业组AI黑马奖 | AIGC数智传媒解决方案
  • iPhone 16即将推出的5项苹果智能功能
  • Computer Vision的学习路线
  • 坐牢第三十八天(Qt)
  • Android SDK和NDK的区别
  • SSH软链接后门从入门到应急响应
  • Redis的常见问题
  • 鸿蒙交互事件开发07——手势竞争问题
  • 速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读
  • 前端开发的观察者模式
  • K8s 之Pod的定义及详细资源调用案例
  • NAT技术
  • 人工智能辅助汽车造型设计
  • 健身管理|基于java的健身管理系统小程序(源码+数据库+文档)
  • 数据结构与算法图论 并查集
  • 【Linux】调试和Git及进度条实现