戸川です。

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

コンピュータと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:
佐藤です。

[email protected] wrote
   in <[email protected]>:

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

Reply via email to