Загрузка по сети предоставляет администраторам ряд преимуществ, среди которых:
- легкость установки нового ПО;
- централизованное администрирование;
- возможность
отказа от установки жестких дисков на клиентские компьютеры, что
приводит к повышение надежности системы и понижению ее стоимости.
В данной статье мы рассмотрим организацию процесса такой загрузки.
Для удобства проведения экспериментов будем работать не с физическими компьютерами, а с виртуальными, для реализации которых
используем пакет VMware Workstation (использовалась версия 4.0),
установленный в ОС Windows 2000 SP4.
Идея сетевой загрузки заключается в следующем[1].
Компьютер (клиент) имеет в энергонезависимой памяти (на жестком диске,
на дискете) некоторый начальный код загрузки, который позволяет
соединиться с другим компьютером (сервером), загрузить с него ядро, а
также использовать его файловую систему. Таким образом, на клиенте
может вообще отсутствовать жесткий диск.
Стандартный процесс сетевой загрузки выглядит следующим образом:
- После инициализации загрузчик определяет необходимые IP-адреса: свой, сервера, шлюза. Они запрашиваются по BOOTP или DHCP.
- Получив ответ от сервера, он инициализирует процесс загрузки ядра по протоколу TFTP.
- Ядро подключает файловую систему. Она может находится на жестком диске клиента, в памяти клиента, либо подключаться с
сервера по протоколу NFS.
Вариантов реализации сетевой загрузки может быть много. Мы
рассмотрим такой: клиентский компьютер - бездисковый, для создания
загрузчика используется Etherboot, определение настроек происходит по
DHCP, операционная система клиента и сервера - Debian (версия ядра -
2.4.18). Подключение корневой файловой системы осуществим двумя
способами: по NFS и с RAM-диска.
Запустим VMware workstation и нажмем Ctrl+N для создания нового виртуального компьютера. Далее, выбираем:
- Virtual machine configuration: Custom;
- Guest operation system: Linux;
- Virtual machine name: Client;
- Location: каталог для виртуального компьютера;
- Memory guest size (MB): 64;
- Network connection: Use host-only networking;
- Disk: Create a new virtual disk;
- Disk size (GB): 0,1;
- Disk file: Client.vmdk.
Необходимо сделать замечание относительно памяти. По умолчанию, в
VMware действуют ограничения на используемую виртуальными компьютерами
память. Так, если на компьютере установлено 256 Мб памяти, то
виртуальные компьютеры не могут использовать более 192 Мб. Поскольку
будет необходимо одновременно запускать клиентский и серверный
компьютеры, каждому из них нельзя выделить более 80 Мб (по 16 Мб
требуется самой VMware на запуск каждого виртуального компьютера). Для
трех виртуальных компьютеров это ограничение опускается до 48 Мб.
Изменить лимит по умолчанию можно в меню Edit пункт Application Settings..., вкладка Memory.
Проделав эту операцию еще дважды, заменяя Client на Server и на Work, выбрав размер жесткого диска 1,0
и 0,5 соответственно, создаем виртуальный сервер и рабочий виртуальные компьютеры.
Настроим оборудование каждого виртуального компьютера. Это можно
сделать, выбрав в контекстном меню соответствующего компьютера пункт Edit...,
вкладка Hardware. У клиента удалим Hard Disk 1, CD-ROM 1, USB Controller и Audio; у сервера и
рабочего компьютеров - Floppy 1, USB Controller и Audio. Добавим серверу вторую сетевую карточку, установив для нее тип
NAT.
Теперь необходимо отредактировать настройки сети, для чего выберем пункт Virtual Network Setting... меню Edit. Перейдем на
закладку DHCP, выберем адаптер VMnet1 и нажмем кнопку Remove.
Таким образом мы отключаем службу DHCP от адаптера VMnet1 (к которому
по умолчанию будут подключены виртуальные компьютеры), т.к. мы будем
настраивать ее на сервере специальным образом.
Для дальнейших настроек нам необходимо знать IP адрес адаптера VMnet1. Посмотреть его можно, выполнив команду ipconfig в
командной строке ОС Windows. У меня он такой: 192.168.223.1
Для создания образа загрузчика воспользуемся свободно распространяемым пакетом Etherboot.
Создать образ можно вручную, с помощью утилит, входящих в пакет. Однако мы используем сервис, предоставляемым сервером
ROM-o-matic.net. Здесь можно выбрать тип своей карты с помощью стандартного Web-интерфейса и
произвести необходимые настройки, а сервер автоматически сгенерирует образ загрузчика и предложит его скачать.
При написании документа пользовалась версия 5.2.5 пакета ROM-o-matic. Для создания
образа необходимо:
- выбрать тип сетевой карты (справку по поддерживаемым картам можно получить
здесь);
- выбрать формат загрузчика (зависит от того, куда вы хотите поместить код загрузчика);
- произвести, если требуется, дополнительную настройку загрузчика, нажав кнопку Configure;
- нажать кнопку Get ROM и скачать заказанный образ.
VMware 4.0 эмулирует сетевую карточку AMD 79c970 PCnet LANCE, поэтому в первом пункте выберем pcnet32:lancepci, во втором -
Floppy bootable ROM Image, нажмем кнопку Get ROM и сохраним образ загрузчика в C:\Temp\boot.img.
Образ загрузчика может считываться компьютером с жесткого диска,
дискеты или из встроенной FLASH памяти сетевой карты. Последний вариант
- наиболее удобный, однако прежде чем записывать загрузчик во FLASH,
необходимо убедится в его работоспособности. Поэтому, для тестирования,
мы запишем загрузчик на дискету.
Сделать это можно с помощью программы rawrite2, которая входит в стандартный дистрибутив
Debian (находится на первом диске в каталоге install). В качестве параметров ей необходимо указать файл с загрузчиком и
устройство для записи.
Вставим чистую дискету в дисковод A и дадим команду:
rawrite2 -f C:\Temp\boot.img -d a
Теперь можно попробовать загрузить клиентский компьютер (выбрав его в списке и нажав Ctrl+B). Загрузка остановится на сообщении
Searching for server (DHCP).... После слова lancepci будет отображен MAC адрес сетевой карты, у меня он такой:
00:0C:29:E6:36:BC. Запишем его, он пригодится при настройке DHCP.
4. Настройка сервера
4.1. Установка операционной системы
Для установки ОС необходим дистрибутив, состоящий минимум из двух
дисков. Вставьте первый диск дистрибутива Debian в устройство чтения
дисков и запустите виртуальный сервер.
На приглашение boot: введите vanilla и нажмите Enter. Это запустит
установку с ядром, поддерживающим множество устройств, в том числе SCSI устройства. Далее установка
проходит в обычном режиме.
Поддержка сети должна быть установлена обязательно. Если Debian найдет сетевую карточку, то он
автоматически предложит вам настроить сеть. Если же этого не произойдет, необходимо выбрать драйвер
сетевой карточки вручную (pcnet32).
Несколько слов о настройке сети. Зададим имя компьютера (hostname): server. В качестве интерфейса для установки Debian
через NFS или HTTP выберем eth1. На вопрос об автоматической конфигурации по DHCP ответим согласием.
После установки ядра системы и драйверов произойдет перезагрузка.
Установщик Debian задаст несколько стандартных вопросов по настройке
системы, а затем предложит установить дополнительные пакеты (запустить tasksel и dselect для их установки). Откажитесь - это проще выполнить из командной
строки. Почтовую систему также настраивать не нужно.
Войдите в систему как root и дайте следующую команду:
apt-get install mc dhcp ftpd tftpd nfs-kernel-server bind kernel-source-2.4.18 make gcc libc6-dev
Все необходимое программное обеспечение находится на первом и втором
дисках дистрибутива. Подробное описание процесса установки находится в [2].
4.2. Настройка адаптера eth0
Построим следующую сетевую конфигурацию: сервер через адаптер eth1
будет связан с внешними сетями (в том числе с Internet, если компьютер
подключен к Internet), а через адаптер eth0 - с внутренней сетью,
состоящей из виртуальных компьютеров. Корректную настройку eth1
обеспечит VMware, а интерфейс eth0 необходимо сконфигурировать вручную.
Для этого отредактируем файл /etc/network/interfaces, добавив в него следующие строки:
auto eth0
iface eth0 inet static
address 192.168.223.2
netmask 255.255.255.0
Вместо адреса 192.168.223.2 необходимо указать адрес, следующий за
адресом адаптера VMnet1. После перезагрузки виртуального компьютера
интерфейс должен заработать.
4.3. Настройка DHCP
Сервис DHCP отвечает за выдачу клиенту его IP адреса, имени, других
параметров сети, а также имени файла с ядром операционной системы. Его
настройка осуществляется с помощью конфигурационного файла /etc/dhcpd.conf. Мы используем такой файл:
option domain-name "private.net";
option domain-name-servers server.private.net;
subnet 192.168.223.0 netmask 255.255.255.0 {
group {
filename "net_boot_kernel";
host node01 {
hardware ethernet 00:0C:29:E6:36:BC;
fixed-address 192.168.223.3;
option host-name "node01";
}
}
}
После subnet указан IP адрес адаптера VMnet1, с замененной на 0 последней цифрой. В строке filename сказано,
что имя файла с ядром для сетевой загрузки - net_boot_kernel. В строке hardware ethernet необходимо указать ранее записанный MAC адрес клиента,
в строке fixed-adress указывается IP, который будет выдан клиенту.
Нам необходимо, чтобы DHCP сервер обрабатывает запросы только с интерфейса eth0 (из внутренней сети), поэтому отредактируем файл
/etc/default/dhcp, присвоив переменной INTERFACES значение eth0.
Небольшие изменения нужны для DHCP клиента. В файл /etc/dhclient.conf добавим следующие две строки:
supersede domain-name "private.net";
prepend domain-name-servers 127.0.0.1;
Первая строка указывает домен поиска, а вторая - добавляет
дополнительный (к тому, который будет получен от DHCP сервера) DNS
сервер. Эти изменения необходимы для формирования правильного файла resolv.conf.
Теперь, при загрузке клиента, на экране должны отобразиться IP
адреса клиента и сервера, полученные от сервера (службу DHCP
предварительно необходимо перезапустить). Более подробную информацию по
настройке DHCP можно найти в [3].
4.4. Настройка FTP и TFTP
Перекачивание ядра с сервера на клиент осуществляется по протоколу TFTP. Для его корректной работы в файле /etc/inetd.conf должна
присутствовать строка:
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /exports
Последним параметром указан каталог, в котором будет производиться
поиск ядра операционной системы. Все директории и файлы должны быть
доступны на чтение всем.
Если при попытке загрузить клиента, вы получаете сообщение TFTP error 1 (File not found), значит TFTP настроен правильно.
Для настройки ftp отредактируем файл /etc/ftpusers, удалив из него строчку root, что позволит подключаться к серверу по ftp
под именем root из ОС Windows.
4.5. Настройка DNS
Доменом нашей виртуальной сети будет называться private.net. Сервер будет иметь имя server.private.net, а клиенты имена
nodeXX.private.net, где XX - порядковый номер клиента.
Основным конфигурационным файлом DNS сервера является /etc/bind/named.conf. В раздел options этого
фала добавим строку:
listen-on { 192.168.223.2; 127.0.0.1; };
Первый IP адрес - адрес интерфейса eth0. Теперь DNS сервер будет
обрабатывать запросы только с этих адресов. В конец файла добавим
строки:
zone "223.168.192.in-addr.arpa" {
type master;
file "/etc/bind/server.rev";
};
zone "private.net" {
type master;
file "/etc/bind/server.hosts";
};
Далее необходимо создать файлы /etc/bind/server.rev и /etc/bind/server.hosts. Ниже приведены их листинги.
Файл server.rev:
@ IN SOA server.private.net. root.server.private.net. (
2004120420 ; Serial
8H ; Refresh
4H ; Retry
4W ; Expire
1D ) ; Negative Cache TTL
IN NS server.private.net.
2 IN PTR server.private.net.
3 IN PTR node01.private.net.
Файл server.hosts:
@ IN SOA server.private.net. root.server.private.net. (
2004120420 ; Serial
8H ; Refresh
4H ; Retry
4W ; Expire
1D ) ; Negative Cache TTL
IN NS server.private.net.
localhost IN A 127.0.0.1
server IN A 192.168.223.2
node01 IN A 192.168.223.3
На этом настройка сервера DNS закончена. За дополнительной информацией обращайтесь к [4].
4.6. Создание ядра
Компиляция ядра
Стандартное ядро не подходит для загрузки по сети, поэтому необходимо его перекомпилировать.
Перед компиляцией ядра необходимо выяснить конфигурацию оборудования
виртуального сервера. Для этого в Debian можно воспользоваться командой
lspci. Запишем модели IDE, SCSI и Ethernet контроллеров. В VMware 4.0 это Intel Corp.82371AB PIIX4 IDE, BusLogic BT-946C
[MultiMaster 10] и AMD 79c970 [PCnet LANCE] соответственно.
Перейдем в каталог /usr/src и выполним команду
tar --bzip2 -x -f kernel-source-2.4.18.tar.bz2
Теперь зайдем в каталог /usr/src/kernel-source-2.4.18 и выполним команду
make mrproper config
Сейчас необходимо выбрать конфигурацию ядра, отвечая на вопросы.
Все, что может понадобиться до того, как станут доступны сетевые
ресурсы (сетевые карты, поддержка чипсетов, протокола TCP, NFS и т.д.)
необходимо включить в ядро. Дополнительно, необходимо включить
следующие настройки:
- CONFIG_BLK_DEV_LOOP
- CONFIG_BLK_DEV_NBD
- CONFIG_BLK_DEV_RAM (только при подключении корневой файловой системы с RAM диска)
- CONFIG_BLK_DEV_RAM_SIZE = 30720 (только при подключении корневой файловой системы с RAM диска)
- CONFIG_BLK_DEV_INITRD (только при подключении корневой файловой системы с RAM диска)
- CONFIG_PACKET
- CONFIG_FILTER
- CONFIG_IP_PNP
- CONFIG_IP_PNP_DHCP
- CONFIG_NFS_FS
- CONFIG_NFS_V3
- CONFIG_ROOT_NFS (только при подключении корневой файловой системы через NFS)
После завершения настроек скомпилируем ядро командой
make bzImage
Предполагается, что версии установленного и компилируемого ядра
совпадают. Если же это не так, и при компиляции ядра некоторые из опций
были скомпилированы как модули, необходимо командой make modules произвести перекомпиляцию модулей. Подробнее о компиляции ядра
можно узнать в [5].
Подготовка ядра для удаленной загрузки
Чтобы ядро можно было загружать через сеть с помощью Etherboot или
Netboot, оно должно быть специальным образом подготовлено.
Для этого служит программа mknbi, входящая в пакет
mknbi (при создании этого
документа использовалась версия 1.4.4). Поместить ее на сервер можно, подключившись из OC Windows к серверу по ftp.
Для ее установки необходимо распаковать файл с исходными текстами в каталог /usr/src/mknbi-1.4.4 и выполнить
команды
make
mkdir /usr/local/lib/mknbi
cp first32elf* /usr/local/lib/mknbi
Программа имеет несколько параметров, из которых мы рассмотрим четыре:
--format=format Указывает формат выходного файла.
--target=target Указывает тип целевого двоичного кода.
--rootdir=rootdir Задает имя каталога, из которого будет подмонтирована корневая файловая система
--ip=string Позволяет задать IP адреса клиента, сервера, шлюза и маску подсети. Также возможно
указать dhcp или bootp для автоматической настройки с помощью этих протоколов.
Создадим каталог, в котором будет располагаться ядро для удаленной загрузки:
mkdir /exports
Дальнейшие действия зависят от того, каким образом мы будем
подключать коревую файловую систему. Для подключения через NFS
необходимо выполнить команду (предполагается, что корневая файловая
система будет располагаться в каталоге /exports/node01)
./mknbi --format=elf --target=linux --rootdir=/exports/node01 --ip=dhcp /usr/src/kernel-source-2.4.18/arch/i386/boot/bzImage
> /exports/net_boot_kernel
Для варианта с RAM диском команда выглядит несколько иначе:
./mknbi --format=elf --target=linux --rootdir=/dev/ram0
--ip=dhcp /usr/src/kernel-source-2.4.18/arch/i386/boot/bzImage
/initrd/initrd.gz > /exports/net_boot_kernel
О том, как создать файл /initrd/initrd.gz, который содержит образ корневой файловой системы, рассказывается в
п.4.8.
По окончании этого этапа клиентский компьютер уже может загружать ядро. За информацией по mknbi обращайтесь к [6].
4.7. Настройка NFS
Настройка предоставляемых сервером NFS в сетевое использование ресурсов осуществляется с помощью файла /etc/exports.
В нашем примере используем такой файл
/usr node01.private.net(rw,no_root_squash)
/exports node01.private.net(rw,no_root_squash)
/ 192.168.223.4(rw,no_root_squash)
Последняя строка нужна для доступа рабочего виртуального компьютера
(на котором мы будем формировать файловую систему клиента) к серверу и
после создания файловой системы клиента ее необходимо удалить.
Дополнительная информация по настройке NFS доступна в [7].
4.8. Настройка файловой системы для клиента
Для завершения настройки сетевой загрузки необходимо подготовить
файловую систему клиента. Для этого в самом начале нами был создан
третий виртуальный компьютер. Установим на него ОС Debian согласно тем
же рекомендациям, что были даны в п.4.1.
Имеется один нюанс: поскольку мы раздаем IP адреса статически,
прежде, чем новый компьютер сможет получить конфигурацию от DHCP
сервера, необходимо подправить файл /etc/dhcpd.conf. Когда установщик Debian задаст вопрос о конфигурации по DHCP, переключимся на другой
терминал (нажав Alt+F2), выполним команду ifconfig -a и запишем MAC-адрес адаптера. После этого переключимся
в виртуальный компьютер сервера, и отредактируем файл /etc/dhcpd.conf, добавив в раздел group строки:
host work {
hardware ethernet 00:0C:29:03:AB:CA;
fixed-address 192.168.223.4;
}
Во второй строке необходимо указать записанный MAC адрес. Чтобы
изменения вступили в силу, необходимо перезапустить DHCP сервер командой
/etc/init.d/dhcp restart
Можно продолжать установку. Команда для установки пакетов с программным обеспечением теперь будет выглядеть следующим образом:
apt-get install mc portmap
Для варианта с подключением корневой файловой системы по NFS будем пользоваться каталогом /tmp. Для варианта с RAM-диском необходимо
предварительно создать образ RAM-диска. Сделать это можно различными способами. Приведем один из них:
dd if=/dev/zero of=/initrd/initrd bs=1k count=30720
mke2fs -m0 -F /initrd/initrd
mount -t ext2 -o loop /initrd/initrd /mnt
Здесь мы создаем пустой файл объемом 30 Мб, затем формируем в нем файловую систему ext2 и монтируем его как loop устройство в
каталог /mnt, в котором и будем создавать файловую систему.
Процесс создания файловой системы одинаков для обоих вариантов и заключается в следующем:
- Скопируйте каталоги /bin, /dev, /etc, /lib, /sbin целиком;
- Создать каталоги home, root, proc, tmp;
- Создать каталоги usr, usr/bin; скопировать каталог /usr/sbin, скопировать файл expr
в каталог usr/bin;
- Создать каталоги var, var/lock, var/log, var/log/news, var/run, var/tmp,
var/lib; скопировать каталог var/lib/dhcp.
Подправим файл /mnt/etc/fstab. В самом простом виде он может выглядеть так:
/dev/ram0 / ext2 errors=remount-ro 0 1
proc /proc proc defaults 0 0
server.private.net:/usr /usr nfs
Для подключения корневой файловой системы по NFS первую строку необходимо заменить на
server.private.net:/exports/node01 / nfs
Теперь необходимо создать файл /etc/dhclient-enter-hooks, внести в него следующие две строки, чтобы каждый клиент
установил свое имя, полученное от DHCP сервера
echo "$new_host_name" > /etc/hostname
hostname -F /etc/hostname
и сделать этот файл исполняемым:
chmod a+x /etc/dhclient-enter-hooks
Если вы скомпилировали ядро более новой версии, то необходимо в каталог /lib/modules скопировать каталог с перекомпилированными
модулями, а старый каталог удалить.
Если смонтирован файл с RAM диском, его необходимо отключить командой
umount /mnt
а затем выполнить команду
mount -t nfs server.private.net:/ /mnt
для подключения файловой системы сервера в каталог /mnt. Далее, для первого варианта необходимо скопировать содержимое /tmp
в каталог /mnt/exports/node01, а для второго - выполнить команды
gzip -9 /initrd/initrd
cp /initrd/initrd.gz /mnt/initrd
после чего файловую систему сервера необходимо размонтировать, выполнив
umount /mnt
Теперь необходимо присоединить полученный образ к ядру, как описано в конце п.4.6.
Заключение
Итак, мы подробно рассмотрели организацию процесса сетевой загрузки. В примере мы создали только одного клиента, с названием
node01. Для подключения последующих, на сервере в файлы dhcpd.conf, server.rev, server.hosts, exportfs нужно добавить
соответствующие записи. При необходимости можно создать и новую файловую систему, поместив ее в каталог /exports/nodeXX, или
создав новое ядро для удаленной загрузки.
Все вышеописанные действия без каких либо изменений могут быть применены для создания реальной сети из реальных машин.
Литература
- Введение в загрузку по сети и Etherboot
- Installing Debian GNU/Linux 3.0 For Intel x86
- DHCP mini-HOWTO
- DNS HOWTO
- Ставим ядро 2.6, или Ядерная физика для домохозяйки
- Документация по mknbi
- NFS HOWTO
- Загрузка машин по сети
- Удаленная загрузка и Linux: Настройка удаленно
загружаемых рабочих станций с Linux, DOS, Windows 95/98 и Windows NT