红联Linux门户
Linux帮助

在openSUSE下使用Snapper实现快照和回滚

发布时间:2014-10-26 09:32:21来源:linux网站作者:linux人

在过去的很长一段时间里我们需要一种可以在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,所有改变了的文件将被恢复。

4.3  使用Snapper从每小时的备份中恢复文件

作为YaST和zypper快照的一部分,Snapper会为系统分区(也就是“/”)创建每小时的快照。当一些文件被意外的删除或修改而无法恢复时,你可以使用这些备份的快照恢复它们。通过利用Snapper的比较特性你也可以找出在一个确定的时间点上哪一个修改发生了。

每小时的备份快照是Single类型的所以被描述为时间表(也就是timeline)。过程4.1描述了如何从这些快照中恢复文件(使用YasT snapper模块撤销更改99页)或过程4.2,“使用Snapper命令撤销更改102页”。

注意:快照的存储时间

默认情况下,每天最新的十个快照会被保留。此外之后的十天十个月十年十个快照也会被保留。详细信息请查看例子4.1,“时间表配置”(110页)

4.4管理快照

使用Snapper你不仅可以创建和删除快照而且还可以设置和修改数据元。所有的Snapper操作使用一个确定的配置。如果你不指定一个配置,那么一个默认(根用户)的配置将会被使用。如果你想使用你自己的配置文件(见4.6部分,“创建snapper配置文件”108页)来管理你的快照,你需要使用Snapper的全局配置选项-c来制定它:

Snapper –c myconfig list

参考snapper的manpage来获取详细信息(man 1 snapper)。

4.4.1 快照的数据元

每一个快照包含了快照自己本身和一些数据元。使用Snapper 你可以设置和修改一些数据元。下面是快照可用的数据元:

TYPE:快照类型,见4.4.1.1,“快照类型”(105页)。这个数据不可以修改。

Number:快照独一无二的数字。这个数据不可以被修改。

Pre Number:指定协调预快照的数字,仅仅对应提交快照。此数据不可更改。

Description:快照的描述。

Userdata:一个扩展描述,在这里你可以指定自定义的数据或者逗号分隔的键值对列表:reason=testing_stuff,user=tux

Cleanup-Algorithm:快照的清除算法

4.4.1.1快照类型

Snapper识别三种不同的快照:pre,post,Single。物理上它们是相同的,但是Snapper对它们有不同的处理方法。

Pre

在修改之前文件系统的快照。每一个pre快照和一个post快照联系在一起。使用例子如自动的YaSY/zypper快照。

Post

修改之后的文件系统快照。每一个post快照和一个pre快照联系在一起。使用例子如自动的YaSY/zypper快照。

Single

独立的快照。使用例子如自动的每小时的快照。当创建快照时这是默认的类型。

4.4.1.2 清除算法

Snapper提供了三种清除旧快照的算法。算法被每天的例行作业执行。清除频率自己被定义在snapper对分区或子卷的配置文件中(见4.6.1,“修改配置文件”109页)。

Number

当达到确定的快照数量,删除旧的快照。

Timeline

删除已经超过了期限的快照,但是保留一定数量的每小时,每天,每月,每年的快照。

Empty-pre-post

使用空差异删除pre/post快照对。

4.4.2创建快照

使用snapper create创建快照。你应当总是使用-d选项指定一个有意义的描述来方便以后可以识别它的目的。

Snapper create –d “before the Apache config cleanup”

使用默认(root)的配置创建一个带有描述的独立的快照(类型single)。因为没有清除算法被指定快照将永远不会被自动删除。

Snapper –c home create – d  “.-file cleanup in ~tux”

使用自定义的配置文件叫home创建一个带有描述的独立的快照(类型Single)。因为没有清除算法被指定快照将永远不会被自动删除。

Snapper –c home create –d “daily HOME backup” –c timeline

使用自定义的配置文件叫home创建一个带有描述的独立的快照(类型Single)。当它达到了配置文件清除算法指定的时间表标准,文件将会被自动删除

4.4.3修改快照数据元

Snapper 允许修改一个快照的描述,清除算法,和用户数据。所有其他的数据元不可修改。

Snapper modify –c “timeline” 10

修改快照10默认配置(root)的数据元。清除算法被设置为时间表。

Snapper –c home modify –d “daily backup” –c “” 120

使用自定义的名为home的配置文件修改快照120的数据元。设置新的描述,清除算法未设置。

4.4.4删除快照

你需要知道一个快照的数字才能删除它。使用snapper list可以得到。使用snapper delete NUMBER删除一个快照。当删除了一个pre快照,你总是应该同时删除与之相联系的post快照。

Snapper delete 65

删除默认(root)配置文件下的快照65

Snapper –c home delete 89 90

删除自定义配置文件名为home下的快照89和90.

窍门:越是老的快照越会占据更多的磁盘空间

如果你删除快照目的是释放你的磁盘空间(见 1.1.1,“快照和磁盘空间”97页),请确保先删除老的快照。快照越是老,就越是占据越多的磁盘空间。

快照也会通过每天的例行事务自动的删除。参考1.4.1.2,“清除算法”106页。

4.5 禁用Snapper

如果你在安装的时候已经把root分区格式化为Btrfs文件系统了,Snapper会自动创建每小时的系统快照,和为YaST/zypper交互创建pre-和post-快照。这些工作可以通过下面的方法禁用:

禁用每小时的快照

编辑/etc/snapper/configs/root 设置TIMELINE_CREATE为no:

TIMELINE_CREATE=“NO”

禁用zypper快照

卸载包 snapper-zypp-plugin

禁用YaST快照

编辑/etc/sysconfig/yast2设置USE_SNAPPER为no:

USE_SNAPPER=“no”

4.6 创建snapper配置文件

Snapper的执行方式被定义在了一个配置文件中,配置文件指定了每一个分区或Btrfs子卷。这些配置文件存在于/etc/snapper/configs/。默认的随snapper一起安装的对“/”目录起作用的配置文件被称为root。它为“/”创建和管理YaST和zypper快照和每小时的备份快照。

你可以创建自己的配置文件,用来管理其他的被格式化为btrfs的分区或者存在于一个btrfs分区上的子卷。在下面的例子当中我们将设置一个Snapper配置文件来备份一个分区上的web服务器的数据,格式化为btrfs分区被挂载于/srv/www。

为了从这些快照中恢复文件 ,你可以使用snapper本身或YaST snapper 模块。在YaST当中你需要选择你当前的配置文件,你需要使用全局选项- c 为snapper指定你的配置文件(例如 snapper –c myconfig list)。

使用snapper create-config创建一个新的Snapper配置文件:

Snapper –c www-data① create-config /srv/www②

① 配置文件的名称

②创建快照的分区或者btrfs子卷的挂载点

这条命令将创建一个新的配置文件/etc/snapper/config-templates/www-data和合理的默认值(继承自/etc/snapper/config-templates/default)。

窍门:配置默认值

新配置文件的默认值来自于/etc/snapper/config-templates/default。使用你自己设置的默认值,只需要在同一个目录下拷贝这个文件并修改成你所需要的。为了使用它,在创建配置文件命令是使用-t选项指定:

Snapper –c www-data create-config –t my_defaults /srv/www

4.6.1  修改配置文件

要调节配置文件,你需要使用一个编辑器修改它。它以key=value的形式包含了键值对。你只能修改值。

SUBVOLUME

使用快照的分区或子卷的挂载点。不要 修改。

FSTYPE

分区文件系统的类型,不要修改。

NUMBER_CLEANUP

定义当NUMBER_LIMIT指定的数量和NUMBER_MIN_AGE指定的年龄被超过时是否自动的删除老的快照。有效值:yes,no。

注意:限制和年龄

NUMBER_LIMIT 和 NUMBER_MIN_AGE总是会两者同时评估。只有两个条件同时满足时快照才被删除。如果你总是想保留确定数量的快照而不管他们的年龄,设置NUMBER_MIN_AGE为0.另一方面如果你不想保留超出年龄的快照,设置NUMBER_LIMIT为0.

NUMBER_LIMIT

定义如果NUMBER_CLEANUP被设置为yes多少快照将被保留。

NUMBER_MIN_AGE

用秒定义在它能被自动删除之前快照最小的存在时间。

TIMELINE_CREATE

如果设置为yes,每小时的快照就会被创建。这是当前仅有的方法创建自动快照,因此设置它为yes是强烈推荐的。有效值:yes,no

TIMELINE_MIN_AGE

用秒定义在它能被自动删除之前快照最小的存在时间。

TIMELINE_LIMIT_HOURLY, TIMELINE_LIMIT_DAILY,

TIMELINE_LIMIT_MONTHLY, TIMELINE_LIMIT_YEARLY

一定数量的快照被保留几小时,几天,几月,几年。

例子 4.1:时间表配置例子

TIMELINE_CREATE="yes"

TIMELINE_CLEANUP="yes"

TIMELINE_MIN_AGE="1800"

TIMELINE_LIMIT_HOURLY="10"

TIMELINE_LIMIT_DAILY="10"

TIMELINE_LIMIT_MONTHLY="10"

这个样例配置允许每小时的快照自动被清除。TIMELINE_MIN_AGE 和TIMELINE_LIMIT_*总是同时被评估。在这个例子当中,在快照可以被删除之前快照的最小年龄被设置为30分钟(1800秒)。因为我们会创建每小时的快照,这可以保证只有最新的快照会被保留。如果TIMELINE_LIMIT_DAILY被设置为0,这就意味着每天的第一个快照也被保留。

被保留的快照

小时的:最新的10个快照

天的:每天的第一个快照将被保留十天

月的:一个月的最后一天的第一个快照将被保留十个月

年的:12月31日的第一个快照将被保存十年

4.7 限制

虽然已经准备好作为产品了,Btrfs和Snapper还在恒定的向前开发中。下列的限制存在于当前。计划将会在将来的发行版中解决这些问题。

4.7.1数据一致

当创建快照时没有机制会确保数据连贯。每当一个文件被写入(例如数据库)在同时快照被创建,结果将会是一个破损或写入了一半的文件。恢复这样的文件将会导致问题。因此强烈推荐总是进入详细查看改变列表和他们的不同。只有真实的恢复文件需要被归于你想回滚的操作。

4.7.2恢复用户附加数据

通常/home存在于一个独立的分区上。这样一个独立的分区将不会是用于做YaST回滚的默认配置文件的一部分。因此当使用Snapper恢复用户附加数据时用户的home分区将不会被删除数据。强烈使用YaST User和Group Management工具来删除用户

4.7.3不要回滚/boot和Boot Loader的改变

当前的openSUSE不能从btrfs分区启动。因此当安装使用btrfs为系统分区时一个独立的分区将被创建并挂载到/boot。因为/boot不支持快照,下面的YaST/zypper回滚限制使用:

在bootloader上任何配置更改不可以被回滚

唯一可以被回滚的bootloader配置文件在/etc。

主要的存在于/boot中的配置文件不可以被回滚。

不要回滚核心安装

核心自己和他的initrd被安装在/boot分区,然而核心模块和资源却被分别安装在/var/lib和/usr/src。此外每个核心安装也改变bootloader在/boot的配置文件所以无论何时你回滚联系到反安装核心安装时,你需要从/boot手动移除核心和他的inintd并调节bootloader配置文件移除核心启动项。

4.8常见问题

为什么Snapper永远不会在日志文件/var/log,/tmp和其他文件夹上显示改变?

对于一些目录我们禁用快照,例如/var/log因为恢复日志使寻找问题更困难了。为了排除对一个路径建立快照,我们给那个路径创建了子卷。在openSUSE下列的挂在点排除快照功能:

/opt

/srv

/tmp

/var/crash

/var/log

/var/run

/vat/spool

/var/tmp

我可以从Bootloader启动快照吗?

现在这是不行的。OpenSUSE的Bootloader当前不支持从btrfs分区启动。