Linux系统编程与网络编程——Linux文件系统(二)

前言

文件系统的功能包括:管理和调度文件的存储空间,提供文件的逻辑结构、物理结构和存储方法,实现文件从标识到实际地址的映射,实现文件的控制操作和存取操作,实现文件信息的共享并提供可靠的文件保密和保护措施,提供文件的安全措施。

磁盘不像内存一样可以直接寻址,当open一个设备时,看到的大部分都是乱码


一:文件系统格式

怎么查看当前文件系统有哪些?
df -T
在这里插入图片描述

一般Windows常用的分区格式有三种,分别是FAT16、FAT32、NTFS格式。

而在Linux操作系统里常见的主要有Ext2、Ext3、Ext4、Linuxswap和VFAT几种格式:

1.Ext2:Ext2是GNU/Linux系统中标准的文件系统。 这个可以说是Linux系统中使用最多的一种文件系统,它是专门为Linux设计的,拥有极快的速度和极小CPU占用率。Ext2既可以用于标准的块设备(如硬盘),也被应用在软盘等移动存储设备上

2.Ext3和Ext4:是Ext2的升级版本,也就是说它在保有Ext2的格式之下进行了扩展,比如最大存储文件大小得到提高。

3.Linuxswap:是Linux中一种专门用于交换分区的swap文件系统。Linux系统主要是使用这一整个分区作为交换空间。 一般情况下,这个swap格式的交换分区是主内存的2倍。在内存不够时,Linux会将部分数据写到交换分区上。 交换分区的文件系统是连续的

4.VFAT也叫长文件名系统,这是一个与Windows系统兼容的Linux文件系统,支持长文件名,可以作为Windows与Linux交换文件的分区


ext2介绍

在磁盘进行读写的时候,都有一个最小单位,叫扇区。一个扇区一般是512字节。
假如存一个文件,文件大小为10字节,磁盘会给这个文件分配512字节储存。如果文件为513字节,则分配1024个字节储存。

当文件远远大于512字节时,每次以512字节读写文件效率太低,速度太慢。这时重新定义了一个单位:。块一般是扇区的整数倍。几个扇区作为一个块一般是刚格式化的时候决定的。

硬盘信息:
首先我们应该知道,一块硬盘买来,需要先分区才能使用。分区其实就是填写一些信息(填写分区表)。里面记录了每个分区从哪里开始到哪里结束。那么我们该怎么保存分区信息呢?
在这里插入图片描述
如上图,一块硬盘被分为三个区(此时还并没有涉及到文件系统)。每个分区可以有不同的类型,但是!!!在硬盘首部会有一个启动块(boot block),大小为1KB,里面保存着分区表信息和磁盘大小。分区信息表里记录着每个分区的信息。


单个分区信息:

分区后才是文件系统的开始,分区时需要制定文件系统类型,在指定文件系统之前,还做了一件事情,需要指定块大小。

一块磁盘拿过来读写的时候,都有一个最小的读写单位,叫做扇区。所有的块设备读写最小单位都是一个扇区(一个扇区一般是512字节),当存一个10字节文件,磁盘依旧会分配512字节。现在我们的磁盘都很大,如果使用512字节读写,效率会很低。这时我们会重新定义一个单位:块。块的大小一般是扇区的整数倍。

我们应该知道,分区后,还要对每个区进行分组后才能使用,现在我们先单独挑选一个分区查看:
在这里插入图片描述
如上图,一个分区会有若干个块。分区首部会有一个超级块(super block)。里面记录着分组信息,一个块是几个扇区组成,挂载的时间,当前分区系统类型等等…超级块是很重要的信息,一旦丢失则整个分区都不能使用


分组信息:
在这里插入图片描述
如上图,我们现在将一个分区分为了三个组!每个组的大小都是一样的。上文提到超级块的信息很重要!所以,每个组前面都有一个超级块!!!,一旦某个组里的超级块损坏,可以从别的分组里面拷贝过来。


单个分组信息:

现在我们单独挑选一个分组来查看:
在这里插入图片描述
由上文可知,每个组都有一个超级块。所以分组首部有一个超级块。

一个分组有若干个块,一个块组中的块是这样利用的:数据块存储所有文件的数据,比如某个分区的块大小是1024字节,某个文件是2049字节,那么就需要三个数据块来存,即使第三个块只存了一个字节也需要占用一个整块。超级块、块组描述符表、块位图、inode位图、inode表这几部分存储该块组的描述信息。

块组描述符表GDT(group descriptor table):
紧跟在超级块后面,若干个块构成。它是个表,保存了块组描述符。一个分区有多少个块组,就有多少个块组描述符。每个块组描述符里存储一个块组的描述信息(例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等)。它不仅仅保存了group0的,也保存了其它组的这些信息。每个组里面也都有备份一旦信息丢失,整个组都不能使用

块位图(Block Bitmap):
紧跟在GDT后,它记录了整个组的块的使用情况,块位图的每一位表示一个块的使用情况,0代表没被使用,1代表被使用。所以当一个块大小为4096k时,能表示4096*8个块的使用情况。所以整个组最大的容量为(4096 * 8 * 4096),即128M。

为什么用df命令统计整个磁盘的已用空间非常快呢?因为只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。

inode位图(inode Bitmap):
和块位图类似,它本身占一个块,其中每个bit表示一个inode是否空闲可用。所能表示的inode个数也是4096 * 8。

inode表(inode Table):
若干个块组成。我们知道,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是stat命令看到的那些信息,这些信息存在inode中而不是数据块中。每个文件都有一个inode,一个块组中的所有inode组成了inode表。

注意
一个文件的inode并不需要占用一整个块(4k)。所以inode table里面的一个块又可以分成若干个128字节。每一128字节表示一个inode前68自己保存文件属性,后60字节保存数据块指针,后60字节能存放15个指针,指针作用是指向保存文件的数据块,前12个指针直接寻址,当一个文件很大的时候,后三个指针间接寻址。间接寻址的指针指向一个数据块,里面的数据块用来保存4096/4个指针,可以保存4M内容,如果本组空间不够用,可以在别的组寻址)。如果一个块大小为4096,那么能保存32个(4096/128)inode,每个inode是否被使用保存在它前面的inode bitmap里面。如下图:
在这里插入图片描述

文件数据块(data block):
根据不同的文件类型有以下几种情况
1.对于常规文件,文件的数据存储在数据块中。
2.对于目录,该目录下的所有文件名和目录名存储在数据块中,注意文件名保存在它所在目录的数据块中,除文件名之外,ls -l命令看到的其它信息都保存在该文件的inode中。


猜你喜欢

转载自blog.csdn.net/Gsunshine24/article/details/88771345
今日推荐