TrueNASのブートドライブを移行する

#truenas

fuji44

これまでTrueNASのbootドライブにSDカードを使用していました。 ですが、これはあまり推奨されておらず、SSDに移行することにしました。

ここでは、移行した際の手順をメモしておきます。

大まかな流れ

大半の作業はTrueNASではなく、Ubuntu 20.04のライブイメージで行います。 これは、TrueNASのブートドライブを書き換えるため、TrueNAS自身では行えないためです。

作業に使うはUbuntuでなくてもよいですが、ほかのディストリビューションを使う場合は、 gpartzpool 等のコマンドが利用できる必要があります。

SDカードのデータをそのままSSDにコピーする

まず、移行先のSSDは全体を空の状態でフォーマットしておきます。 次に、移行元のSDカードと移行先のSSDを同じデバイスに接続して、Ubuntuを起動します。 起動出来たら、dd コマンドでSDカードの内容をそのままSSDにコピーします。 移行元の領域全体をそっくりそのままコピーするので、移行先の容量が移行元よりも小さいとだめです。

SD、SSDのデバイスファイルは lsblk などで確認してください。 この例ではそれぞれ /dev/sdg/dev/sdf です。 bsstatus オプションは任意。

sudo dd if=/dev/sdg of=/dev/sdf bs=1k status=progress

SSDのGPTパーティションを拡張する

コピーが完了したらもう元のSDカードは使わないので取り外します。 次にコピー先のSSDをブートドライブとして指定し、TrueNASを起動します。 うまくコピーできていればSDカードでブートした時とまったく同じ状態で起動できるはずです。

起動出来たら、SSDのGPTパーティションを見てみます。 SSDのデバイス名を指定する必要がるので、 gpart list などで事前に確認します。

# gpart show ada0
=>      40  30375856  ada0  GPT  (119G) [CORRUPT]
        40      1024     1  freebsd-boot  (513k)
      1624  30374832     2  freebsd-zfs  (14G)

実行してみると [CORRUPT] という表示が見えます。これはGPTの状態がおかしいことを表しているようです。 内容を見ると、全体サイズが119Gであるのに、513kと14Gの2つのパーティションしか表示されません。 正常であればfreebsd-zfsの後に残りのサイズのFreeのパーティションが表示されるはずです。 これはSDカードのデータをそのままコピーしたため、GPTのメタデータがそのままになっているためです。

これを解消するのは以下のコマンドを実行するだけです。

# gpart recover ada0
ada0 recovered

実行後に再度 gpart show するとフリーのパーティションが認識されるようになります。

# gpart show ada0
=>       40  250069600  ada0  GPT  (119G)
         40       1024     1  freebsd-boot  (512K)
       1064   30374832     2  freebsd-zfs  (14G)
   30375896  219693744        - free -  (105G)

GPTが正常になったので、フリーの部分をつかって第2パーティションを拡張します。

# gpart resize -i 2 ada0
ada0p2 resized

完了後に再度 gpart show を表示します。 フリーパーティションがなくなり、第2パーティションが拡張されているはずです。

# gpart show ada0
=>       40  250069600  ada0  GPT  (119G)
         40       1024     1  freebsd-boot  (512K)
       1064  250068576     2  freebsd-zfs  (119G)

ZFSプールを拡張する

GPTパーティションを拡張しても、ZFSのプールを拡張しなければ使えません。 現在のプールサイズを見ると、小さいままです。

# zpool list
NAME           SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
freenas-boot    14G  4.66G  9.34G        -         -      -    33%  1.00x    ONLINE  -
pool1           29T  21.6T  7.40T        -         -     8%    74%  1.00x    ONLINE  /mnt

プールを拡張するには、 zpool online -e <pool> <device> コマンドを実行します。 プール名は zpool list のNAMEでもわかります。 deviceは、 zpool status で確認します。プール名の下に表示されているのがdeviceです。

# zpool status
  pool: freenas-boot
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
        still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
        the pool may no longer be accessible by software that does not support
        the features. See zpool-features(5) for details.
  scan: scrub repaired 0B in 00:20:19 with 0 errors on Thu Dec 17 04:05:20 2020
config:

        NAME                                          STATE     READ WRITE CKSUM
        freenas-boot                                  ONLINE       0     0     0
          gptid/c3d3ca0d-1f9b-11e9-85fe-c4346b21cd80  ONLINE       0     0     0

errors: No known data errors

  pool: pool1
 state: ONLINE

...

あとは、

# zpool online -e freenas-boot gptid/c3d3ca0d-1f9b-11e9-85fe-c4346b21cd80

ディスク名を確認する

geom disk list

移行先ディスクをスペアとして追加 https://docs.oracle.com/cd/E19253-01/819-6260/gcvcw/index.html

zpool add freenas-boot spare ada0

追加を確認。追加したデバイスが AVAIL になっていたらOK。

# zpool status freenas-boot
  pool: freenas-boot
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
        still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
        the pool may no longer be accessible by software that does not support
        the features. See zpool-features(5) for details.
  scan: scrub repaired 0B in 00:20:19 with 0 errors on Thu Dec 17 04:05:20 2020
config:

        NAME          STATE     READ WRITE CKSUM
        freenas-boot  ONLINE       0     0     0
          da4p2       ONLINE       0     0     0
        spares
          ada0        AVAIL

errors: No known data errors

リプレースする。 INUSE になって、しばらくするとデータが同期され始める。

# zpool replace freenas-boot da4p2 ada0
# zpool status freenas-boot
  pool: freenas-boot
 state: ONLINE
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 Sat Dec 19 18:17:53 2020
        4.66G scanned at 9.33M/s, 2.63G issued at 5.26M/s, 4.66G total
        2.74G resilvered, 56.39% done, no estimated completion time
config:

        NAME          STATE     READ WRITE CKSUM
        freenas-boot  ONLINE       0     0     0
          spare-0     ONLINE       0     0     0
            da4p2     ONLINE       0     0     0
            ada0      ONLINE       0     0     0  (resilvering)
        spares
          ada0        INUSE     currently in use

errors: No known data errors

同期が完了したら元のストレージを切り離す。

# zpool detach freenas-boot da4p2
# zpool status freenas-boot
  pool: freenas-boot
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
        still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
        the pool may no longer be accessible by software that does not support
        the features. See zpool-features(5) for details.
  scan: resilvered 4.91G in 00:16:13 with 0 errors on Sat Dec 19 18:34:06 2020
config:

        NAME          STATE     READ WRITE CKSUM
        freenas-boot  ONLINE       0     0     0
          ada0        ONLINE       0     0     0

errors: No known data errors