前述:Linux系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分区不可太大也不可以太小,太大会导致磁盘容量的浪费,太小会导致产生的文件无法存储的问题。在Linux里面文件是由两部分数据组成,一部分是metadata,另一部分是data。那么这些数据都存放在文件系统的什么地方呢?这就让我们必须得了解文件系统的Inode与Block的基本原理了,而Linux最传统的磁盘文件系统使用的是Ext2,所以我们了解下它的内部原理。
第一部分:磁盘的组成和分区(基础)
磁盘的机械部分:
1、圆形的盘片(主要记录数据的部分)
2、机械手臂与机械手臂上的磁头(可读写盘片上的数据)
3、主轴马达,可以转动盘片,让机械手臂的磁头在盘片上读写数据
磁盘的基本概念
1、扇区是最小的物理存储单元(512bytes)
2、将扇区组成一个园,那就是柱面,柱面是分区的最小单位
3、第一个扇区最重要,里面有硬盘的主引导程序(MBR)占446bytes和分区表(partision tables)占64bytes。
4、目前流行的家用硬盘接口SATA和服务器硬盘接口SAS。
磁盘分区部分:
1、主分区和扩展分区最多可以有4个(硬盘的限制)
2、扩展分区最多只能有一个(操作系统限制)
3、逻辑分区是由扩展分区分化出来的分区
4、主分区和逻辑分区的内容可以被格式化,而扩展分区无法格式化
第二部分:文件系统的基本特性
我们都知道硬盘分区后都是需要格式化,之后操作系统才能使用该分区,为什么呢?这是因为各种操作系统的文件的属性和权限并不相同的,为了能够存放这些文件,因此将分区格式化,以成为操作系统能利用的系统格式。
文件系统通常会将两部分的数据分别放在不同的块,权限与属性放置到inode中,实际的数据放置到 data block块中,另外还有一个超级块(superblock)会记录整个文件系统的整体信息,包括inode和block的总量、使用量、剩余量,以及文件系统的格式与信息。inode会记录文件的属性,一个文件会占用一个inode,同时会记录文件的数据所在的block号码,block实际会记录文件的内容,若文件太大,会占用多个block。
第三部分:Linux的Ext2文件系统
1、data block(数据块)
data block是用来放置文件内容的地方,在Ext2文件系统下支持的block的大小为1KB、2KB和4KB。在格式化的时候,block的大小就被确定了,并且每个block都会有编号,以方便inode记录。
原则上,block的大小与数量在格式化是不能再改变了(除非重新格式化);每个block内最多只能放置一个文件的数据,存在以下两种情况,一种是文件大于1个block则会占用多个block,另外一种是文件小于block,则block的剩余空间就不会再被使用了(磁盘空间的浪费)。
那既然上述说的大的block可能会导致严重的磁盘容量浪费,但是block设定为最小1K呢?那么对于大的文件来说会占用数量更多的block,而inode要记录更过的block的号码,此时又会到时文件系统的不良读写的性能。
因此,在系统进行格式化之前,要想好文件系统的预计使用情况,目前流行为4K。
2、inode
inode的主要内容是记录文件的属性以及该文件的实际数据是放在那几号的block内。inode记录文件数据有以下内容:
a、该文件的访问模式(r/w/x)
b、该文件的所有者与组(owner/group)
c、该文件的大小
d、该文件的时间戳(atime、ctime、mtime)
e、定义文件属性的标志
f、该文件真正内容的指向(pointer)
其实inode的数量以及大小在格式化的时候就已经被固定了,除了以上还有其它的特性如下:
每个inode的大小为128bytes,每个文件都仅会占用一个inode,因此文件系统能够创建的文件的数量是与inode的数量相关的。
系统读取文件时需要先找到inode,并且分析inode所记录的权限与用户是否符合,若符合才能继续读取block的内容。
第四部分:inode的结构示意图
首先,inode需要记录的数据非常的多,但偏偏只有128bytes,而inode记录一个block号码就要花掉4bytes,一个inode如果不记录其他数据的化,最多也只能记录32个block号码。假如一个文件的大小为4GB且每个block为4KB时,那么至少也要100万个block号码,那么按照上面所说的一个inode对应32个block号码,就需要至少32000个inode,这时会需要更多的inode,我们也没有那么多的inode,因此我们的系统就有了inode记录block号码的12个直接,1个间接,1个双间接,1个三间接的记录区。
下面我们通过上述inode的结构图,来分析下内部原理。
图中最左边为inode本身(128bytes),里面有12个直接指向block号码对照,这12个记录就能够直接取得block的号码。至于我们说的间接就是再拿一个block的内存来放当做记录block的号码的记录区,如果文件较大时,系统就会使用间接。同理如果文件再大的化,可以使用双间接,和三间接。所谓的双间接第一个block再指向下一个记录编号的block在哪里,实际记录的是第二个block中。以此类推三间接就是利用第三层block来记录编号的,前两层的block都是放置记录区的内容。
若1个block的大小为1KB,下面我们看各层可以记录多少block
12个直接指向:12X1K=12K (直接连接,仅能记录12条block)
间接连接:256X1K=256K (每条block号码的记录会花掉4bytes,因此1个block会记录256条记录)
双间接:256X256X1K=64MB(第一层block会指定256个第二层,每个第二层又可以指定256个号码,就会对应256个block)
三间接:256X256X256X1K=16GB(第一层block会指定256个第二层,每个第二层又会指定256个第三层,每个第三层可以指定256个号码)
因此将以上四种方式加在一起约等于16GB,此时我们知道文件系统block格式化为1K大小时,能够容纳最大的文件为16GB,由于Ext2文件系统本身限制block的大小,因此2K和4K的block的大小,在此就不加介绍了,是同样的道理。
第五部分:实验操作查看当前文件系统
[root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 103081248 3759536 94078832 4% / tmpfs 953648 228 953420 1% /dev/shm /dev/sda1 194241 39059 144942 22% /boot /dev/sda3 20027260 44992 18958268 1% /testdir /dev/sr0 3824484 3824484 0 100% /media/CentOS_6.8_Final
[root@localhost ~]# dumpe2fs /dev/sda1 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: <none> Last mounted on: /boot (最后的挂载点) Filesystem UUID: 439d1457-04f7-4069-b3ac-04e77c29543c Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean (文件系统是没有) Errors behavior: Continue Filesystem OS type: Linux Inode count: 51200 (Inode的总数) Block count: 204800 (Block的总数) Reserved block count: 10240 Free blocks: 155182 (还有多少个block可用) Free inodes: 51161 (还有多少个inode可用) First block: 1
Block size: 1024 (每个block的大小为1024字节) Fragment size: 1024 Reserved GDT blocks: 256 Blocks per group: 8192 Fragments per group: 8192 Inodes per group: 2048 Inode blocks per group: 256 Flex block group size: 16 Filesystem created: Mon Jul 25 01:29:21 2016 Last mount time: Fri Jul 29 23:48:48 2016 Last write time: Fri Jul 29 23:48:48 2016
Mount count: 7 Maximum mount count: -1 Last checked: Mon Jul 25 01:29:21 2016 Check interval: 0 (<none>) Lifetime writes: 48 MB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 128 (每个inode为128字节) Journal inode: 8 Default directory hash: half_md4 Directory Hash Seed: e0fcf3ec-d918-4914-8e8b-34b7fa31b7f6 Journal backup: inode blocks Journal features: (none) Journal size: 4096k Journal length: 4096 Journal sequence: 0x0000002b Journal start: 1
本文仅为Linux的Ext2文件系统的inode和block的简单介绍,其中还有超级块,块对照表,inode对照表等以及和目录树的关系内容,我们先了解其基本原理,有助于我们接下来的学习。
本文出自 “Linux Study@薛帅” 博客,请务必保留此出处http://xueshuai.blog.51cto.com/11578473/1832162
原文地址:http://xueshuai.blog.51cto.com/11578473/1832162