Мини-HOWTO: Удаленная загрузка и Linux: Настройка удаленно загружаемых рабочих станций с Linux, DOS, Windows 95/98 и Windows NT | ||
---|---|---|
Пред. | След. |
В этой главе приведено подробное описание утилит удаленной загрузки, разработанных нами на факультете компьютерных наук Университета Женевы.
Эти три названия относятся к трем вариантам одной и той же программы, различающихся в следующем:
BpBatch - это специальная программа, которую можно запустить из BootPROM до загрузки операционной системы. Она состоит из двух частей: bpbatch.P - динамического загрузчика, и bpbatch.ovl - собственно самой программы. BpBatch предоставляет возможность работать с дисками и файлами на них, при помощи собственной встроенной поддержки FAT16, FAT32 и Ext2fs, а также с сетевыми ресурсами, при помощи BootPROM TFTP API. BpBatch был собран в DOS, при помощи Borland C 5.0 и Turbo Assembler 3.2.
MrBatch - это DOS/Linux-версия BpBatch. Все команды, известные BpBatch, обрабатываются MrBatch и наоборот. Она бывает очень полезна, если вы хотите проверить работу своих пакетных скриптов из DOS/Linux. В DOS, MrBatch эмулирует удаленный доступ к файлам, при помощи ОС, если BootPROM не доступен. В Linux, BootPROM недоступен вообще, но MrBatch эмулирует его работу, при помощи встроенной в Linux поддержки IP, или, в крайнем случае, при помощи ОС. MrBatch был собран в Linux при помощи GCC 2.7.2.1, и в DOS, при помощи Borland C 5.0 и Turbo Assembler 3.2.
MrZip - это интерпретатор, обрабатывающий дополнительный набор команд языка MrBatch, служащий для создания образов дисков. В MrZip ограниченный доступ к удаленным файлам заменен на полноценный доступ к файлам, при помощи ОС. В MrZip не встроена поддержка VESA. MrZip был собран в Linux, при помощи GCC 2.7.2.1, и в DOS, при помощи Borland C 5.0 и Turbo Assembler 3.2.
Все программы имеют одинаковый набор возможных опций. MrBatch и MrZip берут их из командной строки, а MrBatch берет их из опции 155 BOOTP. Список возможных опций:
[-x] [-l] [-b] [-v] [-w] [-i] [базовое_имя_скрипта] |
-x запрещает использование расширенной памяти
-l запрещает использование набора символов ISO-latin-8859-1 в качестве стандартного
-b запрещает обнаружение BootPROM (вызывающее инициализацию флоппи-диска в DOS)
-v запрещает обнаружение VESA (вызывающее переключение в полноэкранный режим в Windows 95)
-w разрешает прямую запись на диск (она запрещена по умолчанию в DOS и Linux)
-i включает интерактивный режим, даже если было задано имя скрипта
При обработке команды BpBatch следует нижеприведенным правилам.
Команды обрабатываются построчно. Строки разделяются переводом строки и/или возвратом каретки.
Максимальная длина строки - 255 символов.
Регистр ключевых слов и имен переменных не имеет значения.
" - это специальный символ - ограничитель строковых констант
Когда в тексте встречается конструкция вида ${variable} или $variable, она заменяется на значение переменной или на пустую строку, если переменная не определена.. Эта подстановка выполняется также и внутри строк. Более того, подставляемое значение должно быть также включено в кавычки, если предполагается, что оно является строкой (т.е. можно говорить скорее о макро-подстановке, а не о переменных).
\a заменяется на символ звукового сигнала (ASCII 7)
\b заменяется на символ "забой" (ASCII 8)
\n заменяется на символ "перевод строки" (ASCII 10)
\r заменяется на символ "возврат каретки" (ASCII 13)
\t заменяется на символ "табуляция" (ASCII 9)
\v заменяется на символ "вертикальная табуляция" (ASCII ...)
\nnn где nnn - это трехзначное восьмеричное число от 000 до 377, заменяется на символ с ASCII-кодом nnn
\X, где X - это любой символ, не перечисленный выше, заменяется на сам символ X. В частности:
\" заменяется на стандартную двойную кавычку (т.е. не является ограничителем строки)
\$ заменяется на символ $ (не выполняет подстановку переменных)
\\ заменяется на символ \ (не является специальным символом)
Символ "конец строки" (ASCII код 0) НЕ МОЖЕТ быть использован в тексте, так как он является внутренним ограничителем строки
Символ "волнистые линии" (ASCII код 249, 0F9h, 0371 - KOI-8 символ "Ы") НЕ МОЖЕТ быть использован в тексте, так как он используется программой в качестве внутреннего ограничителя строки.
Символ "блок" (ASCII код 255, 0FFh, 0377) НЕ МОЖЕТ быть использован в тексте, так как он используется программой в качестве внутреннего ограничителя переменных.
Пустые строки игнорируются. Строки, начинающиеся с символа # воспринимаются, как комментарии, и также игнорируются. Строки, начинающиеся с двоеточия (:), воспринимаются как метки перехода и не обрабатываются.
Строки ограничиваются с обеих сторон двойными кавычками: "Hello world" Чтобы включить символ "двойная кавычка" в строку, используйте символ "обратный слэш": "I said: \"Hello world\"" За строками могут следовать некоторые операторы их преобразования.
Оператор замены символа: "Hello world"/o=u/ == "Hellu wurld" "198.76.54.32"/.= / == "198 76 54 32"
Оператор выбора слова (отсчет ведется с нуля): "Hello world"{0} == "Hello" "198 76 54 32"{1-3} == "76 54 32"
Оператор вырезания подстроки (отсчет ведется с нуля): "Hello world"[4] == "o" "Hello world"[4-7] == "o wo"
Числовые выражения работают с 32-битными целыми числами (от -2,147,483,646 до 2,147,483,647). Поддержка шестнадцатеричных, восьмеричных и двоичных чисел не встроена. При необходимости получить числовое выражения система распознает следующие конструкции:
Положительное или отрицательное целое число
Выражение в форме (выражение1 операция выражение2), где операция - это +, -, * (умножение), / (деление) или % (остаток от деления), а выражение - это числовое выражение. Заметьте, что КАЖДАЯ операция должна заключаться в скобки: ((3 * 5)+2) == 17
Оператор "длина строки" (@), за которым следует собственно строка: @"Hello world" == 11
Оператор "количество слов в строке" (#), за которым следует собственно строка: #"Hello world" == 2
Некоторые команды в качестве аргументов обрабатывают промежутки времени. Эти промежутки измеряются в секундах с точностью до десятых: Delay 3 пауза 3 секунды Delay 0.3 пауза 3/10 секунды
В командах, которые требуют указание цвета, вы можете использовать либо его название (регистр не имеет значения) или его номер:
Black 0 (Черный) Blue 1 (Синий) Green 2 (Зеленый) Cyan 3 (Голубой) Red 4 (Красный) Magenta 5 (Фиолетовый) Brown 6 (Коричневый) LightGray 7 (Светло-серый) DarkGray 8 (Темно-серый) LightBlue 9 (Светло-синий) LightGreen 10 (Светло-зеленый) LightCyan 11 (Ярко-голубой) LightRed 12 (Ярко-красный) LightMagenta 13 (Светло-фиолетовый) Yellow 14 (Желтый) White 15 (Белый) |
Имена файлов - это строки. Следовательно, они должны заключаться в двойные кавычки. Регистр имен файлов имеет значение в зависимости от файловой системы. Слэш и обратный слэш могут свободно использоваться, заменяя друг друга. Не забудьте, что надо использовать двойной обратный слэш: одинарный обратный слэш - это специальный символ.
Существует два вида ссылок на файлы:
Прямой доступ к файлам на локальном диске
Косвенный доступ к файлам (удаленные файлы и локальные файлы при помощи ОС)
Прямой доступ к файлам на диске описывается следующим образом: "{номер_диска:номер_раздела}/полный_путь/имя_файла" Номер диска можно не указывать - по умолчанию он будет 0. Например, "{:1}/usr/bin" указывает на /usr/bin, если такой каталог есть на первом разделе. Прямой доступ к файлам на диске производится, исключительно при помощи нашей программы (мы не используем операционную систему).
Существует также два специальных раздела. Раздел с номером 0 указывает на Главную Загрузочную Запись (master boot record (MBR)) и имеет псевдо-файловую систему, позволяющую вам иметь доступ к загрузочному коду. Раздел с номером -1 - это кэш-раздел (см. ниже).
В BpBatch/MrBatch косвенный доступ работает с удаленными файлами, находящимися на TFTP-сервере, если доступ к BootPROM:
"help.bpb" - это файл help.bpb в каталоге /tftpboot "gifs/MyImage.gif" - этой файл в каталоге /tftpboot/gifs |
"198.76.54.32:help.bpb" |
"198.70.0.1/198.76.54.31:help.bpb" |
"198.76.54.32@89:getpasswd/smith" |
В MrZip косвенный доступ работает с файлами ОС в соответствии с ее правилами обращения к файлам. Не существует никаких ограничений - косвенный доступ можно использовать везде, где можно использовать прямой. Косвенный доступ обычно работает быстрее прямого, потому что в ОС есть большее количество буферов и кэш. При помощи косвенного доступа, можно работать с удаленными файлами, если это поддерживается ОС.
"C:\\autoexec.bat" "C:/config.sys" "/mnt/net/usr" |
С целью уменьшить нагрузку на сеть и ускорить процесс загрузки, образы дисков, ядра Linux и, возможно, другие файлы кэшируются на жестком диске. Кэш-раздел находится в конце диска между последним цилиндром, занятым стандартными разделами, и последним цилиндром диска (то есть за пределами стандартных разделов). Для того, чтобы это кэширование работало, между последним разделом и концом диска ДОЛЖНО быть пустое пространство. Кэш-раздел ДОЛЖЕН существовать, если вы хотите восстановить образ диска.
Кэш-раздел представляет из себя надежную файловую систему с контролем CRC: Каждый каталог и каждый 32-килобайтный блок данных имеет свою 32-битную CRC-контрольную сумму. Если содержимое каталога или блока данных испорчено, то файл автоматически удаляется из кэша, и при обращении к нему, снова загружается с сервера.
Вы имеете возможность работать с файлами кэш-раздела из BpBatch, MrBatch и MrZip, используя прямой доступ к специальному разделу "{:-1}". Чтобы увидеть содержимое кэш-раздела, наберите:
logdir "{:-1}" |
clean -1 |
Некоторые переменные бывают установлены при запуске интерпретатора и/или имеют специальное назначение. Некоторые из них существуют во всех программах, другие есть только в MrZip. Часть из них появляются только после получения ответа на BOOTP/DHCP-запрос.
$Program имеет значение "BpBatch" в BpBatch, "MrBatch" в MrBatch и "MrZip" в MrZip
$Basename базовое имя скрипта, автоматически запущенного в интерпретаторе
$HelpFile имя файла, выводимого по команде Help. По умолчанию оно равно "${Basename}.hlp"
$BOOTP-... - переменные, установленные в соответствии с ответом на BOOTP-запрос (см. ниже подробное описание этих переменных)
$DHCP-... - переменные, установленные в соответствии с ответом на DHCP-запрос (см. ниже подробное описание этих переменных)
$Disks содержит список размеров дисков, разделенных пробелами. Соответственно, #"$Disks" - это количество дисков, а "$Disks"{0} - размер первого диска
$Keypressed равен первому не запрошенному коду клавиши из буфера клавиатуры (если таковой имеется)
$LBA контролирует использование режима LBA для доступа к дискам размером более 2 Гб. Значение по умолчанию: "ON"
$FDA контролирует быстрый доступ к диску (черезцилиндровая запись). Значение по умолчанию: "ON"
$VESA контролирует использование VESA-графики. Значение по умолчанию: "ON", если существует поддержка VESA
$VESA-Modes содержит в себе список всех доступных VESA-видеорежимов. Первый из этого списка - это видеорежим, используемый по умолчанию (если режим не указан в команде InitGraph). Замечание: если VESA="OFF", то эта переменная будет пуста
$APM установлено в "ON", если ваш компьютер поддерживает Расширенное Управление Питанием (Advanced Power Management). Если $APM установлено в "ON", вы можете использовать команду PowerOff для отключения компьютера. Значение по умолчанию зависит от вашего компьютера
$Trace контролирует вывод на экран каждой команды перед ее исполнением. Она также контролирует вывод имен файлов при создании нового архива. Значение по умолчанию: "OFF"
$AutoShowLog контролирует автоматическое переключение на экран журнала при нажатии клавиши ESC. Значение по умолчанию: "ON"
$PauseLog контролирует задержку вывода журнала, если экран журнала полностью заполнен. Значение по умолчанию: "ON"
$CacheDisk номер диска, используемого для кэширования удаленных файлов. Значение по умолчанию: пусто == 0, первый жесткий диск
$CacheAlways контролирует автоматическое кэширование удаленных файлов, скопированных, модифицированных или нарисованных в формате GIF. Значение по умолчанию: "OFF"
$CacheNever полностью отключает кэширование файлов. Включите эту переменную для удаленной загрузки Linux на бездисковой машине. Значение по умолчанию: "OFF"
$CacheReserve контролирует безусловное выделение на кэш-разделе дополнительных к размеру файла 25 процентов места для того, чтобы файлы могли менять размер. Отключите эту переменную, если у вас мало места на диске. Значение по умолчанию: "ON"
$ExtMemory разрешает использование расширенной памяти (или XMS). Один раз запретив использование этой памяти, разрешить обратно его нельзя. Значение по умолчанию: "ON", если в компьютере имеется расширенная память.
$IsoLatin контролирует обработку ASCII-кодов от 128 до 255, включенных в скрипты и модифицируемые файлы. Установки IsoLatin обрабатываются при загрузке файла, а не при его обработке. Значение по умолчанию: "ON"
$ProgressX и $ProgressY задают координаты графического окна, отражающего процесс загрузки и декомпрессирования образа диска. Значение по умолчанию: 200 200
$EXT2-Backup контролирует обновление резервных копий суперблоков в файловой системе ext2 в Linux. Копии суперблоков создаются несколько секунд и не используются текущими версиями ядер (их использует только e2fsck).
$Security-Gateway содержит имя шлюза, используемого для авторизации пользователей. На указанном в этой переменной компьютере должна работать наша специальная программа-шлюз. Значение по умолчанию: "${BOOTP-Server-IP}@89" (т.е. порт 89 TFTP-сервера)
$Security-Check содержит ответ сервера безопасности на последнюю проведенную авторизацию, соответственно PASSED или FAILED. Значение по умолчанию: "FAILED"
$Security-Passwd, $HelpTopic, $OnExit, $OnKey-... внутренние переменные.
Смотрите также список специальных переменных BOOTP и MrZip.
Следующие переменные используются только в MrZip.
$TempPath содержит каталог, в котором содержатся временные файлы. Значение по умолчанию: <пустая строка> == текущий каталог
$DumpFormat содержит формат вывода в журнал данных о создаваемых архивах. Это строка, содержащая
"h"/"H" - вывод заголовка архива
"b"/"B" - вывод итогов/содержимого загрузочных секторов
"s"/"S" - вывод краткой/подробной информации о занятом месте
"d"/"D" - вывод краткого/подробного содержимого каталогов
"f"/"F" - вывод итогов/содержимого файлов
$FragmentSize задает размер частей архива. Если вы не используете улучшенную версию TFTP-сервера фирмы InCom, установите ее в "30 MB". Значение по умолчанию: "87 MB"
$SourceArchive, $DestArchive, $Filter... внутренние переменные.
Системой распознаются следующие переменные BOOTP-... и DHCP-... , заполняемые после получения соответствующего ответа на BOOTP/DHCP запрос (TCP/IP BootPROM должна существовать и работать):
$BOOTP-Client-ID $BOOTP-Your-IP $BOOTP-Server-IP $BOOTP-Gateway-IP $BOOTP-Bootfile $BOOTP-Server-Name $BOOTP-Subnet-Mask $BOOTP-Time-Offset $BOOTP-Routers $BOOTP-Time-Servers $BOOTP-Name-Servers $BOOTP-Domain-name-Servers $BOOTP-BOOTP-Log-Servers $BOOTP-Cookie-Servers $BOOTP-Lpr-Servers $BOOTP-Impress-Servers $BOOTP-Resource-Location-Servers $BOOTP-Host-Name $BOOTP-Boot-Size $BOOTP-Merit-Dump $BOOTP-Domain-Name $BOOTP-Swap-Servers $BOOTP-Root-Path $BOOTP-Extensions-Path $BOOTP-IP-Forwarding $BOOTP-Interface-MTU $BOOTP-All-Subnets-Are-Local $BOOTP-Broadcast-Address $BOOTP-NIS-Domain $BOOTP-NIS-Servers $BOOTP-NTP-Servers $BOOTP-Font-Servers $BOOTP-X-Display-Manager $DHCP-IP-Address-Lease-Time $DHCP-Message-Type $DHCP-Server-Identifier $DHCP-Message $DHCP-Renewal-Time $DHCP-Rebinding-Time $BOOTP-NIS+-Domain $BOOTP-NIS+-Servers $BOOTP-Server-Name $BOOTP-Bootfile $BOOTP-Mobile-IP-Agent $BOOTP-SMTP-Servers $BOOTP-POP3-Servers $BOOTP-NNTP-Servers $BOOTP-WWW-Servers $BOOTP-Finger-Servers $BOOTP-IRC-Servers $BOOTP-StreetTalk-Servers $BOOTP-STDA-Servers |
Другие параметры BOOTP/DHCP можно использовать следующим образом:
$BOOTP-Option-n |
Не путайте значения переменной BOOTP-Gateway-IP, содержащей адрес TFTP-шлюза, которая должна быть установлена в 0.0.0.0, если TFTP-сервер находится в той же подсети, что и клиентская машина, и переменной BOOTP-Routers, содержащей адрес IP-шлюза, используемого по умолчанию. TCP/IP BootPROM иногда, по-видимому, устанавливает значение BOOTP-Gateway-IP, копируя его из BOOTP-Routers, в результате чего каждый пакет подтверждения TFTP сначала посылается на IP-шлюз. Чтобы этого не происходило, когда ваш TFTP-сервер находится в той же подсети, что и клиент - отдельно устанавливайте BOOTP-Gateway-IP в 0.0.0.0 (спасибо Maciek Uhlig за то, что он описал нам эту проблему).
В этом разделе описываются команды, служащие для контроля состояния системы. В круглых скобках приведены необязательные аргументы этих команд (Я сам предпочитаю квадратные, но их не очень любит LaTeX...)
Активировать экран журнала и включить интерактивный режим до выполнения команд QUIT или EXIT. Выполните команду HideLog перед выходом из этого режима, чтобы отключить вывод на экран сообщений о ходе выполнения пакетного файла.
Загрузить файл контекстной помощи (bpbatch.hlp) и вывести на экран справку по данной теме. Если тема не задана, или такой темы нет в файле, то выводится оглавление.
Вывести строку в журнал. Перевод строки/возврат каретки автоматически НЕ добавляются.
Вывести строку в журнал и перевести курсор на следующую строку. Эквивалентно Log "текст\r\n".
Вывести в журнал содержимое всех переменных, имя которых соответствует шаблону. Шаблон может содержать символы ? и *. Пример: LogVars "BOOTP-*" вывести все переменные BootP
Вывести в журнал наименования всех файлов, находящихся в каталоге "путь", соответствующих шаблону. Шаблон может содержать символы ? и *. Пример: LogDir "/usr/g*p" вывести список всех файлов с именами вида g...p
Вывести в журнал дерево каталогов, начиная с заданного пути.
Вывести в журнал содержимое файла. Размер файла не должен превышать 64 Кб.
Активизировать экран журнала, если он был скрыт. Автоматически выполняется при нажатии клавиши ESC, если переменная "$AutoShowLog" == "ON", а также при переходе в интерактивный режим.
Дезактивировать экран журнала. Стандартное состояние интерпретатора, если при запуске BpBatch, MrBatch и MrZip задан пакетный файл.
Копировать все, что выводится в журнал, в 64-килобайтный буфер до тех пор, пока не будет выполнена команда EndCapture. Если содержимое журнала превышает 64 Кб, то его начало отсекается. Эту команду можно использовать для создания текстового файла с необходимым содержимым. Команда EndCapture ДОЛЖНА выполняться в том же пакетном файле.
Прекратить копирование содержимого журнала в буфер. Если задано имя файла, то содержимое буфера записывается в файл, иначе буфер очищается.
Звуковой сигнал. Эта команда эквивалентна Echo "\007".
В этом разделе описываются команды, служащие для управления порядком исполнения команд в пакетных файлах. В круглых скобках приведены необязательные аргументы этих команд.
Загружает файл и выполняет указанные в нем команды. Возвращается к исходному пакетному файлу после выполнения этих команд. Обработка символов с ASCII-кодами 128-255 в этом файле зависит от значения переменной $IsoLatin на момент его запуска.
Установить команду, автоматически выполняемую при завершении выполнения текущего пакетного файла.
Перейти к метке (т.е. к строке, начинающейся с :метка)
Выполнить все операции подстановки в строке "команда", и затем выполнить полученную команду.
If (not) <выражение1> (==|!=|<|>|>=|<=|=>|=<|<>) <выражение2> <команда> If (not) (ci) "строка1" (==|!=|<|>|>=|<=|=>|=<|<>) "строка2" <команда> If (not) (ci) "строка" Match-Expr "шаблон" <команда> If (not) (ci) "строка" Match-Passwd "unix пароль" <команда> If (not) (ci) "строка" in "список_слов" <команда> If (not) (ci) "строка" in-file "файл" <команда> If (not) exist "файл" <команда> If (not) valid <номер_диска>:<номер раздела> <команда> |
Этот оператор исполняет команду при положительном результате проверки условия. В первом случае сравниваются два числовых выражения. Во втором сравниваются две строки (с учетом регистра или без него). В третьем проверяется, соответствует ли строка шаблону (в шаблоне можно применять символы * и ?). Четвертый вариант служит для проверки соответствия строки паролю, зашифрованному по правилам Unix. Пятый проверяет, находится ли строка в списке слов. В шестом варианте проверяется, есть ли строка в файле. Седьмой вариант предназначен для проверки существования файла. Восьмой проверяет структуру раздела (форматирован ли он). Последняя форма поддерживается в версиях BpBatch, выпущенных после февраля 1999 года.
Set переменная = "строковое-выражение" Set переменная = <выражение> |
Задает значение переменной. Если значение является числовым выражением, то результат преобразовывается в строку. Переменная может использоваться, где угодно, в программе при помощи конструкции $переменная или ${переменная}. Если в переменной содержится строковое значение, то ссылку на нее надо заключать в двойные кавычки: "$переменная" или "${переменная}".
Задержка исполнения программы на некоторый промежуток времени (заданный в секундах). Смотрите также описание формата промежутков времени.
Получить системное время из CMOS и поместить его в переменную в формате ЧЧ:ММ:СС. Получить системную дату из CMOS и поместить его в переменную в формате ГГ/ММ/ДД. Эти команды можно использовать для изменения действий вашей программы в зависимости от даты или времени.
Установить системную дату или время в CMOS. Если есть шлюз безопасности (наша версия TFTP-сервера), то можно автоматически устанавливать системную дату и время на клиентских машинах аналогично дате и времени на сервере следующей командой:
include "$Security-Gateway:gettime" |
logfile "$Security-Gateway:gettime" |
Выключить компьютер. Эта команда работает только в том случае, если в вашем компьютере есть поддержка Расширенного Управления Питанием (Advanced Power Management (APM)).
В этом разделе описываются команды работы с клавиатурой. В круглых скобках приведены необязательные аргументы этих команд. Смотрите также главу Поддержка различных языков.
Ждать нажатия любой клавиши и затем поместить ее значение в переменную.
Ожидать нажатия клавиши в течение промежутка_времени. Если клавиша не была нажата, выполнить команду. Иначе оставить код клавиши в буфере клавиатуры. Смотрите также главу с описанием формата задания промежутков времени.
Ввести с клавиатуры строку, оканчивающуюся символом "возврат каретки", и поместить результат в переменную (без символа "ВК"). Если задано значение максимальной_длины, то строка ограничивается при вводе этим количеством символов.
Смотрите также описание команды GetPasswd в разделе Команды системы безопасности.
Включить перехватчик нажатия клавиши, автоматически выполняющий команду при нажатии клавиши "к" (Кроме тех, которые нажимаются при исполнении команд GetChar или Input). Если вместо одного символа используется строка "default", то команда выполняется при нажатии любой клавиши.
В этом разделе описываются команды вывода текста на экран. Все эти команды работают и в графическом режиме (за исключением того, что в текстовом режиме размер экрана - 80х25 символов, а в графике - 100х37 (в графическом режиме используются символы размером 8х16 точек). В круглых скобках приведены необязательные аргументы этих команд. Смотрите также главу Поддержка различных языков.
Вывести на экран текст/выражение в текущую позицию курсора и передвинуть курсор. Добавьте "\r\n" в конце строки для перехода к следующей строке на экране.
Задать цвет текста и фона. Можно также вместо цветов использовать числовое выражение, определяющее оба цвета, рассчитываемое как 16*цвет_фона+цвет_текста.
Если вы хотите немного пофантазировать, используйте LoadFont. Смотрите также главу Поддержка различных языков.
Переместить курсор на заданную позицию на экране и выполнить команду, если она задана. Пример: At 10,20 Print "Привет!"
Заполнить заданную текстовую область символом (заданным в виде строки или числового выражения - кода символа). По умолчанию заполняется весь экран, используется символ "полный блок" (ASCII код 219), а цвет - черный (очистка экрана). Курсор перемещается в верхний левый угол очищенной области.
.ATT (<атрибут>) .CLS (<атрибут>) .DEF <клавиша> (<время_ожидания>) .KEY <клавиша> <имя_файла> .POS ((<x>) <y>) .PWD <клавиша> <пароль> .WLN (<текст>) .WRT <текст> |
Более подробная информация приведена в документации фирмы InCom. Когда-то мы написали программу, которая позволяла редактировать меню с использованием этого синтаксиса, но будет лучше, если вы будете использовать новый формат. Заметьте также, что команда .PWD не работает - мы просто не знаем алгоритм шифрования паролей фирмы InCom GmbH.
В этом разделе описываются команды работы с графикой. Координаты в этих командах задаются в точках. В графическом режиме вы можете использовать команды вывода текста (см. выше). В круглых скобках приведены необязательные аргументы.
Заметьте, что графический режим автоматически включается при выполнении одной из этих команд (если только переменная VESA не установлена "OFF").
Включить графический видеорежим VESA. Начало координат находится в верхнем левом углу экрана (0 0). Включение VESA графики может привести к повисанию некоторых компьютеров в Windows 95. Используйте ключ -v MrBatch для того, чтобы избежать подобных проблем.
Вы можете указать специфический видеорежим, используя параметр "режим". Его использование необязательно - по умолчанию включается первый видеорежим из списка, находящегося в переменной VESA-Modes.
Возможные режимы:
640x480 => 640 на 480 точек, 256 цветов
800x600 => 800 на 600 точек, 256 цветов (стандартный режим)
1024x768 => 1024 на 768 точек, 256 цветов
1280x1024 => 1280x1024 => 1280 на 1024 точек, 256 цветов
В переменной VESA-Modes находится список видеорежимов, поддерживаемых вашей видеокартой.
Пример: InitGraph "640x480"
Выключить графический видеорежим и перейти в текстовый.
VESA-графика. Нарисовать залитый прямоугольник данного размера и цвета.
VESA-графика. Нарисовать окно данного размера и цвета. Цвет фона по умолчанию - светлосерый, цвет фона заголовка - синий.
VESA-графика. Вывести строку в указанных координатах с прозрачным цветом фона. Цвет по умолчанию равен текущему цвету текста.
VESA-графика. Загрузить заданный файл формата GIF-87a и вывести его на экран. Файл может быть черезстрочным, но обязательно в формате GIF-87a (не GIF-89a). Изображение должно помещаться в экран, т.е. нельзя загрузить картинку размером в 1024x768 в режиме 640x480. По умолчанию картинка выводится в верхнем левом углу экрана (0 0).
Тип_цветов задает тип обработки цветов в палитре при необходимости использовать более 256 цветов (это необходимо, например, при одновременном выводе двух GIF-файлов по 256 цветов в каждом):
Best-Colors - использовать лучшие для последнего GIF цвета
Spare-Colors - попытаться избежать пересечения цветов, изменяя существующие
Share-Colors - попытаться избежать пересечения цветов, используя существующие
Reuse-Colors не выделять новых цветов, использовать только существующие
В этом разделе описываются команды авторизации пользователей. В круглых скобках приведены необязательные аргументы.
Некоторые из этих команд используют Шлюз безопасности, который должен быть установлен. Смотрите раздел Специальные TFTP-сервера.
То же самое, что и Input, только вместо набранных символов выводятся звездочки.
Выполнить Unix-процедуру шифрования пароля из заданного 8-символьного текста и поместить результат в переменную. "ключ" - это обычно два символа, равные первым двум символам зашифрованной строки.
Заметьте, что это необращаемая процедура. Расшифровать такую строку невозможно. Можно лишь взять другую строку и зашифровать ее, используя этот же ключ, а затем сравнить результат шифрования.
Зашифровать данный текст при помощи заданного 8-символьного ключа, и сохранить полученную шестнадцатеричную строку в переменной.
Расшифровать шестнадцатеричную строку при помощи заданного 8-символьного ключа, и сохранить результат в переменной.
Рассчитать контрольную сумму текста по стандарту MD5 и поместить результат в переменную. Может быть использован в качестве альтернативы Unix-шифрованию для проверки паролей длиной более 8 символов.
Связаться с Security-Gateway и проверить, существует ли в заданном домене этот пользователь, и использует ли он этот пароль. Если домен - "Unix", то используется система определения пользователей Unix на самом шлюзе безопасности. При любом другом значении домена, использовать систему доменов шлюза безопасности для определения настоящего Radius- или NT-домена для проведения проверки.
Устанавливает переменную $Security-Check в "PASSED" или "FAILED". Пароль не передается по сети в явном виде.
В этом разделе описываются команды работы с дисками. В круглых скобках приведены необязательные аргументы.
Прочитать таблицу разделов данного диска и сохранить результат в переменной. Результат представляет из себя разделенный пробелами список конструкций вида Тип:Размер, где
Тип - это FAT16, EXT, BIGDOS, NTFS, FAT32, FAT32-LBA, BIGDOS-LBA, EXT-LBA, LINUX-SWAP, LINUX-EXT2 или десятичный номер типа файловой системы для остальных видов.
Размер - размер раздела в мегабайтах.
Заполнить таблицу разделов в соответствии со строкой, заданной в том же формате, что и в команде GetPartitions. Эта команда также очищает все флаги "активный раздел" (используйте команду SetBootPart).
В главной таблице разделов в Главной Загрузочной Записи (master boot record (MBR)) есть возможность описать лишь четыре раздела. Более того, DOS и Windows позволяют иметь только ОДИН FAT-раздел (он называется первичным разделом, диск C:) в главной таблице разделов. Все дополнительные FAT-разделы должны находиться в расширенном разделе (такие разделы называются Логическими). Если мы выделим номера 1-4 разделам, описанным в таблице разделов в MBR, и номера 5-8 разделам, описанным в первом расширенном разделе, то описание двух FAT-разделов будет следующим: раздел 1 имеет тип FAT, раздел 2 имеет тип "расширенный раздел", раздел 5 - FAT. Разделы 3,4,6,7 и 8 должны быть помечены как "неиспользуемые". Подобная схема может быть использована для задания еще одного FAT-раздела: дополнительный расширенный раздел может находиться внутри 2-го раздела, а внутри его может находиться логический раздел FAT под номером 9.
Если точно следовать спецификациям DOS - 3-ий и 4-ый раздел в таблицах разделов никогда не используются. На самом деле, некоторые версии DOS и другие системы могут использовать более 2-х разделов в каждой таблице разделов, но конкретных правил не существует. С этой точки зрения BpBatch значительно более гибок, в своем понимании таблиц разделов - он часто понимает вещи, непонятные некоторым ОС.
Одно универсальное правило никогда не должно нарушаться - в одной таблице разделов не может быть больше одного расширенного раздела, иначе система нумерации разделов полностью рушится.
Если вы хотите поэкспериментировать - пожалуйста, но только потом не жалуйтесь, что ваша операционная система не может распознать разделы. Единственный гарантированно правильный путь использования разделов - иметь один первичный раздел, а все остальные поместить по одному в расширенные разделы.
Пример работы с расширенным разделом: SetPartitions "BIGDOS:100 EXT:400 EMPTY EMPTY BIGDOS:400"
Получить номер активного (загружаемого) раздела, и поместить его в переменную. Первый раздел имеет номер 1. Если активных разделов нет, то возвращается 0.
Сделать данный раздел активным. С этого раздела MBR начинает загрузку система. Первый раздел имеет номер 1.
Заполнить заданные разделы нулями. Это может занять достаточно долгое время на больших разделах. Эта команда не форматирует раздел для какой-либо определенной ОС. См. также команду Clean.
Произвести быстрое форматирование разделов, в соответствии с типом раздела, заданным в таблице разделов. Также устанавливается метка раздела, если она поддерживается ОС и задана в команде. Для "полного" форматирования сначала используйте команду Blank.
Команда Clean поддерживается для разделов (FAT16) BIGDOS, FAT32, EXT, LINUX-EXT2 и LINUX-SWAP. Для очистки MBR используйте Clean 0.
Команда Clean должна использоваться на разделах с данными, а также на разделах MBR или EXT. Абсолютно не имеет смысла очищать раздел перед выполнением команды FullUnzip.
Разархивировать компрессированный образ диска в заданный раздел. При этом заданный раздел полностью очищается от других данных (очистка на-лету).
Команда FullUnzip поддерживается для разделов (FAT16) BIGDOS, FAT32 и LINUX-EXT2.
При этом в графическом режиме на экран выводится индикатор процесса разархивирования, если переменная VESA не установлена в OFF.
Разархивировать "дополняющий" архив в указанный путь. Файлы из архива заменяют файлы на диске с совпадающими именами, но остальные файлы не удаляются.
Команда IncrUnzip поддерживается для (FAT16) BIGDOS, FAT32 и LINUX-EXT2. Эта команда менее эффективна, чем FullUnzip, потому что необходимо сохранить структуру существующей файловой системы. Однако, при помощи этой команды, можно избежать создания большого количества разных образов дисков, сохраняя лишь отличия одного от другого.
Разархивировать файл, сжатый ранее при помощи команды FileZip программы MrZip. Правильность разархивации контролируется 32-битным CRC.
Побайтно скопировать исходный файл в результирующий. Эту команду можно использовать, например, после команды FullUnzip для копирования конфигурационных файлов в сервера без создания нового образа диска. Для больших и легко компрессируемых файлов лучше использовать FileUnzip.
Скопировать побайтно сначала первый, затем второй файл в результирующий. Эту команду можно использовать для разделения на части больших файлов. Результирующий файл не может быть ни одним из исходных.
Прочитать содержимое исходного файла, произвести в нем подстановку переменных и записать результат в результирующий файл. Обработка символов с ASCII-кодами 128-255 зависит от значения переменной $IsoLatin.
По умолчанию переменные должны начинаться с префикса "${" и оканчиваться суффиксом "}". Эти два значения могут быть изменены на любую другую непустую строку. Помните, что если вы хотите использовать знак доллара в префиксе или суффиксе, то вы должны поставить перед ним обратный слэш, иначе он будет интерпретирован как макро-подстановка. Например, если вы хотите отдельно задать значения, используемые по умолчанию, то дайте команду: Patch "исходный_файл" "результирующий_файл" "\${" "}"
Рекурсивно создать каталоги, начиная с корневого, до заданного пути. Если путь уже существует, команда игнорируется.
Удалить файл. Файл должен существовать.
Рекурсивно удалить все файлы и каталоги, находящиеся в заданном пути, и затем удалить сам каталог.
В этом разделе описываются команды загрузки ОС. В круглых скобках приведены необязательные аргументы.
Освободить память и векторы прерываний, занятые BootPROM. После выполнения этой команды TFTP-сервер будет недоступен. Чаще всего эта команда применяется при загрузке DOS или Windows - таким образом бывает высвобождена "верхняя" память. Эта команда автоматически выполняется при вызове FloppyBoot.
Заметьте, что эта функция восстанавливает только те векторы, которые корректно перенаправлены на BootPROM - все остальное остается неизменным. Но, по-видимому, для DOS и Windows этого достаточно.
Загрузить образ флоппи диска в расширенную память и перенаправить вызовы флоппи-диска BIOS на этот "электронный" флоппи диск. Эта команда автоматически выполняет HideBootProm. Вы можете использовать команду FloppyBoot для загрузки системы с электронного диска, который вы только что создали.
Этот электронный диск не настолько гибок, по сравнению с возможностями команды TFTPBoot. Единственное его преимущество - он использует несколько сот байт памяти вместо 64 Кб, используемых TCP/IP BootPROM. Внимание: в расширенной памяти после создания этот электронный диск ничем не защищен! Выгрузить этот электронный диск нельзя.
Аналогично LoadRamDisk, но образ диска должен быть сжат командой FileZip программы MrZip. Компрессированные диски защищены от потери данных (и неполной загрузки с сети) при помощи 32-битной контрольной суммы.
Продолжить загрузку системы (например, с образа флоппи-диска, созданного программой BpShell фирмы InCom). Смотрите также правила обращения к файлам, находящимся на других TFTP-серверах.
Скрыть ППЗУ удаленной загрузки, загрузить в память загрузочный сектор флоппи-диска и передать ему управление.
Загрузить заданный загрузочный сектор и передать ему управление. По умолчанию используется раздел 0 на диске номер 0, т.е. MBR первого жесткого диска. Вы можете загрузить ОС с любого раздела, но помните, что Windows 95 может не загрузиться, если у ее раздела не установлен флаг "активный" (подсказка: используйте SetBootPart).
Эта команда автоматически НЕ вызывает HideBootProm.
Загрузить в верхнюю память ядро и электронный диск Linux и запустить ядро, передав ему командную строку. Неплохая идея - передавать ядру в параметрах местоположение корневой файловой системы (например, "root=dev/hda1"). Если вы используете Linux, сильно привязанный к lilo (например RedHat Linux 5.1), то, возможно, вам понадобится передать ядру дополнительные параметры, например, BOOT_IMAGE=linux. Заметьте, что при помощи этой команды, ядро можно загрузить с сети (и оно автоматически попадет в кэш-раздел) или напрямую с заданного раздела.
Эта команда работает как с маленькими, так и с большими ядрами (zImage и bzImage).
В этом разделе описываются команды поддержки национальных языков. В круглых скобках приведены необязательные аргументы.
Переназначить заданные клавиши на другие. Например, если вы хотите поменять местами клавиши Y и Z, дайте команду Remapkeys "yzYZ" "zyZY" Небольшой совет - для символов, не включенных в первую половину ASCII, лучше будет использовать восьмеричные коды, а не напрямую символы - в последнем случае вам придется постоянно контролировать содержимое переменной $IsoLatin.
На некоторых клавиатурах существуют две клавиши с символом "обратный слэш". Они могут быть переназначены независимо - это возможно благодаря тому, что BpBatch распознает одну из них как клавишу с ASCII-кодом 0252 (восьмеричное), а другую как 0335 (восьмеричное).
Если вы пошлете мне пример скрипта, переназначающий клавиши для вашей национальной клавиатуры, то я помещу его в http://cuiwww.unige.ch/info/pc/remote-boot/soft/sample-scripts.Чтобы вам было проще создать свою раскладку, я советую нажимать все необходимые клавиши без переназначения и записать символы, которые они производят. Это будут исходные_клавиши. Переназначенные_клавиши - это те символы, которые вы хотите видеть, вместо исходных, в том же порядке. Если некоторые из символов (исходные или переназначаемые) выдают символы с ASCII-кодом больше 127, используйте восьмеричные коды. Восьмеричный код символа вы можете найти в любой таблице ASCII-кодов, например, в программе HelpPC (HelpPC - это программа контекстной помощи от David Jurgens).
Переназначить клавиши при нажатии их вместе с ALT. Например, чтобы переназначить Alt-2 на знак амперсанд используйте
RemapAltKeys "2" "&" |
Загрузить и включить заданную таблицу кодировки. Эти таблицы используются для преобразования символов Unicode (используемые, например, в файловой системе VFAT) в 8-битные символы. Если не загрузить верную таблицу кодировки, то FAT будет выдавать сообщения о том, что на диске в менах файлов используются специальные символы.
Все таблицы кодировок можно найти по адресу http://cuiwww.unige.ch/info/pc/remote-boot/soft/codepage.zip
По умолчанию используется кодовая страница 850 - переупорядоченная версия ISO-Latin-1. Если вы хотите использовать другую страницу, установите переменную $IsoLatin в "off", или получите абсолютно непредсказуемый результат.
Загрузить заданный шрифт VGA/VESA и использовать его в текстовом и графическом режиме. Файл шрифта - это двоичный файл, в котором находятся изображения символов, по 16 байт на символ (размером 8x16). Эта команда может использоваться как в целях поддержки национальных языков, так и в целях украшения шрифтов.
Архив с достаточно красивыми шрифтами можно найти по адресу http://cuiwww.unige.ch/info/pc/remote-boot/soft/fonts.zip. В этот файл входит программа, которая позволяет извлекать шрифты вашей кодовой страницы из файлов .CPI DOS.
Source (i)archive "имя_файла" Source path "путь" |
Установить источник при работе с архивами в заданный (i - дополняющий) архив или путь на диске.
Dest (i)archive "имя_файла" Dest (i)dump Dest path "путь" |
Установить приемник при работе с архивами в заданный (i-дополняющий) архив, дамп или путь на диске. Для задания формата вывода дампа в журнал используйте переменную $DumpFormat.
Сжать файл для дальнейшего использования командой FileUnzip или LoadZRamDisk. Файл защищен от потерь данных 32-битной контрольной суммой.
Filter -"шаблон" Filter +"шаблон" |
Исключить из архива/включить в архив файлы и каталоги, соответствующие шаблону (в нем можно использовать символы * и ?). Шаблон сверяется с полным путем к файлу или каталогу. Включающий фильтр имеет больший приоритет, чем исключающий - то есть, если файл исключается по шаблону со знаком минус и включается по шаблону со знаком плюс, то он войдет в архив.
Для образов DOS/Windows-разделов используйте
Filter -"*.swp" Filter -"temp/*" |
Filter -"var/log/*" Filter -"tmp/*" |
Начать операцию работы с архивами в соответствии с установками, заданными командами source, destination и filter. Эта команда обычно вызывается реже, чем ее краткие формы, приведенные ниже. Правда, ее можно использовать для разбивки уже готового архива на части, например:
set FragmentSize="30 MB" Source archive "original.imz" Dest archive "refragmented.imz" CopyArchive |
Сокращенная форма от
Source path "путь" Dest archive "полный_архив" CopyArchive |
Сокращенная форма от
Source archive "полный_архив" Dest dump CopyArchive |
Сокращенная форма от
Source archive "полный_архив" Dest dump CopyArchive |
Сокращенная форма от
Source iarchive "доп_архив" Dest dump CopyArchive |
Сокращенная форма от
Source path "путь-источник" Dest path "путь-приемник" CopyArchive |
Nobreak.sys - это небольшая программа (размером около 350 байт), которую вы можете загрузить в начале config.sys. Ее цель - обезопасить процесс загрузки и авторизации пользователя от нажатия Ctrl-Break. В DOS есть подобный механизм (BREAK=OFF), но он не настолько надежен, и практически не работает в autoexec.bat. Наш драйвер обрабатывает скан-коды клавиш на уровне BIOS. Таким образом, ни одна программа просто не получит код клавиши Break, пока его обработка не будет разрешена.
Драйвер должен быть загружен в config.sys (или при помощи программы devlod из Недокументированной DOS). После этого Break можно снова разрешить, послав Yes специальному псевдо-устройству NOBRK, или запретить, послав No (на самом деле обрабатывается только первый символ - Y или N).
Драйвер использует вызовы BIOS, и, соответственно, работает только в DOS и Windows 3.1. В Windows 95 встроена своя внутренняя обработка клавиатуры.
Исходный текст на ассемблере можно взять здесь.