19.3. zpool 管理

ZFS 管理主要用两个工具。zpool 工具来控制存储池运行并可智力磁盘的新增,移除更新与管理。zfs 工具用来建立,删除与管理文件系统(file systems)与磁盘卷 volumes 的数据集。

19.3.1. 创建与删除存储池

创建一个ZFS 存储池(zpool)要提前做好几个长远决定。因为存储池的结构建立以后无法再次更改。最重要的决定是哪一种vdev型号。

创建一个简单的存储池:

# zpool create mypool mirror /dev/ada1 /dev/ada2
# zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0
            ada2    ONLINE       0     0     0

errors: No known data errors

可以一次性创建多个vdev,磁盘组之间使用vdev类型关键字区分,在这个例子中用mirror

# zpool create mypool mirror /dev/ada1 /dev/ada2 mirror /dev/ada3 /dev/ada4
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0
            ada2    ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            ada3    ONLINE       0     0     0
            ada4    ONLINE       0     0     0

errors: No known data errors

存储池也可以不使用整个磁盘而改使用分区来建里。把 ZFS 放到不同的分区可让其他分区用于其他用途。尤其是有 Bootcode 与文件系统要用来开机的分区,这让磁盘可以用来开机也同样可以做为存储池的一部份。在 FreeBSD 用分区来替代整个磁盘并不会对性能有影响。使用分区也让管理者可以对磁盘容量做 少算的预备,使用比完整容量少的容量,未来若要替换的磁盘号称与原磁盘相同,但实际上却比较小时,也可符合这个较小的分区容量,以使用替换的磁盘。

用分区创建一个RAID-Z2 存储池:

# zpool create mypool raidz2 /dev/ada0p3 /dev/ada1p3 /dev/ada2p3 /dev/ada3p3 /dev/ada4p3 /dev/ada5p3
# zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0
            ada4p3  ONLINE       0     0     0
            ada5p3  ONLINE       0     0     0

errors: No known data errors

不需要的存储池可以删除以获得更多可用空间。删除一个存储池需要先卸载所有该存储池上的数据集。若数据集在使用中,卸载操作不会完成,存储池也不会被删除。可以使用 -f 选项来强制卸载数据集,但正在运行的应用程序可能会对数据集做出未定义的操作。

19.3.2. 添加和移除设备

添加磁盘到zpool中有两种情况:用 zpool attach 命令将磁盘加入一个现有的vdev中。只有部分 vdev types 允许在vdev建立之后加入磁盘。

由单一磁盘建立的存储池缺乏冗余备份功能,可以检测到数据损坏单无法修复,因为数据没有其他备份。备份(copies)属性可以让您从较小的故障(比如磁盘坏道)。单无法提供与镜像和 RAID-Z 同样级别的保护。由单一磁盘所建立的存储池可用 zpool attach 加入新设备,建里镜像。zpool attach 也可用来加入额外的磁盘到镜像群组以增加备份和读取速度。若使用的磁盘已有分区,可以复制给磁盘分区到另一个,使用 gpart backupgpart restore 可以让这个过程更简单。

加入 ada0p3 来升级单一磁盘串通(strip)vdev ada1p3 采用镜像型态:

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

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          ada0p3    ONLINE       0     0     0

errors: No known data errors
# zpool attach mypool ada0p3 ada1p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'mypool', you may need to update
boot code on newly attached disk 'ada1p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
# zpool status
  pool: mypool
 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.
  scan: resilver in progress since Fri May 30 08:19:19 2014
        527M scanned out of 781M at 47.9M/s, 0h0m to go
        527M resilvered, 67.53% done
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0  (resilvering)

errors: No known data errors
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 781M in 0h0m with 0 errors on Fri May 30 08:15:58 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors

若不想加入磁盘到现有的vdev,对RAID-Z来说,可选择另一种方式:加入到另一个vdev存储池。额外的vdev可以提供更好的性能,分散写入数据到vdev之间每个vdev成员负责自己的备份。也可以使用不同的vdev形态,但不建议这么做,例如混合使用mirrorRAID-Z加入到另一个无备份的vdev到一个含有mirror或RAID-Z vdev的存储池会让数据损坏的风险扩大整个存储池,由于分散写入数据,若在无备份的磁盘上发生故障的结果便是遗失大半写到存储池的数据。

在每个vdev 间的数据是串连的,例如,有两个mirror vdev,便跟 RAID 10 一样在两个mirror 间分散写入数据,且会做空间的分配,因此 vdev 会在同时达到全满100% 的用量。若 vdev 间的可用空间量不同则会影响到效能,因为数据量会不成比例的写入到使用量较少的 vdev。

当连接额外的设备到一个可以开机的存储池,要记得更新 Bootcode。

连接第二个mirror群组(ada2p3ada3p3)到现有的mirror:

# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 781M in 0h0m with 0 errors on Fri May 30 08:19:35 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors
# zpool add mypool mirror ada2p3 ada3p3
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
bootcode written to ada2
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
bootcode written to ada3
# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0

errors: No known data errors

现在已无法从存储上移除 vdev,且磁盘只能够在有足够剩余空间的情况下从 mirror 移除,若在 mirror 群组中只剩下一个磁盘,便会取消 mirror 然后还原为 stripe,若剩下的那个磁盘故障,便会影响到整个存储池。

从一个三方 mirror 群组移除一个磁盘:

# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0

errors: No known data errors
# zpool detach mypool ada2p3
# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors

19.3.3. 检擦存储池状态

存储池的状态很重要,若有磁盘机离线或侦测到读取、写入或校验码(Checksum)错误,对应的错误计数便会增加。 status 会显示存储池中每一个磁盘机的设定与状态及整个存储池的状态。需要处置的方式与有关最近清洁(Scrub)S的详细资讯也会一并显示。

# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub repaired 0 in 2h25m with 0 errors on Sat Sep 14 04:25:50 2013
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0
            ada4p3  ONLINE       0     0     0
            ada5p3  ONLINE       0     0     0

errors: No known data errors

19.3.4. 排除错误

当侦测到错误发生,读取、写入或校验码(Checksum)的计数便会增加。使用 zpool clear mypool 可以清除错误讯息及重置计数。清空错误状态对当存储发生错误要使用自动化 Script 通知的管理者来说会很重要,因在旧的错误尚未清除前不会回报后续的错误。

19.3.5. 更换正在运行的设备

可能有一些情况会需要更换磁盘为另一个磁盘,当要更换运作中的磁盘,此程序会维持旧有的磁盘在更换的过程为上线的状态,存储池不会进入降级(degraded)的状态,来减少数据遗失的风险。zpool replace 会复制所有旧磁盘的数据到新磁盘,操作完成之后旧磁盘便会与 vdev 中断连线。若新磁盘容量较旧磁盘大,也可以会增加存储池来使用新的空间,请参考 扩展存储池

更换存储池中正在运行的设备:

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

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors
# zpool replace mypool ada1p3 ada2p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'ada2p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
# zpool status
  pool: mypool
 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.
  scan: resilver in progress since Mon Jun  2 14:21:35 2014
        604M scanned out of 781M at 46.5M/s, 0h0m to go
        604M resilvered, 77.39% done
config:

        NAME             STATE     READ WRITE CKSUM
        mypool           ONLINE       0     0     0
          mirror-0       ONLINE       0     0     0
            ada0p3       ONLINE       0     0     0
            replacing-1  ONLINE       0     0     0
              ada1p3     ONLINE       0     0     0
              ada2p3     ONLINE       0     0     0  (resilvering)

errors: No known data errors
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 781M in 0h0m with 0 errors on Mon Jun  2 14:21:52 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0

errors: No known data errors

19.3.6. 处理故障设备

当存储池中的磁盘故障,该故障硬碟所属的 vdev 便会进入降级(Degraded)状态,所有的数据仍可使用,但性能可能会降低,因为遗失的数据必须从可用的备份数据计算才能取得。要将 vdev 恢复完整运作的状态必须更换故障的实体设备。然后 ZFS 便会开始修复(resilver,古代镜子的修复称 Resilver)作业,会从可用的备援数据计算出故障磁盘中的数据并写入到替换的设备上。完成后 vdev 便会重新返回上线(online)的状态。

若 vdev 没有任何备份数据或有多个设备故障,没有足够的备援数据可以补偿,存储便会进入故障(faulted)的状态。

更换故障的磁盘时,故障磁盘的名称会更换为设备的 GUID,若替换设备要使用相同的设备名称,则在 zpool replace 不须加上新设备名称参数。

使用 zpool replace 更换故障的磁盘:

# zpool status
  pool: mypool
 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://illumos.org/msg/ZFS-8000-2Q
  scan: none requested
config:

        NAME                    STATE     READ WRITE CKSUM
        mypool                  DEGRADED     0     0     0
          mirror-0              DEGRADED     0     0     0
            ada0p3              ONLINE       0     0     0
            316502962686821739  UNAVAIL      0     0     0  was /dev/ada1p3

errors: No known data errors
# zpool replace mypool 316502962686821739 ada2p3
# zpool status
  pool: mypool
 state: DEGRADED
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.
  scan: resilver in progress since Mon Jun  2 14:52:21 2014
        641M scanned out of 781M at 49.3M/s, 0h0m to go
        640M resilvered, 82.04% done
config:

        NAME                        STATE     READ WRITE CKSUM
        mypool                      DEGRADED     0     0     0
          mirror-0                  DEGRADED     0     0     0
            ada0p3                  ONLINE       0     0     0
            replacing-1             UNAVAIL      0     0     0
              15732067398082357289  UNAVAIL      0     0     0  was /dev/ada1p3/old
              ada2p3                ONLINE       0     0     0  (resilvering)

errors: No known data errors
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 781M in 0h0m with 0 errors on Mon Jun  2 14:52:38 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0

errors: No known data errors

19.3.7. 清理存储池

建议存储池要定期清理(scrubbed),最好是每一个月清洁一次。 scrub 操作对磁盘操作非常的密集,在执行时会降低磁盘的效能。在计划执行 scrub 时避免在使用高峰的时期,或使用 vfs.zfs.scrub_delay 来调整 scrub 的相对优先权来避免影响其他的工作。

# zpool scrub mypool
# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub in progress since Wed Feb 19 20:52:54 2014
        116G scanned out of 8.60T at 649M/s, 3h48m to go
        0 repaired, 1.32% done
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0
            ada4p3  ONLINE       0     0     0
            ada5p3  ONLINE       0     0     0

errors: No known data errors

如果需要取消清理操作,请执行 zpool scrub -smypool

19.3.8. 自我修复

校验码(Checksum)会随数据区块一并储存,这使得文件系统可以做到 自我修复。这个功能可以在校验码与存储池中的另一个设备不同时自动修复数据。举例来说,有两个磁盘做镜像 (Mirror),其中一个磁盘机开始失常并无法正常储存数据,甚至是数据放在长期封存的储存设备上,已经很久没有被存取。传统的文件系统需要执行演算法来检查并修复数据如 fsck(8),这些指令耗费时间,且在严重时需要管理者手动决定要做那一种修复操作。当 ZFS 侦测到数据区块的校验码不对时,它除了把数据交给需要的应用程序外,也会修正在磁盘上错误的数据。这件事不需要与系统管理者作任何互动便会在一般的存储池操作时完成。

接下来的例子会示范自我修复会如何运作。建立一个使用磁盘 /dev/ada0/dev/ada1 做镜像的存储池。

# zpool create healer mirror /dev/ada0 /dev/ada1
# zpool status healer
  pool: healer
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    healer      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
       ada0     ONLINE       0     0     0
       ada1     ONLINE       0     0     0

errors: No known data errors
# zpool list
NAME     SIZE  ALLOC   FREE   CKPOINT  EXPANDSZ   FRAG   CAP  DEDUP  HEALTH  ALTROOT
healer   960M  92.5K   960M         -         -     0%    0%  1.00x  ONLINE  -

将一些需要使用自我修复功能来保护的重要数据复制到该存储池,建立一个存储池的校验码以供日后比对。

# cp /some/important/data /healer
# zfs list
NAME     SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
healer   960M  67.7M   892M     7%  1.00x  ONLINE  -
# sha1 /healer > checksum.txt
# cat checksum.txt
SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f

写入随机的资料到镜像的第一个磁盘来模拟资料损毁的情况。要避免 ZFS 侦测到错误时马上做修复,接着要将存储池导出,待模拟资料损毁之后再导入。

警告:

这是一个危险的操作,会破坏重要的数据。在这里使用仅为了示范用,不应在存储池正常运作时尝试使用,也不应将这个故意损坏数据的例子用在任何其他的文件系统上,所以请勿使用任何不属于该存储池的其他磁盘设备名称并确定在执行指令前已对存储池做正确的备份!

# zpool export healer
# dd if=/dev/random of=/dev/ada1 bs=1m count=200
200+0 records in
200+0 records out
209715200 bytes transferred in 62.992162 secs (3329227 bytes/sec)
# zpool import healer

存储池的状态显示有一个设备发生了错误。注意,应用程序从存储池读取的资料中并没有任何的错误资料,ZFS 会自 ada0 设备提供有正确校验码的资料。结果里面 CKSUM 栏位含有非零值便是有错误校验码的设备。

# zpool status healer
    pool: healer
   state: ONLINE
  status: One or more devices has experienced an unrecoverable error.  An
          attempt was made to correct the error.  Applications are unaffected.
  action: Determine if the device needs to be replaced, and clear the errors
          using 'zpool clear' or replace the device with 'zpool replace'.
     see: http://illumos.org/msg/ZFS-8000-4J
    scan: none requested
  config:

      NAME        STATE     READ WRITE CKSUM
      healer      ONLINE       0     0     0
        mirror-0  ONLINE       0     0     0
         ada0     ONLINE       0     0     0
         ada1     ONLINE       0     0     1

errors: No known data errors

错误已经被检测到并且由未被影响的 ada0 镜像磁盘上的备份提供数据。可与原来的校验码做比较来看存储池是否已修复为一致。

# sha1 /healer >> checksum.txt
# cat checksum.txt
SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f
SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f

存储池在故意窜改数据前与后的两个校验码仍相符显示了 ZFS 在校验码不同时侦测与自动修正错误的能力。注意,这只在当存储池中有足够的备援时才可做到,由单一设备组成的存储池并没有自我修复的能力。这也是为什么在 ZFS 中校验码如此重要,任何原因都不该关闭。不需要 fsck(8) 或类似的文件系统一致性检查程序便能够侦测与修正问题,且存储存储池在发生问题时仍可正常运作。接着需要做清理操作来覆盖在 ada1 上的错误数据。

# zpool scrub healer
# zpool status healer
  pool: healer
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
            attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
            using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-4J
  scan: scrub in progress since Mon Dec 10 12:23:30 2012
        10.4M scanned out of 67.0M at 267K/s, 0h3m to go
        9.63M repaired, 15.56% done
config:

    NAME        STATE     READ WRITE CKSUM
    healer      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
       ada0     ONLINE       0     0     0
       ada1     ONLINE       0     0   627  (repairing)

errors: No known data errors

清洁作业会从 ada0 读取资料并重新写入任何在 ada1 上有错误校验码的资料。这个操作可以由 zpool status 的输出中呈现修复中(repairing) 的项目来辨识。这个作业完成后,存储池的状态会更改为:

# zpool status healer
  pool: healer
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
             using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-4J
  scan: scrub repaired 66.5M in 0h2m with 0 errors on Mon Dec 10 12:26:25 2012
config:

    NAME        STATE     READ WRITE CKSUM
    healer      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
       ada0     ONLINE       0     0     0
       ada1     ONLINE       0     0 2.72K

errors: No known data errors

清洁操作完成便同步了 ada0ada0 间的所有数据。执行 zpool clear 可以清除(cleared)存储池状态的错误讯息。

# zpool clear healer
# zpool status healer
  pool: healer
 state: ONLINE
  scan: scrub repaired 66.5M in 0h2m with 0 errors on Mon Dec 10 12:26:25 2012
config:

    NAME        STATE     READ WRITE CKSUM
    healer      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
       ada0     ONLINE       0     0     0
       ada1     ONLINE       0     0     0

errors: No known data errors

The pool is now back to a fully working state and all the errors have been cleared.

19.3.9. 扩增存储池

可用的备援存储池大小会受到每个 vdev 中容量最小的设备限制。最小的设备可以替换成较大的设备,在更换(Replace)或修复(Resilver)作业后,存储池可以成长到该新设备的可用容量。例如,要做一个 1 TB 磁盘机与一个 2 TB 磁盘机的镜像,可用的空间会是1 TB,当1 TB 磁盘机备更换成另一个 2 TB 的磁盘机时,修复程序会复制既有的资料到新的磁盘机,由于现在两个设备都有 2 TB 的容量,所以镜像的可用空间便会成长到 2 TB。

可以在每个设备用 zpool online -e 来触发扩充的动作,在扩充完所有设备后,存储池便可使用额外的空间。

19.3.10. 导入与导出存储池

存储池在移动到其他系统之前需要做导出(Export),会卸载所有的数据集,然后标记每个设备为已导出,为了避免被其他磁盘子系统存取,因此仍会锁定这些设备。这个动作让存储池可以在支持 ZFS 的其他机器、其他文件系统做导入(Import),甚至是不同的硬体架构(有一些注意事项,请参考 zpool(8))。当数据集有被开启的档案,可使用 zpool export -f 来强制导出存储池,使用这个指令需要小心,数据集是被强制卸载的,因此有可能造成在该数据集开启档案的应用程序发生无法预期的结果。

导出未使用的存储池:

# zpool export mypool

导入存储池会自动挂载数据集,若不想自动挂载,可以使用 zpool import -Nzpool import -o 可以设定在导入时暂时使用的属性。zpool import altroot= 允许导入时指定基础挂载点(Base mount point)来替换文件系统根目录。若存储池先前用在不同的系统且不正常导出,可能会需要使用 zpool import -f 来强制导入。zpool import -a 会导入所有没有被其他系统使用的存储池。

列出所有可导入的存储池:

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

        mypool      ONLINE
          ada2p3    ONLINE

使用替代的根目录导入存储池:

# zpool import -o altroot=/mnt mypool
# zfs list
zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
mypool               110K  47.0G    31K  /mnt/mypool

19.3.11. 升级存储池

在升级 FreeBSD 之后或存储池是由其他使用旧版 ZFS 的系统汇入,存储池可以手动升级到最新版本的 ZFS 来支持新的功能。在升级前请评估存储池是否还要在旧的系统做汇入,由于升级是一个单向的程序,旧的存储池可以升级,但有新功能的存储池无法降级。

升级一个 v28 的储存以支持功能旗标(Feature Flags):

# zpool status
  pool: mypool
 state: ONLINE
status: The pool is formatted using a legacy on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on software that does not support feat
        flags.
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
	    ada0    ONLINE       0     0     0
	    ada1    ONLINE       0     0     0

errors: No known data errors
# zpool upgrade
This system supports ZFS pool feature flags.

The following pools are formatted with legacy version numbers and can
be upgraded to use feature flags.  After being upgraded, these pools
will no longer be accessible by software that does not support feature
flags.

VER  POOL
---  ------------
28   mypool

Use 'zpool upgrade -v' for a list of available legacy versions.
Every feature flags pool has all supported features enabled.
# zpool upgrade mypool
This system supports ZFS pool feature flags.

Successfully upgraded 'mypool' from version 28 to feature flags.
Enabled the following features on 'mypool':
  async_destroy
  empty_bpobj
  lz4_compress
  multi_vdev_crash_dump

ZFS 的新功能在 zpool upgrade 尚未完成之前无法使用。可以用 zpool upgrade -v 来查看升级后有那些新功能,也同时会列出已经支持那些功能。

升级存储池支持新版的功能旗标(Feature flags):

# zpool status
  pool: mypool
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
        still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
        the pool may no longer be accessible by software that does not support
        the features. See zpool-features(7) for details.
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
	    ada0    ONLINE       0     0     0
	    ada1    ONLINE       0     0     0

errors: No known data errors
# zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.


Some supported features are not enabled on the following pools. Once a
feature is enabled the pool may become incompatible with software
that does not support the feature. See zpool-features(7) for details.

POOL  FEATURE
---------------
zstore
      multi_vdev_crash_dump
      spacemap_histogram
      enabled_txg
      hole_birth
      extensible_dataset
      bookmarks
      filesystem_limits
# zpool upgrade mypool
This system supports ZFS pool feature flags.

Enabled the following features on 'mypool':
  spacemap_histogram
  enabled_txg
  hole_birth
  extensible_dataset
  bookmarks
  filesystem_limits

警告:

在使用存储池来开机的系统上的 Boot code 也必须一并更新来支持新的存储池版本,可在含有 Boot code 的分割区使用 gpart bootcode 来更新。请参考 gpart(8) 取得更多资讯。

对使用GPT分区的boot,使用以下命令:

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

对使用EFI的启动方式,请执行以下命令:

# gpart bootcode -p /boot/boot1.efifat -i 1 ada1

将引导代码应用于池中的所有可引导磁盘。有关详细信息, 请参阅gpart(8)

19.3.12. 显示已记录的存储池历史日志

修改存储池的指令会被记录下来,会记录的动作包含数据集的建立,属性更改或更换磁盘。这个历史记录用来查看存储池是如何建立、由谁执行、什么动作及何时。历史记录并非储存在日志档(Log file),而是储存在存储池。查看这个历史记录的指令名称为 zpool history

# zpool history
History for 'tank':
2013-02-26.23:02:35 zpool create tank mirror /dev/ada0 /dev/ada1
2013-02-27.18:50:58 zfs set atime=off tank
2013-02-27.18:51:09 zfs set checksum=fletcher4 tank
2013-02-27.18:51:18 zfs create tank/backup

输出结果显示曾在该存储池上执行的 zpoolzfs 指令以及时间戳记。只有会修改存储池或类似的指令会被记录下来,像是 zfs list 这种指令并不会被记录。当不指定存储池名称时,会列出所有存储池的历史记录。

在提供选项 -i-lzpool history 可以显更多详细资讯。 -i 会显示使用者触发的事件外,也会显示内部记录的 ZFS 事件。

# zpool history -i
History for 'tank':
2013-02-26.23:02:35 [internal pool create txg:5] pool spa 28; zfs spa 28; zpl 5;uts  9.1-RELEASE 901000 amd64
2013-02-27.18:50:53 [internal property set txg:50] atime=0 dataset = 21
2013-02-27.18:50:58 zfs set atime=off tank
2013-02-27.18:51:04 [internal property set txg:53] checksum=7 dataset = 21
2013-02-27.18:51:09 zfs set checksum=fletcher4 tank
2013-02-27.18:51:13 [internal create txg:55] dataset = 39
2013-02-27.18:51:18 zfs create tank/backup

更多详细的资讯可加上 -l 来取得,历史记录会以较长的格式显示,包含的资讯有执行指令的使用者名称、主机名称以及更改的项目。

# zpool history -l
History for 'tank':
2013-02-26.23:02:35 zpool create tank mirror /dev/ada0 /dev/ada1 [user 0 (root) on :global]
2013-02-27.18:50:58 zfs set atime=off tank [user 0 (root) on myzfsbox:global]
2013-02-27.18:51:09 zfs set checksum=fletcher4 tank [user 0 (root) on myzfsbox:global]
2013-02-27.18:51:18 zfs create tank/backup [user 0 (root) on myzfsbox:global]

输出结果显示 root 使用者使用 /dev/ada0/dev/ada1 建立镜像的存储池。主机名称 myzfsbox 在建立完存储池后也同样会显示。由于存储池可以从一个系统汇出再汇入到另一个系统,因此主机名称也很重要,这样一来可以清楚的办识在其他系统上执行的每一个指令的主机名称。

两个 zpool history 选项可以合并使用来取得最完整的存储池详细资讯。存储池历史记录在追踪执行什么动作或要取得除错所需的输出结果提供了非常有用的资讯。

19.3.13. 性能监控

内建的监视系统可以即时显示存储池的 I/O 统计资讯。它会显示存储池剩余的空间与使用的空间,每秒执行了多少读取与写入的操作,有多少 I/O 带宽被使用。预设会监视所有在系统中的存储池都并显示出来,可以提供存储池名称来只显示该存储池的监视资讯。举一个简单的例子:

# zpool iostat
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
data         288G  1.53T      2     11  11.3K  57.1K

要持续监视 I/O 的活动可以在最后的参数指定一个数字,这个数字代表每次更新资讯所间隔的秒数。在每次经过间隔的时间后会列出新一行的统计资讯,按下 Ctrl+C 可以中止监视。或者在指令列的间隔时间之后再指定一个数字,代表总共要显示的统计资讯笔数。

使用 -v 可以显示更详细的 I/O 统计资讯。每个在存储池中的设备会以一行统计资讯显示。这可以帮助了解每一个设备做了多少读取与写入的操作,并可协助确认是否有各别设备拖慢了整个存储池的速度。以下范例会显示有两个设备的镜像存储池:

# zpool iostat -v 
                            capacity     operations    bandwidth
pool                     alloc   free   read  write   read  write
-----------------------  -----  -----  -----  -----  -----  -----
data                      288G  1.53T      2     12  9.23K  61.5K
  mirror                  288G  1.53T      2     12  9.23K  61.5K
    ada1                     -      -      0      4  5.61K  61.7K
    ada2                     -      -      1      4  5.04K  61.7K
-----------------------  -----  -----  -----  -----  -----  -----

19.3.14. 分割存储池

由一个或多个镜像 vdev 所组成的存储池可以切分开成两个存储池。除非有另外指定,否则每个镜像的最后一个成员会被分离来然用来建立一个含有相同资料的新存储池。在做这个操作的第一次应先使用 -n,会显示预计会做的操作而不会真的执行,这可以协助确认操作是否与使用者所要的相同。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.