我是 ZFS 文件系统的新手。我在 Windows 中使用 DrivePool,但我想要一些可以即时纠正错误以及创建和维护快照的东西。我曾经使用过 BTRFS;然而 ZFS 包含在 Ubuntu 16.04 中,而且我听说 ZFS 在 raid-z2 中比 BTRFS 更稳定,所以我想为什么不呢。
我大约三周前搬家了。我拿了 10 个 4TB 驱动器并将它们放入 raid-z2。从备份到raid大约需要18个小时。我没有意识到驾驶顺序很重要。我取出一个驱动器并将其放入机箱内,因为我有 14 个端口,但只有 12 个插槽。这显然在没有告诉我的情况下杀死了我的 z2。我想知道为什么我的阵列以 90MB/s 的速度运行,但我的工作使我直到今晚才进一步调查它。
zpool status
!我有一个驱动器处于“故障”状态,另一个驱动器处于“不可用”状态。两个驱动器 SMART 检查结果都很好。大约两周过去了,驱动器上的数据已经很糟糕了。所以我将磁盘离线。
root@core:/home/kayot# zpool status
pool: storage
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 Tue Feb 21 20:15:16 2017
151G scanned out of 24.8T at 401M/s, 17h55m to go
0 repaired, 0.60% done
config:
NAME STATE READ WRITE CKSUM
storage DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
sda ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
sdg ONLINE 0 0 0
sdh ONLINE 0 0 0
11017248821379080310 OFFLINE 0 0 0 was /dev/sdk1
2056055545907538536 OFFLINE 0 0 0 was /dev/sdl1
我有完整的备份,所以我不紧张什么的。所以我想,我将用相同的磁盘替换磁盘。 SDK仍在系统上但未使用,对吗?
root@core:/home/kayot# zpool replace -f storage 11017248821379080310 /dev/sdk
invalid vdev specification
the following errors must be manually repaired:
/dev/sdk1 is part of active pool 'storage'
这很奇怪。它公开告诉我驱动器出现故障,我将其离线。我清理了分区。我使用 Parted 并删除了分区。我还创建了一个新的分区 GPT。
root@core:/home/kayot# zpool replace storage /dev/sdk
cannot replace /dev/sdk with /dev/sdk: /dev/sdk is busy
root@core:/home/kayot# zpool replace storage /dev/sdk
invalid vdev specification
use '-f' to override the following errors:
/dev/sdk1 is part of active pool 'storage'
root@core:/home/kayot#
同样的错误。它怎么知道它仍然是同一个驱动器?
所以我DD了驱动器的前10GB。然后我使用 Parted 并创建了一个新的分区表。同样的错误...然后我尝试交叉添加驱动器,我将使用另一个驱动器来替换第一个驱动器等。
不同的驱动器出现同样的错误。
为什么?
我也用过labelclear。相同的结果。
我需要做什么才能使这些驱动器重新投入使用?用核弹攻击整个阵列?
那么,我做错了什么以及如何解决它。我有备份,但我认为这是一次学习经历,如果我可以修复它而不是替换它,那就太理想了。
这是我的 ZBD 跟踪
root@core:/home/kayot# zdb
storage:
version: 5000
name: 'storage'
state: 0
txg: 1080550
pool_guid: 9888777651596013552
errata: 0
hostname: 'core'
vdev_children: 1
vdev_tree:
type: 'root'
id: 0
guid: 9888777651596013552
children[0]:
type: 'raidz'
id: 0
guid: 6154429632473251558
nparity: 2
metaslab_array: 34
metaslab_shift: 38
ashift: 12
asize: 40007384432640
is_log: 0
create_txg: 4
children[0]:
type: 'disk'
id: 0
guid: 788698524796940048
path: '/dev/sda1'
whole_disk: 1
DTL: 170
create_txg: 4
children[1]:
type: 'disk'
id: 1
guid: 13851319173204376663
path: '/dev/sdb1'
whole_disk: 1
DTL: 169
create_txg: 4
children[2]:
type: 'disk'
id: 2
guid: 2340725902255763627
path: '/dev/sdc1'
whole_disk: 1
DTL: 168
create_txg: 4
children[3]:
type: 'disk'
id: 3
guid: 17362585713374487716
path: '/dev/sdd1'
whole_disk: 1
DTL: 167
create_txg: 4
children[4]:
type: 'disk'
id: 4
guid: 2150600564749895821
path: '/dev/sde1'
whole_disk: 1
DTL: 166
create_txg: 4
children[5]:
type: 'disk'
id: 5
guid: 3210726972626380545
path: '/dev/sdf1'
whole_disk: 1
DTL: 165
create_txg: 4
children[6]:
type: 'disk'
id: 6
guid: 8795069986910347514
path: '/dev/sdg1'
whole_disk: 1
DTL: 164
create_txg: 4
children[7]:
type: 'disk'
id: 7
guid: 6469389792976906412
path: '/dev/sdh1'
whole_disk: 1
DTL: 163
create_txg: 4
children[8]:
type: 'disk'
id: 8
guid: 11017248821379080310
path: '/dev/sdk1'
whole_disk: 1
not_present: 1
DTL: 160
create_txg: 4
offline: 1
children[9]:
type: 'disk'
id: 9
guid: 2056055545907538536
path: '/dev/sdl1'
whole_disk: 1
not_present: 1
DTL: 159
create_txg: 4
offline: 1
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
答案1
为了在 ZFS 中再次使用同一驱动器,如果您确定磁盘没有故障,对驱动器的前 10 GB 执行 DD 是一个好的开始,但您也需要在驱动器的末尾执行此操作。但不需要DD 10 GB,我相信第一个和最后一个MB就足够了。
我是这样解决的:
dd bs=512 if=/dev/zero of=/dev/sdk count=2048 seek=$(($(blockdev --getsz /dev/sdk) - 2048))
dd bs=512 if=/dev/zero of=/dev/sdk count=2048
然后只需将“新”磁盘添加回 ZFS 池即可。无需标记清除、擦洗、擦拭磁盘。 DD就是你所需要的。您也不应该在 DD 之后对磁盘进行分区。 ZFS 将不接受任何先前分区的磁盘。
然后就zpool replace <pool-name> <old-device> <new-device>
通常是磁盘 ID,并且是 中列出的设备lsblk
。