32.8. 使用 PXE 进行无盘操作

英特尔®预引导执行环境 (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)

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

32.8.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. 创建将包含要挂载 NFS 的 FreeBSD 安装的根目录:

    1. # export NFSROOTDIR=/b/tftpboot/FreeBSD/install
    2. # mkdir -p ${NFSROOTDIR}
  2. 通过将此行添加到 /etc/rc.conf 来启用 NFS 服务器:

    1. nfs_server_enable="YES"
  3. 通过 NFS 导出无盘根目录,方法是将以下内容添加到 /etc/exports

    1. /b -ro -alldirs -maproot=root
  4. 启动 NFS 服务器:

    1. # service nfsd start
  5. 通过向 /etc/rc.conf 添加以下行来启用 inetd(8):

    1. inetd_enable="YES"
  6. 取消注释 /etc/inetd.conf 中的以下行,方法是确保它不以符号 # 开头:

    1. tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot

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

  7. 启动 inetd(8)

    1. # service inetd start
  8. 将基本系统安装到 ${NFSROOTDIR},可以通过解压官方压缩文件或重建 FreeBSD 内核和用户区来实现 (更详细的说明请参考 “从源代码更新 FreeBSD”,但不要忘记在运行 make installkernelmake installworld 命令时加上 DESTDIR=${NFSROOTDIR}

  9. 测试 TFTP 服务器工作,可以下载引导加载程序,将通过 PXE 获取:

    1. # tftp localhost
    2. tftp> get FreeBSD/install/boot/pxeboot
    3. Received 264951 bytes in 0.1 seconds
  10. 编辑 ${NFSROOTDIR}/etc/fstab 并创建一个条目以通过 NFS 挂载根文件系统:

    1. # Device Mountpoint FSType Options Dump Pass
    2. myhost.example.com:/b/tftpboot/FreeBSD/install / nfs ro 0 0

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

  11. 在 PXE 环境中为正在 PXE 引导的客户端计算机设置 root 密码:

    1. # chroot ${NFSROOTDIR}
    2. # passwd
  12. 如果需要,通过编辑 ${NFSROOTDIR}/etc/ssh/sshd_config 并启用 PermitRootLogin 来为正在 PXE 启动的客户机启用 ssh(1) root 登录。这个选项在 sshd_config(5) 中有记载。

  13. ${NFSROOTDIR} 中执行 PXE 环境的任何其他所需自定义。这些自定义可能包括安装软件包或使用 vipw(8) 编辑密码文件之类的事情。

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

  1. # chroot ${NFSROOTDIR}
  2. # mkdir -p conf/base
  3. # tar -c -v -f conf/base/etc.cpio.gz --format cpio --gzip etc
  4. # 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-server port 或软件包进行安装。

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

  1. subnet 192.168.0.0 netmask 255.255.255.0 {
  2. range 192.168.0.2 192.168.0.3 ;
  3. option subnet-mask 255.255.255.0 ;
  4. option routers 192.168.0.1 ;
  5. option broadcast-address 192.168.0.255 ;
  6. option domain-name-servers 192.168.35.35, 192.168.35.36 ;
  7. option domain-name "example.com";
  8. # IP address of TFTP server
  9. next-server 192.168.0.1 ;
  10. # path of boot loader obtained via tftp
  11. filename "FreeBSD/install/boot/pxeboot" ;
  12. # pxeboot boot loader will try to NFS mount this directory for root FS
  13. option root-path "192.168.0.1:/b/tftpboot/FreeBSD/install/" ;
  14. }

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

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

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

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

  1. dhcpd_enable="YES"

然后启动 DHCP 服务:

  1. # service isc-dhcpd start

32.8.3. 调试 PXE 问题

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

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

  1. 使用 net/wireshark 包或 port 调试 PXE 启动过程中涉及的网络流量,如下图所示。

    pxe nfs

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

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

    1. # tftp 192.168.0.1
    2. tftp> get FreeBSD/install/boot/pxeboot
    3. Received 264951 bytes in 0.1 seconds

    tftpd(8)tftp(1) 中的 BUGS 部分记录了 TFTP 的一些限制。

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

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