Бездисковые рабочие станции

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Diskless nodes and the translation is 100% complete.

Данная статья содержит инструкции по созданию и настройке бездисковых станций с Gentoo Linux.

Введение

Об этой статье

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

Что такое бездисковая машина?

Бездисковая машина - это компьютер без каких-либо обычных загрузочных устройств, таких как жесткие диски, дискеты, или оптические диски. Бездисковые станции загружаются по сети и им необходим сервер, который обеспечит их местом для хранения данных, как это сделал бы локальный жесткий диск. С этого момента, будем называть сервер ведущим устройством - master, в то время как бездисковая машина будет ведомым устройством - slave. У slave-ноды должна быть сетевая плата с поддержкой загрузки PXE или Etherboot; проверьте поддерживаемый список по адресу Etherboot.org. Большинство современных плат поддерживает PXE, множество встроенных в материнскую плату сетевые платы также будут работать.

Перед тем как начать

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

Конфигурация

Master и slave–ноды

Информация о ядрах

Ядро - это программа, которая располагается между аппаратным обеспечением и всеми остальными программами, которые загружены в системе. По существу, это сердце операционной системы, включающей в себя ядро. Когда компьютер загружается, BIOS выполняет инструкции, найденные в зарезервированном загрузочном пространстве жесткого диска. Эти инструкции обычно и есть загрузчик, который загружает ядро. После того, как ядро загружено, все процессы уже управляются ядром.

Чтобы найти больше информации по ядрам и их настройке, проверьте статью о ядре.

Ядро на master компьютере

Ядро master машины может быть как и настолько большим, так и настроенным под особые нужды, но в то же время, существует несколько требуемых параметров ядра, которые необходимо выбрать. Перейдете в меню конфигурации ядра, введя:

root #cd /usr/src/linux
root #make menuconfig

Должен быть графический интерфейс, серого и синего цвета, который предлагает безопасную альтернативу редактированию файла /usr/src/linux/.config вручную. Если ядро на данный момент функционирует нормально, можно сохранить текущий файл конфигурации, выйдя из графического интерфейса и введя следующую команду:

root #cp .config .config_working

Перейдите в следующие подменю и убедитесь, что перечисленные элементы меню отмечены как встроенные в ядро - built-in (а не как модули - modular). Параметры, показанные ниже, взяты из ядра версии 2.6.10. Если используется другая версия, текст, или последовательность элементов меню может различаться. Просто убедитесь, что выбраны хотя бы те элементы, которые показаны ниже.

ЯДРО Параметры ядра для master-узла
[*] Networking support --->
  Networking options --->
    <*> Packet socket
    <*> Unix domain sockets
    [*] TCP/IP networking
    [*]   IP: multicasting
    [ ] Network packet filtering (replaces ipchains)
  
File systems --->
  Network File Systems  --->
    <*> NFS server support
    [*]   Provide NFSv3 server support

Если необходим доступ к интернету на master-узле и/или нужен безопасный межсетевой экран, убедитесь, что добавили поддержку iptables:

ЯДРО Включение поддержки iptables
[*] Network packet filtering (replaces ipchains)
  IP: Netfilter Configuration  --->
    <*> Connection tracking (required for masq/NAT)
    <*> IP tables support (required for filtering/masq/NAT)

Если необходимо использовать пакетную фильтрацию, можно включить оставшиеся параметры в качестве модулей позже. Чтобы узнать о том, как настроить их должным образом, прочтите главу Gentoo Security Handbook о сетевых экранах.

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

После того, как ядро переконфигурировано на master-узле, его нужно собрать заново:

root #make && make modules_install
root #cp arch/i386/boot/bzImage /boot/bzImage-master

Затем, добавьте запись для нового ядра в lilo.conf или grub.conf, в зависимости от используемого загрузчика, и сделайте новое ядро загружаемым по умолчанию. Теперь когда новый файл bzImage скопирован в загрузочный каталог, все, что требуется сделать - перезагрузить систему, чтобы активировать новые параметры.

О ядре для slave-нод

Рекомендуется, чтобы slave-ядро было собрано без модулей, так как их загрузка и настройка, в случае удаленной загрузки ядра, сложный и ненужный процесс. Вдобавок, slave-ядро должно быть настолько маленьким и компактным, насколько это возможно, чтобы эффективно загрузиться по сети. slave-ядро будет скомпилировано в том же месте, где было сконфигурировано master.

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

root #cp /usr/src/linux/.config /usr/src/linux/.config_master

Ядро slave сейчас будет сконфигурировано таким же образом, как и ядро master. Если необходим свежий файл конфигурации, его можно восстановить из файла по умолчанию /usr/src/linux/.config, введя:

root #cd /usr/src/linux
root #cp .config_master .config

Теперь, перейдите в графический интерфейс конфигурации вводом следующей команды:

root #cd /usr/src/linux
root #make menuconfig

Убедитесь, что выбрали следующие параметры как встроенные, а не как модули ядра:

ЯДРО Параметры ядра для slave
[*] Networking support --->
  Networking options --->
    <*> Packet socket
    <*> Unix domain sockets
    [*] TCP/IP networking
    [*]   IP: multicasting
    [*]   IP: kernel level autoconfiguration
    [*]     IP: DHCP support
  
File systems --->
  Network File Systems  --->
    <*> file system support
    [*]   Provide NFSv3 client support
    [*]   Root file system on NFS
Заметка
Альтернативно, вместо dhcp-сервера можно настроить BOOTP-сервер.
Важно
Важно добавить поддержку сетевой платы в ядро (не как модуль) на нодах. Тем не менее, использование модулей, в основном, не будет проблемой для бездисковых нод.

Теперь необходимо собрать slave-ядро. Будьте осторожны, постарайтесь не перезаписать или не повредить какие-либо модули ядра, которые были собраны для master:

root #cd /usr/src/linux
root #make

Теперь, создайте каталог на master, который будет использован для хранения файлов slave-нод и требуемых системных файлов. Здесь используется /diskless, но любое другое место можно выбрать здесь. Теперь, скопируйте slave bzImage в каталог /diskless:


Заметка
Если используются разные архитектуры, можно сохранить каждый файл конфигурации в соответствующий файл .config_arch. Проделайте то же самое с образами ядра: сохраните их в каталог /diskless как разные файлы, названные в соответствии с архитектурой ядра - bzImage_arch.


root #mkdir /diskless
root #cp /usr/src/linux/arch/i386/boot/bzImage /diskless

Предварительные файловые системы для slave

Файловые системы для систем master и slave могут быть отрегулированы и изменены в значительной степени. На данный момент единственное, что имеет значение, это как получить предварительную файловую систему с подходящими файлами конфигурации и точками монтирования. Во-первых, необходимо создать каталог внутри /diskless для первой slave-системы. Каждой slave-ноде требуется собственная root файловая система, потому что общий доступ к определенным системным файлам вызовет проблемы с разрешениями и сбои. Можно назвать эти каталоги так, как администратор сочтет нужным, но статья предполагает использование IP-адресов slave-машин, так как они уникальны и не могут быть перепутаны. Например, пусть статический IP нашей первой slave-системы будет 192.168.1.21:

root #mkdir -p /diskless/192.168.1.21/etc

Различные файлы конфигурации в каталоге /etc нуждаются в изменении для того, чтобы они работали на slave-узле. Скопируйте каталог /etc c master-узла в новый root-каталог slave, введя:

root #cp -r /etc/* /diskless/192.168.1.21/etc/

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

root #mkdir /diskless/192.168.1.21/home
root #mkdir /diskless/192.168.1.21/dev
root #mkdir /diskless/192.168.1.21/proc
root #mkdir /diskless/192.168.1.21/tmp
root #mkdir /diskless/192.168.1.21/mnt
root #chmod a+w /diskless/192.168.1.21/tmp
root #mkdir /diskless/192.168.1.21/mnt/.initd
root #mkdir /diskless/192.168.1.21/root
root #mkdir /diskless/192.168.1.21/sys
root #mkdir /diskless/192.168.1.21/var
root #mkdir /diskless/192.168.1.21/var/empty
root #mkdir /diskless/192.168.1.21/var/lock
root #mkdir /diskless/192.168.1.21/var/log
root #mkdir /diskless/192.168.1.21/var/run
root #mkdir /diskless/192.168.1.21/var/spool
root #mkdir /diskless/192.168.1.21/usr
root #mkdir /diskless/192.168.1.21/opt

Большинство из этих stubs должно быть знакомы; такие stubs как /dev, /proc или /sys будут заполнены при запуске slave-узла, остальные будут примонтированы позже. Также нужно изменить файл /diskless/192.168.1.21/etc/conf.d/hostname, чтобы отобразить имя хоста slave. Двоичные файлы, библиотеки и другие файлы будут заполнены позже в этом руководстве, прямо перед попыткой загрузить slave.

Несмотря на то, что каталог /dev наполняется udev, позже, необходимо создать запись console. Если этого не сделать, то можно получить сообщение об ошибке "unable to open initial console".

root #mknod /diskless/192.168.1.21/dev/console c 5 1

DHCP–сервер

О DHCP–сервере

DHCP означает Dynamic Host Configuration Protocol (протокол динамической настройки узла). DHCP-сервер - это первый компьютер с которым будут соединяться slave-узлы при PXE-загрузке. Основной целью DHCP-сервера является назначение IP-адресов. DHCP-сервер может назначать IP-адреса, основываясь на MAC-адресах сети на основе ethernet. Как только slave-узел получит IP-адрес, DHCP-сервер сообщит этому компьютеру где можно получить его первичную файловую систему и ядро.

Перед началом

Перед началом, стоит проверить, что некоторые вещи работают хорошо. Во-первых, проверьте соединение с сетью:

root #ifconfig eth0 multicast
root #ifconfig -a

Также необходимо убедиться, что устройство eth0 запущено. Это должно выглядеть следующим образом:

КОД Устройство eth0, работающее должным образом
eth0      Link encap:Ethernet  HWaddr 00:E0:83:16:2F:D6
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26460491 errors:0 dropped:0 overruns:2 frame:0
          TX packets:32903198 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:100
          RX bytes:2483502568 (2368.4 Mb)  TX bytes:1411984950 (1346.5 Mb)
          Interrupt:18 Base address:0x1800

Важно, чтобы оно выводило MULTICAST. Если это не так, пересоберите ядро заново, чтобы включить поддержку multicast.

Установка DHCP–сервера

Если в сети еще нет установленного DHCP-сервера, придется установить его:

root #emerge --ask dhcp

Если DHCP-сервер уже присутствует в сети, отредактируйте файл конфигурации для корректной загрузки компьютера по сети с помощью PXE.

Конфигурация DHCP-сервера

Только один конфигурационный файл нужно отредактировать перед запуском DHCP-сервера: /etc/dhcp/dhcpd.conf. Скопируйте и отредактируйте предусмотренный файл-образец:

root #cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
root #nano -w /etc/dhcp/dhcpd.conf

Основная схема этого файла задана в виде отступов и выглядит следующим образом:

КОД Образец схемы файла dhcpd.conf
# глобальные параметры
ddns-update-style none;
shared-network LOCAL-NET {
  # параметры shared network
  subnet 192.168.1.0 netmask 255.255.255.0 {
    # параметры subnet network
    host slave{
        # параметры, относящиеся к хосту
    }
    group {
        # параметры, относящиеся к группе
    }
  }
}

Раздел shared-network - необязательный и должен использоваться для назначаемых IP-адресов, которые принадлежат к одной и той же топологии сети. По крайней мере, должен быть объявлен один раздел subnet, а необязательный раздел group позволяет группировать параметры между элементами. Хороший пример файла dhcpd.conf выглядит так:

КОД Образец файла dhcpd.conf
#
# Образец файла dhcpd.conf для бездисковых клиентов
#
  
# Отключение динамической DNS
ddns-update-style none;
  
# Предположим, достаточно одного шлюза по умолчанию
option routers 192.168.1.1;
  
# Предоставление DNS-информации клиентам
option domain-name-servers 192.168.1.1;
option domain-name "mydomain.com";
  
# Указание используемого TFTP-сервера
next-server 192.168.1.1;
  
# Объявление вендор-зависимого буфера параметров для клиентов PXE:
# Code 1: Групповой (multicast) IP-адрес загрузочного файлового сервера
# Code 2: UDP-порт, отслеживаемый клиентом для MTFTP-ответов
# Code 3: UDP-порт, используемый MTFTP-серверами для прослушивания MTFTP-запросов
# Code 4: Количество секунд, в течение которого клиент должен ожидать каких-либо действий,
#         перед тем, как начать новую MTFTP-передачу
# Code 5: Количество секунд, в течение которого клиент должен ожидать, перед перезапуском
#         MTFTP-передачи
  
option space PXE;
option PXE.mtftp-ip               code 1 = ip-address;
option PXE.mtftp-cport            code 2 = unsigned integer 16;
option PXE.mtftp-sport            code 3 = unsigned integer 16;
option PXE.mtftp-tmout            code 4 = unsigned integer 8;
option PXE.mtftp-delay            code 5 = unsigned integer 8;
option PXE.discovery-control      code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr   code 7 = ip-address;
  
# Определите подсеть для размещения бездисковых рабочих станций
subnet 192.168.1.0 netmask 255.255.255.0 {
  
  # Предоставление PXE-клиентам необходимой информации
  class "pxeclient" {
    match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
    vendor-option-space PXE;
  
    # Должен быть настроен по меньшей мере один из вендор-зависимых PXE-параметров
    # для того, чтобы загрузочные ПЗУ клиента - boot ROMs - располагали информацией, о том, что этот сервер PXE-совместим.
    # Мы устанавливаем MCAST IP-адрес в значение 0.0.0.0 чтобы сообщить boot ROM
    # что мы не можем предоставить групповой TFTP.
  
    option PXE.mtftp-ip 0.0.0.0;
  
    # Это имя файла, который должны загрузить загрузочные ПЗУ - boot ROMs.
    filename "pxelinux.0";
  }
  
  # Предоставьте необходимую информацию Etherboot-клиентам
  class "etherboot" {
    match if substring(option vendor-class-identifier, 0, 9) = "Etherboot";
    filename "vmlinuz_arch";
  }
  
  # Добавьте одно объявление хоста для каждой бездисковой рабочей станции
  host slave21 {
    hardware ethernet 00:02:A5:04:3B:66;
    fixed-address 192.168.1.21;
  }
}
Заметка
Ничто не запрещает использовать PXE boot и Etherboot вместе. Листинг кода, приведенный выше, просто является примером; если возникли проблемы, пожалуйста, проконсультируйтесь с документацией DHCPd.

С IP-адреса после next-server будет запрошен указанный filename. Этот IP-адрес должен быть IP-адресом tftp-сервера, обычно тем же самым, что и IP-адрес master-узла. filename является путем относительно каталога /diskless (вследствие того, что параметры, относящиеся к tftp-серверу будут рассмотрены позже). Внутри раздела host, параметр hardware ethernet указывает MAC-адрес, а fixed-address назначает фиксированный IP-адрес для этого отдельного MAC-адреса. Существует достаточно хорошая man-страница по dhcpd.conf с параметрами, которые не рассмотрены в этом HOWTO. Можно прочитать ее, введя:

user $man dhcpd.conf

Запуск DHCP–сервера

Перед тем как запустить скрипт инициализации dhcp, отредактируйте файл /etc/conf.d/dhcp, так, чтобы он выглядел следующим образом:

КОД Пример /etc/conf.d/dhcp
IFACE="eth0"
# Добавьте любые индивидуальные настройки по необходимости

Переменная IFACE - это устройство, на котором необходимо запустить DHCP-сервер, в этом случае eth0. Добавление большего количества аргументов к переменной IFACE может быть полезно в случае сложной топологии сети с большим количеством Ethernet-адаптеров. Чтобы запустить dhcp-сервер, введите:

root #rc-service dhcpd start

Чтобы добавить dhcp-сервер к запускаемым скриптам, введите:

root #rc-update add dhcpd default

Устранение неполадок, связанных с DHCP-сервером

Чтобы проверить загружается ли нода, посмотрите сообщения в /var/log/messages. Если нода загружается успешно, файл messages должен содержать внизу несколько строчек, выглядящих следующим образом:

КОД Образец записей лог-файла, созданных dhcp
DHCPDISCOVER from 00:00:00:00:00:00 via eth0
DHCPOFFER on 192.168.1.21 to 00:00:00:00:00:00 via eth0
DHCPREQUEST for 192.168.1.21 from 00:00:00:00:00:00 via eth0
DHCPACK on 192.168.1.21 to 00:00:00:00:00:00 via eth0
Заметка
Этот лог-файл может также помочь в обнаружении MAC-адресов slave-узлов.

Если встречается следующее сообщение, это возможно означает, что с файлом конфигурации что-то не то, но в то же время DHCP-сервер передает данные верно.

КОД Образец ошибки сервера dhpc
no free leases on subnet LOCAL-NET

Каждый раз, после изменения файла конфигурации, нужно перезапускать DHCP-сервер. Чтобы перезапустить сервер, введите:

root #rc-service dhcpd restart

TFTP–сервер и PXE загрузчик Linux и/или Etherboot

О TFTP–сервере

TFTP означает простой протокол передачи файлов (англ. Trivial File Transfer Protocol). TFTP-сервер предоставит slave-нодам ядра и первичную файловую систему для начальной загрузки. Все ядра и файловые системы ведомых машин будут храниться на TFTP-сервере, поэтому, хорошей идеей будет сделать master-узел TFTP-сервером.

Установка TFTP–сервера

Высоко рекомендуемый tftp-сервер доступен в качестве пакета tftp-hpa. Этот tftp-сервер написан автором SYSLINUX и очень хорошо работает с pxelinux. Чтобы его установить, просто введите:

root #emerge --ask tftp-hpa

Конфигурация TFTP-сервера

Отредактируйте файл /etc/conf.d/in.tftpd. Необходимо указать каталог tftproot в INTFTPD_PATH и также, любые параметры командной строки в INTFTPD_OPTS. Это должно выглядеть следующим образом:

ФАЙЛ Образец файла /etc/conf.d/in.tftpd
INTFTPD_PATH="/diskless"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"

Параметр -l обозначает то, что сервер слушает в автономном режиме (stand alone mode), поэтому нет необходимости запускать inetd. -v означает, что уровень вывода сообщений log/error должен быть подробный. -s /diskless указывает на корневой каталог tftp-сервера.

Запуск TFTP–сервера

Чтобы запустить tftp-сервер, введите:

root #rc-service in.tftpd start

Эта команда должна запустить tftp-сервер с параметрами, которые указаны в /etc/conf.d/in.tftpd. Если нужно, чтобы этот сервер автоматически запускался во время загрузки, наберите:

root #rc-update add in.tftpd default

О PXELINUX

Этот раздел не требуется если используется только Etherboot. PXELINUX — это сетевой загрузчик, эквивалентный LILO или GRUB, который обслуживается через TFTP. По существу, это небольшой набор инструкций, который сообщает клиенту где разместить его ядро и временную файловую систему и разрешает различные параметры ядра.

Перед началом

Теперь необходим файл pxelinux.0, который поставляется с пакетом SYSLINUX от H. Peter Anvin. Этот пакет можно установить введя:

root #emerge --ask syslinux

Настройка PXELINUX

Заметка
Это не требуется для Etherboot

Перед запуском tftp-сервер необходимо настроить pxelinux. Сначала, скопируйте двоичный файл pxelinux в каталог /diskless:

root #cp /usr/share/syslinux/pxelinux.0 /diskless
root #mkdir /diskless/pxelinux.cfg
root #touch /diskless/pxelinux.cfg/default

Это создаст файл конфигурации загрузчика по умолчанию. Двоичный файл pxelinux.0 просматривает каталог pxelinux.cfg в поисках файла с таким же именем, как и IP-адрес клиента в шестнадцатеричной системе. Если он не находит этот файл, он убирает самую правую цифру из имени файла и продолжает поиск, пока цифры не закончатся. Версии syslinux 2.05 и более поздние сперва выполнят поиск файла с таким же именем, как и MAC-адрес. Если таких файлов не найдено, начинается поиск по алгоритму, описанному выше. Если ничего не найдено, используется файл default .

КОД Файлы, которые ищет PXE в каталоге pxelinux.cfg/, по порядку
## (01 в начале означает Ethernet, следующие байты соответствуют MAC-адресу slave-узла)
01-00-40-63-c2-ca-c9
  
## (Assigned IP in hexadecimal)
C0A80115
C0A8011
C0A801
C0A80
C0A8
C0A
C0
C
  
default
Заметка
Все буквы являются строчными.

Давайте начнем с файла default:

КОД Образец файла pxelinux.cfg/default
DEFAULT gentoo
LABEL gentoo
LINUX /bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.21

Тэг DEFAULT указывает pxelinux на ядро bzImage, которое было собрано ранее. Тэг APPEND добавляет параметры инициализации ядра. Так как slave-ядро собрано с параметром NFS_ROOT_SUPPORT, также указываем nfsroot здесь. Первый IP - IP-адрес master компьютера, а второй IP - это каталог, который был создан в каталоге /diskless для хранения первичной файловой системы для slave. Также могут быть указаны другие опции NFS. Например, чтобы использовать NFS v4.1 через TCP, добавьте ,tcp,vers=4.1 к опции ядра nfsroot: nfsroot=192.168.1.1:/diskless/192.168.1.21,tcp,vers=4.1.

О Etherboot

Заметка
Это не требуется, если используется PXE boot.

Etherboot загружает загрузочные образы (boot images) с сервера TFTP. Как и PXE, он эквивалентен LILO или GRUB. Утилита mknbi позволяет создавать разные образы с использованием различных параметров.

Перед началом

Потребуется установить пакет mknbi (утилиту для того, чтобы сделать отмеченные образы ядра пригодными для сетевой загрузки), чтобы создать образы Etherboot. Этот инструмент создаст заранее настроенный образ ядра из первоначального ядра. Он содержит параметры загрузки, как показано в дальнейшем.

root #emerge --ask mknbi

Настройка Etherboot

В этом разделе будет создан простой образ etherboot. Так как dhcp-сервер объявляет путь к корневому каталогу на клиентах в строке "option root-path" файла dhcp.conf, не требуется включать его здесь. Больше подробностей можно найти в руководстве mknbi.

user $man mknbi

Создание загрузочных образов. Это создаст загружаемый образ системы в формате ELF, способный передать ядру dhcp и путь к корневому каталогу. Это также заставит ядро просмотреть сеть в поисках dhcp-сервера.

root #mkelf-linux -ip=dhcp /diskless/bzImage > /diskless/vmlinuz
Заметка
Для архитектурно-зависимых образов необходимо ввести bzImage_arch и vmlinuz_arch.

Устранение неполадок в процессе сетевой загрузки

Существует несколько вещей, которые можно использовать для отладки процесса загрузки по сети. Прежде всего, можно воспользоваться инструментом tcpdump. Чтобы установить tcpdump, введите:

root #emerge --ask tcpdump

Теперь можно прослушивать различный сетевой трафик, чтобы убедиться в том, что происходит взаимодействие между клиентом и сервером. Если что-либо не работает, есть несколько вещей, которые нужно проверить. Во-первых, убедитесь, что клиент и сервер подсоединены физически должным образом и что сетевые кабели не повреждены. Если клиент/сервер не получают запросы на отдельный порт убедитесь, что межсетевой экран не является помехой. Чтобы просмотреть взаимодействие между двумя компьютерами, введите:

root #tcpdump host client_ip and server_ip

Также можно настроить tcpdump так, чтобы прослушать отдельный порт, такой как, например, tftp-порт, введя:

root #tcpdump port 69

Распространенная ошибка, которую можно получить: "PXE-E32: TFTP open time-out". Возможно, это связано с проблемами с межсетевым экраном. Если используется TCPwrappers, возможно, стоит проверить /etc/hosts.allow и /etc/hosts.deny и убедиться, что они сконфигурированы должным образом. Клиенту должно быть разрешено подключение к серверу.

NFS–сервер

О NFS–сервере

NFS означает Network File System - протокол сетевого доступа к файловым системам. NFS-сервер будет использоваться для предоставления директорий slave-узлу. Эта часть может быть, в каком-то смысле, настроена позже, но прямо сейчас все что нужно - это предварительная slave-нода для бездисковой загрузки.

О Portmapper

Различные клиент-серверные службы не слушают отдельный порт, но, вместо этого, полагаются на RPCs (Remote Procedure Calls - удаленный вызов процедур). Когда сервис инициализируется, он прослушивает случайный порт, и затем регистрирует этот порт с помощью утилиты Portmapper. NFS полагается на RPCs и, таким образом, требует того, чтобы Portmapper был запущен перед ее запуском.

Перед началом

NFS-сервер требует поддержку со стороны ядра, поэтому, если в ядре ее нет, то необходимо собрать ядро master-узла заново. Чтобы дважды проверить конфигурацию ядра master, введите:

root #grep NFS /usr/src/linux/.config_master

Если ядро правильно сконфигурировано, результат будет выглядеть примерно следующим образом:

ЯДРО Правильные параметры, относящиеся к NFS, в конфигурации ядра master системы
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETFILTER is not set
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_NFS_V4 is not set
# CONFIG_NFS_DIRECTIO is not set
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
# CONFIG_NFSD_V4 is not set
# CONFIG_NFSD_TCP is not set

Установка NFS–сервера

Пакет NFS может быть установлен с помощью системы Portage, посредством ввода:

root #emerge --ask nfs-utils

Этот пакет установит утилиту для проброса портов (portmapping utility), nfs-сервер, и утилиты nfs-клиентов, а также автоматически обработает зависимости инициализации.

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

Здесь три основных файла конфигурации, которые необходимо отредактировать:

КОД Файлы конфигурации Nfs
/etc/exports
/diskless/192.168.1.21/etc/fstab
/etc/conf.d/nfs

Файл /etc/exports указывает как, кому и что можно экспортировать через NFS. Файл fstab slave-узла будет изменен таким образом, чтобы было можно примонтировать файловые системы NFS, экспортируемые master-узлом.

Обычный файл /etc/exports для master-узла должен выглядеть следующим образом:

КОД Образец файла /etc/exports на master-узле
# одна строка, подобная этой, должна присутствовать на каждом из slave-узлов
/diskless/192.168.1.21   192.168.1.21(sync,rw,no_root_squash,no_all_squash)
# общие параметры для всех slave-узлов
/opt   192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/usr   192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/home  192.168.1.0/24(sync,rw,no_root_squash,no_all_squash)
# если Вам потребуется общий log-файл
/var/log   192.168.1.21(sync,rw,no_root_squash,no_all_squash)

Первое поле обозначает каталог для экспорта, а следующее за ним поле указывает, кому и как надо передать содержащуюся в нем информацию. Это поле может быть поделено на две части: кому разрешено монтировать этот отдельный каталог, и что монтирующий этот каталог клиент может делать с файловой системой: ro - доступ только для записи, rw - для чтения/записи; параметры no_root_squash и no_all_squash являются важными для бездисковых клиентов, которые осуществляют запись на диск, так чтобы они не были "сброшены" механизмом ограничения прав доступа root squash при I/O запросах. Файл fstab на ведомом узле, /diskless/192.168.1.21/etc/fstab , должен выглядеть так:

КОД Образец файла fstab на slave-узле
# эти записи необходимы
master:/diskless/192.168.1.21   /         nfs     sync,hard,intr,rw,nolock,rsize=8192,wsize=8192    0 0
master:/opt                     /opt      nfs     sync,hard,intr,ro,nolock,rsize=8192,wsize=8192    0 0
master:/usr                     /usr      nfs     sync,hard,intr,ro,nolock,rsize=8192,wsize=8192    0 0
master:/home                    /home     nfs     sync,hard,intr,rw,nolock,rsize=8192,wsize=8192    0 0
none                            /proc     proc    defaults                                     0 0
# полезно, но является избыточным
master:/var/log                 /var/log  nfs     hard,intr,rw                                 0 0

В этом примере, master - это просто имя хоста ведущего узла, но оно также запросто может быть его IP-адресом. Первое поле обозначает каталог, который необходимо примонтировать, а второе поле указывает на место, куда он должен быть примонтирован. Третье поле описывает файловую систему и должно содержать NFS для любого монтируемого каталога с NFS. Четвертое поле обозначает различные параметры, которые будут использованы в процессе монтирования (смотрите mount(1), для информации по параметрам монтирования). Некоторые люди сталкивались с проблемой режимом монтирования soft mount, поэтому здесь сделан режим hard mount; поиграйтесь с различными опциями в /etc/fstab, чтобы сделать кластер более эффективным.

Последний файл, который необходимо отредактировать — это файл /etc/conf.d/nfs, который описывает несколько параметров для nfs при инициализации. Он выглядит так:

КОД Образец файла /etc/conf.d/nfs на master-узле
# Файл конфигурации для /etc/init.d/nfs
  
# Количество серверов для запуска по умолчанию
RPCNFSDCOUNT=8
  
# Параметры для передачи в rpc.mountd
RPCMOUNTDOPTS=""

Cледует изменить переменную RPCNFSDCOUNT на количество бездисковых нод в сети.

Запуск NFS–сервера

nfs-сервер, следует запустить с помощью его init-скрипта, который расположен в каталоге /etc/init.d, введя команду:

root #rc-service nfs start

Если нужно, чтобы этот скрипт запускался при загрузке системы, просто введите:

root #rc-update add nfs default

Завершение построения файловой системы на slave-узлах

Копирование недостающих файлов

Теперь синхронизируем файловую систему на slave-узлах с файловой системой master-узла и предоставим необходимые двоичные файлы. При этом, сохраним файлы, характерные для slave-узлов.

root #rsync -avz /bin /diskless/192.168.1.21
root #rsync -avz /sbin /diskless/192.168.1.21
root #rsync -avz /lib /diskless/192.168.1.21
Заметка
Причиной, по которой используется команда rsync -avz вместо cp, является сохранение символьных ссылок и разрешений.

Настройки сети на бездисковых машинах

Для того чтобы скрипты, инициализирующие сеть, не завершали соединения с NFS-сервером, необходимо добавить следующий параметр в файл /etc/conf.d/net на файловой системе бездисковых клиентов.

КОД Редактирование /etc/conf.d/net
config_eth0="noop"
Заметка
Чтобы получить больше информации, пожалуйста, прочитайте /usr/share/doc/openrc-*/net.example.bz2 .

Скрипты инициализации

Init-скрипты сервисов, необходимые для бездисковых нод, находятся в каталоге /diskless/192.168.1.21/etc/runlevels. Каждая slave может быть установлена и настроена здесь, в зависимости от того, что требуется от slave-ноды.

Предупреждение
Не используйте программу rc-update чтобы добавлять или удалять скрипты из уровней выполнения slave-узлов, когда зашли на master-узел. Это изменит уровни выполнения на master-узле. Ссылки нужно создать вручную либо войдя на slave-ноду, используя ssh, либо подсоединив экран и клавиатуру к slave.
КОД Обычные уровни выполнения ведомых рабочих станций
/diskless/192.168.1.21/etc/runlevels/:
total 16
drwxr-xr-x    2 root     root         4096 2003-11-09 15:27 boot
drwxr-xr-x    2 root     root         4096 2003-10-01 21:10 default
drwxr-xr-x    2 root     root         4096 2003-03-13 19:05 nonetwork
drwxr-xr-x    2 root     root         4096 2003-02-23 12:26 single
  
/diskless/192.168.1.21/etc/runlevels/boot:
total 0
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 bootmisc -> /etc/init.d/bootmisc
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 checkfs -> /etc/init.d/checkfs
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx    1 root     root           22 2003-10-18 17:28 domainname -> /etc/init.d/domainname
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 hostname -> /etc/init.d/hostname
lrwxrwxrwx    1 root     root           22 2003-10-18 17:28 localmount -> /etc/init.d/localmount
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 modules -> /etc/init.d/modules
lrwxrwxrwx    1 root     root           18 2003-10-18 17:28 net.lo -> /etc/init.d/net.lo
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 netmount -> /etc/init.d/netmount
lrwxrwxrwx    1 root     root           21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 urandom -> /etc/init.d/urandom
  
/diskless/192.168.1.21/etc/runlevels/default:
total 0
lrwxrwxrwx    1 root     root           23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 distccd -> /etc/init.d/distccd
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 local -> /etc/init.d/local
lrwxrwxrwx    1 root     root           16 2003-10-18 17:28 sshd -> /etc/init.d/sshd
lrwxrwxrwx    1 root     root           21 2003-10-18 17:28 syslog-ng -> /etc/init.d/syslog-ng
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 vixie-cron -> /etc/init.d/vixie-cron
  
/diskless/192.168.1.21/etc/runlevels/nonetwork:
total 0
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 local -> /etc/init.d/local
  
/diskless/192.168.1.21/etc/runlevels/single:
total 0

Теперь, самое время перезагрузить slave и скрестить пальцы. Работает? Поздравляем, теперь вы гордый обладатель бездисковой рабочей станции(й).


This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Michael Andrews, Kristian Jerpetjoen, Xavier Neys
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.