发明名称 面向类Linux操作系统的磁盘数据保护方法
摘要 本发明公开一种面向类Linux操作系统的磁盘数据保护方法。技术方案是修改Loop设备的4个函数,在loop_init开始处加入DSP_init(),在lo_receive开始处加入DSP_receive(),在lo_send开始处加入DSP_send(),在loop_exit开始处加入DSP_exit(),生成loop.ko;加载loop.ko,DSP_init()进行初始化;若用户请求为读取磁盘数据,DSP_receive()对pos进行修改;若用户请求为写入磁盘数据,DSP_send()对pos进行修改;若用户请求为退出,DSP_exit()进行卸载;采用本发明能实现对磁盘数据的透明保护。
申请公布号 CN102646079A 申请公布日期 2012.08.22
申请号 CN201210121227.2 申请日期 2012.04.23
申请人 中国人民解放军国防科学技术大学 发明人 汪黎;王开宇;梁镇;吴庆波;戴华东
分类号 G06F12/16(2006.01)I 主分类号 G06F12/16(2006.01)I
代理机构 国防科技大学专利服务中心 43202 代理人 郭敏
主权项 1.一种面向类Linux操作系统的磁盘数据保护方法,其特征在于包括以下步骤:第一步,修改Loop设备的loop_nit,lo_receive,lo_send以及loop_exit函数,将经过修改的Loop设备驱动程序统称为数据安全保护模块即DSP模块,修改方法是:在loop_nit函数开始处加入函数DSP_nit(),由DSP_nit初始化DSP模块的初始数据;在lo_receive函数开始处加入函数DSP_receive(),由DSP_receive()根据需要修改lo_receive的参数pos,使pos指向重定向后的数据所在位置;在lo_send函数开始处加入函数DSP_send(),由DSP_send()根据需要修改lo_send的参数pos,使pos指向未使用的磁盘空间;在loop_exit函数开始处加入函数DSP_exit(),由DSP_exit()释放DSP模块初始化和程序运行中产生的内存资源;第二步,将修改后的loop_nit,lo_receive,lo_send以及loop_exit函数编译链接,生成新的Loop设备驱动模块loop.ko;第三步,加载Loop设备驱动模块loop.ko,调用初始化函数loop_nit,该函数调用DSP_nit()进行如下初始化:3.1构建一个线性链表blocklist,blocklist中每个元素存储一个二元组(old_block_num,new_block_num),old_block_num用于记录初始磁盘请求的块号,new_block_num用于记录重定向后的新块号,DSP_nit()将blocklist初始化为空表;3.2读取磁盘分区中文件系统的超级块、组描述符表,将它们缓存在内存中,根据缓存的超级块和组描述符表信息,获得以下数据:3.2.1从组描述符表获得1-N号块组中空闲块的数目,将1-N号块组中空闲块的数目存贮在数组free_block_count[]中,free_block_count[m]存贮第m个块组中空闲块的数目,1≤m≤N,N为正整数;3.2.2从超级块获得每个块组的块数block_count,各个块组的块数相等;3.2.3从组描述符表获得1-N号块组的块位图的起始块号block_bitmap_start[],block_bitmap_start[m]存储第m个块组中块位图的起始块号;3.2.4从组描述符表获得1-N号块组的i节点表的起始块号inode_table_start[],inode_table_start[m]存储第m个块组中i节点表的起始块号;3.2.5从超级块获得1-N号块组的块大小block_size,单位为字节;3.2.6从超级块获得每个块组所含i节点数inode_count;3.2.7从组描述符表获得1-N号块组的i节点位图的起始块号inode_bitmap_start[],inode_bitmap_start[m]存储第m个块组中i节点位图的起始块号;3.2.8从超级块获得文件系统总块数total_block_count;3.3计算1-N号块组的块位图的大小、i节点表的大小、块组的个数:3.3.1第m个块组的块位图的大小:block_bitmap_size[m]=(inode_bitmap_start[m]-block_bitmap_start[m])×block_size,inode_bitmap_start[m]为第m个块组的i节点位图的起始块号,block_bitmap_start[m]是第m个块组的块位图的起始块号,block_size为块大小,单位为字节;3.3.2块组的i节点表的大小inode_table_size:inode_table_size=inode_count×128/block_size,符号“/”表示除法,128为每个i节点大小,单位为字节;3.3.3块组的个数:group_count=total_block_count/block_count;3.4根据1-N号块组的块位图起始块号block_bitmap_start[],及块位图的大小block_bitmap_size[]从磁盘上读取1-N号块组的块位图block_bitmap[];3.5loop_nit[]函数初始化设备;第四步,等待用户的数据访问请求,如果数据访问请求为读取磁盘数据,执行第五步;如果用户请求为写入磁盘数据,执行第六步;如果用户请求为退出磁盘保护模块,执行第七步;第五步,lo_receive启动,调用DSP_receive()对lo_receive的参数pos即本次数据访问请求的磁盘位置进行修改,方法是:5.1计算要读取的磁盘块号:request_block_num=<img file="FDA0000156303320000031.GIF" wi="521" he="65" />表示对x下取整。5.2用request_block_num查询链表blocklist,如果blocklist所有的二元组中的old_block_num均不与request_block_num相等,则表明该块没有被重定向,不需要修改pos,执行5.3;如果存在(old_block_num,new_block_num),使得old_block_num等于request_block_num,则将当前要读取的磁盘位置pos修改为new_block_num×block_size+pos%block_size,其中%为取余运算;5.3lo_recive函数将从磁盘中pos所指位置读取的数据填充到bio描述的本次数据访问请求中内存中存放数据的缓冲区,所述bio是lo_recive函数的一个参数,类Linux系统内核启动lo_recive函数时给bio赋值,转第四步;第六步,lo_send启动,调用DSP_send()对lo_send的参数pos,即本次数据访问请求的磁盘位置进行修改,方法是:6.1计算要写入的磁盘块号:request_block_num=<img file="FDA0000156303320000041.GIF" wi="375" he="58" />6.2用request_block_num查询链表blocklist,如果blocklist表中存在二元组(old_block_num,new_block_num),使得old_block_num等于request_block_num,则将当前要写入的磁盘位置pos修改为new_block_num×block_size+pos%block_size,转6.7;如果blocklist表中所有二元组中的old_block_num均不与request_block_num相等,则执行6.3;6.3判断request_block_num对应的数据块是否位于数据区;6.4如果request_block_num对应的数据块位于数据区,转6.6;如果request_block_num对应的数据块不位于数据区,转6.5;6.5将request_block_num对应的数据块的写操作透明重定向到一个未用的数据块,方法为:寻找一个空闲块new_block_num,如果当前已无空闲块可用,令lo_send函数出错退出,不再进行后续写入操作,转第四步,否则转6.7;6.6查询request_block_num所在块组的块位图blockbitmap[group_num],如果该块为未占用块,则修改block_bitmap[group_num]中对应该块的比特位的值为1,并将free_block_count[group_num]的值减1,令new_block_num=request_block_num,转6.7;如果该块为已占用块,则寻找一个空闲块new_block_num,如果当前已无空闲块可用,令lo_send函数出错退出,不再进行后续写入操作,转第四步,如果找到了空闲块,转6.7;6.7将(request_block_num,new_block_num)加入到链表blocklist中,将当前要写入的磁盘位置pos修改为new_block_num×block_size+pos%block_size;6.8lo_send函数将bio描述的内存缓冲区中的数据写入磁盘中pos所指的位置,转第四步,所述bio是lo_send函数的一个参数,类Linux系统内核启动lo_send函数时给bio赋值,;第七步,loop_exit启动卸载模块,调用DSP_exit()对模块进行如下操作:7.1DSP_exit()函数释放DSP模块初始化和程序运行中产生的内存空间;7.2继续执行loop_exit函数,对Loop设备卸载。
地址 410073 湖南省长沙市开福区德雅路109号