CN101251814A - 一种在操作系统中实现可信恢复系统的方法 - Google Patents
一种在操作系统中实现可信恢复系统的方法 Download PDFInfo
- Publication number
- CN101251814A CN101251814A CNA2008100598039A CN200810059803A CN101251814A CN 101251814 A CN101251814 A CN 101251814A CN A2008100598039 A CNA2008100598039 A CN A2008100598039A CN 200810059803 A CN200810059803 A CN 200810059803A CN 101251814 A CN101251814 A CN 101251814A
- Authority
- CN
- China
- Prior art keywords
- affairs
- log
- disk
- tcb
- handle
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种在操作系统中实现可信恢复系统的方法。该方法建立事务声明系统调用为计算机信息系统可信计算基(TCB)操作提供事务创建和提交的接口。使得TCB操作只要使用事务声明系统调用,将其代码段声明为事务就能由可信恢复系统确保其原子性。可信恢复系统由事务管理器、日志系统、日志文件组成。事务管理器协调、管理事务的创建、提交和恢复。日志系统截获TCB操作中的所有更新操作并将其记录在日志文件中,等事务完成后再写回到磁盘,从而实现TCB操作的原子性。计算机系统失效时,只要撤销日志文件中与该TCB操作有关的数据,就可将系统重构到故障发生前的一致状态。本发明适用于主流操作系统,具有广泛地应用范围,能增加操作系统的容灾性。
Description
技术领域
本发明涉及操作系统技术领域,尤其涉及一种在操作系统中实现可信恢复系统的方法。
背景技术
信息安全对国民经济,国家安全具有重要意义。当前信息安全策略中,核心问题之一是安全产品技术必须是也只能是我国自主研发,国产化的,才能够满足安全需求。操作系统安全是信息安全的基础,任何一个安全相关程序如果运行在有安全漏洞的操作系统上,则仍然存在着被破坏的危险。因此,高等级的安全操作系统是一切信息安全应用的基础。
没有操作系统提供的安全性,计算机系统的安全性是没有基础的。而意外的系统故障则有可能破坏操作系统的一致性和安全保护性能。计算机信息系统应该为可信计算基(Trusted Computing Base,TCB)提供过程和机制,保证计算机信息系统失效或中断后,可以进行不损害任何安全保护性能的恢复,也就是所谓的可信恢复。
发明内容
本发明的目的是提供一种在操作系统中实现可信恢复系统的方法。
包括如下步骤:
1)建立面向磁盘块来设计的日志文件,它由一个长的磁盘块序列构成,每一磁盘块都有一个的序列编号,在逻辑上看作是一个循环队列,日志数据块顺序依次写入;
2)建立与操作系统中的文件系统、页面缓冲管理层相结合的管理日志文件的日志系统;
3)改写操作系统中关于文件数据更新操作的系统调用;
4)建立管理、协调事务的创建和提交的事务管理器;
5)调用日志系统创建一个新事务,并把新事务的标识信息保存到TCB操作的进程控制块内,以此建立创建事务的系统调用;
6)调用日志系统的刷新进程,将所有更新刷新到日志文件,如果全部成功提交给日志文件则表明该事务已经完成,然后在适当的时候再将数据从日志文件中写回到它们在磁盘上的实际位置,以此建立提交事务的系统调用;
7)在TCB操作代码段的前后分别调用创建事务的系统调用和提交事务的系统调用,被这两个系统调用包围的TCB操作代码就被声明为事务;
8)建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子化TCB操作;
9)如果在TCB事务操作过程中出现故障,就重新启动系统,扫描日志文件并且重做日志内记录的所有TCB更新操作,将系统恢复到故障发生前的一致状态。
步骤3)所述的改写操作系统中关于文件数据更新操作的系统调用,包括以下步骤:
1)在原有系统调用的基础上调用日志系统提供的创建句柄的接口,在进行任何磁盘更新以前向日志系统申请一个句柄来处理该系统调用;
2)调用日志系统提供的通知更新的接口,对于页面缓冲区中的磁盘块所做的任何更新都向日志系统进行注册,通知日志系统这些数据需要被提交到日志中;
3)调用日志系统提供的注销句柄的接口,通知日志系统该更新操作的系统调用已经完成,日志系统将那些被更新过的磁盘块标记为脏数据块,并将这些磁盘块加入到事务中需要提交到日志文件的磁盘块的列表中。
所述的在进行任何磁盘更新以前向日志系统申请一个句柄来处理该系统调用,包括以下步骤:
1)在内存中为句柄分配空间并对其进行初始化;
2)将该句柄记录到TCB进程的进程控制块;
3)检查是否有还未完成的旧句柄,如果有则要等待旧句柄完成后才能继续新句柄的申请工作;如果没有还未完成的旧句柄,则判断日志文件是否还有足够的空间,如果空间不够,则要将数据回放到磁盘上来释放日志文件的空间,如果空间足够,则为该句柄在日志文件中预留空间。
步骤8)所述的建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子化TCB操作,包括以下步骤:
1)TCB操作通过创建事务的系统调用向事务管理器请求一个事务身份号,如果系统中已经有正在运行且不属于本进程的事务,那么等待该事务结束后才能申请到新的事务身份号,申请事务身份号成功后,将事务标识信息写到进程控制块;
2)事务管理器对TCB操作的所有更新操作,通过日志系统作为事务处理;
3)TCB操作通过提交事务的系统调用通知事务管理器提交事务,调用日志系统的刷新进程,将文件页面缓冲区中所有与TCB操作有关的更新操作刷新到日志文件。
步骤9)所述的扫描日志文件并且重做日志内记录的所有TCB更新操作,包括以下步骤:
1)正向扫描日志文件,标识出所有需要被重做的事务;
2)进行第二遍扫描,每一个事务可能有一组被撤销的数据块,因此需要防止旧日志块覆盖了使用同一个磁盘块的新数据,在第二遍扫描阶段,准备一个所有这些撤销数据块的一个哈希表,每次需要确认一个特定的磁盘块是否应该通过回放写回到磁盘上时,都需要使用这个哈希表;
3)进行最后一遍扫描,考虑所有需要被回放的磁盘块,每个磁盘块都要测试其是否在需要撤销磁盘块的哈希表中,如果磁盘块不在哈希表中,则将磁盘块写回到其在磁盘的实际位置,如果磁盘块在哈希表里面,只有存储最新数据的磁盘块被写回到磁盘。
本发明与现有技术相比具有的有益效果是:1)提供基于日志的面向事务的可信恢复方法,因此可以满足高性能系统的高吞吐量和可靠性需求;2)具有快速重启的能力,当系统发生崩溃时,可以快速地将系统恢复到一致状态;3)具有良好的伸缩性和健壮性;4)适用于主流操作系统(Windows,Linux,Unix)的可信恢复系统的设计。
附图说明
图1是本发明的日志文件结构图;
图2是本发明的日志文件中的事务存储结构图;
图3是本发明的创建句柄流程图;
图4是本发明的TCB更新磁盘的操作流程图;
图5是本发明的可信恢复系统结构图;
图6是本发明的TCB操作事务处理的总体流程图;
图7是本发明的创建事务流程图。
具体实施方式
本发明公开了一种在操作系统中实现可信恢复系统的方法,并采用这种方法在Linux操作系统(发行版本Fedora Core 3,内核版本2.6.8)上建立可信恢复系统。
在操作系统中实现可信恢复系统的方法,包括如下步骤:
1)建立面向磁盘块来设计的日志文件,它由一个长的磁盘块序列构成,每一磁盘块都有一个的序列编号,在逻辑上看作是一个循环队列,日志数据块顺序依次写入;
日志文件是一个非常长的磁盘块序列,每一块都有一个独一无二的序列编号。系统恢复需要快速访问这个日志但是其中大部分可以离线保存或者丢弃。在线日志文件用来保存日志中的“有用”部分。日志文件被管理为一个环形缓冲区。日志文件逻辑上可以看作是一个循环队列,日志数据块顺序依次写入,如果日志文件被写满后,则需要将部分完全完成的事务归档,释放日志的空间。
日志文件的第0块是日志的超级块,里面保存了关于该日志的详细信息,主要信息包括磁盘块大小、磁盘块总数、日志信息开始块、日志的开始块、日志中最旧事务的身份号等信息。日志文件的其他部分用来存放日志信息,日志信息是以事务为单位组织的,整个日志文件的逻辑结构如图1所示。整个存放日志信息内容的开始位置由日志超级块中的“日志信息开始块”来指明。由于日志是一个循环结构,由日志超级块的“日志开始块”来指明日志开始位置。
在Linux系统内建立可信恢复系统,日志文件可以和TCB数据存放在同一个磁盘上或者单独存在。日志文件占用ext3文件系统的一个i-节点,并在格式化磁盘时候确立,如果是非默认的i-节点,则需要在挂载ext3文件系统时通过参数指定。下面是在Linux系统内建立的日志文件的数据结构:
(1)日志超级块
日志文件的第0块就是日志超级块,里面存储了日志文件的基本信息,用结构体journal_superblock_t来表示,其定义如下表所示:
表:journal_superblock_t定义
(2)磁盘块描述头
日志的磁盘块可以分为日志超级块、描述块、数据块、提交块和撤销块,除数据块以外,其他几种类型的磁盘块都有一个磁盘块描述头,结构体journal_header_t,其定义如下表所示:
表:journal_header_t定义
磁盘块的类型h_blocktype可以为以下几种类型:
描述块:JOURNAL_DESCRIPTOR_BLOCK
提交块:JOURNAL_COMMIT_BLOCK
日志超级块:JOURNAL_SUPERBLOCK
撤销块:JOURNAL_REVOKE_BLOCK 5
(3)数据块描述
描述块里面保存了若干数据块的描述信息,journal_block_tag_t,其结构比较简单,如下表所示:
表:journal_block_tag_t定义
其中t_flags标志可以用来表明:
对应数据块已经被删除(JOURNAL_FLAG_DELETED),对应数据块是事务的最后一个数据块(JOURNAL_FLAG_LAST_TAG)等。
日志文件中数据存储的结构形式是事务。
每一个事务占用日志文件系统的一段逻辑上连续的块号(因为日志文件是一个循环队列,所以要注意跨越首尾的临界状况)。一个事务可以分为功能不同的三个部分,描述块、数据块和提交块。描述块标志着事务的开始,并保存了数据块在磁盘中的实际位置;描述块后面紧接着一系列数据块,和描述块的描述信息一一对应,数据块则对应一个更新了的磁盘块;提交块的存在表示这个事务已经被成功提交到日志文件。
一个事务在日志文件的存储结构图2所示。该图中的事务共占用四个磁盘块:一个描述块,两个数据块和一个提交块。第一块的类型表明自己是描述块,并记录了该事务身份号为1010,描述块还保留了其后两个数据块描述信息,依次保存了事务中数据块的物理块号,数据块第0块为35,第1块为47。第二块和第三块是数据块,保存了更新的磁盘块的副本。最后一块是提交块,表明事务的成功结束。
在Linux系统内建立可信恢复系统,一个事务是用结构体transaction_t来表示的,其中主要结构如下表示:
表:transaction_t定义
其中t_state的状态可以为:运行(T_RUNNING)、锁定(T_LOCKED)、刷新(T_FLUSH)、提交(T_COMMIT)、完成(T_FINISHED)。
2)建立与操作系统中的文件系统、页面缓冲管理层相结合的管理日志文件的日志系统;
日志系统是整个可信恢复的核心部分,它的主要功能包括:
●提供事务操作,保证TCB操作的原子性,为事务管理器提供实现事务创建和提交服务。
●和文件系统、页面缓冲相结合,监视TCB操作中的数据更新操作,将更新操作包装成事务操作。
●管理日志文件,按照特定顺序将事务提交到日志文件。
●当检查到系统处于不一致状态时,则扫描日志将系统恢复到一致状态。
在Linux系统内建立可信恢复系统,一个日志系统是通过一个journal_t结构体来表示的,其主要数据如下表所示:
表:journal_t定义
3)改写操作系统中关于文件数据更新操作的系统调用,包括如下步骤:
1.在原有系统调用的基础上调用日志系统提供的创建句柄的接口,在进行任何磁盘更新以前向日志系统申请一个句柄来处理该系统调用;
每个TCB进程在事务处理过程中进行更新操作时都要先申请一个句柄,申请过程如图3所示。
一个句柄在Linux中是用handle_t结构体来表示的,其中主要数据如下表所示:
表:handle_t定义
2.调用日志系统提供的通知更新的接口,对于页面缓冲区中的磁盘块所做的任何更新都向日志系统进行注册,通知日志系统这些数据需要被提交到日志中;
每一个TCB更新磁盘的操作都要和日志系统相结合才能够保证其修改的事务性,处理流程如图4所示。首先要计算此次更新所需要的磁盘块的数量,更新一个数据块可能要更新另外一些元数据块,例如超级块、目录块等等。然后要向日志系统申请一个句柄来处理更新。
成功创建句柄后,通知日志系统需要更新磁盘块,让日志系统负责处理更新前的一些准备工作,这样才能对磁盘块进行更新。更新完日志块以后也要通知日志系统更新已经完成,日志系统将磁盘块标记为脏数据块,并将该磁盘块加入到事务中需要提交到日志的磁盘块的列表。
在Linux系统内建立可信恢复系统,为了通知日志系统需要将被更新的数据提交到日志中,在内核代码ext3_jbd.h中定义了如下函数:
static inline int_ext3_journal_get_write_access(const char *where,handle_t *handle,
struct buffer_head *bh,int *credits)
//通知将要更新元数据而修改该页面缓存。
static inline int_ext3_journal_dirty_metadata(const char *where,
handle_t *handle,struct buffer_head *bh)
//标志一个页面缓存包含脏元数据。
static inline int ext3_should_journal_data(struct inode *inode)
//判断是否应该将数据做成日志
3.调用日志系统提供的注销句柄的接口,通知日志系统该更新操作的系统调用已经完成,日志系统将那些被更新过的磁盘块标记为脏数据块,并将这些磁盘块加入到事务中需要提交到日志文件的磁盘块的列表中。
在Linux系统内建立可信恢复系统,为了将那些被更新过的磁盘块标记为脏数据块,并将这些磁盘块加入到事务中需要提交到日志文件的磁盘块的列表中,在内核代码transaction.c中定义了如下函数:
int journal_get_write_access(handle_t *handle,struct buffer_head *bh,int *credits)
//通知将要修改一个页面缓存来更新元数据。
int journal_dirty_data(handle_t *handle,struct buffer_head *bh)
//标志页面缓存包含脏数据,它们需要在提交当前事务以前被刷新到磁盘上。
int journal_dirty_metadata(handle_t *handle,struct buffer_head *bh)
//标志页面缓存包含脏数据,它们需要在提交当前事务以前被刷新到磁盘上。
void journal_unfile_buffer(journal_t *journal,struct journal_head *jh)
//将一个页面缓存从合适的事务队列上删除。
void journal_file_buffer(struct journal_bead *jh,transaction_t *transaction,int jlist)
//将页面缓存挂载到合适的事务列表上。
void journal_refile_buffer(journal_t *journal,struct journal_head *jh)
//将一个页面缓存从它当前的缓冲列表移除,准备将其从当前事务中完全删除。如果缓存已经在后继的事务中被使用,那么将其转移到事务的元数据列表中。
4)建立管理、协调事务的创建和提交的事务管理器;
事务管理器为TCB操作原子化提供用来处理创建事务和提交事务的系统调用:
1.创建事务。事务管理器调用日志系统创建一个新事务,并把新事务的事务标识信息保存到TCB操作的进程控制块内。
2.提交事务。事务管理器调用日志系统的刷新进程,将所有更新从文件系统的页面缓冲区刷新到日志文件,如果全部成功提交给日志文件以后则表明该事务已经完全完成,在适当时候将数据从日志中回放到他们在磁盘上的实际位置。
TCB操作通过向事务管理器申请一个事务保证事务期间对磁盘上TCB数据操作的原子性,而一个TCB操作往往要使用多个系统调用。每个系统调用可以用一个句柄来表示,而事务也就可以用多个句柄来构成。一个句柄也就是一个系统调用,可能包括若干个磁盘块的更新。事务管理器保证事务的正确性,同样也就保证了句柄的事务性。
句柄中的主要信息有:句柄所属的事务、句柄所需要的磁盘块、标志信息。事务中应包括一些重要的数据,包括:所用的日志文件、事务身份号、事务状态、要更新的磁盘块(脏块)队列、互斥锁等信息。
事务中重要的一个信息就是事务的状态,事务根据其完成的程度可以分为下面几个状态:
1.运行:该事务现在是活跃的并且正在接受新的句柄。在计算机系统中,某一时刻只能有一个事务处于运行状态。
2.锁定:TCB操作发出提交命令,但是已存在的句柄可能还有没有完成的。一旦所有的已存在句柄都完成,事务将转到下一个状态。
3.刷新:一个事务的所有句柄都完成了。这个事务正在将自己写入到日志中。
4.提交:整个事务已经被写入到日志中,该事务正在写回一个提交块来指示该事务日志已经完成。
5.完成:该事物已经完全写到日志了。它必须保留在这里直到这些磁盘块被刷新到它们在磁盘的实际位置。
在Linux系统内建立可信恢复系统,要建立创建事务和提交事务的系统调用,首先在内核代码的syscall.h中添加可信恢复事务创建和提交的系统调用声明:
asmlinkage long sys_begin_transaction(void);//事务创建
asmlinkage long sys_commit_transaction(void);//事务提交
然后在内核代码的entry.S中添加系统调用和默认底层处理程序。entry.S包含系统调用和默认底层处理程序。同时包含了定时器处理程序,同时包含了所有的能引起进程切换的中断和故障。
.data
ENTRY(sys_call_table)
……
.long sys_begin_transaction /*_TRUSTED_RECOVERY_SOLO_*/事务创建系统调用
.long sys_commit_transaction /*_TRUSTED_RECOVERY_SOLO_*/事务提交系统调用
最后在内核代码的unistd.h中定义事务创建和提交系统调用号:
#define_NR_begin_transaction 284
#define_NR_commit_transaction(_NR_begin_transaction+1)
5)调用日志系统创建一个新事务,并把新事务的标识信息保存到TCB操作的进程控制块内,以此建立创建事务的系统调用;
在Linux系统内建立可信恢复系统,为了实现创建新事务,在内核代码transaction.c中定义了如下函数:
static transaction_t * get_transaction(journal_t *journal,transaction_t *transaction)
//得到一个新的transaction_t对象,分配并初始化一个新的transaction。创建其为RUNNING状态并
且将它添加的当前的日志系统中。
6)调用日志系统的刷新进程,将所有更新刷新到日志文件,如果全部成功提交给日志文件则表明该事务已经完成,然后在适当的时候再将数据从日志文件中写回到它们在磁盘上的实际位置,以此建立提交事务的系统调用;
在Linux系统内建立可信恢复系统,为了实现提交事务,在内核代码journal.c中定义了如下函数:
int kjournald(void *arg)//日志刷新内核线程,负责定时将完成的事务写回到日志文件。
static void journal_start_thread(journal_t *journal)
static void journal_kill_thread(journal_t *journal)//开始和结束内核线程kjournald。
int log_start_commit(journal_t *journal,tid_t tid)//开始提交事务tid,真正的的提交操作不是在这里完成,
而是通过内核线程kjournald完成。
int journal_start_commit(journal_t *journal,tid_t *ptid)//开始一个提交提交过程。
int log_wait_commit(journal_t *journal,tid_t tid)//等待特定的事务tid提交完成。
void journal_destroy(journal_t *journal)//释放一个journal_t数据结构,首先要将该journal中所有的事
务提交,然后进行释放工作。
在内核代码commit.c中定义了如下函数负责将事务提交到磁盘上形成永久性修改:
void journal_commit_transaction(journal_t *journal)
7)在TCB操作代码段的前后分别调用创建事务的系统调用和提交事务的系统调用,被这两个系统调用包围的TCB操作代码就被声明为事务;
一个完整的TCB事务操作如下所示,事务是一段用begin_transaction()和commit_transaction()包围起来的代码,可信恢复可以保证这段代码操作对TCB数据修改的事务性。
begin_transaction()
……
write()
……
commit_transaction()
在Linux系统内建立可信恢复系统,要将TCB操作代码声明为事务,就要调用sys_begin_transaction标志着事务的开始,负责向事务管理器申请并创建一个事务。调用sys_commit_transaction标志事务的结束,向事务管理器提交一个事务。两者中间则包含若干对TCB数据的修改操作。
8)建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子化TCB操作;
现今主流的操作系统(Windows,Linux,Unix)的文件系统的架构基本一致,本发明以此为基础额外增加了事务管理器、日志文件和日志系统,与原有的文件系统结合构成了可信恢复系统,结构如图5所示。原子化TCB操作参见下文解释。
9)如果在TCB事务操作过程中出现故障,就重新启动系统,扫描日志文件并且重做日志内记录的所有TCB更新操作,将系统恢复到故障发生前的一致状态。TCB事务操作过程中出现故障,例如突然断电,则可能引起系统安全的不一致性,破坏安全保护性能。这时候需要对系统重新启动以恢复到一致安全状态,恢复过程参见下文解释。
步骤3)所述的在进行任何磁盘更新以前向日志系统申请一个句柄来处理该系统调用,包括以下步骤:
i.在内存中为句柄分配空间并对其进行初始化;
ii.将该句柄记录到TCB进程的进程控制块;
iii.检查是否有还未完成的旧句柄,如果有则要等待旧句柄完成后才能继续新句柄的申请工作;如果没有还未完成的旧句柄,则判断日志文件是否还有足够的空间,如果空间不够,则要将数据回放到磁盘上来释放日志文件的空间,如果空间足够,则为该句柄在日志文件中预留空间。
在Linux系统内建立可信恢复系统,为了实现创建新句柄,在内核代码transaction.c中定义了如下函数:
static int start_this_handle(journal_t *journal,handle_t *handle)
//给定一个handle,处理任意需要的锁来确保日志系统中有足够的日志空间来使该handle开始。
static handle_t *new_handle(int nblocks)//分配并初始化一个新的handle。
handle_t *journal_start(journal_t*journal,int nblocks)
//得到一个新的handle,如果当前进程原来已经申请到了handle,则使用原来的,否则分配一个新的。
我们确保日志中至少有nblocks个空闲磁盘块。
步骤8)所述的建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子化TCB操作,总体流程如图6所示,又可分为以下几个步骤:
<1>TCB操作通过创建事务的系统调用向事务管理器请求一个事务身份号,如果系统中已经有正在运行且不属于本进程的事务,那么等待该事务结束后才能申请到新的事务身份号,申请事务身份号成功后,将事务标识信息写到进程控制块。
系统中可能存在多个事务,但是只能有一个事务处于运行状态。如果现在已经有一个事务在运行的话,则创建新的事务要等待。TCB数据保存在同一块硬盘上,所以修改TCB数据的TCB操作事务要共享许多磁盘数据,例如磁盘的超级块、空闲磁盘块位图等等。为了保持事务操作的隔离性,TCB事务操作必须进行序列化,也就是任意时刻系统中只能有一个TCB事务操作运行。
事务创建过程如图7所示。首先检查当前日志系统中是否有事务在运行,如果有事务在运行且该事务不属于本进程,那么就需要睡眠等待,等待当前运行的事务结束。这里检查事务是否属于本进程是为了防止进程执行两次事务创建系统调用而造成系统死锁。
如果当前没有事务在运行则可以创建一个事务并将其进行初始化,得到一个新的运行事务,然后将事务标识信息写到进程控制块。创建事务成功以后该进程提交的修改操作序列就能够被日志系统进行管理而符合事务操作。
<2>事务管理器对TCB操作的所有更新操作,通过日志系统作为事务处理。
<3>TCB操作通过提交事务的系统调用通知事务管理器提交事务,调用日志系统的刷新进程,将文件页面缓冲区中所有与TCB操作有关的更新操作刷新到日志文件。
提交日志的过程分为下面几个步骤
a.将事务从运行状态转变到锁定状态,意味着事务不再接受新的句柄。该事务将等待直到所有已经存在的句柄都完成。一个事务在初始化时总是拥有一组预留的缓冲块。直到这个阶段可能有许多缓冲块还没有被使用。事务现在已经准备被提交,没有未完成的句柄。
b.事务进入刷新状态。该事物被标记为一个正在向日志提交的事务。这个阶段也标记日志中不存在处于运行状态的事务,新的事务请求将初始化一个新的事务。
c.事务的缓冲块被刷新到日志。这个时候,事务的元数据和数据都还仍然在可挥发内存中,需要被写到日志区,并且需要记录它们在磁盘的实际位置。这个阶段开始刷新这些数据缓冲区,这需要一个日志描述块。日志描述块保存了日志中每个元数据缓冲块到其在磁盘上的实际位置的映射表。建立好描述块以后,数据缓冲块将被刷新到日志中。一旦日志描述块充满或者所有的元数据被刷新到日志中时,日志描述块也被刷新到日志。现在日志中保存了所有数据缓冲块,它们在磁盘上的实际位置也被记录下来。这些数据是持久的,如果故障出现后可以用来进行恢复。
d.等待数据缓冲块和日志描述块I/O完成的通知。一旦I/O完成后缓冲区将从内存列表中删除。
e.所有的数据和元数据都在持久存储器上的日志中了。现在事务需要被标志为提交完成,这样就会知道日志中的所有更新是安全的、一致的。因此,将分配一个日志描述块。写入一个描述信息来表示事务已经被成功提交,并且这个块被同步写入到它在日志的位置。这以后,事务转移到提交状态。
f.当日志中存放了许多事务,还没有被刷新到磁盘时需要进行阶段e操作。这个事务的一些元数据缓冲块可能是先前事务的一部分。他们不需要保留在旧的事务中因为在当前提交的事务中有他们的最新副本。这些缓冲块将从旧事务中删除。
g.这个事务被标记为完成状态。更新日志结构来反映这个特定的事务为最新被更新的事务。在完成状态还要唤醒正在等待创建事务的进程。
在Linux系统内建立可信恢复系统,原子化TCB操作的过程实际上就是调用上文描述的创建和提交事务、句柄的函数。
步骤9)所述的扫描日志文件并且重做日志内记录的所有TCB更新操作,是指如果在日志文件中发现了日志记录,说明这是在系统崩溃后系统重新启动。这时需要通过重做日志内记录的所有操作可以重建一个事务一致的系统状态。系统重新启动后处理日志文件系统可分为以下几个步骤::
<1>正向扫描日志。如果发现一个描述块,则通过描述块内部的描述信息计算该事务包含的数据块个数,然后直接将这些数据块跳过来读取提交块,如果发现了提交块则将该事务记录为已经提交并需要重做。就这样一直扫描到日志结尾。这样就可以标识出所有需要被回放的事务。
<2>进行第二遍扫描。每一个事务可能有一组被撤销的数据块,因此需要防止旧日志块覆盖了使用同一个磁盘块的新数据。在第二遍扫描阶段,准备一个所有这些撤销数据块的一个哈希表。每次需要确认一个特定的磁盘块是否应该通过回放写回到磁盘上时,都需要使用这个哈希表。
<3>进行最后一遍扫描,在最后一个阶段,将考虑所有需要被回放的磁盘块。每个磁盘块都要测试其是否在需要撤销磁盘块的哈希表中。如果磁盘块不在哈希表中,则将磁盘块写回到其在磁盘的实际位置是安全的。如果磁盘块在哈希表里面,只有存储最新数据的磁盘块被写回到磁盘。
在Linux系统内建立可信恢复系统,为了进行可行恢复过程,在super.c定义了如下函数:
static int ext3_load_journal(struct super_block *,struct ext3_super_block *)
//读取日志文件,然后进行可信恢复过程,将日志中完成的事务回放到其在磁盘的实际位置。
static void ext3_mark_recovery_complete(struct super_block * sb,struct ext3_super_block * es)
//可信恢复成功完成以后,将当前文件系统标志为恢复完成状态,可以开始正常的文件操作了。
Claims (5)
1. 一种在操作系统中实现可信恢复系统的方法,其特征在于包括如下步骤:
1)建立面向磁盘块来设计的日志文件,它由一个长的磁盘块序列构成,每一磁盘块都有一个序列编号,在逻辑上看作是一个循环队列,日志数据块顺序依次写入;
2)建立与操作系统中的文件系统、页面缓冲管理层相结合的管理日志文件的日志系统;
3)改写操作系统中关于文件数据更新操作的系统调用;
4)建立管理、协调事务的创建和提交的事务管理器;
5)调用日志系统创建一个新事务,并把新事务的标识信息保存到TCB操作的进程控制块内,以此建立创建事务的系统调用;
6)调用日志系统的刷新进程,将所有更新刷新到日志文件,如果全部成功提交给日志文件则表明该事务已经完成,然后在适当的时候再将数据从日志文件中写回到它们在磁盘上的实际位置,以此建立提交事务的系统调用;
7)在TCB操作代码段的前后分别调用创建事务的系统调用和提交事务的系统调用,被这两个系统调用包围的TCB操作代码就被声明为事务;
8)建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子化TCB操作;
9)如果在TCB事务操作过程中出现故障,就重新启动系统,扫描日志文件并且重做日志内记录的所有TCB更新操作,将系统恢复到故障发生前的一致状态。
2. 根据权利要求1所述的一种在操作系统中实现可信恢复系统的方法,其特征在于步骤3)所述的改写操作系统中关于文件数据更新操作的系统调用,包括以下步骤:
1)在原有系统调用的基础上调用日志系统提供的创建句柄的接口,在进行任何磁盘更新以前向日志系统申请一个句柄来处理该系统调用;
2)调用日志系统提供的通知更新的接口,对于页面缓冲区中的磁盘块所做的任何更新都向日志系统进行注册,通知日志系统这些数据需要被提交到日志中;
3)调用日志系统提供的注销句柄的接口,通知日志系统该更新操作的系统调用已经完成,日志系统将那些被更新过的磁盘块标记为脏数据块,并将这些磁盘块加入到事务中需要提交到日志文件的磁盘块的列表中。
3. 根据权利要求2所述的一种在操作系统中实现可信恢复系统的方法,其特征在于所述的在进行任何磁盘更新以前向日志系统申请一个句柄来处理该系统调用,包括以下步骤:
1)在内存中为句柄分配空间并对其进行初始化;
2)将该句柄记录到TCB进程的进程控制块;
3)检查是否有还未完成的旧句柄,如果有则要等待旧句柄完成后才能继续新句柄的申请工作;如果没有还未完成的旧句柄,则判断日志文件是否还有足够的空间,如果空间不够,则要将数据回放到磁盘上来释放日志文件的空间,如果空间足够,则为该句柄在日志文件中预留空间。
4. 根据权利要求1所述的一种在操作系统中实现可信恢复系统的方法,其特征在于步骤8)所述的建立包括日志文件、日志系统和事务管理器在内的可信恢复系统,原子化TCB操作,包括以下步骤:
1)TCB操作通过创建事务的系统调用向事务管理器请求一个事务身份号,如果系统中已经有正在运行且不属于本进程的事务,那么等待该事务结束后才能申请到新的事务身份号,申请事务身份号成功后,将事务标识信息写到进程控制块;
2)事务管理器对TCB操作的所有更新操作,通过日志系统作为事务处理;
3)TCB操作通过提交事务的系统调用通知事务管理器提交事务,调用日志系统的刷新进程,将文件页面缓冲区中所有与TCB操作有关的更新操作刷新到日志文件。
5. 根据权利要求1所述的一种在操作系统中实现可信恢复系统的方法,其特征在于步骤9)所述的扫描日志文件并且重做日志内记录的所有TCB更新操作,包括以下步骤:
1)正向扫描日志文件,标识出所有需要被重做的事务;
2)进行第二遍扫描,每一个事务可能有一组被撤销的数据块,因此需要防止旧日志块覆盖了使用同一个磁盘块的新数据,在第二遍扫描阶段,准备一个所有这些撤销数据块的一个哈希表,每次需要确认一个特定的磁盘块是否应该通过回放写回到磁盘上时,都需要使用这个哈希表;
3)进行最后一遍扫描,考虑所有需要被回放的磁盘块,每个磁盘块都要测试其是否在需要撤销磁盘块的哈希表中,如果磁盘块不在哈希表中,则将磁盘块写回到其在磁盘的实际位置,如果磁盘块在哈希表里面,只有存储最新数据的磁盘块被写回到磁盘。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008100598039A CN101251814B (zh) | 2008-02-04 | 2008-02-04 | 一种在操作系统中实现可信恢复系统的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008100598039A CN101251814B (zh) | 2008-02-04 | 2008-02-04 | 一种在操作系统中实现可信恢复系统的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101251814A true CN101251814A (zh) | 2008-08-27 |
CN101251814B CN101251814B (zh) | 2010-04-07 |
Family
ID=39955213
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008100598039A Expired - Fee Related CN101251814B (zh) | 2008-02-04 | 2008-02-04 | 一种在操作系统中实现可信恢复系统的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101251814B (zh) |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101635016A (zh) * | 2009-07-13 | 2010-01-27 | 北京中软华泰信息技术有限责任公司 | 实现可信计算基结构化扩展的管道安全保障方法与系统 |
CN102521300A (zh) * | 2011-11-30 | 2012-06-27 | 华中科技大学 | 基于嵌入式虚拟化平台的域间文件数据共享方法 |
CN102707990A (zh) * | 2012-05-14 | 2012-10-03 | 华为技术有限公司 | 基于容器的处理方法、装置和系统 |
CN103198088A (zh) * | 2011-11-07 | 2013-07-10 | Sap股份公司 | 基于阴影分页的日志段目录 |
CN105204959A (zh) * | 2015-08-28 | 2015-12-30 | 小米科技有限责任公司 | 恢复ext文件系统中已删除文件的方法及装置 |
CN107229537A (zh) * | 2017-05-31 | 2017-10-03 | 广州鼎甲计算机科技有限公司 | 一种数据库实时备份方法 |
CN107315746A (zh) * | 2016-04-26 | 2017-11-03 | 清华大学 | 基于非易失性主存的高效事务文件系统构建方法 |
WO2018010501A1 (zh) * | 2016-07-13 | 2018-01-18 | 中兴通讯股份有限公司 | 全局事务标识gtid的同步方法、装置及系统、存储介质 |
CN108509462A (zh) * | 2017-02-28 | 2018-09-07 | 华为技术有限公司 | 一种同步活动事务表的方法及装置 |
CN108733507A (zh) * | 2017-04-17 | 2018-11-02 | 伊姆西Ip控股有限责任公司 | 文件备份和恢复的方法和设备 |
CN109218105A (zh) * | 2018-10-08 | 2019-01-15 | 清华大学 | 网络节点的更新方法、系统、服务器及存储介质 |
CN110069463A (zh) * | 2019-03-12 | 2019-07-30 | 北京奇艺世纪科技有限公司 | 用户行为处理方法、装置电子设备及存储介质 |
CN110737716A (zh) * | 2018-07-02 | 2020-01-31 | 华为技术有限公司 | 一种数据写入的方法和装置 |
CN113467898A (zh) * | 2021-09-02 | 2021-10-01 | 北京开科唯识技术股份有限公司 | 多方协同业务处理方法及系统 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR100390853B1 (ko) * | 2000-06-07 | 2003-07-10 | 차상균 | 주 메모리 트랜잭션 처리 시스템에서 병렬적 회복 연산을 위한 디퍼런셜 로깅 방법 및 장치 |
US7171452B1 (en) * | 2002-10-31 | 2007-01-30 | Network Appliance, Inc. | System and method for monitoring cluster partner boot status over a cluster interconnect |
US7188273B2 (en) * | 2003-11-24 | 2007-03-06 | Tsx Inc. | System and method for failover |
-
2008
- 2008-02-04 CN CN2008100598039A patent/CN101251814B/zh not_active Expired - Fee Related
Cited By (27)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101635016A (zh) * | 2009-07-13 | 2010-01-27 | 北京中软华泰信息技术有限责任公司 | 实现可信计算基结构化扩展的管道安全保障方法与系统 |
CN101635016B (zh) * | 2009-07-13 | 2013-12-04 | 北京可信华泰信息技术有限公司 | 实现可信计算基结构化扩展的管道安全保障方法与系统 |
CN103198088A (zh) * | 2011-11-07 | 2013-07-10 | Sap股份公司 | 基于阴影分页的日志段目录 |
CN103198088B (zh) * | 2011-11-07 | 2017-07-25 | Sap欧洲公司 | 基于阴影分页的日志段目录 |
CN102521300B (zh) * | 2011-11-30 | 2015-03-04 | 华中科技大学 | 基于嵌入式虚拟化平台的域间文件数据共享方法 |
CN102521300A (zh) * | 2011-11-30 | 2012-06-27 | 华中科技大学 | 基于嵌入式虚拟化平台的域间文件数据共享方法 |
US9870288B2 (en) | 2012-05-14 | 2018-01-16 | Huawei Technolgoies Co., Ltd. | Container-based processing method, apparatus, and system |
WO2013170561A1 (zh) * | 2012-05-14 | 2013-11-21 | 华为技术有限公司 | 基于容器的处理方法、装置和系统 |
CN102707990A (zh) * | 2012-05-14 | 2012-10-03 | 华为技术有限公司 | 基于容器的处理方法、装置和系统 |
CN102707990B (zh) * | 2012-05-14 | 2015-04-08 | 华为技术有限公司 | 基于容器的处理方法和装置 |
CN105204959B (zh) * | 2015-08-28 | 2018-11-30 | 小米科技有限责任公司 | 恢复ext文件系统中已删除文件的方法及装置 |
CN105204959A (zh) * | 2015-08-28 | 2015-12-30 | 小米科技有限责任公司 | 恢复ext文件系统中已删除文件的方法及装置 |
CN107315746B (zh) * | 2016-04-26 | 2020-08-25 | 清华大学 | 基于非易失性主存的高效事务文件系统构建方法 |
CN107315746A (zh) * | 2016-04-26 | 2017-11-03 | 清华大学 | 基于非易失性主存的高效事务文件系统构建方法 |
WO2018010501A1 (zh) * | 2016-07-13 | 2018-01-18 | 中兴通讯股份有限公司 | 全局事务标识gtid的同步方法、装置及系统、存储介质 |
CN108509462A (zh) * | 2017-02-28 | 2018-09-07 | 华为技术有限公司 | 一种同步活动事务表的方法及装置 |
US11442961B2 (en) | 2017-02-28 | 2022-09-13 | Huawei Technologies Co., Ltd. | Active transaction list synchronization method and apparatus |
CN108733507A (zh) * | 2017-04-17 | 2018-11-02 | 伊姆西Ip控股有限责任公司 | 文件备份和恢复的方法和设备 |
CN108733507B (zh) * | 2017-04-17 | 2021-10-08 | 伊姆西Ip控股有限责任公司 | 文件备份和恢复的方法和设备 |
CN107229537A (zh) * | 2017-05-31 | 2017-10-03 | 广州鼎甲计算机科技有限公司 | 一种数据库实时备份方法 |
CN110737716B (zh) * | 2018-07-02 | 2022-09-23 | 华为技术有限公司 | 一种数据写入的方法和装置 |
CN110737716A (zh) * | 2018-07-02 | 2020-01-31 | 华为技术有限公司 | 一种数据写入的方法和装置 |
CN109218105A (zh) * | 2018-10-08 | 2019-01-15 | 清华大学 | 网络节点的更新方法、系统、服务器及存储介质 |
CN110069463B (zh) * | 2019-03-12 | 2021-07-16 | 北京奇艺世纪科技有限公司 | 用户行为处理方法、装置电子设备及存储介质 |
CN110069463A (zh) * | 2019-03-12 | 2019-07-30 | 北京奇艺世纪科技有限公司 | 用户行为处理方法、装置电子设备及存储介质 |
CN113467898A (zh) * | 2021-09-02 | 2021-10-01 | 北京开科唯识技术股份有限公司 | 多方协同业务处理方法及系统 |
CN113467898B (zh) * | 2021-09-02 | 2022-01-18 | 北京开科唯识技术股份有限公司 | 多方协同业务处理方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN101251814B (zh) | 2010-04-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101251814B (zh) | 一种在操作系统中实现可信恢复系统的方法 | |
CN101567805B (zh) | 并行文件系统发生故障后的恢复方法 | |
CN100583051C (zh) | 检查点容错技术中文件状态一致性维护的实现方法 | |
US7266669B2 (en) | File system with file management function and file management method | |
US7240057B2 (en) | System and method for implementing journaling in a multi-node environment | |
US9626394B2 (en) | Method for mass-deleting data records of a database system | |
US7620660B2 (en) | Pre-image logging for database recovery | |
US7318135B1 (en) | System and method for using file system snapshots for online data backup | |
US8874515B2 (en) | Low level object version tracking using non-volatile memory write generations | |
US5845292A (en) | System and method for restoring a distributed checkpointed database | |
JP5657550B2 (ja) | 分散ストレージシステムにおけるデータのアトミックな複合変形 | |
CA2626227C (en) | Apparatus and method for creating a real time database replica | |
US8732121B1 (en) | Method and system for backup to a hidden backup storage | |
Salem et al. | Checkpointing memory-resident databases | |
US20050144406A1 (en) | Data storage systems and processes, such as one-way data mirror using write mirroring | |
US8732128B2 (en) | Shadow copy bookmark generation | |
KR20060085899A (ko) | 데이터베이스 시스템 및 그 데이터베이스 시스템의데이터베이스 컴포넌트를 메인 메모리에 저장하는 시스템및 방법 | |
JPH08504528A (ja) | データベースにおけるメモリ空間の最適化方法 | |
KR101584760B1 (ko) | 순서 모드 저널링 파일 시스템을 위한 블록 그룹 단위 저널링 방법 및 장치 | |
CN1808389A (zh) | 帐务后台内存数据库中共享内存的自治锁方法 | |
CN110209527A (zh) | 数据恢复方法、装置、服务器以及存储介质 | |
CN110515705A (zh) | 可扩展的持久性事务内存及其工作方法 | |
CN104937576A (zh) | 协调存储在基于非易失性存储器的系统中的数据的复制 | |
CN113220490A (zh) | 异步写回持久化内存的事务持久化方法及系统 | |
US20050149548A1 (en) | One-way data mirror using copy-on-write |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20100407 Termination date: 20130204 |