Solved – 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/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/rc0.d , /etc/rcS.d , /etc/rc2.d и /etc/rc3.d , но не /etc/rc1.d .

Команды перезагрузки и init не работают при запуске из сценария запуска в /etc/rc0.d , /etc/rcS.d (и, возможно, /etc/rc1.d хотя я не могу подтвердить это как сценарий запуска в этом каталог никогда не запускался). Они работают, когда запускаются из сценариев запуска в /etc/rc2.d и /etc/rc3.d .

Я предполагаю, что это предназначено для предотвращения постоянной перезагрузки системы. Если ошибочный сценарий запуска в /etc/rc3.d /etc/rc2.d или /etc/rc3.d систему в бесконечный цикл перезагрузки, то систему можно легко перезагрузить до однопользовательской вехи, а сценарий запуска, чем необходимость поиска альтернативных загрузочных носителей для загрузки, монтирования корневого тома / диска и отключения сценария оскорбления.

Исходя из вышеизложенного, я изменил свой сценарий перенастройки сети следующим образом:

  1. /etc/rc0.d мой сценарий в /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 и #!/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