
私はSolaris 10テストゲスト論理ドメイン(LDom)を持っています。再起動する前に使用する予定です/etc/rc0.d
。
現在のシステムが起動すると、起動スクリプトのすべてのエントリが再起動されないことを除いて、私は望む方法で実行されます。
テストスクリプトを作成し、必須項目を除くすべての項目を削除しました。
#!/sbin/sh
# MAIN
case "$1" in
start)
if [ -f /etc/DR_Network_Configured ]; then
exit 0
else
touch /etc/DR_Network_Configured
reboot
fi
exit 0
;;
*)
echo "Usage: $0 { start }"
exit 1
;;
esac
exit 0
/etc/rc0.d/S99testing start
コマンドラインからスクリプトを実行すると、ファイルが生成され、/etc/DR_Network_Configured
システムがすぐに再起動されます。これは望ましい動作です。
しかし、ファイルを削除して/etc/DR_Network_Configured
システムをシャットダウンして再起動すると、起動/etc/DR_Network_Configured
中にスクリプトによってファイルが再生成されますが、後続の再起動は発生しません。
起動スクリプトによって潜在的に無限の再起動が発生するのを防ぐ安全装置メカニズムはありますか?それでは、この問題を解決する方法はありますか?
答え1
このスクリプトをからに/etc/rc0.d
移動することをテストし、次のような結果を得ました。/etc/rcS.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
- /etc/rcS.d- /etc/DR_Network_Configured 生成と同じ動作ですが、再
/etc/rc0.d
起動しません。 - /etc/rc1.d– /etc/DR_Network_Configured は生成されず、再起動されません。
- /etc/rc2.d– /etc/DR_Network_Configured を作成し、システムを再起動します。
- /etc/rc3.d– /etc/DR_Network_Configured を作成し、システムを再起動します。
要約すると、システムがデフォルト状態(milestone/multi-user-server:default
ランレベル3に似ています)で起動すると、およびにある起動スクリプトを実行しますが、/etc/rc0.d
実行/etc/rcS.d
し/etc/rc2.d
ませ/etc/rc3.d
ん/etc/rc1.d
。
/etc/rc0.d
再起動および初期化コマンドは、起動スクリプトで実行された場合は機能しません/etc/rcS.d
(おそらく/etc/rc1.d
そのディレクトリの起動スクリプトが実行されないため、確認できません)。との起動スクリプトで実行すると/etc/rc2.d
動作します/etc/rc3.d
。
システムが継続的に再起動しないように設計されているようです。無効なブートスクリプトが入った/etc/rc2.d
場合、/etc/rc3.d
またはシステムを無限の再起動ループに陥らせると、システムは非常に簡単に再起動することができます。ボリューム/ディスクと問題のあるスクリプトを無効にします。
上記に基づいて、ネットワーク再構成スクリプトを次のように修正しました。
- ネットワーク設定を変更するには、スクリプトを維持してください
/etc/rc0.d
。 - ネットワーク再構成後にシステムを再起動する必要がある場合は、
/etc/rc2.d/S99reboot
システムを再起動するための新しいスクリプトを生成する機能が追加されました。 /etc/DR_Network_Configured
ファイルが存在し、存在する場合、/etc/rc2.d/S99reboot
継続的なシステム再起動を防ぐために、後者を削除します。
私の関連コードは次のとおりです。
#!/sbin/sh
reboot_script="/etc/rc2.d/S99reboot"
Create_Reboot_File ()
{
echo "#!/sbin/sh" > $reboot_script
echo "case \"\$1\" in" >> $reboot_script
echo "start)" >> $reboot_script
echo " init 6" >> $reboot_script
echo " exit 0" >> $reboot_script
echo " ;;" >> $reboot_script
echo "esac" >> $reboot_script
echo "exit 0" >> $reboot_script
chmod 740 $reboot_script
chown root:root $reboot_file
}
case "$1" in
start)
if [ -f /etc/DR_Network_Configured ]; then
[ -f $reboot_script ] && rm $reboot_script
exit 0
else
# My reconfigure network functions are here
# ...
touch /etc/DR_Network_Configured
Create_Reboot_File
fi
exit 0
;;
*)
echo "Usage: $0 { start }"
exit 1
;;
esac
exit 0