ZFSのRAIDZの修復とついでに拡張する


ZFSのプールを使っていると、作ったあとにHDDが壊れたり、容量を増加したくなることがあります。その時に、慌てないように事前に調査と演習をしたのでその備忘録的なものをまとめてみました。

容量の拡張は、ZFSでミラー(RAID0)にやったことがあるのですが、RAIDZは初めてです。
普通のRAIDでだと別のRAIDセットを作りコピーするとかが必要になります。
ZFSだと、無停止で拡張できるのではないかと思いブートボリュームでできないかやってみました。

実行環境はXenServer上でFreeBSD 10.3でやってみました。

#準備

1. FreeBSD 10.3を用意する。
2. Boot Volume用として8Gバイトのストレージを3個用意する
3. FreeBSD 10.3のインストラーで自動でRAIDZでZFSを作る

ブートボリュームzrootが/dev/ada[012]で出来ているはずです。

/dev/ada[012]のパーティション情報は以下のようになります。全部同じです。

<pre>
# <B>gpart show ada0</B>
=>      34  16777149  ada0  GPT  (8.0G)
        34         6        - free -  (3.0K)
        40      1024     1  freebsd-boot  (512K)
      1064       984        - free -  (492K)
      2048   4194304     2  freebsd-swap  (2.0G)
   4196352  12578816     3  freebsd-zfs  (6.0G)
  16775168      2015        - free -  (1.0M)
</pre>

zrootは以下のようになっています。

<pre>
# zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot  17.9G  2.47G  15.4G         -     6%    13%  1.00x  ONLINE  -

# <B>zpool status zroot</B>
  pool: zroot
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	zroot       ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada1p3  ONLINE       0     0     0
	    ada2p3  ONLINE       0     0     0

errors: No known data errors
</pre>


<pre>
# <B>zfs list zroot</B>
NAME    USED  AVAIL  REFER  MOUNTPOINT
zroot  1.64G  9.89G   128K  /zroot
ryu@ryu-03[11:55am][~:22] zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
zroot                   1.64G  9.89G   128K  /zroot
zroot/ROOT               852M  9.89G   128K  none
zroot/ROOT/default       851M  9.89G   749M  /
zroot/tmp                128K  9.89G   128K  /tmp
zroot/usr                828M  9.89G   128K  /usr
zroot/usr/home           192K  9.89G   192K  /usr/home
zroot/usr/ports          827M  9.89G   827M  /usr/ports
zroot/usr/src            128K  9.89G   128K  /usr/src
zroot/var                858K  9.89G   128K  /var
zroot/var/audit          128K  9.89G   128K  /var/audit
zroot/var/crash          128K  9.89G   128K  /var/crash
zroot/var/log            218K  9.89G   218K  /var/log
zroot/var/mail           128K  9.89G   128K  /var/mail
zroot/var/tmp            128K  9.89G   128K  /var/tmp

</pre>

また、この際にzootのプロパティ(**autoexpand**)を<b>on</B>にしておきます。

<pre>
# zpool <b>set autoexpand=on</b> zroot

# zpool get autoexpand zroot
NAME   PROPERTY    VALUE   SOURCE
zroot  autoexpand  <b>on</B>      local
</pre>

#障害を起こしてみる

FreeBSDをシャットダウンし、XenServer側で、ストレージを1つはずします。これで3本で作ったRAIDZが、1本壊れた状態になります。

その後、ブートします。

#障害の確認

zpoolで状況を確認すると<B>DEGRADED</B>になっています。また、外したストレージは元はada1の/dev/apa1p3であったことがわかります。


<pre>
# <B>zpool status</B>
  pool: zroot
 state: <B>DEGRADED</B>
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: scrub repaired 0 in 0h0m with 0 errors on Fri Sep 30 12:13:25 2016
config:

	NAME                      STATE     READ WRITE CKSUM
	zroot                     DEGRADED     0     0     0
	  raidz1-0                DEGRADED     0     0     0
	    ada0p3                ONLINE       0     0     0
	    <B>12024642747408500701  UNAVAIL      0     0     0  was /dev/ada1p3</B>
	    ada2p3                ONLINE       0     0     0

errors: No known data errors
</pre>


#修復

新しく12Gのストレージを用意し、アタッチし直します。Xen Toolsが入っていればリブートなしで認識します。

<pre>
xbd2: 12288MB <Virtual Block Device> at device/vbd/832 on xenbusb_front0
xbd2: attaching as <B>ada1</B>
xbd2: features: write_barrier
xbd2: synchronize cache commands enabled.
</pre>

ada1として認識したようです。

##GPIDパーティションを作成

GPIDパーティションとして/dev/ada1p3を作成するのですが、ブートボリュームなのでブートセクター/ブートローダーの辻褄を合わせる必要があります。

GPIDパーティションの設定は、<B>gpart</B>で行います。

<pre>
# gpart create -s gpt ada1
ada1 created

# gpart add -b 40 -s 512k -t freebsd-boot -l gptboot1 ada1
ada1p1 added

# gpart add -b 2048 -s 2g -t freebsd-swap ada1
ada1p2 added

# gpart add -t freebsd-zfs ada1              
ada1p3 added

# gpart show ada1
=>      34  25165757  ada1  GPT  (12G)
        34         6        - free -  (3.0K)
        40      1024     1  freebsd-boot  (512K)
      1064       984        - free -  (492K)
      2048   4194304     2  freebsd-swap  (2.0G)
   4196352  20969439     3  freebsd-zfs  (10G)

</pre>

物理的なHDDを考えてるようで、4Kアライメントしていますが、論理的なストレージなので新しく追加するストレージは、アライメントを無視しました。

<pre>
# gpart create -s gpt ada1
ada1 created

# gpart add -b 34 -s 512k -t freebsd-boot -l gptboot1 ada1
ada1p1 added

# gpart add -s 2g -t freebsd-swap ada1        
ada1p2 added

# gpart add -t freebsd-zfs ada1                       
ada1p3 added

# gpart show ada1
=>      34  25165757  ada1  GPT  (12G)
        34      1024     1  freebsd-boot  (512K)
      1058   4194304     2  freebsd-swap  (2.0G)
   4195362  20970429     3  freebsd-zfs  (10G)

</pre>

<pre>
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
</pre>

#ZFSの修復

zpool replace で壊れたストレージを新しいストレージに交換します。

<pre>
# zpool replace zroot /dev/ada1p3 /dev/ada1p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk '/dev/ada1p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

	gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
	
</pre>

うまくいったみたいですね。

<pre>
# zpool status
  pool: zroot
 state: <B>DEGRADED</B>
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: <B>resilver in progress since Fri Sep 30 17:01:55 2016
        1.78G scanned out of 2.47G at 39.7M/s, 0h0m to go
        596M resilvered, 72.29% done</B>
config:

	NAME                        STATE     READ WRITE CKSUM
	zroot                       DEGRADED     0     0     0
	  raidz1-0                  DEGRADED     0     0     0
	    ada0p3                  ONLINE       0     0     0
	    <B>replacing-1             UNAVAIL      0     0     0
	      12024642747408500701  UNAVAIL      0     0     0  was /dev/ada1p3/old
	      ada1p3                ONLINE       0     0     0  (resilvering)</B>
	    ada2p3                  ONLINE       0     0     0

errors: No known data errors

</pre>

RAIDの再構築が始まっています。

**注意 この状態が終わるまでストレージを抜いたりしてはいけません。データが壊れます**

しばらくすると直りました。

<pre>
# zpool status
  pool: zroot
 state: ONLINE
  scan: <B>resilvered 828M in 0h1m with 0 errors on Fri Sep 30 17:03:08 2016</B>
config:

	NAME        STATE     READ WRITE CKSUM
	zroot       ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada1p3  ONLINE       0     0     0
	    ada2p3  ONLINE       0     0     0

errors: No known data errors

</pre>

この状態になれば、2本も順次、12Gのストレージに差し替えて行きます。

今度は、二本同時に接続しました。

<pre>
xbd4: 12288MB <Virtual Block Device> at device/vbd/51776 on xenbusb_front0
xbd4: features: write_barrier
xbd4: synchronize cache commands enabled.
xbd5: 12288MB <Virtual Block Device> at device/vbd/51792 on xenbusb_front0
xbd5: features: write_barrier
xbd5: synchronize cache commands enabled.
</pre>

各々、xbd4/xbd5として認識したようです。

2本目を交換すると

<pre>
# zpool list -v zroot
NAME                        SIZE  ALLOC   FREE  <B>EXPANDSZ</B>   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot                      17.9G  2.47G  15.4G     <b>12.0G</b>     6%    13%  1.00x  DEGRADED  -
  raidz1                   17.9G  2.47G  15.4G     <b>12.0G</b>     6%    13%
    ada2p3                     -      -      -         -      -      -
    replacing                  -      -      -         -      -      -
      1209515388400427438      -      -      -         -      -      -
      ada1p3                   -      -      -         -      -      -
    ada0p3                     -      -      -         -      -      -
</pre>

とEXPANDSZに増加分の容量が出てきました。

最終的には、以下のようにRAIDZの容量が増えています。

<PRE>
# zpool list -v zroot
NAME         SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot       <B>29.9G</B>  2.47G  27.4G         -     3%     8%  1.00x  ONLINE  -
  raidz1    <B>29.9G</B>  2.47G  27.4G         -     3%     8%
    ada2p3      -      -      -         -      -      -
    ada1p3      -      -      -         -      -      -
    ada0p3      -      -      -         -      -      -
</PRE>


#まとめ

ZFSを使うと簡単に容量を増やすことができるので、小さめにとっておいて順次拡張も今までに比べて容易になっています。