提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、理解硬件磁盘
- 1.1 磁盘物理结构
- 1.2 磁盘的存储结构
- 1.3 磁盘的逻辑结构
- 二、文件系统
- 2.1 引⼊"分区”概念和“块"概念
- 2.2 inode(重要)
- 2.3 文件与inode
- 三、软硬链接
- 3.1 硬链接
- 3.2 软链接
- 3.3 acm
- 总结
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、理解硬件磁盘
1.1 磁盘物理结构
磁盘可以存储大量的二进制数据,并且断电后也能保持数据不丢失。磁盘通常由盘片、磁头、电机驱动系统和接口等组件构成。盘片是磁盘存储数据的基础,由硬质合金材料或玻璃材料等涂布磁性材料形成。磁头则是读取和写入数据的关键部件,悬浮在盘片上方几微米的距离,可以读取和写入数据。
1.2 磁盘的存储结构
扇区:是磁盘存储数据的基本单位,通常为512字节,块设备
⽂件 = 内容+属性 都是数据,⽆⾮就是占据那⼏个扇区的问题!所以对文件的访问物理上就是找寻扇区的问题。
- 磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数
CHS寻址:
是一种寻址模式,对早期的磁盘⾮常有效,知道⽤哪个磁头,读取哪个柱⾯上的第⼏扇区就可以读到数据了。但是CHS模式⽀持的硬盘容量有限,因为系统⽤8bit来存储磁头地址,⽤10bit来存储柱⾯地址,⽤6bit来存储扇区地址,⽽⼀个扇区共有512Byte,这样使⽤CHS寻址⼀块硬盘最⼤容量为256102463*512B=8064MB(1MB=1048576B)(若按1MB=1000000B来算就是8.4GB)
1.3 磁盘的逻辑结构
对于软件层面上,我们应该这么理解磁盘:将整个磁盘视为一个线性结构的数组,然后每个扇区可以看作为这个数组的下标,数组存储的就是文件数据
这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种硬盘寻址模式叫做LBA(Logical Block Addressing),LBA寻址方式将硬盘上的所有扇区依次从“0”开始进行编号,直到硬盘的最大扇区数减1,相比于CHS简化了数据访问过程。
在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰会用特定的方法转换。
所以:从现在开始,磁盘就是 ⼀个元素为扇区 的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤磁盘,就可以⽤⼀个数字访问磁盘扇区了。
二、文件系统
章节一我们主要讲解了磁盘的结构和访问里面数据的方式,有了上面对于磁盘的理解,接下来我们自然要来引入磁盘里面的数据,因为我们要对磁盘中的文件进行管理,自然要先描述其各种属性,组织起来再管理。
2.1 引⼊"分区”概念和“块"概念
其实磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有⼀块磁盘并且将分区成C,D,E盘。
软件层面上其实就是定义一个结构体,其中记录每个区的结束和起始LAB,然后定义结构体类数组来存放每一个区
struct partition
{
int start;
int end;
}
struct partition part[n];
其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)。
硬盘的每个分区是被划分为⼀个个的”块”。⼀个”块”的⼤⼩是由格式化的时候确定的,并且不可以更改,最常⻅的是4KB(八个扇区大小),即连续⼋个扇区组成⼀个 ”块”。”块”是⽂件存取的最⼩单位。
注意:
- 区相当于对整个磁盘做出划分,接着将区划分为块组(block group),块组中每个块都包含了存储文件属性和内容的具体管理方式!!!
- 磁盘就是⼀个三维数组,我们把它看待成为⼀个"⼀维数组",数组下标就是LBA,每个元素都是扇区
- 每个扇区都有LBA,那么8个扇区⼀个块,每⼀个块的地址我们也能算出来。
- 知道LBA:块号=LBA/8
- 知道块号:LAB=块号*8+n.(n是块内第⼏个扇区)
- 当我们写入一个文件哪怕只有一个比特位,但是操作系统依然会为我们在硬件上申请四个字节的区域!
2.2 inode(重要)
文件 = 内容 + 属性 ,而文件内容数据存放在块的Data blocks中,inode存放文件属性(如文件创建日期,权限等),是一个结构体,一般为128字节,一般而言一个文件一个inode
以下图片就是一个被分组涵盖的内容分区,Boot Block涵盖开机关机信息不做赘述,
inode table:
保存分组内部所有可用的(已经使用+没有使用)的inode。
Data blocks:
保存分组内部所有可用的(已经使用+没有使用)的数据快。
Inode Bitmap:
Inode对应的位图结构。假设inode一共有n个,位图结构中的比特位的个数至少也为n个。
位图中比特位的位置与当前文件的对应的ID是一一对应的,比特位的1和0表示是否被占用。
block Bitmap:
数据块对应的位图结构。位图中比特位的位置和当前data block对应的数据块的位置是一一对应的。
- 文件属性存储在Inode中,Inode是固定大小,一个人文件,一个Inode。一个文件的所有属性几乎都存储在Inode中,但是文件名并不存储在Inode中。
- 文件的内容存储在data block数据块中,数据块随着应用类型的变化,大小也会发生变化。
在inode,有一个关于数组块的数组,data block block[15]。个数组元素的个数是固定的。但并表示这个文件可以写入的数据量是一定的。如图:每一个数据块都有自己的编号,这个数组中存放的就是该文件所使用的数据块的编号,通过这个数组就可以实现我们查找内容的行为。虽然只有15元素,但并不代表我们仅可以使用15个数据块。从下表为12的元素开始,所指向的数据块里边保存的是其他数据块的编号,下一级数据块中的内容可以使下下一级数据块的编号。如此,就可以增加我们可使用数据块的个数。
如果一个分组是10GB,但文件大小是20GB,但这影响吗,不影响,因为上面的映射关系是可以跨组访问的,但不建议这么做,因为一旦跨组访问了,意味所有的块不连续了,磁盘寻址效率也会大大降低。
如果要知道inode一共有多少个,没有使用的是多少个,如果通过计算获取结果,效率太低了,这时Group Descriptor Table出现了。
Group Descriptor Table:
包含对应分组的宏观属性信息,包括:一共有多少个数据块,使用了多少;一共有多少个Inode,使用了多少等等。
Super Block
超级块(Super Block):存放文件系统本身的结构信息。
记录的信息主要有:bolck 和 inode 的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。并且超级块通常在分组内多个组有一个超级块,在系统中是有一定比例的,假设我一个100G的分区有1000个分组,每20个分组就有一个super block,那么总共就有50个超级块。为什么需要这些超级块呢?本质上还是为了数据备份,如果某个块组或者inode丢失,那么就 可以通过super block来进行恢复
inode是以分区为单位的,每个区都有自己的inode编号,它们编号可以相同
所以当我们删除一个块(文件内容)的时候,不需要删除块,只需要把对应inode bitmap和block bitmap的位置零即可。
2.3 文件与inode
目录也是文件=属性+内容,目录的内容中放的是文件名和inode的映射关系。inode唯一,文件名也就唯一;查找文件的顺序,先文件名再寻对应的inode编号。这就解释了为什么去掉了目录的r权限,就不能访问目录中的内容了。没有r权限就不能访问文件名和inode的映射关系,就找不到这个文件。w权限:新建文件,最后一定要向当前所处目录内容中写入,文件名和inode的映射关系。
文件的增删查改:
- 增加文件:
- 当在Linux系统中创建一个新文件时,系统会为该文件分配一个唯一的inode号码,并在inode中存储该文件的属性信息。
- inode数量是有限的,因此当文件系统中的inode耗尽时,即使磁盘空间还有剩余,也无法再创建新文件。
- 删除文件:
- 删除文件时,系统实际上只是删除了文件名与inode号码之间的链接关系,并释放了inode号码和其所占用的磁盘空间。但文件的实际内容在磁盘上仍然存在,直到其占用的磁盘空间被其他文件覆盖。在文件内容上:删除=允许被覆盖!!!
- 如果删除了一个目录,并且该目录下有子目录或文件,那么该目录下的所有子目录和文件都将被一并删除(除非使用了-r选项来递归删除)。
- 查询文件:
- 查询文件时,系统首先通过文件名找到对应的inode号码,然后读取inode中的信息以获取文件的实际内容位置。(找到指定的文件->文件所在的目录->根据文件名:inode->目标文件的inode,当我们目标文件的路径非常的复杂的时候,OS会做路径的逆向解析,但不是每次都做,OS会对常用的路径做缓存)
- 使用如ls -i命令可以查看文件的inode号码。
- 修改文件:
- 修改文件时,系统会根据文件的inode号码找到对应的inode,并修改其中的文件属性信息(如修改时间戳、权限等)。
- 如果修改的是文件的内容,那么系统实际上是在磁盘上找到文件内容所在的块,并直接修改这些块的内容。但inode中的文件字节数等属性信息会相应地更新。
三、软硬链接
3.1 硬链接
我们看到,真正找到磁盘上⽂件的并不是⽂件名,⽽是inode。其实在linux中可以让多个⽂件名对应于同⼀个inode。
[root@localhost linux]# touch abc
[root@localhost linux]# ln abc def
[root@localhost linux]# ls -li abc def
263466 abc
263466 def
- 硬链接不是一个独立的文件,因为它没有独立的inode
所谓建立硬链接,其实就是在特定的目录下新增文件名和指向文件inode编号的映射关系!!!- abc和def的链接状态完全相同,他们被称为指向⽂件的硬链接。内核记录了这个连接数,inode263466的硬连接数为2。
- 我们在删除⽂件时⼲了两件事情:1.在⽬录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
- .和. .就是硬链接,硬链接可以做文件备份
3.2 软链接
硬链接是通过inode引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。在shell中的做法
[root@localhost linux]# ln -s abc.s abc
[root@localhost linux]# ln -s abc.s abc[root@localhost linux]# ls -li
263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 abc
261678 lrwxrwxrwx. 1 root root 3 9⽉ 15 17:53 abc.s -> abc
263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 def //权限后面的数字代表硬链接数目
软链接其实就相当于增加一个window下的快捷方式
3.3 acm
acm
下⾯解释⼀下⽂件的三个时间:
• Access:最后访问时间
• Modify:⽂件内容最后修改时间
• Change:属性最后修改时间
总结
本文总结了磁盘的物理结构,并抽象为软件层面上的结构,并将这个结构拆分为若干数据结构进行讲解。