FreeBSD 使用手册
上一页 | 第32章 　高级网络 | 下一页

# 32.7 无盘操作

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

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

- 至少有两种可能的方法从网络加载内核：

  - PXE：Intel® 的先启动执行环境 (Preboot eXecution 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 文件系统必须可写的部分被 md(4) 文件系统覆盖。 任何的改写在重启后都会丢失。

- 内核由 etherboot 或 PXE 传送和加载， 有些情况可能会指定使用其中之一。

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

这部分所有的信息均在 5.2.1-RELEASE 上测试过。

## 32.7.1 背景信息

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

- 编译时选项在运行时可能产生不同的行为。

- 出错信息经常是加密了的或根本就没有。

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

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

- 机子需要获取初始的参数，如它的 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 工作得一样的好。 不过， 因为一般情况下内核希望 loader(8) 做了更多的事情， PXE 是推荐的方法。

  如果您的 BIOS 和网卡都支持 PXE， 就应该使用它。

- 最后，机子需要访问它的文件系统。 NFS 使用在所有的情况下。

查看 diskless(8) 手册页。

## 32.7.2 安装说明

### 32.7.2.1 配置使用ISC DHCP

ISC DHCP 服务器可以回应 BOOTP 和 DHCP 的请求。

ISC DHCP 4.2 并不属于基本系统。首先您需要安装 `net/isc-dhcp42-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";
      }
    }

  这个选项告诉 dhcpd 发送`host` 里声明的用于无盘主机的主机名的值。 另外可能会增加一个 `option host-name `margaux`` 到 `host` 声明里。
  `next-server` 正式指定 TFTP 或 NFS 服务用于载入装载器或内核文件 (默认使用的是相同的主机作为DHCP 服务器)。
  `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 里启动)。
  `root-path` 选项定义到根 (root) 文件系统的路径，通常是 NFS 符号。当使用 PXE 时，只要您不启用内核里的 BOOTP 选项，可以不管主机的IP。NFS 服务器然后就如同 TFTP 一样。

### 32.7.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

### 32.7.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`。

### 32.7.2.4 使用PXE启动

默认地，pxeboot(8) 装载器通过 NFS 装载内核。它可以编译来使用 TFTP——通过在文件 `/etc/make.conf` 里指定 `LOADER_TFTP_SUPPORT` 选项来代替。 请参见 `/usr/share/examples/etc/make.conf` 里的注释 了解如何配置。

除此之外还有两个未说明的 `make.conf` 选项——它可能对于设置一系列控制台无盘机器会有用： `BOOT_PXELDR_PROBE_KEYBOARD`和 `BOOT_PXELDR_ALWAYS_SERIAL`。

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

### 32.7.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

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

3. 让 inetd 重读其配置文件。 要正确执行这个命令， 在 `/etc/rc.conf` 文件中必须加入 `inetd_enable="YES"`：

       # /etc/rc.d/inetd restart

您可把 `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， 您可能就要重启系统了。

       # /etc/rc.d/mountd restart

### 32.7.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` (参考 `NOTES` 文件)。

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

编译内核(参考第 9 章)， 然后将它复制到 `dhcpd.conf` 里指定的地方。

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

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

>     hints		"GENERIC.hints"

### 32.7.2.7 准备根(root)文件系统

您需要为无盘工作站建立根文件系统， 它就是 `dhcpd.conf` 里的 `root-path` 所指定的目录。

#### 32.7.2.7.1 使用 `make world` 来复制根文件系统

这种方法可以迅速安装一个彻底干净的系统 (不仅仅是根文件系统) 到 `DESTDIR`。 您要做的就是简单地执行下面的脚本：

    #!/bin/sh
    export DESTDIR=/data/misc/diskless
    mkdir -p ${DESTDIR}
    cd /usr/src; make buildworld && make buildkernel
    make installworld && make installkernel
    cd /usr/src/etc; make distribution

一旦完成，您可能需要定制 `/etc/rc.conf` 和 `/etc/fstab`——根据您的需要放到 `DESTDIR`里。

### 32.7.2.8 配置 swap(交换)

如果需要，位于服务器上的交换文件可以通过 NFS 来访问。

#### 32.7.2.8.1 NFS 交换区

内核并不支持在引导时启用 NFS 交换区。 交换区必须通过启动脚本启用， 其过程是挂接一个可写的文件系统， 并在其上创建并启用交换文件。 要建立尺寸合适的交换文件， 可以这样做：

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

要启用它，您须要把下面几行加到 `rc.conf`里：

    swapfile=/path/to/swapfile

### 32.7.2.9 杂项问题

#### 32.7.2.9.1 运行时 `/usr` 是只读在

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

#### 32.7.2.9.2 使用非 FreeBSD 服务器

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

在这种情况下，有时对于 `/dev` 里的一些特殊的文件会有问题，原因就是不同的 “最大/最小”整数大小。 一种解决的方法就是从非 FreeBSD 服务里导出一个目录， 并把它载入 FreeBSD 到机子上， 并使用 devfs(5) 来为用户透明地分派设备节点。

上一页 | 起始页 | 下一页
链路聚合与故障转移 | 上一级 | 从 PXE 启动一个 NFS 根文件系统

本文档和其它文档可从这里下载：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读文档，如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.