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

Эта глава написана Ken Yap ken.yap@acm.org и объясняет способ загрузки компьютера без доступа к вашему жесткому диску с размещенной в энергонезависимой памяти программы. Это идеальная техника для содержания и настройки группы linux компьютеров.

Что такое загрузка по сети?

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

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

Для загрузки по сети, компьютер должен получить

  1. идентификацию

  2. образ операционной системы и

  3. обычно, рабочую файловую систему.

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

Используемые для получения IP адреса по данному Ethernet адресу протоколы называются Boot Protocol (BOOTP) и Dynamic Host Configuration Protocol (DHCP). DHCP - развитие BOOTP. В наших рассуждениях, если не указано иное, все что применимо к BOOTP также применимо к DHCP. (Фактически немного неправильно говорить, что BOOTP и DHCP всего лишь транслируют Ethernet адреса, в них предусмотрено обеспечение работы BOOTP и DHCP с любым типом аппаратных адресов, но большинство использует Ethernet.)

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

DC: Привет, мой аппаратный адрес 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 адреса, DC должен загрузить образ операционной системы и выполнить его. Другой используемый тут Интернет протокол называется Trivial File Transfer Protocol (TFTP). TFTP подобен обрезанной версии FTP --- тут нет идентификации, и он работает поверх User Datagram Protocol (UDP), а не поверх Transmission Control Protocol (TCP). UDP был выбран вместо TCP для упрощения. Реализация UDP на DC может быть маленькой, посему код легко помещается в ПЗУ. Так как UDP блочно-ориентированный протокол, в отличие от потоково-ориентированных протоколов, передача следует блок за блоком, как например:

DC: Дай мне 1 блок файла /tftpboot/vmlinux.nb.
TFTP сервер: Лови.
DC: Дай мне блок 2.

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

В конце, в случае запуска операционной системы, должна быть предоставлена корневая файловая система. Linux и другими Unix-ами обычно используется Network File System (NFS), однако возможны другие варианты. В этом случае код не должен находиться в ROM, а должен быть частью загружаемой операционной системы. Однако операционная система вместо реального диска должна запустить корневую файловую систему - NFS. Linux содержит требуемые для этого настройки.

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

Сетевой загрузчик - небольшая программа, запускаемая как расширение BIOS, расположена обычно на EPROM сетевой платы. Она обрабатывает BOOTP запрос и загрузку по TFTP, а затем передает управление загруженному образу. Она использует TCP/IP протокол, но загруженный образ не обязательно должен быть Linux. Загруженный образ может быть любым, даже DOS. Он также может быть загружен с дискеты для проверки и временных настроек.

Наряду с коммерческими ROM, есть ДВА свободных пакета сетевой загрузки. Свободные реализации TCP/IP сетевых загрузчиков -

  1. ETHERBOOT http://www.slug.org.au/etherboot/ и его зеркало, а также google-сайт

  2. NETBOOT http://www.han.de/~gero/netboot.html

Etherboot использует встроенные драйвера, в то время как Netboot использует Packet драйвера. Сначала вы должны проверить, что ваша сетевая карта поддерживается Etherboot или Netboot. До того как вы, в конечном счете, найдете того, кто захочет вставить для вас код в EPROM (Erasable Programmable Read Only Memory), вы можете загружаться по сети с дискеты.

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

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

Возьмите пакет nfsboot (пакет доступен на вашем любимом зеркале linux в каталоге /pub/Linux/system/Linux-boot directory). Он содержит booteprom образ вашей сетевой карты (например wd8013), который можно непосредственно записать. Также смотрите LTSP сайт http://www.ltsp.org

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

  1. BOOTP (или DHCP)

  2. TFTP и

  3. NFS.

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

Bootp

Установите Bootp. Ищите bootp*.rpm на компакт-диске Redhat linux. Также взгляните на RPM пакеты на сайте LTSP http://www.ltsp.org. Просмотрите следующие страницы руководств 'man 5 bootptab', 'man 8 bootpd', 'man 8 bootpef', 'man 8 bootptest'. Затем проверьте, что сервер ожидает bootp запросы. Демон может быть запущен либо непосредственно командой
       bootpd -s

либо используя inetd, отредактируйте файл /etc/inetd.conf и вставьте похожую строку:

	bootps dgram   udp     wait    root    /usr/sbin/in.bootpd    bootpd
Вставьте или раскомментируйте следующие две строки в /etc/services:
bootps          67/tcp          # BOOTP server
tftp            69/udp          # TFTP server

Если вы модифицировали /etc/inetd.conf, перезапустите inetd, послав процессу HUP сигнал.
	kill -HUP <номер процесса inetd>.

Далее, вам следует указать bootp базу данных с соответствиями Ethernet адресов IP адресам. Эта база данных находится в /etc/bootptab. Вы должны модифицировать ее вставив IP адрес вашего шлюза (gateway), dns сервера, и ethernet адреса ваших бездисковых машин. Он содержит строки следующего вида:

	aldebaran.foo.com:ha=006008C7A3D8:ip=192.168.1.100:bf=/tftpboot/vmlinuz.nb 

Можно указать и прочую информацию, но мы начнем с простого.

Другой пример /etc/bootptab:

  global.prof:\
          :sm=255.255.255.0:\
          :ds=192.168.1.5:\
          :gw=192.168.1.19:\
          :ht=ethernet:\
          :bf=linux:
  machine1:hd=/export/root/machine1:tc=global.prof:ha=0000c0863d7a:ip=192.168.1.140:
  machine2:hd=/export/root/machine2:tc=global.prof:ha=0800110244e1:ip=192.168.1.141:
  machine3:hd=/export/root/machine3:tc=global.prof:ha=0800110244de:ip=192.168.1.142:

global.prof - общий шаблон элементов хостов, где

  • поле sm содержит маску подсети (subnet mask)

  • поле ds содержит адрес DNS сервера

  • поле gw содержит адрес шлюза (gateway)

  • поле ht содержит аппаратный тип сети

  • поле bf содержит имя загрузочного файла

После этого, каждая машина должна быть представлена строкой:

  • первое поле содержит имя хоста,

  • поле hd содержит каталог загрузочного файла,

  • общий шаблон может быть указан в поле tc

  • поле ha содержит аппаратный адрес ethernet карты

  • поле ip содержит назначаемый ip адрес.

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

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

Tftp

TFTP ищите в tftp*.rpm на компакт-диске Redhat Linux. TFTP (Trivial File Transfer Protocol) - подобный ftp протокол передачи файлов, но намного более простой, что делает возможным закодировать его в EPROM. TFTP может использоваться двумя путями:

  • Простой tftp: обозначает, что клиент получает доступ ко всем файлам вашей системы. Это просто, но образуется большая дыра в безопасности (любой может получить по tftp ваш файл с паролями).

  • Безопасный tftp: tftp сервер использует систему chroot.2 для смены собственного корневого каталога. Все, что находится вне нового корневого каталога полностью недоступно. Так как chroot каталог становится новым корневым каталогом, поле hd в файле bootptab должно отражать эту ситуацию. Например: при использовании небезопасного tftp, поле hd содержит полный путь к загрузочному каталогу: /export/root/machine1. При использовании безопасного tftp с каталогом /export в качестве корневого каталога, каталог /export станет / , и поле hd должно быть /root/machine1.

Обычно tftpd запускается из inetd подобного вида строкой в /etc/inetd.conf.

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

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

Корневая файловая система на NFS

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

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

Подстроенное для бездискового компьютера ядро Linux ожидает увидеть корневую файловую систему в /tftpboot/(IP адрес бездискового компьютера), например: /tftpboot/192.168.1.100 в вышеприведенном случае. По желанию его можно изменить при конфигурировании ядра.

Теперь создайте или отредактируйте на сервере /etc/exports (см. 'man 5 exports' и 'man 8 exportfs') и поместите строку следующего вида:

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

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

Запустите или перезапустите службы NFS (rpc.portmap и rpc.mountd) и попробуйте загрузить бездисковый компьютер. Если вам повезет, ядро смонтирует корневую файловую систему и загрузится до приглашения к входу. Скорее всего, вы обнаружите, что что-то упустили из виду. Большинство дистрибутивов Linux не предусмотрены для бездисковой загрузки и требуют небольшой модификации. Наиболее частая неисправность - система, в процессе загрузки, полагается на файлы в каталоге /usr, который при загрузке обычно импортируется с сервера позже. Два возможных решения -

  1. Предоставить несколько требуемых файлов в небольшом каталоге /usr на корневой файловой системе, который далее будет перекрыт при импорте /usr, и

  2. Модифицировать пути для поиска файлов в корневой файловой системе. Файлы нужно редактировать в каталоге /tftpboot/192.168.1.100 (помните, что это корневой каталог бездискового компьютера).

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

Создание EPROM

Когда вы уверены, что без проблем сможете загружаться по сети, вы можете поместить код в EPROM.

Использование загрузки по сети

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

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

Для начала вам следует остановиться на домашней странице Etherboot: http://www.slug.org.au/etherboot/ или зеркале и google-сайт

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

Сопутствующие документы