2018-12-06

UEFI Shell: Скрипт автозапуска startup.nsh

При старте UEFI Shell пытается запустить файл startup.nsh. Об этом свидетельствует сообщение Press ESC in 1 in seconds to skip staurtup.nsh or any other key to continue. По умолчанию данный файл отсутствует на системном EFI-разделе. Что это за файл, и для чего он нужен?



Файлы с расширением *.nsh


Файлы с расширением *.nsh, для оболочки UEFI Shell являются командными, и имеют статус исполняемых. То есть, создав файл с этим расширение, вписав в него команды оболочки UEFI Shell, и выполнив запуск полученного файла, произойдет поочередное выполнение содержащихся в нем команд. Такие файлы называют скриптами.

Особенность файла startup.nsh является в том, что при запуске UEFI Shell происходит его выполнение, если конечно пользователь не отменит данное действие нажатием клавиши ESC. Это по сути делает данный файл, файлом автозапуска (по аналогии с файлом autoexec.bat для операционной системы MS-DOS).

Как можно использовать данную особенность? Самое простое, что можно сделать, это выполнить автоматическое изменение размера и цветовой схемы командной оболочки. Более усложненный вариант, выполнение указанных *.efi приложений, в зависимости от выполненных условий.


Возможности скриптов


Как было сказано в предыдущем разделе, скрипты могут содержать в себе команды оболочки UEFI Shell. Абсолютно любые. Используя их вы можете составить свой сценарий выполнения необходимых вам команд. Рассмотрим самые типичные действия для скриптов:

1. Вывод информации.
2. Выполнение команд, или исполняемых файлов.
3. Условные переходы.
4. Чтение информации.
5. Циклические действия.

Данные действия расположены по частоте их использования. Сперва самые частые, в конце самые редкие. Предлагаю разобрать данные действия на примере скриптов, хотя бы частично. Поэтому желательно изучить (или держать открытыми) следующие статьи:

Список доступных команд, а так же особенности командной оболочки UEFI Shell, читаем по этой ссылке. Пример работы с командной оболочкой UEFI Shell.


Простой скрипт


Реализуем самые частые действия в простых скриптах, это вывод текстовой информации и выполнение запуска команд/приложений. Далее приведен текст тестового скрипта:

# Отключение вывода
echo -off

# Очистка экрана и изменение цветовой схемы
cls 3 11

# Изменение размера экрана
mode 128 40

# Вывод текстовых сообщений
echo "Message output disabled" 
echo "Changed color scheme" 
echo "Changed screen size" 
echo "Printed this text message! :)"

Сохраним данный текст в файл (обычный текстовый файл) под именем simple_script.nsh, в корень загрузочной флешки с UEFI Shell.


Загрузимся в UEFI Shell.


Перейдем в корень флешки и выведем список файлов.


Файл simple_script.nsh отмечен зеленым цветом, что говорит о возможности его запуска. Выполним запуск файла simple_script.nsh.


Скрипт, выполнил изменение цветовой схемы, размера экрана, и вывел текстовые сообщения о проделанной работе. К сожалению, текст на русском выводить невозможно. Хоть кодировка UCS-2 позволяет это сделать, но в самой оболочке не содержатся соответствующие шрифты.


Интерактивный скрипт


Интерактивным называется тот скрипт, который взаимодействует с пользователем. То есть, ожидает от пользователя выполнения какого либо действия. Это может быть нажатие клавиши, или ввод какого либо текста.

Текущая спецификация UEFI Shell содержит лишь одну интерактивную команду pause. Эта команда останавливает выполнение скрипта, и ожидает дальнейшего действия от пользователя. Действий всего два - нажать клавишу q для выхода из сценария, или нажать на любую другую клавишу для продолжения его выполнения.

Пример интерактивного скрипта:

# Настройка консоли
echo -off
mode 128 40
cls 3 11

# Вывод первого сообщений и ожидание подтверждения
echo "To start press ENTER, or ^"q^" to exit..."
# Подавление стандартного сообщения команды pause
pause > nul

# Вывод версии UEFI Shell
cls
echo "Step 1 - UEFI Shell Version:"
echo " "
ver
echo " "
echo "Press any key to next step, or ^"q^" to exit..."
pause > nul

# Вывод дисков с поддерживаемыми файловыми системами
cls
echo "Step 2 - Accessible mounted drives:"
echo " "
mount fs*
echo " "
echo "Press any key to next step, or ^"q^" to exit..."
pause > nul

# Вывод списка подключенных устройств PCI
cls
echo "Step 3 - Connected pci devices:"
echo " "
pci
echo " "
echo "Press any key exit..."
pause > nul

# Сообщение о завершении с паузой в три секунды
cls
echo "Goodbye... Thank you! :)"
stall 3000000

Создаем файл interactive_script.nsh с данным текстом в корне загрузочной флешки с UEFI Shell.


Загружаемся в UEFI Shell, переходим в корень флешки, выводим список файлов.


Выполняем запуск интерактивного скрипта interactive_script.nsh.


Первое сообщение, с выбором. Приглашение.


Шаг первый. Вывод информации о версии UEFI Shell.


Шаг второй. Вывод смонтированных дисков с поддерживаемыми файловыми системами.


Шаг третий. Вывод списка доступных PCI-устройств.


Завершающее сообщение.

На каждом их этих шагов, можно нажать клавишу q и вернуться обратно к командной строке.


Скрипт с условиями и циклами


Условия и циклы позволяют организовать скрипты с логикой, выполняющие свои действия в зависимости от наличия определенных условий. Для условий используется команда if, а для циклов for.

Попробуем написать скрипт, который использует циклы и условия:

# Настройка консоли
echo -off
mode 128 40
cls

# Метка возврата
:Redo
# Цикл
for %i in 0 1 2 3 4 5 6 7
 # Меняем цвет фона в цикле
 cls %i 15

 # Условия вывода названий цветов
 if %i == 0 then
  echo "Black"
 endif

 if %i == 1 then
  echo "Blue"
 endif

 if %i == 2 then
  echo "Green"
 endif
 
 if %i == 3 then
  echo "Cyan"
 endif
 
 if %i == 4 then
  echo "Red"
 endif
 
 if %i == 5 then
  echo "Magenta"
 endif
 
 if %i == 6 then
  echo "Yellow"
 endif

 # Условие выхода из цикла
 if %i == 7 then
  echo "Light Gray"
  stall 1000000
  goto Redo
 endif
 
 # Ожидаем 1 секунду
 stall 1000000
endfor

Сохраняем полученный код в файл complex_script.nsh и размещаем его в корне загрузочной флешки с UEFI Shell.


Запускаем UEFI Shell, переходим в корень флешки, выводим список файлов.


Выполним запуск скрипта complex_script.nsh.




Начнется циклическая смена цветов фона экрана, с выводом названия текущего цвета. Оставить выполнение скрипта можно сочетанием клавиш CTRL+C.


Startup.nsh


Получив в предыдущих главах, представление о скриптах *.nsh, командной оболочки UEFI, перейдем к файлу startup.nsh. Данный файл, это обычный скрипт, единственной особенностью которого является автоматический запуск его оболочкой UEFI.

То есть, вы можете взять любой скрипт, из вышеописанных, переименовать его в startup.nsh, и наблюдать за тем как он запускается при старте UEFI Shell. Единственный вопрос, это в какой директории должен располагаться скрипт startup.nsh? Ответить на этот вопрос поможет команда set.

Выполняем команду set. Она выводит текущие установленные переменные оболочки UEFI.


Обращаем внимание на переменную path. Данной переменной присвоены пути, через знак точки с запятой ";", по которым происходит поиск исполняемых файлов. Разместив скрипт startup.nsh в один из этих каталогов, он гарантированно запустится.

Пути, вне зависимости от диска, по которым происходит поиск \EFI\boot, \EFI\tools, \ (то есть корень диска). Причем поиск происходит именно в указанной последовательности.

Напишем небольшой скрипт, выводящий путь до своего местоположения. Для демонстрации с какой директории был вызван скрипт:

@echo -off
echo " "
echo "\startup.nsh started..."
echo " "

Сохраняем полученный файл под именем startup.nsh, и копируем его в одну из указанных выше директорий.


Запускаем UEFI Shell.


Скрипт успешно запустился, о чем свидетельствует вывод консоли.


Итог


В статье было рассмотрено: Как написать скрипт *.nsh? Как написать скрипт автозапуска startup.nsh? В какую директорию нужно копировать startup.nsh?

Все приведенные примеры скриптов, нацелены на отражение возможной функциональности скриптов командной оболочки UEFI Shell. Используя скрипт автозапуска startup.nsh можно реализовать свой сценарий загрузки.

Комментариев нет :

Отправка комментария