Links

34.10.使用 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 引导过程中所述。
本节概述如何在 FreeBSD 系统上配置这些服务,以便其他系统可以 PXE 引导到 FreeBSD。有关详细信息,请参阅 diskless(8)
当心
如前所述,提供这些服务的系统是不安全的。它应该位于网络的受保护区域中,并且不受其他主机的信任。

34.10.1.设置 PXE 环境

本节中显示的步骤配置内置 NFS 和 TFTP 服务器。下一节演示如何安装和配置 DHCP 服务器。在此示例中,将包含 PXE 用户使用的文件的目录是 /b/tftpboot/FreeBSD/install。重要的是,此目录存在,并且在 /etc/inetd.conf/usr/local/etc/dhcpd.conf 中都设置了相同的目录名称。
注意
下面的命令示例假定使用了 sh(1) shell。csh(1)tcsh(1) 用户需要启动 sh(1) shell 或使命令适应 csh(1) 语法。
  1. 1.
    创建将包含要挂载 NFS 的 FreeBSD 安装的根目录:
# export NFSROOTDIR=/b/tftpboot/FreeBSD/install
# mkdir -p ${NFSROOTDIR}
  1. 2.
    通过将此行添加到 /etc/rc.conf 来启用 NFS 服务器:
nfs_server_enable="YES"
  1. 3.
    通过 NFS 导出无盘根目录,方法是将以下内容添加到 /etc/exports
/b -ro -alldirs -maproot=root
  1. 4.
    启动 NFS 服务器:
# service nfsd start
  1. 5.
    通过向 /etc/rc.conf 添加以下行来启用 inetd(8)):
inetd_enable="YES"
  1. 6.
    取消注释 /etc/inetd.conf 中的以下行,方法是确保它不以符号 # 开头:
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot
注意
某些版本的 PXE 需要 TCP 版本的 TFTP。在这种情况下,请取消对第二行 tftp 的注释,该行包含 stream tcp
  1. 7.
    启动 inetd(8)
# service inetd start
  1. 8.
    将基本系统安装到 ${NFSROOTDIR},可以通过解压官方压缩文件或构建 FreeBSD 内核和用户空间来实现 (更详细的说明请参考 “从源代码更新 FreeBSD”,但不要忘记在运行 make installkernelmake installworld 命令时加上 DESTDIR=${NFSROOTDIR}
  2. 9.
    测试 TFTP 服务器工作,可以下载引导加载程序,将通过 PXE 获取:
# tftp localhost
tftp> get FreeBSD/install/boot/pxeboot
Received 264951 bytes in 0.1 seconds
  1. 10.
    编辑 ${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. 11.
    在 PXE 环境中为正在 PXE 引导的客户端计算机设置 root 密码:
# chroot ${NFSROOTDIR}
# passwd
  1. 12.
    如果需要,通过编辑 ${NFSROOTDIR}/etc/ssh/sshd_config 并启用 PermitRootLogin 来为正在 PXE 启动的客户机启用 ssh(1) root 登录。这个选项在 sshd_config(5) 中有记载。
  2. 13.
    ${NFSROOTDIR} 中执行 PXE 环境的任何其他所需自定义。这些自定义可能包括安装软件包或使用 vipw(8) 编辑密码文件之类的事情。
当从 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 个扇区)。

34.10.2.配置 DHCP 服务器

DHCP 服务器不需要与 TFTP 和 NFS 服务器位于同一台计算机,但需要在网络中可访问它。
DHCP 不是 FreeBSD 基本系统的一部分,但可以使用 net/isc-dhcp44-server port 或软件包进行安装。
安装后,编辑配置文件 /usr/local/etc/dhcpd.conf。如本例所示,配置 TFTP 服务器、文件名和根路径设置:
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

34.10.3.调试 PXE 问题

一旦所有服务都配置并启动,PXE 客户端应该能够通过网络自动加载 FreeBSD。如果特定客户端无法连接,当该客户端计算机启动时,进入 BIOS 配置菜单并确认它已设置为从网络启动。
本节介绍一些故障排除提示,以便在没有客户端能够 PXE 启动时隔离配置问题的根源。
  1. 1.
    使用软件包或 port 来安装 net/wireshark 调试 PXE 启动过程中涉及的网络流量,如下图所示。
图 1.使用 NFS 根挂载的 PXE 引导进程
  1. 1.
    客户端广播 DHCP 发现消息。
  2. 2.
    DHCP 服务器使用 IP 地址、下一个服务器、文件名和根路径值进行响应。
  3. 3.
    客户端向下一个服务器发送 TFTP 请求,要求检索文件名。
  4. 4.
    TFTP 服务器响应并将文件名发送到客户端。
  5. 5.
    客户端执行文件名 pxeboot(8),然后加载内核。当内核执行时,根路径指定的根文件系统将通过 NFS 挂载。
  1. 2.
    在 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)tftp(1) 中的 BUGS 部分记录了 TFTP 的一些限制。
3.确保根文件系统可以通过 NFS 挂载。要测试此示例配置,请执行以下操作:
# mount -t nfs 192.168.0.1:/b/tftpboot/FreeBSD/install /mnt