Linux文件系统和软硬链接


文件操作必须要先打开文件,然后才能使用文件操作函数对文件进行操作。没被打开的文件都是在硬盘上呆着的,要对没有被打开的文件进行管理就需要用到文件系统。
了解文件系统之前我们需要知道我们的文件存储在硬盘上,那么硬盘是什么样子呢?

现在笔记本大多数使用的硬盘都是ssd了,ssd读写速度快,体积小重量轻,这些对于移动设备来说都是优点,ssd的缺点就是读写次数是有限了,读写次数达到上限之后ssd就会被击穿,数据会丢失。

而现在企业中使用的大多数是磁盘,hd,磁盘的优点是性价比高,也就是便宜,并且使用寿命长,数据保存的比较安全。缺点就是读写速度慢,因为磁盘是机械结构,并且还是外设,磁盘不能在上电状态进行移动或者受到撞击这些都可能导致磁盘损坏。

磁盘

物理结构

image.png
磁盘的组成:

  1. 盘面,一个盘有两个面每个面都是可以存储数据的。磁盘启动后盘面会按照一个方向高速旋转每秒几千转甚至上万转。
  2. 磁头,磁头由磁头臂控制,磁头臂由一个马达控制使得磁头在盘面上左右摆动,每一个盘面都对应着一个磁头,磁头和盘面是没有接触的,但是靠得很近。所有盘面的磁头都是同步摆动的。
  3. 马达,两个一个控制盘面旋转,另一个控制磁头在盘面上左右摆动。
  4. 硬件电路 + 伺服系统,与文件系统配合管理磁盘上的数据。

磁盘的盘面转速要和磁头读写数据的能力相匹配。

盘面上是怎么会存储上数据的呢?因为计算机只能识别二进制,所以保存在磁盘上的数据也都是二进制数据,也就是在磁盘的盘面上是怎么表示二进制的。
我们可以将磁盘盘面分成无数个细小的存储单元,每个存储单元都是一块小的磁铁,磁头通电通过给盘面的存储单元上磁和退磁,使得存储单元通过有无磁性来表示二进制的01信号。

存储结构

image.png
磁盘这里的存储结构主要是三个部分,磁头,柱面(磁道),扇区。
一个盘面上有多个磁道,每个磁道有多个扇区由此每个盘面就被会分成多个扇区,每个扇区是512byte,虽然有的扇区的大小面积不同,但是为了方便管理一般将扇区的大小设置是统一的大小。

磁盘要对某个扇区写入必定要先找到这个扇区
磁盘定位扇区的方法是,先确定柱面(cylinder),然后定位磁头(head)确定好在那个盘面,最后定位是几号扇区(sector)。所以定位扇区的方法叫做CHS定位法。

通过CHS定位法可以定位磁盘上的任意一个扇区或任意多个扇区。这是磁盘最基本的定位方法。

逻辑结构

文件系统要对磁盘进行管理,管理的核心是先描述再组织,所以肯定得对磁盘的存储结构进行抽象。
image.png
磁盘的一圈圈磁道可以看作是磁带的那一卷,磁带可以通过拉伸把它拉直,那么我们抽象出来讲磁盘上的磁道拉直就变成了一个个扇区组合而成的数组。数组每个元素的大小都是512byte。

对这个逻辑结构再具体一点的抽象,假设磁盘的大小是500GB。
image.png
对磁盘抽象出来的数组可以看作是一个sector arr[n]每个数组元素都是扇区也就是512byte。
将整个数组划分成多个面,每个面可以分成0号到n号磁道,每个磁道又可以分成0号到n号扇区。
所以我们对磁盘的管理就变成了对数组的管理
只要知道了一个扇区的下标,就能推算定位这个扇区,在操作系统内部这个下标,也可以看作是地址被称为,LBA地址(逻辑块地址)。
例如:假设磁盘共有4个盘面,每个盘面有10个磁道,每个磁道有100个扇区,现在一个LBA地址是123,需要定位这个地址表示的扇区。
CHS定位法,123/1000 = 0,所以在第0面,123/100 = 1所以在1号磁道,123 % 100 = 23,在第23号扇区。由此我们就通过了LBA地址定位到了具体的扇区。

为什么操作系统要对磁盘进行逻辑抽象,然后用LBA地址再转换成CHS地址然后进行定位?直接用CHS地址不是更方便?

  1. 方便管理,将具体的硬件设备抽象成线性结构更方便操作系统进行操作和管理
  2. 避免了操作系统的代码和硬件设备的强耦合关系

如果操作系统的代码使用的是CHS进行定位,如果计算机的硬盘变成了SSD此时操作系统的代码就失效了。所以操作系统为了更好的适应不同的硬件设备,需要以统一的视角看待所有的设备。这就需要对硬件进行抽象描述,然后进行管理。

扇区被称为块设备,也被看作是一个文件,因为Linux下一切皆文件。
扇区是块设备的原因:

  1. 单位不是字节
  2. 以512byte为单位

文件系统

文件系统是什么

Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

简单的说文件系统就是一个管理磁盘上未被打开的文件,他们的数据存在哪里,存储数据的时候该怎么划分空间,每个分区的空间使用了多少,创建的新文件该存放到哪里等等关于磁盘上的文件操作的决策问题。

文件系统实际就是一个管理系统。

我们在Linux中使用ls -l显示出来的文件除了文件名还包含文件属性
image.png
第一个字母表示文件类型。
第2到9个字母分为三组,对应owner ,grouper, other的读写执行权限
第二列的数字表示硬链接数
第三列是owner
第四列是grouper
第五列是文件大小
第六列是最近修改时间

我们能看到这些信息是因为文件系统从磁盘上将文件信息读取了上来
image.png
而这些文件信息,包括文件内容都是文件系统进行管理的。

文件系统读取磁盘的单位

磁盘每次访问的基本但是是扇区,512byte但是这个单位依旧很小,操作系统的文件系统读取磁盘一般每次是1kb,2kb,4kb为基本单位,其中4kb使用的比较多。所以哪怕你要修改磁盘上文件的1bit数据,文件系统也会一次将4kb读入内存,修改完成后再写回磁盘。
为什么文件系统读取磁盘数据每次是以4kb呢?
这里涉及到局部性原理,就是你访问了这个文件的1bit数据你下次就很有可能访问这1bit附近的数据,文件系统一次读入了4kb,那么下次访问的数据很大可能性就在这4kb中,因此就能减少IO次数,提高数据命中率。进而提高操作系统的效率。

还有一个原因是,内存是以4kb为单位进行划分空间的 一个个划分区被称为 —— 页框
磁盘中的文件,可执行程序,也按照4kb划分成一个个块,方便载入内存,这些块被称为 —— 页帧

文件系统每次从磁盘中读取1kb还是2kb亦或者是4kb这个数据是可以修改的,但是要对这个数进行修改就要重新编译操作系统


文件系统怎么管理

文件系统怎么对磁盘抽象出来的逻辑结构进行管理。
一个磁盘最小也有500GB,直接对500GB进行管理是很复杂的,所以可以采用分治思想,将大问题划分成小问题解决。
500GB可以分成两个100GB和两个150GB大小的分区。只要管理好一个分区,那么其他分区也使用同样的方法管理即可。但是直接管理100GB大小的分区还是很困难,所以将100GB再分成多个组,每组大小是5GB现在只要管理好一个组,其他的组使用同样的方法就能管理好。
image.png
这里的分区类似Windows中的C盘D盘E盘这种分盘
image.png
这个图是Linux ext2文件系统的,磁盘文件系统图,磁盘是典型的块设备,磁盘分区被划分出来了一个个的Block,Boot Block和n个Block group。一个Block的大小是格式化的时候确定的且不可更改。
Boot Block块是系统启动块,当计算机开机的时候会先加载运行Boot Block块将操作系统的基本服务跑起来。所以Boot Block块的大小是确定的。
而每个Block Group组又被分成了以下几部分:

  1. Super Block:存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。如果Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。

但是这么重要的Super Block为什么存放在group组中呢?为什么不在分区中单独开辟一个块来保存呢?其实分区中的每个group他们的结构都是一样的,但是有的group会有Super Block有的就没有。所以一个分区内存在多个group里面都是具有Super Block的,这些副本保证了当一个group中的Super Block损坏的时候,只有一个group的数据丢失,想要恢复只需要将其他group组中的Super Block拷贝就可以了。

  1. GDT,Group Descriptor Table:块组描述符,描述的是块组的宏观的属性信息
  2. 块位图(Block Bitmap):Block Bitmap中记录着Data Blocks中哪个数据块已经被占用,哪个数据块没有被占用
  3. inode位图(inode Bitmap):每个bit位表示一个inode是否空闲可用
  4. inode Table:存放文件的几乎所有属性 如:文件大小,所有者,最近修改时间等等,但是文件名并不在inode中。并且每个文件都有一个inode,inode的大小是固定的。inode为了彼此区分每个inode都具有自己的ID。

使用ls -li可以将每个文件的inode 的ID显示出来。
image.png

  1. data Blocks(数据区):存放文件内容,数据区内部也是被划分成了许多块,每个块的大小固定,一个文件的内容占用多少个块是不确定的。

在一个目录下查找文件统一使用的都是inode,因为inode在一个分区内是唯一的。但是我们平时查找文件用的是文件名并不是inode。这是因为**目录的data Blocks中存放的内容是文件名和inode的映射关系。**通过文件名和inode的映射就能查找到文件。
image.png
inode中保存了文件的属性信息,同时还保存了文件内容在data Blocks中的位置。保存在blocks数组中。
image.png
blocks数组中的0-11下标元素指向的都是文件内容所占用的数据块的编号。但是如果文件内容很大,还是保存不下,此时12下标元素指向的数据块内部存放的就不是文件内容了,而是一些数据块的编号,这些数据块里面存放的才是文件内容。
如果此时数据块还不够用,那么13号下标的元素指向的数据块内存放的是其他数据块的编号,这几个数据块内部又是许多数据块,这些第二次延申的数据块内存放的才是文件的内容。
14号下标的道理也是类似的。
创建一个文件时要进行的操作

  1. 存储属性,需要在inode Table中添加一个新的inode记录文件的属性信息,然后将inode Bitmap的对应位置置1.
  2. 存储数据,将文件的内容数据拷贝到data Blocks中的空闲位置
  3. 记录存储位置,将文件数据拷贝到的data Blocks中占据的数据块的编号记录到inode中
  4. 添加文件名到目录,将文件名和inode的映射关系添加到当前目录的data Blocks中

image.png
这个图展示的就是文件添加的过程。先找到空闲inode节点,然后找到空闲的数据块,将使用的数据块编号填入inode,最后将inode和文件名的映射添加到目录的数据块中。

软硬链接

软链接

ln -s test.c soft_link.s
soft_link.s就是添加的软链接的文件名

image.png
我们可以看到软链接文件的inode是和原来的文件不同的,也就是说软链接文件是创建了一个新文件。
当我们将软链接文件链接上的文件删掉,此时软链接文件soft_link.s就会飘红显示错误。
image.png
错误的原因就是找不到被链接文件。但是其实hard_link.c文件是和test.c文件相同的,他们的inode都是相同的,但是此时软链接文件还是找不到被链接文件,这说明软链文件的内容保存的并不是被链接文件的inode,而是保存了被链接文件的路径。
Linux中绝对路径可以表示唯一文件。
所以当我们重新添加一个名为test.c的文件,就算新文件和旧文件的inode不同软链接文件也不会报错了。image.png
这就像是狸猫换太子。实际软链接,链接上的文件内容早就不一样了。

软链接就类似于Windows中的快捷方式,可以将路径比较深的文件做一层软链接,这样每次访问就不需要每次进入路径深处了。

image.png
创建了很深的路径,然后创建了一个文件,让软链接文件连接到该文件,此时我们不需要进入目录也可以调用这个创建的文件。

硬链接

ln test.c hard_link.c
hard_link.c 就是添加的硬链接的文件名

image.png
现在hard_link.c就是test.c的硬链接
硬链接文件的inode是和被链接文件的inode一样的。
image.png
文件内容也都是相同的,因为inode相同就是说明没有新文件被创建,hard_link.c和test.c文件其实是同一个文件。
image.png
当我们对其中的一个文件进行修改,另一个文件也会同步修改。

硬链接添加的原理就是在目录里添加了一个新的文件名和test.c文件inode的映射关系。

软硬链接的区别就是有没有创建新文件。软链接是创建了一个新的软链接文件,硬链接只是在目录里添加了一条映射关系,所以有硬链接没有自己独立的inode。
软硬链接的区别:是否具有独立的inode。
硬链接每次其实还是用到了一个引用计数的原理,我们对一个文件每添加一个硬链接,这个文件的硬链接数就会+1,这个硬链接数就是引用计数。当我们要删除这个文件的时候并不会直接删除,系统会先将硬链接数-1,直到硬链接数减为零之后才会真正的删除该文件。
image.png
我们创建一个新的目录的时候发现该目录的硬链接数是2,此时除了newdir之外应该还有一个硬链接文件,这个文件就是newdir目录中隐藏的.文件
image.png
所以test2的硬链接数是3也可以解释了,在test2目录内存在.目录指向当前test2,同时test2问价你中还存在…目录指向上一级的目录,此时就有三个了。
test1目录的硬链接数是4,此时除了目录内的.目录隐藏文件,在test2和newdir中各自存在一个…目录硬链接上test1,所以此时test1目录的硬链接数就是4了。

但是当我们自己给目录创建硬链接的时候会出现错误
image.png
错误信息是不允许给目录创建硬链接,所以只有操作系统才能给目录创建硬链接,而用户不可以,主要是为了防止你对目录创建硬链接后会导致查找目录时出现无限循环。

文件的三个时间
image.png
Access是最近访问时间,并不是每次访问都会修改,只有访问达到一定次数或者在一段时间内连续访问才会被更新
Modify是文件内容最近修改时间,文件内容改变了Modify时间就会更新
Change是文件属性最近修改时间,文件属性修改,包括文件内容修改都会更新,因为文件内容修改了文件的大小也会跟着变化,文件的大小也是属性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KissKernel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值