关于Linux文件系统的的简单理解和认识
关于文件系统的运作,这与操作系统带的档案数据有关。例如Linux操作系统的档案权限(rwx)与文件属性(拥有者,群组,时间参数等)。文件系统通常会将这两部分的数据分别存放在不同的区块,权限与属性放置到inode中,至于实际数据则放置到date block区块中,另外,还有一个超级块区(super block)会记录整个文件系统的整体信息,包含inode与block的总量,使用量,剩余量等。
每个inode与block都有编号,至于这三个数据的意义可以简单说明如下:
super block :记录此 filessystem的整体信息,包括inode/block的总量,使用量,剩余量,以及文件系统的格式与相关信息等;(#这个文件系统对应的是一个分区,应该可以这样理解)
Inode 表:记录档案的属性,一个档案占用一个inode号,同时记录此档案的数据所在的block号码;
Block :实际记录档案的内容,若档案太大时,会占用多个block。
如果当一个分区分的容量分得比较大,所有的inode block superblock统一管理不是很方便,所以我们有在分区上存在分组的概念,把一个分区我们分成多个区块群组,不同的区块群组管理自身的inode block superblock号
Inode table (inode 表格)
(格式化分区的时候inode的数量和大小128bytes就已经固定)
数据内容:
该文件的权限(rwx);
该文件的拥有者与群组;
该文件的容量;
该文件建立或状态改变的时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
文件特定的标志(SUID SGID STICK)
该文件真正内容的指向(指向block)
Inode表的数据结构,表前面为文件的元数据基本信息,后面就是数据指向,如果文件太大有400M,分区的block大小假如为4K,由于inode表的容量有限 128字节,不可能有那边多的空间指针指向数据的block,通常情况下,一个inode表有12个直接数据指向,再就是间接指向,两间接指向,三间接指向
直接数据指向:一个指向只能指向一个block,所以12个直接指向只能代表48K的数据;
间接指向:间接指向指向一个block,该block上有1024的直接指向可以指向block,故一个间接指向可以表示4M的数据;
两重间接指向:相当与开始指向一个block有1024个间接指向指向block,每个block又有1024个直接指向数据块,所以可以表示:4K*1024*1024=4G;
三重间接指向:通过以上推理,一个三重间接指向可以代表 4T的数据;
# 由于inode的表容量有限,所以导致每个inode的表示的空间是有上限的,也就导致不同文件系统的单个分区容量也有上限.
superblock超级区块
Superblock是记录整个filesysytem相关信息的地方,没有Superblock,就没有文件系统,它记录的信息主要有:
Block和inode的总量;
未使用与已使用的block/inode数量;
Block与inode的大小(block为1 2 4 K ,inode为128bytes)
文件系统的挂载时间,最近一次写入数据的时间,最近一次检验磁盘的时间等文件系统的相关信息;
一个valid bit数值,若此文件系统已被挂载,则 valib bit 为0 ,若未被挂载,则valid bit为1
注意:dumpe2fs可以查看相关信息。superblock超级区块可能在不同的群组上存在,其它的superblock超级区块为备份的超级区块。
文件系统描述说明
这个区段可以描述每个block group 的开始与结束的block,以及说明每非区段分别存储与哪一个block号码之间。
Block bitmap(区块对照表)
如果你想要新增文件时总会用到block,但是需要使用哪一个block来记录呢?怎么知道哪些block是空的呢?从block bitmap中我们可以知道哪些block是空的,当删除一些数据,block bitmap表会记录block的标志位未使用,下次有数据存储时,就可以覆盖此处的block。
dumpe2fs /dev/sda1 来看看超级块中的数据信息
(好像只有ext系列的文件系统才可以使用本工具,请不在要xfs文件系统上使用该命令)
[root@love681 ~]# dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:
Last mounted on: /boot #分区挂载点
Filesystem UUID: 0ae2a047-9dd6-4bb1-a284-818f971865ea
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: 160134 #空闲的block数量
Free inodes: 51162 #空闲的是inode数量
First block: 1
Block size: 1024 #block单元大小为1K
Fragment size: 1024
Reserved GDT blocks: 256
Blocks per group: 8192 #一个群组中block的数量
Fragments per group: 8192
Inodes per group: 2048 #一个群组中inode的数量
Inode blocks per group: 256
Flex block group size: 16
Filesystem created: Fri Jul 22 15:51:06 2016
Last mount time: Mon Jul 25 11:28:22 2016
Last write time: Mon Jul 25 11:28:22 2016
Mount count: 6
Maximum mount count: -1
Last checked: Fri Jul 22 15:51:06 2016
Check interval: 0 (
Lifetime writes: 43 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: 9e14b616-ea5a-4fa3-b9ea-5c1ef844f87d
Journal backup: inode blocks
Journal features: (none)
Journal size: 4096k
Journal length: 4096
Journal sequence: 0x0000001b
Journal start: 0
Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
Checksum 0x5827, unused inodes 2010
Primary superblock at 1, Group descriptors at 2-2 #超级块的位置,群组描述符的位置
Reserved GDT blocks at 3-258 #
Block bitmap at 259 (+258), Inode bitmap at 275 (+274) #区块对应表位置,inode对应表的位置
Inode table at 291-546 (+290) #inode表的位置
3785 free blocks, 2010 free inodes, 6 directories, 2010 unused inodes
Free blocks: 4408-8192
Free inodes: 39-2048
Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xa798, unused inodes 2048
Backup superblock at 8193, Group descriptors at 8194-8194
Reserved GDT blocks at 8195-8450
Block bitmap at 260 (+4294959363), Inode bitmap at 276 (+4294959379)
Inode table at 547-802 (+4294959650)
390 free blocks, 2048 free inodes, 0 directories, 2048 unused inodes
Free blocks: 15995-16384
Free inodes: 2049-4096
目录的存储方式
在ext文件系统中,当新建一个目录,ext系统会分配一个inode与至少一块block给该目录,其中inode记录该目录的相关权限与属性,并记录分配到的那块block号码,而block则是记录在这个目录下的文件名和该文件名占用inode的号码数据,就如下:
Inode number |
文件名 |
654789 |
1.txt |
654790 |
2.txt |
654800 |
3.txt |
普通文件存储的方式:
在ext文件系统中,新建一个普通文件时,ext文件系统会分配一个inode与相对于该文件大小的block数量给该文件。例如:该文件的大小为100Kbytes,假如一个block大小为4kbytes,这inode需要记录25个block与之对应,为什么是25个,由于inode有12个直接指向,合计48kbytes,设置于的使用一个间接指向block,由该block存储剩余的文件。
目录树的读取
以上我们大概可以了解到,inode表中并不记录文件名与数据的对应关系,inode表记录文件的基本属性和block指向,指向的block中记录文件名和inode的对应关系。
由于目录树是又根目录开始的,因此新系统透过挂载的信息可以找到挂载点的inode号码(通常一个filesysytem的最顶层是inode号码由2号开始的,其实不知道是从2号开始的),因此只要读取到根的inode内容,就可以读取到该inode对应的block的数据,可以找到该目录下文件会目录对应inode的对相应关系。
举例说明:
如果我们想要读取/etc/passed这个文件的内容,系统是如何读取的呢?
[root@wCentos7 ~]# ll -di /etc/ /etc/passwd /
128 dr-xr-xr-x. 18 root root 4096 Jul 21 11:34 /
134313217 drwxr-xr-x. 129 root root 8192 Jul 30 12:53 /etc/
136822215 -rw-r--r--. 1 root root 2525 Jul 30 10:44 /etc/passwd
如上图,在我的实验的电脑上 / 的indoe号是128,etc目录的inode号是 13431327,文件passed inode号是136822215,我们来看看数据的读取过程:
1.通过挂载点获得 / 的inode号为128,(其实到底是通过说明方法获取到 / 的inode现在确实不了解),读取128 inode的数据内容,读取到对于执行程序的用户 root 权限时 ( r-x),就可以去读取inode对应的block的信息;
2. / 的block记录的是该目录下所有的文件名称与之inode的对应关系,在block中找到 etc/与之对应的inode号 13431327 ,则再去找13431327 inode号码;
3. Etc/的inode 号找到并且读取数据内容 读取权限为(rwx),即可读取到 block指向数据,程序执行者再去读取block的数据内容;读取到 passwd 对应的inode号码为 136822215 ,进而 去查找 136822215 inode表;
4.passwd的inode号 136822215 ,读取inode表中的数据,由于是管理员,有足够的权限可以继续访问,进而读取到 block的指向,我们读取block的数据内容,即可读取出 passwd的内容。
以上只是一个大概的过程,虽然不是很精确,但还是有助于我们理解ext的文件系统,又上述的理论只是我们可以做做一下总结:
1.ext文件系统为什么当个分区有分区大小限制,是由于本身的inode表大小有限,存储的block指向是有数量上限的;
2.ext文件系统中,删除数据,其实只是在inode表中清除block指向指针,在相应的block bitmap中标记该block为未使用状态,等到下次有数据需要存储的时候,把数据填充至编辑为未使用的block地方;
3.一个Ext文件系统中inode号是唯一的,
4.Ext文件系统查找实际查找数据是以inode号为准,inode表中不记录文件名,但是会记录block的指向,block中记录实际的数据。