Oracle Solaris ZFS 管理指南

迁移 ZFS 存储池

有时,可能需要在系统之间移动存储池。为此,必须将存储设备与原始系统断开,然后将其重新连接到目标系统。可以通过以下方法完成此任务:以物理方式重新为设备布线,或者使用多端口设备(如 SAN 中的设备)。使用 ZFS 可将池从一台计算机中导出,然后将其导入目标系统,即使这该系统采用不同的字节存储顺序 (endianness)。有关在不同存储池(可能驻留在不同的计算机上)之间复制或迁移文件系统的信息,请参见发送和接收 ZFS 数据

准备迁移 ZFS 存储池

应显式导出存储池,以表明可随时将其迁移。此操作会将任何未写入的数据刷新到磁盘,将数据写入磁盘以表明导出已完成,并从系统中删除有关池的所有信息。

如果不显式导出池,而是改为手动删除磁盘,则仍可以在其他系统中导入生成的池。但是,可能会丢失最后几秒的数据事务,并且由于设备不再存在,该池在原始系统中可能会显示为处于故障状态。缺省情况下,目标系统无法导入未显式导出的池。为防止意外导入包含仍在其他系统中使用的网络连接存储器的活动池,此条件是必要的。

导出 ZFS 存储池

要导出池,请使用 zpool export 命令。例如:


# zpool export tank

此命令将尝试取消挂载池中任何已挂载的文件系统,然后再继续执行。如果无法取消挂载任何文件系统,则可以使用 -f 选项强制取消挂载这些文件系统。例如:


# zpool export tank
cannot unmount '/export/home/eschrock': Device busy
# zpool export -f tank

执行此命令后,池 tank 在系统中即不再可见。

如果在导出时设备不可用,则无法将设备标识为正常导出。如果之后将某个这样的设备附加到不包含任何工作设备的系统中,则该设备的状态会显示为“可能处于活动状态”。

如果 ZFS 卷在池中处于使用状态,即使使用 -f 选项,也无法导出池。要导出包含 ZFS 卷的池,请首先确保卷的所有使用者都不再处于活动状态。

有关 ZFS 卷的更多信息,请参见ZFS 卷

确定要导入的可用存储池

从系统中删除池后(通过显式导出或通过强制删除设备),可以将设备附加到目标系统。ZFS 可以处理仅有其中一些设备可用的情况,但池迁移成功与否取决于设备的整体运行状况。此外,没有必要使用相同的设备名称附加设备。ZFS 可检测任何移动的或重命名的设备,并相应地调整配置。要搜索可用的池,请运行不带任何选项的 zpool import 命令。例如:


# zpool import
 pool: tank
    id: 11809215114195894163
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        tank        ONLINE
          mirror-0  ONLINE
            c1t0d0  ONLINE
            c1t1d0  ONLINE

在本示例中,池 tank 可用于在目标系统中导入。每个池都由一个名称以及唯一的数字标识符标识。如果有多个同名池可用于导入,则可以使用数字标识符对其进行区分。

zpool status 命令输出类似,zpool import 输出也会包括一个知识文章链接,其中包含有关禁止导入池这一问题的修复过程的最新信息。在此示例中,用户可以强制导入池。但是,如果导入当前正由其他系统通过存储网络使用的池,则可能导致数据损坏和出现紧急情况,因为这两个系统都尝试写入同一存储器。如果池中的某些设备不可用,但是存在足够的冗余数据可确保池可用,则池会显示 DEGRADED 状态。例如:


# zpool import
  pool: tank
    id: 11809215114195894163
 state: DEGRADED
status: One or more devices are missing from the system.
action: The pool can be imported despite missing or damaged devices.  The
        fault tolerance of the pool may be compromised if imported.
   see: http://www.sun.com/msg/ZFS-8000-2Q
config:

        NAME        STATE     READ WRITE CKSUM
        tank        DEGRADED     0     0     0
          mirror-0  DEGRADED     0     0     0
            c1t0d0  UNAVAIL      0     0     0  cannot open
            c1t3d0  ONLINE       0     0     0

在本示例中,第一个磁盘已损坏或缺失,但仍可以导入池,这是因为仍可以访问镜像数据。如果存在过多故障设备或缺失设备,则无法导入池。例如:


# zpool import
  pool: dozer
    id: 9784486589352144634
 state: FAULTED
action: The pool cannot be imported. Attach the missing
        devices and try again.
   see: http://www.sun.com/msg/ZFS-8000-6X
config:
        raidz1-0       FAULTED
          c1t0d0       ONLINE
          c1t1d0       FAULTED
          c1t2d0       ONLINE
          c1t3d0       FAULTED

在本示例中,RAID-Z 虚拟设备中缺少两个磁盘,这意味着没有足够的可用冗余数据来重新构建池。在某些情况下,没有足够的设备就无法确定完整的配置。在这种情况下,虽然 ZFS 会尽可能多地报告有关该情况的信息,但是 ZFS 无法确定池中包含的其他设备。例如:


# zpool import
pool: dozer
    id: 9784486589352144634
 state: FAULTED
status: One or more devices are missing from the system.
action: The pool cannot be imported. Attach the missing
        devices and try again.
   see: http://www.sun.com/msg/ZFS-8000-6X
config:
        dozer          FAULTED   missing device
          raidz1-0     ONLINE
            c1t0d0     ONLINE
            c1t1d0     ONLINE
            c1t2d0     ONLINE
            c1t3d0     ONLINE
Additional devices are known to be part of this pool, though their
exact configuration cannot be determined.

从替换目录导入 ZFS 存储池

缺省情况下,zpool import 命令仅在 /dev/dsk 目录中搜索设备。如果设备存在于其他目录中,或者使用的是文件支持的池,则必须使用 -d 选项搜索其他目录。例如:


# zpool create dozer mirror /file/a /file/b
# zpool export dozer
# zpool import -d /file
  pool: dozer
    id: 7318163511366751416
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        dozer        ONLINE
          mirror-0   ONLINE
            /file/a  ONLINE
            /file/b  ONLINE
# zpool import -d /file dozer

如果设备存在于多个目录中,则可以指定多个 -d 选项。

导入 ZFS 存储池

确定要导入的池后,即可通过将该池的名称或者其数字标识符指定为 zpool import 命令的参数来将其导入。例如:


# zpool import tank

如果多个可用池具有相同名称,则必须使用数字标识符指定要导入的池。例如:


# zpool import
  pool: dozer
    id: 2704475622193776801
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        dozer       ONLINE
          c1t9d0    ONLINE

  pool: dozer
    id: 6223921996155991199
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        dozer       ONLINE
          c1t8d0    ONLINE
# zpool import dozer
cannot import 'dozer': more than one matching pool
import by numeric ID instead
# zpool import 6223921996155991199

如果该池的名称与现有的池名称冲突,则可以使用其他名称导入该池。例如:


# zpool import dozer zeepool

此命令使用新名称 zeepool 导入已导出的池 dozer

如果池未正常导出,则 ZFS 需要使用 -f 标志,以防止用户意外导入仍在其他系统中使用的池。例如:


# zpool import dozer
cannot import 'dozer': pool may be in use on another system
use '-f' to import anyway
# zpool import -f dozer

注 –

请勿尝试将一个系统上处于活动状态的池导入到另一个系统。ZFS 不是本机簇、分布式或平行文件系统,不能从多个不同主机进行并发访问。


也可以使用 -R 选项在备用根下导入池。有关备用根池的更多信息,请参见使用 ZFS 备用根池

恢复已销毁的 ZFS 存储池

可以使用 zpool import -D 命令恢复已销毁的存储池。例如:


# zpool destroy tank
# zpool import -D
  pool: tank
    id: 5154272182900538157
 state: ONLINE (DESTROYED)
action: The pool can be imported using its name or numeric identifier.
config:

        tank        ONLINE
          mirror-0  ONLINE
            c1t0d0  ONLINE
            c1t1d0  ONLINE

在此 zpool import 输出中,由于包含以下状态信息,因此可以将池 tank 确定为已销毁的池:


state: ONLINE (DESTROYED)

要恢复已销毁的池,请再次执行 zpool import -D 命令,并指定要恢复的池。例如:


# zpool import -D tank
# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE
          mirror-0  ONLINE
            c1t0d0  ONLINE
            c1t1d0  ONLINE

errors: No known data errors

如果已销毁池中的某个设备出现故障或不可用,通过添加 -f 选项也许能够恢复已销毁的池。在此情况下,请导入已降级的池,然后尝试修复设备故障。例如:


# zpool destroy dozer
# zpool import -D
pool: dozer
    id: 13643595538644303788
 state: DEGRADED (DESTROYED)
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
config:

        NAME         STATE     READ WRITE CKSUM
        dozer        DEGRADED     0     0     0
          raidz2-0   DEGRADED     0     0     0
            c2t8d0   ONLINE       0     0     0
            c2t9d0   ONLINE       0     0     0
            c2t10d0  ONLINE       0     0     0
            c2t11d0  UNAVAIL      0    35     1  cannot open
            c2t12d0  ONLINE       0     0     0

errors: No known data errors
# zpool import -Df dozer
# zpool status -x
  pool: dozer
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scrub: scrub completed after 0h0m with 0 errors on Thu Jan 21 15:38:48 2010
config:

        NAME         STATE     READ WRITE CKSUM
        dozer        DEGRADED     0     0     0
          raidz2-0   DEGRADED     0     0     0
            c2t8d0   ONLINE       0     0     0
            c2t9d0   ONLINE       0     0     0
            c2t10d0  ONLINE       0     0     0
            c2t11d0  UNAVAIL      0    37     0  cannot open
            c2t12d0  ONLINE       0     0     0

errors: No known data errors
# zpool online dozer c2t11d0
Bringing device c2t11d0 online
# zpool status -x
all pools are healthy