HDDがいっぱいになってきたので容量の大きい別のHDDに移した。
zfsなのでmirrorをしつつ入れ替えができる。
その時のメモ。

端的に言えばディスク交換後zpool online -eをすればよい。
以下、経緯。

ディスク追加

2.5TのHDD, ada1上に作られたzpool、vaultがあり、残容量は150Gである。
もともとzfsは残容量が少なくなると格段にパフォーマンスが落ちると言われていて、これはちょっと危険な状態である。

  
ada1 at ahcich1 bus 0 scbus1 target 0 lun 0  
ada1: <WDC WD25EZRX-00MMMB0 80.00A80> ATA8-ACS SATA 3.x device  
ada1: Serial Number WD-WMAWZ0230443  
ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)  
ada1: Command Queueing enabled  
ada1: 2384658MB (4883781168 512 byte sectors)  
ada1: quirks=0x1<4K>

# zpool status  
pool: vault  
state: ONLINE  
scan: none requested  
config:

NAME STATE READ WRITE CKSUM  
vault ONLINE 0 0 0  
gpt/disk_01 ONLINE 0 0 0

# zfs list  
NAME USED AVAIL REFER MOUNTPOINT  
vault 2.05T 150G 88K /vault  
vault/chamber 1017G 150G 1017G /chamber  
vault/itunes 1.06T 150G 1.05T /itunes

そこで、zpoolにmirrorとして容量の大きいディスクを追加し、その後オリジナルのディスクを外す、という手順。

追加するのは以下のディスク。3T。
2.5Tから3Tじゃ焼け石に水ですがね…。

ada2 at ahcich2 bus 0 scbus2 target 0 lun 0  
ada2: <WDC WD30EZRX-00D8PB0 80.00A80> ACS-2 ATA SATA 3.x device  
ada2: Serial Number WD-WMC4N0765033  
ada2: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)  
ada2: Command Queueing enabled  
ada2: 2861588MB (5860533168 512 byte sectors)  
ada2: quirks=0x1<4K>

既存のzpoolにmirrorとしてディスクを追加するには、zpool attachを使う。
zpool attachに続けてzpool名、既存ディスク、追加ディスクの順で指定。
以下の例では、ディスクの指定をada2などのデバイス名ではなくGPT名で行っている。

# zpool attach vault gpt/disk_01 gpt/disk_02

以下のようにzpoolがmirror構成になり、resilveringが始まる。

  
# zpool status  
pool: vault  
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.  
scrub: resilver in progress for 0h0m, 0.01% done, 7h1m to go  
config:

NAME STATE READ WRITE CKSUM  
vault ONLINE 0 0 0  
mirror-0 ONLINE 0 0 0  
gpt/disk_01 ONLINE 0 0 0  
gpt/disk_02 ONLINE 0 0 0

しばらく待つと;

pool: vault  
state: ONLINE  
scan: resilvered 2.04T in 6h48m with 0 errors on Sun Dec 16 19:15:11 2018  
config:

NAME STATE READ WRITE CKSUM  
vault ONLINE 0 0 0  
mirror-0 ONLINE 0 0 0  
gpt/disk_01 ONLINE 0 0 0  
gpt/disk_02 ONLINE 0 0 0

resilvering終了。

旧ディスクの除去

2.5Tと3Tのディスクでmirrorを構成しているので、当然ながら残容量に変化はない。

NAME USED AVAIL REFER MOUNTPOINT  
vault 2.05T 150G 88K /vault  
vault/chamber 1017G 150G 1017G /chamber  
vault/itunes 1.06T 150G 1.05T /itunes

では旧ディスクを外す。
mirrorからディスクを外すにはdetachを使う。
zpool detachに続けてzpool名、ディスク名を指定。

  
# zpool detach vault gpt/disk_01  
# zpool status  
pool: vault  
state: ONLINE  
scan: resilvered 2.04T in 6h48m with 0 errors on Sun Dec 16 19:15:11 2018  
config:

NAME STATE READ WRITE CKSUM  
vault ONLINE 0 0 0  
gpt/disk_02 ONLINE 0 0 0

errors: No known data errors

ご覧の通りmirror構成が解除される。

容量の拡張

さてこの状態ではまだ残容量が増えない。

  
NAME USED AVAIL REFER MOUNTPOINT  
vault 2.05T 150G 88K /vault  
vault/chamber 1017G 150G 1017G /chamber  
vault/itunes 1.06T 150G 1.05T /itunes

ただ物理ディスクは3Tなので、zpoolに「安心して容量を増やしたまえ」と通知する。
通知にはzpool online -eを使う。
zpool onlineは物理ディスクを有効にするコマンドだが、-eを付ければ、使用可能な領域をすべて使うようにできる。
manを以下に引用する。

  
zpool online [-e] pool device ...

Brings the specified physical device online.

This command is not applicable to spares or cache devices.

-e Expand the device to use all available space. If the device  
is part of a mirror or raidz then all devices must be  
expanded before the new space will become available to the  
pool.

ご覧の通り残容量が増えた。
たったの450Gだけど。

# zpool online -e vault gpt/disk_02  
$ zfs list  
NAME USED AVAIL REFER MOUNTPOINT  
vault 2.05T 599G 88K /vault  
vault/chamber 1017G 599G 1017G /chamber  
vault/itunes 1.06T 599G 1.05T /itunes