Next Previous Contents

5. 硬件启动工具程序参考手册

本节将提供我们于 日内瓦大学, CUI 为硬件启动架构, 所发展的工具程序的详细说明信息.

5.1 BpBatch, MrBatch 及 MrZip

这三个名称是为了给同一个程序赋予三种变化, 分别有下列的特性:

命令列参数

所有的程序都可以接受相同的参数用法. MrBatchMrZip 可在命令列下取得参数, 而 BpBatch 则藉由参考 BOOTP 通讯协定的 option 155 (十进制) 取得. 这是参数用法 :

        [-x] [-l] [-b] [-v] [-w] [-i] [script-basename]
说明: script-basename 是附加的选项. 如果有设定, MrBatchBpBatch 会载入以 .bpb 为副档名的文档, 而 MrZip 会载入以 .mrz 为副档名的文档. 如果没设定, MrBatchMrZip 会执行于交谈模式, 而 BpBatch 会载入与 BOOTP 可开机档名同主档名, 但以 .bpb 为副档名的文档.

语法

以下的规则用于 BpBatch 分析输入行.

空行会被忽略. 该行由 (#) 启始则会被当成注解, 不做任何解释. 该行由 (:) 启始则会被当成标签, 不做任何解释.

字串表示

字串由双引号括起来的可被识别到:

        "Hello world"
如要在字串中放入双引号, 则必须用, 反斜线符 (backslash) 括起来:
        "I said: \"Hello world\""
字串可以用一些运算子来做预先修正. 运算子可以一再使用以修正出所需的字串样式. 如果想知道关于字串长度及文字个数的运算子, 可以参考下面 "数值表示法" 一节.

数值表示法

数值表示是以 32 位元整数来运算 (由 -2,147,483,646 到 2,147,483,647). 十六进制, 八进制, 及二进制 数值则无法辨别. 如果一遇到数值表示, 则必要经过下面的辨识程序:

延迟

部份指令须要延迟来当作参数. 延迟时间是以秒为单位, 精度到十分之一秒:

        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

参考文档

档名是一种字串. 他们必须以双引号括起来. 文档名称在大小写有别的文档系统时, 就有大小写的分别; 反之, 于无大小写之别的文档系统时, 就有无大小写的分别. 斜线符 与 反斜线符 可以自由的择一使用. 但别忘记 要用到溢位字元 反斜线符 必须用 双反斜线 来表示.

有两种类型的文档参考:

直接参考到本机磁盘机上的文档用法:

        "{磁盘机号码:分割区}/绝对路径/文档名称"
可以省略磁盘机号码预设值是零. 比如, "{:1}/usr/bin" 是指在第一个分割区有 /usr/bin 这目录. 直接参考到本机磁盘上文档的 I/O 功能完全是我们自行实作出来的 (我们不使用作业系统所提供的功能).

有两种 特别的 分割区. 分割区零 是指磁盘机上的主开机记录 (MBR) 并提供一个虚拟文档系统装置以让你存取开机识别码. 分割区负一 (-1) 是指快取文档系统 (参考下面叙述).

在 BpBatch/MrBatch 环境下, 如果有 BootPROM 存在, 则外部的文档是指到硬件 TFTP 伺服器上:

        "help.bpb"           是指在 /tftpboot 下的 help.bpb 文档
        "images/MyImage.pcx" 是一个在 /tftpboot/images 下的文档
如要参考到其他的 TFTP 伺服器可以用:
        "198.76.54.32:help.bpb"
如果伺服器要绕过闸道器可以用 :
        "198.70.0.1/198.76.54.31:help.bpb"
亦可以自行决定特殊埠号作 TFTP 连结 :
        "198.76.54.32@89:getpasswd/smith"
在同一时间只能有一台机器开启硬件文档. 如果 BootPROM 不存在, 硬件的文档会透过作业系统的文档 I/O 功能来模拟, 但同样的限制依然存在.

在 MrZip 环境下, 硬件的文档是透过作业系统存取到该档. 这里就没有任何限制, 硬件的文档可被当成直接参考到本机磁盘文档一样来使用. 而硬件的文档通常会比直接参考到本机磁盘文档还快, 因为作业系统本身有较多的暂存区. 如果作业系统有支持, 则硬件文档可被当成网路上的文档.

        "C:\\autoexec.bat"
        "C:/config.sys"
        "/mnt/net/usr"

快取文档系统

为了降低网路负载并加快 开机速度, 磁盘文档存取速度, Linux Kernel 及其他文档可以由硬盘里快取得到. 磁盘快取的区域是在硬盘机的末端, 介于分割表中最后一个对应到的磁柱与磁盘最后一个理论磁柱之间 (于任何对应要使用的分割区之外). 要使快取文档系统作动, 就必须在最后一个分割区到磁盘机末端之间保留空间. 而如果你要回存一个磁盘映像档, 则更要让快取文档系统作动才行.

这个磁盘快取是由一个具 CRC 确认检查的变易性文档系统所组成: 每个目录 及 每 32 KB 的资料区块 都以一个 32 位元的 CRC 来检查确认. 每当一个目录或资料区块无预警的改变后, 则该文档会自动由快取区移除; 并在下次存取要求时, 再次下载新的资料以吻合现况.

你可以透过 BpBatch, MrBatch 及 MrZip 自由存取快取文档系统, 用直接存取本机磁盘文档功能存取特别分割区 "{:-1}" . 要检视快取区内容, 只需输入 :

        logdir "{:-1}"
如果快取区资料毁损且不会自动清理时 (这状况应该不会发生), 你只要输入 (在交谈模式下) :
        clean -1
或在 BpBatch 第一次存取快取时, 同时按下两个 shift 键.

特殊变数

有些变数在初值设定时具有特别的意义. 一部份是存在于所有的程序, 另一部份只可以在 MrZip 执行时才存在, 但仍有一部份只能在 BOOTP/DHCP 回应收到的时候才存在.

通用变数

参考 BOOTP 变数 与 MrZip-规范的变数.

MrZip-规范的变数

以下是只能在 MrZip 使用的变数.

BOOTP 变数

以下的 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
n 是十进制数值代表 BOOTP 选项号码.

别把 BOOTP-Gateway-IP 搞混了, 它是 TFTP 通讯协定的闸道器, 如果用户端与 TFTP 伺服器在同一个子网域, 则应设为 0.0.0.0 , 而 BOOTP-Routers, 内含 预设 IP 闸道器. TCP/IP BootPROM 有时会透过 BOOTP-Routers 设定 BOOTP-Gateway-IP 的值, 乃因为每个 TFTP ack 封包都会先送往 路由器. 为了避免这种行为, 如果你的 TFTP 伺服器与用户端在同一个子网域, 则强迫把 BOOTP-Gateway-IP 设成 0.0.0.0 (感谢 Maciek Uhlig 指出这个问题).

监控指令

本节列出用来监视系统状态的指令. 额外的参数也将列入 (我比较喜欢使用 方括 来注明, 但 LaTex 不喜欢在这看到他们...)

Interact

显示记录资料并进入交谈模式直到 QUIT 或 EXIT 输入. 在离开交谈模式之前先输入HideLog, 以防止记录的信息干扰批次档的执行.

Help (主题)

载入线上说明档 (bpbatch.hlp) 并显示所给定主题的内容. 如果没设定主题, 或给定的主题找不到, 显示说明索引.

Log "字串"

显示字串到记录档. 不加入 游标 返回/换行 字元.

Echo "字串"

显示字串到记录档并跳至下一行. 相同于

        Log "text\r\n".

LogVars ("pattern")

记录 (即. 显示到记录档中) 所有合于所给定样式的变数. 样式可以使用万用字元 (? 及 *).

范例: LogVars "BOOTP-*"              列出所有 BootP 变数
LogDir "path/pattern"

记录 (即. 显示到记录档中) 所有合于所给定样式的文档. 样式可以使用万用字元 (? 及 *).

范例: LogDir "/usr/g*p"              列出所有档名为 g...p 的文档
LogTree "路径"

记录以给定路径为根目录的树状目录结构.

LogFile "文档名"

记录文档的内容. 文档大小必须小于 64 KB.

ShowLog

使隐藏的记录档显示. 在 "$AutoShowLog" == "ON" 并按住 ESC 状况, 或交谈模式下, 会自动启动.

HideLog

防止记录的信息出现在萤幕上. 当 BpBatch, MrBatch 及 MrZip 以执行脚本程序档时为预设状态.

CaptureLog

录下所有的记录信息到 64 KB 的暂存区直到 EndCapture 出现. 记录输出超过 64KB 会清除暂存区资料. 这个指令用来产生制式内容的文字档. EndCapture 指令必须在同一个脚本文档中出现.

EndCapture ("档名")

结束截取记录信息. 如果有给定档名, 会把截取到的文字存到该档. 否则, 会忽略掉它.

Beep

发出一个声音. 这个指令是同于 Echo "\007".

控制指令

本节列出批次执行的控制指令. 额外的参数也将列入.

Include "filename"

载入所给定的文档并对它做语法分析. 在此引入的文档执行结束后返回此载入点. 在此引入档中, ASCII 127 以上的字元的意义, 由载入此档时 $IsoLatin 的值来决定.

OnExit command

设定一个外部处理器. 它会在现行批次档终了时自动执行.

Goto label

移到所指的标签 (label) 执行 (即. 以 :label 为起始的行)

Eval "指令"

执行 "指令" 所指的替代命令并对其做语法分析.

If ...

  If (not) <expr1> (==|!=|<|>|>=|<=|=>|=<|<>) <expr2> <command>
  If (not) (ci) "str1" (==|!=|<|>|>=|<=|=>|=<|<>) "str2" <command>
  If (not) (ci) "str1" Match-Expr "样式" <command>
  If (not) (ci) "str1" Match-Passwd "unix 密码" <command>
  If (not) (ci) "str1" in "wordlist" <command>
  If (not) (ci) "str1" in-file "档名" <command>
  If (not) exist "档名" <command>
  If (not) valid <硬盘机>:<分割区> <command>

如果条件测试成立; 这些指令用来执行指令 command; . 第一种格式用来比较两个以数字来表示的运算式. 第二种格式用来比较两个字串, 可选择不区分大小写. 第三种格式用来测试 "str1" 是否合于样式 (允许使用万用字元). 第四种格式用来测试明码 "str1" 是否经 Unix 的编码系统后结果,能吻合. 第五种格式用来测试 "str1" 是否被引入在文字列表中. 第六种格式用来测试 "str1" 是否被引入在文字文档中. 第七种格式用来测试所给定的文档是否存在. 第八种格式用来测试所给定的分割区是否有效 (即. 是否已格式化过). 这个格式只在 BpBatch 1999年 二月后的版本才有.

Set ...

  Set variable = "string-value"
  Set variable = <expr>

设定变数值. 如果给定的是数值运算式, 它将间接转化为字串形式. 所定义的变数可以在任何地方以 $variable 或 ${variable} 的形式来参考使用. 如果参考的结果要当成字串, 则必须用双引号把变数括起来: "$variable" 或 "${variable}".

Delay 周期时间

等待直到所指定的时间耗尽 (以秒为单位). 参考时间表示格式那一章节.

GetTime 变数, GetDate 变数

取得 CMOS 的时间信息并把它存到 变数 中, 格式为 HH:MM:SS. 取得 CMOS 的日期信息并把它存到 变数 中, 格式为 YY/MM/DD. 这样就可以依时间或日期来调整你的开机程序内容.

SetTime "HH:MM:SS", SetDate "YY/MM/DD"

设定用户端电脑的 CMOS 时间或日期为所给定的值. 如果你有一台安全认证闸道器 (security gateway) (或我们的特殊型 TFTP 伺服器), 你可以透过下列指令在每次开机时, 自动调整 CMOS 时间与日期信息:

        include "$Security-Gateway:gettime"
如果你想知道这个指令会做哪些事, 只需输入:
        logfile "$Security-Gateway:gettime"

Poweroff

关掉电脑电源. 这个指令只能在具 Advanced Power Management (APM) 兼容的电脑上使用.

与键盘相关的指令

本节列出一些指令让你可以监控键盘的输入. 额外的参数也将列入. 亦可参考后面提到的 国际化语系支持 一节.

GetKey (变数)

一直等到键盘按下某键并把它存到 变数 中.

WaitForKey 周期时间 (指令)

于所指定的 周期时间 内等待键盘按下某键单位为秒. 如果时间内没按下任何键, 则执行 指令. 否则, 保留键值在键盘暂存区中. 亦可参考时间格式那一段.

Input (变数 (最大字串长度))

自键盘读取一个以 return 为结尾的字串, 并把它存在 变数 (不会把 return 存进字串). 如果有给定 最大字串长度 , 则不允许使用者输入字元超过这个长度.

亦可参考 与安全性有关的指令 一节中, 的 GetPasswd 指令.

OnKey "c" 指令

设定 当 "c" 某个单一字元被按下时, 会自动去执行所给定的 指令 (例外情况为 正使用到 GetChar 或 某个 Input 指令, 而系统处于等待输入的状态). 如果用 "default" 字串来取代单一字元 "c", 则指令会在按下任意键后就执行.

文字输出指令

本节列出用来输出格式化文字的指令. 所有提到的指令都可以在图形模式下使用, 可以得到相同的功能 (在文字环境下可以提供 80x25 字元模式, 而图形化环境则可题供 100x37 字元模式, 因为图形化环境每个字元大小是 8x16). 额外的参数也将列入. 亦可参考下文的 国际化语系支持.

Print "字串"/运算式

在目前游标所指的位置印出字串/运算式, 并采用目前的文字属性并移动游标. 加入到字串中 "\r\n" 以换行.

TextAttr 前景颜色 背景颜色

设定文字属性. 也可以用一个数值来设定颜色方法是 16*背景颜色+前景颜色.

如果你还想更炫, 可以用 LoadFont 指令. 参考下文的 国际化语系支持.

At line,col (command)

移动游标位置到所指定的位置并执行命令. 如果有设定的话.

范例范例: At 10,20 Print "Gnats and rats !"
Clear (颜色 (文字样式 (顶部,左限,底部,右限)))

以所给定的 文字样本 填满所定义的文字区域 (可以是字串或十进制的 ascii 码). 预设的文字区域为全萤幕, 而文字样式为 全黑 (ASCII 十进值 219) 且颜色是黑色 (清除萤幕). 移到游标到所清除区域的左上角.

与旧版的 BpMenu 兼容的指令

  .ATT (<属性>)
  .CLS (<属性>)
  .DEF <键值> (<等待时间>)
  .KEY <键值> <档名>
  .POS ((< x 轴位置 >) < y 轴位置 >)
  .PWD <键值> <编码过的密码>
  .WLN (<字串>)
  .WRT <字串>

参考 Bootix 的使用手册可以获得更多信息. 我们先前写了一个程序 program 用来编辑选单文档. 就是用这个语法, 但使用新的语法来建立选单是比较好. 需注意 .PWD 指令并没被实作出来. 因为我们根本不知道 Bootix 的编码法则.

图形输出显示指令

本节将列出在图形模式下, 如何输出图形到萤幕上. 这章节中所列出的功能与所给定的像素相关. 当然你也可以在图形模式下, 使用所有文字输出的指令 (参考前文). 额外的参数也将列入.

需注意图形模式会在使用到与图形相关的指令时自动启用, 除非设定 VESA 变数为 "OFF".

InitGraph ("模式")

启用 VESA 图形模式. 原点在萤幕左上角 (0 0). 在 Windows 95/98 下使用 VESA 模式可能会当机. 在使用 MrBatch 时, 加上 -v 选项以避免发生这个问题.

你可以要求使用某个特定的显示模式, 如果有给定 "模式" 这项参数. 这个参数是附加的: 如果你没做任何定义, 则会从选用 VESA-Modes 变数中第一行的显示模式.

可用的模式有 :

VESA-Modes 变数列出你的硬件设备能支持的模式.

范例: InitGraph "640x480"

CloseGraph

关掉 VESA 图形模式返回文字模式.

DrawBar x-轴位置 y-轴位置 宽度 高度 颜色

VESA 绘图功能. 以给定的大小与颜色画出一个实心长条图.

DrawWindow x-轴位置 y-轴位置 宽度 高度 (背景颜色 (长条图颜色)) ("主题文字" (主题文字颜色))

VESA 绘图功能. 以给定的大小与颜色画出一个视窗. 预设的背景颜色是 淡灰色 (LightGray) 而 主题部分是蓝色 (Blue). 如果你引入一个主题字串及颜色, 则文字会显示在 主题那部份.

Drawtext x-轴位置 y-轴位置 "字串文字" (前景颜色)

VESA 绘图功能. 在给定位置显示字串文字并采用透被明背景. 预设为前景文字的颜色.

DrawPcx "pcx-图档名" ( x-轴位置 y-轴位置 (颜色用法))

VESA 绘图功能. 载入所给定的 256-色 PCX 图档并显示到萤幕上. 预设的显示位置在萤幕左上角的 (0 0).

颜色用法 定义当使用超过 256 种颜色时, 所对应的调色盘 (比如要同时显视两个 256 色的图档):

预设是使用 Best-Colors.

DrawGif "gif-图档名" ( x-轴位置 y-轴位置 (颜色用法))

VESA 绘图功能. 载入所给定的 256-色 GIF-87a 图档并显示到萤幕上. 这个文档可以是交错的, 但必须是 GIF-87a 格式 (非 GIF-89a). 图档的大小会修正到合于目前所使用的显示模式. 但你不能载入一个 1024x768 GIF 图档到 640x480 图形模式下. 预设的显示位置在萤幕左上角的 (0 0).

因为 LZW 专利问题, 这项功能在商业版的 BpBatch/MrBatch 不提供. 请改用 DRawPcx 指令.

颜色用法 定义当使用超过 256 种颜色时, 所对应的调色盘 (比如要同时显视两个 256 色的图档):

预设是使用 Best-Colors.

与安全性有关的指令

本节将列出用来认证使用者身份的指令. 额外的参数将列在段落间.

部份的功能可与 安全性闸道器 (security gateway) 一并使用, 所以你必须先安装它. 参考 特殊 TFTP 伺服器 一节以获得更多信息.

GetPasswd (变数 (密码最大长度))

就跟 Input 指令一 样, 但会在输入字元时改显示星号.

Crypt "字串" "salt" 变数

以 Unix 编码功能对所给定的 8 个字元加密, 并把加密后结果以字串形式存到 变数. 而 "salt" 通常是两个可以在加密后字串中找到的前两个字.

要注意 Unix 编码系统是单向的. 无法对已编码过的字串解码还原. 只能试著用相同的 salt 比较其编码过的字串是否一致.

这个功能是用 BSD 实作的 DES 编码系统. 这是 BSD 版本的标头: Copyright (c) 1989 The Regents of the University of California. This product includes software developed by the University of California, Berkeley and its contributors.

DESCrypt "字串" "键值" 变数

对给定的字串加密用给定的 8 个字元 键植来编码并以十六进制格式的字串存入 变数.

这个功能是用 BSD 实作的 DES 编码系统. 这是 BSD 版本的标头: Copyright (c) 1989 The Regents of the University of California. This product includes software developed by the University of California, Berkeley and its contributors.

DESDecrypt "hexcode" "key" 变数

用给定的 8 个字元来对十六进制字串解密并把结果存到 变数.

这个功能是用 BSD 实作的 DES 编码系统. 这是 BSD 版本的标头: Copyright (c) 1989 The Regents of the University of California. This product includes software developed by the University of California, Berkeley and its contributors.

MD5 "字串" 变数

用 MD5 对给定字串编码后的检查值以十六进制的字串格式存到 变数. 对于密码大于 8 个字元的, 可采用的 Unix 编码功能.

这个功能是 MD5 标准的实作. 这是它的版权页标头: RSA Data Security, Inc. MD5 Message-Digest Algorithm

CheckUser "使用者名称" "密码" "领域"

连接到 $Security-Gateway 并检查所给定的使用者是否存在所给定的 radius 领域并检查密码是否吻合. 如果领域是 "Unix", 则使用于 安全认证闸道器上, Unix 的 使用者/密码. 若在其他领域, 使用安全认证闸道器领域定义档, 以侦测正确的 Radius 或 NT 领域.

设定 $Security-Check 的值为 "PASSED" 或 "FAILED". 密码不会以明码在网路传输.

与磁盘相关指令

本节将列出用来调制硬盘资料的指令. 额外的参数也将列入.

GetPartitions 变数 (磁盘机名)

读取所给定的磁盘机的分割表并以字串格式存到所给定的 变数. 所存的字串是硬盘内空间分布的列表 文档形式:空间大小, 其中

参考 SetPartitions 以获得更多与分割区有关的信息.

SetPartitions "分割区" (硬盘机名)

依字串内容设定分割表. 个式同于 GetPartitions 指令. 这个指令也同时会重置所有的开机旗标 (提示: 使用 SetBootPart).

在主开机纪录 (MBR) 中的主要分割区只能有四个. 而且, DOS 及 Windows 在主分割表中, 只能允许一个 FAT 分割区 (称为 主要分割区, C:). 其他的 FAT 分割区只能分布在一个延伸分割区里 (而他们称为逻辑分割区). 如果我们把 MBR 分割表中的分割区编号为 1-4 , 则 5-8 为存于第一个延伸分割区的逻辑分割区, 定义两个 FAT 分割区可以如此做: 分割区 1 为 FAT, 分割区 2 为 EXT, 分割区 5 为 FAT. 分割区 3,4,6,7 及 8 则为 UNUSED. 同样的划分方法可以采递回的方式设定出两个以上的 FAT 分割区: 在分割区中设定一个延伸分割区 6 并加入一个 FAT 逻辑分割区 9 .

在大部份较严紧的 DOS 规范中, 分割表第 3 和 第 4 个分割区将不被使用. 事实上, 部份 DOS 版本及其他作业系统都能允许分割表中超过两个分割区, 但并没有相当明确的规定. 就这方面的问题而言, BpBatch 对分割表的意义有较弹性的解释, 它可以了解作业系统无法知道的部份.

一个通用的规则就是不要在分割表中设置超过两个延伸分割区, 否则分割区编号的划分方式将被破坏.

如果你想测试一些有趣的设定, 以增加经验. 那就不要抱怨作业系统无法分辨你的分割区. 保证可以正常工作的划分方式是以主要分割区存放作业系统的开机分割区, 把其他分割区一并摆到延伸分割区.

延伸分割区设定的范例如下:

        SetPartitions "BIGDOS:100 EXT:400 EMPTY EMPTY BIGDOS:400"

GetBootPart 变数 (硬盘机名)

取得具可开机旗标的分割区号码 (DOS 的说法是: 已作用的主分割区) 并把它存到 变数 中. 第一个分割区编号是 1. 如果没有具可开机旗标的分割区, 则回应 0.

SetBootPart 分割区 (硬盘机名)

设定可开机旗标到所给定的分割区. 可开机旗标可以使主开机记录 (MBR) 决定哪一个分割区可以开机. 第一个分割区编号是 1 .

Blank 分割区 (硬盘机名)

在分割区内资料以零填满. 这对大的分割区会花掉不少时间. 别把这个分割区格式化为任一种作业系统使用. 亦可参考 Clean.

Clean 分割区 (硬盘机名) ("标签")

以分割表内所指定的格式快速格式化所给定的分割区. 如果有给定标签且文档系统有支持, 则会去设定分割区的标签. 如要更彻底的格式化, 那就叫用 Blank 指令来处理分割区.

Clean 现在支持 (FAT16) BIGDOS, FAT32, EXT, LINUX-EXT2 及 LINUX-SWAP 格式的分割区. 如果要清理主开机记录 (MBR), 使用 Clean 0.

Clean 可以用在资料分割区及 MBR/EXT 分割区. 而如果你在使用 FullUnzip 指令之前想要先用 clean 指令来清理资料则是无意义的.

FullUnzip "完整的磁盘映像档" 分割区 (硬盘机名)

解压缩一个完整的磁盘映像档到所给定的分割区, 覆写任何已存在的文档 (快速清除).

FullUnzip 支持 (FAT16) BIGDOS, FAT32 及 LINUX-EXT2.

这个指令会启用 VESA 绘图功能来显示程序正进行中的旗帜, 除非 VESA 被设为 OFF.

IncrUnzip "增量型的磁盘映像档" "目的路径"

解压缩一个增量型的磁盘映像档到所给定的目的路径. 这会取代掉目的路径中与映像档中所含档名相同的文档, 而其他的文档则会不会被删除.

IncrUnzip 支持 (FAT16) BIGDOS, FAT32 及 LINUX-EXT2 文档格式. 这个指令的效率远低于 FullUnzip 指令, 因为它必须能保护原来的文档系统不受损, 且它可藉由储存多个映像档的差异处, 以免去保存多个磁盘映像档.

FileUnzip "来源档名" "目的档名"

解压缩先前由 MrZip 的 FileZip 指令所压缩的文档. 这个文档会经 32-位元 CRC 检查.

Copy "来源档名" "目的档名"

以位元组对位元组的方式, 复制来源文档到目的文档. 可以在 FullUnzip 之后使用以更新在伺服器上的设定档而不需重新建立映像档. FileUnzip 指令, 最好使用在大而易于压缩的文档下.

Append "来源档名-1" "来源档名-2" "目的档名"

以位元组对位元组的方式, 复制第一个来源文档, 接著是第二个 到 目的文档. 可用于任意大小的文档. 目的档名不可含有任一个来源档名.

Patch "来源档名" "目的档名" ("先期修正" ("后期修正"))

读取来源档并以在写入目的档前, 针对变数作取代. 对于 ASCII 码大于 127 的解释由 $IsoLatin 变数来决定.

预设, 可以辩识到以 "${" 及 "}" 所括起来的变数. 且可以把他变换成非空的字串. 记住, 如果你要在修正内容中摆入钱字符则必须用溢位字元或者让它可以在巨集中被辨识到. 例如, 如果你要明确的使用预设的先期与后期修正, 使用:

        Patch "来源档名" "目的档名" "\${" "}"

MkDir "路径"

递回地产生由根目录启始到所指路径的目录. 如果路径已存在, 则指令无效.

Delete "档名", Del "档名"

移除所给定的档名. 文档必须存在.

DelTree "路径"

递回地移除由根目录到所指路径的所有文档与目录, 并把所给定目录移除.

开机指令

本节将列出用来延伸开机流程的指令. 额外的参数将也列入.

HideBootProm

回存 BootPROM 所对应的内存与中断向量. 在叫用这个指令之后所有想要使用 TFTP 传输的功能会失效. 在 HdBoot 指令叫用之前使用这个功能是个好主意, 否则你在 DOS/Windows 下会导致内存不够用. FloppyBoot 指令会直接叫用这个功能.

记住虽然这个功能会回存所有 BootPROM 会使用到的中断向量 (正式公布的), 但目前看来似乎并没把所有的都回存. 不过这对 DOS 及 Windows 已经足够了.

LoadRamDisk "ramdisk的档名"

载入一个软盘的磁盘映像档到延伸内存并重导 BIOS 的磁盘服务, 使得与软盘有关的呼叫都用这个映像档取代. 这个指令会直接叫用 HideBootProm 指令. 叫用 FloppyBoot 指令以用你刚刚所载入的 ramdisk 开机.

这种形式的 ramdisk 可能不若你用 TFTPBoot 指令来的稳定. 唯一的优点是可以由 TCP/IP BootPROM 所预留的 > 64KB 中, 多偷出几百位元组的传统内存. 但也要警告你, 在 ramdisk 所存放的延伸内存区并不具任何安全性. 也没有任何方法可以移除这种 ramdisk.

LoadZRamDisk "ramdisk 的档名"

LoadRamDisk 作相同的事, 但是是针对已用 MrZip 文档压缩过的映像档. 被压缩过的 ramdisk 采用 32 位元的 CRC 检查以防止资料错误 (及 不完整下载).

TFTPBoot "硬件开机档名"

连结到另一个可开机档 (比如 一个由 Bootix 的 BpShell 程序所产生的软盘映像档). 参考对存取 TFTP 伺服器上文档的参考转换的方式.

FloppyBoot

隐藏 Boot ROM, 载入软盘机的开机磁区并用它来开机.

HdBoot (磁盘机名)(:分割区)

载入所给定的可开机磁区并用它开机. 预设磁盘机为 零, 第一颗硬盘机, 而分割区预设为 零, 也就是主开机记录. 你可以从任一个分割区来开机, 但必须注意 Windows 95/98 不能让你在没设定为可开机分割区的分割区开机 (题示: 使用 SetBootPart).

这个指令不会直接叫用 HideBootProm, 所以你要先叫用它.

LinuxBoot "Kernel档名" ("命令列" ("ramdisk 的档名"))

载入所给定的 Kernel 及 ramdisk 到高层的内存, 设定命令列并用这个 Kernel 开机. 至少放个根文档系统的位置在命令列中会是个好主意 (如 "root=dev/hda1"/). 如果你使用的系统相当依赖 lilo (如 RedHat Linux 5.1), 则在命令列中加入像 BOOT_IMAGE=linux 这样的东西会比较好. 记住 Kernel 可以透过 TFTP 协定来载入 (自动从硬盘中快取) 或者直接由目的根分割区取用.

这个指令可以与小型的或大型的 Kernel (zImagebzImage).

国际化语系支持

本节将列出与国际化语系有关的指令. 额外的参数将也列入.

RemapKeys "原始键" "重新对应的键"

国际化键盘支持. 重新对应所给定的键为另一个字元. 比如, 把 Y 跟 Z 两键交换, 使用:

        Remapkeys "yzYZ" "zyZY"
在使用的字元不含在最小 ASCII 字元集中时, 使用八进制的表示法, 以避免必须依赖著 iso-latin 形式的设定.

对国际化的键盘而言, 在非对应过的模式 (US) 下, 有两种键来产生反斜线符. 而它们都可以各自地重新对应, 这要感谢 BpBatch 会把他们分别回应成 ASCII 码 252 (八进制) 或 ASCII 码 335 (八进制) 当 shift 键按下时.

如果你要传给我针对你们国家的键盘对应脚本档, 我会把它摆在 http://cuiwww.unige.ch/info/pc/remote-boot/soft/sample-scripts 为了帮助你设定你的键盘对应, 我建议你按下所有未对应到的 特殊功能 键并记下他们所产生的字元.

把它们摆在 原始键 这一栏. 而 重新对应的键 就是你想要它让你看到的样子. 如果部份按键 (不管是原始的或重新对应的) 产生超过 ASCII 十进位的 127, 则使用 八进制表示法. 你可以由 HelpPC (HelpPC 是一个由 David Jurgens 所写的, 超文字线上说明共享程序) 的 ASCII 表中, 取得所给定任意字元的八进位码.

RemapAltkeys "原始键" "重新对应的键"

国际化键盘支持. 重新对应所给定的键在 ALT 键按下时, 为另一个字元. 例如, 对应 Alt-2 为小老鼠符, 使用:

        RemapAltKeys "2" "@"
记住重新开机的键并不支持.

LoadCodePage "cpxxx.bin"

载入并启用所给定的二进制 Codepage 档. Codepage 是用来转换 Unicode 字元 (在 VFAT 的磁盘标签中所实作的) 为 8 位元的字元. 如果你没有载入正确的 Codepage, 当用到特殊字元来存取文档系统时, 会出现 FAT 警告.

所有的二进制 codepage 档可以在这找到 http://cuiwww.unige.ch/info/pc/remote-boot/soft/codepage.zip

预设的 codepage 是 850, 是有记载的字集 ISO-Latin-1. 如果你要载入一个外国的 codepage, 你就要把变数 $IsoLatin 设为 "off" 否则你会发生无意义的转换. 此外, 如果你要显示外国的字元, 你必须载入适当的萤幕字型 (使用 "LoadFont").

LoadFont "字型档名"

载入并启用一种 VGA/VESA 字型, 可以在文字及图形模式下使用. 字型档必须是二进位档 16 位元组/字元 (8x16 点阵). 这个指令可以在国际化语系中使用以得到更梦幻的支持.

具有多个梦幻字型的文档的压缩档在这 http://cuiwww.unige.ch/info/pc/remote-boot/soft/fonts.zip. 这个文档还包含用来汇出你所用的 codepage 下的 DOS .CPI 档中的字型的程序.

MrZip 指令的规格

Source...

  Source (i)archive "档名"
  Source path "路径"

设定要处理的来源文档 (或增量形式的) 档名与路径.

Dest...

  Dest (i)archive "档名"
  Dest (i)dump
  Dest path "路径"

设定要处理的目的文档 (或增量形式的) 档名, 路径, 或 顷印. 如要控制顷印时所要显示的资料量, 可以用 $DumpFormat 特殊变数来控制.

FileZip "来源档名" "目的档名"

压缩一个先前用 FileUnzip 或 ZRamDisk 所解压缩的文档. 这个文档会以 32 位元的 CRC 方式做检查.

Filter...

  Filter -"样式"
  Filter +"样式"

避免/允许 合于所给定样式 (允许万用字元) 的文档及目录被包含进映像档中. 样式吻合于完整的路境名. 预设, 所有的文档都会包含进映像档中. 你只须要明确表示出哪些文档必须由过滤器过滤. 每个负的过滤器都有相对应的正过滤器 (被允许的).

在 DOS/Windows 的映像档, 你只要用

        Filter -"*.swp"
        Filter -"temp/*"
而对 Unix 的映像档, 你则需要
        Filter -"var/log/*"
        Filter -"tmp/*"

CopyArchive

根据所提供的来源, 目的文档, 及过滤器等设定开始处理映像档. 只有在极少数的情况, 不然你通常都可以直接使用以下所列出的快捷用法以取代叫用 CopyArchive 指令. 其中一种情况你会用到 CopyArchive 就是当你要变更分割的映像档大小时, 如下:

        set FragmentSize="30 MB"
        Source archive "original.imz"
        Dest archive "refragmented.imz"
        CopyArchive

FullZip "路径" "完整的映像档名"

是下述的快捷用法

                Source path "路径"
                Dest archive "完整的映像档名"
                CopyArchive
你通常都要先设定过滤器.

IncrZip "路径" "增量型映像档名"

是下述的快捷用法

                Source path "路径"
                Dest iarchive "增量型映像档名"
                CopyArchive

FullDump "完整的映像档名"

是下述的快捷用法

                Source archive "完整的映像档名"
                Dest dump
                CopyArchive

IncrDump "增量型映像档名"

是下述的快捷用法

                Source iarchive "增量型映像档名"
                Dest dump
                CopyArchive

Xcopy "来源路径" "目的路径"

是下述的快捷用法

                Source path "来源路径"
                Dest path "目的路径"
                CopyArchive

5.2 NoBreak.sys

Nobreak.sys 相当小 (大概只有 350 位元组) 的驱动程序, 它将加在您 config.sys 中的开始处. 它的目的是保护开机程序不被中断, 直到使用者登入. DOS 为这提供一种设定 (名为 BREAK=OFF), 但它不够暴力, 并且在执行到 autoexec.bat 时一点用处也没有. 我们的驱动程序工作原理是当中断要求产生时修改键盘的扫描码, 直接在 BIOS 层工作. 以这方法, 所有的程序在中断未致能前都收不到中断信息.

这个驱动程序必须放在 config.sys 档中(或者使用 Undocumented DOSdevlod 程序). 接著, 可以透过传送 YesNOBRK 这个虚拟装置, 并且传送 No 而禁能 (事实上, 只需要第一个字元, YN 才是关键).

因为这个驱动程序依靠 BIOS, 所以它只能在 DOS 跟 Windows 3.1 下工作, 而 Windows 95/98 则有它自己的低阶键盘处理机制.

Assembler 语法的源程序在 .


Next Previous Contents