32.8.使用 PXE 进行无盘操作

Intel® Preboot eXecution Environment(PXE,英特尔预启动执行环境)允许通过网络引导操作系统。例如,可以通过网络引导 FreeBSD 系统,并在没有本地磁盘的情况下运行,即使用从 NFS 服务器挂载的文件系统。PXE 支持通常在 BIOS 中可用。要在机器启动时使用 PXE,请在 BIOS 设置中选择 Boot from network 该选项,或在系统初始化期间键入功能键。

为了提供操作系统通过网络引导所需的文件,PXE 安装程序还需要正确配置 DHCP、TFTP 和 NFS 服务器,其中:

  • 初始参数(如 IP 地址、可执行启动文件名和位置、服务器名称和根路径)是从 DHCP 服务器获取的。
  • 操作系统加载程序文件是使用 TFTP 引导的。
  • 文件系统使用 NFS 加载。

当计算机 PXE 启动时,它会通过 DHCP 接收有关从何处获取初始启动加载程序文件的信息。主计算机收到此信息后,通过 TFTP 下载引导加载程序,然后执行引导加载程序。在 FreeBSD 中,引导加载程序文件是 /boot/pxeboot。在 /boot/pxeboot 执行之后,FreeBSD 内核被加载,其余的 FreeBSD 引导序列继续进行,如 FreeBSD 引导过程open in new window中所述。

本节描述如何在 FreeBSD 系统上配置这些服务,以便其他系统可以 PXE 引导到 FreeBSD。有关详细信息,请参阅 diskless(8)open in new window

小心

如前所述,提供这些服务的系统是不安全的。它应该位于网络的受保护区域中,并且不受其他主机的信任。

32.8.1. 设置 PXE 环境

本节中显示的步骤配置内置 NFS 和 TFTP 服务器。下一节演示如何安装和配置 DHCP 服务器。在此示例中,将包含 PXE 用户使用的文件的目录是 /b/tftpboot/FreeBSD/install。重要的是,此目录存在,并且在 /etc/inetd.conf/usr/local/etc/dhcpd.conf 中都设置了相同的目录名称。

注意

下面的命令示例假定使用了 sh(1)open in new window shell。csh(1)open in new windowtcsh(1)open in new window 用户需要启动一个 sh(1)open in new window shell 或使命令适应 csh(1)open in new window 语法。

  1. 创建将包含要挂载 NFS 的 FreeBSD 安装的根目录:
# export NFSROOTDIR=/b/tftpboot/FreeBSD/install
# mkdir -p ${NFSROOTDIR}
  1. 通过将此行添加到 /etc/rc.conf 来启用 NFS 服务器:
nfs_server_enable="YES"
  1. 通过 NFS 导出无盘根目录,方法是将以下内容添加到 /etc/exports
/b -ro -alldirs -maproot=root
  1. 启动 NFS 服务器:
# service nfsd start
  1. 通过向 /etc/rc.conf 添加以下行来启用 inetd(8)open in new window):
inetd_enable="YES"
  1. 取消注释 /etc/inetd.conf 中的以下行,方法是确保它不以符号 # 开头:
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot

注意

一些 PXE 版本需要 TCP 版本的 TFTP。在这种情况下,请取消对第二行 tftp 的注释,该行包含 stream tcp

  1. 启动 inetd(8)open in new window
# service inetd start
  1. 将基本系统安装到 ${NFSROOTDIR},可以通过解压官方压缩文件或构建 FreeBSD 内核和用户空间来实现 (更详细的说明请参考 “从源代码更新 FreeBSD”open in new window,但不要忘记在运行 make installkernelmake installworld 命令时加上 DESTDIR=${NFSROOTDIR}
  2. 测试 TFTP 服务器工作,可以下载引导加载程序,将通过 PXE 获取:
# tftp localhost
tftp> get FreeBSD/install/boot/pxeboot
Received 264951 bytes in 0.1 seconds
  1. 编辑 ${NFSROOTDIR}/etc/fstab 并创建一个条目以通过 NFS 挂载根文件系统:
# Device                                         Mountpoint    FSType   Options  Dump Pass
myhost.example.com:/b/tftpboot/FreeBSD/install       /         nfs      ro        0    0

myhost.example.com 替换为 NFS 服务器的主机名或 IP 地址。在此示例中,根文件系统以只读方式挂载,以防止 NFS 客户端删除根文件系统的内容。

  1. 在 PXE 环境中为正在 PXE 引导的客户端计算机设置 root 密码:
# chroot ${NFSROOTDIR}
# passwd
  1. 如果需要,通过编辑 ${NFSROOTDIR}/etc/ssh/sshd_config 并启用 PermitRootLogin 来为正在 PXE 启动的客户机启用 ssh(1)open in new window root 登录。这个选项在 sshd_config(5)open in new window 中有记载。
  2. ${NFSROOTDIR} 中执行 PXE 环境的任何其他所需自定义。这些自定义可能包括安装软件包或使用 vipw(8)open in new window 编辑密码文件之类的事情。

当从 NFS root 卷启动时,/etc/rc 会检测到 NFS 启动并运行 /etc/rc.initdiskless。在这种情况下,/etc/var 需要成为有内存支持的文件系统,以便这些目录可以写入,但 NFS 根目录是只读的:

# chroot ${NFSROOTDIR}
# mkdir -p conf/base
# tar -c -v -f conf/base/etc.cpio.gz --format cpio --gzip etc
# tar -c -v -f conf/base/var.cpio.gz --format cpio --gzip var

当系统启动时,/etc/var 的内存文件系统将被创建和挂载,cpio.gz 文件的内容将被复制到其中。默认情况下,这些文件系统的最大容量为5兆字节。如果你的档案不合适,通常在安装了二进制软件包后,/var 会出现这种情况,可以在 ${NFSROOTDIR}/conf/base/etc/md_size${NFSROOTDIR}/conf/base/var/md_size 文件中分别为 /etc/var 文件系统申请一个更大的容量(例如,5 兆字节是 10240 个扇区)。

32.8.2. 配置 DHCP 服务器

DHCP 服务器不需要与 TFTP 和 NFS 服务器位于同一台计算机,但需要在网络中可访问它。

DHCP 不是 FreeBSD 基本系统的一部分,但可以使用 net/isc-dhcp43-serveropen in new window port 或软件包进行安装。

安装后,编辑配置文件 /usr/local/etc/dhcpd.conf。如本例所示,配置下一个服务器、文件名和根路径设置。

subnet 192.168.0.0 netmask 255.255.255.0 {
   range 192.168.0.2 192.168.0.3 ;
   option subnet-mask 255.255.255.0 ;
   option routers 192.168.0.1 ;
   option broadcast-address 192.168.0.255 ;
   option domain-name-servers 192.168.35.35, 192.168.35.36 ;
   option domain-name "example.com";

   # IP address of TFTP server
   next-server 192.168.0.1 ;

   # path of boot loader obtained via tftp
   filename "FreeBSD/install/boot/pxeboot" ;

   # pxeboot boot loader will try to NFS mount this directory for root FS
   option root-path "192.168.0.1:/b/tftpboot/FreeBSD/install/" ;

}

next-server 指令用于指定 TFTP 服务器的 IP 地址。

文件名指令定义了 /boot/pxeboot 的路径。使用了一个相对的文件名,意味着 /b/tftpboot 不包括在路径中。

root-path 选项定义了到 NFS 根文件系统的路径。

编辑完毕后,在 /etc/rc.conf 中添加以下一行,在启动时启用 DHCP。

dhcpd_enable="YES"

然后启动 DHCP 服务:

# service isc-dhcpd start

32.8.3. 调试 PXE 问题

一旦所有服务都配置并启动,PXE 客户端应该能够通过网络自动加载 FreeBSD。如果特定客户端无法连接,当该客户端计算机启动时,进入 BIOS 配置菜单并确认它已设置为从网络启动。

本节介绍一些故障排除提示,以便在没有客户端能够 PXE 启动时隔离配置问题的根源。

  1. 使用二进制包或 ports 安装 net/wiresharkopen in new window 调试 PXE 启动过程中涉及的网络流量,如下图所示。

图 1.使用 NFS 根挂载的 PXE 引导进程

  1. 客户端广播 DHCP 发现消息。
  2. DHCP 服务器使用 IP 地址、下一个服务器、文件名和根路径值进行响应。
  3. 客户端向下一个服务器发送 TFTP 请求,要求检索文件名。
  4. TFTP 服务器响应并将文件名发送到客户端。
  5. 客户端执行文件名 pxeboot(8),然后加载内核。当内核执行时,根路径指定的根文件系统将通过 NFS 挂载。
  1. 在 TFTP 服务器上,读取 /var/log/xferlog 以确保从正确的位置检索 pxeboot。要测试此示例配置,请执行以下操作:
# tftp 192.168.0.1
tftp> get FreeBSD/install/boot/pxeboot
Received 264951 bytes in 0.1 seconds

tftpd(8)open in new windowtftp(1)open in new window 中的 BUGS 部分记录了 TFTP 的一些限制。

3.确保根文件系统可以通过 NFS 挂载。要测试此示例配置,请执行以下操作:

# mount -t nfs 192.168.0.1:/b/tftpboot/FreeBSD/install /mnt