What You See Is What You Get Element What You See Is What You Get Element

自动采集 ZFS 快照和跟踪软件更新

适用于 Oracle Solaris 11 Express 的软件管理最佳实践 — 第 2 部分

作者:Ginny Henningsen,2011 年 5 月

第 1 部分 — 利用 IPS 更新软件的最佳方法
第 2 部分 — 自动采集 ZFS 快照和跟踪软件更新的最佳方法



简介

本文是重点介绍 Oracle Solaris 11 Express 中最佳实践的系列文章的第 2 篇。第 1 篇文章更新软件介绍了映像包管理系统 (IPS) 软件打包模型,并讨论了执行更新的最佳实践:在应用更新之前创建一个新引导环境 (BE)。在某些情况下(如更新和完整升级),IPS 会自动创建新的 BE。

BE 是您更改软件时的内置安全措施,很像 Oracle Solaris 10 中的 Live Upgrade 环境。在 Oracle Solaris 11 Express 中,根文件系统是使用 Oracle Solaris ZFS 实现的,因此 BE 基本上就是针对引导激活的可读写的 Oracle Solaris ZFS 快照。由于这一底层技术,您可以像采集任何 Oracle Solaris ZFS 卷快照一样定期生成 BE 快照。

本文介绍 Oracle Solaris 11 Express 如何使用自动化快照提供 Time Slider 服务,这是 GNOME 桌面的一个新特性。使用 Time Slider,可以定期采集活动 BE 的快照,定期捕获软件状态。如果您在更新软件时忘记显式创建 BE,则可能证明此方法很有用。

由于软件更新的历史记录在故障排除时可能特别有用,因此本文还重点介绍了探究程序包更改的命令。注意,所有示例均假设用户为已授权用户(请参见 Oracle Solaris 11 Express 入门中的“用户帐户、角色和权限配置文件”)。

Time Slider 简介

Time Slider 服务是 GNOME 文件管理器(即 nautilus)中的一个新组件,它依赖于生成定期 Oracle Solaris ZFS 快照的服务。Time Slider 在概念上与 Apple 的 Mac OS 中的时间机器类似,它为桌面用户提供了一种从自动计划的主目录增量快照轻松恢复各个文件或目录的方法。激活和设置 Time Slider 服务之后,它就可以“频繁”(默认情况下每 15 分钟)生成快照,也可以每小时、每天、每周或每月生成快照。

自动执行定期快照的服务可以为任何文件系统以及 BE 甚至是非桌面系统执行此操作。然而,要使用 Time Slider 机制自动采集快照,需要针对 GNOME 桌面环境的程序包(例如 slim_install 程序包组),即使是在 gdm 桌面管理器未运行时也是如此。(这是因为 Time Slider 服务需要使用属于 GNOME 体系的通知机制。)

如何在桌面启用 Time Slider 服务?

默认情况下,支持 Time Slider 的服务处于禁用状态,即使在桌面系统上也是如此:

  # svcs time-slider
  STATE          STIME    FMRI
  disabled       16:33:56 svc:/application/time-slider:default
  # svcs auto-snapshot
  STATE          STIME    FMRI
  disabled       16:33:56 svc:/system/filesystem/zfs/auto-snapshot:monthly
  disabled       16:33:56 svc:/system/filesystem/zfs/auto-snapshot:weekly
  disabled       16:33:56 svc:/system/filesystem/zfs/auto-snapshot:daily
  disabled       16:33:56 svc:/system/filesystem/zfs/auto-snapshot:hourly
  disabled       16:33:56 svc:/system/filesystem/zfs/auto-snapshot:frequent

在桌面启用 Time Slider 的最简单方法是使用 GUI(在命令行输入 time-slider-setup 或使用 System -»Administration-»Time Slider 菜单)。GUI(如图 1 所示)允许您选择要采集快照的文件系统、指定是否将快照备份至外部驱动器,以及设置删除快照的容量策略。

Oracle Solaris 11 Express — 自动采集快照和跟踪更新
图 1. Time Slider GUI

如何使用命令行启用 Time Slider 服务?

首先,如果您使用的不是 GUI,请指定要通过自动快照捕获的文件系统和 BE。为此,请将 com.sun:auto-snapshot 属性设置为 true,如以下命令所示。第一个命令指定用户 jdoe 的主目录,第二个命令指定用户 rkai 的主目录。在第三个命令的输出中,将对显示为 true 的值采集快照。

  # zfs set com.sun:auto-snapshot=true rpool1/export/home/jdoe  
  # zfs set com.sun:auto-snapshot=true rpool1/export/home/rkai 
  # zfs get all |grep auto-snapshot

由于目录从其父目录继承了 Oracle Solaris ZFS 属性,因此为 /export/home 设置自动快照将捕获该层次结构中的所有子目录。

无论是否使用 GUI 选择采集快照的对象,都必须先启用 Time Slider 服务。在以下示例中,所有自动快照服务均已启用,同样,需要的 Time Slider 插件和 Time Slider 服务也已启用:

  # svcadm enable auto-snapshot:frequent
  # svcadm enable auto-snapshot:hourly
  # svcadm enable auto-snapshot:daily 
  # svcadm enable auto-snapshot:weekly 
  # svcadm enable auto-snapshot:monthly 
  # svcadm enable time-slider/plugin:zfs-send
  # svcadm enable time-slider/plugin:rsync
  # svcadm enable time-slider

由于 auto-snapshottime-slider/plugin 服务依赖于 time-slider 服务,请确保最后启用 time-slider 服务(或重新启动它)。同样,这些服务需要 GNOME 桌面程序包,如果启用了这些服务而未安装 GNOME 程序包,则这些服务将进入维护模式。

如何在桌面使用 Time Slider?

激活这些服务并设置 Oracle Solaris ZFS 属性之后(通过 GUI 或命令行,如上所述),就可以在 GNOME 文件管理器中使用 Time Slider 功能。启动文件管理器并在文件管理器的导航栏中单击时钟图标。(如果时钟图标为灰显状态,则表示未正确启用 Time Slider 服务。返回并检查前面的步骤,然后重新启动文件管理器。)

Time Slider 功能允许桌面用户在捕获的快照之间导航。在图 2 中,最左侧的文件管理器显示一个先前快照的主目录内容,最右侧的文件管理器显示当前状态。名为“Project A”的目录出现在早期快照中,但在当前目录中不再存在。

Oracle Solaris 11 Express — 自动采集快照和跟踪更新

图 2. 比较 Time Slider 快照

如何在桌面使用 Time Slider 恢复文件?

假设图 2 中所示的“Project A”目录被意外删除。要恢复该文件,用户只需将其从先前的快照拖放到当前状态的期望目标目录(在文件管理器中标记为“Now”)中。

如何自动采集引导环境快照?

很好。对于误删除或覆盖文件或目录(如上面示例中的“Project A”)的用户,Time Slider 显然很有价值。然而,自动快照可以定期捕获当前 BE,如果软件更新出问题,这将很有用。通过定期克隆 BE 中的当前软件状态,可以根据需要还原到先前的状态。

如果您是授权用户,可以使用 GUI 或命令行等效项启动 BE 自动快照。为自动快照指定 BE 的过程与指定用户主目录的过程基本相同。只需激活若干服务(如前所示)并将 BE 的 com.sun:auto-snapshot 属性设置为 true。例如,以下命令将 BE solarisBE2auto-snapshot 属性设置为 true

  # zfs set com.sun:auto-snapshot=true rpool1/ROOT/solaris
  # zfs set com.sun:auto-snapshot=true rpool1/ROOT/BE2

当然,作为替代,您可以创建一个 cron 作业定期对 BE 执行快照采集(发出像 zfs snapshot rpool1/ROOT/solaris@backup 这样的命令)。生成 Oracle Solaris ZFS 快照的其他示例可以在 Oracle Solaris ZFS 管理指南中找到。

如何列出可用快照?

下面的命令列出所有快照,同时包括 BE 和非 BE 快照:

  # zfs list -t snapshot
  NAME                                                 USED AVAIL REFER MOUNTPOINT
  rpool/ROOT/BE2@zfs-auto-snap_hourly-2011-03-10-11h10              0  -  3.49G  
  rpool/ROOT/BE2@zfs-auto-snap_frequent-2011-03-10-11h55            0  -  3.49G  -
  rpool/ROOT/solaris@install                                    26.5M  -  3.34G  -
  rpool/ROOT/solaris@2011-03-09-22:39:13                        11.6M  -  3.58G  -
  rpool/ROOT/solaris@zfs-auto-snap_hourly-2011-03-10-11h10      40.5K  -  3.58G  -
  rpool/ROOT/solaris@zfs-auto-snap_frequent-2011-03-10-11h40    40.5K  -  3.58G  -
  rpool/ROOT/solaris@zfs-auto-snap_frequent-2011-03-10-11h55        0  -  3.58G  -
  rpool/export/home/jdoe@zfs-auto-snap_monthly-2011-03-09-16h10 19.5K  -  39.0M  -
  rpool/export/home/jdoe@zfs-auto-snap_hourly-2011-03-09-22h10    19K  -  39.0M  -
  rpool/export/home/jdoe@zfs-auto-snap_hourly-2011-03-10-09h10   112K  -  39.0M  -
  rpool/export/home/jdoe@zfs-auto-snap_hourly-2011-03-10-10h10   282K  -   942K  -
  rpool/export/home/jdoe@zfs-auto-snap_hourly-2011-03-10-11h10    23K  -  31.6M  -
  rpool/export/home/jdoe@zfs-auto-snap_frequent-2011-03-10-11h25  23K  -  31.6M  -
  rpool/export/home/jdoe@zfs-auto-snap_frequent-2011-03-10-11h40  32K  -  38.1M  -
  rpool/export/home/jdoe@zfs-auto-snap_frequent-2011-03-10-11h55    0  -  38.1M  -

如果只显示 BE 快照,请使用以下形式的 beadm

  # beadm list -s
  BE/Snapshot                                      Space  Policy Created          
  -----------                                      -----  ------ -------          
  BE2
   BE2@zfs-auto-snap_frequent-2011-03-10-11h55     0      static 2011-03-10 11:55 
   BE2@zfs-auto-snap_hourly-2011-03-10-11h10       0      static 2011-03-10 11:10 
  solaris
   solaris@2011-03-09-22:39:13                     11.60M static 2011-03-09 16:39 
   solaris@install                                 26.54M static 2011-03-08 16:17 
   solaris@zfs-auto-snap_frequent-2011-03-10-11h40 40.5K  static 2011-03-10 11:40 
   solaris@zfs-auto-snap_frequent-2011-03-10-11h55 0      static 2011-03-10 11:55 
   solaris@zfs-auto-snap_hourly-2011-03-10-11h10   40.5K  static 2011-03-10 11:10

对自动快照,快照名称使用 Oracle Solaris ZFS 数据集名称,后面加上
@zfs-auto-snap <type>(其中 typefrequenthourly 等),以及日期和时间戳。

自动快照将保留多长时间?

只要空间允许,将根据类型保留一定数目的自动 Oracle Solaris ZFS 快照。从服务清单 (/var/svc/manifest/system/filesystem/auto-snapshot.xml) 可以看到,auto-snapshot 服务(默认情况下)保留过去 3 个 frequent、23 个 hourly、6 个 daily、4 个 weekly 和 12 个 monthly 快照。然而,如果需要空间,将删除快照,首先删除最旧的快照。

如何删除不需要的自动快照?

当心!下面的命令将删除与模式 @zfs-auto-snap 匹配的所有快照:

  # for s in `zfs list -H -o name -t snapshot | grep @zfs-auto-snap`; 
    do zfs destroy $s; done

如果您是授权用户,也可以使用 Time Slider GUI 删除不需要的快照。删除 BE 将删除相关快照。将以下输出与前面的 beadm list 命令进行比较:

  # beadm destroy BE2
  Are you sure you want to destroy BE2?  This action cannot be undone(y/[n]): y
  # beadm list -s
  BE/Snapshot                                        Space  Policy Created          
  -----------                                        -----  ------ -------          
  solaris
   solaris@install                                 26.58M static 2011-03-08 16:17 
   solaris@zfs-auto-snap_frequent-2011-03-10-12h25 41.0K  static 2011-03-10 12:25 
   solaris@zfs-auto-snap_frequent-2011-03-10-12h40 41.0K  static 2011-03-10 12:40 
   solaris@zfs-auto-snap_frequent-2011-03-10-13h40 29.0K  static 2011-03-10 13:40 
   solaris@zfs-auto-snap_hourly-2011-03-10-11h10   40.5K  static 2011-03-10 11:10 
   solaris@zfs-auto-snap_hourly-2011-03-10-12h10   40.5K  static 2011-03-10 12:10 
   solaris@zfs-auto-snap_hourly-2011-03-10-13h10   41.0K  static 2011-03-10 13:10

如何恢复到自动快照中保留的 BE?

要使用先前的 BE 快照执行回滚,请从该快照创建一个 BE,然后激活该 BE 并重新启动。在下面的示例中,从先前的 BE 快照创建了一个名为 BEnew 的新 BE,然后将该 BEnew 设置为在重新启动后成为活动 BE:

  # beadm create -e solaris@zfs-auto-snap_hourly-2011-03-10-11h10 BEnew
  # beadm activate BEnew
  # reboot       

如何跟踪程序包安装和更新?

pkg history 命令对于研究对当前 BE 曾做过哪些软件更新很有用。不带参数运行时,该命令将提供软件更改的概览,如下例所示:

  # pkg history
  TIME                OPERATION                 CLIENT          OUTCOME
  2010-11-05T11:14:56 purge-history             pkg             Succeeded
  2011-03-14T09:16:00 uninstall                 pkg             Succeeded
  2011-03-14T09:16:09 uninstall                 pkg             Succeeded
  2011-03-14T09:16:15 set-property              pkg             Succeeded
  2011-03-14T09:16:17 update-publisher          pkg             Succeeded
  2011-03-14T09:16:18 set-property              pkg             Succeeded
  2011-03-14T10:58:31 refresh-publishers        pkg             Succeeded
  2011-03-14T10:58:31 install                   pkg             Succeeded
  2011-03-14T10:58:32 rebuild-image-catalogs    pkg             Succeeded
  2011-03-14T11:32:45 uninstall                 pkg             Succeeded
  2011-03-14T12:47:31 refresh-publishers        updatemanager   Succeeded
  2011-03-14T12:47:33 rebuild-image-catalogs    updatemanager   Succeeded
  2011-03-15T09:22:07 install                   pkg             Succeeded

也许更有用的是使用 -l 选项提供的输出,它报告进行了哪些更改、更改是否成功、哪些用户执行的更改、何时做的更改、使用了哪个命令,以及有关起始状态和结束状态的详细信息。

例如,以下输出片段显示用户 jdoe 运行了 pkg install gcc -3 命令,该命令成功为 GNU 编译器安装了 4 个程序包:

  Operation: install
          Outcome: Succeeded
           Client: pkg
          Version: 052adf36c3f4
             User: jdoe (101)
       Start Time: 2011-03-16T09:22:07
         End Time: 2011-03-16T09:23:41
          Command: /usr/bin/pkg install gcc-3
      Start State: 
  Solver: [ Variables: 887 Clauses: 6874 Iterations: 1 State: Succeeded]
  Timings: [phase 1:  0.577, phase 2:  0.116, phase 3:  0.256, phase 4:  0.000, 
  phase 5:  0.000, phase 6:  0.000, phase 7:  0.019, phase 8:  1.258, phase 9:  
  0.000, phase 10:  0.781, phase 11:  0.028, phase 12:  0.141]
  Maintained incorporations: pkg://solaris/consolidation/gfx/gfx-incorporation@0.5.11,5.11-0.151.0.1:20101105T053408Z
  .
  . 
  .
  pkg://solaris/consolidation/osnet/osnet-incorporation@0.5.11,5.11-0.151.0.1:20101104T230646Z
  Package version changes:
        End State:
  None -> pkg://solaris/developer/gnu-binutils@2.19,5.11-0.151.0.1:
  20101105T053803Z
  None -> pkg://solaris/developer/library/lint@0.5.11,5.11-0.151.0.1:
  20101104T231349Z
  None -> pkg://solaris/developer/gcc-3@3.4.3,5.11-0.151.0.1:20101105T053751Z
  None -> pkg://solaris/system/header@0.5.11,5.11-0.151.0.1:20101105T002136Z

pkg 操作的 XML 记录存储在 /var/pkg/history 中,pkg history 命令使用它编写输出。pkg purge-history 命令会清除这些记录,因此请谨慎使用,因为此历史记录在故障排除时可能非常重要。

如何使用更新历史记录进行故障排除?

假设您休息了一天,返回时,用户报告服务器有问题。首先可能要做的就是检查系统的程序包历史记录,看看有什么安装或更新。假设历史记录指示另一个管理员在您离开的时候执行了一次程序包安装,以下历史记录节选中的第三行清楚地指出了这一点:

  2011-03-14T12:47:31 refresh-publishers        updatemanager   Succeeded
  2011-03-14T12:47:33 rebuild-image-catalogs    updatemanager   Succeeded
  2011-03-16T09:22:07 install                   pkg             Succeeded

如果进一步的调查确认此安装是问题的根本原因,则可能采取的一个纠正措施就是恢复到先前的一个 BE,直至可以解决问题。使用安装的时间戳,可以查找该安装日期之前的一个 BE 快照,并恢复到这个先前的快照:

  # beadm create -e SLIM@zfs-auto-snap_frequent-2011-03-15-06h59 BEpre317
  # beadm activate BEpre317
  # reboot

总结

总而言之,Oracle Solaris 11 Express 为帮助管理员应对人为错误(包括自己的错误)提供了新的方法。在桌面上,启用 Time Slider 服务和用户目录(或整个 /export/home 文件系统)的自动快照。在服务器上,始终坚持在执行更新之前创建一个新的 BE,并可以选择为当前 BE 设置定期快照。Oracle Solaris 11 Express 提供了内置安全措施,因此最佳的做法当然就是使用它们。

修订版 1.0,2011 年 5 月 6 日