文件的系统特性
Linux的正规文件系统为Ext2
文件数据除了文件实际内容外,还包括其他属性(文件权限、文件属性)。
文件系统将这两部分数据分别存放在不同的块,权限和属性放在inode内,实际数据放在data block块中。此外还有一个super block,记录整个文件系统的信息。
- super block:记录文件系统的整体信息,包括inode/block的总量、使用量和剩余量。
- inode:记录文件的属性,一个文件占用一个inode,同时记录文件数据所在的block号码
- block:实际记录文件的内容,若文件很大,会占用多个block
Ext2属于索引式文件系统,所有block都记录在inode中,与之不同的FAT格式则没有inode存在,因此FAT格式无法一开始就把所有block全部读取出来,每个block号码都记录在前一个block中。如果block分布离散,则读取时间很长,因此FAT需要碎片整理,将同一个文件的block汇整到一起。
因为Ext2是索引式文件系统,基本不需要碎片整理(不绝对)。
Linux的Ext2文件系统(inode)
为了便于管理,Ext2文件系统在格式化的时候区分多个块组(block group),每个块组都有自己独立的inode/block/superblock系统。
在整体规划时,文件系统最前面有一个启动扇区,这个启动扇区可以安装引导装载程序。
个人理解:磁盘分区后,针对每个分区都要进行格式化,所以Ext2文件系统是对于每个分区而言的。
Ext2格式化后如下表所示:
启动扇区 | block group1 | block group2 | block group3 | …… |
每个块组如下表所示:
super block | 文件系统描述 | 块对应表 | inode对应表 | inode table | data block |
data block(数据块)
大小有1kb,2kb,4kb
block的大小会影响文件系统能够支持的最大磁盘容量和最大单一文件容量
每个块最多只能存放一个文件,每个文件最少占有一个数据块。
inode table(inode表格)
存放文件的属性和文件数据所在的block号
每个inode大小均为128bytes,每个文件都仅占用一个inode
文件系统能创建的数目和inode数量有关
系统读取文件时,先找到inode,并分析inode记录的权限和用户是否一致,符合才读取对应的block
分析:
一个inode大小128bytes,记录一个block需要4bytes,如果文件特别大,则会有许多的block,显然inode空间不足以记录,因此inode记录block区域定义为:12个直接、一个间接、一个双间接、一个三间接。
假设每个block大小为1k:
12个直接:12*1k=12k
间接:256*1k=256k 间接指inode记录一个块的号码,这个块记录的是所有实际数据块的号码,每个块大小1k,记录一个块号码需要4bytes,则每个块能记录1k/4bytes=256条记录。
双间接:256*256*1k
三间接:256*256*256*1k
总额:12k+256k+256*256k+256*256*256k = 16G
super block(超级块)
记录整个文件系统信息。包括block和inode总量,未使用量,block和inode的大小(block:1k,2k,4k inode:128bytes)
super block大小为1024bytes
除了第一个block group内含有super block外,其余block group不一定含有super block,若含有,则为第一个block group的super block备份,用于super block的救援
File system Description(文件系统描述)
该区段用于描述每个block group的开始和结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,datablock)分别介于哪一个block号码之间
block bitmap(块对应表)
记录哪些block是空的,添加文件时,迅速找到可使用空间。当删除文件时,也会标记对应块为未使用状态。
inode bitmap(inode对应表)
记录使用与未使用的inode号码
查看文件系统
dumpe2fs指令(仅仅适用于ext2文件系统)
与目录树的关系
文件和目录都占用一个inode,根据文件内容大小分配多个block,目录的内容是文件名,因此文件名存放在目录的block内。文件对应的inode不记录文件名。
举例:
假设需要读物/etc/passwd这个文件,系统如何读取?
//首先显示下各级目录及文件的inode号码
[root@localhost ~]# ls -dli / /etc /etc/passwd 128 dr-xr-xr-x. 17 root root 4096 6月 29 08:50 / 134311585 drwxr-xr-x. 142 root root 8192 6月 29 08:48 /etc 138481090 -rw-r--r--. 1 root root 2386 6月 24 19:34 /etc/passwd
1. 首先找到根目录的inode号码为128,inode具有的root权限为读取和执行,我们可以读取其block内容
2. 经过上面步骤,我们获得/的block的号码,并找到该内容有etc/目录的inode号码(134311585)
3. 读取134311585的inode号码后,获取etc/的inode,得知root具有对该目录的rwx权限,因此可以读取etc/的目录
4. 通过上面的inode,可以取得block号码,并找到文件passwd的inode号码(138481090)
5. 读取138481090得到inode,得知root具有rw权限,因此可以读取passwd的block
6.根据上面得到的inode,得到block号码,读取block内容
Ext2/Ext3文件的访问与日志文件系统的功能
新增一个文件或目录时文件系统的行为:
1.确定用户对于添加文件的目录是否有w和x的权限
2.根据inode bitmap找到未使用的inode,并将新文件的权限和属性写入
3.根据block bitmap找到未使用的block,并将实际数据写入,更新inode的block指向数据。
4.将刚才写入inode和block数据同步更新inode bitmap和block bitmap,并更新super block
数据的不一致性:
当上述操作过程出现故障,导致部分写入,比如第四步未完成。
日志文件系统:
在文件系统中规划一个块,专门记录写入或修订文件的步骤。
Ext2的升级版本Ext3支持日志功能。
Linux文件系统的操作:
Linux对文件的写入采用异步处理,当系统加载一个文件到内存后,如果文件未被修改,则在内存区段的文件数据会被设置为clean,如果内存中的文件被修改了,内存的数据被设为dirty,系统会不定时的将内存中设为dirty的数据写入到磁盘。可以使用sync指令手动写入
载点的意义
文件系统必须连接到目录树才能被我们使用,将文件系统与目录树结合的操作称为挂载。
挂载点一定是目录,该目录为进入该文件系统的入口。
VFS(虚拟文件系统)
用于管理所有Linux的文件系统
文件系统的简单操作
磁盘与目录的容量:df,du
df:列出文件系统的整体磁盘使用量
-a:列出所有文件系统,包括/proc等
-h:以合适的方式显示容量单位
-i:不用硬盘容量,而用inode数量显示
[root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/centos-root 47957116 5028252 42928864 11% / devtmpfs 1892188 0 1892188 0% /dev tmpfs 1907756 88 1907668 1% /dev/shm tmpfs 1907756 9076 1898680 1% /run tmpfs 1907756 0 1907756 0% /sys/fs/cgroup /dev/mapper/centos-home 23413588 94120