Solaris 10 - 是否可以通过启动脚本重新引导系统?

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将在启动过程中由脚本重新创建,但不会发生后续重新启动。

是否有故障安全机制来阻止启动脚本可能导致无限重启?如果是这样,有办法解决这个问题吗?

答案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从 中的启动脚本运行时,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

相关内容