Linux操作系统篇: 文件系统和软硬连接

本文详细阐述了Linux文件系统中磁盘的存储机制(数据块和inode),介绍了文件系统如何管理磁盘,包括分区、块组和超级块的结构。同时讲解了软链接和硬链接的区别,以及文件创建、写入、删除和链接的基本原理。
摘要由CSDN通过智能技术生成

一 前置知识

文件=文件内容+文件属性
磁盘上存储文件=存文件的内容(数据块)+存文件的属性(inode)
Linux的文件在磁盘中存储是将属性和内容分开存储的。文件内容的存储是给每个文件分配一块空间,此空间就叫数据块。文件属性是存储到inode中,inode也是一个数据块,大小128字节,每个磁盘上的文件都有自己的一块数据块,但是inode不是每个文件都有的,inode是公共的,每个文件的属性都存在inode中。

二 认识磁盘

2.1 初识

磁盘:唯一的一个机械设备,也是一个外设。移动端不适合用机械磁盘,磁盘上有盘片,磁头,磁头停靠点等。盘片用来存储数据,通电后,盘片顺时针高速转动,磁头在盘片上下层但没有接触盘片但离得非常近。在通电后,磁头也左右摇摆,为什么说不适用呢?因为在通电后,磁头会高速旋转。磁头和盘片稍有摩擦磕碰就会损坏盘片,导致丢失数据。

盘片越多,存储的数据就越多。一个盘片两个面,每个面都有自己的磁头。

2.2 磁盘的构成

磁盘被访问的最基本单元是扇区(512字节/4KB),所以哪怕只访问1bit的数据,也是要把一个扇区的数据从磁盘加载到内存中。我们可以把磁盘看作有无数个扇区构成的存储介质。要把数据存到磁盘,第一个解决的问题是定位一个扇区,哪一面定位用哪个磁头,哪一个磁道,哪一个扇区。磁头左右摆动,其实质是定位磁道和柱面的过程(运动越少,效率越高;运动越多,效率越低)。在软件设计上,设计者一定要有意识的将相关数据放在一起。磁带延展开,逻辑上是线性的,所以磁盘在逻辑上也是线性的。基于扇区的数组,任意一个扇区都有下标。

2.3 对硬件进行抽象理解

对磁盘进行读写操作时,一般有以下几个步骤:

  1. 确定读写信息在磁盘的哪个盘面。
  2. 确定读写信息在磁盘的哪个柱面。
  3. 确定读写信息在磁盘的哪个扇区。

通过以上三个步骤,最终确定信息在磁盘的读写位置。 CHS寻址方式

磁盘在物理上看是圆形状的,但是我们可以把他抽象成直的。认为他是一个很大很大的数组,每个扇区就是数组中的一小部分。数组有下标,扇区也有下标。

三 文件系统

如果磁盘很大,OS怎么管理磁盘呢?可以将磁盘分治,分而治之,分为几个不同的小区域。那怎么分为几个小区域呢。先组织,再描述。用链表或者更高级的数据结构连接起来。

struct partion    //第几块
{
    int start;    //起始位置
    int end;      //终止位置
};

如果分完以后还是很大怎么办呢?还是要再接着分。

举个例子,一个磁盘800GB,被分为了5个partion。200 + 150 + 150 + 200 + 100,因为还是很大,就拿200GB举例,再接着分为10个20GB的。20GB就很好管理了!这10个20GB的小区域就称为BlockGroup(块组)。

 计算机为了更好的管理磁盘,会对磁盘进行分区。而对于每一个分区来说,分区的头部会包括一个启动块(Boot Block),对于该分区的其余区域,EXT2文件系统会根据分区的大小将其划分为一个个的块组(Block Group)。

 启动块的大小是确定的,而块组的大小是由格式化的时候确定的,并且不可以更改。

每个组块都有着相同的组成结构,每个组块都由超级块(Super Block)、块组描述符表(Group Descriptor Table)、块位图(Block Bitmap)、inode位图(inode Bitmap)、inode表(inode Table)以及数据表(Data Block)组成。

1) Super Block: 存放文件系统本身的结构信息。记录的信息主要有:Data Block和inode的总量、未使用的Data Block和inode的数量、一个Data Block和inode的大小、最近一次挂载的时间、最近一次写入数据的时间、最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。
2) Group Descriptor Table: 块组描述符表,描述该分区当中块组的属性信息。
3) Block Bitmap: 块位图当中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
4) inode Bitmap: inode位图当中记录着每个inode是否空闲可用。
5) inode Table: 存放文件属性,即每个文件的inode。
6) Data Blocks: 存放文件内容。

inode:存储文件的属性,一般128字节一个,一般而言一个文件一个inode,inode也有自己的编号。在Linux中,inode存储文件属性是不包括文件名的,那怎么知道这个inode是哪个文件的inode?在Linux中,标识文件用的是inode编号。知道了inode编号,如何知道数据在where?inode其实是一个结构体类型,存储了保存文件的数据块编号。

struct inode
{
    文件类型;
    ACM时间;
    所属组;
    int blocks[N]; //存储了保存了文件内容的数据块的编号
}

blocks中存的有一部分是直接索引的存储此文件数据的下标,有一部分是二级索引,有一小部分是三级索引。二级索引和三级索引是一个道理,二级索引就是如果文件很大,这个blocks数组全存一级索引的话,是不够的,所以二级索引存的是一级索引的编号,三级同理。

Block Bitmap 和 inode Bitmap本质一样,是个位图。 数据块(Data Blocks)哪一个被使用了inode table哪一个被使用了,就是通过Block Bitmap 和 inode Bitmap知道的。Block Bitmap 和 inode Bitmap都有自己的编号,为0代表对于的编号的空间没被使用,为1则反之。删掉程序,就是删除和程序有关的文件,就把这些有关的文件对应的数据块和inode在Block Bitmap 和 inode Bitmap的映射位置从1变为0就代表删除了,具体在数据块(Data Blocks)是不同删除的,等着新的文件来覆盖就可以。

创建一个新文件系统要做什么?

  1. 通过遍历inode位图的方式,找到一个空闲的inode。
  2. 在inode表当中找到对应的inode,并将文件的属性信息填充进inode结构中。
  3. 将该文件的文件名和inode指针添加到目录文件的数据块中。

如何理解对文件写入信息?

 1. 通过文件的inode编号找到对应的inode结构。
 2. 通过inode结构找到存储该文件内容的数据块,并将数据写入数据块。
 3. 若不存在数据块或申请的数据块已被写满,则通过遍历块位图的方式找到一个空闲的块号,并在数据区当中找到对应的空闲块,再将数据写入数据块,最后还需要建立数据块和inode结构的对应关系。 

如何理解删除一个文件?

将该文件对应的inode在inode位图当中置为无效。
将该文件申请过的数据块在块位图当中置为无效。
因为此操作并不会真正将文件对应的信息删除,而只是将其inode号和数据块号置为了无效,所以当我们删除文件后短时间内是可以恢复的。
为什么说是短时间内呢,因为该文件对应的inode号和数据块号已经被置为了无效,因此后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号分配出去,此时删除文件的数据就会被覆盖,也就无法恢复文件了。

为什么拷贝文件的时候很慢,而删除文件的时候很快?

因为拷贝文件需要先创建文件,然后再对该文件进行写入操作,该过程需要先申请inode号并填入文件的属性信息,之后还需要再申请数据块号,最后才能进行文件内容的数据拷贝,而删除文件只需将对应文件的inode号和数据块号置为无效即可,无需真正的删除文件,因此拷贝文件是很慢的,而删除文件是很快的。

这就像建楼一样,我们需要很长时间才能建好一栋楼,而我们若是想拆除一栋楼,只需在这栋楼上写上一个“拆”字即可。

如何理解目录?

都说在Linux下一切皆文件,目录当然也可以被看作为文件。
目录有自己的属性信息,目录的inode结构当中存储的就是目录的属性信息,比如目录的大小、目录的拥有者等。
目录也有自己的内容,目录的数据块当中存储的就是该目录下的文件名以及对应文件的inode指针。
注意: 每个文件的文件名并没有存储在自己的inode结构当中,而是存储在该文件所处目录文件的文件内容当中。因为计算机并不关注文件的文件名,计算机只关注文件的inode号,而文件名和文件的inode指针存储在其目录文件的文件内容当中后,目录通过文件名和文件的inode指针即可将文件名和文件内容及其属性连接起来。

同一个目录下不能有同名文件,因为key值不能相同。文件名冲突系统就无法找到指定文件了。
目录下,没有w,我们无法创建文件。即便创建了文件,文件名与inode的映射关系也无法写到目录文件的数据块里。
目录下,没有r,我们无法查看文件。无法读取目录所对应数据块的文件名与inode的映射关系无法得到。
目录下,没有x,我们就无法进入这个目录。cd目录名本质上是找到目录的inode,但没有x,无法进入目录,无法更新当前目录环境变量。
问:可是目录是文件,也有inode的编号。怎么找?
答:查任何一个目录使,都要从当前目录开始向上递归找到根目录(此文件文件名确定/),找到该数据块,里面的所有文件子目录数据都可以找到。(绝对路径)
Linux系统中,会把用户最常访问的若干目录路径信息通过dentry缓存。

四 软硬链接

4.1 软链接

我们可以通过以下命令创建一个文件的软连接。

[cl@VM-0-15-centos SH]$ ln -s myproc myproc-s

通过ls -i -l命令我们可以看到,软链接文件的inode号与源文件的inode号是不同的,并且软链接文件的大小比源文件的大小要小得多。

软链接又叫做符号链接,软链接文件相对于源文件来说是一个独立的文件,该文件有自己的inode号,但是该文件只包含了源文件的路径名,所以软链接文件的大小要比源文件小得多。软链接就类似于Windows操作系统当中的快捷方式。

但是软链接文件只是其源文件的一个标记,当删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但却不能执行或是查看软链接的内容了。

4.2硬链接

我们可以通过以下命令创建一个文件的硬连接。

[cl@VM-0-15-centos SHLink]$ ln myproc myproc-h

通过ls -i -l命令我们可以看到,硬链接文件的inode号与源文件的inode号是相同的,并且硬链接文件的大小与源文件的大小也是相同的,特别注意的是,当创建了一个硬链接文件后,该硬链接文件和源文件的硬链接数都变成了2。

硬链接文件就是源文件的一个别名,一个文件有几个文件名,该文件的硬链接数就是几,这里inode号为924344的文件有myproc和myproc-h两个文件名,因此该文件的硬链接数为2。

与软连接不同的是,当硬链接的源文件被删除后,硬链接文件仍能正常执行,只是文件的链接数减少了一个,因为此时该文件的文件名少了一个。

总之,硬链接就是让多个不在或者同在一个目录下的文件名,同时能够修改同一个文件,其中一个修改后,所有与其有硬链接的文件都一起修改了。

为什么刚刚创建的目录的硬链接数是2?

我们创建一个普通文件,该普通文件的硬链接数是1,因为此时该文件只有一个文件名。那为什么我们创建一个目录后,该目录的硬链接数是2?

因为每个目录创建后,该目录下默认会有两个隐含文件.和..,它们分别代表当前目录和上级目录,因此这里创建的目录有两个名字,一个是dir另一个就是该目录下的.,所以刚创建的目录硬链接数是2。通过命令我们也可以看到dir和该目录下的.的inode号是一样的,也就可以说明它们代表的实际上是同一个文件。

小技巧: 一个目录下相邻的子目录数等于该目录的硬链接数减2。

4.3 软硬链接的区别

  1. 软链接是一个独立的文件,有独立的inode,而硬链接没有独立的inode。
  2. 软链接相当于快捷方式,硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值