免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1511 | 回复: 0
打印 上一主题 下一主题

第 4 章 管理 ZFS 存储池 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-21 12:03 |只看该作者 |倒序浏览

第 4 章 管理 ZFS 存储池
本章介绍如何创建和管理 ZFS 存储池。
本章包含以下各节:

ZFS 存储池的组件
本节提供有关以下存储池组件的详细信息:


  • 磁盘

  • 文件

  • 虚拟设备

使用 ZFS 存储池中的磁盘
存储池的最基本元素是一个物理存储器。物理存储器可以是大小至少为 128 MB 的任何块设备。通常,此设备是 /dev/dsk 目录中对系统可见的一个硬盘驱动器。
存储设备可以是整个磁盘 (c1t0d0) 或单个片 (c0t0d0s7)。建议的操作模式是使用整个磁盘,在这种情况下,无需对磁盘专门进行格式化。ZFS 可格式化使用 EFI 标号的磁盘以包含单个大片。以此方式使用磁盘时,format 命令显示的分区表与以下信息类似:
Current partition table (original):
Total disk sectors available: 71670953 + 16384 (reserved sectors)
Part      Tag    Flag     First Sector        Size        Last Sector
  0        usr    wm                34      34.18GB         71670953   
  1 unassigned    wm                 0          0              0   
  2 unassigned    wm                 0          0              0   
  3 unassigned    wm                 0          0              0   
  4 unassigned    wm                 0          0              0   
  5 unassigned    wm                 0          0              0   
  6 unassigned    wm                 0          0              0   
  7 unassigned    wm                 0          0              0   
  8   reserved    wm          71670954       8.00MB         71687337
要使用整个磁盘,必须使用标准 Solaris 约定命名磁盘,如 /dev/dsk/cXtXdXsX。一些第三方驱动程序使用不同的命名约定,或者将磁盘放置在除 /dev/dsk 目录以外的位置中。要使用这些磁盘,必须手动标记磁盘并为 ZFS 提供片。
创建包含整个磁盘的存储池时,ZFS 会应用 EFI 标号。创建包含磁盘片的存储池时,可以使用传统的 Solaris VTOC 标号来标记磁盘。
应仅在以下情况下使用片:


  • 设备名称是非标准名称。

  • ZFS 和其他文件系统(如 UFS)之间共享单个磁盘。

  • 磁盘用作交换设备或转储设备。

可以使用全路径(如 /dev/dsk/c1t0d0)或构成 /dev/dsk 目录中设备名称的缩略名称(如 c1t0d0)来指定磁盘。例如,以下是有效的磁盘名称:


  • c1t0d0

  • /dev/dsk/c1t0d0

  • c0t0d6s2

  • /dev/foo/disk

ZFS 最适合在提供整个物理磁盘的情况下工作。虽然可以使用卷管理器(如 Solaris 卷管理器 (Solaris Volume Manager, SVM)、Veritas 卷管理器 (Veritas Volume Manager, VxVM))或硬件卷管理器(LUN 或硬件 RAID))构建逻辑设备,但是建议不要使用这些配置。尽管 ZFS 可在这类设备上正常运行,但结果可能是实际性能低于最佳性能。
磁盘由其路径及其设备 ID(如果可用)标识。使用此方法,可以在系统中重新配置设备,而不必更新任何 ZFS 状态。如果磁盘在控制器 1 和控制器 2 之间切换,则 ZFS 可使用设备 ID 检测到该磁盘已移动,并且现在应使用控制器 2 对其进行访问。设备 ID 对于驱动器固件是唯一的。尽管不大可能,但确实有一些固件更新更改了设备 ID。如果发生这种情况,ZFS 仍可以按路径访问设备,并自动更新存储的设备 ID。如果无意中同时更改了设备的路径和 ID,则将池导出再重新导入后才能使用该池。
使用 ZFS 存储池中的文件
ZFS 还允许将 UFS 文件用作存储池中的虚拟设备。此功能主要用于测试和启用简单的实验,而不是用于生产。原因是文件的任何使用都依赖于基础文件系统以实现一致性。如果创建了由 UFS 文件系统中的文件支持的 ZFS 池,即会隐式依赖于 UFS 来保证正确性和同步语义。
但是,如果首次试用 ZFS,或者在没有足够的物理设备时尝试更复杂的布局,则文件会非常有用。所有文件都必须指定为全路径,并且大小至少为 128 MB。如果移动或重命名某个文件,则必须将池导出再重新导入才能使用该池,这是因为没有设备 ID(可以按其查找文件)与文件相关联。
存储池中的虚拟设备
每个存储池都由一个或多个虚拟设备组成。虚拟设备是存储池的一种内部表示形式,用于说明物理存储器的布局及其故障特征。因此,虚拟设备表示用于创建存储池的磁盘设备或文件。 作为内部表示形式,虚拟设备是不可见的并且不需要进行管理。
向池中添加新设备时,存储池可以包含多个“顶层”虚拟设备。
ZFS 存储池的复制功能
ZFS 提供了两种级别的数据冗余:即镜像配置和 RAID-Z 配置。
镜像存储池配置
镜像存储池配置至少需要两个磁盘,而且磁盘最好位于不同的控制器上。可以在一个镜像配置中使用许多磁盘。此外,还可以在每个池中创建多个镜像。从概念上讲,简单的镜像配置与以下内容类似:
mirror c1t0d0 c2t0d0
从概念上讲,更复杂的镜像配置与以下内容类似:
mirror c1t0d0 c2t0d0 c3t0d0 mirror c4t0d0 c5t0d0 c6t0d0
有关创建镜像存储池的信息,请参见
创建镜像存储池

RAID-Z 存储池配置
除了镜像存储池配置外,ZFS 还提供了 RAID-Z 配置。RAID-Z 与 RAID-5 类似。
所有与 RAID-5 类似的传统算法(例如 RAID-4、RAID-5、RAID-6、RDP 和 EVEN-ODD)都存在称为“RAID-5 写入漏洞”的问题。如果仅写入了 RAID-5 条带的一部分,并且在所有块成功写入磁盘之前断电,则奇偶校验将永远与数据不同步,因此是无用的,除非后续的完全条带化写操作将其覆写。在 RAID-Z 中,ZFS 使用可变宽度的 RAID 条带,以便所有写操作都是完全条带化写操作。这是唯一可行的设计,因为 ZFS 通过以下方式将文件系统和设备管理集成在一起:文件系统的元数据包含有关基础数据复制模型的足够信息以处理可变宽度的 RAID 条带。RAID-Z 是世界上针对 RAID-5 写入漏洞的第一个仅使用软件的解决方案。
进行 RAID-Z 配置至少需要两个磁盘。除此之外,创建 RAID-Z 配置无需任何其他特殊硬件。当前,RAID-Z 提供一个磁盘空间的容量用于存储奇偶校验。例如,如果 RAID-Z 配置中有三个磁盘,则奇偶校验数据占用的空间与其中一个磁盘的空间相等。
从概念上讲,包含三个磁盘的 RAID-Z 配置与以下内容类似:
raidz c1t0d0 c2t0d0 c3t0d0
从概念上讲,更复杂的 RAID-Z 配置与以下内容类似:
raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0 c6t0d0 c7t0d0 raidz c8t0d0 c9t0d0 c10t0d0 c11t0d0 c12t0d0 c13t0d0 c14t0d0
如果要创建包含许多磁盘的 RAID-Z 配置(如本示例所示),则最好将包含 14 个磁盘的 RAID-Z 配置拆分为两个包含 7 个磁盘的分组。若 RAID-Z 配置包含的分组中的磁盘数目为一位数 (1-9),则该配置的性能应该更好。
有关创建 RAID-Z 存储池的信息,请参见
创建 RAID-Z 存储池

复制配置中的自我修复数据
ZFS 在镜像配置或 RAID-Z 配置中提供了自我修复数据。
检测到坏的数据块时,ZFS 不仅会从另一个复制的副本中提取正确的数据,还会通过将错误数据替换为正确的副本对其进行修复。
存储池中的动态条带化
对于添加到池中的每个虚拟设备,ZFS 会跨越所有可用设备以动态方式对数据进行条带化。由于是在写入时确定放置数据的位置,因此在分配时不会创建固定宽度的条带。
向池中添加虚拟设备时,ZFS 会将数据逐渐分配给新设备,以便维护性能和空间分配策略。每个虚拟设备也可以是包含其他磁盘设备或文件的镜像或 RAID-Z 设备。使用此配置,可以灵活地控制池的故障特征。例如,可以通过 4 个磁盘创建以下配置:


  • 使用动态条带化的四个磁盘

  • 一个四向 RAID-Z 配置

  • 使用动态条带化的两个双向镜像

尽管 ZFS 支持在同一池中组合不同类型的虚拟设备,但是建议不要采用这种做法。例如,可以创建一个包含一个双向镜像和一个三向 RAID-Z 配置的池。但是,容错能力几乎与最差的虚拟设备(在本示例中为 RAID-Z)相同。建议做法是使用相同类型的顶层虚拟设备,并且每个设备的复制级别相同。
创建和销毁 ZFS 存储池
根据设计,可快速轻松地创建和销毁池。但是,执行这些操作请务必谨慎。虽然进行了检查,以防止在新的沲中使用现已使用的设备,但是 ZFS 无法始终知道设备何时已在使用中。销毁池更为容易。请谨慎使用 zpool destroy。这是一个会产生重大后果的简单命令。有关销毁池的信息,请参见
销毁 ZFS 存储池

创建 ZFS 存储池
要创建存储池,请使用 zpool create 命令。此命令采用池名称和任意数目的虚拟设备作为参数。池名称必须符合
ZFS 组件命名要求
中概述的命名约定。
创建基本存储池
以下命令创建了一个名为 tank 的新池,该池由磁盘 c1t0d0 和 c1t1d0 组成:
# zpool create tank c1t0d0 c1t1d0
这些整个磁盘可在 /dev/dsk 目录中找到,并由 ZFS 适当标记以包含单个大片。数据通过这两个磁盘以动态方式进行条带化。
创建镜像存储池
要创建镜像池,请使用 mirror 关键字,后跟将组成镜像的任意数目的存储设备。可以通过在命令行中重复使用 mirror 关键字指定多个镜像。以下命令创建了一个包含两个双向镜像的池:
# zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0
第二个 mirror 关键字表示将指定新的顶层虚拟设备。数据通过这两个镜像以动态方式进行条带化,并会相应地在每个磁盘之间复制数据。
创建 RAID-Z 存储池
创建 RAID-Z 池与创建镜像池基本相同,不同之处是使用 raidz 关键字而不是 mirror。以下示例说明如何创建一个包含由 5 个磁盘组成的单个 RAID-Z 设备的池:
# zpool create tank raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 /dev/dsk/c5t0d0
本示例表明可以使用全路径指定相应的磁盘。/dev/dsk/c5t0d0 设备与 c5t0d0 设备相同。
可以使用磁盘片创建类似的配置。例如:
# zpool create tank raidz c1t0d0s0 c2t0d0s0 c3t0d0s0 c4t0d0s0 c5t0d0s0
但是,必须预先格式化磁盘,使其包含适当大小的片 0。
有关 RAID-Z 配置的更多信息,请参见
RAID-Z 存储池配置

处理 ZFS 存储池创建错误
出现池创建错误可以有许多原因。其中一些原因是显而易见的(如指定的设备不存在),而其他原因则不太明显。
检测使用中的设备
格式化设备之前,ZFS 会首先确定 ZFS 或操作系统的某个其他部分是否正在使用磁盘。如果磁盘正在使用,则可能会显示类似以下的错误:
# zpool create tank c1t0d0 c1t1d0
invalid vdev specification
use '-f' to override the following errors:
/dev/dsk/c1t0d0s0 is currently mounted on /
/dev/dsk/c1t0d0s1 is currently mounted on swap
/dev/dsk/c1t1d0s0 is part of active ZFS pool 'zeepool'
Please see zpool(1M)
使用 -f 选项可以覆盖其中的一些错误,但是无法覆盖大多数错误。使用 -f 选项无法覆盖使用以下各项产生的错误,必须手动对其进行更正:
挂载的文件系统
磁盘或其中一片包含当前挂载的文件系统。要更正此错误,请使用 umount 命令。
/etc/vfstab 中的文件系统
磁盘包含 /etc/vfstab 文件中列出的文件系统,但当前未挂载该文件系统。要更正此错误,请删除或注释掉 /etc/vfstab 文件中的相应行。
专用转储设备
正在将磁盘用作系统的专用转储设备。要更正此错误,请使用 dumpadm 命令。
ZFS 池的一部分
磁盘或文件是活动 ZFS 存储池的一部分。要更正此错误,请使用 zpool 命令销毁池。
以下使用情况检查用作帮助性警告,并可以使用 -f 选项进行覆盖以创建池:
包含文件系统
磁盘包含已知的文件系统,尽管该系统未挂载并且看起来未被使用。
卷的一部分
磁盘是 SVM 卷的一部分。
实时升级
正在将磁盘用作 Solaris Live Upgrade 的替换引导环境。
导出的 ZFS 池的一部分
磁盘是已导出的或者从系统中手动删除的存储池的一部分。如果是后一种情况,则会将池的状态报告为可能处于活动状态,因为磁盘可能是也可能不是由其他系统使用的网络连接驱动器。覆盖可能处于活动状态的池时请务必谨慎。
以下示例说明如何使用 -f 选项:
# zpool create tank c1t0d0
invalid vdev specification
use '-f' to override the following errors:
/dev/dsk/c1t0d0s0 contains a ufs filesystem
# zpool create -f tank c1t0d0
理想的情况是,更正错误而不是使用 -f 选项。
不匹配的复制级别
建议不要创建包含不同复制级别的虚拟设备的池。zpool 命令可尝试防止意外创建复制级别不匹配的池。如果尝试创建具有这样配置的池,则会显示类似以下的错误:
# zpool create tank c1t0d0 mirror c2t0d0 c3t0d0
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: both disk and mirror vdevs are present
# zpool create tank mirror c1t0d0 c2t0d0 mirror c3t0d0 c4t0d0 c5t0d0
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: 2-way mirror and 3-way mirror vdevs are present
可以使用 -f 选项覆盖这些错误,但建议不要采用这种做法。此命令还会发出警告,指明正使用大小不同的设备创建镜像池或 RAID-Z 池。尽管允许此配置,但是复制级别不匹配会导致较大设备上产生未使用的空间,并要求使用 -f 选项覆盖警告。
在预运行模式下创建存储池
由于创建池可能以不同方式意外失败,并且格式化磁盘这一操作可能产生危害,因此 zfs create 命令具有一个附加选项 -n,此选项可用于模拟创建池,而无需实际将数据写入磁盘。此选项执行设备使用中检查和复制级别验证,并报告该过程中出现的任何错误。如果未找到错误,则会显示类似以下的输出:
# zpool create -n tank mirror c1t0d0 c1t1d0
would create 'tank' with the following layout:
        tank
          mirror
            c1t0d0
            c1t1d0
如果不实际创建池,则无法检测到某些错误。最常见的示例是在同一配置中两次指定同一设备。由于不写入数据本身便无法可靠地检测到此错误,因此 create -n 命令可能会报告运行成功,但在实际运行时又无法创建池。
存储池的缺省挂载点
创建池时,缺省情况下根数据集的缺省挂载点是 /pool-name。此目录必须不存在或者为空。如果目录不存在,则会自动创建该目录。如果该目录为空,则根数据集会挂载在现有目录的顶层。要创建挂载点不同于缺省挂载点的池,请使用 zpool create 命令的 -m 选项:
# zpool create home c1t0d0
default mountpoint '/home' exists and is not empty
use '-m' option to specify a different default
# zpool create -m /export/zfs home c1t0d0
此命令会创建一个新池 home 和挂载点为 /export/zfs 的 home 数据集。
有关挂载点的更多信息,请参见
管理 ZFS 挂载点

销毁 ZFS 存储池
池是通过使用 zpool destroy 命令进行销毁的。即使池中包含已挂载的数据集,此命令仍会销毁池。
# zpool destroy tank

注意 –
销毁池时请务必小心。请确保确实要销毁池,并始终保留数据副本。如果意外销毁了不该销毁的池,则可以尝试恢复该池。有关更多信息,请参见
恢复已销毁的 ZFS 存储池

销毁包含故障设备的池
销毁池这一操作要求将数据写入磁盘,以指示池不再有效。此状态信息可防止执行导入操作时这些设备作为潜在的池显示出来。在一个或多个设备不可用的情况下,仍可以销毁池。但是,必需的状态信息将不会写入这些损坏的设备。
创建新池时,这些设备在适当修复后其状态将报告为可能处于活动状态,并在搜索要导入的池时会显示为有效设备。如果池中包含足够多的故障设备以致于池本身出现故障(意味着顶层虚拟设备出现故障),则此命令将列显一条警告,并且在不使用 -f 选项的情况下无法完成。此选项是必需的,因为无法打开池,以致无法知道数据是否存储在池中。例如:
# zpool destroy tank
cannot destroy 'tank': pool is faulted
use '-f' to force destruction anyway
# zpool destroy -f tank
有关池和设备的运行状况的更多信息,请参见
ZFS 存储池的运行状况

有关导入池的更多信息,请参见
导入 ZFS 存储池

管理 ZFS 存储池中的设备
ZFS 存储池的组件
中介绍了有关设备的大多数基本信息。创建池后,即可执行几项任务来管理池中的物理设备。
向存储池中添加设备
通过添加新的顶层虚拟设备,可以向池中动态添加空间。此空间立即可供池中的所有数据集使用。要向池中添加新虚拟设备,请使用 zpool add 命令。例如:
# zpool add zeepool mirror c2t1d0 c2t2d0
虚拟设备的格式与 zpool create 命令中使用的虚拟设备格式相同,并且应用相同的规则。将对设备进行检查以确定是否正在使用这些设备,此命令在不使用 -f 选项的情况下无法更改复制级别。此命令还支持 -n 选项,以便可以执行预运行。例如:
# zpool add -n zeepool mirror c3t1d0 c3t2d0
would update 'zeepool' to the following configuration:
      zeepool
        mirror
            c1t0d0
            c1t1d0
        mirror
            c2t1d0
            c2t2d0
        mirror
            c3t1d0
            c3t2d0
此命令语法会将镜像设备 c3t1d0 和 c3t2d0 添加到 zeepool 的现有配置中。
有关如何执行虚拟设备验证的更多信息,请参见
检测使用中的设备

附加和分离存储池中的设备
除了 zpool add 命令外,还可以使用 zpool attach 命令将新设备添加到现有镜像设备或非镜像设备中。例如:
# zpool attach zeepool c1t1d0 c2t1d0
如果现有设备是双向镜像的一部分,则附加新设备将创建三向镜像,依此类推。在任一情况下,新设备都会立即开始重新同步。
在本示例中,zeepool 是现有的双向镜像,通过将新设备 c2t1d0 附加到现有设备 c1t1d0 可将其转换为三向镜像。
可以使用 zpool detach 命令从池中分离设备。例如:
# zpool detach zeepool c2t1d0
但是,如果不存在数据的其他有效副本,则拒绝此操作。例如:
# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs
使存储池中的设备联机和脱机
使用 ZFS 可使单个设备脱机或联机。硬件不可靠或无法正常工作时(假定该情况只是暂时的),ZFS 会继续对设备读写数据。如果该情况不是暂时的,则可能会指示 ZFS 通过使设备脱机来忽略该设备。ZFS 不会向已脱机的设备发送任何请求。
注 –
设备无需脱机即可进行替换。
使设备脱机
可以使用 zpool offline 命令使设备脱机。如果设备是磁盘,则可以使用路径或短名称指定设备。例如:
# zpool offline tank c1t0d0
bringing device c1t0d0 offline
不能将池脱机到它出现故障的点。例如,不能使 RAID-Z 配置中的两个设备脱机,也不能使顶层虚拟设备脱机。
# zpool offline tank c1t0d0
cannot offline c1t0d0: no valid replicas
查询池的状态时,已脱机的设备以 OFFLINE 状态显示。有关查询池的状态的信息,请参见
查询 ZFS 存储池的状态

缺省情况下,脱机状态是持久性的。重新引导系统时,设备会一直处于脱机状态。
要暂时使设备脱机,请使用 zpool offline -t 选项。例如:
# zpool offline -t tank c1t0d0
bringing device 'c1t0d0' offline
重新引导系统时,此设备会自动恢复到 ONLINE 状态。
有关设备运行状况的更多信息,请参见
ZFS 存储池的运行状况

使设备联机
使设备脱机后,即可使用 zpool online 命令对其进行恢复:
# zpool online tank c1t0d0
bringing device c1t0d0 online
使设备联机时,已写入池中的任何数据都将与最新可用的设备重新同步。请注意,不能通过使设备联机来替换磁盘。如果使设备脱机,替换驱动器,然后再尝试使该设备联机,则设备将一直处于故障状态。
如果尝试使故障设备联机,则使用 fmd 将显示以下类似消息:
# zpool online tank c1t0d0
Bringing device c1t0d0 online
#
SUNW-MSG-ID: ZFS-8000-D3, TYPE: Fault, VER: 1, SEVERITY: Major
EVENT-TIME: Fri Mar 17 14:38:47 MST 2006
PLATFORM: SUNW,Ultra-60, CSN: -, HOSTNAME: neo
SOURCE: zfs-diagnosis, REV: 1.0
EVENT-ID: 043bb0dd-f0a5-4b8f-a52d-8809e2ce2e0a
DESC: A ZFS device failed.  Refer to http://sun.com/msg/ZFS-8000-D3 for more information.
AUTO-RESPONSE: No automated response will occur.
IMPACT: Fault tolerance of the pool may be compromised.
REC-ACTION: Run 'zpool status -x' and replace the bad device.
有关替换故障设备的更多信息,请参见
修复缺少的设备

清除存储池设备
如果设备因出现故障(导致在 zpool status 输出中列出错误)而脱机,则可以使用 zpool clear 命令清除错误计数。
如果不指定任何参数,则此命令将清除池中的所有设备错误。例如:
# zpool clear tank
如果指定了一个或多个设备,则此命令仅清除与指定设备关联的错误。例如:
# zpool clear tank c1t0d0
有关清除 zpool 错误的更多信息,请参见
清除瞬态错误

替换存储池中的设备
可以使用 zpool replace 命令替换存储池中的设备。
# zpool replace tank c1t1d0 c1t2d0
在本示例中,以前的设备 c1t1d0 会替换为 c1t2d0。
替换设备的大小必须大于或等于镜像配置或 RAID-Z 配置中所有设备的最小大小。如果替换设备的大小更大,则完成替换时将增大非镜像配置或非 RAID-Z 配置中的池大小。
有关如何替换设备的更多信息,请参见
修复缺少的设备

修复损坏的设备

查询 ZFS 存储池的状态
zpool list 命令提供了许多方法来请求有关池状态的信息。可用信息通常分为以下三个类别:基本使用情况信息、I/O 统计信息和运行状况。本节介绍了所有这三种类型的存储池信息。
基本的 ZFS 存储池信息
可以使用 zpool list 命令显示有关池的基本信息。
列出有关所有存储池的信息
如果不使用参数,则此命令会显示系统中所有池的所有字段。例如:
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
tank                   80.0G   22.3G   47.7G    28%  ONLINE     -
dozer                   1.2T    384G    816G    32%  ONLINE     -
此输出显示了以下信息:
NAME
池的名称。
SIZE
池的总大小,等于所有顶层虚拟设备大小的总和。
USED
由所有数据集和内部元数据分配的空间量。请注意,此数量与在文件系统级别报告的空间量不同。
有关确定可用文件系统空间的更多信息,请参见
ZFS 空间记帐

AVAILABLE
池中未分配的空间量。
CAPACITY (CAP)
已用空间量,以总空间的百分比表示。
HEALTH
池的当前运行状况。
有关池运行状况的更多信息,请参见
ZFS 存储池的运行状况

ALTROOT
池的备用根(如果有)。
有关备用根池的更多信息,请参见
ZFS 备用根池

另外,也可以通过指定池的名称来收集特定池的统计信息。例如:
# zpool list tank
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
tank                   80.0G   22.3G   47.7G    28%  ONLINE     -
列出特定的存储池统计信息
可以使用 -o 选项请求特定的统计信息。使用此选项可以生成自定义报告或快速列出相关信息。例如,要仅列出每个池的名称和大小,可使用以下语法:
# zpool list -o name,size
NAME                    SIZE
tank                   80.0G
dozer                   1.2T
列名称与
列出有关所有存储池的信息
中列出的属性相对应。
使用脚本处理 ZFS 存储池输出
zpool list 命令的缺省输出旨在提高可读性,因此不能轻易用作 shell 脚本的一部分。为了便于在程序中使用该命令,可以使用 -H 选项以便不显示列标题,并使用制表符而不是空格分隔字段。例如,请求系统中所有池的名称的简单列表:
# zpool list -Ho name
tank
dozer
以下是另一个示例:
# zpool list -H -o name,size
tank   80.0G
dozer  1.2T
ZFS 存储池 I/O 统计信息
要请求池或特定虚拟设备的 I/O 统计信息,请使用 zpool iostat 命令。与 iostat 命令类似,此命令也可以显示目前为止所有 I/O 活动的静态快照,以及每个指定时间间隔的更新统计信息。报告的统计信息如下:
USED CAPACITY
当前存储在池或设备中的数据量。由于具体的内部实现的原因,此数字与可供实际文件系统使用的空间量有少量差异。
有关池空间与数据集空间之间的差异的更多信息,请参见
ZFS 空间记帐

AVAILABLE CAPACITY
池或设备中的可用空间量。与 used 统计信息一样,这与可供数据集使用的空间量也有少量差异。
READ OPERATIONS
发送到池或设备的读取 I/O 操作数,包括元数据请求。
WRITE OPERATIONS
发送到池或设备的写入 I/O 操作数。
READ BANDWIDTH
所有读取操作(包括元数据)的带宽,以每秒单位数表示。
WRITE BANDWIDTH
所有写入操作的带宽,以每秒单位数表示。
列出池范围的统计信息
如果不使用任何选项,则 zpool iostat 命令会显示自引导以来系统中所有池的累积统计信息。例如:
# zpool iostat
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank         100G  20.0G   1.2M   102K   1.2M  3.45K
dozer       12.3G  67.7G   132K  15.2K  32.1K  1.20K
由于这些统计信息是自引导以来累积的,因此,如果池相对空闲,则带宽可能显示为较低。通过指定时间间隔,可以请求查看更准确的当前带宽使用情况。例如:
# zpool iostat tank 2
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank         100G  20.0G   1.2M   102K   1.2M  3.45K
tank         100G  20.0G    134      0  1.34K      0
tank         100G  20.0G     94    342  1.06K   4.1M
在本示例中,此命令仅显示了池 tank 的使用情况统计信息,每隔两秒显示一次,直到键入 Ctrl-C 组合键为止。或者,也可以再指定 count 参数,该参数用于使命令在指定的重复次数之后终止。例如,zpool iostat 2 3 每隔两秒列显一次摘要信息,重复三次,共六秒。如果存在单个池,则会在连续的行上显示统计信息。如果存在多个池,则用附加虚线分隔每次重复,以提供直观的分隔效果。
列出虚拟设备的统计信息
除了池范围的 I/O 统计信息外,zpool iostat 命令还可以显示特定虚拟设备的统计信息。此命令可用于识别异常缓慢的设备,或者只是观察 ZFS 生成的 I/O 的分布情况。要请求完整的虚拟设备布局以及所有 I/O 统计信息,请使用 zpool iostat -v 命令。例如:
# zpool iostat -v
               capacity     operations    bandwidth
tank         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mirror      20.4G  59.6G      0     22      0  6.00K
  c1t0d0        -      -      1    295  11.2K   148K
  c1t1d0        -      -      1    299  11.2K   148K
----------  -----  -----  -----  -----  -----  -----
total       24.5K   149M      0     22      0  6.00K
按虚拟设备查看 I/O 统计信息时,请注意两个重要事项。


  • 首先,只有顶层虚拟设备才有空间使用量。在镜像和 RAID-Z 虚拟设备中分配空间的方法是特定于实现的,不能简单地表示为一个数字。

  • 其次,这些数字可能不会完全按期望的那样累加。具体来说,通过 RAID-Z 设备和通过镜像设备进行的操作不是完全均等的。这种差异在创建池之后即特别明显,因为在创建池的过程中直接对磁盘执行了大量 I/O,但在镜像级别并没有考虑这些 I/O。随着时间的推移,这些数字应会逐渐相等,尽管损坏的、无响应的或脱机的设备也可能影响此对称性。

检查虚拟设备统计信息时,可以使用相同的一组选项(时间间隔和计次)。
ZFS 存储池的运行状况
ZFS 提供了一种检查池和设备运行状况的集成方法。池的运行状况是根据其所有设备的状态确定的。使用 zpool status 命令可以显示此状态信息。此外,池和设备的可能故障由 fmd 报告,并会显示在系统控制台上和 /var/adm/messages 文件中。本节介绍如何确定池和设备的运行状况。本章不介绍如何修复运行不良的池或从其恢复。有关疑难解答和数据恢复的更多信息,请参见
第 9 章,ZFS 疑难解答和数据恢复

每个设备都可以处于以下状态之一:
ONLINE
设备处于正常工作状态。尽管仍然可能会出现一些瞬态错误,但是设备在其他方面处于正常工作状态。
DEGRADED
虚拟设备出现故障,但仍能够工作。此状态在镜像或 RAID-Z 设备缺少一个或多个组成设备时最为常见。池的容错能力可能会受到损害,因为另一个设备中的后续故障可能无法恢复。
FAULTED
虚拟设备完全无法访问。此状态通常表示设备出现全面故障,以致于 ZFS 无法向该设备发送数据或从该设备接收数据。如果顶层虚拟设备处于此状态,则完全无法访问池。
OFFLINE
管理员已将虚拟设备显式脱机。
UNAVAILABLE
无法打开设备或虚拟设备。在某些情况下,包含 UNAVAILABLE 设备的池会以 DEGRADED 模式显示。如果顶层虚拟设备不可用,则无法访问池中的任何设备。
池的运行状况是根据其所有顶层虚拟设备的运行状况确定的。如果所有虚拟设备状态都为 ONLINE,则池的状态也为 ONLINE。如果任何一个虚拟设备状态为 DEGRADED 或 UNAVAILABLE,则池的状态也为 DEGRADED。如果顶层虚拟设备的状态为 FAULTED 或 OFFLINE,则池的状态也为 FAULTED。处于故障状态的池完全无法访问。附加或修复必需的设备后,才能恢复数据。处于降级状态的池会继续运行,但是,如果池处于联机状态,则可能无法实现相同级别的数据复制或数据吞吐量。
基本的存储池运行状况
请求池运行状况的简单概述的最简单方法是使用 zpool status 命令:
# zpool status -x
all pools are healthy
通过为命令指定池名称,可以检查特定池。如下节所述,应检查不处于 ONLINE 状态的所有池是否存在潜在的问题。
详细运行状况
使用 -v 选项可以请求更详细的运行状况摘要。例如:
# zpool status -v tank
  pool: tank
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: none requested
config:
        NAME                STATE     READ WRITE CKSUM
        tank                DEGRADED     0     0     0
          mirror            DEGRADED     0     0     0
            c1t0d0          FAULTED      0     0     0  cannot open
            c1t1d0          ONLINE       0     0     0
errors: No known data errors
此输出显示了池处于其当前状态的原因的完整说明,其中包括问题的易读说明,以及指向知识文章(用于了解更多信息)的链接。每篇知识文章都提供了有关从当前问题恢复的最佳方法的最新信息。使用详细的配置信息,应可确定损坏的设备以及修复池的方法。
在以上示例中,故障设备应该被替换。替换该设备后,请使用 zpool online 命令使设备恢复联机。例如:
# zpool online tank c1t0d0
Bringing device c1t0d0 online
# zpool status -x
all pools are healthy
如果池包含脱机设备,则命令输出将标识有问题的池。例如:
# zpool status -x
  pool: tank
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-D3
scrub: resilver completed with 0 errors on Fri Mar 17 14:38:47 2006
config:
        NAME         STATE     READ WRITE CKSUM
        tank         DEGRADED     0     0     0
          mirror     DEGRADED     0     0     0
            c1t0d0   UNAVAIL      0     0     0  cannot open
            c1t1d0   ONLINE       0     0     0
READ 和 WRITE 列提供了在设备上发现的 I/O 错误的计数,而 CKSUM 列则提供了在设备上出现的无法更正的校验和错误的计数。这两种错误计数可能会指示可能的设备故障,并且需要执行更正操作。如果针对顶层虚拟设备报告了非零错误,则表明部分数据可能无法访问。错误计数可标识任何已知的数据错误。
在以上示例输出中,脱机设备不会导致数据错误。
有关诊断和修复故障池和数据的更多信息,请参见
第 9 章,ZFS 疑难解答和数据恢复

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

准备迁移 ZFS 存储池
应显式导出存储池,以表明可随时将其迁移。此操作会将任何未写入的数据刷新到磁盘,将数据写入磁盘以表明导出已完成,并从系统中删除有关池的所有信息。
如果不显式导出池,而是改为手动删除磁盘,则仍可以在其他系统中导入生成的池。但是,可能会丢失最后几秒的数据事务,并且由于设备不再存在,该池在原始计算机中可能会显示为处于故障状态。缺省情况下,目标计算机会拒绝导入未显式导出的池。对于防止意外导入包含仍在其他系统中使用的网络连接存储器的活动池,此条件是必要的。
导出 ZFS 存储池
要导出池,请使用 zpool export 命令。例如:
# zpool export tank
执行此命令后,池 tank 在系统中即不再可见。此命令将尝试取消挂载池中任何已挂载的文件系统,然后再继续执行。如果无法取消挂载任何文件系统,则可以使用 -f 选项强制取消挂载这些文件系统。例如:
# zpool export tank
cannot unmount '/export/home/eschrock': Device busy
# zpool export -f tank
如果在导出时设备不可用,则无法将磁盘指定为正常导出。如果之后将某个这样的设备附加到不包含任何工作设备的系统中,则该设备的状态会显示为“可能处于活动状态”。如果仿真卷正在池中使用,即使使用 -f 选项,也无法导出池。要导出包含仿真卷的池,请首先确保卷的所有使用者都不再处于活动状态。
有关仿真卷的更多信息,请参见
仿真卷

确定要导入的可用存储池
从系统中删除池后(通过导出或通过强制删除设备),请立即将设备附加到目标系统。虽然 ZFS 可以处理仅有部分设备可用的一些情况,但是必须在系统之间移动池中的所有设备。没有必要使用相同的设备名称附加设备。ZFS 可检测任何移动的或重命名的设备,并相应地调整配置。要搜索可用的池,请运行不带任何选项的 zpool import 命令。例如:
# zpool import
  pool: tank
    id: 3778921145927357706
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
        tank        ONLINE
          mirror    ONLINE
            c1t0d0  ONLINE
            c1t1d0  ONLINE
在本示例中,池 tank 可用于在目标系统中导入。每个池都由一个名称以及唯一的数字标识符标识。如果可用于导入的多个池具有相同名称,则可以使用数字标识符对其进行区分。
与 zpool status 命令类似,zpool import 命令也会引用可在 Web 上获取的知识文章,其中包含有关此问题修复过程的最新信息。在此示例中,用户可以强制导入池。但是,如果导入当前正由其他系统通过存储网络使用的池,则可能导致数据损坏和出现紧急情况,因为这两个系统都尝试写入同一存储器。如果池中的某些设备不可用,但是存在足够的冗余,可确保池可用,则池会显示 DEGRADED 状态。例如:
# zpool import
  pool: tank
    id: 3778921145927357706
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:
        tank         DEGRADED
          mirror     DEGRADED
            c1t0d0   UNAVAIL   cannot open
            c1t1d0   ONLINE
在本示例中,第一个磁盘已损坏或缺失,但仍可以导入池,这是因为仍可以访问镜像数据。如果存在过多故障设备或缺失设备,则无法导入池。例如:
# zpool import
  pool: dozer
    id: 12090808386336829175
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:
        raidz               FAULTED
          c1t0d0    ONLINE
          c1t1d0    FAULTED
          c1t2d0    ONLINE
          c1t3d0    FAULTED
在本示例中,RAID-Z 虚拟设备中缺少两个磁盘,这意味着没有足够的可用复制数据来重新构造池。在某些情况下,没有足够的设备就无法确定完整的配置。在这种情况下,虽然 ZFS 会尽可能多地报告有关该情况的信息,但是 ZFS 仍然无法知道池中包含的其他设备。例如:
# zpool import
pool: dozer
    id: 12090808386336829175
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
          raidz       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 /file/a /file/b
# zpool export dozer
# zpool import
no pools available
# zpool import -d /file
  pool: dozer
    id: 672153753596386982
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
        dozer       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
也可以使用 -R 选项在备用根下导入池。有关备用根池的更多信息,请参见
ZFS 备用根池

恢复已销毁的 ZFS 存储池
可以使用 zpool import -D 命令恢复已销毁的存储池。例如:
# zpool destroy tank
# zpool import -D
pool: tank
    id: 3778921145927357706
state: ONLINE (DESTROYED)
action: The pool can be imported using its name or numeric identifier.  The
        pool was destroyed, but can be imported using the '-Df' flags.
config:
        tank        ONLINE
          mirror    ONLINE
            c1t0d0  ONLINE
            c1t1d0  ONLINE
在以上的 zpool import 输出中,由于包含以下状态信息,因此可以将该池确定为已销毁的池:
state: ONLINE (DESTROYED)
要恢复已销毁的池,请再次执行 zpool import -D 命令,并指定要恢复的池和 -f 选项。例如:
# zpool import -Df tank
# zpool status tank
  pool: tank
state: ONLINE
scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
errors: No known data errors
如果已销毁池中的某个设备出现故障或不可用,但还是有可能恢复已销毁的池。在此情况下,请导入已降级的池,然后尝试修复设备故障。例如:
# zpool destroy dozer
# zpool import -D
pool: dozer
    id:
state: DEGRADED (DESTROYED)
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.  The
        pool was destroyed, but can be imported using the '-Df' flags.
   see: http://www.sun.com/msg/ZFS-8000-2Q
config:
        dozer        DEGRADED
           raidz      ONLINE
            c1t0d0    ONLINE
            c1t1d0    ONLINE
            c1t2d0    UNAVAIL  cannot open
            c1t3d0    ONLINE
# 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-D3
scrub: resilver completed with 0 errors on Fri Mar 17 16:11:35 2006
config:
        NAME                     STATE     READ WRITE CKSUM
        dozer                    DEGRADED     0     0     0
          raidz                  ONLINE       0     0     0
            c1t0d0               ONLINE       0     0     0
            c1t1d0               ONLINE       0     0     0
            c1t2d0               UNAVAIL      0     0     0  cannot open
            c1t3d0               ONLINE       0     0     0
errors: No known data errors
# zpool online dozer c1t2d0
Bringing device c1t2d0 online
# zpool status -x
all pools are healthy
升级 ZFS 存储池
在将来的 ZFS 发行版中,可能需要将池升级到更新的版本,以利用更新版本中的功能。zpool upgrade 命令可用于此过程。此外,zpool status 命令已经修改,可在池运行较早的版本时发出通知。例如:
# zpool status
  pool: test
state: ONLINE
status: The pool is formatted using an older 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 older software versions.
scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          c1t27d0   ONLINE       0     0     0
errors: No known data errors
在此 ZFS 发行版中,运行 zpool upgrade 命令升级池应该是不必要的。此命令当前显示初始的 ZFS 版本信息。
# zpool upgrade
This system is currently running ZFS version 1.
All pools are formatted using this version.
在将来的 ZFS 发行版中,可以使用以下语法确定有关特定版本和所支持发行版的其他信息。
# zpool upgrade -v
This system is currently running ZFS version 1.
The following versions are supported:
VER  DESCRIPTION
---  --------------------------------------------------------
1   Initial ZFS version.
For more information on a particular version, including supported releases, see:
http://www.opensolaris.org/os/community/zfs/version/N
Where 'N' is the version number.
有关池升级过程的更多信息将在本指南的将来版本中提供。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26090/showart_325712.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP