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 margauxhost 声明里。
(2)
next-server 正式指定 TFTPNFS 服务用于载入装载器或内核文件 (默认使用的是相同的主机作为DHCP 服务器)。
(3)
filename 正式定义这样的文件——etherbootPXE 为执行下一步将装载它。 根据使用的传输方式,它必须要指定。 Etherboot 可以被编译来使用 NFSTFTP。 FreeBSD port 默认配置了NFSPXE 使用 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 需要 DHCPbootpd 的唯一可见的好处是它存在于基本系统中。

.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_KEYBOARDBOOT_PXELDR_ALWAYS_SERIAL (后者只存在于 FreeBSD 5.X 里)。

当机器启动里,要使用 PXE, 通常需要选择 Boot from network 选项——在 BIOS 设置里, 或者在 PC 初始化的时候输入一个功能键 (function key)。

24.6.2.5. 配置 TFTPNFS 服务器

如果您正在使用 PXEEtherboot——配置使用了 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.confdhcpd.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.confNFS, 您可能就要重启系统了。

    # 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_NFSV3BOOT_COMPATBOOTP_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.0bootpd的配置文件例子如下:

  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 机器上建立根文件系统, 然后把它复制到它的目的地,使用的命令可以是 tarcpio

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