31.8. PXE无盘模式

Updated by Jean-François Dockès.
Reorganized and enhanced by Alex Dupre.

Intel® 的先启动执行环境 (Preboot eXecution Environment) 允许计算机从网络中的操作系统启动,例如:FreeBSD 主机可以从网络启动而无需本地磁盘就可操作,使用的是从 NFS 服务器装载的文件系统。PXE 需要 BIOS 支持。若需从 PXE 启动,在计算机启动时在 BIOS 选项中选择Boot from network

为了让计算机从网络中正确获取 PXE 所需文件,网络中需正确配置 DHCP,TFTP 和 NFS 服务器。因为:

当计算机从PXE启动时,它会通过DHCP接收到关于从哪里获取初始启动加载器文件的信息。在主机收到这些信息后,它会通过 TFTP 下载并执行引导加载器。在 FreeBSD 中,启动加载器文件是 /boot/pxeboot。在 /boot/pxeboot执行后,FreeBSD内核被加载, 然后FreeBSD内核的其余部分就会继续进行, 这在第 12 章 FreeBSD开机程序中描述。

本节将介绍如何在 FreeBSD 系统上配置这些服务, 以便其他系统能够将 PXE 引导到 FreeBSD 中。更多信息,请参阅 diskless(8)

小心:

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

31.8.1. 配置PXE环境

Written by Craig Rodrigues.

本节介绍如何配置内建的NFSTFTP服务器。下一节将演示如何安装和配置DHCP服务器。在这个例子中,PXE 用户使用的文件的目录路径为 /b/tftpboot/FreeBSD/install。重要的是,这个目录必须存在,并且在 /etc/inetd.conf/usr/local/etc/dhcpd.conf中都设置了相同的目录名。

  1. 设置 NFS 挂载目录,其中包含 FreeBSD 安装文件:

    # export NFSROOTDIR=/b/tftpboot/FreeBSD/install
    # mkdir -p ${NFSROOTDIR}
  2. 添加此行到/etc/rc.conf,启用 NFS:

    nfs_server_enable="YES"
  3. 将以下行添加到 /etc/exports 来通过 NFS 导出无盘跟目录:

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

    # service nfsd start
  5. 添加此行到/etc/rc.conf,启用inetd(8)

    inetd_enable="YES"
  6. 删除/etc/inetd.conf中以下行前的#,让配置生效:

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

    注意:

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

  7. 启动inetd(8)

    # service inetd start
  8. 将基本系统安装到 ${NFSROOTDIR}中, 可以通过解压官方存档或者重建 FreeBSD 内核和用户区来安装(参考 第 23.5 节 “从源码更新FreeBSD” 来获取更多详细的说明)。但在运行make installkernelmake installworld命令时,不要忘记添加DESTDIR=${NFSROOTDIR}

  9. 测试TFTP服务器是否正常工作并下载引导程序,可用PXE获得:

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

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

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

  11. PXE环境中为从PXE启动的客户机设置 root 密码:

    # chroot ${NFSROOTDIR}
    # passwd
  12. 如果需要,可以为 PXE 引导的客户端计算机启用ssh(1) root 登录,具体方式为编辑 ${NFSROOTDIR}/etc/ssh/sshd_config 并启用 PermitRootLogin。这个选项记录在sshd_config(5)

  13. ${NFSROOTDIR}中对 PXE环境进行自定义。这些自定义可以包括安装包或用vipw(8)编辑密码文件等。

当从NFS根卷启动时,/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文件的内容复制到其中。通常情况下,当安装了二进制包后,/var 的情况是这样的,请在 ${NFSROOTDIR}/conf/base/etc/md_size${NFSROOTDIR}/conf/base/var/md_size 文件中分别写上/etc/var所需的 512 字节扇区数 (例如,5 兆字节就是 10240 个扇区),然后请求更大的容量。

31.8.2. 配置DHCP服务器

DHCP服务器不需要和TFTPNFS服务器在同一台机器上,但需要在网络中正常访问。

FreeBSD 基础系统没有预装 DHCP 服务端。可以从 port 或 package 安装net/isc-dhcp43-server

安装后,编辑配置文件 /usr/local/etc/dhcpd.conf 。配置next-serverfilenameroot-path设置如以下示例中所示:

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地址。

filename指令定义到/boot/pxeboot的路径。使用相对文件名,这意味着/b/tftpboot不包含在路径中。

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

保存了编辑后,在启动时启用DHCP,方法是在/etc/rc.conf中添加以下一行:

dhcpd_enable="YES"

然后启动 DHCP 服务:

# service isc-dhcpd start

31.8.3. PXE问题除错

所有服务都配置好并启动后, PXE 客户端能够通过网络自动加载 FreeBSD。如果某个特定的客户端无法连接, 当该客户端机器启动时, 请进入 BIOS 配置菜单, 并确认已设置为从网络启动。

本节介绍了一些故障排除技巧,可以在客户机无法从 PXE 启动时,找到配置文件错误之处。

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

    图 31.1. 使用NFS Root Mount进行PXE开机程序
    使用NFS Root Mount进行PXE开机程序

    1

    客户端广播DHCPDISCOVER消息。

    2

    DHCP服务器使用IP地址,next-serverfilenameroot-path值。

    3

    客户端发送一个TFTP请求到next-server,要求检索filename

    4

    TFTP 服务端相应请求并返回 filename 到客户端。

    5

    客户端执行filename,然后通过pxeboot(8)加载内核。当内核执行时,由root-path指定的根文件系统通过NFS被挂载到客户端上。


  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

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.