摘要
能够生成文件系统快照以便在 Linux 上实现回滚,这是过去常常要求提供的功能。如今,快照程序与 Btrfs 文件系统或精简的 LVM 卷相结合,填补了这一空白。
Btrfs 是全新的 Linux 写入时复制文件系统。它支持为子卷(每个物理分区中的一或多个单独的可装入文件系统)生成文件系统快照(复制子卷在某个时间点的状态)。您可以使用快照程序对这些快照进行管理。快照程序自带了命令行和 YaST 界面。
SUSE Linux Enterprise Desktop 上默认设置了快照程序和 Btrfs,以供在使用 YaST 和 zypper 更改系统时作为“撤销工具”使用。系统会在运行 YaST 模块或 zypper 前后创建快照。快照程序可让您对这两张快照进行比较,并在两张快照之间存在差异时提供还原方法。您还可以使用这些工具按小时创建系统子卷的快照,以实现系统备份。
由于 Btrfs 是 SUSE Linux Enterprise Desktop 上唯一支持快照的文件系统,因此您要生成“快照”的所有分区或子卷上都需要设置它。
创建快照时,快照与原始点都会指向文件系统中的同一个块。因此一开始时快照并不占用额外的磁盘空间。但如果修改了原始文件系统中的数据,则会复制已更改的数据块,同时将旧的数据块作为快照保留。因此,快照就将占用与已修改数据相同的空间。所以久而久之,分配给快照的空间便会不断增长。其结果是,即便从包含快照的 Btrfs 文件系统删除文件可能也不会释放磁盘空间!
![]() | 快照存储位置 |
|---|---|
快照始终驻留在“生成快照”的同一个分区或子卷,而无法将快照存储到其他分区或子卷。 | |
因此,包含快照的分区需要比“常规”分区大才行。确切的空间大小主要取决于要保留的快照数量以及数据更改量。一般来说,您应考虑使用两倍于常规使用磁盘空间的空间大小。
![]() | 释放磁盘空间/磁盘用量 |
|---|---|
为了释放包含快照的
因为 df 不会显示 升级服务包时,由于会更改大量数据(包更新),将导致快照占用大量系统子卷的磁盘空间。因此对于不再需要的快照,建议执行手动删除。 | |
快照程序也可以用来在以 ext3 或 XFS 格式化的精简 LVM 卷上创建和管理快照(参见第 4.6 节 “在精简的 LVM 卷上使用快照程序”)。
SUSE Linux Enterprise Desktop 上的快照程序经过预配置,可以用来撤销 zypper 和 YaST 所做的更改。要实现此功能,请对快照程序进行配置,让其在每次运行 zypper 和 YaST 前后创建一个快照对。您也可以使用快照程序来恢复被意外删除或修改的系统文件。要实现此功能需按小时创建备份。
默认情况下,上述的自动快照针对根分区及其子卷所配置。若想让 /home 等其他分区也可以生成快照,您可以创建自定义配置。
如果在安装时使用 Btrfs 设置根分区,则将自动安装快照程序(经过预配置,可以回滚 YaST 或 Zypper 所做的更改)。每次启动 YaST 模块或 Zypper 事务时,会创建两个快照:即截获模块启动之前文件系统状态的“前快照”以及截获模块完成之后状态的“后快照”。
您可以使用 YaST 快照程序模块或 snapper 命令行工具,通过从“前快照”恢复文件来撤销 YaST/zypper 所做的更改。您也可以使用该工具比较这两张快照,以查看更改了哪些文件。您还可以显示文件的两个版本之间的差异 (diff)。
由于 Linux 是多任务系统,因此可能还会有 YaST 或 Zypper 以外的其他进程在前快照与后快照之间的时间段内对数据进行修改。如果是这种情况,完全还原至前快照也将撤销由其他进程所做的更改。大多数情况下,这是不需要的,因此强烈建议您在开始回滚之前仔细查看两个快照之间的更改。如果需要保留其他进程所做的更改,则选择要回滚到的文件。
![]() | 限制 |
|---|---|
在尝试使用快照程序的回滚机制之前,请务必了解快照程序的限制。有关详细信息,请参见第 4.4 节 “限制”。 | |
![]() | 快照的存储时间 |
|---|---|
系统默认会保留最后的 100 个 YaST 和 Zypper 快照。如果超过这一数值,将删除最旧的快照。 | |
过程 4.1. 使用 YaST 模块撤销更改¶
从 YaST 中的部分或通过输入 来启动快照程序模块。
务必将设置为。除非手动添加自己的快照程序配置,否则请始终做此设置。
从列表中选择前后快照对。YaST 和 Zypper 快照对都属于类型。在中,YaST 快照以 yast 标记;Zypper 快照以 模块名称zypp(zypper) 标记。
![]() |
单击,会打开一个文件列表显示两张快照之间的差异。下图显示添加用户 tester 后发生更改的文件列表。
![]() |
查看文件列表。要显示文件的前后版本之间的“差异”,请从列表中选中该文件。下图显示添加用户 tester 之后 /etc/passwd 发生的更改。
![]() |
要恢复一组文件,请通过勾选相应的复选框选择相关的文件或目录。单击,然后单击以确认该操作。
![]() |
要恢复单一文件,请单击其名称以激活该文件的差异视图。单击,然后单击予以确认。
过程 4.2. 使用 snapper 命令撤销更改¶
运行 snapper list -t pre-post 以获取 YaST 与 Zypper 快照的列表。在中,YaST 快照以 yast 标记;Zypper 快照以 模块名称zypp(zypper) 标记。
~ # snapper list -t pre-post
Pre # | Post # | Pre Date | Post Date | Description
------+--------+--------------------------+--------------------------+----------------------+
4 | 5 | Tue Jan 10 14:39:14 2012 | Tue Jan 10 14:39:33 2012 | yast system_settings
65 | 66 | Thu Jan 12 17:18:10 2012 | Thu Jan 12 17:18:23 2012 | zypp(zypper)
68 | 69 | Thu Jan 12 17:25:46 2012 | Thu Jan 12 17:27:09 2012 | zypp(zypper)
73 | 74 | Thu Jan 12 17:32:55 2012 | Thu Jan 12 17:33:13 2012 | yast system_settings
75 | 76 | Thu Jan 12 17:33:56 2012 | Thu Jan 12 17:34:42 2012 | yast users
77 | 92 | Thu Jan 12 17:38:36 2012 | Thu Jan 12 23:13:13 2012 | yast snapper
83 | 84 | Thu Jan 12 22:10:33 2012 | Thu Jan 12 22:10:39 2012 | zypp(zypper)
85 | 86 | Thu Jan 12 22:16:58 2012 | Thu Jan 12 22:17:09 2012 | zypp(zypper)
88 | 89 | Thu Jan 12 23:10:42 2012 | Thu Jan 12 23:10:46 2012 | zypp(zypper)
90 | 91 | Thu Jan 12 23:11:40 2012 | Thu Jan 12 23:11:42 2012 | zypp(zypper)
108 | 109 | Fri Jan 13 13:01:06 2012 | Fri Jan 13 13:01:10 2012 | zypp(zypper)
使用 snapper status 前..后 命令以获取快照对的已更改文件列表。文件内容发生了更改会以 标记、添加了文件会以 标记、删除了文件会以 标记。以下示例显示安装 ncftp 包的快照对。
~ # snapper status 108..109
+... /usr/bin/ncftp
+... /usr/bin/ncftpbatch
+... /usr/bin/ncftpget
+... /usr/bin/ncftpls
[...]
+... /usr/share/man/man1/ncftpspooler.1.gz
c... /var/cache/zypp/solv/@System/cookie
c... /var/cache/zypp/solv/@System/solv
c... /var/lib/rpm/Basenames
c... /var/lib/rpm/Dirnames
c... /var/lib/rpm/Filemd5s
c... /var/lib/rpm/Group
c... /var/lib/rpm/Installtid
c... /var/lib/rpm/Name
c... /var/lib/rpm/Packages
c... /var/lib/rpm/Providename
c... /var/lib/rpm/Provideversion
c... /var/lib/rpm/Requirename
c... /var/lib/rpm/Requireversion
c... /var/lib/rpm/Sha1header
c... /var/lib/rpm/Sigmd5
c... /var/lib/zypp/SoftLocks
要显示某份文件的差异,请运行 snapper diff 前..后 文件名。如果没有指定文件名,则会显示所有文件的差异。
~ # snapper diff 108..109 /var/lib/zypp/SoftLocks
--- /.snapshots/108/snapshot/var/lib/zypp/SoftLocks 2012-01-12 23:15:22.408009164 +0100
+++ /.snapshots/109/snapshot/var/lib/zypp/SoftLocks 2012-01-13 13:01:08.724009131 +0100
@@ -1,4 +1,2 @@
-# zypp::SoftLocksFile generated Thu Jan 12 23:10:46 2012
-#
-ncftp
-#
+# zypp::SoftLocksFile generated Fri Jan 13 13:01:08 2012
+##
要恢复一或多份文件,请运行 snapper -v undochange 前..后 文件名。如果没有指定文件名,则会恢复所有已更改的文件。
~ # snapper -v undochange 108..109
create:0 modify:16 delete:21
undoing change...
deleting /usr/share/man/man1/ncftpspooler.1.gz
deleting /usr/share/man/man1/ncftpput.1.gz
[...]
deleting /usr/bin/ncftpls
deleting /usr/bin/ncftpget
deleting /usr/bin/ncftpbatch
deleting /usr/bin/ncftp
modifying /var/cache/zypp/solv/@System/cookie
modifying /var/cache/zypp/solv/@System/solv
modifying /var/lib/rpm/Basenames
modifying /var/lib/rpm/Dirnames
modifying /var/lib/rpm/Filemd5s
modifying /var/lib/rpm/Group
modifying /var/lib/rpm/Installtid
modifying /var/lib/rpm/Name
modifying /var/lib/rpm/Packages
modifying /var/lib/rpm/Providename
modifying /var/lib/rpm/Provideversion
modifying /var/lib/rpm/Requirename
modifying /var/lib/rpm/Requireversion
modifying /var/lib/rpm/Sha1header
modifying /var/lib/rpm/Sigmd5
modifying /var/lib/zypp/SoftLocks
undoing change done
除了 YaST 和 Zypper 快照外,快照程序还会按小时创建系统分区 (/) 的快照。您可以使用这些备份快照来恢复被意外删除或修改而无法恢复的文件。您也可以使用快照程序的差异功能来找到在某个时间点所做的修改。
每小时备份快照属于单一类型,并标有时间线说明。要从这些快照恢复文件,请按照过程 4.1, “使用 YaST 模块撤销更改”或过程 4.2, “使用 snapper 命令撤销更改”中的说明操作。
![]() | 快照的存储时间 |
|---|---|
默认情况下,会保留最近十天、最近十个月以及最近十年的首张快照。有关详细信息,请参见例 4.1 “时间线配置示例”。 | |
每一个分区或 Btrfs 子卷都有一个专用的配置文件用于定义快照程序的行为方式。这些配置文件位于 /etc/snapper/configs/ 下。使用快照程序为 / 目录安装的默认配置以 root 命名。它负责创建并管理 YaST 和 Zypper 快照,还包括 / 的每小时备份快照。
您可以为使用 Btrfs 格式化的其他分区或 Btrfs 分区上的现有子卷创建自己的配置。在以下示例中,我们将设置快照程序配置,以便对驻留在单独的、以 Btrfs 格式化且安装点为 /srv/www 的分区的 Web 服务器数据进行备份。
您可以使用 snapper 本身或 YaST 的模块来从这些快照恢复文件。在 YaST 中,您需要选择您的,同时还需要使用全局开关 -c(例如 snapper -c myconfig list)指定 snapper 的配置。
要创建新的快照程序配置,请运行 snapper create-config:
snapper -c www-datacreate-config /srv/www
此命令将使用合理的默认值(取自 /etc/snapper/config-templates/default)创建新的配置文件 /etc/snapper/config-templates/www-data。
![]() | 配置默认值 |
|---|---|
新配置的默认值取自 snapper -c www-data create-config -t my_defaults /srv/www | |
要调整配置文件,您需要使用编辑器对其进行修改。该文件中包含采用格式的键/值对。只有键=值值可更改。
SUBVOLUME
分区或子卷生成快照的安装点。不更改。
FSTYPE
分区的文件系统类型。不更改。
NUMBER_CLEANUP
定义当快照总数超出 NUMBER_LIMIT 中指定的数值同时快照超出 NUMBER_MIN_AGE 中指定的时限时是否自动删除旧快照。有效值:yes、no
![]() | 限制和时限 |
|---|---|
| |
NUMBER_LIMIT
定义当 NUMBER_CLEANUP 设置为 yes 时要保留的快照数量。
NUMBER_MIN_AGE
定义快照在自动删除前必须保留的最小时限(以秒为单位)。
TIMELINE_CREATE
如果设置为 yes,则会每小时创建一次快照。这是目前唯一的自动创建快照的方法,因此强烈建议您将其设置为 yes。有效值:yes、no
TIMELINE_CLEANUP
定义当快照数量超出 选项指定的数值同时快照超出 TIMELINE_LIMIT_*TIMELINE_MIN_AGE 中指定的时限时是否自动删除旧快照。有效值: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_LIMIT_YEARLY="10"
此示例配置能够实现按小时生成将自动清理的快照。TIMELINE_MIN_AGE 和 TIMELINE_LIMIT_* 始终会同时进行评估。在本示例中,快照删除前的最小保留时限设置为 30 分钟(1800 秒)。因为我们会每小时创建一次快照,所以确保了只会保留最近的快照。如果 TIMELINE_LIMIT_DAILY 设置为非零值,则表示还会保留当天的首张快照。
快照保留
每小时:最近创建的十张快照。
每天:保留最近十天内每天创建的首张快照。
每月:保留最近十个月内每月的最后一天创建的首张快照。
每年:保留最后十年内每年的最后一天创建的首张快照。
默认情况下,快照程序只能由 root 用户使用。但在特定情况下,某些组或用户也需要创建快照或通过还原至快照来撤销更改:
网管想要生成 /srv/www 的快照。
数据库管理员想要生成数据库的快照。
用户想要生成其主目录的快照。
此类情况下,可以创建为用户和(或)组授予权限的快照程序配置。除了此项配置更改外,还需要让相应的 .snapshots 目录可为指定用户读取和访问。
过程 4.3. 让普通用户可以使用快照程序
请注意,此过程中的所有步骤都需要由 root 用户运行。
如果不存在,则请为用户可以使用快照程序的分区或子卷创建快照程序配置。有关指导,请参见第 4.2.3 节 “创建并修改快照程序配置”。示例:
snapper --config web_data create /srv/www
在 /etc/snapper/configs/下创建配置文件,其中“名称”为您在上一步中使用 名称-c/--config 指定的值(例如 /etc/snapper/configs/web_data)。按照需要进行调整;有关详细信息,请参见第 4.2.3.1 节 “调整配置文件”。
为 ALLOW_USERS 和(或)ALLOW_GROUPS 设置值,以分别为用户和(或)组授予权限。多个条目需要使用 Space 分隔。例如,要为用户 www_admin 授予权限,可输入:
ALLOW_USERS="www_admin"
授予对快照目录路径/.snapshots 的读取和访问权限。路径将被您在此过程的第一步中指定的子卷替代。示例:
chmod a+rx /srv/www/.snapshots
此时,指定的用户和(或)组便可以使用指定的快照程序配置。您可以使用 list 命令对其进行测试,例如:
www_admin:~ > snapper -c web_data list
如果您在安装期间使用 Btrfs 设置了根分区,则快照程序会每小时自动创建系统快照,同时生成 YaST 和 zypper 事务的前快照和后快照。您可以禁用这些任务中的任意一个任务,方式如下:
编辑 /etc/snapper/configs/root 并将 TIMELINE_CREATE 设置为 no:
TIMELINE_CREATE="no"
卸装 snapper-zypp-plugin 包
编辑 /etc/sysconfig/yast2 并将 USE_SNAPPER 设置为 no:
USE_SNAPPER="no"
通过配置,快照程序将不只限于自动创建和管理快照;您也可以使用命令行工具或 YaST 模块手动创建快照对(“前后”)或单个快照。
所有快照程序操作皆针对现有配置执行(有关详细信息,请参见第 4.2.3 节 “创建并修改快照程序配置”)。您可以只为存在配置的分区或卷生成快照。默认情况下使用系统配置 (root)。如果想要为自己的配置创建或管理快照,则需要进行明确选择。使用 YaST 中的下拉菜单,或在命令行上指定 -c(即 snapper -c 我的配置 命令)。
每一张快照均由快照本身以及一些元数据组成。创建快照时,您还需要指定元数据。修改快照就意味着更改其元数据——您无法修改其内容。每一张快照可以使用以下元数据:
类型:快照类型,有关详细信息,请参见第 4.3.1.1 节 “快照类型”。不能更改此数据。
编号:快照的唯一编号。不能更改此数据。
前编号:指定相应前快照的编号。仅适用于后类型。不能更改此数据。
说明:快照的说明。
用户数据:扩展的说明,此处您可使用逗号分隔的“键=值”列表格式指定自定义数据:reason=testing_stuff, user=tux
清理算法:快照的清理算法。有关详细信息,请参见第 4.3.1.2 节 “清理算法”。
快照程序能够分清三种不同类型的快照:前快照、后快照以及单一快照。从物理上讲,这三种快照没有什么不同,但快照程序会针对不同类型采用不同的处理方式。
前
修改前的文件系统快照。每一张前快照都有一个对应的后快照。例如,YaST/zypper 自动快照。
后
修改后的文件系统快照。每一张后快照都有一个对应的前快照。例如,YaST/zypper 自动快照。
单一独立的快照。例如,每小时自动生成的快照。此为创建快照时的默认类型。
快照程序提供有三种清理旧快照的算法。这些算法以每天计划作业方式执行。快照的清理频率在分区或子卷的快照程序配置中定义(有关详细信息,请参见第 4.2.3.1 节 “调整配置文件”)。
当达到某一快照计数时将删除旧快照。
将删除超过一定时限的旧快照,但保留一定量的每小时、每天、每月和每年快照。
将删除无差异的前后快照对。
通过运行 snapper create 或单击 YaST 的模块中的来创建快照。以下示例解释了如何从命令行创建快照。使用 YaST 界面会比较简单。
![]() | 快照说明 |
|---|---|
为了便于日后确定快照的用途,您应始终指定有意义的说明。甚至可以通过用户数据选项指定更多信息。 | |
--description "2013 年第二周快照"
创建默认 (root) 配置的独立快照(单一类型)并附加说明。因为没有指定清理算法,将不会自动删除快照。
--config home create --description "~tux 中清理"
为名为 home 的自定义配置创建独立快照(单一类型)并附加说明。因为没有指定清理算法,将不会自动删除快照。
--config home create --description "每日数据备份" --cleanup-algorithm timeline
为名为 home 的自定义配置创建独立快照(单一类型)并附加说明。一旦符合为配置中的时间线清理算法指定的条件,便会自动删除文件。
--type pre--print-number--description "Apache 配置清理之前"
创建前类型的快照并打印快照编号。创建用于保存“之前”和“之后”状态的快照对所需的首个命令。
--type post--pre-number 30--description "Apache 配置清理之后"
创建后类型的快照且其对应的前快照编号为 30。创建用于保存“之前”和“之后”状态的快照对所需的第二个命令。
--command COMMAND--description "命令前后"
运行命令前后自动创建快照对。此选项仅在于命令行上使用 snapper 时可用。
您可以使用快照程序修改说明、清理算法以及快照的用户数据。其他元数据均无法更改。以下示例解释了如何从命令行修改快照。使用 YaST 界面会比较简单。
要在命令行上修改快照,您需要知道其编号。使用 snapper list 可显示所有快照及其编号。
YaST 的模块已列出所有快照。从列表中选择一个快照,然后单击。
--cleanup-algorithm "timeline" 10
修改默认 (root) 配置的第 10 张快照的元数据。清理算法设置为 timeline。
--config home modify --description "每日备份" -cleanup-algorithm "timeline"120
修改名为 home 的自定义配置的第 120 张快照的元数据。将设置新的说明并取消设置清理算法。
要使用 YaST 的模块删除快照,请从列表中选择快照,然后单击。
要使用命令行工具删除快照,需要知道其编号。运行 snapper list 命令获取快照编号。要删除快照,请运行 snapper delete 编号。
![]() | 删除快照对 |
|---|---|
删除 | |
删除默认 (root) 配置的第 65 张快照。
-c home delete 89 90
删除名为 home 的自定义配置的第 89 张和第 90 张快照。
![]() | 旧快照占用的磁盘空间更多 |
|---|---|
如果您要删除快照以释放硬盘上的空间(有关详细信息,请参见第 4.1.1 节 “快照和磁盘空间”),请务必首先删除旧快照。快照生成的时间越长,其占用的空间就越大。 | |
也可以通过每日计划作业自动删除快照。有关详细信息,请参见第 4.3.1.2 节 “清理算法”。
虽然 Btrfs 以及快照程序已准备好可以正式发布,但对于它们的后续开发仍在继续。该产品目前还存在以下限制。这些问题计划将在后续版本中得到解决。
目前还没有机制能在创建快照时确保数据的一致性。如果在创建快照的同时写入文件(例如数据库)都将导致文件损坏或写入不完整。恢复此类文件会产生问题。因此强烈建议您要始终仔细查看已更改文件及其差异的列表。请只恢复确实需要执行回滚操作的文件。
通常,/home 位于单独分区。此类单独分区不属于执行 YaST 回滚操作的默认配置。因此,在使用快照程序还原用户添加时不会删除用户的主分区。强烈建议您使用 YaST 的工具来去除用户。
/boot 上以及引导加载程序的更改无法回滚¶
目前,SUSE Linux Enterprise Desktop 不能从 Btrfs 分区引导。因此在为系统分区使用 Btrfs 时,一旦安装便会创建 /boot 的单独分区。由于 /boot 不支持快照,因此以下限制仅适用于 YaST/zypper 回滚:
只有 /etc 中的引导加载程序配置文件可以执行回滚。大部分配置文件驻留在 /boot 下无法执行回滚。
内核本身及其 initrd 安装在 /boot 分区中,而内核模块或源分别安装在 /var/lib 和 /usr/src 中。此外,每一个内核安装还会更改 /boot 中的引导加载程序配置文件。因此,无论您何时执行涉及撤销内核安装的回滚操作,都需要手动从 /boot 删除内核及其 initrd,并通过删除该内核的引导条目调整引导加载程序配置。
/var/log、/tmp 以及其他目录中的更改?
对于某些目录(例如 /var/log),我们决定禁用“快照生成”,因为还原日志会让问题难以搜索。为了将路径从“快照生成”中排除,我们为该路径创建了子卷。以下安装点会排除在 SUSE Linux Enterprise Desktop 上的“快照生成”范围之外:
/opt
/srv
/tmp
/var/crash
/var/log
/var/run
/var/spool
/var/tmp
目前还不可行。SUSE Linux Enterprise Desktop 上的引导加载程序目前不支持从 Btrfs 分区引导。
除了在 Btrfs 文件系统上生成快照之外,快照程序还支持在使用 ext3 或 XFS 格式化的精简 LVM 卷(不支持在常规 LVM 卷上生成快照)上“生成快照”。有关详细信息以及设置指导,请参见Section “LVM Configuration” (Chapter 12, Advanced Disk Setup, ↑Deployment Guide)。
为了在精简 LVM 卷上使用快照程序,您需要为其创建快照程序配置。在 LVM 上要使用 --fstype=lvm( 指定文件系统。由于目前支持 ext3 和 XFS,因此 文件系统)ext3 或 xfs 对于文件系统是有效值。示例:
snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm
您可以按照第 4.2.3.1 节 “调整配置文件”中的说明根据需要调整此配置。然后,您便可以使用快照程序来创建和管理快照、恢复文件以及撤销更改(如上所述)。