Oracle Solaris ZFS 管理指南

恢复 ZFS 根池或根池快照

以下各节描述了如何执行下列任务:

Procedure如何替换 ZFS 根池中的磁盘

由于以下原因,您可能需要替换根池中的磁盘:

在镜像根池配置中,您可以尝试替换磁盘而不必从备用介质引导。可以使用 zpool replace 命令替换发生故障的磁盘。或者,如果有额外的磁盘,可以使用 zpool attach 命令。有关附加额外磁盘和分离根池磁盘的示例,请参见本节中的过程。

有些硬件要求您在尝试通过 zpool replace 操作替换故障磁盘之前使磁盘脱机并取消其配置。例如:


# zpool offline rpool c1t0d0s0
# cfgadm -c unconfigure c1::dsk/c1t0d0
<Physically remove failed disk c1t0d0>
<Physically insert replacement disk c1t0d0>
# cfgadm -c configure c1::dsk/c1t0d0
# zpool replace rpool c1t0d0s0
# zpool online rpool c1t0d0s0
# zpool status rpool
<Let disk resilver before installing the boot blocks>
SPARC# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t0d0s0
x86# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t9d0s0

对于一些硬件,插入替代磁盘后不必使其联机并进行配置。

必须标识当前磁盘和新磁盘的引导设备路径名,以便从替换磁盘测试引导,而且如有必要,在替换磁盘发生故障时也可手动从现有磁盘引导。在以下过程的示例中,当前根池磁盘 (c1t10d0s0) 的路径名为:


/pci@8,700000/pci@3/scsi@5/sd@a,0

替换引导磁盘 c1t9d0s0 的路径名为:


/pci@8,700000/pci@3/scsi@5/sd@9,0
  1. 物理连接替换磁盘或新磁盘。

  2. 确认新磁盘具有 SMI 标签和分片 0。

    有关对要用于根池的磁盘进行重新标记的信息,请参见以下站点:

    http://www.solarisinternals.com/wiki/index.php/ZFS_Troubleshooting_Guide

  3. 将新磁盘连接到根池。

    例如:


    # zpool attach rpool c1t10d0s0 c1t9d0s0
    
  4. 确认根池状态。

    例如:


    # zpool status rpool
      pool: rpool
     state: ONLINE
    status: One or more devices is currently being resilvered.  The pool will
            continue to function, possibly in a degraded state.
    action: Wait for the resilver to complete.
     scrub: resilver in progress, 25.47% done, 0h4m to go
    config:
    
            NAME           STATE     READ WRITE CKSUM
            rpool          ONLINE       0     0     0
              mirror-0     ONLINE       0     0     0
                c1t10d0s0  ONLINE       0     0     0
                c1t9d0s0   ONLINE       0     0     0
    
    errors: No known data errors
  5. 完成重新同步后,将引导块应用到新磁盘。

    使用类似以下的语法:

    • SPARC:


      # installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t9d0s0
      
    • x86:


      # installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t9d0s0
      
  6. 验证您是否可以从新磁盘引导。

    例如,在基于 SPARC 的系统上,应使用类似以下的语法:


    ok boot /pci@8,700000/pci@3/scsi@5/sd@9,0
    
  7. 如果系统从新磁盘引导,则分离旧磁盘。

    例如:


    # zpool detach rpool c1t10d0s0
    
  8. 通过使用 SPARC 引导 PROM 中的 eeprom 命令和 setenv 命令,将系统设置为从新磁盘自动引导,或重新配置 PC BIOS。

Procedure如何创建根池快照

可以创建根池快照以便进行恢复。创建根池快照的最好方法是对根池执行递归快照。

下面的过程将创建递归根池快照,并将快照以文件的形式存储到远程系统上的池中。如果根池失败,可以使用 NFS 挂载远程数据集,快照文件可以放入重新创建的池中。或者,您也可以将根池快照以实际快照的形式存储到远程系统上的池中。从远程系统发送和接收快照比较复杂,因为在从 Solaris OS miniroot 引导要修复的系统时,您必须配置 ssh 或使用 rsh

有关远程存储和恢复根池快照的信息和有关根池恢复的最新信息,请访问以下站点:

http://www.solarisinternals.com/wiki/index.php/ZFS_Troubleshooting_Guide

在根池恢复中,以文件或快照形式验证远程存储的快照是一个重要步骤。无论何种方法,都应按照常规重新创建快照,例如在池配置更改或 Solaris OS 升级时。

在以下过程中,系统从 zfsBE 引导环境引导。

  1. 在远程系统上创建池和文件系统以存储快照。

    例如:


    remote# zfs create rpool/snaps
    
  2. 与本地系统共享文件系统。

    例如:


    remote# zfs set sharenfs='rw=local-system,root=local-system' rpool/snaps
    # share
    -@rpool/snaps   /rpool/snaps   sec=sys,rw=local-system,root=local-system   "" 
  3. 创建根池的递归快照。


    local# zfs snapshot -r rpool@0804
    local# zfs list
    NAME                        USED  AVAIL  REFER  MOUNTPOINT
    rpool                      6.17G  60.8G    98K  /rpool
    rpool@0804                     0      -    98K  -
    rpool/ROOT                 4.67G  60.8G    21K  /rpool/ROOT
    rpool/ROOT@0804                0      -    21K  -
    rpool/ROOT/zfsBE           4.67G  60.8G  4.67G  /
    rpool/ROOT/zfsBE@0804       386K      -  4.67G  -
    rpool/dump                 1.00G  60.8G  1.00G  -
    rpool/dump@0804                0      -  1.00G  -
    rpool/swap                  517M  61.3G    16K  -
    rpool/swap@0804                0      -    16K  -
  4. 将根池快照发送到远程系统。

    例如:


    local# zfs send -Rv rpool@0804 > /net/remote-system/rpool/snaps/rpool.0804
    sending from @ to rpool@0804
    sending from @ to rpool/swap@0804
    sending from @ to rpool/ROOT@0804
    sending from @ to rpool/ROOT/zfsBE@0804
    sending from @ to rpool/dump@0804

Procedure如何重新创建 ZFS 根池和恢复根池快照

在此过程中,假设下列条件存在:

在本地系统上执行所有步骤。

  1. 从 CD/DVD 或网络引导。

    • SPARC:选择以下引导方法之一:


      ok boot net -s
      ok boot cdrom -s
      

      如果您未使用 -s 选项,则需要退出安装程序。

    • x86:选择用于从 DVD 或网络进行引导的选项。然后,退出安装程序。

  2. 挂载远程快照数据集。

    例如:


    # mount -F nfs remote-system:/rpool/snaps /mnt
    

    如果您尚未配置网络服务,则可能需要指定 remote-system 的 IP 地址。

  3. 如果根池磁盘被替换,并且不包含 ZFS 可用的磁盘标号,则必须对磁盘重新进行标号。

    有关对磁盘进行重新标号的更多信息,请访问以下站点:

    http://www.solarisinternals.com/wiki/index.php/ZFS_Troubleshooting_Guide

  4. 重新创建根池。

    例如:


    # zpool create -f -o failmode=continue -R /a -m legacy -o cachefile=
    /etc/zfs/zpool.cache rpool c1t1d0s0
    
  5. 恢复根池快照。

    此步骤可能会花费一些时间。例如:


    # cat /mnt/rpool.0804 | zfs receive -Fdu rpool
    

    使用 -u 选项表示 zfs receive 操作完成时不挂载恢复的归档文件。

  6. 验证根池数据集是否已恢复。

    例如:


    # zfs list
    NAME                        USED  AVAIL  REFER  MOUNTPOINT
    rpool                      6.17G  60.8G    98K  /a/rpool
    rpool@0804                     0      -    98K  -
    rpool/ROOT                 4.67G  60.8G    21K  /legacy
    rpool/ROOT@0804                0      -    21K  -
    rpool/ROOT/zfsBE           4.67G  60.8G  4.67G  /a
    rpool/ROOT/zfsBE@0804       398K      -  4.67G  -
    rpool/dump                 1.00G  60.8G  1.00G  -
    rpool/dump@0804                0      -  1.00G  -
    rpool/swap                  517M  61.3G    16K  -
    rpool/swap@0804                0      -    16K  -
  7. 设置根池 BE 上的 bootfs 属性。

    例如:


    # zpool set bootfs=rpool/ROOT/zfsBE rpool
    
  8. 在新磁盘上安装引导块。

    SPARC:


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

    x86:


    # installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t1d0s0
    
  9. 重新引导系统。


    # init 6
    

Procedure如何从故障安全引导回滚根池快照

此过程假设现有根池快照可用。在本例中,本地系统提供这些根池快照。


# zfs snapshot -r rpool@0804
# zfs list
NAME                        USED  AVAIL  REFER  MOUNTPOINT
rpool                      6.17G  60.8G    98K  /rpool
rpool@0804                     0      -    98K  -
rpool/ROOT                 4.67G  60.8G    21K  /rpool/ROOT
rpool/ROOT@0804                0      -    21K  -
rpool/ROOT/zfsBE           4.67G  60.8G  4.67G  /
rpool/ROOT/zfsBE@0804       398K      -  4.67G  -
rpool/dump                 1.00G  60.8G  1.00G  -
rpool/dump@0804                0      -  1.00G  -
rpool/swap                  517M  61.3G    16K  -
rpool/swap@0804                0      -    16K  -
  1. 关闭系统并引导故障安全模式。


    ok boot -F failsafe
    ROOT/zfsBE was found on rpool.
    Do you wish to have it mounted read-write on /a? [y,n,?] y
    mounting rpool on /a
    
    Starting shell.
  2. 回滚各根池快照。


    # zfs rollback rpool@0804
    # zfs rollback rpool/ROOT@0804
    # zfs rollback rpool/ROOT/zfsBE@0804
    
  3. 重新引导至多用户模式。


    # init 6