跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 管理:ZFS 文件系统 Oracle Solaris 11 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
3. Oracle Solaris ZFS 与传统文件系统之间的差别
7. 使用 Oracle Solaris ZFS 快照和克隆
8. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
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 -
可以使用 zpool list 的时间间隔和计数选项收集一定时期内的统计信息。此外,使用 -T 选项可以显示时间戳。例如:
# zpool list -T d 3 2 Tue Nov 2 10:36:11 MDT 2010 NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT pool 33.8G 83.5K 33.7G 0% 1.00x ONLINE - rpool 33.8G 12.2G 21.5G 36% 1.00x ONLINE - Tue Nov 2 10:36:14 MDT 2010 pool 33.8G 83.5K 33.7G 0% 1.00x ONLINE - rpool 33.8G 12.2G 21.5G 36% 1.00x ONLINE -
可以使用 zpool status -l 选项显示有关池设备的物理位置的信息。当需要以物理方式移除或替换磁盘时,查看物理位置信息很有帮助。
此外,可以使用 fmadm add-alias 命令来引入磁盘别名,磁盘别名可帮助您识别磁盘在您的环境中的物理位置。例如:
# fmadm add-alias SUN-Storage-J4400.1002QCQ015 Lab10Rack5...
# zpool status -l tank pool: tank state: ONLINE scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 27 08:24:17 2011 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_02/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_20/disk ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_22/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_14/disk ONLINE 0 0 0 mirror-2 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_10/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_16/disk ONLINE 0 0 0 mirror-3 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_01/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_21/disk ONLINE 0 0 0 mirror-4 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_23/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_15/disk ONLINE 0 0 0 mirror-5 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_09/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_04/disk ONLINE 0 0 0 mirror-6 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_08/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_05/disk ONLINE 0 0 0 mirror-7 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_07/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_11/disk ONLINE 0 0 0 mirror-8 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_06/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_19/disk ONLINE 0 0 0 mirror-9 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_00/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_13/disk ONLINE 0 0 0 mirror-10 ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_03/disk ONLINE 0 0 0 /dev/chassis/Lab10Rack5.../DISK_18/disk ONLINE 0 0 0 spares /dev/chassis/Lab10Rack5.../DISK_17/disk AVAIL /dev/chassis/Lab10Rack5.../DISK_12/disk AVAIL errors: No known data errors
可以使用 -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': 2011-05-27.13:10:43 zpool create tank mirror c8t1d0 c8t2d0 2011-06-01.12:05:23 zpool scrub tank 2011-06-13.16:26:07 zfs create tank/users 2011-06-13.16:26:27 zfs create tank/users/finance 2011-06-13.16:27:15 zfs set users:dept=finance tank/users/finance
可使用 -l 选项显示长格式(包括用户名、主机名和执行操作的区域)。例如:
# zpool history -l tank 2011-05-27.13:10:43 zpool create tank mirror c8t1d0 c8t2d0 [user root on neo:global] 2011-06-01.12:05:23 zpool scrub tank [user root on neo:global] 2011-06-13.16:26:07 zfs create tank/users [user root on neo:global] 2011-06-13.16:26:27 zfs create tank/users/finance [user root on neo:global] 2011-06-13.16:27:15 zfs set users:dept=finance tank/users/finance [user root ...]
可使用 -i 选项显示可用于诊断目的的内部事件信息。例如:
# zpool history -i tank History for 'tank': 2011-05-27.13:10:43 zpool create tank mirror c8t1d0 c8t2d0 2011-05-27.13:10:43 [internal pool create txg:5] pool spa 33; zfs spa 33; zpl 5;... 2011-05-31.15:02:39 [internal pool scrub done txg:11828] complete=1 2011-06-01.12:04:50 [internal pool scrub txg:14353] func=1 mintxg=0 maxtxg=14353 2011-06-01.12:05:23 zpool scrub tank 2011-06-13.16:26:06 [internal create txg:29879] dataset = 52 2011-06-13.16:26:07 zfs create tank/users 2011-06-13.16:26:07 [internal property set txg:29880] $share2=2 dataset = 52 2011-06-13.16:26:26 [internal create txg:29881] dataset = 59 2011-06-13.16:26:27 zfs create tank/users/finance 2011-06-13.16:26:27 [internal property set txg:29882] $share2=2 dataset = 59 2011-06-13.16:26:45 [internal property set txg:29883] users:dept=finance dataset = 59 2011-06-13.16:27:15 zfs set users:dept=finance tank/users/finance
要请求池或特定虚拟设备的 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。随着时间推移,这些数值会逐渐变得相等。不过,损坏的、无响应的或脱机设备也会影响这种对称性。
检查虚拟设备统计信息时,可以使用相同的一组选项(时间间隔和计次)。
还可以显示有关池的虚拟设备的物理位置信息。例如:
# zpool iostat -lv capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- export 2.39T 2.14T 13 27 42.7K 300K mirror 490G 438G 2 5 8.53K 60.3K /dev/chassis/lab10rack15/SCSI_Device__2/disk - - 1 0 4.47K 60.3K /dev/chassis/lab10rack15/SCSI_Device__3/disk - - 1 0 4.45K 60.3K mirror 490G 438G 2 5 8.62K 59.9K /dev/chassis/lab10rack15/SCSI_Device__4/disk - - 1 0 4.52K 59.9K /dev/chassis/lab10rack15/SCSI_Device__5/disk - - 1 0 4.48K 59.9K mirror 490G 438G 2 5 8.60K 60.2K /dev/chassis/lab10rack15/SCSI_Device__6/disk - - 1 0 4.50K 60.2K /dev/chassis/lab10rack15/SCSI_Device__7/disk - - 1 0 4.49K 60.2K mirror 490G 438G 2 5 8.47K 60.1K /dev/chassis/lab10rack15/SCSI_Device__8/disk - - 1 0 4.42K 60.1K /dev/chassis/lab10rack15/SCSI_Device__9/disk - - 1 0 4.43K 60.1K . . .
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 命令还提供有关重新同步和清理操作的详细信息。
重新同步进度报告。例如:
scan: resilver in progress since Thu May 26 11:26:32 2011 1.26G scanned out of 2.40G at 6.15M/s, 0h3m to go 1.26G resilvered, 56.3% done
清理进度报告。例如:
scan: scrub in progress since Fri May 27 08:24:17 2011 18.0M scanned out of 2.35G at 8.99M/s, 0h4m to go 0 repaired, 0.75% done
重新同步完成消息。例如:
scan: resilvered 2.34G in 1h2m with 0 errors on Thu May 26 11:56:40 2011
清理完成消息。例如:
scan: scrub repaired 512B in 1h2m with 0 errors on Fri May 27 08:54:50 2011
取消正在进行的清理消息。例如:
scan: scrub canceled on Wed Fri Jun 10 09:06:24 2011
清理和重新同步完成消息在系统重新引导后仍存在
使用 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 章。
可以使用 zpool status 的时间间隔和计数选项收集一定时期内的统计信息。此外,使用 -T 选项可以显示时间戳。例如:
# zpool status -T d 3 2 zpool status -T d 3 2 Tue Nov 2 10:38:18 MDT 2010 pool: pool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM pool ONLINE 0 0 0 c3t3d0 ONLINE 0 0 0 errors: No known data errors pool: rpool state: ONLINE scan: resilvered 12.2G in 0h14m with 0 errors on Thu Oct 28 14:55:57 2010 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c3t0d0s0 ONLINE 0 0 0 c3t2d0s0 ONLINE 0 0 0 errors: No known data errors Tue Nov 2 10:38:21 MDT 2010 pool: pool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM pool ONLINE 0 0 0 c3t3d0 ONLINE 0 0 0 errors: No known data errors pool: rpool state: ONLINE scan: resilvered 12.2G in 0h14m with 0 errors on Thu Oct 28 14:55:57 2010 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c3t0d0s0 ONLINE 0 0 0 c3t2d0s0 ONLINE 0 0 0 errors: No known data errors