ここのことはなかったことにするかもしれない

仕事がらみの記事を主として扱いますが、あくまで個人ブログです。2013年以前の記事は https://yellow-73.hatenablog.com/ にあります。

ZFSに参加するHDDが壊れたので換装した

はじめに

3TのHDD4本でRAIDZ1(ZFS RAID5相当)を組んでいたところ、0はじまりで2番目のハードディスク(左から3個目)がぶっとびましたので、換装しました。HDDが壊れてから放置したためか、回復不能のエラーが結構出ました(削除で対応)。

HDD換装自体は問題ないのでパス。新HDDをZFSに参加させるところからのメモです。

パーティション

https://boiledorange73.hatenablog.com/entry/2014/10/01/000000あたりを参照して下さい。p0にブートコード、p1にキャッシュファイルを保存するためのUFS、p2にZFS、としています。

換装直後

ハードディスクデバイスがどのように見えているかを確認します。

% gpart show
=>        34  5860533101  mfisyspd0  GPT  (2.7T)
          34         128          1  freebsd-boot  (64K)
         162       16384          2  freebsd-ufs  (8.0M)
       16546  5860516589          3  freebsd-zfs  (2.7T)

...

=>        34  5860533101  mfisyspd2  GPT  (2.7T)
          34  5860533101             - free -  (2.7T)

mfisyspd2は完全フリーになっています。

freebsd-boot, freebsd-ufs, frrebsd-zfs を順次追加していきます

gpart create -s gpt /dev/mfisyspd2

ブートパーティション作成とブートコード書き込みます。

gpart add -s 64K -t freebsd-boot /dev/mfisyspd2
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/mfisyspd2

キャッシュ保存用ファイルシステムを作成し、disk0から複製します。

gpart add -s 8M -t freebsd-ufs /dev/mfisyspd2
newfs /dev/mfisyspd2p2
mkdir /tmp/cachefile/disk2
mount /dev/mfisyspd2p2 /tmp/cachefile/disk2

mkdir /tmp/cachefile/disk0
mount /dev/mfisyspd0p2 /tmp/cachefile/disk0
cp /tmp/cachefile/disk0/rpool.cache /tmp/cachefile/disk2/

zfsパーティションを作ります。

gpart add -t freebsd-zfs -l disk2 /dev/mfisyspd2

パーティションを参加させます。ZFSに参加させます。

zpool replace rpool gpt/disk2

ここで、リシルバー(resilver)がはじまり、かなりな時間放置しておきます。


リシルバーが終わると次のようなかんじになります。

% zpool status
...
config:

        NAME                        STATE     READ WRITE CKSUM
        rpool                       DEGRADED     0     0    47
          raidz1-0                  DEGRADED     0     0   214
            gpt/disk0               ONLINE       0     0     0
            gpt/disk1               ONLINE       0     0     0
            replacing-2             DEGRADED     0     0     0
              10647845673521159683  UNAVAIL      0     0     0  was /dev/gpt/disk2/old
              gpt/disk2             ONLINE       0     0     0
            gpt/disk3               ONLINE      47     0     0

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

UNAVAILなものはdetachで排除しました。

% zpool detach rpool 10647845673521159683

なお、de-touchではありません。

回復不能なエラーがいっぱいでている

実は今回は、回復不能なエラーがいっぱい出てました。

% zpool status
  pool: rpool
 state: DEGRADED
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://illumos.org/msg/ZFS-8000-8A
  scan: resilvered 337G in 12h1m with 52 errors
config:
...


エラーが52個も出ていることに対応します。

zpool status -v rpool

これで壊れたファイル一覧がずらっと出ます。なお、catなりでファイルを開こうとしたらI/Oエラーで失敗しました。

幸運なことに、ファイルは上書きしてOKなものだったので、ファイルを削除して、エラーは上書きすれば消えてしまいました。

あらためて様子を見てみましょう。

% zpool status
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://illumos.org/msg/ZFS-8000-8A
  scan: resilvered 337G in 12h1m with 52 errors
...
errors: List of errors unavailable (insufficient privileges)

…なおactionセクションが出ています。

問題はクリアされた(強制リセットみたいなかんじでしたが)ので、どうにかしたい。

zpool clear rpool

これでエラーがクリアされるはずだけどダメ。

困った末、結局、次のコマンドでクリアされました。

reboot

リブートで良かったのか…。