我正在运行使用原生 ZFS 的 Ubuntu Server 13.04 64 位。我有一个由 4 个硬盘组成的 zpool,其中一个昨天坏了,现在不是无法被操作系统或 BIOS 识别。
不幸的是,我只是在下次重启后才看到这个问题,所以现在驱动器标签丢失了,我无法按照官方说明更换磁盘这里和这里。
zpool status hermes -x
印刷
root@zeus:~# zpool status hermes -x
pool: hermes
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-4J
scan: scrub repaired 0 in 2h4m with 0 errors on Sun Jun 9 00:28:24 2013
config:
NAME STATE READ WRITE CKSUM
hermes DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
ata-ST3300620A_5QF0MJFP ONLINE 0 0 0
ata-ST3300831A_5NF0552X UNAVAIL 0 0 0
ata-ST3200822A_5LJ1CHMS ONLINE 0 0 0
ata-ST3200822A_3LJ0189C ONLINE 0 0 0
errors: No known data errors
我已经用新的驱动器替换了旧驱动器(带有标签/dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
)
任何一个命令
zpool replace hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
zpool offline hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
zpool detatch hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
失败
root@zeus:~# zpool offline hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
cannot offline /dev/disk/by-id/ata-ST3300831A_5NF0552X: no such device in pool
因为损坏的驱动器的标签在系统中不再存在。我还尝试了上述命令,省略了驱动器标签的路径,但无济于事。
我怎样才能替换“幽灵”磁盘?
答案1
经过今晚无休止的挖掘,我终于找到了解决方案。简而言之,您可以在命令中使用磁盘的 GUID(即使断开驱动器连接后仍会保留)zpool
。
详细回答:我使用以下命令获取了磁盘的 GUID,zdb
该命令给出了以下输出
root@zeus:/dev# zdb
hermes:
version: 28
name: 'hermes'
state: 0
txg: 162804
pool_guid: 14829240649900366534
hostname: 'zeus'
vdev_children: 1
vdev_tree:
type: 'root'
id: 0
guid: 14829240649900366534
children[0]:
type: 'raidz'
id: 0
guid: 5355850150368902284
nparity: 1
metaslab_array: 31
metaslab_shift: 32
ashift: 9
asize: 791588896768
is_log: 0
create_txg: 4
children[0]:
type: 'disk'
id: 0
guid: 11426107064765252810
path: '/dev/disk/by-id/ata-ST3300620A_5QF0MJFP-part2'
phys_path: '/dev/gptid/73b31683-537f-11e2-bad7-50465d4eb8b0'
whole_disk: 1
create_txg: 4
children[1]:
type: 'disk'
id: 1
guid: 15935140517898495532
path: '/dev/disk/by-id/ata-ST3300831A_5NF0552X-part2'
phys_path: '/dev/gptid/746c949a-537f-11e2-bad7-50465d4eb8b0'
whole_disk: 1
create_txg: 4
children[2]:
type: 'disk'
id: 2
guid: 7183706725091321492
path: '/dev/disk/by-id/ata-ST3200822A_5LJ1CHMS-part2'
phys_path: '/dev/gptid/7541115a-537f-11e2-bad7-50465d4eb8b0'
whole_disk: 1
create_txg: 4
children[3]:
type: 'disk'
id: 3
guid: 17196042497722925662
path: '/dev/disk/by-id/ata-ST3200822A_3LJ0189C-part2'
phys_path: '/dev/gptid/760a94ee-537f-11e2-bad7-50465d4eb8b0'
whole_disk: 1
create_txg: 4
features_for_read:
我正在寻找的 GUID 使15935140517898495532
我能够
root@zeus:/dev# zpool offline hermes 15935140517898495532
root@zeus:/dev# zpool status
pool: hermes
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 repaired 0 in 2h4m with 0 errors on Sun Jun 9 00:28:24 2013
config:
NAME STATE READ WRITE CKSUM
hermes DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
ata-ST3300620A_5QF0MJFP ONLINE 0 0 0
ata-ST3300831A_5NF0552X OFFLINE 0 0 0
ata-ST3200822A_5LJ1CHMS ONLINE 0 0 0
ata-ST3200822A_3LJ0189C ONLINE 0 0 0
errors: No known data errors
进而
root@zeus:/dev# zpool replace hermes 15935140517898495532 /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
root@zeus:/dev# zpool status
pool: hermes
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Sun Jun 9 01:44:36 2013
408M scanned out of 419G at 20,4M/s, 5h50m to go
101M resilvered, 0,10% done
config:
NAME STATE READ WRITE CKSUM
hermes DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
ata-ST3300620A_5QF0MJFP ONLINE 0 0 0
replacing-1 OFFLINE 0 0 0
ata-ST3300831A_5NF0552X OFFLINE 0 0 0
ata-ST3500320AS_9QM03ATQ ONLINE 0 0 0 (resilvering)
ata-ST3200822A_5LJ1CHMS ONLINE 0 0 0
ata-ST3200822A_3LJ0189C ONLINE 0 0 0
errors: No known data errors
重新同步完成后,一切又恢复正常。如果能包含此信息就更好了,您可以使用通过命令获得的磁盘 GUIDzdb
和zpool
zpool 的手册页。
编辑
正如下面 durval 指出的那样,该zdb
命令可能不会输出任何内容。那么您可以尝试使用
zdb -l /dev/<name-of-device>
明确列出有关该设备的信息(即使系统中已经缺少该设备的信息)。
答案2
问题是磁盘是通过 ID 而不是设备引用的。
这是一个可行的解决方法:
ln -s /dev/null /dev/ata-ST3300831A_5NF0552X
zpool export hermes
zpool import hermes
zpool status
# note the new device name that should appear here
zpool offline hermes xxxx
zpool replace hermes xxxx /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
编辑:我迟到了 30 秒......
答案3
@Marcus:感谢您对自己的问题发表了这个出色的答案,这对我帮助很大。
有一天,我发现了一个可能让您(以及将来来这里谷歌搜索的任何人)感兴趣的转折:我有一个缓存设备UNAVAIL
由于同样的错误(ZFS-8000-4J
,label is missing or invalid
)而从池中删除(并标记为),并且尝试离线/删除/替换它失败,并显示完全相同的“池中没有这样的设备”消息。
但是,当我尝试应用你的解决方案时,简单的zdb
(没有参数)确实不是列出设备,更不用说它的 GUID。
经过一番挖掘,我发现zdb -l /dev/DEVICENAME
列出了 GUID(直接从设备中获取,而不是从池记录中获取),并且使用该 GUID 使我能够进行替换(实际上我zpool offline
先执行了 a ,然后是 a zpool remove
,然后是 a zpool add
,效果很好)。
答案4
我遇到了类似的问题:
驱动器发生故障,无法再在 BIOS 中注册(完全死机)。 这zpool status
表明它是UNAVAILABLE
。
我放入了容量相似的驱动器,并设法将其分配为新spare
驱动器INUSE
,然后重新镀银。但是,它实际上并不是 zpool 的一部分,而是池对丢失的驱动器有记忆,认为它有一天会再次出现。
解决方案是首先删除丢失的驱动器来自zpool:
[root@hactar ~]# zpool detach hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094
然后,删除标记spare-1 INUSE
为:
[root@hactar ~]# zpool detach hactar_data /dev/gptid/f2089b59-2654-11e5-8d99-00241d738094
一旦我这样做了,看起来 FreeNAS 不需要我执行replace
命令就能解决这个问题,但是如果你的系统无法自行解决这个问题,以下命令应该用一个设备替换另一个设备:
zpool replace {your_poolname} {drive to be replaced} {new drive to take its place}
例如:
zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d
738094
- gptids 来自我的
zpool status
命令。