FreeBSD主机可以从网络启动而无需本地磁盘就可操作,使用的是从NFS服务器装载的文件系统。除了标准的配置文件,无需任何的系统修改。 很容易设置这样的系统因为所有必要的元素都很容易得到:
至少有两种可能的方法从网络加载内核:
PXE: Intel®的先启动执行环境(Preboot Xecution Environment)系统是一种灵活的引导ROM模式,这个ROM内建在一些网卡或主板的中。查看pxeboot(8)以获取更多细节。
Etherboot port (net/etherboot) 产生通过网络加载内核的可ROM代码。这些代码可以烧入网卡上的PROM上,或从本地软盘(或硬盘)驱动器加载,或从运行着的MS-DOS®系统加载。它支持多种网卡。
一个样板脚本(/usr/share/examples/diskless/clone_root)简化了对服务器上的工作站根文件系统的创建和维护。这个脚本需要少量的自定义,但你能很快的熟悉它。
/etc存在标准的系统启动文件用于侦测和支持无盘的系统启动。
可以向NFS文件或本地磁盘进行交换(如果需要的话)。
设置无盘工作站有许多方法。有很多相关的元素大部分可以自定义以适合本地情况。以下将介绍一个完整系统的安装,强调的是简单性和与标准FreeBSD启动脚本的兼容。介绍的系统有以下特性:
无盘工作站使用一个共享的只读/文件系统和一个共享的只读/usr。
root 文件系统是一份标准的FreeBSD根文件系统 (一般是服务器的),只是一些配置文件被特定于无盘操作的配置文件覆盖。
root文件系统必须可写的部分被 mfs(8) (FreeBSD 4.X) 或 md(4) (FreeBSD 5.X) 文件系统覆盖。任何的改写在重启后都会丢失。
内核由etherboot 或 PXE 传送和加载, 有些情况可能会指定使用其中之一。
注意如上所述,这个系统是不安全的。它应该处于网络的受保护区域并不被其它主机信任。
这部分所有的信息都已使用FreeBSDreleases 4.9-RELEASE 和 5.2.1-RELEASE测试过。文本主是使用4.X格式组织的。为适应5.X的改变,都有注释被加入。
设置无盘工作站相对要简单而又易出错。有时分析一些原因是很难的。例如:
编译时选项在运行时可能产生不同的行为。
出错信息经常是加密了的或根本就没有。
在这里,涉及到的一些背景知识对于可能出现的问题的解决是很有帮助的。
要成功地引导系统还有些操作需要做。
机子需要获取初始的参数,如它的IP地址、执行文件、服务器名、根路径。这个可以使用或BOOTP协议来完成。 DHCP是BOOTP的兼容扩展,并使用相同的端口和基本包格式。
只使用BOOTP来配置系统也是可行的。 bootpd(8)服务程序被包含在基本的FreeBSD系统里。
不过,DHCP 相比BOOTP有几个好处(更好的配置文件,使用PXE的可能性,以及许多其它并不直接相关的无盘操作),接着我们会要描述一个DHCP配置,可能的话会利用与使用bootpd(8)相同的例子。这个样板配置会使用ISC DHCP软件包(3.0.1.r12发行版安装在测试服务器上)。
机子需要传送一个或多个程序到本地内存。TFTP 或 NFS 会被使用。选择TFTP 还是 NFS 需要在几个地方的“编译时间”选项里设置。 通常的错误源是为文件名指定了错误的协议: TFTP通常从服务器里的一个单一目录传送所有文件,并需要相对这个目录的文件名。NFS需要的是绝对文件路径。
介于启动程序和内核之间的可能的部分需要被初始化并执行。在这部分有几个重要的变量:
PXE 会装入 pxeboot(8)——它是FreeBSD第三阶段装载器的修改版。loader(8)会获得许多参数用于系统启动,并在传送控制之前把它们留在内核环境里。在这种情况下,使用GENERIC内核就可能了。
Etherboot会做很少的准备直接装载内核。你要使用指定的选项建立(build)内核。
PXE 和 Etherboot 在 4.X 系统里工作得一样的好。因为5.X 内核通常让 loader(8) 做了更多的事情,PXE 比较适合5.X系统。
如果你的 BIOS 和网卡支持PXE,你应该使用它。当然,使用Etherboot依然可以启动5.X系统。
最后,机子需要访问它的文件系统。 NFS 使用在所有的情况下。
查看diskless(8)手册页。
ISC DHCP服务器可以回应 BOOTP 和 DHCP 的请求。
对于4.9的发行版,ISC DHCP 3.0 并不属于基本系统。首先你需要安装 net/isc-dhcp3-server port 或相应的“包”。
一旦安装了ISC DHCP, 还需要一个配置文件才能运行(通常名叫/usr/local/etc/dhcpd.conf)。这里有个注释过的例子,里边主机margaux 使用 Etherboot ,而主机corbieres 使用 PXE:
default-lease-time 600; max-lease-time 7200; authoritative; option domain-name "example.com"; option domain-name-servers 192.168.4.1; option routers 192.168.4.1; subnet 192.168.4.0 netmask 255.255.255.0 { use-host-decl-names on;option subnet-mask 255.255.255.0; option broadcast-address 192.168.4.255; host margaux { hardware ethernet 01:23:45:67:89:ab; fixed-address margaux.example.com; next-server 192.168.4.4;
filename "/data/misc/kernel.diskless";
option root-path "192.168.4.4:/data/misc/diskless";
} host corbieres { hardware ethernet 00:02:b3:27:62:df; fixed-address corbieres.example.com; next-server 192.168.4.4; filename "pxeboot"; option root-path "192.168.4.4:/data/misc/diskless"; } }
这里紧跟的是一个等效的bootpd配置(减少到一个客户端)。这个可以在/etc/bootptab里找到。
请注意:为了使用BOOTP,etherboot 必须使用非默认选项NO_DHCP_SUPPORT来进行编译,而且PXE 需要 DHCP。bootpd的唯一可见的好处是它存在于基本系统中。
.def100:\ :hn:ht=1:sa=192.168.4.4:vm=rfc1048:\ :sm=255.255.255.0:\ :ds=192.168.4.1:\ :gw=192.168.4.1:\ :hd="/tftpboot":\ :bf="/kernel.diskless":\ :rp="192.168.4.4:/data/misc/diskless": margaux:ha=0123456789ab:tc=.def100
Etherboot的网站 包含有更多的文档——主要瞄准的是Linux系统,但无疑包含有有用的信息。如下列出的是关于在FreeBSD系统里使用Etherboot。
首先你必须安装net/etherboot 包或port。
你可以改变 Etherboot 的配置(如使用TFTP来代替NFS),方法是修改Config 文件——在Etherboot源目录里。
对于我们的设置,我们要使用一张启动软盘。对于其它的方法(PROM,或MS-DOS程序),请参考Etherboot文档。
想要使用启动软盘,先插入一张软盘到安装有Etherboot的机器的驱动器里,然后把当前路径改到src目录——在Etherboot树下,接着输入:
# gmake bin32/devicetype.fd0
devicetype 依赖于无盘工作站上的以太网卡的类型。参考在同一个目录下的NIC文件确认正确的devicetype。
默认地,pxeboot(8)装载器通过NFS装载内核。它可以编译来使用TFTP——通过在文件/etc/make.conf里指定LOADER_TFTP_SUPPORT选项来代替。查看/etc/defaults/make.conf里的注释(或5.X系统的/usr/share/examples/etc/make.conf)可以获得指导。
其它有两个未说明的make.conf选项——它可能对于设置一系列控制台无盘机器会有用: BOOT_PXELDR_PROBE_KEYBOARD和BOOT_PXELDR_ALWAYS_SERIAL(后者只存在于FreeBSD 5.X里)。
当机器启动里,要使用PXE,通常需要选择Boot from network选项——在BIOS设置里,或者在PC初始化的时候输入一个功能键(function key)。
如果你正在使用PXE或Etherboot——配置使用了TFTP,那么你需要在文件服务器上启用tftpd:
建立一个目录——从那里tftpd可以提供文件服务,如/tftpboot。
把这一行加入到/etc/inetd.conf里:
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot
注: 好像有一些版本的PXE需要TCP版本的TFTP。在这种情况下,加入第二行,使用stream tcp来代替dgram udp。
让inetd重读它的配置文件:
# kill -HUP `cat /var/run/inetd.pid`
你可把tftpboot目录放到服务器上的什何地方。确定这个位置设置在inetd.conf 和 dhcpd.conf里。
在所有的情况下,你都需要启用NFS,并且NFS服务器上导出相应的文件系统。
把这一行加入到/etc/rc.conf里:
nfs_server_enable="YES"
通过往/etc/exports里加入下面几行(调整“载入点”列,并且使用无盘工作站的名字替换margaux corbieres),导出文件系统——无盘根目录存在于此:
/data/misc -alldirs -ro margaux corbieres
让mountd重读它的配置文件。如果你真的需要启用第一步的/etc/rc.conf里NFS,你可能就要重启系统了。
# kill -HUP `cat /var/run/mountd.pid`
如果你在使用Etherboot,你需要为无盘客户端建立内核配置文件,使用如下选项(除了常使用的外):
options BOOTP # Use BOOTP to obtain IP address/hostname options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info
你可能也想使用BOOTP_NFSV3, BOOT_COMPAT 和 BOOTP_WIRED_TO(参考4.X里的LINT或5.X里的 NOTES on 5.X).
这些名字具有历史性,并且有些有些误导,因为它们实际上启用了内核里(它可能强制限制BOOTP或DHCP的使用),与DHCP和BOOTP的无关的应用。
编译内核(参考µÚ 8 章),然后将它复制到dhcpd.conf里指定的地方。
注: 当使用PXE里,使用以上选项建立内核并不做严格要求(尽管建议这样做)。 启用它们会在内核启动时引起更多的DHCP提及过的请求,带来的小小的风险是在有些特殊情况下新值和由pxeboot(8)取回的值之间的不一致性。使用它们的好处是主机名会被附带设置。否则,你就需要使用其它的方法来设置主机名,如在客户端指定的rc.conf文件里。
注: 为了使带有Etherboot的5.X内核可引导,就需要把设备提示(device hint)编译进去。通常要在配置文件(查看NOTES配置注释文件)里设置下列选项:
hints "GENERIC.hints"
你需要为无盘工作站建立根文件系统,位置列在dhcpd.conf里的root-path里边。下面部分描述了要这样做的两种方法:
这是建立根文件系统最快的方法,只是目前只在FreeBSD4.X里支持。这个shell脚本位于/usr/share/examples/diskless/clone_root并且需要定制,至少需要调整将会被建立文件系统的地方(DEST可变)。
参考用于指导的脚本的最前边的注释。它们说明了如何建立一个基本文件系统,并且如果根据特定版本的无盘工作站、子网或个人工作站选择性地忽略。它们也为无盘的/etc/fstab 的 /etc/rc.conf 文件给出了例子。
在/usr/share/examples/diskless里的README文件包含了许多有趣的背景信息,但是,他们同diskless目录里的其它例子一起,实际上说明了一种配置方法——与被clone_root和/etc里的系统启动脚本使用的完全不同, 这个有点迷惑人。使用它们只用做参考,除非你使用它们所描述的方法——这种情况下你需要定制rc脚本。
这种方法可以应用到FreeBSD 4.X或5.X,而且会安装一个彻底干净的系统(不仅仅是根文件系统)到DESTDIR。 你需要做的就是简单地执行下面的脚本:
#!/bin/sh export DESTDIR=/data/misc/diskless mkdir -p ${DESTDIR} cd /usr/src; make world && make kernel cd /usr/src/etc; make distribution
一旦完成,你可能需要定制/etc/rc.conf 和 /etc/fstab——根据你的需要放到DESTDIR里。
如果需要,位于服务器上的交换文件可以通过NFS来访问。完成它的一种普遍使用的方法在5.X的发行版里已不再继续(使用)。
交换文件的位置和大小可以使用BOOTP/DHCP来指定,FreeBSD指定的选项是128和129。用于ISC DHCP 3.0 或 bootpd的配置文件例子如下:
把下边几行加到dhcpd.conf里:
# Global section option swap-path code 128 = string; option swap-size code 129 = integer 32; host margaux { ... # Standard lines, see above option swap-path "192.168.4.4:/netswapvolume/netswap"; option swap-size 64000; }
swap-path指的是存放交换文件存的路径。每个文件会命名为swap.client-ip。
旧版的dhcpd使用的风格是option option-128 "...,这个已不在支持。
/etc/bootptab会使用下面的格式代替:
T128="192.168.4.4:/netswapvolume/netswap":T129=0000fa00
注: 在/etc/bootptab里,交换大小必须以十六进制表示。
在NFS交换文件服务器上,建立交换文件:
# mkdir /netswapvolume/netswap # cd /netswapvolume/netswap # dd if=/dev/zero bs=1024 count=64000 of=swap.192.168.4.6 # chmod 0600 swap.192.168.4.6
192.168.4.6是无盘客户端的IP地址。
在NFS交换文件服务器上,增加下面几行到/etc/exports:
/netswapvolume -maproot=0:10 -alldirs margaux corbieres
然后让mountd重读exports文件,同上。
这个内核在启动时并不支持启用NFS。Swap必须在启动脚本里启用,方法是装入一个可写的文件系统,然后建立和启用交换文件。要建立一个适当大小的交换文件,你可以这样做:
# dd if=/dev/zero of=/path/to/swapfile bs=1k count=1 oseek=100000
要启用它,你须要把下面几行加到rc.conf里:
swapfile=/path/to/swapfile
如果无盘工作站是配置来支持X,那么你就必须调整XDM配置文件,因为它默认把错误信息写到/usr。
当用作根文件系统的服务器运行的是不FreeBSD,你须要在FreeBSD机器上建立根文件系统,然后把它复制到它的目的地,使用的命令可以是tar或cpio。
在这种情况下,有时对于/dev里的一些特殊的文件会有问题,原因就是不同的“最大/最小”整数大小。一种解决的方法就是从非FreeBSD服务里导出一个目录,并把它载入FreeBSD到机子上,然后在FreeBSD机子上执行MAKEDEV来建立正确的设备条目(FreeBSD 5.0及新版使用devfs(5)来为用户透明地分派设备节点,在这些版本上执行MAKEDEV是毫无意义的)。