5. aboot 引导加载程序

当使用 SRM 固件时,aboot是启动 Linux 的首选方式。它支持

5.1. 获取和构建 aboot

的最新源代码aboot可从 alphalinux.orgalphalinux.org 镜像站点 获取。 也可以通过 CVS 从 www.alphalinux.org 获取,要从 CVS 获取最新版本,请使用以下命令
bash$ export CVSROOT=':pserver:anonymous@www.alphalinux.org:/home/axplinux/cvs/development'
bash$ cvs login
bash# cvs -z3 co aboot
(注意:CVS 登录没有密码,只需按 Enter 键)

本手册中的描述适用于aboot0.6 或更新版本。 请注意,许多发行版都附带了 aboot,因此可能没有必要从此目录下载 aboot。

下载并解压最新的 tar 文件后,请查看READMEINSTALL文件以获取安装提示。 特别是,请务必调整Makefileinclude/config.h中的变量以匹配您的环境。 通常,在 Linux 下构建时,您无需更改任何内容,但最好还是仔细检查一下。 如果您对配置感到满意,只需键入make进行构建(如果您不是在 Linux 下构建,请注意aboot需要 GNUmake).

运行make后,aboot目录应包含以下文件

aboot

这是实际的aboot可执行文件(ECOFF 或 ELF 对象文件)。

bootlx

与上述相同,但它仅包含文本、数据和 bss 段---也就是说,此文件不是对象文件。

sdisklabel/writeboot

用于安装的实用程序aboot在硬盘上。

tools/e2writeboot

用于安装的实用程序aboot在 ext2 文件系统上(通常仅用于软盘)。

tools/isomarkboot

用于安装的实用程序aboot在 iso9660 文件系统上(CD-ROM 发行商使用)。

tools/abootconf

用于配置已安装的aboot.

的实用程序

5.2. 软盘安装引导加载程序可以使用e2writebootaboot命令安装到软盘上(注意:这不能在 Jensen 上完成,因为它的固件支持从软盘启动)。 此命令要求磁盘没有过度碎片化,因为它需要找到足够连续的文件块来存储整个引导加载程序可以使用镜像(目前约为 90KB)。 如果由于此原因而失败,请重新格式化软盘并重试(例如,使用fdformat(1)aboot)。 例如,以下步骤将安装到软盘驱动器:
# fdformat /dev/fd0
# mke2fs /dev/fd0
# e2writeboot /dev/fd0 bootlx

/dev/fd0

中的软盘上,假设软盘在驱动器引导加载程序可以使用5.3. 硬盘安装aboot由于命令可能在高度碎片化的磁盘上失败,并且由于重新格式化硬盘并非没有痛苦,因此通常更安全的方法是使用swriteboot命令可能在高度碎片化的磁盘上失败,并且由于重新格式化硬盘并非没有痛苦,因此通常更安全的方法是使用命令将aboot安装到硬盘上。aboot需要为启动目的保留前几个扇区。 我们建议对磁盘进行分区,使第一个分区从 2048 扇区的偏移量开始。 这为存储留出了 1MB 的空间。 在正确分区的磁盘上,可以按如下方式安装):
# swriteboot /dev/sda bootlx

(假设磁盘是/dev/sda)。在分区c/dev/sda覆盖整个磁盘的系统上,有必要“强制”写入 aboot。 在这种情况下,请使用
# swriteboot /dev/sda bootlx -f3

-f命令可能在高度碎片化的磁盘上失败,并且由于重新格式化硬盘并非没有痛苦,因此通常更安全的方法是使用标志,后跟分区号(在分区bootlx的情况下,分区号为 3)

在 Jensen 上,您需要留出更多空间,因为您也需要在此处写入内核---当使用压缩内核时,2MB 应该足够了。 使用第 5.6 节中描述的

来写入aboot和 Linux 内核。bootlx5.4. CD-ROM 安装bootlx要使 CD-ROM 可通过 SRM 启动,只需如上所述构建。 然后,确保文件存在于 iso9660 文件系统上(例如,将
# isomarkboot filesystem bootlx

复制到作为文件系统主目录的目录,然后在该目录上运行mkisofs)。 之后,剩下要做的就是将文件系统标记为 SRM 可启动。 这可以通过以下形式的命令来实现bootlx上面的命令假设

filesystem

是一个包含 iso9660 文件系统的文件,并且已复制到该文件系统的根目录中。 就是这样!5.5. 构建 Linux 内核
# cd /usr/src/linux
# make config
# make dep
# make boot
# make modules (if applicable)
# make modules_install (if applicable)

可以使用以下步骤构建可启动的 Linux 内核。 在make config期间,请务必回答“是”,以询问您是否要通过 SRM 启动内核(对于某些平台,这是自动选择的)。 请注意,如果您构建通用内核(通过选择“Generic”作为 alpha 系统类型),则内核能够猜测它是否在 SRM 下运行。
# mount /dev/fd0 /mnt
# cp arch/alpha/boot/vmlinux.gz /mnt
# umount /mnt

最后一个命令将构建文件

arch/alpha/boot/vmlinux.gzaboot,然后可以将其复制到您要从中启动的磁盘。 在我们上面的软盘示例中,这将需要
boot devicename -fi filename
-fl flags

5.6. 启动 Linux使用 SRM 固件和 , 安装后,通常使用以下形式的命令启动 Linuxfilenameflags 参数是可选的。 如果未指定,SRM 将使用存储在环境变量中的默认值BOOTDEF_DEVBOOT_OSFILEBOOT_OSFLAGS

。 这两个参数的语法和含义在下面更详细地描述。 要列出这些变量的当前值,请在 SRM 命令提示符下键入

show boot*

。 这也将显示一个 boot_dev 变量(以及其他变量),此变量是只读的,需要通过 bootdef_dev 变量进行更改。

5.6.1. 设备命名安装到软盘驱动器这对应于 SRM 将尝试从中启动的设备。 示例包括

dva0

- 第一个软盘驱动器,在 Linux 下这对应于 SRM 将尝试从中启动的设备。 示例包括

dqa0

- 主 IDE CD-ROM 或硬盘作为主盘,/dev/hda这对应于 SRM 将尝试从中启动的设备。 示例包括

dqa1

- 主 IDE CD-ROM 或硬盘作为从盘,留出了 1MB 的空间。 在正确分区的磁盘上,可以按如下方式安装这对应于 SRM 将尝试从中启动的设备。 示例包括

/dev/hdb

dka0- 第一个总线上的 SCSI 磁盘,设备 0,这对应于 SRM 将尝试从中启动的设备。 示例包括

ewa0
>>> boot dka600

- 第一个以太网设备,/dev/eth0例如,要从 SCSI ID 为 6 的磁盘启动,您将输入/dev/eth0要列出系统中当前安装的设备,请在 SRM 命令行中键入

show dev

。 与 Linux 设备命名相反,磁盘设备上的分区号作为设备名称的一部分给出(当运行

时,您可能会看到设备名称后的额外数字 - 这些数字对应于 PCI 总线和设备编号之类的东西,对用户没有用处)。 请记住,正如第 2.3 节中提到的,SRM 对分区或磁盘标签一无所知 - 它只是从磁盘上的扇区读取引导块和辅助引导程序。 因此,分区号作为引导文件名的一部分给出。
>>> boot dka600 -file 2/vmlinux.gz

5.6.2. 引导文件名
>>> boot dva0 -file vmlinux.gz

filename 参数采用以下形式:“[n/]filenameabootn 是 1..8 范围内的单个数字,表示要从中启动的分区号。filename 是您要启动的文件的路径。 例如,要从 SCSI 设备 6 的第二个分区启动名为 vmlinux.gz 的内核,您将输入ext2或者要从软盘驱动器 0 启动,您将输入

如果磁盘没有分区表,aboot会假装磁盘包含一个aboot从第一个磁盘块开始的分区。 这允许从软盘启动。命令可能在高度碎片化的磁盘上失败,并且由于重新格式化硬盘并非没有痛苦,因此通常更安全的方法是使用作为一种特殊情况,分区号 0 用于请求从尚包含文件系统的磁盘启动。 当指定“分区”号 0 时,留出了 1MB 的空间。 在正确分区的磁盘上,可以按如下方式安装假定 Linux 内核存储在
# swriteboot /dev/sda bootlx vmlinux.gz

镜像之后。 这种布局可以使用

命令来实现。 例如,要从

设置无文件系统的启动,可以使用命令
-flags "options..."

以这种方式启动系统通常不是必需的。 存在此功能的原因是为了使在无法从软盘启动的系统(例如 Jensen)上安装 Linux 成为可能。

5.6.3. 启动标志

可以指定许多启动标志。 语法是

其中“options...”是以下选项的任意组合(以空格分隔)。 还有更多的启动选项,具体取决于您的内核安装了哪些驱动程序。 因此,下面列出的选项仅用于说明一般概念

load_ramdisk=1

在启动系统之前,将根文件系统从(软盘)磁盘复制到 RAM 磁盘。 RAM 磁盘将代替根设备使用。 这对于在只有一个软盘驱动器的系统上引导 Linux 很有用。

floppy=str安装到软盘驱动器, 将软盘配置设置为 str).

root=dev

选择设备 dev 作为根文件系统。 设备可以指定为主/次十六进制数(例如,/dev/sda2 为 0x802)或几个规范名称之一(例如,

/dev/sda2

single在单用户模式下启动系统。kgdb

启用内核 gdb(仅在启用abootCONFIG_KGDBaboot时有效; 需要通过串行端口连接第二个 Alpha 系统才能使其工作)

某些 SRM 实现(例如,Jensen 的实现)存在缺陷,只允许短选项字符串(例如,最多 8 个字符)。 在这种情况下,

可以使用单字符启动标志“i”启动。 使用此标志,aboot将进入交互模式
>>> boot dka0 -fl i
aboot> ?
 h, ?                   Display this message
 q                      Halt the system and return to SRM
 p 1-8                  Look in partition <num> for configuration/kernel
 l                      List pre-configured kernels
 d <dir>                List directory <dir> in current filesystem
 b <file> <args>        Boot kernel in <file> (- for raw boot)
                        with arguments <args>
 0-9                    Boot pre-configuration 0-9 (list with 'l')
aboot> b 3/vmlinux.gz root=/dev/sda3 single

5.6.4. 交互式使用 aboot

从 0.6 版本开始,aboot支持简单的面向命令的交互模式。 请注意,这与先前版本在使用“i”标志启动时或加载内核失败后发出的提示不同。 您可以通过在提示符下键入“h”或“?”来获取可用命令的摘要aboot5.6.5. aboot.conf 配置文件由于以这种方式启动很快变得乏味,允许为常用命令行定义快捷方式。 特别是,单个数字选项 (0-9) 请求使用存储在文件/etc/aboot.conf
#
# aboot default configurations
#
0:3/vmlinux.gz root=/dev/sda3
1:3/vmlinux.gz root=/dev/sda3 single
2:3/vmlinux.new.gz root=/dev/sda3
3:3/vmlinux root=/dev/sda3
8:- root=/dev/sda3            # fs-less boot of raw kernel
9:0/vmlinux.gz root=/dev/sda3 # fs-less boot of (compressed) ECOFF kernel
-

中的相应选项字符串。 下面显示了一个示例
>>> boot dka0 -fl 1
aboot.conf

使用此配置文件,命令aboot与上面显示的启动命令完全对应。

最后,在

提示符下,可以输入单字符标志(“0”-“9”)以获得与在启动命令行中指定该标志相同的效果。 如上面引用的帮助文本中所述,您还可以使用“l”命令列出可用的默认配置。aboot5.6.5.1. 选择 /etc/aboot.conf 的分区由于以这种方式启动很快变得乏味,当安装在硬盘上时,aboot需要知道在哪个分区中搜索将软盘配置设置为 str文件。 新编译的aboot将搜索第二个分区(例如,)。 由于必须重新编译才能更改分区号会很不方便,因此abootabootconfaboot允许直接修改已安装的留出了 1MB 的空间。 在正确分区的磁盘上,可以按如下方式安装。 具体来说,如果您想更改
# abootconf /dev/sda 3

以使用磁盘上的第三个分区,您可以使用命令aboot您可以通过简单地省略分区号来验证当前设置。 也就是说命令可能在高度碎片化的磁盘上失败,并且由于重新格式化硬盘并非没有痛苦,因此通常更安全的方法是使用abootconf /dev/sdaaboot在硬盘上。

将打印当前选定的分区号。 请注意,aboot必须已安装才能使此命令成功。 从 0.6 版本开始,使用存储在文件它将在安装新的:时保留现有配置由于以这种方式启动很快变得乏味,0-9, 0.5 版本以来,也可以通过启动命令行选择分区。 这可以使用以下形式的命令行完成:ab,其中 a 是保存的分区,b 是如上所述的单字母选项(i,或由于以这种方式启动很快变得乏味,h

)。 例如,如果您键入

boot -fl "3:h" dka100

5.7. 使用 DHCP 设置支持 BOOTP 的服务器

以下配置假设服务器正在运行 RH-6.2。 先决条件软件包是,

dhcp-2.0.5

# mkdir /tftpboot

tftp-server-0.16.5

# mkdir -p /var/state/dhcp
# touch /var/state/dhcp/dhcpd.leases

5.7.1. DHCP 和 BOOTP 配置

#tftp	dgram	udp	wait	root	/usr/sbin/tcpd	in.tftpd

安装这些软件包后,有一些设置问题需要处理。

subnet 192.168.1.0 netmask 255.255.255.0 {
       option routers                        192.168.1.1;
       option subnet-mask                  255.255.255.0;
       option nis-domain                "alphalinux.org";
       option domain-name	        "alphalinux.org";
       option domain-name-servers            192.168.1.2;
       range                 192.168.1.3   192.168.1.254;
       range dynamic-bootp   192.168.1.3   192.168.1.254;
       default-lease-time                          21600;
       max-lease-time                              43200;
       allow bootp;
       allow booting;
       filename "/tftpboot/vmlinux.bootp";	
}                                 

创建将使用 tftp 从中提取文件的默认目录。

创建 dhcp.leases 文件,该文件在安装 dhcp 软件包时默认情况下不会创建(尽管应该创建),以便 dhcp 服务器可以启动。

  • 配置 inetd 以接受 tftp 服务。 编辑您的 /etc/inetd.conf 文件并找到以下行。 然后取消注释并保存文件。创建 /etc/dhcp.conf 配置文件。 下面提供了一个示例配置,其中包含允许 BOOTP 的指令。

  • 5.7.1.1. 检查 /etc/dhcp.conf您应该关注四个指令。

  • range dynamic-bootp 192.168.1.3 192.168.1.254;,它定义了可用于 bootp 的 ip 范围。

  • allow bootp;,它告诉 dhcp 服务器允许 bootp 协议。

allow booting;

# service inet restart

,它告诉 dhcp 服务器允许传输在 “filename” 指令中指定或在 SRM 的 “-file” 标志中传递的文件。

filename "/tftpboot/vmlinux.bootp";

,它是默认文件,当 SRM 中未指定文件名作为参数时,将传输和执行该文件。

最后,重新启动 inetd 守护程序,以便我们所做的更改可以生效

您现在应该有一个能够支持 BOOTP 的 DHCP 服务器。

#bootps dgram   udp     wait    root    /usr/sbin/tcpd  bootpd

5.7.2. bootpd 配置

# service inet restart

bootpd 是制作 bootp 服务器的旧方法,并且在很大程度上不再使用,而是使用更现代的 DHCP 服务器,这些服务器能够以最少的配置和更大的灵活性处理该协议。 这种设置样式不允许仅向任何客户端授予 BOOTP 请求。 相反,您必须指定允许的客户端的 IP 地址和 MAC 地址。 自然,如果您要管理多台机器,这可能会非常乏味。bootpd rpms 可以在 RedHat 发行版的旧版本(如 5.2 及更低版本)上找到。 注意:rpm 本身名为 bootp,尽管该软件包确实包含 bootpd 文件名。 它可以在您最喜欢的 RedHat 镜像站点下载。 bootp 软件包与以前一样需要 tftp-server,并且从中抓取文件的位置是相同的。安装后,您必须配置您的 inetd 服务以与 bootpd 守护程序对话。 取消注释您的 /etc/inetd.conf 中的以下行。然后重新启动 inetd。配置/etc/bootptab文件。
voodoo.alphalinux.org:\
	:hd=/tftpboot/:bf=vmlinux.bootp:\
	:ht=ethernet:ha=08012B1C51F8:hn:vm=rfc1048:\
	:ip=192.12.69.254:bs=auto:

bootptab文件有一个条目,描述允许从服务器启动的每个客户端。 例如,如果您想启动机器voodoo.alphalinux.org,则需要以下形式的条目此条目假设机器的以太网地址为08012B1C51F8,其 IP 地址为 192.12.69.254。 以太网地址可以使用 SRM 控制台的show device命令找到,或者,如果 Linux 正在运行,则可以使用ifconfig命令找到。 该条目还定义,如果客户端未另行指定,则将启动的文件是目录中的vmlinux.bootp

/tftpboot

。 有关配置
>>> set ewa0_protocol bootp

bootpd

>>> set ewa0_mode FastFD

的更多信息,请参阅其手册页。

>>> set ewa0_mode 

5.8. 通过网络启动

在 Linux 可以通过网络启动之前,需要执行三个步骤。 首先,您需要一个 SRM 支持的以太网适配器。 大多数版本的 SRM 都支持 DE500 系列网卡,较新版本(5.6 及更高版本)也支持 Intel EtherExpress/Pro 系列网卡。 其次,您需要设置 SRM 环境变量以启用通过 bootp 协议启动,第三,您需要设置另一台机器作为您的引导服务器。 在 SRM 中启用 bootp 通常通过将 ewa0_protocol(DE500 网卡)或 eia0_protocol(Intel 网卡)变量设置为 bootp 来完成。

  1. 还要检查您的以太网设备是否具有连接到任何集线器或交换机的链路指示灯。 如果您没有看到链路指示灯,请尝试强制协商以太网设备。 例如

  2. 将 DE500 以太网卡设置为快速全双工操作。 要查看可用模式列表

    • 使用 aboot 源代码进行网络引导目前已损坏,尽管对于好奇的人来说,所需的步骤在下面进一步介绍。 请改用内核源代码进行网络引导的说明。

    • 5.8.1. 使用内核源代码进行网络引导

    确保您要启动的内核已经构建完成

  3. 在 linux 源代码目录中执行以下操作

make bootimage

  1. make bootpfile这将创建一个未压缩的内核,名为 'bootpfile',位于 arch/alpha/boot/ 中。 请注意,此内核比 aboot 源代码生成的内核大得多。.

  2. 将 bootpfile 复制到 bootp 服务器的目录。 使用默认设置,tftp 服务器将在 /tftpboot 中查找,因此将 bootpfile 复制到 /tftpboot 中。

  3. 5.8.2. 使用 aboot 源代码进行网络引导

使用以下命令构建 aboot
      >>> boot ewa0 

make netboot

      >>> boot ewa0 -fi  bootpfile -fl "root=/dev/hda2" 

确保您要启动的内核已经构建完成。 默认情况下,aboot Makefile 使用 /usr/src/linux/arch/alpha/boot/vmlinux.gz 中的内核(如果要使用不同的路径,请编辑 Makefile)。 make netboot 的结果是一个名为 vmlinux.bootp 的文件,其中包含 aboot 和 Linux 内核,已准备好进行网络引导。

将 vmlinux.bootp 复制到 bootp 服务器的目录。 在上面的示例中,您将其复制到 /tftpboot/vmlinux.bootp。

接下来,启动客户端机器并启动它,指定以太网适配器作为启动设备。 通常,SRM 将基于 DEC 的以太网适配器称为 ewa0,将基于 Intel 的适配器称为 eia0,因此要从该设备启动,您可以使用命令

可以像往常一样使用 -fi 和 -fl 选项。 例如,

特别是,您可以通过指定选项 -fl i 来要求 aboot 提示输入 Linux 内核参数。

  1. 5.8.3. 通过 BOOTP 更新 SRM 控制台通过 BOOTP 通过网络更新您的 SRM 控制台与以相同方式启动 Linux 内核一样容易。 硬件先决条件与网络引导 Linux 相同。首先,您必须获得能够通过 BOOTP 通过网络引导的 SRM 镜像。 这些镜像通常具有 .exe 扩展名。 对于 DEC/Compaq Alpha 产品,这些镜像可以在 ftp://gatekeeper.dec.com/pub/DEC/Alpha/firmware/v5.8/ 找到。 您也可以在 Alpha Systems Firmware Update CD-ROM 上找到这些文件。 API NetWorks 目前不提供网络可启动的 SRM 镜像,尽管这种情况在不久的将来可能会改变。

  2. 例如,假设您有一台 DS20,并且想通过 BOOTP 通过网络更新其固件。 您必须,

获取 DS20 的正确固件镜像,该镜像支持 BOOTP 执行,在本例中,文件名是

>>> b ewa0 -fi ds20_v5_8.exe

ds20_v5_8.exe

,来自 ftp://gatekeeper.dec.com/pub/DEC/Alpha/firmware/v5.8/

将文件复制到 BOOTP 服务器上的 /tftpboot 文件夹。

要从 SRM 执行更新,您需要执行以下操作

然后,SRM 将以与您从 CD 执行固件更新相同的方式继续升级固件。

5.9. 磁盘分区

5.9.1. 什么是磁盘标签?

磁盘标签是分区表。 不幸的是,分区表可以采用多种格式,具体取决于操作系统。

DOS 分区表是 Linux 和 Windows 使用的标准。 AlphaBIOS 系统和每个 Linux 内核都可以读取 DOS 分区表。 不幸的是,SRM 控制台的引导扇区格式与磁盘上 DOS 分区表的一部分重叠,因此 DOS 分区表不能与 SRM 一起使用。

BSD 磁盘标签被多种 Unix 变体使用,包括 Tru64。 SRM 的引导块与 BSD 磁盘标签不冲突(实际上,BSD 磁盘标签完全位于第一个扇区的“保留”区域内),并且 Linux 可以使用 BSD 磁盘标签,前提是将对 BSD 磁盘标签的支持编译到内核中。

  1. 要使用 SRM 从磁盘启动,需要 BSD 磁盘标签。 如果磁盘不是引导磁盘,则不需要 BSD 磁盘标签。 可以使用 fdisk(标准的 Linux 磁盘分区工具)创建 BSD 磁盘标签。

  2. 5.9.2. 简易分区:DOS 磁盘标签

  3. 分区磁盘的最简单方法是让 Linux 安装程序为您执行此操作,例如,使用 Red Hat 的 disk druid 或 fdisk。 在 Red Hat 6.1 上,这将生成有效的 BSD 磁盘标签,但仅当所讨论的磁盘先前包含一个 BSD 磁盘标签时才有效。 在大多数情况下,这将生成 DOS 磁盘标签。 Linux 可以读取它,但您将无法通过 SRM 从它启动。 因此,您可能需要手动创建 BSD 磁盘标签才能启动 Linux

  4. 5.9.3. 使用 BSD 磁盘标签进行分区

  5. 在您要配置的磁盘上启动 fdisk

  6. 选择制作 BSD 磁盘标签 - 选项 'b'(较新版本的 fdisk 将检测到现有的 BSD 磁盘标签并自动进入磁盘标签模式)

您会注意到一些事情:分区是字母而不是数字,从 a-h 开始。 分区 'c' 覆盖整个磁盘。 这是约定,请勿触摸它。 虽然您可以看到它,但请记下磁盘参数,因为与 DOS 磁盘标签方法相比,您将更频繁地使用它们

  • 创建新分区使用与 DOS 磁盘标签方法相同的过程,不同之处在于分区由字母而不是数字引用。 也就是说,'n' 创建新分区,后跟分区字母,后跟起始块,后跟结束块

  • 设置分区类型略有不同,因为编号方案不同(1 是交换分区,8 是 ext2 分区)。

  • 完成后,像往常一样写入('w')并退出('q')。

使用 BSD 磁盘标签进行分区时,您必须注意一些重要的注意事项