Solaris

Solaris 10 - 是否可以從啟動腳本重新啟動系統?

  • January 20, 2018

我有一個 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使系統進入無限重啟循環,那麼系統可以很容易地重新啟動到單使用者里程碑並禁用有問題的啟動腳本,而不必找到備用啟動媒體來啟動、掛載根卷/磁碟並禁用有問題的腳本。

基於以上,我修改了我的網路重配置腳本如下:

  1. 保留我的腳本/etc/rc0.d以更改網路設置。
  2. 添加了一個功能,如果在重新配置網路後需要重新啟動/etc/rc2.d/S99reboot系統,則會創建一個新腳本來重新啟動系統。
  3. 如果該/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

引用自:https://unix.stackexchange.com/questions/147365