1.理解文件系统
1.1.ls与stat
磁盘文件由两部分构成,分别是文件内容和文件属性。
文件内容就是文件当中存储的数据,文件属性就是文件的一些基本信息,
例如文件名、文件大小以及文件创建时间等信息都是文件属性,文件属性又被称为元信息
ls -l,可显示当前目录下各文件的属性信息。
也可以使用stat查看更多属性。
1.1.初识inode
在Linux操作系统中,文件的元信息和内容是分离存储的,其中保存元信息的结构称之为inode,因为系统当中可能存在大量的文件,所以我们需要给每个文件的属性集起一个唯一的编号,即inode号。
也就是说,inode是一个文件的属性集合,Linux中几乎每个文件都有一个inode,为了区分系统当中大量的inode,我们为每个inode设置了inode编号。
我们可以通过下面这个指令来查看inode编号
注意: 无论是文件内容还是文件属性,它们都是存储在磁盘当中的。
1.3. 文件系统特性
为了更好的理解inode,我们得来了解一下文件系统
Linux
的正规文件系统是Ext2
- 传统磁盘和文件系统应用中,一个分区就是只能被格式化成一个文件系统,所以说一个文件系统就是一个分区,但是由于新技术的应用可以将一个分区格式化为多个文件系统,也能将多个分区合成一个文件系统,所以可以称呼一个被挂载的数据为一个文件系统而不是一个分区
文件系统是如何运行的呢?
- 文件包含内容和属性,那么文件系统通常会将内容和属性这两部分的数据分别存在不同的块中,权限和属性放在
inode
中,内容放在data block
块中。另外还有一个super block
块会记录文件系统的整个信息,包括inode
和block
的总量、使用量等等。 - 每一个
inode
和block
都有编号方便管理。其中inode
记录文件属性,一个文件占用一个inode
,同时记录此文件的数据所在的data block
号;block
是记录文件内容,如果文件太大时,会占用多个block
。既然我们知道inode
中包含data block
号,那么也就是说只要找到文件的inode
就可以通过inode
中data block
编号读写数据,性能比较。如下图:
1.3 EXT2文件系统
Linux
文件系统EXT2
就是使用inode
为基础的文件系统
inode
是记录权限和属性,data block
是记录文件内容。文件系统一开始就将inode
和block
规划好了,除非重新格式化,否则inode
和block
固定后就不再变动。- 如果文件系统非常大时,将所有的
inode
和block
放置在一起很不明智,为了更好的管理磁盘,会对磁盘进行分区。而对于每一个分区来说,分区的头部会包括一个启动块(Boot Block
),对于该分区的其余区域,EXT2
文件系统会根据分区的大小将其划分为一个个的块组(Block Group
) - 每个组块都有着相同的组成结构,每个组块都由各自独立的超级块(
Super Block
)、块组描述符表(Group Descriptor Table
)、块位图(Block Bitmap
)、inode
位图(inode Bitmap
)、inode
表(inode Table
)和数据表(Data Block
)组成
下面以单个盘片来说,磁道上的扇区全部拿下来就变成了一个数组,第一个扇区中有主引导分区和一个分区表,八个扇区也就是一个block(这样更方便管理),块中存放数据:
把区、块分组,再对每个块组做管理:
各区域作用
- 其他块组当中可能会存在冗余的Super Block,当某一Super Block被破坏后可以通过其他Super Block进行恢复。
- 磁盘分区并格式化后,每个分区的inode个数就确定了。
1.5.理解磁盘分区与格式化
磁盘通常被称为块设备,一般以扇区为单位,一个扇区的大小通常为512字节。我们若以大小为512G的磁盘为例,该磁盘就可被分为十亿多个扇区。
计算机为了更好的管理磁盘,于是对磁盘进行了分区。
磁盘分区就是使用分区编辑器在磁盘上划分几个逻辑部分,盘片一旦划分成数个分区,不同的目录与文件就可以存储进不同的分区,分区越多,就可以将文件的性质区分得越细,按照更为细分的性质,存储在不同的地方以管理文件,例如在Windows下磁盘一般被分为C盘和D盘两个区域。
命令:ls /dev/vda* -l 查看磁盘分区信息
一个磁盘的分区的结构可以看做下图这样。inode可以直接看作是文件编号,操作系统是通过inode来确定文件,而不是文件名(文件名是给用户看的)。block存放文件内容,indode属性中记录了对应的block编号,这样就将文件属性和内容联系在了一起,就组成了一个完整的文件。
1.6.理解文件操作
1.6.1.创建一个空文件的步骤
- 遍历
inode
位图,找到一个空闲的inode
- 在
inode
表当中找到对应的inode
,将文件的属性信息填入inode
结构中 -
将该文件的文件名和
inode
指针添加到目录文件的数据块中每个
inode
和Data block
只对应一个文件
1.6.2. 信息写入
想要向文件写入信息首先需要访问到目标文件
- 首先根据文件的
inode
编号,在目录分组中进行查找 - 通过
inode
和Data block
的映射关系,找到文件的数据块,并加载至内存中即可
这就解释了在file
对象中有 inode
信息的原因
向文件中写入信息的步骤
- 首先通过文件的
inode
编号找到对应的inode
结构 - 通过
inode
结构找到存储该文件内容的数据块,并将数据写入数据块。 - 若不存在数据块或申请的数据块已被写满,则通过遍历块位图的方式找到一个空闲的块号,并在数据区当中找到对应的空闲块,再将数据写入数据块,最后还需要建立数据块和
inode
结构的对应关系
下面来分析一下inode/block
和文件大小的关系
inode
记录的数据很多,但是只有128
字节大小,而记录一个block
就需要4
个字节。假设一个文件有400MB
,每个block
为4KB
时,就有至少10w
条block
号码,inode
的128
字节该如何记录呢?- 方法是:系统采用
12个
直接索引、1
个间接索引、1
个双间接索引、1
个三间接索引记录区,用多级索引来做到一个数据块中存储大量数据 - 说简单点就是类似套娃,在
Data block
中存储其他的Data block
信息
1.6.3 删除文件
删除文件的步骤
- 首先根据文件名找到
inode
编号 - 再将该文件对应的
inode
,在inode
位图当中置为无效(置0) - 最后将该文件申请的数据块,在块位图当中置为无效(置0)
此删除操作并不会真正将文件对应的信息删除,而只是将其inode
号和数据块号置为了无效,起到了访问不到就等于删除的效果
- 当我们删除文件后短时间内是可以恢复的
为什么说是短时间内呢,因为该文件对应的inode号和数据块号已经被置为了无效,因此后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号分配出去,此时删除文件的数据就会被覆盖,也就无法恢复文件了。
1.6.4.为什么拷贝文件的时候很慢,而删除文件的时候很快?
因为拷贝文件需要先创建文件,然后再对该文件进行写入操作,该过程需要先申请inode号并填入文件的属性信息,之后还需要再申请数据块号,最后才能进行文件内容的数据拷贝,而删除文件只需将对应文件的inode号和数据块号置为无效即可,无需真正的删除文件,因此拷贝文件是很慢的,而删除文件是很快的。
2.硬链接
我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode。
abc和def的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数inode263466的硬连接数为2。
我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
注意:硬链接不可以链接文件夹,如图所示:
2.1.创建硬链接
我们可以通过以下命令创建一个文件的硬连接。
ln test test.hard.link
通过ls -i -l命令我们可以看到,硬链接文件的inode号与源文件的inode号是相同的,并且硬链接文件的大小与源文件的大小也是相同的,特别注意的是,当创建了一个硬链接文件后,该硬链接文件和源文件的硬链接数都变成了2。
硬链接文件就是源文件的一个别名,一个文件有几个文件名,该文件的硬链接数就是几,这里inode号为2235074的文件有test和test.hard.link两个文件名,因此该文件的硬链接数为2。
注意:与软连接不同的是,当硬链接的源文件被删除后,硬链接文件仍能正常执行,只是文件的链接数减少了一个,因为此时该文件的文件名少了一个。
3.软链接
硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件
那么硬链接不可以链接文件夹,软链接可以嘛?答案是可以的!
3.1.创建软链接
我们可以通过以下命令创建一个文件的软链接。
ln -s test test.soft.link
通过ls -i -l命令我们可以看到,软链接文件的inode号与源文件的inode号是不同的,并且软链接文件的大小比源文件的大小要小得多。
软链接又叫做符号链接,软链接文件相对于源文件来说是一个独立的文件,该文件有自己的inode号,但是该文件只包含了源文件的路径名,所以软链接文件的大小要比源文件小得多。软链接就类似于Windows操作系统当中的快捷方式.
注意:但是软链接文件只是其源文件的一个标记,当删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但却不能执行或是查看软链接的内容了。
4.软硬链接的区别
- 1.软链接相当于快捷方式,硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录。
- 2.软链接形成的是一个独立的文件,有独立的inode,文件的内容是对应文件的路径,硬链接则是同一个文件,文件名和Inode的映射,而硬链接没有独立的inode。
- 3.软链接的引用计数不会改变,硬链接则会改变。