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

# 24.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 (обычно сервера), с некоторыми настроечными файлами, измененными кем-то специально для бездисковых операций или, возможно, для рабочей станции, которой она предназначена.

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

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

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

Вся информация этого раздела была протестирована с релизами FreeBSD 4.9-RELEASE и 5.2.1-RELEASE. Текст структурирован преимущественно для использования с 4.X. Отличия для 5.X упоминаются особо.

## 24.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 работают одинаково хорошо с системами 4.X. Поскольку ядро 5.X обычно позволяет loader(8) выполнить больше предварительной работы, метод PXE на системах 5.X предпочтителен.

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

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

Обратитесь также к странице справочника 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` или соответствующий пакет.

После установки 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.

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

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

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

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

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

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

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

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

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

       # 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 (посмотрите `LINT` в 4.X или `NOTES` в 5.X).

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

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

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

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

>     hints      "GENERIC.hints"

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

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

#### 24.6.2.7.1. Использование скрипта `clone_root`

Это самый простой способ создания корневой файловой системы, но на данный момент он не поддерживается в FreeBSD 4.X. Этот shell скрипт находится в `/usr/share/examples/diskless/clone_root`, и требует настройки, по крайней мере, задания того места, где будет создана файловая система (переменная DEST).

Прочтите комментарии в начале скрипта для получения указаний. Там описано, как строится основная файловая система, и как файлы могут быть выборочно заменены версиями, предназначенными для работы без диска, для подсети или для отдельной рабочей станции. Также здесь даются примеры бездисковых файлов `/etc/fstab` и `/etc/rc.conf`.

Файлы `README` в `/usr/share/examples/diskless` много интересной информации, но вместе с другими примерами из каталога `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. Настройка области подкачки

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

#### 24.6.2.8.1. Подкачка по NFS в FreeBSD 4.X

Местоположение и размер файла подкачки могут быть указаны FreeBSD-специфичными параметрами BOOTP/DHCP 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

   > Замечание: В файле `/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 4.X

Положение и размер файла подкачки могут быть указаны в FreeBSD-специфичных параметрах BOOTP/DHCP с номерами 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

   > Замечание: В `/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 перечитать конфигурационные файлы как было показано выше.

### 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 и запуск скрипта `MAKEDEV` на машине с FreeBSD для создания правильных файлов устройств (во FreeBSD 5.0 и более поздних версиях используется devfs(5) для создания файлов устройств прозрачно для пользователя, запуск `MAKEDEV` в этих версиях бессмысленно).

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

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

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