ZFSでディスクをreplaceしようとして「(ディスク名) is part of active pool ‘プール名’」のエラーがでた

環境

  • Ubuntu 18.04

事象の発生

ZFSでプールを作成するときにディスクのパスを/dev/disk/by-id/*の永続名で指定するの忘れていて、/dev/sdj1みたいに指定しちゃってた。

$ sudo zpool status -v
 pool: rpool
 state: ONLINE
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: scrub repaired 384K in 33h36m with 2 errors on Mon Oct 15 10:00:35 2018
config:

        NAME                                          STATE     READ WRITE CKSUM
        rpool                                         ONLINE       0     0     0
          raidz1-0                                    ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
          raidz1-2                                    ONLINE       0     0     0
            sdf1                                      ONLINE       0     0     0
            sdi1                                      ONLINE       0     0     0
            sdj1                                      ONLINE       0     0     0
        logs
          mirror-1                                    ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx           ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx           ONLINE       0     0     0
        cache
          sda                                         ONLINE       0     0     0

errors: 1 data errors, use '-v' for a list

しばらくしてから新しいHDDを追加した際にSATAポートを繋ぎ変えてしまい、/dev/sdj1→/dev/sdh1とパスが変わってプールから見えなくなってしまった。

$ sudo zpool status -v
  pool: rpool
 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 in progress since Tue Nov 13 21:59:11 2018
        32.2G scanned out of 20.2T at 192M/s, 30h36m to go
        0B repaired, 0.16% done
config:

        NAME                                          STATE     READ WRITE CKSUM
        rpool                                         DEGRADED     0     0     0
          raidz1-0                                    ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
          raidz1-2                                    ONLINE       0     0     0
            sdf1                                      ONLINE       0     0     0
            sdi1                                      ONLINE       0     0     0
            1896067203366565522                       UNAVAIL      0     0     0  was /dev/sdj1
        logs
          mirror-1                                    ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx           ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx           ONLINE       0     0     0
        cache
          sda                                         ONLINE       0     0     0

errors: No known data errors

対応

で、replaceすればいい話だし、どうせなら永続名に変えとこうとか思っていたら以下のようにエラーが出てreplaceできない。

$ sudo zpool replace -f rpool 1896067203366565522 ata-WDC_WD40EFRX-68N32N0_WD-xxx
invalid vdev specification
the following errors must be manually repaired:
/dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-xxx-part1 is part of active pool 'rpool'

ディスクのどっかの情報を見て、どこかのプール所属だと消せないようになってるらしい。
事故防止になるし、まあいいと思う。

メッセージでググってみると、「zpool labelclearコマンド」でディスクからラベル情報が消せるらしいのでやってみる。
(参考)ZFSで使ったことがあるHDD/SSDを再利用する時はzpool labelclearすべき

$ sudo zpool labelclear -f /dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-xxx
/dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-xx is a member (ACTIVE) of pool "rpool"

怒られた。
プールに所属している情報を消してやり直したいのに、所属しているから消せない理不尽。

さらにググったらddコマンドで直接的にディスクから情報を上書き削除している記述がったので真似してみる。
(参考)RAIDZ1: unable to replace a drive with itself

sudo dd if=/dev/zero of=/dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-xxx bs=64M count=10

これで都合の悪い部分が削除できたらしく、replaceできるようになった。

sudo zpool replace rpool /dev/sdj1 ata-WDC_WD40EFRX-68N32N0_WD-xxx

リプレースしてるところ。

$ sudo zpool status -v
  pool: rpool
 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 Tue Nov 13 22:07:28 2018
        4.57T scanned out of 20.2T at 1.47G/s, 3h1m to go
        149G resilvered, 22.59% done
config:

        NAME                                            STATE     READ WRITE CKSUM
        rpool                                           DEGRADED     0     0     0
          raidz1-0                                      ONLINE       0     0     0
            ata-ST8000DM004-xxx                         ONLINE       0     0     0
            ata-ST8000DM004-xxx                         ONLINE       0     0     0
            ata-ST8000DM004-xxx                         ONLINE       0     0     0
          raidz1-2                                      DEGRADED     0     0     0
            sdf1                                        ONLINE       0     0     0
            sdi1                                        ONLINE       0     0     0
            replacing-2                                 DEGRADED     0     0     0
              1896067203366565522                       UNAVAIL      0     0     0  was /dev/sdj1
              ata-WDC_WD40EFRX-68N32N0_WD-xxx           ONLINE       0     0     0  (resilvering)
        logs
          mirror-1                                      ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx             ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx             ONLINE       0     0     0
        cache
          sda                                           ONLINE       0     0     0

errors: No known data errors

コメント