Intel® 预启动执行环境 (PXE) 能让操作系统从网络启动。 通常由近代主板的 BIOS 提供 PXE 支持,它可以通过在 BIOS 设置里选择从网络启动开启。 一个功能完整的 PXE 配置还需要正确地设置 DHCP 和 TFTP 服务。
当计算机启动的时候, 通过 DHCP 获取关于
从 TFTP 得到引导加载器(boot loader)的信息。
在计算机接受此信息以后, 便通过 TFTP
下载并执行引导加载器。 这些记载于
预启动执行环境 (PXE) 规范 的 2.2.1 章节中。
在 FreeBSD 中, 在 PXE 过程中获取的引导加载器为
/boot/pxeboot
。 在 /boot/pxeboot
执行之后, FreeBSD 的内核被加载, 接着是其他的 FreeBSD 相关引导部分依次被执行。
更多关于 FreeBSD 启动过程的详细信息请参阅 第 13 章 FreeBSD 引导过程。
Choose a directory which will have a FreeBSD installation
which will be NFS mountable. For example, a directory such
as /b/tftpboot/FreeBSD/install
can be used.
选择一个可被用户 NFS 挂载并安装有 FreeBSD 的目录。
比如可以使用像 /b/tftpboot/FreeBSD/install
这样的一个目录。
#
export NFSROOTDIR=/b/tftpboot/FreeBSD/install
#
mkdir -p ${NFSROOTDIR}
使用如下的命令开启 NFS 服务 第 30.3.2 节 “配置NFS”.
将下面这行加入 /etc/exports
用以通过 NFS 导出此目录:
/b -ro -alldirs
重起 NFS 服务:
#
/etc/rc.d/nfsd restart
按照 第 30.2.2 节 “设置” 中标明的步骤启用 inetd(8)。
将如下这行加入到
/etc/inetd.conf
:
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot
重启 inetd:
#
/etc/rc.d/inetd restart
#
cd /usr/src
#
make buildworld
#
make buildkernel
把 FreeBSD 安装到 NFS 挂载目录:
#
make installworld DESTDIR=${NFSROOTDIR}
#
make installkernel DESTDIR=${NFSROOTDIR}
#
make distribution DESTDIR=${NFSROOTDIR}
测试 TFTP 服务是否能下载将从 PXE 获取的引导加载器:
#
tftp localhost
tftp>get FreeBSD/install/boot/pxeboot
Received 264951 bytes in 0.1 seconds
编辑 ${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
客户端可能意外删除根文件系统上的文件。
设置 chroot(8) 环境中的 root 密码。
#
chroot ${NFSROOTDIR}
#
passwd
此为设置从 PXE 启动的客户机的 root 密码。
允许 ssh root 登录从 PXE 启动的客户机,
编辑 ${NFSROOTDIR}/etc/ssh/sshd_config
并开启 PermitRootLogin
选项。
关于此选项的说明请参阅 sshd_config(5)。
对 ${NFSROOTDIR} 的 chroot(8) 环境做些其他的定制。 这可以是像使用 pkg_add(1) 安装二进制包, 使用 vipw(8) 修改密码, 或者编辑 amd.conf(5) 映射自动挂载等。例如:
#
chroot ${NFSROOTDIR}
#
pkg_add -r bash
如果你从一个 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
就会被复制进去。
PXE 需要配置一个 TFTP 服务器和一个 DHCP 服务器。 DHCP 服务并不要求与 TFTP 服务在同一台机器上, 但是必须能够从你的网络访问到它。
按照此文档处 第 30.5.7 节 “安装和配置 DHCP 服务器”
方法安装 DHCP 服务。
确保 /etc/rc.conf
和
/usr/local/etc/dhcpd.conf
都配置正确。
在 /usr/local/etc/dhcpd.conf
中配置
next-server
, filename
,
option root-path
选项指向你的
TFTP 服务器的 IP 地址,
以及 TFTP 上 /boot/pxeboot
文件的路径, 和 NFS 根文件系统的路径。
这里一份 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-server 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/" ; }
当客户端启动的时候, 进入 BIOS 配置菜单。 设置 BIOS 从网络启动。 如果之前你所有的配置步骤都正确的话, 那么所有部分应该能 "正常工作"。
使用 net/wireshark port 查看 DHCP 和 TFTP 的网络流量来调试各种问题。
确保 pxeboot
能从
TFTP 获取。
在你的 TFTP 服务器上检查
/var/log/xferlog
日志确保
pxeboot
被从正确的位置获取。
可以这样测试上面例子 dhcpd.conf
中所设置的:
#
tftp 192.168.0.1
tftp>get FreeBSD/install/boot/pxeboot
Received 264951 bytes in 0.1 seconds
确保根文件系统能够从 NFS 挂载。
可以这样测试上面例子 dhcpd.conf
中所设置的:
#
mount -t nfs 192.168.0.1:/b/tftpboot/FreeBSD/install /mnt
阅读 src/sys/boot/i386/libi386/pxe.c
中的代码以了解 pxeboot
加载器如何设置诸如
boot.nfsroot.server
和
boot.nfsroot.path
之类的变量。
这些变量被用在了
src/sys/nfsclient/nfs_diskless.c
的 NFS 无盘根挂载代码中。
Read pxeboot(8) and loader(8).
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<[email protected]>.
关于本文档的问题请发信联系
<[email protected]>.