Руководство FreeBSD
Пред. | Глава 29. Сложные вопросы работы в сети | След.

# 29.6. Работа с бездисковыми станциями

Текст обновил Jean-François Dockès. Реорганизовал и улучшил Alex Dupre.

Машина с FreeBSD может загружаться по сети и работать без наличия локального диска, используя файловые системы, монтируемые с сервера NFS. Кроме стандартных конфигурационных файлов, не нужны никакие модификации в системе. Такую систему легко настроить, потому что все необходимые элементы уже готовы:

- Имеется по крайней мере два возможных способа загрузки ядра по сети:

  - PXE: Система Intel® Preboot eXecution Environment является формой загрузочного ПЗУ, встроенного в некоторые сетевые адаптеры или материнские платы. Обратитесь к справочной странице по pxeboot(8) для получения более полной информации.

  - Порт Etherboot (`net/etherboot`) генерирует код, который может применяться в ПЗУ для загрузки ядра по сети. Код может быть либо прошит в загрузочный PROM на сетевом адаптере, либо загружен с локальной дискеты (или винчестера), или с работающей системы MS-DOS®. Поддерживаются многие сетевые адаптеры.

- Примерный скрипт (`/usr/share/examples/diskless/clone_root`) облегчает создание и поддержку корневой файловой системы рабочей станции на сервере. Скрипт, скорее всего, потребует некоторых настроек, но он позволит вам быстро начать работу.

- Стандартные файлы начального запуска системы, располагающиеся в `/etc`, распознают и поддерживают загрузку системы в бездисковом варианте.

- Подкачка, если она нужна, может выполняться через файл NFS либо на локальный диск.

Существует много способов настройки бездисковой рабочей станции. При этом задействованы многие компоненты, и большинство из них могут быть настроены для удовлетворения ваших вкусов. Далее будет описаны варианты полной настройки системы, при этом упор будет делаться на простоту и совместимость с стандартной системой скриптов начальной загрузки FreeBSD. Описываемая система имеет такие характеристики:

- Бездисковые рабочие станции совместно используют файловую систему `/` в режиме только чтения, а также используют `/usr` совместно тоже в режиме только чтения.

  Корневая файловая система является копией стандартной корневой системы FreeBSD (обычно сервера), с некоторыми настроечными файлами, измененными кем-то специально для бездисковых операций или, возможно, для рабочей станции, которой она предназначена.

  Части корневой файловой системы, которые должны быть доступны для записи, перекрываются файловыми системами md(4). Любые изменения будут потеряны при перезагрузках системы.

- Ядро передается и загружается посредством Etherboot или PXE, и в некоторых ситуациях может быть использован любой из этих методов.

> Предостережение: Как описано, эта система не защищена. Она должна располагаться в защищенной части сети, а другие хосты не должны на нее полагаться.

Вся информация этого раздела была протестирована с релизом FreeBSD 5.2.1-RELEASE.

## 29.6.1. Общая информация

Настройка бездисковых рабочих станций относительно проста, но в то же время легко сделать ошибку. Иногда сложно диагностировать эти ошибки по нескольким причинам. Например:

- Параметры компиляции могут по-разному проявлять себя во время работы.

- Сообщения об ошибках бывают загадочны или вовсе отсутствуют.

В данной ситуации некоторые знания, касающиеся используемых внутренних механизмов, очень полезны при разрешении проблем, которые могут возникнуть.

Для выполнения успешной загрузки необходимо произвести несколько операций:

- Компьютеру необходимо получить начальные параметры, такие как собственный IP адрес, имя исполняемого файла, корневой каталог. Для этого используются протоколы DHCP или 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, непосредственно загрузит ядро, с меньшей подготовкой. Вам потребуется собрать ядро со специальными параметрами.

  PXE и Etherboot работают одинаково хорошо; тем не менее, поскольку ядро обычно позволяет loader(8) выполнить больше предварительной работы, метод PXE предпочтителен.

  Если ваш BIOS и сетевые карты поддерживают PXE, используйте его.

- Наконец, компьютеру требуется доступ к файловым системам. NFS используется во всех случаях.

Обратитесь также к странице справочника diskless(8).

## 29.6.2. Инструкции по настройке

### 29.6.2.1. Конфигурация с использованием ISC DHCP

Сервер ISC DHCP может обрабатывать как запросы BOOTP, так и запросы DHCP.

ISC DHCP 3.0 не включается в поставку системы. Сначала вам нужно будет установить порт `net/isc-dhcp3-server` или соответствующий пакет.

После установки 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 порт по умолчанию использует NFS. PXE использует TFTP, поэтому здесь применяются относительные пути файлов (это может зависеть от настроек TFTP сервера, но обычно довольно типично). Кроме того, PXE загружает `pxeboot`, а не ядро. Существуют другие интересные возможности, такие как загрузка `pxeboot` из каталога `/boot` FreeBSD CD-ROM (поскольку pxeboot(8) может загружать `GENERIC` ядро, это делает возможной загрузку с удаленного CD-ROM).
  Параметр `root-path` определяет путь к корневой файловой системе, в обычной нотации NFS. При использовании PXE, можно оставить IP хоста отключенным, если параметр ядра BOOTP не используется. Затем NFS сервер может использоваться так же, как и TFTP.

### 29.6.2.2. Настройка с использованием BOOTP

Далее описана эквивалентная конфигурация с использованием bootpd (для одного клиента). Она будет располагаться в `/etc/bootptab`.

Пожалуйста, отметьте, что Etherboot должен быть откомпилирован с нестандартной опцией `NO_DHCP_SUPPORT` для того, чтобы можно было использовать BOOTP, и что для работы 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

### 29.6.2.3. Подготовка программы загрузки при помощи Etherboot

Сайт Etherboot содержит подробную документацию, в основном предназначенную для систем Linux, но несомненно, она полезна. Далее будет просто кратко описано, как вы должны использовать Etherboot в системе FreeBSD.

Сначала вы должны установить пакет или порт `net/etherboot`.

Вы можете изменить настройку Etherboot (например, для использования TFTP вместо NFS) путем редактирования файла `Config` в каталоге исходных текстов Etherboot.

В нашей ситуации мы будем использовать загрузочную дискету. Для других методов (PROM или программа MS-DOS) пожалуйста, обратитесь к документации по Etherboot.

Для создания загрузочной дискеты, вставьте дискету в дисковод на машине, где установлен Etherboot, затем перейдите в каталог `src` в дереве Etherboot и наберите:

    # gmake bin32/devicetype.fd0

`devicetype` зависит от типа адаптера Ethernet на бездисковой рабочей станции. Обратитесь к файлу `NIC` в том же самом каталоге для определения правильного значения для `devicetype`.

### 29.6.2.4. Загрузка с PXE

По умолчанию, pxeboot(8) загружает ядро через NFS. Он может быть скомпилирован для использования вместо него TFTP путем указания параметра `LOADER_TFTP_SUPPORT` в `/etc/make.conf`. Смотрите комментарии в файле `/usr/share/examples/etc/make.conf`.

Есть два не документированных параметра `make.conf`, которые могут быть полезны для настройки бездискового компьютера с последовательной консолью: `BOOT_PXELDR_PROBE_KEYBOARD`, и `BOOT_PXELDR_ALWAYS_SERIAL`.

Для использования PXE при загрузке компьютера вам обычно потребуется выбрать параметр `Boot from network` (загрузка по сети) в настройках BIOS, или нажать функциональную клавишу во время загрузки PC.

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

   > Замечание: Бывает, что некоторым версиям PXE требуется TCP-вариант TFTP. В таком случае добавьте вторую строчку, заменяющую `dgram udp` на `stream tcp`.

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 перечитать настроечный файл. На самом деле если вам потребовалось на первом шаге включить NFS в `/etc/rc.conf`, то вам нужно будет выполнить перезагрузку.

       # /etc/rc.d/mountd restart

### 29.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` (посмотрите файл `NOTES`).

Эти имена параметров сложились исторически, и могут немного ввести в заблуждение, поскольку включают необязательное использование DHCP и BOOTP в ядре (возможно включение обязательного использования BOOTP или DHCP use).

Постройте ядро (обратитесь к Гл. 9) и скопируйте его в каталог, указанный в `dhcpd.conf`.

> Замечание: При использовании PXE, сборка ядра с вышеприведенными параметрами не является совершенно необходимой (хотя желательна). Включение этих параметров приведет к выполнению большинства DHCP запросов во время загрузки ядра, с небольшим риском несоответствия новых значений и значений, полученных pxeboot(8) в некоторых особых случаях. Преимущество использования в том, что в качестве побочного эффекта будет установлено имя хоста. Иначе вам потребуется установить имя хоста другим методом, например в клиент-специфичном файле `rc.conf`.

> Замечание: Для включения возможности загрузки с Etherboot, в ядро необходимо включить устройство hints. Вам потребуется установить в файле конфигурации следующий параметр (см. файл комментариев `NOTES`):

>     hints		"GENERIC.hints"

### 29.6.2.7. Подготовка корневой файловой системы

Вам нужно создать корневую файловую систему для бездисковых рабочих станций, в местоположении, заданном как `root-path` в `dhcpd.conf`.

#### 29.6.2.7.1. Использование процедуры `make world`

Этот метод установит новую систему (не только корневую) в `DESTDIR`. Все, что вам потребуется сделать, это просто выполнить следующий скрипт:

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

Как только это будет сделано, вам может потребоваться настроить `/etc/rc.conf` и `/etc/fstab`, помещенные в `DESTDIR`, в соответствии с вашими потребностями.

### 29.6.2.8. Настройка области подкачки

Если это нужно, то файл подкачки, расположенный на сервере, можно использовать посредством NFS.

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

### 29.6.2.9. Различные проблемы

#### 29.6.2.9.1. Работа с `/usr`, доступной только для чтения

Если бездисковая рабочая станция настроена на запуск X, вам нужно подправить настроечный файл для XDM, который по умолчанию помещает протокол ошибок в `/usr`.

#### 29.6.2.9.2. Использование не-FreeBSD сервера

Если сервер с корневой файловой системой работает не под управлением FreeBSD, вам потребуется создать корневую файловую систему на машине FreeBSD, а затем скопировать ее в нужно место, при помощи `tar` или `cpio`.

В такой ситуации иногда возникают проблемы со специальными файлами в `/dev` из-за различной разрядности целых чисел для старшего/младшего чисел. Решением этой проблемы является экспортирование каталога с не-FreeBSD сервера, монтирование его на машине с FreeBSD и использование devfs(5) для создания файлов устройств прозрачно для пользователя.

Пред. | Начало | След.
Мосты | Уровень выше | ISDN

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.