之前的东西,全部是在内存中的。但是我们知道:不是所有的文件,都被打开了。大量的文件,就在磁盘上放着,什么都不做。这些文件非常多,杂,乱。而磁盘级别的文件管理,本质工作就能够快速的查询和定位到我们需要的文件。而这个就叫做文件系统。
1. 磁盘的基本介绍
磁盘是我们电脑上唯一的一个机械设备
这是磁盘的平面图,磁盘上存储的基本单位是扇区512字节。读写磁盘的时候,磁头找的是某一个面,某一个磁道,某一个扇区。所以,只有我们能磁盘上的盘面,磁道,扇区,就能找到一个存储单元。这叫做CHS地址。
用同样的方法,我们就能找到所有的基本单元。而文件系统的一个作用就是:什么文件,对应了那几块磁盘块。
1.1 磁盘的逻辑抽象结构
以前,我们使用的磁带,我们可以把它拉出来成一条直线。那么我们也可以把磁盘的盘片想象成线性结构。也就是当成一个数组。那么对磁盘的管理,就转换成了对数组空间的管理。
定位一个扇区,只需找到下标就行了。这个下标对应的地址叫做LBA(逻辑块地址)。
如果我们想让内存中的数据往磁盘中写入:
我们只知道LBA地址,首先需要将LBA地址映射转换成CHS地址
然后结合我们的数据,写到磁盘中。
补充:
因为如果每次访问都是512字节,那么访问的速度就太慢了。所以文件系统访问磁盘一般以8个为一起,那么IO的基本单位是4KB。
为什么要这样设计呢?
1.提高IO效率
2.不用让软件(OS)设计和硬件(磁盘)设计具有强相关性,也就是解耦合
还有一点就是一个磁盘很大,我们可能不是特别好管理,所以我们可以采用分区的方法来管理。然后再继续分,就是对磁盘的组进行管理。
2. 理解文件系统
我们知道:文件=内容+属性。不管是内容还是属性都是数据,所以都有存储。而Linux采用的是将内容和属性数据分开存储。
内容存在block中,每个4KB。且不断增多。
属性数据存在inode中,每个128字节。但是稳定的。
下面介绍一下磁盘中组的管理:
Boot Block:存放的是一些开机信息。
Data blocks:以块为单位,进行文件内容的保存。每次4KB,如果不满,也分4KB。
inode Table:以128字节为单位,进行inode属性的保存。
inode属性里面有一个inode编号。一般而言,一个文件只能有一个inode编号,来代表文件的唯一性。
Block Bitmap:Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
inode Bitmap:每个bit表示一个inode是否空闲可用
Group Descriptor Table(GDT):块组描述符,描述块组属性信息。比如:有多少inode,有多少个block被使用,多少个inode被使用,还剩多少等等。
Super Block(SB):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。
GDT管的是一个块组,而SB管的是整个区的组。
2.1 介绍inode
一个inode(文件和属性)如何和属于自己的内容关联起来呢?
在inode Table中,有一个struct inode。它里面包含了文件的所有属性,还有一个数组。
假设这个数组是15,其中下标[0,11]直接保存的就是该文件对应的blocks编号。
我们知道:Data blocks一块是4KB,那么磁盘只能保存48KB的文件吗?
肯定不是。原因是:Data blocks 4KB也可以保存其它块的编号。而在blocks数组中,下标[12,14]指向的是Data blocks。但是这个Data blocks不保存有效数据,而是保存该文件所适用的其它块编号。也就是二级索引。
2.2 文件的属性
我们知道:文件名是文件属性。但是,在inode里面并没有保存文件名。所以,Linux下,底层实际都是通过inode编号标识文件的。
我们要知道:Linux下一切皆文件。目录也可以看作是文件,目录的属性放在inode里,那么Data blocks放的是什么?放的是文件名和inode编号的映射关系。所以,在同一目录下,不能创建多个同名文件。因为文件名本身就是一个具有key值的东西。
当我们创建一个文件,操作系统做了什么?
我们知道:创建一个文件的时候,一定是在一个目录下。OS会根据文件名和inode编号找到自己所处的目录。根据目录的inode,找到目录的Data block。然后将文件名和inode编号的映射关系写入到目录的数据块中。
当我们删除一个文件,操作系统做了什么?
就是将该文件的inode Bitmap和Block Bitmap中的1设成0。
3. 理解软硬链接
这里我们可以看不出什么区别,我们看一下inode:
从这里我们可以看出:软硬链接的区别:软链接是一个独立文件,有自己独立的inode和inode编号。硬链接不是一个独立文件,它和目标文件使用的是同一个inode。
那么软链接有什么作用呢?
看下面的例子:
这是在目录d1/d2/d3中运行一个可执行程序。
如果在这个目录下去运行这个可执行程序我们需要把路径带上。这样会觉得很麻烦,此时就可以使用软链接。
所以软链接就是Linux下的快捷方式。
那么软链接的文件内容是什么呢?
保存的是指向的文件的所在路径
如果我们想删除这个软硬链接呢?
我们在这里建议使用unlink:
甚至可以删除文件。
那么硬链接有什么作用呢?
硬链接就是单纯的在Linux指定的目录下,给指定的文件新增 文件名和inode编号的映射关系。
从这里我们可以看出硬链接这里的数字发生了变化。这个数字的意思是:这个inode文件的硬链接数。
我们可以再硬链接一次:
那么什么是硬链接数呢?
inode编号,其实类似一个"指针"的概念。
本质:就是该文件inode属性中的一个计数器。标识有几个文件名和我的inode建立了映射关系。间而言之,就是几个文件名指向我的inode。
那么硬链接有什么作用呢?
从这里看:为什么创建普通文件,硬链接数默认是1?而创建目录,硬链接数默认是2?
普通文件比较好理解,因为普通文件的文件名 本身就和自己的inode 具有映射关系,所有是一个。
我们再来看一个这个目录为什么是2个?
从这里我们可以看出:这里的点和dir的inode是同一个,所以是有两个文件名和这个inode存在映射关系。
-d的意思是只看目录。我们可以看到这两个点是上级目录的inode是一样的。
所以,硬链接的作用:路径间的切换。