4.6. 为使用 TFTP 网络引导准备文件

如果您的机器连接到了一个局域网,您可以从网络上的另外一台机器上面通过 TFTP 来引导它。如果您 倾向从另外一台机器上面引导安装系统,则引导文件需要放在那台机器上面的某个特殊地方,并且配置好 能够能够支持对您的机器进行引导。

您需要设置一台 TFTP 服务器,并且对于很多机器来说,还需要一台 BOOTP 服务器 ,又或 DHCP 服务器

BOOTP 是一种 IP 协议,用来告诉一台计算机它自己 IP 地址以及从网络何处获得启动映像。 DHCP (动态主机配置协议 Dynamic Host Configuration Protocol) 是一个更灵活, 向后兼容的 BOOTP 拓展。有一些系统只能通过 DHCP 来配置。

普通文件传输协议(Trivial File Transfer Protocol (TFTP))被用于为客户 提供引导映像。理论上,任意服务器,在任意平台上只要实现了这些协议 就都能够被应用。在这一节的一些例子里面,我们将提供在 SunOS 4.x、SunOS 5.x (即 Solaris) 和 GNU/Linux 上面的一些操作例子。

注意

如果想用 TFTP 的 Pre-boot Execution Environment (PXE) 方式启动, 您将需要一台支持 tsize 的 TFTP 服务器。在 Debian GNU/Linux 服务器上,atftpdtftpd-hpa包符合此要求,我们推荐 tftpd-hpa

4.6.1. 设置 BOOTP 服务器

在 GNU/Linux 下面有两种 BOOTP 服务器。他们是 CMU bootpd和另外一种实际上是 DHCP 服务器的程序 ISC dhcpd,他们被包含在 Debian GNU/Linux 的 bootpdhcp 软件包中。

为了使用 CMU bootpd,您必须首先将 /etc/inetd.conf 中相关的注释标记去掉(或者加入一些新行)。在 Debian GNU/Linux 里,您可以运行 update-inetd --enable bootps,然后执行 /etc/init.d/inetd reload 来实现此任务。在其它系统中,这个行应该看起来像这样:

bootps  dgram  udp  wait  root  /usr/sbin/bootpd  bootpd -i -t 120

现在,您必须创建一个 /etc/bootptab 文件。它具有和一些老 BSD 文件很相似并使用相同的加密格式。这些文件包括 printcaptermcap,和 disktab。参见 bootptab 的手册页以获得更多的信息。对于 CMU bootpd,您将需要知道客户机硬件的(MAC)地址。这里有一个示例 /etc/bootptab

client:\\
  hd=/tftpboot:\\
  bf=tftpboot.img:\\
  ip=192.168.1.90:\\
  sm=255.255.255.0:\\
  sa=192.168.1.1:\\
  ha=0123456789AB:

您至少需要修改“ha”选项,它指定了客户机的硬件地址。 “bf”选项则指定了一个客户机应该通过 TFTP 取得的文件名称。 请从 第 4.6.4 节 “将 TFTP 映像放到适当的位置” 处获得更多的信息。

相反,通过 ISC dhcpd 设置 BOOTP 就非常容易。因为它把 BOOTP 客户程序看成一个特殊的 DHCP 客户端。 部分体系结构需要经过复杂的设置才能从 BOOTP 启动客户端。 如果您的机器属于这种情况,请阅读第 4.6.2 节 “设置 DHCP 服务器”。否则,您大概只需要将 allow bootp 指令添加到包含客户机的子网的配置部分,并重新启动 dhcpd 就可以了,重启的命令是:/etc/init.d/dhcpd restart

4.6.2. 设置 DHCP 服务器

ISC dhcpd 是一种自由软件 DHCP 服务器。在 Debian GNU/Linux 里,它被包含在 dhcp 软件包中。这里有它的一个配置文件的范例(通常是 /etc/dhcpd.conf):

option domain-name "example.com";
option domain-name-servers ns1.example.com;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
server-name "servername";

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.200 192.168.1.253;
  option routers 192.168.1.1;
}

host clientname {
  filename "/tftpboot/tftpboot.img";
  server-name "servername";
  next-server servername;
  hardware ethernet 01:23:45:67:89:AB; 
  fixed-address 192.168.1.90;
}

注:新的(并且是推荐的) dhcp3 软件包使用 /etc/dhcp3/dhcpd.conf作为其配置文件。

在这个例子中,一台服务器 “servername” 负责执行包括 DHCP 服务器、TFTP 服务器和网关在内的所有工作。 您需要修改域名选项,以及服务器名和客户端硬件地址。 “filename” 选项应该是将要从 TFTP 获取的文件名。

在编辑了 dhcpd 配置文件后,您需要使用下面的命令重新启动它:/etc/init.d/dhcpd restart作为其配置文件。

4.6.2.1. 在 DHCP 配置中打开 PXE 引导功能

这里是另外一个采用 TFTP 的 Pre-boot Execution Environment (PXE) 方法的 dhcp.conf 配置例子。

option domain-name "example.com";

default-lease-time 600;
max-lease-time 7200;

allow booting;
allow bootp;

# The next paragraph needs to be modified to fit your case
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.200 192.168.1.253;
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.1.255;
# the gateway address which can be different 
# (access to the internet for instance)
  option routers 192.168.1.1;
# indicate the dns you want to use
  option domain-name-servers 192.168.1.3;
}

group {
 next-server 192.168.1.3;
 host tftpclient {
# tftp client hardware address
  hardware ethernet  00:10:DC:27:6C:15;
  filename "/tftpboot/pxelinux.0";
 }
}

注意对于 PXE 引导来说,客户端文件名 pxelinux.0 是一个启动引导器,而非一个内核映象(参见下面的第 4.6.4 节 “将 TFTP 映像放到适当的位置” )。

4.6.3. 开启 TFTP 服务器

要准备好 TFTP 服务器,您首先需要确定 tftpd 已经启动。这通常可以在 /etc/inetd.conf添加如下字句来实现:

tftp dgram udp wait nobody /usr/sbin/tcpd in.tftpd /tftpboot

Debian 包通常在安装后会自动把这条设置好。

检查那个文件并且记住被用作 in.tftpd 的参数的目录,您接下来将会需要它。 -l 参数能够让某些版本的 in.tftpd 将所有的请求记录到系统日志中。 这将在检查错误的时候会很有用。如果您必须修改 /etc/inetd.conf, 您将必须提醒正在运行的 inetd进程该文件已经被改变。在 Debian 系统中,您应该执行 /etc/init.d/inetd reload;而在其它系统中,找到 inetd 所对应的进程 ID,并且运行 kill -HUP inetd-pid

4.6.4. 将 TFTP 映像放到适当的位置

接下来,将在 第 4.2.1 节 “在哪里能找到安装映像”中找到的 TFTP 启动映像放置到tftpd引导映像目录中。一般来说,这个目录将是 /tftpboot。您必须将该文件链接到 tftpd 所使用的引导特定客户端的文件名。不幸的是, 这个文件名完全决定于 TFTP 客户程序,并且没有一个强制的标准。

对于用 PXE 引导来说,您所需的只是设置 netboot/netboot.tar.gz 压缩包。简单地将此包解压到 tftpd 引导映像目录下。并确保您的 DHCP 服务器的配置将会把 /pxelinux.0 以启动所需的文件名传递至tftpd