Diskless nodes/ru

Это HOWTO поможет Вам создать и настроить бездисковые рабочие станции с Gentoo Linux.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Даже хотя каталог и заполняется менеджером устройств   позже, Вам требуется создать файл. Если Вы этого не сделаете, Вы получите ошибку unable to open initial console.

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

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

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

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

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

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

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

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

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

Образец файла dhcpd.conf

С IP-адреса после  будет запрошен указанный. Этот IP-адрес должен быть IP-адресом tftp-сервера, обычно тем же самым, что и IP-адрес основной машины. является путем относительно каталога (вследствие того, что параметры, относящиеся к tftp-серверу будут рассмотрены позже). Внутри раздела, параметр   указывает MAC-адрес, а   назначает фиксированный IP адрес для этого отдельного MAC-адреса. Существует достаточно хорошая man-страница по с параметрами, которые не рассмотрены в этом HOWTO. Вы можете прочитать ее, введя:

Запуск DHCP-сервера
Перед тем как Вы запустите сценарий инициализации dhcp, отредактируйте файл, так, чтобы он выглядел следующим образом:

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

Чтобы добавить dhcp-сервер к сценариям иницализации, введите:

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

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

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

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

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

Настройка TFTP-сервера
Отредактируйте файл. Вам необходимо указать каталог tftproot в  и также, любые параметры командной строки в. Это должно выглядеть следующим образом:

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

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

Эта команда должна запустить tftp-сервер с параметрами, которые Вы указали в. Если Вы хотите чтобы этот сервер автоматически запускался во время загрузки:

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

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

Настройка PXELINUX
Before you start your tftp server you need to setup pxelinux. First copy the pxelinux binary into your directory:

This will create a default bootloader configuration file. The binary will look in the  directory for a file whose name is the client's IP address in hexadecimal. If it does not find that file it will remove the rightmost digit from the file name and try again until it runs out of digits. Versions 2.05 and later of syslinux first perform a search for a file named after the MAC address. If no file is found, it starts the previously mentioned discovery routine. If none is found, the file is used.

Files that PXE looks for in pxelinux.cfg/ in sequence

Let's start with the file:

Sample pxelinux.cfg/default

The  tag directs pxelinux to the kernel bzImage that we compiled earlier. The  tag appends kernel initialisation options. Since we compiled the slave kernel with , we will specify the nfsroot here. The first IP is the master's IP and the second IP is the directory that was created in to store the slave's initial filesystem.

About Etherboot
Etherboot boots network boot images from a TFTP server. As the PXE this is equivalent to LILO or GRUB. The  utility enables you to create different images using different options.

Before you get started
You will need to get the  (utility for making tagged kernel images useful for netbooting) package to create your Etherboot images. This tool will create a preconfigured kernel image from your original kernel. This contains the boot options as shown further down.

Setting up Etherboot
In this section we will create a simple etherboot image. As the dhcp server gives out the clients root-path in the "option root-path" dhcp.conf, we do not have to include this here. More details can be found in the mknbi manual.

Making the boot images. This will create a ELF bootable image capable of passing dhcp and the rootpath to the kernel. Also forcing the kernel to browse the network for a dhcp server.

Troubleshooting the network boot process
There are a few things you can do to debug the network boot process. Primarily you can use a tool called. To install  type:

Now you can listen to various network traffic and make sure your client/server interactions are functioning. If something isn't working there are a few things you might want to check. First make sure that the client/server is physically connected properly and that the networking cables are not damaged. If your client/server is not receiving requests on a particular port make sure that there is no firewall interference. To listen to interaction between two computers type:

You can also use  to listen on particular port such as the tftp port by typing:

A common error you might receive is: "PXE-E32: TFTP open time-out". This is probably due to firewall issues. If you are using , you might want to check  and  and make sure that they are configured properly. The client should be allowed to connect to the server.

About the NFS server
NFS stands for Network File System. The NFS server will be used to serve directories to the slave. This part can be somewhat personalized later, but right now all we want is a preliminary slave node to boot diskless.

About Portmapper
Various client/server services do not listen on a particular port, but instead rely on RPCs (Remote Procedure Calls). When the service is initialised it listens on a random port and then registers this port with the Portmapper utility. NFS relies on RPCs and thus requires Portmapper to be running before it is started.

Before you start
The NFS Server needs kernel level support so if you don't have this you should recompile your master's kernel. To double check your master's kernel configuration type:

You should see output that looks something like this if your kernel has been properly configured:

Installing the NFS server
The NFS package that can be acquired through portage by typing:

This package will emerge a portmapping utility, nfs server, and nfs client utilities and will automatically handle initialisation dependencies.

Configuring the NFS server
There are three major configuration files you will have to edit:

Nfs configuration files

The file specifies how, to who and what to export through NFS. The slave's fstab will be altered so that it can mount the NFS filesystems that the master is exporting.

A typical for the master should look something like this:

Sample master /etc/exports

The first field indicates the directory to be exported and the next field indicates to who and how. This field can be divided in two parts: who should be allowed to mount that particular directory, and what the mounting client can do to the filesystem:  for read only,   for read/write;   and   are important for diskless clients that are writing to the disk, so that they don't get "squashed" when making I/O requests. The slave's fstab file,, should look like this:

Sample slave fstab

In this example, master is just the hostname of the master but it could easily be the IP of the master. The first field indicates the directory to be mounted and the second field indicates where. The third field describes the filesystem and should be NFS for any NFS mounted directory. The fourth field indicates various options that will be used in the mounting process (see mount(1) for info on mount options). Some people have had difficulties with soft mount points so we made them all hard, but you should look into various options to make your cluster more efficient.

The last file you should edit is which describes a few options for nfs when it is initialised and looks like this:

Sample master /etc/conf.d/nfs

You should change  to the number of diskless nodes on the network.

Starting the NFS server
You should start the nfs server with its init script located in by typing:

If you want to this script to start when the system boots simply type:

Copy the missing files
We will now make the slave's file system in sync with the master's and provide the necessary binaries while still preserving slave specific files.

Configure diskless networking
In order to prevent the networking initscript from killing the connection to your NFS server, you will need to add an option to on your diskless client's filesystem.

Editing /etc/conf.d/net

Initialisation scripts
You need as many init scripts under as you need services on your diskless nodes. It all depends on what you want your slaves to do.

Typical slave runlevels

Now is a good time to boot your slave and cross your fingers. It works? Congratulations, you are now the proud owner of (a) diskless node(s) :)

Acknowledgements
We would like to thank the following authors and editors for their contributions to this guide:


 * Michael Andrews
 * Kristian Jerpetjoen
 * Sven Vermeulen
 * Xavier Neys