目标
在已有一台运行 FreeBSD 的计算机(我们称其为 S)的情况下,使用 PXE 在一台计算机(我们称其为 D)安装 FreeBSD。
 
硬件需求
S 必须拥有一块 FreeBSD 可以正常使用的网卡。
D 必须可以支持 PXE 引导,并且其网卡要可以在 FreeBSD 里面正常使用。一条用于双机直连的网线。
 
软件需求
tftpd,已经包含在 FreeBSD 发行版的 base 中。
nfsserver,已经包含在 FreeBSD 中。
isc-dhcp3-server 3.0.5,通过 ports 安装。
FreeBSD 发行版 DISC1 的 ISO 镜像(我使用的镜像是FreeBSD-8.1-RELEASE-i386-disc1.iso)。
S 上使用的 FreeBSD 是 FreeBSD-8.1-RELEASE-i386。
 
网络设置
假设 S 的 IP 地址为 192.168.0.1,子网掩码为 255.255.255.0。
 
准备工作
 
允许 tftpd 运行:
默认情况下,inetd 里面的 tftpd 是不会运行的。在 inetd.conf 中找到 tftpd 所对应的一行,去掉行首的#,保存。注意,去除注释的这行应该是使用 udp 而不是 udp6。
配置 nfsserver:
echo "/data/pxeiso/ -ro -alldirs" > /etc/exports
安装 isc-dhcp3-server:
cd /usr/ports/net/isc-dhcp3-server && make BATCH=yes install
配置 isc-dhcp3-server:
编辑 /usr/local/etc/dhcpd.conf
default-lease-time 7200;

max-lease-time 7200;

ddns-update-style none;

subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.2 192.168.0.254;
server-identifier 192.168.0.1;
next-server 192.168.0.1;
filename "/pxeboot";
option root-path "/data/pxeiso/";
}
 

正式安装
 
1、为了避免 S 上的 dhcpd 影响网络中其他机器,也为了避免 D 受到网络上其他机器的影响,用直连网线将 S 和 D 连接起来。
 
2、挂载准备好的 ISO 镜像。使用 mdconfig 将 FreeBSD 的 ISO 文件连接成为一个 vnode 类型的内存盘:  
mdconfig -atvnode -f FreeBSD-8.1-RELEASE-i386-disc1.iso
挂载这个 md 节点(假设为 /dev/md0)到 /mnt:
mount_cd9660 /dev/md0 /mnt
 
3、把 pxeboot(8) 放到 /tftpboot:
cp /mnt/boot/pxeboot /tftpboot
 
4、将FreeBSD-8.1-RELEASE-i386-disc1.iso里的所有文件复制到/data/pxeiso/,复制完毕后卸载镜像:
mkdir -p /data/pxeiso/
cp -R /mnt/* /data/pxeiso/
umount /dev/md0
mdconfig -d -u 0
 
5、修改loader.conf文件:
编辑 /data/pxeiso/boot/loader.conf,添加以下两行:
vfs.root.mountfrom="ufs:/dev/md0"
vfs.root.mountfrom.options="rw"
 
6、设置Automatic installation:
1)解压基本环境文件mfsroot.gz
cd /data/pxeiso/boot/
gzip -d mfsroot.gz
 
2)挂载mfsroot
mdconfig -atvnode -f mfsroot
mount /dev/md0 /mnt
 
3)在mfsroot文件中加入自动安装配置文件install.cfg
编辑 /mnt/install.cfg,以下是install.cfg配置范例:
# 启用debug模式
debug=YES
nonInteractive=YES
noConfirm=YES
noWarn=NO
# 选择磁盘并创建FreeBSD分区
disk=da0
partition=all
bootManager=standard
diskPartitionEditor
# 在FreeBSD分区中划分label,以下是划分举例
# / 2048MB, swap 4096MB, /var 4096MB,  /tmp 512MB, /usr 8192MB, /data remaining
da0s1-1=ufs  4194304 /
da0s1-2=swap 8388608 none
da0s1-3=ufs 8388608 /var
da0s1-4=ufs 1048576 /tmp
da0s1-5=ufs 16777216 /usr
da0s1-6=ufs        0 /data 1
diskLabelEditor
# 主机全局配置,Host specific configuration:
tryDHCP=YES
netDev=bce0
hostname=FreeBSD
domainname=blog.51cto.com
# 选择安装的版本
distSetKernDeveloper
# 选择安装方法
netDev=bce0
tryDHCP=YES
nfs=192.168.0.1:/data/pxeiso
mediaSetNFS
# 配置完成,提交!
installCommit
# 安装完毕自动重启
shutdown
 
7、卸载mfsroot并重新打包mfsroot
umount /dev/md0
mdconfig -d -u0
gzip mfsroot
 
8、在 S 上启动 tftpd, dhcpd 和 nfsd:
/etc/rc.d/inetd forcestart
/etc/rc.d/nfsd forcestart
/usr/local/etc/rc.d/isc-dhcpd forcestart
 
9、由于我们已经使用直连网线将 S 和 D 连接,假设 S 上没有配置 BIND 服务,也没有额外的到 Internet 的网络连接,那么需要禁止 S 上的 DNS 解析。可以修改 /etc/resolv.conf,将其中所有以 nameserver 开头的行注释掉。否则 mountd(因为 nfsd 依赖这个 daemon,所以 mountd 也会随 nfsd 启动而启动)会去查 DNS,而有可能导致最终 PXE 启动连不上 nfs,不能加载 kernel 而超时失败。
 
10、在 D 的 BIOS 中设置为 PXE 引导,重新启动计算机。
 
11、最终安装完毕后重新启动系统。并修改 D 的 BIOS 设置,禁止网络启动。
 
12、安装全部完成,可以开始享用 FreeBSD 了。