这一阵子真是偷懒,无时无刻不和自己身体中的懒癌做斗争。最终我还是被打败了,星期天两天几乎都是荒废过去的,在空闲的时候实际上我内心也是有点焦虑的,不知道去怎么度过这时间。学习吧又不想学习,看电视娱乐吧也没有心情。在这种状态中,我度过了星期天,到了今天我才趴在窗扇看了一会linux。这一部分之前也看过,不过是走马观花式的看,并没有投入精力。今天看了下,发现其实windows的文件系统和linux还是有很多不同的。从设计的角度上,linux的文件系统似乎更加聪明,看完这部分,我也更喜欢linux了。
在看linux文件系统之前我建议我们还是了解下windows的文件系统。这样有助于我们理解linux的文件系统,也更能体会到linux文件系统领先于windows的原因。现在我们的电脑大部分都是NTFS的文件系统,这主要是解决FAT32单文件不能超过4G的弊端,当然还有其他的改进。现代一些软件特别庞大,网上下载一个LOL是6G多(已经分开为几个文件了)。所以为了适应快速发展的软件行业,现在windos系统主要是NFTS文件系统的。
我们的U盘大部分是FAT文件系统,那么FAT是如何进行文件存储的。通常情况下U盘分成很多数据块,一个数据块为为一个block。假设一个block为4k,一个文件为1M。则需要252个block来储存这个文件。那么读取的时候是如何将这256个block都读取到呢?从第一个block开始读起,每一个block最末端标注了第二个block的位置,依次类推直到读到最后一个block。假如我有一个文件有一个G,是不是要一个个的读下去等所有的块都读完了才能组成我所需要执行的文件吗?这样效率会不会很低?下面这张图描述了FAT32文件系统读取文件的过程。这个过程有点像成语中描述的顺藤摸瓜、按图索骥一样。没有图说个毛,还是画图说下。
电脑重装了win10 还没有装画图软件,所以只能献丑了,但是大致的意思已经说明清楚了。每一个文件块后面都标明了下一个文件块的位置,然后依次去寻找。
但是linux的EXT2文件系统不是这样找文件的,而是用了一种很聪明的方式。linux的文件系统有三部分构成,super block、inode,block。
super block 主要用来记录该文件系统的整体信息,相当于总管家,记录的信息包括inode block的总量,已经使用的量,剩余量,文件系统的格式等。
inode(我总是拼写成innodb)用来记录文件的属性,一个文件占用一个inode。同时记录该文件的block号码。
block 是实际上记录文件内容的容器。当文件很大的时候会使用很多block来装载。如下图显示:
上图描述的情况更加复杂。因为一个inode 固定大小为128byte。一个block的大小根据设置不同可能是1kb 2kb 或者4kb。
inode这128byte中记录了那些信息呢:
该文件的访问方式:read/write /excute
该文件的所有者所属组:owner/group
该文件的大小
该文件的三个时间:ctime atime mtime
定义该文件的标志:flag setUID。
该文件真正内容的指向:pointer
除此之外一个inode可以指定12个block的文件编号。
上面的图总结为一句话:12个直接、一个 间接、一个双间接、一个三间接记录区。
假若一个block是1kb。那么
12个直接指向:12 * 1 = 12k。
一个间接:一个block记录256条记录。256 * 1k = 256kb
双间接: 一个block存储存储256个block的位置。这256个block全都是存指向block数据的。
数据量为:256 * 256 * 1k
三间接: 256 * 256 * 256 * 1kb。
总额: 12k + 256kb + 256 * 256+ 256 * 256 * 256 = 16GB.
关于这个文件系统。大家了解到这个基本知识就行了,知道他是怎么运作的,了解设计的精妙。
这是个如何将蚂蚁和大象优雅装进冰箱里的方法,真是十分精妙。