如何在 Oracle Solaris 11 中执行系统存档和恢复过程

2011 年 11 月

作者:Jesse Butler

如何创建可用于备份并在稍后恢复已安装和配置的 Oracle Solaris 11 主机的 ZFS 存档。


本文所提供的步骤可构成基本灾难恢复计划的核心,也可用于将系统服务迁移到新的引导设备或相同模型但完全不同的系统。注意,不支持将已安装的软件迁移到不同模型的系统。

如果想要下载软件、加入论坛、阅读类似本文的内容之外的其他技术方法精品文章,请成为 OTN 成员。无垃圾邮件!

过程概述

为根池及其关联的数据集以及任何应迁移或恢复的其他 ZFS 池(如存储重要第三方软件或本地用户帐户数据的池)创建一个 ZFS 存档。

要备份和恢复整个系统,应对所有 ZFS 池及其数据集进行存档,如 Oracle Solaris 管理:ZFS 文件系统 指南中所述,同时应对节点所提供服务所需的所有其他非根文件系统或数据进行存档。这可确保所有配置详细信息、第三方软件和其他节点特定的元素(如本地用户帐户和数据)都将在恢复系统上恢复,且恢复到功能齐备的服务状态。本文重点介绍根池。

创建存档之后,可以将其保存在本地可移动介质(如 USB 驱动器)上,也可以通过网络将其发送到文件服务器,以便稍后从该服务器进行检索。当需要利用存档时,可按照以下过程操作:

  • 从 Oracle Solaris 11 安装介质引导恢复系统,启动具有超级用户权限的 shell。
  • 选择和配置启动磁盘设备并创建新的 ZFS 根池。
  • 将存档的 ZFS 数据集恢复到新池。
  • 执行最终配置,然后重新启动系统。

要求和注意事项

任何运行 Oracle Solaris 11 的主机都可以成为此过程的候选者。对于要恢复到新磁盘或系统的系统存档,必须满足以下要求:

  • 存档的系统和恢复系统必须是同一模型且必须满足 Oracle Solaris 11 的最低要求。
  • 将容纳新 ZFS 池的磁盘的总容量至少必须与存档池中分配的空间相同(下面将提供更多详细信息)。
  • 存档系统和恢复系统上都需要根访问权限。

注意,存档将包含位于所存档 ZFS 数据集中的所有软件和配置信息。这包括但不限于以下信息:

  • 操作系统及相关配置和调优
  • 所有引导环境 (BE) 和先前的 ZFS 快照
  • 网络配置,包括主机名、路由信息和名称服务配置
  • 所有本地安装的软件及本地存储的相关数据
  • 本地配置的用户帐户及本地用户数据
  • 区域及相关配置数据

这意味着大多数情况下,在完成以下概述的步骤之后,不需要其他配置操作。

存档映像中不包含任何硬件特定的配置数据。如果要使用此过程移动到相同模型的全新系统,不会随备份一起转移的特定于硬件的系统特征包括(但不限于)以下内容:

  • 磁盘容量和配置(包括 ZFS 池配置)
  • 内存容量和配置
  • 硬件以太网地址
  • 已安装的硬件外围设备

对于已安装的硬件外围设备,应特别注意,如果要恢复的系统利用直接连接的外部存储或特殊的网络硬件(如光纤通道或 InfiniBand 适配器),则需要在恢复系统上安装这些设备以访问该存储。

第 1 阶段:创建存档

本部分介绍需要做的准备工作以及如何创建存档。

准备

要准备恢复,需要记下要存档的每个池的磁盘拓扑结构和 ZFS 池配置。同样,在本文中将重点介绍根池。需要对恢复系统上的目标磁盘进行类似的配置,并且需要相应调整新 ZFS 池的大小。为每个池分配的大小(以下所示的 zpool list 输出中的 ALLOC 列)至少需要确保有充足的空间来还原恢复系统上的数据集。

# zpool list
NAME      SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool      68G  51.6G  16.4G  75%  1.00x  ONLINE  -

如果有任何池的容量(如 CAP 列所示)超过 80%,最佳实践表明应扩大该池以规划容量。根据其他配置元素和工作量的不同,增加池中的空间余量还有益于性能。有关如何管理 ZFS 文件系统及相关性能的更多信息,请参阅 Oracle Solaris 管理:ZFS 文件系统

为准备稍后的恢复,各种命令的输出应保存到一个文件,与存档一起保存以便恢复期间参考。清单 1 中所示命令只是最低建议,根据系统配置的不同,其他配置信息也可能有用。清单 1 中所示命令及示例输出仅针对根池 (rpool)。

清单 1:应保存其输出的命令
# zpool list
NAME      SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool      68G  51.6G  16.4G  75%  1.00x  ONLINE  -

# zpool get all rpool
NAME   PROPERTY       VALUE                 SOURCE
rpool  size           68G                   -
rpool  capacity       75%                   -
rpool  altroot        -                     default
rpool  health         ONLINE                -
rpool  guid           18397928369184079239  -
rpool  version        33                    default
rpool  bootfs         rpool/ROOT/snv_175a   local
rpool  delegation     on                    default
rpool  autoreplace    off                   default
rpool  cachefile      -                     default
rpool  failmode       wait                  default
rpool  listsnapshots  off                   default
rpool  autoexpand     off                   default
rpool  dedupditto     0                     default
rpool  dedupratio     1.00x                 -
rpool  free           16.4G                 -
rpool  allocated      51.6G                 -
rpool  readonly       off                   -

# zpool status
  pool: rpool
 state: ONLINE
  scan: none requested
config:

	        NAME        STATE     READ WRITE CKSUM
        	rpool       ONLINE       0     0     0
         	c5t0d0s0    ONLINE       0     0     0

errors: No known data errors

# format c5t0d0s0
selecting c5t0d0s0
[disk formatted]
/dev/dsk/c5t0d0s0 is part of active ZFS pool rpool. Please see zpool(1M).


FORMAT MENU:
	        disk       - select a disk
	        type       - select (define) a disk type
	        partition  - select (define) a partition table
	        current    - describe the current disk
	        format     - format and analyze the disk
	        repair     - repair a defective sector
	        label      - write label to the disk
	        analyze    - surface analysis
	        defect     - defect list management
	        backup     - search for backup labels
	        verify     - read and display labels
	        save       - save new disk/partition definitions
	        inquiry    - show disk ID
	        volname    - set 8-character volume name
	        !<cmd>     - execute <cmd>, then return
	        quit
format> p
	
PARTITION MENU:
	        0      - change `0' partition
	        1      - change `1' partition
	        2      - change `2' partition
	        3      - change `3' partition
	        4      - change `4' partition
	        5      - change `5' partition
	        6      - change `6' partition
	        7      - change `7' partition
	        select - select a predefined table
	        modify - modify a predefined partition table
	        name   - name the current table
	        print  - display the current table
	        label  - write partition map and label to the disk
	        !<cmd> - execute <cmd>, then return
	        quit
partition> p	
Current partition table (original):
Total disk cylinders available: 14087 + 2 (reserved cylinders)
	
	Part      Tag    Flag     Cylinders         Size            Blocks
	  0       root    wm       1 - 14086       68.35GB    (14086/0/0) 143339136
	  1 unassigned    wm       0                0         (0/0/0)             0
	  2     backup    wu       0 - 14086       68.35GB    (14087/0/0) 143349312
	  3 unassigned    wm       0                0         (0/0/0)             0
	  4 unassigned    wm       0                0         (0/0/0)             0
	  5 unassigned    wm       0                0         (0/0/0)             0
	  6 unassigned    wm       0                0         (0/0/0)             0
	  7 unassigned    wm       0                0         (0/0/0)             0
	
partition> ^D
#

上述被存档系统的信息以及恢复期间可能有用的任何其他信息均应放在一个文件中,该文件与存档文件一起保存以便稍后在恢复期间使用。

也可以使用 Oracle Explorer Data Collector 收集所有系统配置信息以供稍后参考。Oracle Explorer Data Collector 及相关文档可在 My Oracle Support(需要支持合同和登录)中找到。

有关 ZFS 管理和容量规划的其他信息,请参阅 Oracle Solaris 管理:ZFS 文件系统

创建存档

要对根池进行存档并包括所有快照和 BE,可创建一个 ZFS 复制流。首先,必须从池的顶级创建一个递归快照。同样,可以对需要存档并传给恢复主机的其他池进行存档。

注意,rpool 是默认的根池名称,但在任何给定系统上根池可能有不同的名称。如果要对所有池和数据集进行存档,这不是很重要。然而,如果只需要备份根文件系统或者只需要备份选定的一组 BE,且不清楚它们驻留在哪个池上,可以使用 beadm list -d 命令来确定。此后,使用默认名称 rpool 来引用根池。

以下命令创建根池的一个名为 archive 的递归快照。还可以基于您需要的日期或您期望的任何其他描述性标签选择快照名称。

# zfs snapshot -r rpool@archive

现在已创建递归快照,但应从中删除交换和转储设备快照,因为它们可能不包含与系统迁移或恢复相关的任何数据。而且,删除它们通常会显著降低存档的大小。

以下命令将删除默认命名的交换和转储设备快照,虽然主机上可能部署了其他快照。

:关于转储设备,尽管转储设备也有可能有数据尚未提取到 /var 数据集(以核心存档的形式),但可能性不大。如果是这种情况,就应保存转储设备的内容,应在删除转储设备快照之前将内容转储到文件系统。详情参见 dumpadm(1M)。

# zfs destroy rpool/swap@archive
# zfs destroy rpool/dump@archive

要确定是否存在默认命名设备之外的其他设备,可使用 swap(1m) 和 dumpadm(1m) 分别列出交换和转储设备的名称。

现在快照准备好了。下一步是将其发送到文件进行存档。如果要存档多个 ZFS 池,每个池将有一个快照,且每个快照将发送到自己的存档文件。同样,在本示例中,以下步骤重点放在创建根池的存档。不过,可用同样的方式对系统上的任何其他池进行存档。

ZFS send 命令以管道方式输出到 gzip 命令,结果产生一个压缩文件,其中包含池快照的存档。创建此存档文件时,使用某个有助于稍后确定存档内容的反映主机名、日期或其他描述性术语的唯一命名方案是一个好主意。

存档文件可以本地保存以便稍后进行重定位,也可以创建在可移动介质上。注意,尽管使用了压缩,本地或文件服务器上仍应有足够的存储空间供存档使用。一个好的经验是有足够的空间容纳 zpool list 报告的 ALLOC 量的总和。

要在本地创建存档文件,可使用以下命令。恢复映像文件名可以是任何有助于识别此存档以便稍后使用的字符串。例如,通常选择使用主机名加日期。

# zfs send -Rv rpool@archive | gzip > /path/to/archive_$(hostname)_$(date +%Y%m%d).zfs.gz

现在应将该存档文件移动到文件服务器以便稍后检索。

还可以选择将存档文件直接写入挂载 NFS 的路径,如下所示。

# zfs send -Rv rpool@archive | gzip > /net/FILESERVER/path/to/archive_$(hostname)_$(date +%Y%m%d).zfs.gz

类似地,可以使用 ssh 以流方式将存档文件发送到文件服务器。

# zfs send -Rv rpool@archive | gzip | ssh USER@FILESEVER "cat> /path/to/archive_$(hostname)_$(date +%Y%m%d).zfs.gz"

注意,使用这最后一个选项通过网络以流方式传送存档时,ssh 传输不支持任何暂停和恢复功能。因此,如果网络连接中断,需要重新启动整个命令。

强烈建议在备份的文件系统上存储存档文件。

注意,恢复存档已创建,现在可以删除本地快照了。

# zfs destroy -r rpool@archive

第 2 阶段:从存档恢复

系统引导

只要需要执行系统恢复或系统迁移操作,就可以开始恢复阶段。

首先,需要从 Oracle Solaris 11 安装介质引导恢复系统。用于引导恢复系统的安装介质应与用于构建存档的 Oracle Solaris 11 的版本相同。例如,如果存档是在 Oracle Solaris 11 11/11 主机上创建的,则在此阶段应使用 Oracle Solaris 11 11/11 安装介质。可以从 DVD、USB 设备或网络引导恢复系统。注意,不是从此介质安装系统,相反,此介质仅用于引导系统。引导之后,将在可以开始恢复过程的位置启动 shell。

要从 DVD 或 USB 安装介质引导,请插入介质并选择相应的设备作为引导设备。使用 LiveCD,GNOME 桌面会话可用于恢复过程;一旦桌面启动,可启动一个终端窗口来执行此过程的其余部分。如果使用基于文本的介质,可选择在 Text Installer 菜单出现时退出 shell。

Oracle Solaris 自动安装程序 (AI) 或 AI 介质的本地副本也可以用于引导系统。在 x86 主机上,选择“Text Installer and command line”GRUB 菜单项将运行 Text Installer,可从菜单中选择一个 shell。

类似地,在 SPARC 主机上,引导 AI 介质(从本地或通过网络)而不启动自动安装将允许您从 Text Installer 菜单选择 shell。这可以通过在 SPARC 计算机上的引导提示符处调用以下引导命令来完成:

{0} ok boot net:dhcp

有关如何在 Oracle Solaris 11 中引导系统的更多信息,请参阅系统管理指南:基本管理 中的 x86SPARC 引导信息。

引导设备和根池准备

第一步是配置新的引导磁盘设备。有关如何管理磁盘设备、如何确定引导设备以及如何更改默认引导设备(如有必要),请参阅 Oracle Solaris 管理:设备和文件系统 指南以及系统管理指南:基本管理 中的 x86SPARC 引导信息。

注意,如前面所引用的,可复制原来的磁盘布局,也可以使用不同的磁盘布局,只要采取以下步骤并将磁盘开始部分的空间预留给引导数据。此外,根池(或其他恢复目标池)不必与原始池大小相同。不过,新池的大小必须足以包含各自存档文件中的所有数据(即与 zpool list 输出中的 ALLOC 部分大小相等,如前所述)。

一旦选择了引导设备,就可以根据需要基于存档系统上的初始磁盘配置对其进行配置。在此重申,所要求的是最终所创建的 ZFS 池的大小应足以存储数据集,也就是 zpool list 的输出中所显示的 ALLOC 的数值。

format(1M) 命令用于根据需要配置磁盘分区和/或分片。对于引导设备,应使用 VTOC 标签,默认配置为起始于柱 1 的全设备分片 0。作为创建存档的一部分保存的文件可以提供关于如何最好地配置引导设备的指导。

首先从 format 实用程序的菜单选择所需的引导设备,如清单 2 所示。

清单 2:选择引导设备
# format
Searching for disks...done

c3t3d0: configured with capacity of 68.35GB


AVAILABLE DISK SELECTIONS:
      0. c3t2d0 <SEAGATE-ST973401LSUN72G-0556 cyl 8921 alt 2 hd 255 sec 63>
         /pci@0,0/pci1022,7450@2/pci1000,3060@3/sd@2,0
      1. c3t3d0 <FUJITSU-MAY2073RCSUN72G-0401 cyl 14087 alt 2 hd 24 sec 424>
         /pci@0,0/pci1022,7450@2/pci1000,3060@3/sd@3,0
Specify disk (enter its number): 1
selecting c3t3d0
[disk formatted]

选择磁盘后,在 x86 系统上,可能需要创建一个 fdisk 分区。

format> fdisk
No fdisk table exists. The default partition for the disk is:

 a 100% "SOLARIS System" partition

Type "y" to accept the default partition,  otherwise type "n" to edit the
partition table.
y
format>

完成之后,可以根据需要配置分片。清单 3 显示设置全容量(或“全力”)分片 0 的示例,这是默认配置。该分片从柱 1 开始,以便在磁盘开头部分为引导软件留出空间。注意,根据系统架构、磁盘几何及其他变量,分区表可能略有不同。

清单 3:设置全容量分片的示例
format> partition
partition> print
Current partition table (default):
Total disk cylinders available: 8921 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
 0 unassigned    wm       0               0         (0/0/0)            0
 1 unassigned    wm       0               0         (0/0/0)            0
 2     backup    wu       0 - 8920       68.34GB    (8921/0/0) 143315865
 3 unassigned    wm       0               0         (0/0/0)            0
 4 unassigned    wm       0               0         (0/0/0)            0
 5 unassigned    wm       0               0         (0/0/0)            0
 6 unassigned    wm       0               0         (0/0/0)            0
 7 unassigned    wm       0               0         (0/0/0)            0
 8       boot    wu       0 -    0        7.84MB    (1/0/0)        16065
 9 unassigned    wm       0               0         (0/0/0)            0

partition> 0
Part      Tag    Flag     Cylinders        Size            Blocks
 0 unassigned    wm       0               0         (0/0/0)            0

Enter partition id tag[unassigned]: root
Enter partition permission flags[wm]: 
Enter new starting cyl[1]: 1
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: $
partition>

根据需要配置分片之后,对磁盘进行标记,如清单 4 所示。然后应在进行下一步之前确认整体布局。

清单 4:标记磁盘
partition> label
Ready to label disk, continue? 
y
partition> print
Current partition table (unnamed):
Total disk cylinders available: 8921 + 2 (reserved cylinders)

	Part      Tag    Flag     Cylinders        Size            Blocks
	 0       root    wm       1 - 8920       68.33GB    (8920/0/0) 143299800
	 1 unassigned    wm       0               0         (0/0/0)            0
	 2     backup    wu       0 - 8920       68.34GB    (8921/0/0) 143315865
	 3 unassigned    wm       0               0         (0/0/0)            0
	 4 unassigned    wm       0               0         (0/0/0)            0
	 5 unassigned    wm       0               0         (0/0/0)            0
	 6 unassigned    wm       0               0         (0/0/0)            0
	 7 unassigned    wm       0               0         (0/0/0)            0
	 8       boot    wu       0 -    0        7.84MB    (1/0/0)        16065
	 9 unassigned    wm       0               0         (0/0/0)            0

partition> ^D

有关如何管理磁盘设备的更多信息,请参阅 Oracle Solaris 管理:设备和文件系统 指南。

ZFS 池创建和存档恢复

配置磁盘后,可以使用以下命令在分片 0 上创建新的根池:

# zpool create rpool cXtXdXs0

注意,如果存档的系统的根池未使用默认名称 rpool,在此应使用其实际名称。尽管使用不同名称的池也能成功完成恢复过程,但产生的 ZFS 文件系统可能会采取不同的挂载点,这可能会造成混乱。因此,应使用与存档 ZFS 池相同的名称创建恢复 ZFS 池。

此时还可以创建恢复存档所需的任何其他 ZFS 池。注意,如果系统上的某个现有池已经使用期望的名称,您需要另选其他名称。有关如何创建 ZFS 池的更多信息,请参阅 Oracle Solaris 管理:ZFS 文件系统 指南。

下一步是从存档文件恢复 ZFS 数据集。如果存档存储在可移动介质上,现在应连接和配置该介质以便可以访问其中的文件。有关如何配置可移动介质的更多信息,请参阅 Oracle Solaris 管理:设备和文件系统 指南。

一旦可以从本地访问存档文件,就可以使用以下命令恢复数据集。

# gzcat /path/to/archive_myhost_20111011.zfs.gz | zfs receive -vF rpool

如果存档文件存储在联网的文件服务器上,可以使用以下命令以流方式获取存档并恢复数据集。

# ssh USER@FILESERVER "cat /path/to/archive_myhost_20111011.zfs.gz" | gzip -d | zfs receive -vF rpool

如果该主机上存档了要恢复的其他池,此时可以使用与以上所示相同的 ZFS 操作恢复这些池。有关如何恢复 ZFS 数据集的其他信息,请参阅 Oracle Solaris 管理:ZFS 文件系统

本过程的数据恢复部分现已完成。现在必须执行最后几步来确保恢复系统将按照预期方式进行引导。

第 3 阶段:配置和验证

首先,必须创建要用于恢复后系统的交换和转储设备。注意,这里使用的是默认命名的设备,因此无需其他管理任务(例如,使用 swap(1m) 命令添加交换设备),因为这些设备已经在使用中并且配置成在引导时与该系统一起运行。如果目标系统的内存配置与存档的系统不同,交换和转储设备可能需要不同的大小,但名称仍与先前的配置相同,因此,这些设备在恢复系统首次引导时会被正确配置。

应按照 Oracle Solaris 管理:设备和文件系统Oracle Solaris 管理:ZFS 文件系统 指南中的建议调整交换和转储设备的大小,大体如下表所示。

表 1. 交换和转储设备的大小
物理内存交换大小转储大小
最多具有 4 GB 物理内存的系统1 GB2 GB
具有 4 GB 至 8 GB 物理内存的中等规模服务器2 GB4 GB
具有 16 GB 至 32 GB 物理内存的高端服务器4 GB8 GB+
具有超过 32 GB 物理内存的系统总内存大小的 1/4总内存大小的 1/2

注意,系统引导之后,如果需要,还可以添加其他交换设备。有关如何管理这些设备的更多信息,请参阅以上引用的文档。

要重新创建具有适当容量的交换和转储设备,请使用以下命令。注意,在本示例中,恢复系统安装了 8 GB 的内存。

# zfs create -b $(pagesize) -V 2GB rpool/swap
# zfs set primarycache=metadata rpool/swap
# zfs create -b 128k -V 4GB rpool/dump

接下来,必须使用 beadm(1M) 命令配置所需的 BE。beadm list 命令显示所有可用 BE 的列表。

# beadm list
BE        Active Mountpoint Space  Policy Created          
--        ------ ---------- -----  ------ -------          
solaris-2 -      -          2.02G  static 2011-09-23 10:00 
solaris   -      -          16.56M static 2011-09-22 21:51 

要使用所需 BE 的根文件系统,必须挂载它。为此,请使用 beadm mount,如下所示,它使用 solaris-2 BE 作为示例。

# beadm mount solaris-2 /tmp/mnt

现在可以通过 /tmp/mnt 挂载点来访问 BE 的根文件系统。第一步是安装引导软件,这使得主机引导新的根池。根据架构的不同,步骤略有不同,如下所示。这两个示例均使用 /tmp/mnt BE 挂载点,如上所示。

在基于 x86 的主机上:

# installgrub /tmp/mnt/boot/grub/stage1 /tmp/mnt/boot/grub/stage2 /dev/rdsk/cXtXdXs0

在基于 SPARC 的主机上:

# installboot -F zfs /tmp/mnt/usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/cXtXdXs2

在新系统上,有可能未使用相同的设备,或者使用了相同的设备但配置方式不同。因此,使用以下命令清除设备文件系统。

# devfsadm -Cn -r /tmp/mnt

现在将指示系统在首次引导时执行重新配置引导。这将配置任何新的设备硬件(存档系统与恢复系统相比较)。通过将一个名为 reconfigure 的文件置于 BE 根文件系统的顶层来强制执行重新配置引导。此功能不是永久性的,因为该文件会被删除,因此重新配置仅发生在放置该文件后的第一次引导时。

要建立重新配置引导,请在活动的 BE 挂载文件系统中创建此文件。然后可以使用 beadm unmount 命令卸载文件系统。

# touch /tmp/mnt/reconfigure
# beadm unmount solaris-2

最后,需要使用 beadm activate 命令激活所需的 BE。

# beadm activate solaris-2

一旦激活,beadm list 输出中 BE 的 Active 列将显示 R,表示在重新启动时处于活动状态。这可以通过再次调用 beadm list 来确认。有关 BE 管理的其他信息,请参阅创建和管理 Oracle Solaris 引导环境

现在可以重新引导系统。除了任何物理拓扑结构、外围设备更改和其他硬件相关更改之外,该系统应与存档系统一样。软件配置和数据以及恢复的任何辅助 ZFS 池应由存档系统继承而来,如上所述。应检查和验证网络配置。如果系统是在新网络上恢复的,或者自创建存档之后与网络有关的配置元素发生了更改,则可能需要某些修改。有关配置的更多信息,请参阅 Oracle Solaris 管理指南

总结

本文演示了可存档和恢复已安装和配置的 Oracle Solaris 11 主机的一组过程。这些过程可用作整个灾难恢复计划的组成部分,也可用于将 Oracle Solaris 11 系统上托管的业务服务迁移到另一个引导设备或相同模型的完全不同的系统。

更多信息

下面是其他一些资源:

修订版 1.0,2011 年 11 月 4 日