ДЕНИС КОЛИСНИЧЕНКО
Загрузка по сети
Многие современные материнские платы позволяют загружать операционную систему не только с жесткого диска или дискеты, но и по сети. Причем загружаться по сети «умеют» компьютеры как со встроенными сетевыми адаптерами, так и обладающие внешними сетевыми карточками.
В этой статье мы рассмотрим, как загрузить операционную систему Linux по сети. Многие дистрибутивы позволяют устанавливать операционную систему по сети. Однако не нужно путать установку по сети и загрузку по сети. В первом случае вы загружаетесь с системной дискеты, а дальше программа установки просто копирует все необходимые ей файлы, находящиеся, как правило, на каком-то FTP-сервере, на ваш компьютер. В случае с загрузкой по сети файлы не копируются на ваш компьютер, а загружаются по сети при необходимости. Сначала загружается ядро системы (мы говорим о Linux), а потом необходимые ему файлы – корневая файловая система (с использованием NFS). Данный способ позволяет нам использовать бездисковые станции. Если вам нужна «служебная» бездисковая станция, которая будет выполнять только определенные задачи, например, принт-сервера или шлюза, можно вовсе отказаться от NFS, а загружать все сразу – и ядро, и корневую файловую систему – лишь бы оперативной памяти хватило.
Примечание: NFS (Network File System) – сетевая файловая система. Позволяет монтировать файловые системы, находящиеся на удаленных компьютерах.
Наверное, вы знаете, что существуют так называемые NFS-дистрибутивы, которые также позволяют хранить все необходимые файлы на NFS-сервере. Но NFS-дистрибутив нельзя использовать на бездисковых станциях. Как минимум для запуска такого дистрибутива на рабочей станции должен быть установлен обычный дисковод для гибких дисков. Загрузчик LILO (или любой другой) загружается с дискеты, затем вы передаете ему несколько параметров, как минимум два:
- root=/dev/nfs – сообщает ядру, что мы будем использовать загрузку по NFS;
- nfsroot – указывает путь к корневой файловой системе в формате:
[<server_ip>:]<root_dir>[,<nfs_options>]
Как видите, ядро знает, что корневая файловая система загружается по NFS. Сейчас мы попробуем сделать так, чтобы ядро даже «не заметило», что оно загружается по сети. Для этого мы будем использовать серверы rarp (Reverse Address Resolution Protocol) и tftp (Trivial File Transfer Protocol). Сервер rarp мы будем использовать для того, чтобы сопоставить MAC-адрес бездисковой станции определенному IP-адресу нашей локальной сети. Сервер tftp будет хранить наш загрузочный образ, о котором мы поговорим немного позже.
Теперь приступим к практической реализации. Для начала сопоставим MAC-адрес бездисковой станции IP-адресу нашей сети. Как я уже говорил, для этого будем использовать сервер rarp, который должен быть установлен на вашей системе.
/sbin/rarp –s 192.168.1.117 00:00:a1:77:e5:c9
Данную команду нужно включить в сценарий загрузки вашей системы, чтобы не вводить ее вручную при каждом запуске. Проблему идентификации нашей станции можно решить и по-другому – с помощью DHCP. Для этого в файле конфигурации /etc/dhcpd.conf нужно прописать директиву host для каждой бездисковой станции:
host net_pc1{
hardware ethernet 00:00:a1:77:e5:c9
fixed-address 192.168.1.117
}
Как определить MAC-адрес сетевой платы? Для этого существует много программ, но целесообразнее использовать стандартные программы, которые всегда есть под рукой: в Linux – это ifconfig, а в Windows – winipcfg (рис. 1).
Рисунок 1. Программа winipcfg
Ядру Linux нужно будет передать параметр ip, определяющий настройки IP-интерфейса. В общем случае он выглядит так:
ip=::::::
Как это сделать, вы узнаете чуть позже, а пока рассмотрим несколько примеров:
- Мы используем протокол BOOTP:
ip=::::net_pc1::bootp
- Мы используем сервер rarp:
ip=::::net_pc1::rarp
- Мы указываем статический IP-адрес 192.168.1.117:
ip=192.168.1.117:192.168.1.1:192.168.1.1:255.255.255.0:net_pc1:eth0:
Сервер BOOTP можно с успехом заменить сервером DHCP, однако с небольшими изменениями в файле конфигурации. Пример файла конфигурации будет приведен в конце статьи. Имя net_pc1 должно быть прописано в файле /etc/hosts или сервере DNS:
192.168.1.117 net_pc1.domain.ru net_pc1
Теперь можно приступить к настройке сервера tftp. Установите сервер tftp. После установки в каталоге /etc/xinetd.d появится специальный файл, содержащий параметры запуска сервиса tftp. Вы можете отредактировать их по своему усмотрению, после чего нужно перезапустить сервис xinetd:
service xinetd restart
Если же у вас до сих пор используется устаревший суперсервер inetd, в файл /etc/inetd.conf нужно добавить следующую строку (или раскомментировать ее, если она уже есть):
tftp dgram udp wait root /bin/in.tftpd in.tftpd –s /tftp
Как обычно, нужно перезапустить сервис inetd, чтобы изменения вступили в силу. В каталог /tftp нужно поместить тот самый образ, содержащий ядро и базовую корневую файловую систему.
Вот теперь самое время поговорить об образе и о тех файлах, которые он должен содержать. Начнем, пожалуй, с ядра. Перекомпилируйте ядро, включив в него поддержку сети, файловой системы ext2 и Initial RAM disk support (секция Block devices). Все остальное отключайте по максимуму – ведь мы же не хотим передавать вместе с ядром несколько мегабайт дополнительных модулей. Если у вас одна бездисковая станция, возможно, такой режим работы не скажется на функционировании всей сети, но попробуем представить, что таких станций у нас десять и все они включаются одновременно… Можно даже отключить поддержку модулей – все, что нужно, вы поместите в ядро. Такое ядро не будет компактным, но с одним файлом вам будет проще работать.
После того, как ядро будет откомпилировано, желательно проверить его работоспособность – запишите его на дискету и загрузитесь с нее:
cat bzImage > /dev/fd0
rdev /dev/fd0 /dev/hda1
rdev –v /dev/fd0 –1
rdev –R /dev/fd0 1
rdev –r /dev/fd0 0
Команда rdev используется в случае, если ядро и корневая файловая система находятся на разных дисках. В нашем случае ядро – на дискете, а файловая система – на жестком диске (раздел /dev/hda1). Если загрузка прошла успешно, значит, ваше ядро вполне работоспособно и его можно использовать.
Самое сложное – еще впереди. Вам нужно самостоятельно подготовить набор файлов корневой файловой системы, то есть создать свой небольшой дистрибутив.
Подробнее о создании микродистрибутивов вы можете прочитать:
- в статье Всеволода Стахова «Создание загрузочных дискет и CD-дисков Linux», которая была опубликована в июньском номере «Системного администратора»;
- в статье «Изготовление мульти-загрузочного CD-диска» (http://gazette.linux.ru.net);
- на моем сайте http://dkws.narod.ru.
Конечно, всегда можно пойти по пути наименьшего сопротивления и использовать уже готовый микродистрибутив, помещающийся на одной – двух дискетах. Такой дистрибутив очень легко найти в сети. Конкретный дистрибутив советовать не буду, поскольку выбор зависит от выполняемых им функций.
Кроме ядра и файловой системы Linux, наш образ должен содержать загрузчик Linux: кто-то ведь должен передать параметры ядру Linux (вы еще не забыли о параметре ip?). Подойдет любой загрузчик, который в состоянии справиться с возложенной на него задачей – передачей параметров ядру. Если файл образа уже готов, можно записать загрузчик прямо в него – Linux все равно с чем работать – с файлом или устройством. Вот конфигурационный файл lilo.conf:
boot=/tftp/net.img
prompt
timeout=50
compact
vga=normal
read-only
image=/vmlinuz
label=linux
append=" ip=::::nfs-client::bootp"
Когда ваш образ будет полностью готов, запишите его в каталог /tftp и можно попробовать запустить бездисковую станцию (не забудьте в SETUP включить загрузку по сети). Не получается? Тогда переименуем файл образа следующим образом:
ln –sf net.img C0A80175.I586
Откуда взялось такое страшное имя? Все очень просто: IP-адрес бездисковой станции записывается в шестнадцатиричном формате, все точки игнорируются. Затем через точку записывается код архитектуры бездисковой станции (прописными буквами). Код архитектуры можно узнать, выполнив команду arch… на бездисковой станции. А как же ее выполнить – ведь там нет операционной системы? Тогда просто попробуйте угадать – это несложно. Скорее всего, у вас будет установлен процессор фирмы Intel или совместимый с ним, значит, первая буква кода будет I. Затем следует код процессора – 386, 486, 586 (Pentium), 686 (Pentium II, Celeron).
Вот сейчас все должно быть нормально. Во всяком случае, ядро системы должно загрузиться по сети. Если возникнет ошибка во время загрузки системы, то это означает только одно – вы где-то допустили ошибку при «сборке» собственного микродистрибутива.
Обычно бездисковые станции используются в качестве служебных компьютеров, например, маршрутизаторов или шлюзов. А что делать, если вам нужна полноценная рабочая станция, скажем, X-терминал, за которым днями и ночами должны работать пользователи (например, вы создаете малобюджетное интернет-кафе)? Тогда наш загрузочный образ должен содержать только ядро и загрузчик без файловой системы. Загрузчик должен передать ядру следующие параметры:
root=/dev/nfs nfsroot=192.168.1.1:/exports/nfs
192.168.1.1 – это IP-адрес сервера NFS.
В файле /etc/exports указываются экспортируемые файловые системы:
/exports/nfs (ro)
/exports/nfs-rw (rw)
/mnt/cdrom net_pc1(ro)
Первая строка означает, что экспортируется файловая система /exports/nfs и доступ к ней в режиме «только чтение» (read only – ro) получат все компьютеры. К файловой системе /exports/nfs-rw также получат доступ все компьютеры, но в режиме «чтение-запись». К CD-ROM получит доступ только компьютер net_pc1.
Как и обещал, привожу небольшой фрагмент файла конфигурации /etc/dhcpd.conf, позволяющего серверу DHCP работать в режиме BOOTP:
subnet 192.168.1.0 255.255.255.0 {
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.1.1;
# Если вы не укажете директиву dynamic-bootp, ваш DHCP-сервер не будет работать в режиме BOOTP
range dynamic-bootp 192.168.1.100 192.168.1.200
}
host net_pc1{
hardware ethernet 00:00:a1:77:e5:c9
fixed-address 192.168.1.117
}
Все ваши вопросы и комментарии к статье буду рад выслушать по адресу: dhsilabs@mail.ru
Ссылки:
- Пакет Bootkit, предназначенный для создания загрузочных дисков: ftp://sunsite.unc.edu/pub/Linux/system/Recovery
- Очень много ссылок на микродистрибутивы Linux: http://www.linuxlinks.com
- Много программ для создания загрузочных дисков: http://www.ibiblio.org/pub/Linux/system/recovery
- Сайт http://dkws.narod.ru – много полезной документации по Linux, в том числе документы Howto на русском языке.