我有一个 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
使系统陷入无限重启循环,则系统可以相当容易地重新启动到单用户里程碑,并禁用有问题的启动脚本,而不必找到备用启动介质来启动、安装根卷/磁盘并禁用有问题的脚本。
基于上述,我修改了我的网络重新配置脚本如下:
- 保留我的脚本来
/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