Re: 起動時に特定のデバイスが 認識されるまでzpoolのimportを待つ方 法
- In reply to: Hiroki Sato : "Re: $B5/F0;~$KFCDj$N%G%P%$%9$,G'<1$5$l$k$^(B $B$G(Bzpool$B$N(Bim port$B$rBT$DJ}K!(B"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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