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