今天我在一台服务器(FreeBSD 8.2 STABLE)上发现了这一点:
NAME STATE READ WRITE CKSUM
data DEGRADED 1.38K 0 0
raidz1-0 DEGRADED 1.38K 0 0
ad10 ONLINE 1.38K 0 0
ad12 ONLINE 0 0 0
ad14 ONLINE 0 0 0
ad16 REMOVED 0 0 0
我赶紧把错误的硬盘拆下来,换上新的。然后,我输入了这个倒霉的命令:
zpool add data ad16
结果是池中出现了一个新的 ad16 设备:
NAME STATE READ WRITE CKSUM
data DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
ad10 ONLINE 0 0 0
ad12 ONLINE 0 0 0
ad14 ONLINE 0 0 0
ad16 FAULTED 0 0 0 corrupted data
ad16 ONLINE 0 0 0
第一个 ad16 设备出现故障,并且是 data/raidz1-0 卷的一部分。第二个 ad16 设备处于联机状态,并且不属于任何卷。问题是它们具有相同的名称,因此 replace 命令不起作用:
gw# zpool replace -f data ad16 ad16
invalid vdev specification
the following errors must be manually repaired:
/dev/ad16 is part of active pool 'data'
我认为我应该先移除在线的 ad16 磁盘,然后才能更换有故障的 ad16 磁盘。但这行不通,因为我无法将其脱机,也无法将其移除:
gw# zpool offline data ad16
gw# zpool status
pool: data
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'.
scan: scrub in progress since Thu Apr 18 03:23:06 2013
26.1G scanned out of 3.13T at 50.7M/s, 17h52m to go
0 repaired, 0.81% done
config:
NAME STATE READ WRITE CKSUM
data DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
ad10 ONLINE 0 0 0
ad12 ONLINE 0 0 0
ad14 ONLINE 0 0 0
ad16 OFFLINE 0 0 0
ad16 ONLINE 0 0 0
errors: No known data errors
gw# zpool remove data ad16
cannot remove ad16: only inactive hot spares, cache, top-level, or log devices can be removed
我猜想“offline ad16”命令针对的是故障设备。但我想将另一个设备脱机。我还尝试将系统启动到单用户模式,并移除此新磁盘,但结果导致两个 ad16 设备都不可用,整个池都不可用(这很奇怪,因为有足够的磁盘可以使其工作……)
答案1
“zpool add”命令用于向池中添加新设备 (vdev)。最初运行该命令时,您向池中添加了一个新的 vdev(仅由 ad16 组成)。您开始时使用的是 4 个磁盘 raidz,其中一个磁盘出现故障,但现在您有一个池,其中数据在 raidz 和 ad16 之间进行条带化。丢失该 ONLINE ad16 磁盘将导致整个池出现故障。
由于现在无法移除 ad16(您无法从池中移除 vdev),而且我怀疑您是否希望将数据条带化在 4 磁盘 raidz 和单个磁盘之间,因此我认为不值得您花时间尝试解决该故障磁盘。您最好将数据转移到单独的池/磁盘/服务器上,然后销毁/重新创建该池。
答案2
建议:通过 UUID 与逻辑名称引用底层设备。