理解文件系统
[rAL linux]# ls -l总用量 12-rwxr-xr-x. 1 root root 7438 "9 月 13 14:56" a.out-rw-r--r--. 1 root root 654 "9 月 13 14:56" test.c
模式硬链接数文件所有者组大小最后修改时间文件名
1 .磁盘的概念
什么是磁盘?
磁盘是一种永久性存储介质,在计算机中,磁盘几乎是唯一的机械设备。与磁盘相对应的就是内存,内存是掉电易失存储介质,目前所有的普通文件都是在磁盘中存储的。
磁盘在冯诺依曼体系结构当中既可以充当输入设备,又可以充当输出设备。
磁盘的基本概念:
磁盘的寻址方式:
对磁盘进行读写操作的时候,通常我们需要找到需要修改地方的地址,一般来说有以下几个步骤去寻找:
确定读写信息在磁盘的哪一个盘面也就是哪一个磁头
确定读写信息在哪一个柱面也就是哪一个磁道
确定信息在哪一个扇区也就是磁道的哪一块
这种方法也叫CHS寻址:
线性存储的介质:
理解文件系统,我们首先要把磁盘想象作为一个线性的介质,比如磁带。磁带拉直后,就是线性的,同样的,磁盘也要想象为每一圈拉直。
磁盘分区:
磁盘通常呗称为块设备,一般以扇区作为读写的基本单位,一个扇区的大小通常是512字节,当然也有的是4kb。若我们以512字节为例,一个512G的磁盘就可以分为十亿多个扇区,也就是这么多个基本单位。
计算机为了更好的管理磁盘,于是对磁盘进行了分区。磁盘分区就是使用分区编辑器在磁盘上划分几个逻辑部分,盘片一旦划分成数个分区,不同的目录与文件就可以存储进不同的分区,分区越多,就可以将文件的性质区分得越细,按照更为细分的性质,存储在不同的地方以管理文件,例如在Windows下磁盘一般被分为C盘和D盘两个区域。
在Linux中,我们也可以通过以下命令查看我们系统中磁盘的分区信息:
ls /dev/vda* -l
EXT2文件系统的存储方案
计算机为了更好的管理磁盘,会对磁盘进行分区。而对于每一个分区来说,分区的头部会包括一个启动块(Boot Block),对于该分区的其余区域,EXT2文件系统会根据分区的大小将其划分为一个个的块组(Block Group)。
注意: 启动块的大小是确定的,而块组的大小是由格式化的时候确定的,并且不可以更改。
其次,每个组块都有着相同的组成结构,每个组块都由超级块(Super Block)、块组描述符表(Group Descriptor Table)、块位图(Block Bitmap)、inode位图(inode Bitmap)、inode表(inode Table)以及数据表(Data Block)组成。
Super Block: 存放文件系统本身的结构信息。记录的信息主要有:Data Block和inode的总量、未使用的Data Block和inode的数量、一个Data Block和inode的大小、最近一次挂载的时间、最近一次写入数据的时间、最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。
Group Descriptor Table: 块组描述符表,描述该分区当中块组的属性信息。
Block Bitmap: 块位图当中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
inode Bitmap: inode位图当中记录着每个inode是否空闲可用。通过位图0/1记录
inode Table: 存放文件属性,即每个文件的inode。这里的datablocks[N]是具体可能会采用多级索引的技术,将空间按需求扩大
Data Blocks: 存放文件内容。
注意:
其他块组当中可能会存在冗余的Super Block,当某一Super Block被破坏后可以通过其他Super Block进行恢复。
磁盘分区并格式化后,每个分区的inode个数就确定了。
创建一个空文件是怎样的?
创建一个文件,可以通过找到一个未被使用的inode,在inode table中找到对应的inode,并将文件的属性填充进inode结构体中。
将该文件的文件名和inode指针映射起来添加到目录文件的数据块中。
因此创建一个新文件主要有一下4个操作:
如何理解对文件写入信息?
通过文件的inode编号找到对应的inode结构。
通过inode结构找到存储该文件内容的数据块,并将数据写入数据块。
若不存在数据块或申请的数据块已被写满,则通过遍历块位图的方式找到一个空闲的块号,并在数据区当中找到对应的空闲块,再将数据写入数据块,最后还需要建立数据块和inode结构的对应关系。
注意:
一个文件使用的数据块和inode结构的对应关系,是通过一个数组(datablock[ ])进行维护的,该数组一般可以存储15个元素,其中前12个元素分别对应该文件使用的12个数据块,剩余的三个元素分别是一级索引、二级索引和三级索引,当该文件使用数据块的个数超过12个时,可以用这三个索引进行数据块扩充。这样就可以对空间进行扩充了
删除一个文件是什么?
将该文件对应的inode在inode bitmap当中置为无效。
将该文件申请过的数据块在块位图(block bitmap')当中置为无效。
因为此操作并不会真正将文件对应的信息删除,而只是将其inode号和数据块号置为了无效,所以当我们删除文件后短时间内是可以恢复的。
因为该文件对应的inode号和数据块号已经被置为了无效,因此后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号给其他地方申请内存使用,此时删除文件的数据就会被其他数据覆盖,因此也就无法恢复文件了。
为什么删除文件很快,拷贝文件很慢?
因为拷贝文件需要先创建文件,然后再对该文件进行写入操作,该过程需要先申请inode号并填入文件的属性信息,之后还需要再申请数据块号,最后才能进行文件内容的数据拷贝,而删除文件只需将对应文件的inode号和数据块号置为无效即可,无需真正的删除文件,因此拷贝文件是很慢的,而删除文件是很快的。
如何理解目录?
在Linux下一切皆文件,目录当然也可以被看作为文件。
目录有自己的属性信息,目录的inode结构当中存储的就是目录的属性信息,比如目录的大小、目录的拥有者等。
目录也有自己的内容,目录的数据块当中存储的就是该目录下的文件名以及对应文件的inode指针。
注意: 每个文件的文件名并没有存储在自己的inode结构当中,而是存储在该文件所处目录文件的文件内容当中。因为计算机并不关注文件的文件名,计算机只关注文件的inode号,而文件名和文件的inode指针存储在其目录文件的文件内容当中后,目录通过文件名和文件的inode指针即可将文件名和文件内容及其属性连接起来。
磁盘格式化:
当磁盘完成分区后,系统还需要对磁盘进行格式化。磁盘格式化就是对磁盘中的分区进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被清除。
简单来说,磁盘格式化就是对分区后的各个区域写入对应的管理信息。这样通过对一个分区的管理,我们可以用同样的方式对其他分区进行管理。
其中,写入的管理信息是什么是由文件系统决定的,不同的文件系统格式化时写入的管理信息是不同的,常见的文件系统有EXT2、EXT3、XFS、NTFS等