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재부팅 및 초기화 명령은 시작 스크립트에서 실행될 때 작동하지 않습니다 /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

관련 정보