ZFS Ubuntu 16.04 用自身替换驱动器

ZFS Ubuntu 16.04 用自身替换驱动器

我是 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

相关内容