コンピュータ/ソフトウェア関連Tips

raidzを構成するハードディスクの交換の予行演習

作成日: Jul 19, 2014
カテゴリー: FreeBSD タグ: FreeBSD

raidzを構成するハードディスクの交換の予行演習です。

この記事は、FreeBSDセットアップメモの一部です。

http://hirotomium.com/memories/2011/11/zfsreplace.phpを参考にしました。

1. ステイタスの確認

まずは、現在のzpoolのステイタスを確認します。

$ zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME              STATE     READ WRITE CKSUM
        tank              ONLINE       0     0     0
          raidz1-0        ONLINE       0     0     0
            ada0.nop.eli  ONLINE       0     0     0
            ada1.nop.eli  ONLINE       0     0     0
            ada2.nop.eli  ONLINE       0     0     0
            ada3.nop.eli  ONLINE       0     0     0

errors: No known data errors

ディスク容量は、こんな感じです。テスト用にファイル(55GB分)をコピーしてあります。

$ df -h|grep -e 'Filesystem' -e '/mnt/tank'
Filesystem                                         Size    Used   Avail Capacity  Mounted on
tank                                               7.8T     55G    7.7T     1%    /mnt/tank

2. マシンを停止してハードディスクを1台取り出す

ハードディスク故障をシミュレートするため、マシンを停止して、/dev/ada2を取り出したあとで、マシンの電源をONします。

スクリプトでGEOM ELIで暗号化されたハードディスクをアタッチします。

$ sudo attach_disks.sh
Enter geli passphrase. Your entry would NOT be echobacked.
/dev/ada0.nop: Attaching ...
/dev/ada1.nop: Attaching ...
/dev/ada2.nop: Attaching ...
/dev/ada3.nop: Attaching ...
geli: Cannot read metadata from /dev/ada3.nop: Invalid argument.
Mounting zpool "tank".
Starting samba server.
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.
Starting winbindd.
Following is a result of "ls /dev/ada*.eli" command.
/dev/ada0.nop.eli       /dev/ada1.nop.eli       /dev/ada2.nop.eli
$ zpool status
  pool: tank
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: none requested
config:

        NAME                     STATE     READ WRITE CKSUM
        tank                     DEGRADED     0     0     0
          raidz1-0               DEGRADED     0     0     0
            ada0.nop.eli         ONLINE       0     0     0
            ada1.nop.eli         ONLINE       0     0     0
            9850731337994411417  UNAVAIL      0     0     0  was /dev/ada2.nop.eli
            ada2.nop.eli         ONLINE       0     0     0

errors: No known data errors
$ df -h|grep -e 'Filesystem' -e '/mnt/tank'
Filesystem                                         Size    Used   Avail Capacity  Mounted on
tank                                               7.8T     55G    7.7T     1%    /mnt/tank

ディスクをオフラインにしたいのだが、デイバイスが分からない。試しに、

$ sudo zpool offline 9850731337994411417
missing device name
usage:
        offline [-t] <pool> <device> ...

としてみたが、ダメだった。(あとで見たら、プール名が抜けてる…。ブール名をちゃんとしていたらうまくいってたのか分からないが…)。

抜いたのが/dev/ada2なのに、なぜ、ada2.nop.eliがアタッチされたのか、マシンを再起動して、BIOSをチェックしたところ、

1st Drive  [HDD:P5-HDT722525DL]
2nd Drive  [HDD:P0-WDC WD30EZR]
3rd Drive  [HDD:P1-WDC WD30EZR]
4th Drive  [HDD:P3-WDC WD30EZR]

となっており、もとの/dev/ada3が、/dev/ada2として認識されているようだった。ada0、ada1、ada3を取り出し、ada2のみの状態にして、Fedora 20をインストールしたUSB SSDからブートして、パーティションテーブルを初期化…しようと思ったのだが、方法が分からなかった。仕方なく、FreeBSDにてブート。ブート後のドライブは、

$ ls /dev/ada*
/dev/ada0       /dev/ada1       /dev/ada1p1     /dev/ada1p3     /dev/ada1p5
/dev/ada0.nop   /dev/ada1.nop   /dev/ada1p2     /dev/ada1p4

という状態。ada0が、元のada2。

$ sudo gpart destroy -F ada0
gpart: arg0 'ada0': Invalid argument

$ gpart show -l ada0
gpart: No such geom: ada0.
$ sudo gpart create -s GPT ada0
ada0 created

$ gpart show -l ada0
=>        34  5860533101  ada0  GPT  (2.7T)
          34  5860533101        - free -  (2.7T)
$ sudo gpart destroy -F ada0
ada0 destroyed

これで、元ada2のハードディスクが初期化された。

3. 新品のハードディスクに交換したことを模擬

ada0、ada1、ada2、ada3を元に戻して、ブート。その際、BIOSの、HDD起動順位を確認。

1st Drive  [HDD:P2-WDC WD30EZR]
2nd Drive  [HDD:P0-WDC WD30EZR]
3rd Drive  [HDD:P5-HDT722525DL]
4th Drive  [HDD:P1-WDC WD30EZR]
5th Drive  [HDD:P3-WDC WD30EZR]

のようになっていたので、

1st Drive  [HDD:P5-HDT722525DL]
2nd Drive  [HDD:P0-WDC WD30EZR]
3rd Drive  [HDD:P1-WDC WD30EZR]
4th Drive  [HDD:P2-WDC WD30EZR]
5th Drive  [HDD:P3-WDC WD30EZR]

に直した。これで、スクリプトを使ってアタッチ。

$ sudo attach_disks.sh
Enter geli passphrase. Your entry would NOT be echobacked.
/dev/ada0.nop: Attaching ...
/dev/ada1.nop: Attaching ...
/dev/ada2.nop: Attaching ...
geli: Cannot read metadata from /dev/ada2.nop: Invalid argument.
/dev/ada3.nop: Attaching ...
Mounting zpool "tank".
Starting samba server.
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.
Starting winbindd.
Following is a result of "ls /dev/ada*.eli" command.
/dev/ada0.nop.eli       /dev/ada1.nop.eli       /dev/ada3.nop.eli
$ zpool status
  pool: tank
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: none requested
config:

        NAME                     STATE     READ WRITE CKSUM
        tank                     DEGRADED     0     0     0
          raidz1-0               DEGRADED     0     0     0
            ada0.nop.eli         ONLINE       0     0     0
            ada1.nop.eli         ONLINE       0     0     0
            9850731337994411417  UNAVAIL      0     0     0  was /dev/ada2.nop.eli
            ada3.nop.eli         ONLINE       0     0     0

errors: No known data errors
$ df -h|grep -e 'Filesystem' -e '/mnt/tank'
Filesystem                                         Size    Used   Avail Capacity  Mounted on
tank                                               7.8T     55G    7.7T     1%    /mnt/tank
$ ls /dev/ada2*
/dev/ada2       /dev/ada2.nop

これで、ada2に新品のハードディスクが挿入された状態(と同等)になった。

4. GEOM ELIで暗号化

ada2をGEOM ELIで暗号化する。キーファイルとパスフレーズは初期段階で使用したものと同じにする。間違ってada0、ada1、ada3とかを初期化してしまわないように注意。(この点では、他のドライブを抜いた状態でGEOM ELI暗号化するのが手順としては正しかったかもしれない。)

$ sudo geli init -l 256 -s 4096 -K /root/.geli/geli.key /dev/ada2.nop
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/ada2.nop.eli and
can be restored with the following command:

        # geli restore /var/backups/ada2.nop.eli /dev/ada2.nop

5. ハードディスクのアタッチ

ada2のみを手動でアタッチしてみる。

$ sudo geli attach -k /root/.geli/geli.key /dev/ada2.nop
Enter passphrase:
$ zpool status

してみたが、ステイタスに変化は無い。(zpoolを構成するデバイスにada2.nop.eliが表示されることは無かった)。

他のハードディスクも含めてアタッチするために、再起動して、スクリプト実行。

あとから考えると、これは省略して、6に進んで良かったように思う。

$ sudo attach_disks.sh
Enter geli passphrase. Your entry would NOT be echobacked.
/dev/ada0.nop: Attaching ...
/dev/ada1.nop: Attaching ...
/dev/ada2.nop: Attaching ...
/dev/ada3.nop: Attaching ...
Mounting zpool "tank".
Starting samba server.
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.
Starting winbindd.
Following is a result of "ls /dev/ada*.eli" command.
/dev/ada0.nop.eli       /dev/ada2.nop.eli
/dev/ada1.nop.eli       /dev/ada3.nop.eli
$ zpool status
  pool: tank
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: none requested
config:

        NAME                     STATE     READ WRITE CKSUM
        tank                     DEGRADED     0     0     0
          raidz1-0               DEGRADED     0     0     0
            ada0.nop.eli         ONLINE       0     0     0
            ada1.nop.eli         ONLINE       0     0     0
            9850731337994411417  UNAVAIL      0     0     0  was /dev/ada2.nop.eli
            ada3.nop.eli         ONLINE       0     0     0

errors: No known data errors

6. 入れ替えたハードディスクをオンラインにする

ada2.nop.eliをオンラインにする。

$ sudo zpool online tank ada2.nop.eli
warning: device 'ada2.nop.eli' onlined, but remains in faulted state
use 'zpool replace' to replace devices that are no longer present
$ zpool status
  pool: tank
 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://illumos.org/msg/ZFS-8000-4J
  scan: scrub in progress since Sun Jul 20 12:49:11 2014
        2.88G scanned out of 75.1G at 81.9M/s, 0h15m to go
        0 repaired, 3.84% done
config:

        NAME                     STATE     READ WRITE CKSUM
        tank                     DEGRADED     0     0     0
          raidz1-0               DEGRADED     0     0     0
            ada0.nop.eli         ONLINE       0     0     0
            ada1.nop.eli         ONLINE       0     0     0
            9850731337994411417  UNAVAIL      0     0     0  was /dev/ada2.nop.eli
            ada3.nop.eli         ONLINE       0     0     0

errors: No known data errors

7. リプレース

$ sudo zpool replace tank ada2.nop.eli

コマンドは比較的短時間で終了して、プロンプトが表示された。

8. Resilver中のステイタス

Resilver中のステイタスを確認してみる。

$ zpool status
  pool: tank
 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 Jul 20 12:51:47 2014
        926M scanned out of 75.1G at 61.7M/s, 0h20m to go
        230M resilvered, 1.20% done
config:

        NAME                       STATE     READ WRITE CKSUM
        tank                       DEGRADED     0     0     0
          raidz1-0                 DEGRADED     0     0     0
            ada0.nop.eli           ONLINE       0     0     0
            ada1.nop.eli           ONLINE       0     0     0
            replacing-2            UNAVAIL      0     0     0
              9850731337994411417  UNAVAIL      0     0     0  was /dev/ada2.nop.eli/old
              ada2.nop.eli         ONLINE       0     0     0  (resilvering)
            ada3.nop.eli           ONLINE       0     0     0

errors: No known data errors

マウント状況も確認してみる。

$ df -h|grep -e 'Filesystem' -e '/mnt/tank'
Filesystem                                         Size    Used   Avail Capacity  Mounted on
tank                                               7.8T     55G    7.7T     1%    /mnt/tank

WindowsマシンからSambaでアクセスしてみるが、特に問題無し。

9. 終了

$ zpool status
  pool: tank
 state: ONLINE
  scan: resilvered 18.8G in 0h20m with 0 errors on Sun Jul 20 13:12:17 2014
config:

        NAME              STATE     READ WRITE CKSUM
        tank              ONLINE       0     0     0
          raidz1-0        ONLINE       0     0     0
            ada0.nop.eli  ONLINE       0     0     0
            ada1.nop.eli  ONLINE       0     0     0
            ada2.nop.eli  ONLINE       0     0     0
            ada3.nop.eli  ONLINE       0     0     0

errors: No known data errors

2の段階で、ディスクをオフラインに出来たのかどうか分からずじまいなのが残念。(もう一度予行演習するのもなぁ…。)