- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF100-101:Запуск по сети
Материал из Linuxformat.
- Диски долой! Научите ПК с Linux загружаться через локальную сеть
Содержание |
Сеть: Загрузка без винчестера
Хотите превратить свой ПК в домашний кинотеатр или завести кластер из однотипных компьютеров? Ответ – сетевая загрузка. Нейл Ботвик все объяснит.
- Клиент
PXE-совместимая сетевая карта. Если у вас встроенная сетевая карта, проверьте, есть ли в меню или настройках BIOS возможность загрузки из сети.
- Много оперативной памяти
Подкачка через NFS работает крайне медленно, не говоря уже о ее ненадежности. Поэтому для запуска приложений требуется физическое ОЗУ приличного объема.
- Большой жесткий диск
В зависимости от того, сколько программ установлено, потребуется от 2 до 5 ГБ на каждого клиента, плюс место на домашние каталоги и файлы данных.
- Клиент и сервер
Необходимо быстрое соединение, особенно если клиентов несколько. Операции, интенсивно использующие обращения к диску, ощутимо замедлятся, поэтому неплохо иметь соединение в 1 Гбит/с. Если интенсивных обращений к диску нет, скорость может быть гораздо ниже. Мой клиент MythTV использует Powerline-соединение [через бытовую электросеть, – прим.ред.], скоростью около 30 Мбит/с. Загружается компьютер немного медленнее обычного, но все остальное работает вполне нормально.
Помните времена, когда компьютерам не были нужны жесткие диски? Amiga и Atari ST загружали все необходимое с дискеты. А еще раньше у 8-битных компьютеров типа Commodore 64 и Spectrum даже и дискет-то не было, все необходимое загружалось из ПЗУ. Сегодня сложно купить компьютер без жесткого диска в несколько сотен гигабайт, но зато загрузить компьютер можно вообще без винчестера. Так называемая «загрузка по сети» позволяет такому компьютеру получить все необходимое с другого компьютера через сеть.
Это рождает два правомерных вопроса: зачем и как. Зачем бы нам это делать? Причин несколько: может быть, вам нужен тихий и прохладный компьютер, а жесткие диски нагреваются и изрядно шумят. Например, в моей гостиной стоит компьютер для работы MythTV, с материнской платой Via EPIA без кулеров и без жесткого диска, абсолютно бесшумный. Объединив все жесткие диски в один большой диск или массив дисков, вместо использования отдельных дисков на каждом компьютере, можно более эффективно обслуживать кластеры. То же справедливо и для компьютерной сети в интернет-кафе или в школьном кабинете информатики. Это не то же самое, что использовать тонкого клиента, когда всю работу выполняет сервер. Компьютер, загружаемый через сеть – это обычный компьютер или рабочая станция; вся разница – что его жесткий диск подключен длинным сетевым кабелем вместо короткого шлейфа.
На второй вопрос (как это сделать?) мы ответим дальше. Как и на первый вопрос, на второй есть несколько ответов, но мы ограничимся только одним. PXE (Preboot eXecution Environment или pixie – среда выполнения перед загрузкой) – самый простой способ обеспечить запуск через сеть, если клиентский компьютер (без жесткого диска) его поддерживает. На большинстве современных материнских плат есть по меньшей мере одна сетевая карта с поддержкой PXE, так что это самый простой вариант; прочие устройства могут потребовать другого подхода, например, установки ПЗУ etherboot (http://www.etherboot.org) на сетевой карте или инициализации процесса с дискеты или CD. Но мы их здесь не рассматриваем.
Как это работает?
Перед тем, как рассматривать загрузку с сети, вспомним, как происходит обычная загрузка с жесткого диска:
- BIOS компьютера ищет код загрузчика ОС (bootloader) в первом секторе жесткого диска и загружает его.
- Загрузчик ОС, используя информацию из файла настройки и пользовательского меню, загружает ядро, передавая ему информацию о местонахождении корневого раздела и другие данные.
- Ядро монтирует корневой раздел и запускает процесс /sbin/init, который загружает все остальное.
Загрузка с использованием PXE очень похожа на обычную загрузку:
- Код PXE в сетевой карте или в BIOS компьютера рассылает по сети расширенный DHCP-запрос.
- Должным образом сконфигурированный сервер возвращает информацию о настройках DHCP, а также адрес сервера загрузки, код сетевого загрузчика и загрузочное меню, подобное обычному меню загрузки Grub или Lilo.
- Когда пользователь выбирает пункт меню (или истекает время ожидания), загрузчик PXE загружает ядро с указанного сервера загрузки, определяя расположение корневого раздела и другие параметры.
- Ядро монтирует корневой раздел с помощью 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. Она используется для передачи загрузчика ОС и ядра на компьютер клиента.
А что делать, если в системе необходимо произвести какие-то изменения, например, обновить ПО на клиентских компьютерах? Можно зайти на каждый компьютер клиента и установить новое ПО, но клиент может быть просто выключен, когда вы захотите это сделать. Альтернативный вариант – произвести изменения с сервера с помощью chroot. Выполнив команды
mount -t proc none /diskless/IPaddress/proc mount --bind /dev/ /diskless/IPaddress/dev chroot /diskless/IPaddress /bin/bash mount -a source /etc/profile
вы окажетесь в командной оболочке системы клиента. Там можно сделать все необходимое, затем выйти:
umount -a exit umount /diskless/IPaddress/proc umount /diskless/IPaddress/dev
Чтобы каждый раз не набирать эти команды снова, сохраните их как скрипт.
Серверов 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. Благодаря этому корневой каталог будет уникален для каждого клиента. Следующая строка определяет расположение файла загрузчика, который отправится клиенту, и последняя – меню загрузчика. Так и слышу ваш вопрос: «Какого загрузчика и меню?». Ну, мы еще не установили их, но сейчас это сделаем.
Добавляем сетевой загрузчик
Существует два основных загрузчика PXE – pxegrub и 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 монтируют общие сетевые ресурсы при загрузке значительно позднее, чем локальную файловую систему, так как обычно надо дожидаться активизации сетевого интерфейса. Поэтому вам нужно было начать с изменения скриптов инициализации в вашем дистрибутиве. Быть может, игра не стоит свеч: даже если у вас много клиентов, то и дискового пространства много.