10GBASE-T化に先立ち、サーバ(FreeBSD)⇔外部ストレージ間の接続をe-SATAからUSB3.0に変更した際のメモ。

接続方式変更に伴う追加作業

ほぼ必要なし。実質的にはコマンド2つで完了。

  1. ストレージ上のZPOOLをエクスポート(zpool export)
$ zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zpool0  10.9T  5.16T  5.72T        -         -    12%    47%  1.00x  ONLINE  -
zroot    696G  7.89G   688G        -         -     1%     1%  1.00x  ONLINE  -
$ sudo zpool export zpool0
$ zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot    696G  7.89G   688G        -         -     1%     1%  1.00x  ONLINE  -
  1. 接続方式変更(ケーブル差し替え、差し替え後の外部ストレージ認識確認など)

  2. ストレージ上のZPOOLをインポート(zpool import)

$ sudo zpool import zpool0
$ zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zpool0  10.9T  5.16T  5.72T        -         -    12%    47%  1.00x  ONLINE  -
zroot    696G  7.89G   688G        -         -     1%     1%  1.00x  ONLINE  -
  1. (必要に応じて)OS再起動
$ sudo reboot

この「接続方式(デバイス名)の違いをコマンドレベルでほぼ隠蔽できる」ってのはZFSの強みよね。普通は変更後のデバイス名を調べて必要に応じて設定変更してインポートって流れかと思うのだけど、そのへんを全部ZFS側でやってくれるのは大変ありがたい。ちなみに、外部ストレージケース(筐体)も過去2回ほどリプレースしているけど基本的に全く同じ流れでOK。

OS再起動自体は不要だけど、今までeSATA(adaX)として見えていたものがUSB(daX)に変更される関係で、他SATA接続デバイス名が次回OS起動タイミングでずれる場合があるため再起動しておいた方が無難。当環境ではSWAP領域をルートディスクのパーティションとして直に指定しており、その設定変更も必要なため合わせて対応。こんな感じ。

$ cat /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
# for swap device
/dev/ada1p3             none    swap    sw              0       0
/dev/ada2p3             none    swap    sw              0       0

というかよく考えると、ZFSではデバイス名をあまり意識しなくて良いという趣旨と比較するとスマートじゃないからZFS上にSWAP領域作った方が良い気がするけど、FreeBSDのインストーラでZFSルート構成にするとデフォルトでSWAPパーティション切られたのでそのまま進めちゃった記憶が。。

なお、今回の接続変更後外部ストレージがサーバから認識されない事象が発生。ひょっとしてUSBがお逝きになっている・・?と最初は焦ったものの何のことはなく、USB3.0⇔eSATAの切替を外部ストレージ側で明示的に行う必要があったのを忘れていたというオチ。結果的にこの解決に一番時間がかかった。

SMART情報の取得設定

まず、普通にsmartctlを実行すると情報が取得できない。smartctl はデバイスの種類を自動的に推測してくれるのだが、どうもこの推測が上手くいっていない模様。

$ sudo smartctl -i /dev/da0
smartctl 7.1 2019-12-30 r5022 [FreeBSD 12.1-RELEASE-p5 amd64] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org

/dev/da0: Unknown USB bridge [0x0789:0x0192 (0x205)]
Please specify device type with the -d option.

Use smartctl -h to get a usage summary

USB3.0とeSATA両対応のケースということは中身はSATAだろうと推測して、-dオプションでSATAを指定してみた所、正常に情報が取得できた。

$ sudo smartctl -i -d sat /dev/da0
smartctl 7.1 2019-12-30 r5022 [FreeBSD 12.1-RELEASE-p5 amd64] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Red
Device Model:     WDC WD30EFRX-68EUZN0
Serial Number:    WD-WCC4N0HT7JHC
LU WWN Device Id: 5 0014ee 20af6aaaf
Firmware Version: 82.00A82
User Capacity:    3,000,592,982,016 bytes [3.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5400 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2 (minor revision not indicated)
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Sun Jun  7 20:21:49 2020 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

後はこれを「/etc/periodic.conf」で実施している定期チェックに反映すれば良いのだけど、どうもこの定期チェックを行っているスクリプトでは対応していない模様。conf側で追加設定して対応できればベストだがWEB上にめぼしい情報が見当たらない。定期チェックを実施しているスクリプトの実体は「/usr/local/etc/periodic/daily/smart」とのことなので、中身を見てみる。

: ${daily_status_smartctl_flags="-H"}
: ${daily_status_smartctl_extra_status_flags="-a"}

このへんの変数を「/etc/periodic.conf」で上書き設定してやれば上手くいくかと思ったが、このフラグ設定は全デバイスに画一的に設定されてしまうため他のデバイスでエラーが出たため、結局スクリプト本体を手直しすることにした。devflagsを定義している部分のcase文に以下3行を追加。

da*)    devflags="-d sat"
        device="/dev/${device}"
        ;;</code></pre>

ただ、直接SATA接続しているデバイスと取得できる情報が少し異なり、ヘルスチェック部分の結果が一部正常取得できなかった。そのせいかUSB接続デバイスは定期チェックで行われる「-H」オプションの返り値が0にならず再チェックが行われ、結果的に「-a」オプションの結果が通知されるようになった。(上記「daily_status_smartctl_flags」と「daily_status_smartctl_extra_status_flags」に対応)正直通知結果が微妙に異なるのは嫌なのだけど、スクリプトのロジック部分にまで手を出したくなかったので一旦はこれで妥協。

なお、2個前のエントリで「外部ストレージに一定時間アクセスしていないと勝手にスピンダウンしてしまう事象」は今のところ発生していない。JailとかBhiveで使用する領域を外部ストレージ上にしているのが寄与している?そのへんはこれから経過観察予定。