第21章 其他文件系统
附录 D. OpenPGP 密钥
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. 1.
    创建将包含要挂载 NFS 的 FreeBSD 安装的根目录:
    1
    # export NFSROOTDIR=/b/tftpboot/FreeBSD/install
    2
    # mkdir -p ${NFSROOTDIR}
    Copied!
  2. 2.
    通过将此行添加到 /etc/rc.conf 来启用 NFS 服务器:
    1
    nfs_server_enable="YES"
    Copied!
  3. 3.
    通过 NFS 导出无盘根目录,方法是将以下内容添加到 /etc/exports
    1
    /b -ro -alldirs -maproot=root
    Copied!
  4. 4.
    启动 NFS 服务器:
    1
    # service nfsd start
    Copied!
  5. 5.
    通过向 /etc/rc.conf 添加以下行来启用 inetd(8):
    1
    inetd_enable="YES"
    Copied!
  6. 6.
    取消注释 /etc/inetd.conf 中的以下行,方法是确保它不以符号 # 开头:
    1
    tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot
    Copied!
    注意
    一些 PXE 版本需要 TCP 版本的 TFTP。在这种情况下,请取消对第二行 tftp 的注释,该行包含 stream tcp
  7. 7.
    启动 inetd(8)
    1
    # service inetd start
    Copied!
  8. 8.
    将基本系统安装到 ${NFSROOTDIR},可以通过解压官方压缩文件或重建 FreeBSD 内核和用户区来实现 (更详细的说明请参考 “从源代码更新 FreeBSD”,但不要忘记在运行 make installkernelmake installworld 命令时加上 DESTDIR=${NFSROOTDIR}
  9. 9.
    测试 TFTP 服务器工作,可以下载引导加载程序,将通过 PXE 获取:
    1
    # tftp localhost
    2
    tftp> get FreeBSD/install/boot/pxeboot
    3
    Received 264951 bytes in 0.1 seconds
    Copied!
  10. 10.
    编辑 ${NFSROOTDIR}/etc/fstab 并创建一个条目以通过 NFS 挂载根文件系统:
    1
    # Device Mountpoint FSType Options Dump Pass
    2
    myhost.example.com:/b/tftpboot/FreeBSD/install / nfs ro 0 0
    Copied!
    将 myhost.example.com 替换为 NFS 服务器的主机名或 IP 地址。在此示例中,根文件系统以只读方式挂载,以防止 NFS 客户端可能删除根文件系统的内容。
  11. 11.
    在 PXE 环境中为正在 PXE 引导的客户端计算机设置 root 密码:
    1
    # chroot ${NFSROOTDIR}
    2
    # passwd
    Copied!
  12. 12.
    如果需要,通过编辑 ${NFSROOTDIR}/etc/ssh/sshd_config 并启用 PermitRootLogin 来为正在 PXE 启动的客户机启用 ssh(1) root 登录。这个选项在 sshd_config(5) 中有记载。
  13. 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
Copied!
当系统启动时,/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
9
# IP address of TFTP server
10
next-server 192.168.0.1 ;
11
12
# path of boot loader obtained via tftp
13
filename "FreeBSD/install/boot/pxeboot" ;
14
15
# pxeboot boot loader will try to NFS mount this directory for root FS
16
option root-path "192.168.0.1:/b/tftpboot/FreeBSD/install/" ;
17
18
}
Copied!
next-server 指令用于指定 TFTP 服务器的 IP 地址。
文件名指令定义了 /boot/pxeboot 的路径。使用了一个相对的文件名,意味着 /b/tftpboot 不包括在路径中。
root-path 选项定义了到 NFS 根文件系统的路径。
一旦编辑完毕,在 /etc/rc.conf 中添加以下一行,在启动时启用 DHCP。
1
dhcpd_enable="YES"
Copied!
然后启动 DHCP 服务:
1
# service isc-dhcpd start
Copied!

32.8.3. 调试 PXE 问题

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