前述:Linux系统管理员很重要的任务之一就是管理好本身的磁盘文件系统,每一个分区不可太大也不能够过小,太大会致使磁盘容量的浪费,过小会致使产生的文件没法存储的问题。在Linux里面文件是由两部分数据组成,一部分是metadata,另外一部分是data。那么这些数据都存放在文件系统的什么地方呢?这就让咱们必须得了解文件系统的Inode与Block的基本原理了,而Linux最传统的磁盘文件系统使用的是Ext2,因此咱们了解下它的内部原理。node
第一部分:磁盘的组成和分区(基础)bash
磁盘的机械部分:
服务器
一、圆形的盘片(主要记录数据的部分)
ide
二、机械手臂与机械手臂上的磁头(可读写盘片上的数据)
性能
三、主轴马达,能够转动盘片,让机械手臂的磁头在盘片上读写数据
学习
磁盘的基本概念
flex
一、扇区是最小的物理存储单元(512bytes)
ui
二、将扇区组成一个园,那就是柱面,柱面是分区的最小单位
spa
三、第一个扇区最重要,里面有硬盘的主引导程序(MBR)占446bytes和分区表(partision tables)占64bytes。操作系统
四、目前流行的家用硬盘接口SATA和服务器硬盘接口SAS。
磁盘分区部分:
一、主分区和扩展分区最多能够有4个(硬盘的限制)
二、扩展分区最多只能有一个(操做系统限制)
三、逻辑分区是由扩展分区分化出来的分区
四、主分区和逻辑分区的内容能够被格式化,而扩展分区没法格式化
第二部分:文件系统的基本特性
咱们都知道硬盘分区后都是须要格式化,以后操做系统才能使用该分区,为何呢?这是由于各类操做系统的文件的属性和权限并不相同的,为了可以存放这些文件,所以将分区格式化,以成为操做系统能利用的系统格式。
文件系统一般会将两部分的数据分别放在不一样的块,权限与属性放置到inode中,实际的数据放置到 data block块中,另外还有一个超级块(superblock)会记录整个文件系统的总体信息,包括inode和block的总量、使用量、剩余量,以及文件系统的格式与信息。inode会记录文件的属性,一个文件会占用一个inode,同时会记录文件的数据所在的block号码,block实际会记录文件的内容,若文件太大,会占用多个block。
第三部分:Linux的Ext2文件系统
一、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。
二、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对照表等以及和目录树的关系内容,咱们先了解其基本原理,有助于咱们接下来的学习。