Машина с 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). Любые изменения будут потеряны при перезагрузках системы.
Ядро загружается посредством etherboot, при помощи DHCP (или BOOTP) и TFTP.
CautionКак описано, эта система незащищена. Она должна располагаться в защищенной части сети, а другие хосты не должны на нее полагаться.
Есть два протокола, часто используемых для загрузки рабочих станций, которые запрашивают свою конфигурацию по сети: BOOTP и DHCP. При начальной загрузке рабочей станции они используются в нескольких местах:
etherboot использует (по умолчанию) DHCP или BOOTP (требуется опция при настройке) для поиска ядра. (PXE использует DHCP).
Ядро использует BOOTP для поиска корневой файловой системы в NFS.
Возможна настройка системы на использование исключительно BOOTP. Программа сервера bootpd(8) включена в базовую систему FreeBSD.
Однако DHCP имеет некоторый набор преимуществ перед BOOTP (лучше настроечные файлы, возможность использования PXE, плюс множество других, напрямую не связанных к работе без диска), и мы опишем как конфигурацию с чистым BOOTP, так и BOOTP+DHCP, с упором на последнее, в котором используется пакет DHCP от ISC.
Сервер isc-dhcp может обрабатывать как запросы BOOTP, так и запросы DHCP.
Начиная с релиза 4.4, isc-dhcp 3.0 не включается в поставку системы. Сначала вам нужно будет установить порт net/isc-dhcp3 или соответствующий пакадж. Пожалуйста, обратитесь к Chapter 4 для получения общего представления о портах и пакаджах.
После установки isc-dhcp ему для работы требуется конфигурационный файл (обычно называемый /usr/local/etc/dhcpd.conf). Вот прокомментированный пример:
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 "/tftpboot/kernel.diskless"; option root-path "192.168.4.4:/data/misc/diskless"; } }
Note: Похоже, что PXE предпочитает относительное имя файла, и он загружает pxeboot, а не ядро (option filename "pxeboot").
Далее описана эквивалентная конфигурация с использованием 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
Сайт Etherboot содержит подробную документацию, в основном предназначенную для систем Linux, но несомненно, она полезна. Далее будет просто кратко описано, как вы должны использовать etherboot в системе FreeBSD.
Сначала вы должны установить пакадж или порт net/etherboot. Порт etherboot обычно расположен в /usr/ports/net/etherboot. Если в вашей системе установлено дерево портов, просто наберите make в этом каталоге, все остальное быдет сделано за вас. Либо обратитесь к Chapter 4 для получения информации о портах и пакаджах.
В нашей ситуации мы будем использовать загрузочную дискету. Для других методов (PROM или программа DOS) пожалуйста, обратитесь к документации по etherboot.
Для создания загрузочной дискеты, вставьте дискету в дисковод на машине, где установлен etherboot, затем перейдите в каталог src в дереве etherboot и наберите:
# gmake bin32/devicetype.fd0
devicetype зависит от типа адаптера Ethernet на бездисковой рабочей станции. Обратитесь к файлу NIC в том же самом каталоге для определения правильного значения для devicetype.
Вам нужно включить tftpd на сервере TFTP:
Создайте каталог, в котором tftpd будет работать с файлами, то есть: /tftpboot
Добавьте в ваш /etc/inetd.conf такую строчку:
tftp dgram udp wait nobody /usr/libexec/tftpd tftpd /tftpboot
Note: Бывает, что некоторым версиям PXE требуется TCP-вариант TFTP. В таком случае добавьте вторую строчку, заменяющую dgram udp на stream tcp.
Укажите inetd на повторное чтение своего конфигурационного файла:
# kill -HUP `cat /var/run/inetd.pid`
Вы можете поместить каталог tftpboot в любом месте на сервере. Проверьте, что это местоположение указано как в inetd.conf, так и в dhcpd.conf.
Вам также нужно включить NFS и экспортировать соответствующую файловую систему на сервере NFS.
Добавьте следующее в /etc/rc.conf:
nfs_server_enable="YES"
Проэкспортируйте файловую систему, в которой расположен корневой каталог для бездисковой рабочей станции, добавив следующую строку в /etc/exports (подправьте точку монтирования и замените margaux на имя бездисковой рабочей станции):
/data/misc -alldirs -ro margaux
Укажите mountd на повторное чтение настроечного файла. На самом деле если вам потребовалось на первом шаге включить NFS в /etc/rc.conf, то вам нужно будет выполнить перезагрузку.
# kill -HUP `cat /var/run/mountd.pid`
Создайте конфигурационный файл ядра для бездискового клиента со следующими параметрами (вдобавок к обычным):
options BOOTP # Use BOOTP to obtain IP address/hostname options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info options BOOTP_COMPAT # Workaround for broken bootp daemons.
Вам может потребоваться использовать BOOTP_NFSV3 и BOOTP_WIRED_TO (посмотрите LINT).
Постройте ядро (обратитесь к Chapter 9) и скопируйте его в каталог tftp под именем, указанным в dhcpd.conf.
Вам нужно создать корневую файловую систему для бездисковых рабочих станций, в месоположении, заданном как root-path в dhcpd.conf.
Самым простым способом сделать это является использование скрипта /usr/share/examples/diskless/clone_root. Этот скрипт требуется настроить, по крайней мере, подправив место, где будет создана файловая система (переменная DEST).
Прочтите комментарии в начале скрипта для получения указаний. Там описано, как строится основная файловая система, и как файлы могут быть выборочно заменены версиями, предназначенными для работы без диска, для подсети или для отдельной рабочей станции. Также здесь даются примеры бездисковых файлов /etc/fstab и /etc/rc.conf.
Файлы README в /usr/share/examples/diskless много интересной информации, но вместе с другими примерами из каталога diskless они на самом деле описывают метод настройки, который отличается от того, что используется в clone_root и /etc/rc.diskless[12], этим несколько запутывая дело. Используйте их только для справки, за исключением того случая, когда вы выберете метод, ими описываемый, и тогда вам нужны исправленные скрипты rc.
Если это нужно, то файл подкачки, расположенный на сервере, можно использовать посредством NFS. Точные параметры bootptab или dhcpd.conf пока плохо документированы. Сообщается, что работает следующая конфигурация с использованием isc-dhcp 3.0rc11.
Добавьте следующие строки в dhcpd.conf:
# Global section option swap-path code 128 = string; option swap-size code 129 = integer 32; host margaux { ... # Стандартные строки, смотрите выше option swap-path "192.168.4.4:/netswapvolume/netswap"; option swap-size 64000; }
Идея заключается в том, что, по крайней мере для клиента FreeBSD, дополнительный параметр DHCP/BOOTP под кодом 128 является маршрутом к файлу подкачки NFS, а параметр с кодом 129 задает размер области подкачки в килобайтах. Более старые версии dhcpd разрешали использовать синтаксис типа option option-128 "..., который больше не работает.
Во /etc/bootptab будет использоваться такой синтаксис:
T128="192.168.4.4:/netswapvolume/netswap":T129=64000
На файловом сервере 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-адресом бездискового клиента.
На файловом сервере NFS, в /etc/exports добавьте такую строку:
/netswapvolume -maproot=0:10 -alldirs margaux
Затем укажите mountd на повторное чтение файла exports, как описано ранее.
Если бездисковая рабочая станция настроена на запуск X, вам нужно подправить настроечный файл для xdm, который по умолчанию помещает протокол ошибок в /usr.
Если сервер с корневой файловой системой работает не под управлением FreeBSD, вам потребуется создать корневую файловую систему на машине FreeBSD, а затем скопировать ее в нужно место, при помощи tar или cpio.
В такой ситуации иногда возникают проблемы со специальными файлами в /dev из-за различной разрядности целых чисел для старшего/младшего чисел. Решением этой проблемы является экспортирование каталога с не-FreeBSD сервера, монтирование его на машине с FreeBSD и запуск скрипта MAKEDEV на машине с FreeBSD для создания правильных файлов устройств.