Журнал LinuxFormat - перейти на главную

LXF100-101:Запуск по сети

Материал из Linuxformat
Перейти к: навигация, поиск
Диски долой! Научите ПК с Linux загружаться через локальную сеть

Содержание

Сеть: Загрузка без винчестера

Хотите превратить свой ПК в домашний кинотеатр или завести кластер из однотипных компьютеров? Ответ – сетевая загрузка. Нейл Ботвик все объяснит.


Помните времена, когда компьютерам не были нужны жесткие диски? Amiga и Atari ST загружали все необходимое с дискеты. А еще раньше у 8-битных компьютеров типа Commodore 64 и Spectrum даже и дискет-то не было, все необходимое загружалось из ПЗУ. Сегодня сложно купить компьютер без жесткого диска в несколько сотен гигабайт, но зато загрузить компьютер можно вообще без винчестера. Так называемая «загрузка по сети» позволяет такому компьютеру получить все необходимое с другого компьютера через сеть.

Это рождает два правомерных вопроса: зачем и как. Зачем бы нам это делать? Причин несколько: может быть, вам нужен тихий и прохладный компьютер, а жесткие диски нагреваются и изрядно шумят. Например, в моей гостиной стоит компьютер для работы MythTV, с материнской платой Via EPIA без кулеров и без жесткого диска, абсолютно бесшумный. Объединив все жесткие диски в один большой диск или массив дисков, вместо использования отдельных дисков на каждом компьютере, можно более эффективно обслуживать кластеры. То же справедливо и для компьютерной сети в интернет-кафе или в школьном кабинете информатики. Это не то же самое, что использовать тонкого клиента, когда всю работу выполняет сервер. Компьютер, загружаемый через сеть – это обычный компьютер или рабочая станция; вся разница – что его жесткий диск подключен длинным сетевым кабелем вместо короткого шлейфа.

На второй вопрос (как это сделать?) мы ответим дальше. Как и на первый вопрос, на второй есть несколько ответов, но мы ограничимся только одним. PXE (Preboot eXecution Environment или pixie – среда выполнения перед загрузкой) – самый простой способ обеспечить запуск через сеть, если клиентский компьютер (без жесткого диска) его поддерживает. На большинстве современных материнских плат есть по меньшей мере одна сетевая карта с поддержкой PXE, так что это самый простой вариант; прочие устройства могут потребовать другого подхода, например, установки ПЗУ etherboot (http://www.etherboot.org) на сетевой карте или инициализации процесса с дискеты или CD. Но мы их здесь не рассматриваем.

Как это работает?

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

  1. BIOS компьютера ищет код загрузчика ОС (bootloader) в первом секторе жесткого диска и загружает его.
  2. Загрузчик ОС, используя информацию из файла настройки и пользовательского меню, загружает ядро, передавая ему информацию о местонахождении корневого раздела и другие данные.
  3. Ядро монтирует корневой раздел и запускает процесс /sbin/init, который загружает все остальное.

Загрузка с использованием PXE очень похожа на обычную загрузку:

  1. Код PXE в сетевой карте или в BIOS компьютера рассылает по сети расширенный DHCP-запрос.
  2. Должным образом сконфигурированный сервер возвращает информацию о настройках DHCP, а также адрес сервера загрузки, код сетевого загрузчика и загрузочное меню, подобное обычному меню загрузки Grub или Lilo.
  3. Когда пользователь выбирает пункт меню (или истекает время ожидания), загрузчик PXE загружает ядро с указанного сервера загрузки, определяя расположение корневого раздела и другие параметры.
  4. Ядро монтирует корневой раздел с помощью NFS и запускает процесс /sbin/init, который загружает все остальное.

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

Предупреждение о перегрузке аббревиатурами: здесь вы встретите множество ТБС и РТБС. Мы уже использовали PXE, BIOS, DHCP и NFS, а будут и новые. Запомните их, так как чуть позже вас ждут тесты.

Установка системы

Во-первых, нам потребуется установленная система на сервере, с которого мы будем загружаться. Использовать ту систему, которая на нем уже стоит, нельзя: даже если аппаратная часть компьютеров полностью идентична, некоторые детали (особенно настройки системы в /etc) могут различаться. Для каждого клиента нужно установить ОС в отдельный каталог; обычно это /diskless/IPaddress, что позволяет вам хранить все установленные ОС клиентов в одном месте и без конфликтов, потому что два компьютера не могут иметь одинаковые IP-адреса.

Простейший способ выполнить начальную установку системы – это подключить к будущему бездисковому компьютеру винчестер и привод CD/DVD и установить систему обычным образом. Если вы будетe настраивать загрузку по сети в существующей системе, то этот этап уже пройден. Потом содержимое диска можно скопировать в соответствующий каталог на сервере – либо физически подключив диск, либо скопировав файлы через сеть. Поскольку вам когда-нибудь придется открывать сетевой доступ к каталогу сервера, сделаем это сейчас и скопируем файлы. В этом примере адрес сервера 192.168.2.10, а адрес клиента 192.168.2.50. Все команды необходимо выполнять с привилегиями администратора.

На сервере добавьте строки

 /diskless/192.168.2.50 192.168.2.0/255.255.255.0(rw,sync,no_root_squash,no_all_squash,no_subtree_check,rw)

в файл /etc/exports, запустите

 mkdir -p /diskless/192.168.2.50
 exportfs -a
 exportfs

и убедитесь, что в выводе последней команды есть новый каталог. На клиенте запустите

 mkdir -p /mnt/remoteroot
 mount -t nfs /mnt/remoteroot 192.168.2.10:/diskless/192.168.2.50
 rsync -ax / /mnt/remoteroot
 rsync -ax /home/ /mnt/remoteroot/home/
 rsync -ax /boot/ /mnt/remoteroot/boot/

Две последних строки в этом примере нужны только в том случае, когда домашний каталог (home) и каталог загрузки (boot) находятся в различных разделах. Проще установить все в один раздел.


А что делать, если жесткий диск к клиенту подключить нельзя? Тогда установите систему на сервер в раздел, который позже смонтируете как /diskless. Проверьте, чтобы все настройки, задаваемые в процессе этой установки, были совместимы с аппаратной частью клиентской машины. Не устанавливайте загрузчик, и после перезагрузки сервер загрузится, как обычно. Теперь смонтируйте новый раздел как /diskless, создайте в нем каталог IPaddress и переместите остальное содержимое в этот каталог. Пользователям Gentoo сделать это проще, так как они могут установить систему вручную в каталог /diskless/IPaddress (просто используйте этот каталог при обычной установке вместо /mnt/gentoo).

Удаленная установка системы отличается от обычной установки на локальный диск. Прежде всего, может потребоваться перекомпиляция ядра. На это есть две причины. Первая – ради возможности смонтировать корневой раздел по сети вы должны установить опцию ROOT_NFS=y. Вторая – в большинстве дистрибутивов для загрузки модулей, необходимых для работы оборудования, используется initrd (начальный ram-диск). Хотя к нему можно обращаться через сеть, скорее всего его придется модифицировать, а это посложнее перекомпиляции ядра. Механизмы перекомпиляции ядра выходят за рамки этой статьи, но вы можете найти руководство в LXF89. Пользователи SUSE (по крайней мере 10.2) могут расслабиться – этот дистрибутив уже подготовлен для загрузки по сети с использованием PXE. Если команда

zgrep ROOT_NFS /proc/config.gz

покажет ROOT_NFS=y, ваше ядро готово к сетевой загрузке и следующий абзац можно пропустить.

Непременно вкомпилируйте сетевой драйвер в ядро – не оставляя его отдельным модулем; то же лучше сделать и с остальными драйверами. lspci поможет определить используемое аппаратное обеспечение, после этого система справки ядра должна вывести список необходимых драйверов. В идеальном мире все нужные модули должны вписаться в ядро, а все ненужные – исчезнуть. В жизни так бывает далеко не всегда. В частности, у пользователей часто появляются проблемы после компиляции в ядро драйверов ALSA. Если вы устанавливаете систему на жесткий диск, подключенный к клиенту описанным выше способом, то перед переносом чего-либо на другой компьютер перекомпилируйте ядро – возможно, потребуется несколько попыток, чтобы все получилось.

Последняя задача – отредактировать /etc/fstab. Удалите оттуда все строки, относящиеся к swap-файлу – использовать его в NFS не рекомендуется – и измените строку для корневого раздела на

192.168.2.10:/diskless/192.168.2.50 / nfs defaults,nolock 0 0

DHCP, TFTP и другие аббревиатуры

Теперь, когда система на сервере полностью установлена, нужно объяснить серверу, как перенести ее на компьютер клиента. Для этого нам понадобятся DHCP-сервер и TFTP-сервер. DHCP (Dynamic Host Configuration Protocol – протокол динамической конфигурации хоста) – это система, с помощью которой компьютер может запросить IP-адрес и другие параметры конфигурации непосредственно из сети. Помните, что на клиенте нет постоянного хранилища файлов, поэтому хранить статические настройки сети негде. TFTP (Trivial File Transfer Protocol – простой протокол передачи файлов) – это простая система передачи файлов, удобная для сетевой загрузки, потому что ее можно хранить в ПЗУ сетевой карты PXE. Она используется для передачи загрузчика ОС и ядра на компьютер клиента.


Серверов DHCP и TFTP на свете хватает; dnsmasq (http://www.thekelleys.org.uk/dnsmasq) является легко настраиваемой комбинацией обоих. Установка dnsmasq по умолчанию предоставляет базовый сервис DHCP, но нам потребуется еще кое-что. Установив и запустив dnsmasq, отключите сервер DHCP в своем маршрутизаторе, если он у вас есть, иначе может возникнуть конфликт. Dnsmasq будет наблюдать за всей сетью, а не только за компьютерами без жесткого диска.

Сначала нужно позаботиться, чтобы dnsmasq всегда выделял клиенту один и тот же IP-адрес. Для этого нужен MAC-адрес клиента (еще одна аббревиатура). Чтобы получить MAC-адрес, запустите на этом компьютере команду ifconfig или загрузитесь с подключенного диска или live CD – MAC-адрес зашит в сетевой карте и не может меняться [это не совсем так: существуют программы, способные менять MAC-адрес карты, но в условиях данного урока о них можно забыть, – прим.ред.]. Раскомментируйте строку conf-dir=/etc/dnsmasq.d в файле /etc/dnsmasq.conf, затем создайте файл /etc/dnsmasq.d/local и добавьте в него такую строку:

dhcp-host=00:0c:29:d4:cb:2e,192.168.2.50,somename

где 00:0c:29:d4:cb:2e – MAC-адрес. Эта строка означает, что компьютеру с данным MAC-адресом всегда будет выделяться IP-адрес 192.168.2.50 и имя узла somename. То же можно проделать и для других компьютеров сети, чтобы им всегда выделялись одни и те же IP-адреса. Прямого отношения к бездисковой загрузке это не имеет.

Чтобы разрешить загрузку с pxegrub, добавьте в файл строки

log-facility=/var/log/dnsmasq.log
enable-tftp
tftp-root=/diskless
tftp-unique-root
dhcp-boot=/boot/pxegrub
dhcp-option=150,/boot/grub.lst

Первые три строки пояснять не нужно. Четвертая говорит dnsmasq о том, что для получения корневого каталога клиента нужно добавить его IP-адрес к каталогу tftp-root. Благодаря этому корневой каталог будет уникален для каждого клиента. Следующая строка определяет расположение файла загрузчика, который отправится клиенту, и последняя – меню загрузчика. Так и слышу ваш вопрос: «Какого загрузчика и меню?». Ну, мы еще не установили их, но сейчас это сделаем.

Добавляем сетевой загрузчик

Существует два основных загрузчика PXEpxegrub и pxelinux. Мы возьмем pxegrub, но не потому, что pxelinux плох: просто Grub используется в большинстве дистрибутивов, форматы файлов конфигурации совместимы, и не нужно их изучать. Grub, способный на загрузку с жесткого диска, CD/DVD и из сети, сейчас становится повсеместным. Если с pxegrub что-то не получится или вы желаете не быть как все, попробуйте pxelinux. Загрузчик входит в состав пакета syslinux (http://syslinux.zytor.com).

Pxegrub может быть уже установлен в вашей системе как часть пакета Grub, в SUSE он находится в /usr/lib/grub/pxegrub. Dnsmasq добавляет к этому пути корневой каталог клиента, и символьная ссылка на загрузчик будет такой: /diskless/192.168.2.50/boot/pxegrub. Можно скопировать файл загрузчика в этот каталог, но символьная ссылка всегда удобнее: тогда при установке новых версий Grub не придется переделывать загрузочные каталоги.

Для pxegrub нужно создать файл меню. Если вы уже редактировали стандартный файл меню Grub, то поймете его синтаксис.

default 0
timeout 10
title=default
root (nd)
kernel /boot/vmlinuz ip=dhcp root=/dev/nfs nfsroot=192.168.2.10:/diskless/192.168.2.50

Основное отличие – в команде root, где для загрузки вместо привычного hd(n,m) указано сетевое устройство, и параметрах ядра, задающих использование DHCP для получения IP-адреса и разделяемого каталога NFS в качестве корневого раздела. Если нужно указать другие параметры ядра (такие как vga или noapic), просто припишите их к строке настроек.

И это функционирует?

Пора посмотреть, все ли работает. Для этого включите компьютер клиента и выберите загрузку из сети в настройках BIOS. Должны появиться сообщения, отражающие состояние DHCP; для его отслеживания на сервере также полезно запустить


tail -f /var/log/dnsmasq.log

Если все в порядке, то через несколько секунд появится меню Grub. Это значит, что DHCP и TFTP работают, и первый тест вами пройден (а вы думали, что тест будет про аббревиатуры?).

По окончании тайм-аута Grub, или после нажатия Enter, должен запуститься сам сетевой загрузчик. Выглядит это так же, как и обычная загрузка с жесткого диска, разве что медленнее. Если система нормально загружалась на клиентской машине с жестким диском, то и сейчас все должно работать. Единственная проблема, которая иногда возникает – init может попытаться еще раз запустить сетевое соединение, разрывая первоначальное, и все остановится, потому что исчезнет корневая файловая система. Решение проблемы зависит от дистрибутива – в некоторых есть возможность не перезапускать сеть, если она уже работает: например, пользователи Gentoo могут добавить строку

config_eth0=( “noop” )

в файл /etc/conf.d/net. А можно просто отключить запуск eth0 в утилите управления сервисами вашего дистрибутива. В сетевых настройках SUSE есть опция управления NFSroot, делающая взаимодействие с сервисами ненужным. Точно так же нужно убедиться в том, что сеть не отключается и во время выключения компьютера, иначе система вновь потеряет связь со своей корневой файловой системой. В разных дистрибутивах это делается по-разному. Один из вариантов – просто удалить соответствующую символьную ссылку K в каталоге runlevel. Это будет что-то вроде /etc/rc5.d/K05network. K означает, что этот скрипт запускается при остановке системы для завершения (Kill) сервисов. Пользователи Gentoo могут воспользоваться хитрым приемом для предотвращения отключения сети при отключении интерфейса, добавив в файл /etc/conf.d/net следующие строки

predown() {
return 1
}

А оно работало?

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

tail -f /var/log/messages | grep mountd

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

authenticated unmount request from 192.168.2.50:nnn for /diskless/192.168.2.50 (/diskless/192.168.2.50)

Это значит, что корневая файловая система смонтирована правильно. Увидев сообщение об ошибке, проверьте синтаксис /etc/exports и сверьтесь с man. Проверьте, можете ли вы смонтировать этот ресурс с другого компьютера вашей сети.

Если корневая система смонтирована правильно, все остальное не должно отличаться от обычной загрузки, поэтому проверьте настройки и конфигурацию ядра. Убедитесь, что вы не забыли добавить в конфигурацию ядра важные драйверы. Однако если вы проверяли установку на локальном жестком диске и корневая файловая система смонтировалась правильно, все остальное должно «просто работать». Готово! Теперь у вас есть компьютер без жесткого диска с полной установкой Linux, который можно использовать точно так же, как «обычный». LXF

Общий доступ к каталогам

Если вы хотите запускать несколько компьютеров без диска с одного сервера, то представляете, какой объем дискового пространства понадобится. Несколько каталогов (особенно /usr и /opt) можно разделить между клиентскими компьютерами (прочие каталоги не столь велики, чтоб о них беспокоиться, и одновременно безопасны для общего доступа), что позволит сэкономить около 3 ГБ дисковой памяти для каждого клиента. Но это непростая задача, требующая знаний в области скриптов загрузки. Просто создать символическую ссылку с каталога usr одного клиента на другой нельзя, потому что ссылки вне общего доступа NFS не работают. То же относится к монтированию с опцией –-bind. Можно куда-нибудь поместить общие каталоги /usr и /opt (например, в /diskless/common) и добавить их в файл /etc/exports. После этого можно добавить строки монтирования /usr и /opt в файл /etc/fstab каждого клиента.

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

Персональные инструменты
купить
подписаться
Яндекс.Метрика