저는 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