Solaris 10 - 是否可以從啟動腳本重新啟動系統?
我有一個 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
會在啟動期間由腳本重新創建,但不會發生後續重新啟動。是否有故障安全機制來阻止啟動腳本可能導致無限重啟?如果是這樣,有沒有辦法解決這個問題?
我已經測試了將這個腳本從
/etc/rc0.d
、和移動/etc/rcS.d
,結果如下:/etc/rc1.d``/etc/rc2.d``/etc/rc3.d
- /etc/rcS.d
/etc/rc0.d
-創建與 /etc/DR_Network_Configured相同的行為,但不會重新啟動。- /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
從 , 中的啟動腳本執行時,reboot 和 init 命令不起作用/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