SylixOS TPSFS文件系统掉电安全原理浅析

来源:互联网 发布:java 发布webservice 编辑:程序博客网 时间:2024/05/29 12:50
文件系统要解决的一个关键问题就是防止掉电或系统崩溃造成数据损坏,TPSFS采用事务提交机制来保证文件系统安全。举个例子分析采用事务与非事务的区别,我们对一个文件进行写操作,可能的步骤简化上是(想看源码的在IDE全局搜tpsFsWrite):
    1.从空间inode列表获取块(1个小事务)
    2.把块号记录到文件inodeB+树下(1个小事务)
    3.对该块进行写操作(1个小事务)
    4.修改inode块,比如要修改文件大小,更新时间等(1个小事务)
如果没有事务机制,则直接进行写数据块操作,
如果1操作完成,2操作时断电,结果是文件系统状态不一致,分配的块丢失。
如果2完成,3断电则写入的数据丢失。
如果3完成,4断电则还是白写。
TPSFS采用事务写机制,它的原理是在进行写操作之前,把各个步骤看为是一个个小事务,整体算一个大事务。TPSFS会把各个小事务先写进日志块区域,日志全部写进成功之后,再把它写进数据块区域。
如果在保存日志的过程中发生掉电,则文件系统会忽略整个大事务。
如果在写真实数据区域时发生掉电,则文件系统上电后可以重新提交该事务。
TPSFS采用这种方式保证文件系统的一致性和完整性。
TPSFS在第三步写文件时并不采用事务机制,而是采用非事务写,就是说文件内容并不会保存到日志。(文件数据比较大,事务写效率不高而且浪费空间)
其他
1.       数据块区域的内容
TPSFS数据块大小为4096字节,为4个扇区。它是文件系统为文件或者目录分配的最小单位。
数据块区域不仅仅是文件数据,它里面至少有四种数据。
    1.  元数据,就是inode节点,一个文件或者一个目录都有一个inode节点,保存它的属性
    2.  目录数据,目录也被看做一个文件,只不过它里面的数据是目录下文件或者目录所对应的文件号(就是inode)和文件名。
    3.  文件数据。
    4.  TPSFS一个inode块后面是B+树的node节点,
如果一个块是inode块,则inode占用一个扇区大小(inode结构体要比512小很多),该块内的数据区起始于2048字节,中间是node节点(node节点应该是数据区不够大时,用来连接其他块的,这个node还和b+树相关,看得不是太懂)
如果一个块被分给目录数据时,那它里面就只有目录数据,不会有文件数据,也不会有inode节点。
如果一个块被分给文件数据时,那它里面就只有文件数据,不会有目录数据和inode节点。
TPSFS只有在写文件数据时采用非事务写,其他都采用事务写机制。

2.找到/root/目录1/1.txt的过程
    1.根目录的inode节点文件系统写死为2,找到inode节点块号为
    2根据node节点找到根目录数据块(比如100),读出数据,找到文件名为目录1的区域,读出目录1所对应的inode号(比如500)。
    3.再根据目录1node节点找到目录1的数据块,找到文件名为1.txtinode号。
    4.根据inode号后面的node节点找到1.txt的数据块。
(大致流程是这样,不过TPSFS应用B+树,也许不会访问这么多次硬盘)

3. 不采用事务机制,掉电时,写一个文件为什么可能会影响其他的文件。
比如修改某个文件名时,它修改的是父目录的数据块,并且硬盘写是以扇区为单位进行写。如果此时掉电,可能这个扇区数据都会损坏,则会影响到同目录下其他的文件。
1 0