Online Documentation Server
 ПОИСК
ods.com.ua Web
 КАТЕГОРИИ
Home
Programming
Net technology
Unixes
Security
RFC, HOWTO
Web technology
Data bases
Other docs

 

 ПОДПИСКА

 О КОПИРАЙТАХ
Вся предоставленная на этом сервере информация собрана нами из разных источников. Если Вам кажется, что публикация каких-то документов нарушает чьи-либо авторские права, сообщите нам об этом.




Введение в сетевую загрузку и протокол Etherboot

Аннотация:: В этой статье рассказывается о том, как запустить ваш компьютер программой, находящейся в ПЗУ без доступа к вашему жесткому диску. Это идеальный технический прием для обслуживания и настройки большой группы машин под Linux.


Что такое сетевая загрузка?

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

Сетевая загрузка часто совмещена с загрузкой с диска. Например, система может запускать Windows с диска, но иногда загружать Linux по сети. У такой техники несколько любопытных применений. Например, мой друг таким образом переустанавливает Windows по сети. Когда повреждаются системные файлы Windows, как это часто бывает, системный администратор может переустановить систему заново, загрузив по сети Linux и позволив скрипту отформатировать диск и вновь установить Windows.

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

Для того чтобы загрузиться по сети, компьютер должен получить 1. идентификатор; 2. образ операционной системы; 3. обычно, рабочую файловую систему. 

Рассмотрим бездисковый компьютер, у которого есть микросхема ПЗУ сетевой загрузки. Это может быть один из нескольких идентичных бездисковых компьютеров. Как мы сможем отличить этот компьютер от других? У каждого компьютера существует уникальный адрес сетевой карты, который является его адресом в сети. Каждая сетевая карта стандарта Ethernet в мире имеет уникальный 48-битный адрес, так как каждому производителю аппаратных средств отдан диапазон адресов сетевых карт. По договоренности, эти адреса записываются в шестнадцатиричном формате, причем каждую группу из двух цифр разделяет двоеточие. Например: 00:60:08:C7:A3:D8.

Протоколы, используемые для получения IP адреса по данному адресу сетевой карты, называются загрузочным протоколом (BOOTP) и протоколом динамической настройки компьютера (DHCP). DHCP -- это расширенный протокол BOOTP. В нашем обсуждениии, если не сказано иначе, все относящееся к протоколу BOOTP также относится и к протоколу DHCP. (На самом деле не совсем верно, что BOOTP и DHCP переводят адреса только сетевых карт, так как создатели предусмотрели для протоколов BOOTP и DHCP возможность работы с адресами любых аппаратных средств. Но большинство людей использует сетевые карты).

Пример обмена информацией протокола BOOTP выглядит примерно так:

Бездисковый компьютер: привет, вот адрес моей сетевой карты: 00:60:08:C7:A3:D8, дайте мне, пожалуйста, мой IP адрес.

Сервер BOOTP: (находит адрес в базе данных) Ваше имя aldebaran, ваш IP адрес 192.168.1.100, ваш сервер 192.168.1.1, файл, из которого должна производиться загрузка /tftpboot/vmlinux.nb (и другая информация, подобная этой).

Вас может удивить, каким образом бездисковый компьютер узнал адрес сервера BOOTP. На самом деле он этого не делал. Запрос протокола BOOTP был передан по локальной сети и любой сервер BOOTP, который может ответить на запрос делает это.

После получения IP адреса бездисковый компьютер должен получить образ операционной системы и запустить его. Тут уже используется другой протокол, называемый тривиальным протоколом передачи файлов (TFTP). Протокол TFTP похож на сокращенную версию FTP, но в нем нет подтверждения подлинности и он работает поверх протокола UDP в отличие от протокола TCP. Протокол UDP вместо TCP был выбран из-за простоты. Код для протокола UDP легко разместить на микросхемах ПЗУ. Так как протокол UDP блочно-ориентированный, передача происходит блок за блоком, приблизительно следующим образом:

Бездисковый компьютер: дайте мне 1-ый блок файла /tftpboot/vmlinux.nb.
Сервер TFTP: вот он.
Бездисковый компьютер: дайте мне 2-ой блок.

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

И, наконец, для запуска операционной системы должна быть предоставлена корневая файловая система. Linux и другие Unix обычно используют сетевую файловую систему (NFS), хотя возможны и другие варианты. В этом случае код не содержится в ПЗУ, но может быть частью загруженной операционной системы. Тем не менее, операционная система должна уметь работать с корневой файловой системой NFS, а не с жестким диском. В Linux есть переменные настройки для того, чтобы скомпилировать версию, способную сделать это.

Сетевая загрузка на практике

Помимо коммерческих загрузочных ПЗУ, существуют два источника бесплатных пакетов для сетевой загрузки. Это пакеты Etherboot и Netboot. Их можно найти на домашней страничке Etherboot. Сначала вы должны убедиться, что ваша сетевая карта поддерживается либо Etherboot либо Netboot. Вы должны найти кого-нибудь, кто пожелает разместить код на EPROM для вас, но для начала можно произвести сетевую загрузку с дискеты. 

Для создания загрузочной дискеты в дистрибутиве предусмотрен специальный загрузочный блок. Он представляет из себя маленькую программу (512 байт), которая загружает блоки с дискеты в память и начинает выполнение. Таким образом, чтобы создать загрузочную дискету, надо только соединить загрузочный блок с данными Etherboot, содержащими драйвер для сетевой карты при помощи следующей команды:

cat floppyload.bin 3c509.lzrom > /dev/fd0

Перед тем как начать сетевую загрузку с дискеты, необходимо настроить в Linux три службы: BOOTP (или DHCP), TFTP и NFS. Нет необходимости устанавливать все три службы одновременно, это можно делать последовательно, на каждом шаге убеждаясь в том, что настроенная служба работает, и только потом переходить к следующему шагу.

Я предполагаю, что вы установили сервер bootpd из дистрибутива или скомпилировали его самостоятельно. После этого вы должны убедиться, что сервер ожидает запросов bootp. Вы можете поступить двумя способами: запустить bootpd как сетевую службу, и тогда она будет принимать пока включен компьютер, или же запускать ее при помощи inetd. В этом случае файл /etc/inetd.conf должен содержать следующую строчку:

bootps dgram udp wait root /usr/sbin/tcpd bootpd

Если вы изменили файл /etc/inetd.conf, тогда вы должны заново запустить inetd, послав ему сигнал HUP.

Затем вам необходимо предоставить bootp базу, ставящую в соответствие Ethernet адресам адреса IP. Эта база находиться в файле /etc/bootptab и содержит строки подобные этой:
aldebaran.foo.com:ha=006008C7A3D8:ip=192.168.1.100:bf=/tftpboot/vmlinuz.nb

Там может быть задана еще и другая информация, но мы начнем с самого простого.

Теперь загрузите бездисковый компьютер с дискеты и он должен обнаружить сетевую карту, а затем передать запрос BOOTP. Если все сделано верно, то сервер передаст запрашиваемую информацию бездисковому компьютеру. Поскольку файл /tftpboot/vmlinux.nb не существует, то этот файл пока не удастся загрузить.

Теперь вы должны скомпилировать ядро с поддержкой корневой файловой системы на NFS. Кроме того вы должны разрешить получение ядром IP адреса из запроса BOOTP. Также вы должны скомпилировать драйвер для вашей сетевой карты в ядро, а не как отдельный модуль. Можно загрузить виртуальный диск таким образом, чтобы с него можно было загружать модули, но вы сделаете это позже.

Вы не можете сразу установить ядро, полученное после компиляции. Его сначала надо преобразовать в помеченный образ. Это нормальный образ ядра со специальными заголовками, которые передают сетевому загрузчику, где в памяти находятся данные и с какого адреса начинать запуск программы. Чтобы создать такой образ, используйте программу, называемую mknbi-linux. Эту утилиту можно найти в дистрибутиве Etherboot. После того как вы сгенерируете образ, положите его в каталоге /tftpboot под именем, определенным в /etc/bootptab. Убедитесь, что файл доступен для чтения любому пользователю, потому как у tftp сервера нет специальных привилегий.

Что касается TFTP, то я полагаю, что вы установили его с дистрибутива или же скомпилировали самостоятельно. Демон TFTP обычно запускается из inetd следующей строкой в файле /etc/inetd.conf.

tftp dgram udp wait root /usr/sbin/tcpd in.tftpd -s /tftpboot

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

По нескольким причинам не самый лучший способ использовать корневую файловую систему сервера в качестве файловой системы бездискового компьютера. Одна из них -- это наличие там некоторых файлов настройки, пользуясь которыми ваш компьютер может получить неверную информацию. Другая причина -- это безопасность. Опасно давать права на запись (а право записи по некоторым причинам требуется корневой файловой системе) на сервере. Тем не менее плюс в том, что корневая файловая система для бездискового компьютера не очень большая, всего около 30 Мб, кроме того большая ее часть может быть распределена между различными машинами.

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

Настроенное ядро Linux для бездискового компьютера ожидает увидеть корневую файловую систему в каталоге /tftpboot/<IP адрес бездискового компьютера>, в рассмотренном выше случае /tftpboot/192.168.1.100. Если необходимо, то это значение может быть изменено при настройке ядра.

Теперь создайте или отредактируйте файл /etc/exports на сервере и вставьте в него следующую строчку:

/tftpboot/192.168.1.100 aldebaran.foo.com(rw,no_root_squash)

Для некоторых служб нужны права rw. Атрибут no_root_squash защищает систему NFS от отображения идентификатора суперпользователя в какой-либо другой. Если этот атрибут не будет задан, то различные демоны могут не заработать.

Теперь запустите службы NFS (rpc.portmap и rpc.mountd) и снова попробуйте бездисковую загрузку. Если все прошло удачно, то ядро сможет подмонтировать корневую файловую систему и пройти все стадии загрузки до появления приглашения входа в систему. Очень может быть, что вы обнаружите что-нибудь ненастроенное. Большинство дистрибутивов Linux ориентированы на операции с диском и поэтому для бездисковой загрузки требуются небольшие изменения. Самой большой неприятностью является зависимость от файлов, находящихся в каталоге /usr во время загрузки, которые в процессе загрузки получаются от сервера немного позже. Вот два возможных решения: 1. Создайте несколько требуемых файлов в небольшом каталоге /usr корневой файловой системы, которые будут перезаписаны при импорте каталога /usr и 2. Измените пути, чтобы файлы искались в корневой файловой системе. Файлы, которые вы будете редактировать находятся в /tftpboot/192.168.1.100 (запомните, что это корневой каталог бездискового компьютера).

Вы можете захотеть подмонтировать другие каталоги с сервера, например /usr (будет экспортирован с атрибутом только чтение).

Теперь, когда вы убеждены, что можете загрузиться по сети без проблем, вы можете захотеть перенести часть программ на EPROM. Программатор EPROM стоит около 100$, а это не самый лучший способ вложения денег для тех, кто будет пользоваться им редко. Вы можете встретить подержаный программатор на рынке по разумной цене, но вы должны непременно убедиться в наличии программного обеспечения для данного программатора. Опытный электронщик может спаять программатор сам, используя одну из нескольких свободно распространяемых в Internet схем, но для большинства читателей наилучшим решением будет знакомство с кем-нибудь у кого уже есть программатор, например с человеком из группы радиолюбителей или электронной промышленности.

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

Существует другая технология, называемая EEPROM (Electrically Erasable PROM), иногда Flash PROM. При использовании этой технологии, биты стираются посредством электрического сигнала. Это устраняет потребность в ультрафиолетовом стирателе, но для стирания EPROM требуются дополнительные электронные схемы. Если вы разбираетесь в электронике, то в дистрибутиве Etherboot для вас есть схема и драйвер карты EEPROM. Эта карта вставляется в любой свободный слот шины ISA и загружает сетевую карту, вставленную в какой-либо другой слот.

Различные способы использования сетевой загрузки

X-терминалы -- это естественное использование сетевой загрузки. Отстутствие дисков в терминалах делает их бесшумными и способствует приятным условиям работы. В идеале, машина должна иметь 16 мегабайт памяти или больше и самую лучшую видеокарту, которую вы можете найти. Это самое лучшее использование 486-х компьютеров высокого класса и Pentium низкого класса, которые вышли из употребления при появлении лучшего аппаратного обеспечения.

Другие люди используют сетевую загрузку для кластера машин, где использование связано с бездисковыми компьютерами и не оправдывает наличия диска, например, кластер машин в классной комнате.

Дополнительная информация

Сначала вы должны посетить домашнюю страничку Etherboot:
http://www.slug.org.au/etherboot/

Там вы найдете ссылки на другие ресурсы, включая список рассылки, на который можно подписаться для обсуждения проблем и решений.

Счастливой сетевой загрузки!

Перевод Татьяны Бирюковой

© Ken Yap 1998
LinuxFocus 1998



With any suggestions or questions please feel free to contact us