yibinqi0 2014-10-14
在过去的很长一段时间里我们需要一种可以在Linux系统下实现文件系统快照来提供一种实现回滚操作的特性。现在Snapper和Btrfs联合起来填补了这个缺口。
Btrfs,全新的Linux下的在“写入的时候复制”的文件系统,支持子卷(在每一个物理分区内一个或多个独立的可挂载的文件系统)文件系统快照(在一个确定的时间点上一份子卷状态的副本)。Snapper提供了管理这些快照的方法。Snapper提供了一个命令行的接口和一个YaST的接口。
默认情况下openSUSE上的Snapper和Btrfs服务于回滚YaST和zypper所做的系统修改的撤销工具。在使用YaST模块或zypper的前后,一个快照就被创建了。Snapper让你可以比较这两个快照并且提供了在这两个快照之间恢复之前状态的方法。这个工具也提供了通过创建系统子卷每小时的快照来做系统备份的功能。
4.1需求
因为Btrfs是openSUSE上唯一支持快照的文件系统,在你想实现快照的所有分区和子卷下都必须使用Btrfs文件系统。
4.1.1快照和磁盘空间
当一个快照被创建,快照指针和原始指针指向文件系统中相同的块。所以开始的时候一个快照不会占据额外的磁盘空间。如果原始文件系统中的数据被修改了,修改的数据块被复制出来,而老的数据块被保留为快照。因此一个快照占据了和被修改数据相同大小的磁盘空间。所以随着时间推移被分配的快照占用的空间总量恒定的增长。结果就是从Btrfs文件系统中删除文件包含的快照可能不会释放磁盘空间!
注意:快照的位置
快照总是居于被快照的相同分区或子卷上。将快照存储在不同的分区或子卷上是不可能的。
结果就是,包含快照的分区要比正常分区大,确切的数量在很大程度上依赖于你所保留的快照的数量和被修改的数据的数量。根据经验你因该考虑到这会使用两倍于你正常使用的空间。
提示:释放空间/磁盘使用率
为了释放包含快照的使用了Btrfs文件系统的分区的空间,你需要删除不需要的快照而不是文件。老的快照会比最近的快照占据更多的空间。
因为在Btrsf文件系统上df工具不会显示正确的磁盘使用率,你需要使用命令 btrfs filesystem df MOUNT_POINT .Btrfs工具现在不支持显示快照分配的磁盘总空间。
4.2使用Snapper回滚YaST和zypper所做的修改
如果你在安装的时候把ROOT分区设置为Btrfs文件系统,Snapper预配置为为YaST或zypper实现回滚操作,Snapper将被自动安装。每次你开始一个YaST模块或一个zypper交互,两个快照就被创建了:一个“预快照”捕获在你开始模块之前的文件系统的状态和一个“提交快照”在模块被完成之后。
使用YaST Snapper模块或者Snapper命令行工具,你可以通过从“预快照”恢复文件来撤销YaST/zipper对系统所做的修改。通过比较这两个快照工具还允许你查看那个文件已经被修改了。你也可以在一个文件的两个版本之间显示不同。(diff)
因为Linux是一个多任务的系统,除了YaSY和zypper其他的进程可能在“预”和“提交”的快照之间的时间帧修改数据。如果这种情况发生,完全恢复之前的快照也将撤销那些被其他进程所做的修改。在很多情况下这不是我们想要的----因此强烈推荐在开始回滚前接近查看两个快照之间所做的改变。如果有其他进程所做的改变你想保存,选择哪个文件用来回滚。
重要:限制
在开始使用它的回滚机制前,确保你了解关于Snapper的限制。见1.7“限制”(111页)查看详细信息。
注意:快照的存储时间
默认情况下,最后的100个YaST和zypper快照被保留。如果这个数字被超出,老的快照就被删除了。
过程4.1:使用YaST的Snapper单元来撤销更改
1 通过在YaST的混杂菜单部分选择或者通过在终端下键入 yast2 snapper
2 确保当前配置被设置为root。这通常是必须的,除非你手动添加了Snapper配置的权限
3 从列表中选择一对“预”“提交”快照,YaST和zypper快照对都回以Pre &Post标志。YaST快照会以yast modul_ename 在描述列标记;zypper快照会以zypp(zypper)标出。
4 单击显示更改来打开在两个快照之间文件差异的列表。下面的图片显示了在添加了用户tester之后的文件列表。
5 查看文件列表。可以通过从列表中选择来实现显示一个文件“预”和“提交”的版本的不同。下面的图片显示了添加了用户tester之后/etc/passwd的变化
6 通过在相关的文件和目录之前的预览复选框上打勾来恢复一系列文件。单击恢复选择并通过单击Yes确认动作。
如果要恢复一个单一的文件,单击他的名字激活它的比较对话框。先单击恢复然后单击Yes确认你的选择。
过程4.2
1 运行snapper list –t pre-post可以得到yast和zypper的快照列表。YaST快照在描述列被标记为yast module_name;zypper被标记为zypp(zypper)。
2 使用snapper status PRE..POST 可以得到一个快照对改变的列表。被改变的文件和目录以C标记,新添加的文件以+标记,删除的文件以-标记。下面的例子显示了安装了ncftp包之后的一个快照对。
3 使用snapper diff PRE..POST FILENAME 显示一个特定文件的不同。如果你不指定FILLNAME,会显示所有文件的不同。
4 运行snapper –v undochange PRE..POST FILLNAME来恢复一个或更多的文件。如果你不指定一个FILLNAMES,所有改变了的文件将被恢复。