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

From: <freebsdusersjp_at_t11i.jp>
Date: Fri, 12 Aug 2022 11:14:35 UTC
戸川です。

青木さん、佐藤さん、ありがとうございます。

コンピュータとHDDは以下のような環境でした。
・富士通 PRIMERGY TX1310 M3
・Seagate ST12000VN0008


佐藤さん:
>    kern.cam.boot_delay="5000"
>    kern.cam.scsi_delay="5000"

/dev/ada3が認識されるまでだいたい10秒ぐらいだったので、
kern.cam.boot_delay="10000"
とか
kern.cam.scsi_delay="15000"
とかやってみましたが、状況は変わりませんでした。
(/dev/ada? が認識される遙か前に、/etc/rc.d/zpool が
  実行されているような状況は変わりませんでした)


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

このアドバイスを元に、rcとかrcorderとかの使い方を調べまして、
以下のような対処をしています。
ありがとうございます。

----
以下のスクリプトを /etc/rc.d/zpool_before として作成しました。

----
#!/bin/sh

# PROVIDE: disks
# KEYWORD: nojail

. /etc/rc.subr

name="zpool_disks"
desc="Wait disk for ZPOOLs"
rcvar="zfs_enable"
start_cmd="zpool_disk_start"

zpool_disk_start()
{
         if [ "${zpool_waiting_device}" ] ; then
                 dev=${zpool_waiting_device}
                 echo "Find ${dev}"
                 i=0
                 while [ $i -lt 15 ] ; do
                         if [ -e ${dev} ] ; then
                                 break
                         fi
                         echo "Could not find device ${dev}. Wait 1sec."
                         sleep 1
                         i=`expr $i + 1`
                 done
         fi
}

load_rc_config $name
run_rc_command "$1"
----

# PROVIDE: disks
とすることで、/etc/rc.d/zpool より前にこのスクリプトを実行させています。
(/etc/rc.d/zpool は # REQUIRE: disks なので)

また、ZFSのファイルシステムは/etc/rc.d/zfsでmountされますが、
このスクリプトは/etc/rc.d/FILESYSTEMSの中でREQUIREされておらず、
このままではFILESYSTEMSがprovideされたときに
/usrや/varがmountされている保証がないので、
/etc/fstab に/usrや/varのエントリを入れて、
/etc/rc.d/mountcritlocal の中でmountされることを保証するようにしました。

重ねまして、お二方、ありがとうございました。


On 2022/08/09 5:59, Hiroki Sato wrote:
> 佐藤です。
> 
> freebsdusersjp@t11i.jp wrote
>    in <3ed6f837-258e-86a4-eb0d-34d2d453e49a@t11i.jp>:
> 
> fr> 13.1-RELEASEにおいて、起動時に特定のディスクデバイスが認識されるまで
> fr> zpoolのimportを待つ方法を探しています。
> ...
> fr> 試しにこのスクリプトを編集し、/dev/ada3 が認識されるまで
> fr> sleepするようにしたところ、zpoolのimportに成功しました。
> 
>   /boot/loader.conf に
> 
>    kern.cam.boot_delay="5000"
> 
>   を書くと変わったりするでしょうか。
>   これを設定すると、起動中にブロックデバイスを認識する段階で、
>   設定された数字だけ余計に待つようになります。単位は ms で、デフォルトは 0 です。
> 
>   また、SCSI バスリセットから機器が応答するまでの待ち時間は
>   別の設定になっていて、次の変数が対応します。
>   こちらも単位は同じで、デフォルトは 5000 です。
> 
>    kern.cam.scsi_delay="5000"
> 
>   認識に時間がかかる機器がある場合は、この 2 つを調整することが多いです。
> 
> -- Hiroki