Bootstrap

【Linux】文件系统

🌈前言

本篇文章进行操作系统中文件系统的学习!!!


🌷1、磁盘的组成

我们之前所学的东西,都是在内存中的,现在我们要将视角从内存中迁移到“磁盘”上!!!

  • 文件在内存中打开时,不是磁盘中的所有文件都被打开,没有被打开的依然在磁盘静静躺着

  • 磁盘中有大量的文件,这些文件非常多, 非常杂乱,磁盘要对其进行管理

  • 文件系统:磁盘级别的文件管理,本质工作就是管理文件,用于明确磁盘或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法

  • 它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取和删除


🍡1.1、磁盘的物理结构

机械磁盘是我们计算机上唯一的一个机械设备,现在大部分电脑用的都是固态硬盘(SSD)

在这里插入图片描述

在这里插入图片描述


🍢1.2、磁盘的存储结构

磁盘的存储结构:

  • 盘片:盘片有两个盘面,每个表面都涂有磁性材料,磁性材料是用来保存二进制数据的,每个磁盘的两个表面都能够存储数据

在这里插入图片描述

  • 磁头:硬盘读取数据的关键部件,它的主要作用就是将存储在硬盘盘片上的磁信息转化为电信号向外传输,而它的工作原理则是利用特殊材料的电阻值会随着“磁场变化”的原理来读写盘片上的数据

  • 一个盘面,只有一个磁头!!!

盘片有磁性,磁性分为NS极,磁头改变NS极,就是改变了二进制01


  • 磁道和扇区:每个盘片被划分为一个个磁道(一个个半径不同的同心圆环),每个磁道又划分为一个个扇区(磁道上的一个弧段),扇区是磁盘的最小存储单元,通常是512字节

在这里插入图片描述
在这里插入图片描述

  • 柱面:所有盘面中半径相同的磁道组成柱面

在这里插入图片描述

OS是如何对磁盘进行读写数据的呢???

  • 读写磁盘的时候,磁头找的是某一个面(盘面)的某一个磁道(柱面,距离圆心的半径)的某一个扇区(磁道上的一段扇形存储单元)

  • 这种寻找方式,叫做:CHS(Cylinder Head Sector)寻址

  • 只要我们能找到磁盘上的盘面,柱面(磁道)和扇区,就能找到一个存储单元

在这里插入图片描述


🍣1.3、磁盘的逻辑结构

我们以前学英语,都是把录音带放到录音机里面来跟着学习的!!!

  • 录音带里面的带子存储着数据,该数据可以通过录音机解析播放出来

  • 录音带里面的带子可以拉出来就是一条直线的带子(线性存储数据),也可以拉回去

在这里插入图片描述

磁盘里面是通过以扇区为单位进行数据存储的,磁盘里面有无数个很小的磁铁

  • 磁盘也可以将其看作是一个线性的结构,将磁盘的管理转化成对线性结构的管理

  • OS对磁盘进行IO磁盘读写时,是按4K字节为单位进行访问的

  • OS可以将线性结构的下标(LBA逻辑块地址)转化成CHS进行磁盘寻址

LBA转换成CHS的公式:#c = #lba / (S*H)、#h = (#lba/S) % H、#s = (#lba%S) + 1

  • / 是整数除法
  • % 是取整数除法中的余数
  • #c、#h、#s分别是磁柱、磁头、扇区的编号
  • #lba是逻辑区块编号
  • H=heads per cylinder,每个磁柱的磁头数
  • S=sectors per track,每磁道的扇区数

在这里插入图片描述


🌸2、文件系统

🍤2.1、文件系统的结构

Linux ext2文件系统,下图为磁盘文件系统图

在这里插入图片描述

  • 磁盘是典型的块设备,硬盘分区被划分为一个个的block

  • 磁盘是典型的块设备,硬盘分区被划分为一个个的block

  • 例如:mke2fs的【-b】选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的!!!

Linux下文件的内容和属性是分开存储的,内容被保存到Data blocks、属性被保存到inode table

  • 文件的内容是会发生改变的(不断增多),而属性是不变的(稳定的),它是定长的!

  • 文件系统设计时为了减少它们之间的关联性,就分开进行存储

在这里插入图片描述

文件系统中各个块中的作用:

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成

  • Super Block(超级块):存放文件系统本身的结构信息,记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

  • GDT(Group Descriptor Table): 块组描述符,描述块组属性信息

  • i节点表(inode table):存放文件属性,如:文件大小,所有者,最近修改时间等,inode table里面还会有一个inode编号和block[],用来与对应的Data Block建议联系!!!

  • inode table其实还存储了一个blocsk编号 – 块编号,用来与数据块建立关联的!
  • inode编号与inode是不同的概念,inode里面保存着inode编号,Linux是通过inode编号标识文件的

在这里插入图片描述

  • 数据块(Data blocks):存放文件内容

  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用

使用stat指令可以查看对应的inode信息(文件的属性)

[lyh_sky@localhost lesson22]$ ls
dir  file.txt
[lyh_sky@localhost lesson22]$ stat file.txt 
  文件:"file.txt"
  大小:0         	块:0          IO 块:4096   普通空文件
设备:fd00h/64768d	Inode:34316581    硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ lyh_sky)   Gid:( 1000/ lyh_sky)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2022-11-28 23:25:40.573487092 +0800
最近更改:2022-11-28 23:25:40.573487092 +0800
最近改动:2022-11-28 23:25:40.573487092 +0800
创建时间:-

🍥2.2、inode如何与数据块建立联系

一个inode table(文件的属性)如何与属于自己的文件内容建立联系呢?

inode table其实是一个结构体:

  • 这个结构体里面有一个保存block编号的数组,这个数组就是block[]

  • 要找到文件,必须先找到文件的inode编号,OS帮我们完成

  • OS可以通过inode表找到要打开文件的inode编号,通过inode编号就可以确定在哪个块组(group block)中,并且可以找到对应的block编号,通过block编号,就能找到对应的文件数据

Linux下,底层实际是通过inode编号来标识文件的!!!

struct inode
{
	// 文件的属性
	...
	// [0, 11]:直接保存的就是该文件对应的block编号
	// [12, 14]:指向一个Data block,但是这个Data block不存储有效数据,而是保存该文件所使用的其他块的编号
	block[15];
};

注意:

  • 一个Data block也可以保存块的编号,一个编号4个字节,可以保存4098 /4 = 1024个编号

  • 文件名也是属性,但是inode里面并不保存文件名!!!

🍦2.3、文件名与目录的关系

为什么文件名不保存在inode中呢???

  • 目录也是一个文件,它也有“内容(block)”和“属性(inode)”

  • 目录的内容中保存着文件名和inode编号的映射关系,通过文件名可以找到indoe编号!

  • 目录的属性就是我们熟知那几种…

  • 目录下不能创建同名文件,文件名本身就是一个具有Key值的东西!!!

[lyh_sky@localhost lesson22]$ ls
dir  file.txt
[lyh_sky@localhost lesson22]$ stat dir
  文件:"dir"
  大小:6         	块:0          IO 块:4096   目录
设备:fd00h/64768d	Inode:67355290    硬链接:2
权限:(0775/drwxrwxr-x)  Uid:( 1000/ lyh_sky)   Gid:( 1000/ lyh_sky)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2022-11-27 18:42:07.249357730 +0800
最近更改:2022-11-27 18:42:07.249357730 +0800
最近改动:2022-11-27 18:42:07.249357730 +0800
创建时间:-

当我们创建一个文件时,OS做了什么???

  • 建立文件名和inode编码,找到自己所处的目录,根据目录的inode表(属性),找到目录的Data block(内容),建立文件名和inode编号的映射关系,并且写入到目录的数据块中!!!

  • 把块位图和inode位图的某个比特位置为1!!!

当我们删除一个文件时,OS做了什么???

  • 首先找到自己所处的目录,根据目录的inode找到目录的数据块,通过目录的数据块找到文件的inode,在inode中找到inode编号,就可以确定在哪个group block中

  • 将这个文件对应块位图和inode位图的bit置为0,最后将该文件所处目录中的Data block中的文件名和inode编号的映射关系去掉即可,这样就完成了删除!!!

  • 在各个OS中下载文件都要很久,删除却很快,其实OS只进行了“伪删除”!!!


🍧2.4、软硬链接

🍨2.4.1、软链接

软硬链接的区别是什么???

软链接:软链接是一个独立文件,有自己独立的inode和inode编号

  • 软链接是通过名字引用另外一个文件(不同的文件名可以执行引用的另外一个文件)

  • 使用 ln 【-s】file1 file2 – 创建软链接

  • 注意:file1必须是需要链接的原文件,file2是建立新的软链接文件名

[lyh_sky@localhost lesson22]$ ls
dir1  test  test.cxx
[lyh_sky@localhost lesson22]$ ./test 
hello world
// 创建软连接文件
[lyh_sky@localhost lesson22]$ ln -s test Test
[lyh_sky@localhost lesson22]$ ls -ali
总用量 20
 34291532 drwxrwxr-x.  3 lyh_sky lyh_sky   58 1129 17:15 .
102102786 drwxrwxr-x. 21 lyh_sky lyh_sky 4096 1127 18:41 ..
 67905798 drwxrwxr-x.  3 lyh_sky lyh_sky   18 1129 10:44 dir1
 34669584 -rwxrwxr-x.  1 lyh_sky lyh_sky 8968 1129 17:13 test
 33555038 lrwxrwxrwx.  1 lyh_sky lyh_sky    4 1129 17:15 Test -> test
 33555013 -rw-rw-r--.  1 lyh_sky lyh_sky  106 1129 17:13 test.cxx
[lyh_sky@localhost lesson22]$ ./Test 
hello world
  • 软链接是Linux下的快捷键,比如:Windows上桌面的图标都是一个软链接文件

  • 我们删除Windows上的图标,只不过是删除了一个软链接文件,没有真正的删除文件
    在这里插入图片描述

Linux下创建快捷方式 – 对可执行文件建立软链接(指向可执行文件)

[lyh_sky@localhost lesson22]$ ls
dir1
[lyh_sky@localhost lesson22]$ tree dir1/
dir1/
└── dir2
    └── dir3
        ├── test
        └── test.cxx

2 directories, 2 files
[lyh_sky@localhost lesson22]$ ln -s ./dir1/dir2/dir3/test Test
// Test就是新创建的可执行文件的快捷方式!!!
[lyh_sky@localhost lesson22]$ ls -ali
总用量 4
 34291532 drwxrwxr-x.  3 lyh_sky lyh_sky   30 1129 17:27 .
102102786 drwxrwxr-x. 21 lyh_sky lyh_sky 4096 1127 18:41 ..
 67905798 drwxrwxr-x.  3 lyh_sky lyh_sky   18 1129 10:44 dir1
 33555013 lrwxrwxrwx.  1 lyh_sky lyh_sky   21 1129 17:27 Test -> ./dir1/dir2/dir3/test
[lyh_sky@localhost lesson22]$ ./dir1/dir2/dir3/test 
hello world
[lyh_sky@localhost lesson22]$ ./Test 
hello world

既然软连接文件是一个独立文件,inode也是独立的,那么该文件的内容是什么呢?

  • 软链接文件中内容保存的是指向文件的所在路径

🍩2.4.2、硬链接

硬链接:硬链接不是一个独立的文件,他和目标文件使用的是同一个inode

  • 硬链接是通过inode引用另外一个文件(inode编号相同)

  • 使用 ln file1 file2 – 创建硬链接

[lyh_sky@localhost lesson22]$ ls
file.txt
[lyh_sky@localhost lesson22]$ ln file.txt file
// 注意查看它们之间的inode编号是一样的
[lyh_sky@localhost lesson22]$ ls -ali
总用量 
 34291532 drwxrwxr-x.  2 lyh_sky lyh_sky   34 1129 23:27 .
102102786 drwxrwxr-x. 21 lyh_sky lyh_sky 4096 1127 18:41 ..
 33554501 -rw-rw-r--.  2 lyh_sky lyh_sky    0 1129 23:26 file
 33554501 -rw-rw-r--.  2 lyh_sky lyh_sky    0 1129 23:26 file.txt

硬链接不是一个独立文件,那是什么呢?

  • 硬链接就是单纯的在Linux指定的目录下,给指定文件新增文件名和inode编号的映射关系!

  • 本质就是改文件inode属性中的计数器,标识有几个文件名与我的inode编号建立了映射关系!

  • 简而言之,就是有几个文件名指向了我的inode(文件本身)(inode编号就是一个“指针”的概念)

当我们创建普通文件时,硬链接为什么默认是1呢?

  • 因为普通文件的文件名本身就和自己的inode编码的映射关系只要一个!
[lyh_sky@localhost lesson22]$ touch file.txt
[lyh_sky@localhost lesson22]$ ls -li
总用量 0
34316595 -rw-rw-r--. 1 lyh_sky lyh_sky 0 1129 23:44 file.txt

硬链接的作用:

  • 可以进行路径间的切换,比如:目录中的隐藏文件(点和点点)

  • 点和点点的作用分别是保存了目录当前路径和到目录的上一个路径

在这里插入图片描述

;