在 Oracle® Solaris 11.2 中管理 ZFS 文件系统

退出打印视图

更新时间: 2014 年 12 月
 
 

检查 ZFS 文件系统完整性

对于 ZFS,不存在与 fsck 等效的实用程序。此实用程序传统上有两个作用:文件系统修复和文件系统验证。

文件系统修复

对于传统的文件系统,写入数据的方法本身容易出现导致文件系统不一致的意外故障。由于传统的文件系统不是事务性的,因此可能会出现未引用的块、错误的链接计数或其他不一致的文件系统结构。添加日志记录确实解决了其中的一些问题,但是在无法回滚日志时可能会带来其他问题。采用 ZFS 配置的磁盘存在数据不一致的唯一原因是硬件故障(在这种情况下该池应该已经设置冗余)或者 ZFS 软件存在错误。

fsck 实用程序可以解决 UFS 文件系统特有的已知问题。大多数 ZFS 存储池问题一般都与硬件故障或电源故障有关。使用冗余池可以避免许多问题。如果硬件故障或断电导致池损坏,请参见修复 ZFS 存储池范围内的损坏

如果没有冗余池,则始终存在因文件系统损坏而造成无法访问某些或所有数据的风险。

文件系统验证

除了文件系统修复外,fsck 实用程序还能验证磁盘上的数据是否没有问题。过去,此任务要求取消挂载文件系统并运行 fsck 实用程序,在该过程中可能会使系统进入单用户模式。此情况导致的停机时间的长短与所检查文件系统的大小成比例。ZFS 提供了一种对所有不一致性执行例程检查的机制,而不是要求显式实用程序执行必要的检查。此功能(称为清理)通常在内存或其他系统中使用,用于在错误导致硬件或软件故障前检测及预防这些错误。

控制 ZFS 数据清理

每当 ZFS 遇到错误时(不管是在清理时还是按需访问文件时),都会在内部记录该错误,以便您可以快速查看池中所有已知错误的概述。

显式 ZFS 数据清理

检查数据完整性的最简单方式是对该池中的数据进行显式清理。此操作对池中的所有数据遍历一次,并验证是否可以读取所有块。尽管任何 I/O 的优先级一直低于常规操作的优先级,但是清理以设备所允许的最快速度进行。虽然进行清理时池数据应该保持可用而且几乎都做出响应,但是此操作可能会对性能产生负面影响。要启动显式清理,请使用 zpool scrub 命令。例如:

# zpool scrub tank

使用 zpool status 命令可以显示当前清理操作的状态。例如:

# zpool status -v tank
pool: tank
state: ONLINE
scan: scrub in progress since Mon Jun  7 12:07:52 2010
201M scanned out of 222M at 9.55M/s, 0h0m to go
0 repaired, 90.44% done
config:

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

errors: No known data errors

每个池一次只能发生一个活动的清理操作。

可通过使用 –s 选项来停止正在进行的清理操作。例如:

# zpool scrub -s tank

在大多数情况下,目的在于确保数据完整性的清理操作应该一直执行到完成。如果清理操作影响了系统性能,您可以自行决定停止清理操作。

执行例程清理可以保证对系统上所有磁盘执行连续的 I/O。例程清理具有副作用,即阻止电源管理将空闲磁盘置于低功耗模式。如果系统基本上一直在执行 I/O,或功耗不是重要的考虑因素,则可以安全地忽略此问题。如果系统基本处于空闲状态,您希望节省磁盘功耗,应考虑使用 cron(1M) 安排显式清理,而不使用后台清理。这仍然会执行数据的全面清理,尽管在清理完成前会产生大量 I/O,完成时可以将磁盘作为正常状态进行电源管理。缺点(除了增加 I/O 外)是有大量时间没有进行任何清理操作,在这些时间段内数据损坏风险可能会增加。

有关解释 zpool status 输出的更多信息,请参见查询 ZFS 存储池的状态

ZFS 数据清理和重新同步

替换设备时,将启动重新同步操作,以便将正确副本中的数据移动到新设备。此操作是一种形式的磁盘清理。因此,在给定的时间,池中只能发生一个这样的操作。如果清理操作正在进行,则重新同步操作会暂停当前清理,并在重新同步完成后重新启动清理操作。

有关重新同步的更多信息,请参见查看重新同步状态