Корневой NFS

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

Станция должна выяснить свой IP-адрес, и, если необходимо, полную конфигурацию Ethernet.

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

Существующая реализация системы NFSROOT в ядре Linux (начиная с версии 1.3.7x) позволяет следующие варианты:

IP-адрес может быть определен при помощи RARP, либо полная конфигурация Ethernet может быть передана ядру через параметры ядра через LILO или LOADLIN.

Путь NFS также может быть передан через параметры ядра. Если это не сделано, то RARP-сервер будет восприниматься, как и NFS-сервер, и использовать путь, встроенный в ядро по умолчанию (обычно это: /tftpboot/<IP-address of the machine>.)

Конфигурация станции может быть определена при помощи BOOTP.

До настройки бездисковой станции вы должны решить, использовать или нет LILO или LOADLIN. Плюс их использования - гибкость, минус - скорость. Ядро Linux без LILO загружается быстрее. Возможно, в некоторых случаях, вам просто не придется выбирать.

Настройка сервера

Сборка ядра

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

Ядро для рабочей станции должно содержать, как минимум, следующее:

Встроенную в ядро поддержку файловой системы NFS. (Не обязательно встраивать в ядро поддержку файловой системы ext2 - будет достаточно модуля)

Должен быть включен параметр "Корневая NFS"

Ethernet-драйвер для сетевой платы рабочей станции должен быть встроен в ядро.

В зависимости от вашей конфигурации, вам, возможно, нужно будет встроить поддержку RARP или BOOTBP для корневой NFS. (Я имею в виду вопросы, задаваемые make config после вопроса о поддержке файловой системы NFS)

Если станция будет загружаться без параметров ядра, то вам также надо настроить корневое устройство 0:255. Создайте несуществующее устройство командой mknod /dev/nfsroot b 0 255. После создания этого файла устройства, вы можете указать на загрузочное устройство с ядром командой rdev <образ-ядра> /dev/nfsroot.

Создание корневой файловой системы

Копирование файловой системы

Внимание: несмотря на то, что этот способ может подойти вам, он очень непродуктивен и неэффективен. Чтобы настроить корневую файловую систему для клиентов, читайте "Мини-HOWTO: Корневые файловые системы NFS клиентов на сервере " автора Ofer Maor <ofer@hadar.co.il>.

После того, как вы решите, куда поместить корневое дерево, создайте его (например) командой mkdir -p <каталог>, а затем запустите команду tar cClf / - | tar xpCf <каталог> -.

Если вы собираетесь загружать ваше ядро без LILO, тогда корневой каталог должен быть следующим: /tftpboot/<IP-address>. Если вас такой каталог не устраивает, вы можете изменить его в основном файле Makefile исходных текстов ядра; найдите там строку вида: NFS_ROOT = NFS_ROOT = -DNFS_ROOT="\"/tftpboot/%s\"" После изменения этой строки пересоберите ядро.

Изменения в корневой файловой системе

Удалите ненужные файлы и проверьте скрипты в каталоге /etc/rc.d. Некоторые важные замечания:

Самая важная вещь - настройка eth0. Рабочая станция должна иметь, по крайней мере, частично настроенный интерфейс eth0. Устанавливать IP-адрес рабочей станции равным IP-адресу сервера - не самое умное решение. (Так однажды случилось с автором в его ранних попытках)

Второй пункт, на который нужно обратить внимание - это файл /etc/fstab. Там нужно указать все необходимые настройки файловых систем nfs.

ВНИМАНИЕ: Не путайте корневые файловые системы сервера и рабочей станции. (Я исправил файл rc.inet1 сервера и долго удивлялся, почему рабочая станция все еще не работает)

Экспортирование файловой системы

Экспортируйте корневой каталог сервера рабочей станции. Смотрите exports(5). Скорее всего, после этого вам придется перезапустить nfsd/mountd. В дистрибутиве RedHat это можно просто проделать командами /etc/rc.d/init.d/nfs stop ; /etc/rc.d/init.d/nfs start .

Настройка RARP

Настройте RARP где-нибудь в сети. Если вы загружаете ядро без параметра nfsroot, то RARP-сервер должен быть NFS-сервером. Обычно так и бывает. Для этого в ядро должна быть встроена поддержка RARP.

Для включения RARP выполните команду (и впишите ее в соответствующий скрипт в каталоге /etc/rc.d:

/sbin/rarp -s <ip-адрес> <ethernet-адрес>

где

ip-адрес

- это IP-адрес рабочей станции

ethernet-адрес

- это Ethernet-адрес сетевой карты рабочей станции

Пример: /sbin/rarp -s 131.131.90.200 00:00:c0:47:10:12

Вместо цифровой формы IP-адреса можно использовать имя машины, если сервер сможет из этого имени определить IP-адрес (если настроены /etc/hosts или DNS)

Настройки BOOTP

Для настройки BOOTP вам надо должным образом отредактировать файл /etc/bootptab. Смотрите man bootpd(8) и booptab(5).

Выяснение Ethernet-адреса

Я не знаю Ethernet-адреса! Как его узнать?

Загрузитесь с диска с ядром, который вы сделали, и ищите строку с параметрами обнаруженной сетевой карты. Обычно она состоит из 6 шестнадцатеричных чисел - это и есть Ethernet-адрес карты.

Загрузите на рабочей станции любую операционную систему с TCP/IP. Затем выполните ping с сервера на рабочую станцию. Ищите в кэше ARP адрес станции командой: /sbin/arp -a

Загрузка рабочей станции

Использование загрузочного ПЗУ (boot ROM)

Я лично подобное чудовище не использовал. Могу лишь дать несколько советов (со слов Christian Leutloff <leutloff@sundancer.tng.oche.de>):

Невозможно использование "обычных" ПЗУ.

Есть пакет netboot автора Gero Kuhlmann, который содержит загрузочные ПЗУ для Linux и дополнительную информацию. netboot можно найти на ближайшем Linux ftp-сервере или в виде пакета в дистрибутиве Debian (netboot-0.4).

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

Возможно вам придется разрешить tftpd на сервере - это зависит от способа загрузки ядра вашим загрузочным ПЗУ.

Я приветствую любую информацию о производителях загрузочных ПЗУ, способных загружать Linux. Не у всех есть возможность прошивать ПЗУ самостоятельно.

Использование диска с ядром

Если вы экспортировали корневую файловую систему с правильным именем, и ваш NFS-сервер также является и RARP-сервером (что подразумевает общую подсеть у сервера и рабочей станции), то достаточно командой cat переписать его напрямую на диск. (Корневое устройство в ядре должно быть установлено в 0:255.) Это также предполагает, что корневой каталог рабочей станции находится на сервере в каталоге /tftpboot/IP-Address (это значение может быть изменено в процессе сборки ядра)

Использование загрузчика с RARP

Передайте ядру все необходимые в процессе загрузки параметры. Также добавьте туда строку nfsroot=<ip-адрес-сервера>:</путь/к/корневой/файловой/системе> где ip-адрес-сервера - это IP-адрес вашего NFS-сервера, а /путь/к/корневой/файловой/системе - это путь к корневой файловой системе рабочей станции на сервере.

Советы:

При использовании LILO используйте параметр "lock": просто наберите все правильные параметры вместе и добавьте слово "lock". Затем, в следующий раз, дайте LILO загрузиться автоматически.

При создании загрузочного диска для рабочей станции вы можете использовать опцию append= в файле lilo.conf.

Использование загрузчика без RARP

В дополнение к параметру nfsroot задайте параметр nfsaddrs=<wst-IP>:<srv-IP>:<gw-IP>:<netm-IP>:<hostname> при запуске ядра. Ядро настроит интерфейс eth0 со следующими параметрами:

wst-IP

IP-адрес рабочей станции

srv-IP

IP-адрес NFS-сервера

gw-IP

IP-адрес шлюза

netm-IP

Маска подсети

hostname

имя рабочей станции

Известные проблемы

/sbin/init не запускается

Наиболее распространенная проблема с /sbin/init состоит в следующем - во многих дистрибутивах /sbin/init собран динамически. Поэтому на клиенткой стороне необходимо правильно настроить каталог /lib. Наиболее простой способ - заменить /sbin/init (для клиентской машины) на обычным образом (с использованием статических ссылок) собранную программу "Hello World". Так, по крайней мере, вы сможете определить возникла ли проблема с динамическими ссылками, или существует что-то более серьезное.

Проблемы с устройствами в каталоге /dev

Если в процессе загрузки вы получаете странные сообщения об интерфейсах tty, запустите скрипт MAKEDEV с клиентской машины в каталоге /dev. Говорят, что иногда это не работает на некоторых ОС серверов, в которых используются 64-битные номера устройств. Если вы с этим столкнетесь, пишите мне, с какой ОС у вас проблемы. Потенциальное решение - создать небольшой электронный диск (ramdisk) в начале процесса загрузки и пересоздавать заново все файлы устройств каждый раз.