发明内容
本发明的目的是为了克服上述背景技术的不足,提供一种Linux文件系统的多点备份和实时保护方法,不仅能够快速备份、快速还原Linux文件系统到任意备份版本,而且还能够实时保护Linux文件系统不被修改。
本发明提供的Linux文件系统的多点备份和实时保护方法,包括以下步骤:A、在Linux文件系统存储介质的未使用空间上建立备份区,对Linux文件系统的读写操作进行实时监控,将修改Linux文件系统的数据存储到备份区,并标记为备份版本,对Linux文件系统进行备份;B、备份区支持保存多个备份版本,还原Linux文件系统时,按照所选择的备份版本对Linux文件系统进行还原;C、拦截对Linux文件系统存储介质的读写请求,防止未授权的读写操作,实时保护Linux文件系统和备份区。
在上述技术方案中,步骤A中建立备份区的过程如下:A101、将Linux文件系统的存储介质连续划分为固定大小的块,并顺次对块进行编号;A102、在保存Linux文件系统的存储介质上划分一块未被Linux文件系统使用的空闲区域作为备份区;A103、在备份区建立参数区,保存块引用计数表、备份版本信息表、映射数据缓冲区信息表和备份版本描述信息区;A104、在备份版本描述信息区,保存每个备份版本的块类型表和块映射表,块的类型包括:有效数据、空闲、临时有效数据、正式映射源、临时映射源,块映射表中包括映射源块号src和映射目标块号dst;A105、在备份区建立映射数据缓冲区,保存每个备份版本中产生的映射目标块,缓冲区的参数由映射数据缓冲区信息表维护;A106、初始化备份区,自动创建Linux文件系统的初始备份版本;A107、自动创建临时备份版本。
在上述技术方案中,步骤A103中的备份版本信息表中的每条记录包括以下字段:唯一id、备份版本类型type、备份版本的描述信息desc、备份版本的块类型表在备份版本描述信息区的偏移位置blk_type_table、备份版本的块映射表在备份版本描述信息区的偏移位置blk_redir_table;映射数据缓冲区信息表记录了预分配的缓冲区的属性信息,包括以下字段:缓冲区的起始位置begin、缓冲区的结束位置end、缓冲区中首个未分配的空闲块在缓冲区的偏移位置free_offset。
在上述技术方案中,步骤A106中创建Linux文件系统的初始备份版本的过程如下:A1061、扫描Linux文件系统,识别Linux文件系统的有效数据,修改块引用计数表,有效数据占用的块计为1,其他块计为0;A1062、修改备份版本信息表的第一条记录,设置唯一id,修改type为正式备份版本,设置blk_type_table指向备份版本描述信息区的第一条记录的块类型表存储地址,设置blk_redir_table指向备份版本描述信息区的第一条记录的块映射表存储地址;A1063、修改备份版本描述信息区的第一条记录的块类型表,将有效数据占用块设置为有效数据,将其他块设置为空闲;A1064、修改备份版本描述信息区的第一条记录的块映射表,将所有记录清0;A1065、修改映射数据缓冲区信息表,设置free_offset设为0。
在上述方案中,步骤A107中创建临时备份版本的过程如下:
A1071、复制备份版本描述信息区的第一条记录的块类型表和块映射表到第二条记录;
A1072、修改备份版本信息表的第二条记录,设置id为0,设置type为临时备份版本,设置blk_type_table指向备份版本描述信息区的第二条记录的块类型表,设置blk_redir_table指向备份版本描述信息区的第二条记录的块映射表。
在上述技术方案中,步骤A中对Linux文件系统进行备份的过程如下: A201、查询备份版本信息表,找到第一个临时备份版本的记录,称为BP1;A202、遍历BP1的块类型表,找到类型为“临时有效数据”和 “临时映射源”的块,在块引用计数表中将对应块的引用计数加1;A203、修改BP1的块类型表,将类型“临时有效数据”改为“有效数据”,将类型“临时映射源”改为“正式映射源”;A204、修改BP1,设置type为正式备份版本,设置唯一id;A205、复制BP1在备份版本描述信息区中的记录,称为BD2;
A206、查询备份版本信息表,找到第一个id为0的备份版本记录,称为BP2,修改BP2,设置blk_type_table指向BD2的块类型表,设置blk_redir_table指向BD2的块映射表。
在上述技术方案中,步骤B中还原Linux文件系统的过程如下:B1、选择待还原的备份版本,作为源备份版本;B2、查询备份版本信息表中源备份版本的记录SRC-BP;B3、查询备份版本信息表中的临时备份版本记录,如果不存在,查询第一个id为0的备份版本记录,被查询到的记录称为TMP-BP,修改该记录的类型为临时版本;B4、用SRC-BP的块类型表覆盖TMP-BP的块类型表;B5、回收TMP-BP映射数据占用的缓冲块;B6、用SRC-BP的块映射表覆盖TMP-BP的块映射表。
在上述技术方案中,步骤C中拦截对Linux文件系统存储介质的读写请求的实现过程如下:实模式环境下,通过拦截Int13实现过滤读写操作;Linux系统环境下,通过拦截存储设备类驱动提供给上层通用块设备驱动的接口函数实现过滤读写操作。
在上述技术方案中,步骤C中实时保护备份区的过程如下:拦截对Linux文件系统存储介质的读写请求后,若判定被读写块属于备份区的空间范围,则只向调用者返回成功状态,不执行I/O操作。
在上述技术方案中,步骤C中实时保护Linux文件系统的过程如下:
C1、查询备份版本信息表中临时版本的备份版本记录BP2;
C2、拦截到对Linux文件系统的读操作请求后,以被请求块的块号为索引,在BP2的块类型表中查询被请求块的类型,如果被请求块的类型为“有效数据”、“空闲”或“临时有效数据”,则直接读被请求块的数据;如果被请求块的类型为“正式映射源”或“临时映射源”,则以被请求块号为索引,在BP2的块映射表中查找块的映射关系记录,根据记录的dst字段,获得映射目标块号,从映射数据缓冲区读取映射目标块的内容;
C3、拦截到对Linux文件系统的写操作请求后,以被请求块的块号为索引,在BP2的块类型表中查询被请求块的类型,C301、如果被请求块的类型为“空闲”且块的引用计数为0,则直接修改被请求块的数据,然后在BP2的块类型表中将块类型“空闲”改为“临时有效数据”;C302、如果被请求块的类型为“空闲”且块的引用计数大于0,则执行以下步骤:
C3021、从映射数据缓冲区申请一个缓冲块;
C3022、申请一个内存缓冲区,从被请求块读取块的原始内容到内存缓冲区;
C3023、将写请求的内容写入内存缓冲区;
C3024、将内存缓冲区的内容写入缓冲块;
C3025、在BP2的块映射表中增加一条记录,记录的src字段是被请求块的块号,记录的dst字段是缓冲块的块号;
C3026、修改BP2的块类型表,将被请求块的类型“空闲”改为“临时映射源”;
C303、如果被请求块的类型为“临时有效数据”,则直接修改被请求块的内容;
C304、如果被请求块的类型为“有效数据”,则执行以下步骤:
C3041、从映射数据缓冲区申请一个缓冲块;
C3042、申请一个内存缓冲区,从被请求块读取块的原始内容到内存缓冲区;
C3043、将写请求的内容写入内存缓冲区;
C3044、将内存缓冲区的内容写入缓冲块;
C3045、修改BP2的块映射表,增加一条新记录,src字段是被请求块的块号,dst字段是缓冲块的块号;
C3046、修改BP2的块类型表,将被请求块的类型“有效数据”改为“临时映射源”;
C305、如果被请求块的类型为“临时映射源”,则以被请求块的块号为索引,查询BP2的块映射表,根据记录的dst字段,获得映射目标块号,用写请求的内容修改映射目标块;
C306、如果被请求块的类型为“正式映射源”,则执行以下步骤:
C3061、从映射数据缓冲区申请一个缓冲块;
C3062、申请一个内存缓冲区,以被请求块的块号为索引,查询BP2的映射表获得映射目标块号,读取映射目标块的内容到内存缓冲区;
C3063、将写请求的内容写入内存缓冲区;
C3064、将内存缓冲区的内容写入缓冲块;
C3065、修改BP2的块映射表,将被请求块的记录的dst字段改为缓冲块的块号;
C3066、修改BP2的块类型表,将被请求块的类型“正式映射源”改为“临时映射源”。
与现有技术相比,本发明的优点如下:
(1)本发明能够实现Linux文件系统变化数据的在线增量备份,由于备份时只备份变化数据,因此备份效率高,对Linux文件系统的I/O性能影响小。
(2)还原Linux文件系统时,不需要复制数据,因此还原速度快,解决用户因为误操作或恶意软件破坏造成的文件系统数据被修改,而无法快速恢复的问题。
(3)本发明支持保存多个增量备份版本,还原时可以选择恢复Linux文件系统到任意备份版本。
(4)本发明能够实时保护Linux文件系统不被修改,所有的修改内容被转储到缓冲区,原始数据不被修改,提高了Linux文件系统的安全性。
具体实施方式
下面结合附图及实施例对本发明作进一步的详细描述。
参见图1所示,硬盘上有A、B两个分区,Linux操作系统占用的分区A和B的文件系统需要备份和保护,默认保护策略为每次还原,即每次引导Linux操作系统前,自动还原操作系统到最近一次的备份版本。
针对硬盘分区结构和文件系统的备份保护需求,本发明实施例提供的Linux文件系统的多点备份和实时保护方法,包括以下步骤:
A、在Linux文件系统存储介质的未使用空间上建立备份区,对Linux文件系统的读写操作进行实时监控,将修改Linux文件系统的数据存储到备份区,并标记为备份版本,对Linux文件系统进行备份;
B、备份区支持保存多个备份版本,还原Linux文件系统时,按照所选择的备份版本对Linux文件系统进行还原;
C、拦截对Linux文件系统存储介质的读写请求,防止未授权的读写操作,实时保护Linux文件系统和备份区。
步骤A中建立备份区的过程如下:
A101、将Linux文件系统的存储介质连续划分为固定大小的块,从零开始顺次对块进行编号;
A102、参见图1所示,在保存Linux文件系统的存储介质上划分一块未被Linux文件系统使用的空闲区域作为备份区;
A103、参见图2所示,在备份区建立参数区,保存块引用计数表、备份版本信息表、映射数据缓冲区信息表和备份版本描述信息区,具体步骤如下:
A1031、建立“块引用计数表”, 块引用计数表记录了每个块被多少个备份版本使用,每个块的初始引用计数为0;
A1032、建立“备份版本信息表”, 备份版本信息表记录了每个备份版本的属性信息,表中包含256个记录,表示最多支持256个备份版本。每个记录的初始id字段为0,表示备份版本还未使用,每条记录对应一个备份版本,每条记录包括以下字段:
字段名称 |
描述 |
id |
每个id必须确保唯一性 |
type |
备份版本类型,有两种类型:正式备份版本、临时备份版本 |
desc |
描述备份版本的信息 |
|
|
|
|
blk_type_table |
备份版本的块类型表在备份版本描述信息区的偏移位置 |
blk_redir_table |
备份版本的块映射表在备份版本描述信息区的偏移位置 |
A1033、建立“映射数据缓冲区信息表”,映射数据缓冲区信息表记录了预分配的缓冲区的属性信息,包括以下字段:
字段名称 |
描述 |
begin |
缓冲区的起始位置 |
end |
缓冲区的结束位置 |
free_offset |
缓冲区中首个未分配的空闲块在缓冲区的偏移位置 |
初始化时,设置begin字段为备份区中参数区的结束位置占用块的块号+1,设置end字段为备份区的结束位置占用块的块号,free_offset字段设置为0。
A104、参见图3所示,建立备份版本描述信息区,保存每个备份版本的描述信息,每个备份版本的描述信息包括块类型表和块映射表,块的类型包括:有效数据、空闲、临时有效数据、正式映射源、临时映射源,块映射表中包括映射源块号src和映射目标块号dst;
其中,块类型表记录Linux文件系统包含的所有块的类型:
字段名称 |
描述 |
有效数据 |
Linux文件系统的有效数据占用块 |
空闲 |
未被Linux文件系统使用的块 |
临时有效数据 |
临时备份版本中新占用的块,占用前为空闲块 |
正式映射源 |
在正式的备份版本中已被映射的块 |
临时映射源 |
在临时的备份版本中新发生的被映射块 |
块映射表记录备份版本中存在的块映射关系,包含两个字段:
字段名称 |
描述 |
Src |
被映射的块的块号,称为映射源块 |
Dst |
保存映射内容的缓冲区块的块号,称为映射目标块 |
A105、在备份区建立映射数据缓冲区,保存每个备份版本中产生的映射目标块,缓冲区的参数由映射数据缓冲区信息表维护;
A106、初始化备份区,自动创建Linux文件系统的初始备份版本,过程如下:
A1061、扫描Linux文件系统,识别Linux文件系统的有效数据,修改块引用计数表,有效数据占用的块计为1,其他块计为0;
A1062、修改备份版本信息表的第一条记录,设置唯一id,修改type为正式备份版本,设置blk_type_table指向备份版本描述信息区的第一条记录的块类型表存储地址,设置blk_redir_table指向备份版本描述信息区的第一条记录的块映射表存储地址;
A1063、修改备份版本描述信息区的第一条记录的块类型表,将有效数据占用块设置为有效数据,将其他块设置为空闲;
A1064、修改备份版本描述信息区的第一条记录的块映射表,将所有记录清0;
A1065、修改映射数据缓冲区信息表,设置free_offset设为0。
A107、自动创建临时备份版本,过程如下:
A1071、复制备份版本描述信息区的第一条记录的块类型表和块映射表到第二条记录;
A1072、修改备份版本信息表的第二条记录,设置id为0,设置type为临时备份版本,设置blk_type_table指向备份版本描述信息区的第二条记录的块类型表,设置blk_redir_table指向备份版本描述信息区的第二条记录的块映射表。
实际应用中初始化的具体步骤如下:
1、对硬盘进行扫描,识别出已规划分区,并读取存储在分区内的文件系统标识信息。
2、对硬盘进行块划分,每个块的容量为64KB。块的编号从0开始,在硬盘的剩余空间区域,划分一块空间,建立备份区。
3、对备份区进行第一阶段初始化,具体包括:
3.1、建立“块引用计数表”,每个块的引用计数为0;
3.2、建立“备份版本信息表”,表中包含256个记录,表示最多支持256个备份版本。每个记录的id字段为0,表示备份版本还未使用。
3.3、建立“映射数据缓冲区信息表”,设置begin字段为备份区中参数区的结束位置占用块的块号+1,设置end字段为备份区的结束位置占用块的块号,free_offset字段设置为0。
4、安装拦截硬盘读写操作的程序,具体步骤如下:
4.1、修改硬盘的MBR的启动代码,获得引导操作系统之前的计算机系统控制权,包括实现引导操作系统之前拦截硬盘读写。
4.2、在Linux操作系统中安装内核层驱动,拦截存储设备类驱动提供给上层通用块设备驱动的接口函数,实现在Linux操作系统中拦截硬盘读写。
5、对备份区进行第二阶段初始化,创建初始备份版本,具体包括以下步骤:
5.1、扫描Linux分区,根据分区的文件系统类型,识别文件系统有效数据,在“块引用计数表”中将有效数据占用的块的引用计数设置为1。
5.2、修改“备份版本信息表”中第一条记录的内容,建立初始备份点:使用随机数算法,生成唯一的备份版本id;备份版本类型设置为正式版本;初始化“块状态表”,将文件系统的有效数据占用的块的状态标记为“有效数据”,文件系统占用的其他块的状态标记为“空闲”;初始化“块映射表”,所有的记录设置为0,表示没有块被映射。
参见图4所示,上述初始化环境步骤完成后,Linux系统的文件系统处于保护状态。
本发明实施例步骤A中对Linux文件系统进行备份的过程如下:
A201、计算机系统引导,调用硬盘的MBR的引导程序时,本系统获得控制权,用户选择备份Linux操作系统,在备份版本描述信息中描述本次备份的修改说明;遍历备份区的备份版本信息表,找到临时备份版本的记录,称为BP1;遍历BP1的块类型表,找到类型为“临时有效数据”和 “临时映射源”的块,在块引用计数表中将对应块的引用计数加1;
A202、修改BP1的块类型表,将类型“临时有效数据”改为“有效数据”,将类型“临时映射源”改为“正式映射源”;
A203、修改BP1的type为正式备份版本。
A204、复制BP1在备份版本描述信息区中的记录,称为BD2;
A205、查询备份版本信息表,找到第一个id为0的备份版本记录,称为BP2,修改BP2,设置blk_type_table指向BD2的块类型表,设置blk_redir_table指向BD2的块映射表。
本发明实施例步骤B中还原Linux文件系统的过程如下:
B1、计算机系统引导,调用硬盘的MBR的引导程序时,本系统获得控制权,用户选择手工还原Linux操作系统,加载备份区的备份版本信息表,向用户呈现备份版本列表;
B2、用户从备份列表中选择还原到哪个备份版本,其对应的在备份版本信息表中的记录称为SRC-BP,查询备份版本信息表中源备份版本的记录SRC-BP;
B3、查询备份版本信息表中的临时备份版本记录,如果不存在,查询第一个id为0的备份版本记录,被查询到的记录称为TMP-BP,修改该记录的类型为临时版本;
B4、用SRC-BP的块类型表覆盖TMP-BP的块类型表;
B5、回收TMP-BP映射数据占用的缓冲块:遍历TMP-BP的块映射表,找到映射目标块的块编号最小的记录,用这个块编号减去缓冲区信息表的begin字段,得到的结果赋值给缓冲区信息表的free_offset字段;
B6、用SRC-BP的块映射表覆盖TMP-BP的块映射表。
本发明实施例步骤C中实时保护Linux文件系统的过程如下:
C1、计算机系统引导,调用硬盘的MBR的引导程序时,本系统获得控制权,查询“备份版本信息表”,找到临时版本的备份版本记录,称为BP2;
C2、在实模式和保护模式下,拦截到对Linux文件系统的读操作请求后,拦截中断Int13,实现计算机实模式下的硬盘读写过滤,调用bootloader,加载Linux操作系统。Linux操作系统内核执行过程中,内核层驱动被加载运行,驱动扫描内核的块设备驱动链表,通过拦截存储设备类驱动提供给上层通用块设备驱动使用的读写接口函数,实现Linux操作系统切换到计算机保护模式后的硬盘读写过滤;拦截对Linux文件系统存储介质的读写请求后,若判定被读写块属于备份区的空间范围,则只向调用者返回成功状态,不执行I/O操作;
以被请求块的块号为索引,在BP2的块类型表中查询被请求块的类型,如果被请求块的类型为“有效数据”、“空闲”或“临时有效数据”,则直接读被请求块的数据;如果被请求块的类型为“正式映射源”或“临时映射源”,则以被请求块号为索引,在BP2的块映射表中查找块的映射关系记录,根据记录的dst字段,获得映射目标块号,从映射数据缓冲区读取映射目标块的内容;
C3、在实模式和保护模式下,以被请求块的块号为索引,在BP2的块类型表中查询被请求块的类型,拦截到对Linux文件系统的写操作请求后,执行以下操作:
C301、如果被请求块的类型为“空闲”且块的引用计数为0,则直接修改被请求块的数据,然后在BP2的块类型表中将块类型“空闲”改为“临时有效数据”;
C302、如果被请求块的类型为“空闲”且块的引用计数大于0,则执行以下步骤:
C3021、从映射数据缓冲区申请一个缓冲块;
C3022、申请一个内存缓冲区,从被请求块读取块的原始内容到内存缓冲区;
C3023、将写请求的内容写入内存缓冲区;
C3024、将内存缓冲区的内容写入缓冲块;
C3025、在BP2的块映射表中增加一条记录,记录的src字段是被请求块的块号,记录的dst字段是缓冲块的块号;
C3026、修改BP2的块类型表,将被请求块的类型“空闲”改为“临时映射源”;
C303、如果被请求块的类型为“临时有效数据”,则直接修改被请求块的内容;
C304、如果被请求块的类型为“有效数据”,则执行以下步骤:
C3041、从映射数据缓冲区申请一个缓冲块;
C3042、申请一个内存缓冲区,从被请求块读取块的原始内容到内存缓冲区;
C3043、将写请求的内容写入内存缓冲区;
C3044、将内存缓冲区的内容写入缓冲块;
C3045、修改BP2的块映射表,增加一条新记录,src字段是被请求块的块号,dst字段是缓冲块的块号;
C3046、修改BP2的块类型表,将被请求块的类型“有效数据”改为“临时映射源”;
C305、如果被请求块的类型为“临时映射源”,则以被请求块的块号为索引,查询BP2的块映射表,根据记录的dst字段,获得映射目标块号,用写请求的内容修改映射目标块;
C306、如果被请求块的类型为“正式映射源”,则执行以下步骤:
C3061、从映射数据缓冲区申请一个缓冲块;
C3062、申请一个内存缓冲区,以被请求块的块号为索引,查询BP2的映射表获得映射目标块号,读取映射目标块的内容到内存缓冲区;
C3063、将写请求的内容写入内存缓冲区;
C3064、将内存缓冲区的内容写入缓冲块;
C3065、修改BP2的块映射表,将被请求块的记录的dst字段改为缓冲块的块号;
C3066、修改BP2的块类型表,将被请求块的类型“正式映射源”改为“临时映射源”。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。