24.6. 无盘操作

更新: Jean-François Dockès. 重新组织及增强:Alex Dupre. 中文翻译:张 雪平 and 袁 苏义.

FreeBSD 主机可以从网络启动而无需本地磁盘就可操作, 使用的是从 NFS 服务器装载的文件系统。 除了标准的配置文件,无需任何的系统修改。 很容易设置这样的系统因为所有必要的元素都很容易得到:

设置无盘工作站有许多方法。 有很多相关的元素大部分可以自定义以适合本地情况。 以下将介绍一个完整系统的安装,强调的是简单性和与标准 FreeBSD 启动脚本的兼容。介绍的系统有以下特性:

Caution如上所述,这个系统是不安全的。 它应该处于网络的受保护区域并不被其它主机信任。

这部分所有的信息都已使用 FreeBSDreleases 4.9-RELEASE 和 5.2.1-RELEASE 测试过。文本主是使用 4.X 格式组织的。为适应 5.X 的改变,都有注释被加入。

24.6.1. 背景信息

设置无盘工作站相对要简单而又易出错。 有时分析一些原因是很难的。例如:

在这里, 涉及到的一些背景知识对于可能出现的问题的解决是很有帮助的。

要成功地引导系统还有些操作需要做。

查看 diskless(8) 手册页。

24.6.2. 安装说明

24.6.2.1. 配置使用ISC DHCP

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; (1)
  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; (2)
    filename "/data/misc/kernel.diskless"; (3)
    option root-path "192.168.4.4:/data/misc/diskless"; (4)
  }
  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";
  }
}
         
(1)
这个选项告诉 dhcpd 发送host 里声明的用于无盘主机的主机名的值。 另外可能会增加一个 option host-name margaux 到 host 声明里。
(2)
next-server 正式指定 TFTP 或 NFS 服务用于载入装载器或内核文件 (默认使用的是相同的主机作为DHCP 服务器)。
(3)
filename 正式定义这样的文件——etherboot 或 PXE 为执行下一步将装载它。 根据使用的传输方式,它必须要指定。 Etherboot 可以被编译来使用 NFS 或 TFTP。 FreeBSD port 默认配置了NFS。 PXE 使用 TFTP, 这就是为什么在这里使用相对文件名 (这可能依赖于 TFTP 服务器配置,不过会相当典型)。 同样,PXE 会装载 pxeboot, 而不是内核。另外有几个很有意思的可能,如从 FreeBSD CD-ROM 的 /boot 目录装载 pxeboot (因为 pxeboot(8) 能够装载 GENERIC 内核,这就使得可以使用 PXE 从远程的 CD-ROM 里启动)。
(4)
root-path 选项定义到根 (root) 文件系统的路径,通常是 NFS 符号。当使用 PXE 时,只要您不启用内核里的 BOOTP 选项,可以不管主机的IP。NFS 服务器然后就如同 TFTP 一样。

24.6.2.2. 配置使用BOOTP

这里紧跟的是一个等效的 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

24.6.2.3. 使用Etherboot准备启动程序

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。

24.6.2.4. 使用PXE启动

默认地,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)。

24.6.2.5. 配置 TFTP 和 NFS 服务器

如果您正在使用 PXE 或 Etherboot——配置使用了 TFTP,那么您需要在文件服务器上启用 tftpd:

  1. 建立一个目录——从那里 tftpd 可以提供文件服务,如 /tftpboot。

  2. 把这一行加入到 /etc/inetd.conf里:

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

    Note: 好像有一些版本的 PXE 需要 TCP 版本的 TFTP。 在这种情况下,加入第二行,使用 stream tcp 来代替 dgram udp。

  3. 让 inetd 重读它的配置文件:

    # kill -HUP `cat /var/run/inetd.pid`
    

您可把 tftpboot 目录放到服务器上的什何地方。 确定这个位置设置在 inetd.conf 和 dhcpd.conf 里。

在所有的情况下,您都需要启用 NFS, 并且 NFS 服务器上导出相应的文件系统。

  1. 把这一行加入到/etc/rc.conf里:

    nfs_server_enable="YES"
    
  2. 通过往 /etc/exports 里加入下面几行(调整“载入点”列, 并且使用无盘工作站的名字替换 margaux corbieres), 导出文件系统——无盘根目录存在于此:

    /data/misc -alldirs -ro margaux corbieres
    
  3. 让 mountd 重读它的配置文件。如果您真的需要启用第一步的 /etc/rc.conf 里 NFS, 您可能就要重启系统了。

    # kill -HUP `cat /var/run/mountd.pid`
    

24.6.2.6. 建立无盘内核

如果您在使用 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)。

这些名字具有历史性,并且有些有些误导, 因为它们实际上启用了内核里 (它可能强制限制 BOOTP 或 DHCP 的使用),与 DHCP 和 BOOTP 的无关的应用。

编译内核(参考Chapter 8), 然后将它复制到 dhcpd.conf 里指定的地方。

Note: 当使用 PXE 里, 使用以上选项建立内核并不做严格要求(尽管建议这样做)。 启用它们会在内核启动时引起更多的 DHCP 提及过的请求,带来的小小的风险是在有些特殊情况下新值和由 pxeboot(8) 取回的值之间的不一致性。 使用它们的好处是主机名会被附带设置。否则, 您就需要使用其它的方法来设置主机名,如在客户端指定的 rc.conf 文件里。

Note: 为了使带有 Etherboot 的 5.X 内核可引导,就需要把设备提示 (device hint) 编译进去。通常要在配置文件(查看 NOTES 配置注释文件) 里设置下列选项:

hints      "GENERIC.hints"

24.6.2.7. 准备根(root)文件系统

您需要为无盘工作站建立根文件系统,位置列在 dhcpd.conf 里的 root-path 里边。下面部分描述了要这样做的两种方法:

24.6.2.7.1. 使用 clone_root 脚本

这是建立根文件系统最快的方法,只是目前只在 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 脚本。

24.6.2.7.2. 使用标准的 make world 程序

这种方法可以应用到 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里。

24.6.2.8. 配置 swap(交换)

如果需要,位于服务器上的交换文件可以通过 NFS 来访问。完成它的一种普遍使用的方法在 5.X 的发行版里已不再继续(使用)。

24.6.2.8.1. NFS与 FreeBSD 4.X 之间的 Swap(交换)

交换文件的位置和大小可以使用BOOTP/DHCP 来指定,FreeBSD 指定的选项是 128 和 129。用于 ISC DHCP 3.0 或 bootpd的配置文件例子如下:

  1. 把下边几行加到 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
    

    Note: 在 /etc/bootptab 里, 交换大小必须以十六进制表示。

  2. 在 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 地址。

  3. 在 NFS 交换文件服务器上, 增加下面几行到 /etc/exports:

    /netswapvolume  -maproot=0:10 -alldirs margaux corbieres
           
    

    然后让 mountd 重读 exports文件,同上。

24.6.2.8.2. NFS 与 FreeBSD &os 5.X 之间的 Swap(交换)

这个内核在启动时并不支持启用 NFS。 Swap 必须在启动脚本里启用,方法是装入一个可写的文件系统, 然后建立和启用交换文件。要建立一个适当大小的交换文件, 您可以这样做:

# dd if=/dev/zero of=/path/to/swapfile bs=1k count=1 oseek=100000

要启用它,您须要把下面几行加到 rc.conf里:

swapfile=/path/to/swapfile

24.6.2.9. 杂项问题

24.6.2.9.1. 运行时 /usr 是只读在

如果无盘工作站是配置来支持 X, 那么您就必须调整 XDM 配置文件,因为它默认把错误信息写到 /usr。

24.6.2.9.2. 使用非 FreeBSD 服务器

当用作根文件系统的服务器运行的是不 FreeBSD,您须要在 FreeBSD 机器上建立根文件系统, 然后把它复制到它的目的地,使用的命令可以是 tar 或 cpio。

在这种情况下,有时对于 /dev 里的一些特殊的文件会有问题,原因就是不同的 “最大/最小”整数大小。 一种解决的方法就是从非 FreeBSD 服务里导出一个目录, 并把它载入 FreeBSD 到机子上,然后在 FreeBSD 机子上执行 MAKEDEV 来建立正确的设备条目 (FreeBSD 5.0及新版使用 devfs(5) 来为用户透明地分派设备节点,在这些版本上执行 MAKEDEV 是毫无意义的)。