zpool list 命令提供了多种方法来请求有关池状态的信息。可用信息通常分为以下三个类别: 基本使用情况信息、I/O 统计信息和运行状况。本节介绍了所有这三种类型的存储池信息。
可以使用 zpool list 命令显示有关池的基本信息。
不带任何参数时,zpool list 命令显示有关系统上所有池的下列信息。
# zpool list NAME SIZE ALLOC FREE CAP HEALTH ALTROOT tank 80.0G 22.3G 47.7G 28% ONLINE - dozer 1.2T 384G 816G 32% ONLINE - |
此命令输出显示以下信息:
池的名称。
池的总大小,等于所有顶层虚拟设备大小的总和。
分配给所有数据集和内部元数据的物理空间量。请注意,此数量与在文件系统级别报告的磁盘空间量不同。
有关确定可用文件系统空间的更多信息,请参见ZFS 磁盘空间记帐。
池中未分配的空间量。
已用磁盘空间量,以总磁盘空间的百分比表示。
池的当前运行状况。
有关池运行状况的更多信息,请参见确定 ZFS 存储池的运行状况。
池的备用根(如有)。
有关备用根池的更多信息,请参见使用 ZFS 备用根池。
# zpool list tank NAME SIZE ALLOC FREE 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 |
列名称与列出有关所有存储池或特定池的信息中列出的属性相对应。
zpool list 命令的缺省输出旨在提高可读性,因此不能轻易用作 shell 脚本的一部分。为了便于在程序中使用该命令,可以使用 -H 选项以便不显示列标题,并使用制表符而不是空格分隔字段。例如,要请求系统中所有池的名称列表,可以使用以下语法:
# zpool list -Ho name tank dozer |
以下是另一个示例:
# zpool list -H -o name,size tank 80.0G dozer 1.2T |
ZFS 会自动记录成功的 zfs 和 zpool 命令(用于修改池状态信息)。使用 zpool history 命令可显示此信息。
例如,以下语法显示了根池的命令输出:
# zpool history History for 'rpool': 2010-05-11.10:18:54 zpool create -f -o failmode=continue -R /a -m legacy -o cachefile=/tmp/root/etc/zfs/zpool.cache rpool mirror c1t0d0s0 c1t1d0s0 2010-05-11.10:18:55 zfs set canmount=noauto rpool 2010-05-11.10:18:55 zfs set mountpoint=/rpool rpool 2010-05-11.10:18:56 zfs create -o mountpoint=legacy rpool/ROOT 2010-05-11.10:18:57 zfs create -b 8192 -V 2048m rpool/swap 2010-05-11.10:18:58 zfs create -b 131072 -V 1536m rpool/dump 2010-05-11.10:19:01 zfs create -o canmount=noauto rpool/ROOT/zfsBE 2010-05-11.10:19:02 zpool set bootfs=rpool/ROOT/zfsBE rpool 2010-05-11.10:19:02 zfs set mountpoint=/ rpool/ROOT/zfsBE 2010-05-11.10:19:03 zfs set canmount=on rpool 2010-05-11.10:19:04 zfs create -o mountpoint=/export rpool/export 2010-05-11.10:19:05 zfs create rpool/export/home 2010-05-11.11:11:10 zpool set bootfs=rpool rpool 2010-05-11.11:11:10 zpool set bootfs=rpool/ROOT/zfsBE rpool |
您可以使用有关系统的类似输出来确定对错误状况进行故障排除时所执行的确切 ZFS 命令。
历史记录日志有如下特点:
不能禁用日志。
日志持久保存在磁盘上,这意味着系统重新引导后,将保存日志。
日志作为环形缓冲区来实现。最小大小为 128 KB。最大大小为 32 MB。
对于较小的池,日志最大大小的上限设置为池大小的 1%,而池大小是在创建池时确定的。
日志无需任何管理,这意味着不需要调整日志大小或更改日志位置。
要确定特定存储池的命令历史记录,请使用类似以下内容的语法:
# zpool history tank History for 'tank': 2010-05-13.14:13:15 zpool create tank mirror c1t2d0 c1t3d0 2010-05-13.14:21:19 zfs create tank/snaps 2010-05-14.08:10:29 zfs create tank/ws01 2010-05-14.08:10:54 zfs snapshot tank/ws01@now 2010-05-14.08:11:05 zfs clone tank/ws01@now tank/ws01bugfix |
可使用 -l 选项显示长格式(包括用户名、主机名和执行操作的区域)。例如:
# zpool history -l tank History for 'tank': 2010-05-13.14:13:15 zpool create tank mirror c1t2d0 c1t3d0 [user root on neo] 2010-05-13.14:21:19 zfs create tank/snaps [user root on neo] 2010-05-14.08:10:29 zfs create tank/ws01 [user root on neo] 2010-05-14.08:10:54 zfs snapshot tank/ws01@now [user root on neo] 2010-05-14.08:11:05 zfs clone tank/ws01@now tank/ws01bugfix [user root on neo] |
可使用 -i 选项显示可用于诊断目的的内部事件信息。例如:
# zpool history -i tank 2010-05-13.14:13:15 zpool create -f tank mirror c1t2d0 c1t23d0 2010-05-13.14:13:45 [internal pool create txg:6] pool spa 19; zfs spa 19; zpl 4;... 2010-05-13.14:21:19 zfs create tank/snaps 2010-05-13.14:22:02 [internal replay_inc_sync txg:20451] dataset = 41 2010-05-13.14:25:25 [internal snapshot txg:20480] dataset = 52 2010-05-13.14:25:25 [internal destroy_begin_sync txg:20481] dataset = 41 2010-05-13.14:25:26 [internal destroy txg:20488] dataset = 41 2010-05-13.14:25:26 [internal reservation set txg:20488] 0 dataset = 0 2010-05-14.08:10:29 zfs create tank/ws01 2010-05-14.08:10:54 [internal snapshot txg:53992] dataset = 42 2010-05-14.08:10:54 zfs snapshot tank/ws01@now 2010-05-14.08:11:04 [internal create txg:53994] dataset = 58 2010-05-14.08:11:05 zfs clone tank/ws01@now tank/ws01bugfix |
要请求池或特定虚拟设备的 I/O 统计信息,请使用 zpool iostat 命令。与 iostat 命令类似,此命令也可以显示所有 I/O 活动的静态快照,以及每个指定时间间隔的更新统计信息。报告的统计信息如下:
当前存储在池或设备中的数据量。由于具体的内部实现的原因,此数量与可供实际文件系统使用的磁盘空间量有少量差异。
有关池空间与数据集空间之间的差异的更多信息,请参见ZFS 磁盘空间记帐。
池或设备中的可用磁盘空间量。与 used 统计信息一样,这与可供数据集使用的磁盘空间量也有少量差异。
发送到池或设备的读取 I/O 操作数,包括元数据请求。
发送到池或设备的写入 I/O 操作数。
所有读取操作(包括元数据)的带宽,以每秒单位数表示。
所有写入操作的带宽,以每秒单位数表示。
如果不使用任何选项,则 zpool iostat 命令会显示自引导以来系统中所有池的累积统计信息。例如:
# zpool iostat capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- rpool 6.05G 61.9G 0 0 786 107 tank 31.3G 36.7G 4 1 296K 86.1K ---------- ----- ----- ----- ----- ----- ----- |
由于这些统计信息是自引导以来累积的,因此,如果池相对空闲,则带宽可能显示为较低。通过指定时间间隔,可以请求查看更准确的当前带宽使用情况。例如:
# zpool iostat tank 2 capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- tank 18.5G 49.5G 0 187 0 23.3M tank 18.5G 49.5G 0 464 0 57.7M tank 18.5G 49.5G 0 457 0 56.6M tank 18.8G 49.2G 0 435 0 51.3M |
在本示例中,此命令显示了池 tank 的使用情况统计信息,每隔两秒显示一次,直到键入 Ctrl-C 组合键为止。或者,也可以再指定 count 参数,该参数用于使命令在指定的重复次数之后终止。例如, zpool iostat 2 3 每隔两秒列显一次摘要信息,重复三次,共六秒。如果仅有一个池,则会在连续的行上显示统计信息。如果存在多个池,则用附加虚线分隔每次重复,以提供直观的分隔效果。
除了池范围的 I/O 统计信息外,zpool iostat 命令还可以显示虚拟设备的 I/O 统计信息。此命令可用于识别异常缓慢的设备,或者观察 ZFS 生成的 I/O 的分布情况。要请求完整的虚拟设备布局以及所有 I/O 统计信息,请使用 zpool iostat -v 命令。例如:
# zpool iostat -v capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- rpool 6.05G 61.9G 0 0 785 107 mirror 6.05G 61.9G 0 0 785 107 c1t0d0s0 - - 0 0 578 109 c1t1d0s0 - - 0 0 595 109 ---------- ----- ----- ----- ----- ----- ----- tank 36.5G 31.5G 4 1 295K 146K mirror 36.5G 31.5G 126 45 8.13M 4.01M c1t2d0 - - 0 3 100K 386K c1t3d0 - - 0 3 104K 386K ---------- ----- ----- ----- ----- ----- ----- |
查看虚拟设备的 I/O 统计信息时,必须注意以下两点:
首先,磁盘空间使用情况统计信息仅适用于顶层虚拟设备。在镜像和 RAID-Z 虚拟设备中分配磁盘空间的方法是特定于实现的,不能简单地表示为一个数字。
其次,这些数字可能不会完全按期望的那样累加。具体来说,通过 RAID-Z 设备和通过镜像设备进行的操作不是完全均等的。这种差异在创建池之后即特别明显,因为在创建池的过程中直接对磁盘执行了大量 I/O,但在镜像级别并没有考虑这些 I/O。随着时间推移,这些数值会逐渐变得相等。不过,损坏的、无响应的或脱机设备也会影响这种对称性。
检查虚拟设备统计信息时,可以使用相同的一组选项(时间间隔和计次)。
ZFS 提供了一种检查池和设备运行状况的集成方法。池的运行状况是根据其所有设备的状态确定的。使用 zpool status 命令可以显示此状态信息。此外,池和设备的潜在故障由 fmd 报告,显示在系统控制台上,并记录于 /var/adm/messages 文件中。
本节介绍如何确定池和设备的运行状况。本章不介绍如何修复运行不良的池或从其恢复。有关故障排除和数据恢复的更多信息,请参见第 11 章。
每个设备都可以处于以下状态之一:
设备或虚拟设备处于正常工作状态。尽管仍然可能会出现一些瞬态错误,但是设备在其他方面处于正常工作状态。
虚拟设备出现过故障,但仍能工作。此状态在镜像或 RAID-Z 设备缺少一个或多个组成设备时最为常见。池的容错能力可能会受到损害,因为另一个设备中的后续故障可能无法恢复。
设备或虚拟设备完全无法访问。此状态通常表示设备出现全面故障,以致于 ZFS 无法向该设备发送数据或从该设备接收数据。如果顶层虚拟设备处于此状态,则完全无法访问池。
管理员已将设备显式脱机。
无法打开设备或虚拟设备。在某些情况下,包含 UNAVAIL 设备的池会以 DEGRADED 模式显示。如果顶层虚拟设备的状态为 UNAVAIL,则无法访问池中的任何设备。
系统正在运行时已物理移除了该设备。设备移除检测依赖于硬件,而且并非在所有平台上都受支持。
池的运行状况是根据其所有顶层虚拟设备的运行状况确定的。如果所有虚拟设备状态都为 ONLINE,则池的状态也为 ONLINE。如果任何一个虚拟设备状态为 DEGRADED 或 UNAVAIL,则池的状态也为 DEGRADED。如果顶层虚拟设备的状态为 FAULTED 或 OFFLINE,则池的状态也为 FAULTED。处于 FAULTED 状态的池完全无法访问。附加或修复必需的设备后,才能恢复数据。处于 DEGRADED 状态的池会继续运行,但是,如果池处于联机状态,则可能无法实现相同级别的数据冗余或数据吞吐量。
使用 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: scrub completed after 0h0m with 0 errors on Wed Jan 20 15:13:59 2010 config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 c1t0d0 ONLINE 0 0 0 c1t1d0 UNAVAIL 0 0 0 cannot open errors: No known data errors |
此输出显示了池处于其当前状态的原因的完整说明,其中包括问题的易读说明,以及指向知识文章(用于了解更多信息)的链接。每篇知识文章都提供了有关从当前问题恢复的最佳方法的最新信息。使用详细的配置信息,您可以确定哪个设备已损坏以及如何修复池。
在以上示例中,故障设备应该被替换。替换该设备后,请使用 zpool online 命令使设备联机。例如:
# zpool online tank c1t0d0 Bringing device c1t0d0 online # zpool status -x all pools are healthy |
如果启用了 autoreplace 属性,则您可能不必使被替换的设备联机。
如果池包含脱机设备,则命令输出将标识有问题的池。例如:
# zpool status -x pool: tank state: DEGRADED status: One or more devices has been taken offline by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Online the device using 'zpool online' or replace the device with 'zpool replace'. scrub: resilver completed after 0h0m with 0 errors on Wed Jan 20 15:15:09 2010 config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 c1t0d0 ONLINE 0 0 0 c1t1d0 OFFLINE 0 0 0 48K resilvered errors: No known data errors |
READ 和 WRITE 列提供了在设备上出现的 I/O 错误的计数,而 CKSUM 列则提供了在设备上出现的无法更正的校验和错误的计数。这两种错误计数指示可能的设备故障,并且需要执行更正操作。如果针对顶层虚拟设备报告了非零错误,则表明部分数据可能无法访问。
errors: 字段标识任何已知的数据错误。
在以上示例输出中,脱机设备不会导致数据错误。
有关诊断和修复故障池和数据的更多信息,请参见第 11 章。