ext2,ext3文件系统写入原理

时间:2022-10-25 15:10:19

我们在建立目录时,至少会占用一个inode和一个block.inode记录了文档的权限和属性,并记录了所分配的block号码,而block则记录了文件名和文件名的Inode号码。如果文件太多,就会利用更多的block来记录文件名。

可用ll -i来显示实际的inode号码。
在rhel5.1 即2.6.18内核中,我们用ll -i / 显示如下
[root@enterpriselinux /]# ll -i
total 144
1809921 drwxr-xr-x   2 root root  4096 May 24  2009 bin
1454401 drwxr-xr-x   3 root root  4096 May 24  2009 boot
    977 drwxr-xr-x  12 root root  4000 Mar  4 03:08 dev
2036161 drwxr-xr-x 100 root root 12288 Mar  4 03:08 etc
      2 drwxr-xr-x   4 root root  4096 May 24  2009 home
以上是ext3文件系统,在ext3文件系统中,我们可以看到所有目录都是1024的整数倍。也就是其实它是按照一块一块的block来存放的,而最小的block为1kb=1024b.所以都会是1024整数。当然,这只是在ext3中的情况,在现在的ext4文件系统中,并非如此。

一般挂载点的根目录inode号码都会是2.在同一挂载点内,inode号是唯一的。在不同的挂载点内,是可以相同的。如下:
[sunjiebin@rhel6 ~]$ df -h
文件系统              容量  已用  可用 已用%% 挂载点
/dev/sda5              12G  1.6G  9.7G  15% /
tmpfs                 504M     0  504M   0% /dev/shm
/dev/sda1            1008M   52M  906M   6% /boot
/dev/sda2             5.0G  151M  4.6G   4% /home
[sunjiebin@rhel6 dev]$ ll -id /  /boot /home
2 dr-xr-xr-x. 25 root root 4096 10月 19 12:40 /
2 dr-xr-xr-x.  5 root root 4096  7月 24 00:17 /boot
2 drwxr-xr-x.  7 root root 4096 10月 13 22:05 /home
 

当我们查找看一个文件的时候,比如查找/etc/passwd。大致流程是这样的:
[sunjiebin@rhel6 ~]$ ll -di / /etc/ /etc/passwd
     2 dr-xr-xr-x. 25 root root  4096 10月 19 12:40 /
131074 drwxr-xr-x. 95 root root 12288 10月 19 14:11 /etc/
138535 -rw-r--r--.  1 root root  1612 10月 19 14:03 /etc/passwd
首先根据挂载点/dev/sda5查找出/分区的inode号为2。然后查找/分区的inode中允许普通用户sunjiebin wx的权限,也就是有查看block的权限。继而查找到/分区的block,从中找出/etc的inode号131074。再根据/etc对应的inode,找到/etc目录。然后再查找/etc中inode的权限,发现有rx权限,继而查找到对应的passwd文件的inode为138535.然后再通过此找到passwd这个文件,再通过inode得知有查看权限,于是便读取passwd中的block数据。这样就完成了读取/etc/passwd的整个过程。

由于硬盘上的数据存取总是时进时出,所以会造成某些大文件可能存放在硬盘不同的block中,如果太过于零散,磁盘在读取时会不停的转动来寻找block。这样会造成磁盘性能的下降。只不过如果格式化磁盘,再重新将数据拷进去,就会让数据分块重新排列,效率就更高了。当然,也可用磁盘整理来提高性能。当然,这在ext4文件系统中得到了很大的提升,ext4通过采用extents,多块分配,延迟分配来进行大数据的分配。在ext3中,文件只能以每一个block块来存取,而每个块又最大只能4k,这样存放大文件就要一次次读取很多块。而ext4能够将数据以block组来分配,大大减少处理量。增加了速率。

要数据写入文件,文件系统会先判断是否有写入的权限,然后再查找是否有inode bitmap 与block bitmap中有没有没有使用的号码,将实际权限写入到inode中,将数据写入到block中,然后再更新inode bitmap,block bitmap superblock. 如果我们在写入数据时突然中断,那么数据在block中有了,却没有同步到block bitmap中。那么就会造成bitmap中的指向内容与实际数据不一致。那么就得进行磁盘检测。如果磁盘太大,那这样的检查将非常耗时。所以诞生了ext3文件系统。

ext3文件系统新增了日志功能。在文件系统中划分出一个区块,用于记录日志,也就是在写入数据之前,将写入文件的信息写进日志中;然后数据开始将属性与权限inode,将数据写入block;再将写入的信息更新到inode bitmap, block bitmap, superblock中。再将操作完成的信息记录在日志中!这样的话,如果说我们在写入一个文件时突然非正常中断,那么在日志文件中就会发现该文件只有开始写入的信息,而没有写入完成的记录。就可以通过此记录知道哪个文件并没有完全写入完成,这时候只需要针对该文件进行核对很快就可以恢复数据的完整性!而不用去查找整个分区的数据来进行数据与数据表的同步!而在ext4中,还增加了日志校验功能,并且提供无日志模式以适应某些高性能的特殊需求。

 

本文出自 “小子无名” 博客,请务必保留此出处http://linuxroad.blog.51cto.com/765922/691545