Re: 起動時に特定のデバイスが 認識されるまでzpoolのimportを待つ 方法

From: Tomoaki AOKI <junchoon_at_dec.sakura.ne.jp>
Date: Mon, 08 Aug 2022 14:01:32 UTC
On Mon, 8 Aug 2022 22:02:39 +0900
freebsdusersjp@t11i.jp wrote:

> 戸川と申します。
> 
> 13.1-RELEASEにおいて、起動時に特定のディスクデバイスが認識されるまで
> zpoolのimportを待つ方法を探しています。
> 
> ----
> 
> 下記のようなディスク環境を使用しています。
> 
> ・FreeBSD 12.3-RELEASE → 13.1-RELEASEにupgrade
> ・Root FS (/usr や /var を含まない):
>      NVMe SSD上のパーティション(UFS)
> ・/usr, /var:
>      HDD 4台(/dev/ada0 - /dev/ada3)で構成されるRAIDZのpool上にあるZFS
> 
> ----
> 
> 12.3-RELEASEを動作させている時点で、既に
> 「起動時に /etc/rc.d/zfs を実行していると思しき時点で、
>    まだ /dev/ada0 等のディスクデバイスが認識されておらず、
>    /usr のマウントに失敗して起動が停止する」
> という現象が発生していました。
> (このRoot FSは、NVMe SSDの前はUSBメモリ上に構築しており、
>   速いNVMe SSDに移した際にこの現象が発生しました)
> 
> この時は、下記のページを参考に、/etc/fstab に
> /usr のマウント指定を書き足す、というworkaroundで解決しました。
> https://lists.freebsd.org/pipermail/freebsd-questions/2013-July/252121.html
> 
> (このあたりの対処は以下のページに書きました。
>   http://toga.vegalta.org/wordpress/2022/01/09/1097 )
> 
> ----
> 
> 13.1-RELEASEにupgradeしたところ、起動時のzpoolのimportが
> /etc/rc.d/zpool から行われるようになったようで、
> このスクリプトが実行される時点で /dev/ada0 等が認識されていないと
> importに失敗するようです。
> 
> 試しにこのスクリプトを編集し、/dev/ada3 が認識されるまで
> sleepするようにしたところ、zpoolのimportに成功しました。
> 
> FreeBSD標準で同じような機能が無いかと思い、お伺いしました。
> 
> 
> よろしくお願いいたします。

テストしてはいませんが思いつくのは、ダミーのスクリプトを
/etc/rc.d/以下に置くことでしょうか。
具体的な書き方の例は`man rc`で見て頂くのと/etc/rc.d/に既にある
スクリプトを見て頂くとして、
 # BEFORE: zpool
を含むのがポイントで、実処理としては必要なデバイスが生えて
いなければループして生えたら脱出、という処理ができる必要が
あるでしょう。

とはいうものの、/usrや/varがroot partitionに無いのは
現実には破滅的な構成です。

/usr/以下については
 local,ports,src,obj(,home)
/var/以下については
 cache,db,games,log,mail,tmp
以外はroot partitionに置くべきでしょう。

 ※/var/以下は、できればtmp以外はroot on ZFSで
  データセットを分ける場合を除いて分けたくない
  ところです。

# 今のところ比較的遅いタイミングで呼ばれるものばかりの
# ようですが、`grep -r "/usr/bin" /rtc/rc.d/`とか
# `grep -r "/usr/sbin" /rtc/rc.d/`とか実行してみると
# それなりの数ヒットしますので、誰かが何かの間違いで
# ごく初期の段階で走るスクリプトで/usr/bin/や/usr/sbin/に
# あるコマンドを呼び出す変更をコミットしてしまうと
# 起動不能に陥る恐れがありますし。


-- 
青木 知明  [Tomoaki AOKI]    <junchoon@dec.sakura.ne.jp>