嘿,你是不是觉得该开始来点真家伙了?我们开始吧。
有人可能会想,如果工作站甚至不知道自己的 IP 地址,它如何通过 IP 网络启动。 实际上,有三种协议使客户端能够获取此信息和一些额外的配置参数
RARP:这是这些协议中最简单的。 但是我猜它不允许服务器指定客户端应该如何下载内核,所以我们不会使用它(实际上,有一个约定使用工作站的 IP 地址作为文件名,例如,客户端通过 RARP 获取地址 192.168.42.12 可能会请求/tftpboot/192.168.42.12通过 TFTP,就像 Linux 内核所做的那样。 文件名也可能是 IP 地址的十六进制形式,这取决于具体实现,并且不是强制性的)。
BOOTP:此协议允许服务器向客户端(通过其硬件 MAC 地址识别)提供大量信息,特别是其 IP 地址、子网掩码、广播地址、网络地址、网关地址、主机名和内核加载路径。 这就是我们将要使用的协议。
DHCP:这是 BOOTP 的扩展。
当客户端获得其 IP 参数后,如果内核不在本地介质上(如软盘、光盘或硬盘),客户端将开始通过 TFTP 下载它。 其位置由 BOOTP/DHCP 服务器给出。 服务器(不一定是 BOOTP/DHCP 服务器)还必须为非本地内核运行 TFTP 守护程序。 编译后获得的内核不能“按原样”用于 BOOTP/DHCP 操作,其二进制映像必须使用 mknbi 实用程序进行修改(如果使用 LanWorks EPROM,则再次使用 imggen 实用程序进行修改)。 mknbi 实用程序也应该用于修改将写入 ROM 的内核。
内核启动后,它将尝试挂载其根文件系统。 此文件系统的位置也是通过 BOOTP/DHCP 获得的,并且通过 NFS 挂载。 这意味着客户端可能需要使用 BOOTP 两次进行启动:第一次获取其内核,第二次了解根文件系统的位置(根文件系统可能在第三台服务器上)。
另一种解决方案是使用内存盘作为根文件系统。 在这种情况下,内存盘映像与内核一起通过 TFTP 获取。
当根文件系统被挂载时,你就可以松一口气了:你至少可以使用你的瑞士军刀,它带有 sh、sed 和 awk 工具。 实际上,你将不得不自定义客户端文件系统的初始化脚本:例如,你将不得不从/etc/fstab中删除所有与硬盘驱动器、软盘或光盘相关的内容(当你的工作站没有配备这些设备时),你可能还必须禁止交换分区激活(请注意,有一种通过 NFS 或网络块设备进行交换的方法)。 如果多个客户端使用相同的远程根文件系统,你还必须在启动时自动生成所有网络配置文件。