PXE boot
Авторы: Сергей Черепенин, Игорь Чубин
На данной странице детально описывается процесс загрузки бездисковых Linux-станций с помощью PXE, а также рассказывается как с помощью программ проекта LTSP подготовить Linux-систему для использования в качестве сервера загрузки таких станций. Рассматривается процесс настройки всех необходимых компонентов (TFTP, DHCP, NFS-серверов), а также приводятся примеры их конфигурационных файлов.
Что такое PXE?
PXE (англ. Preboot Execution Environment, произносится пикси) — среда для загрузки компьютеров с помощью сетевой карты без использования жёстких дисков, компакт-дисков и других устройств, применяемых при загрузке операционной системы. Для организации загрузки системы в PXE используются протоколы IP, UDP, DHCP и TFTP. PXE-код, прописанный в сетевой карте, получает загрузчик из сети, после чего передаёт ему управление.
Загрузка Linux-системы с использованием PXE
Загрузку Linux-системы с помощью PXE можно выполнить с помощью загрузчика PXELINUX, созданного на базе SYSLINUX. PXELINUX загружается с помощью PXE-кода в сетевой карте, а затем ему передаётся управление. Код PXELINUX не нужно прописывать в чип на сетевой карте (если нужно именно это, см. проект etherboot).
<graphviz> digraph G {
pxe -> dhcp1; dhcp1 -> tftp; tftp -> kernel; kernel -> dhcp2; dhcp2 -> nfs; nfs -> init;
} </graphviz>
- pxe — Загрузка PXE-загрузчика. Прошивкой PXE, встроенной в сетевую карту, выполняется загрузка загрузчика pxelinux.
- dhcp1 — Получение IP-адреса и адреса TFTP-сервера. Загрузчик pxelinux делает DHCP-запрос и с его помощью получает IP-адрес и адрес TFTP-сервера. По умолчанию адрес TFTP-сервера равен адресу DHCP-сервера.
- tftp — Обращение к TFTP-серверу для получения ядра Linux. Загрузчик pxelinux обращается к TFTP-серверу и запрашивает у него ядро Linux (и, при необходимости, образ initrd).
- kernel — Запуск ядра Linux. После того как ядро Linux загружено, управление передаётся ему.
- dhcp2 — Получение IP-адреса DHCP. Ядро Linux делает запрос DHCP, с помощью которого получает свой IP-адрес, адрес NFS-сервера, на котором находится корневая файловая система, а также путь к местоположению этой файловой системы на диске.
- nfs — Монтирование корневой файловой системы. Корневая файловая система монтируется.
- init — Вызов процесса init. На корневой файловой системе находится файл /sbin/init, которому передаётся управление.
Предварительные данные
Сетевые настройки
Сетевые интерфейсы настраиваются автоматически согласно файлу /etc/network/interfaces:
%# cat /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). auto lo eth0 eth1 # The loopback network interface iface lo inet loopback # The primary network interface iface eth0 inet static address 10.0.35.7 netmask 255.0.0.0 network 10.0.0.0 gateway 10.0.35.1 dns-nameservers 10.0.35.1 dns-search unix.nt pre-up iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE post-up echo 1 > /proc/sys/net/ipv4/ip_forward # The secondary network interface iface eth1 inet static address 192.168.15.180 netmask 255.255.255.0 network 192.168.15.0 post-up ifconfig eth1:1 192.168.1.254
Интерфейс eth0 подключен к сети 10.0.0.0/8 и через него осуществляется выход в интернет.
Интерфейс eth1 подключен к сети 192.168.15.0/24, в которую подключаются тонкие клиенты.
Аллиас на интерфейсе eth1 eth1:1 необходим для соединения с терминальным сервером Windows.
Для осуществления возможности выхода в интернет, всем студентам с тонких клиентов настраивается firewall в таблице nat цепочки POSTROUTING (о чем говорит соответствующая строка в конфигурационном файле настройки сетевых интерфейсов):
pre-up iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
Кроме настройки firewall необходимо включить forwarding. Иными словами, необходимо разрешить ядру операционной системы осуществлять проброс трафика с одного интерфейса на другой. Это можно сделать несколькими способами:
1. Строка в файле /etc/network/interfaces
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
Приведённый выше способ годится для ОС Debian/Linux и основанных на нём и может не работать в других ОС.
2. Строка в файле /etc/sysctl.conf
net.ipv4.conf.default.forwarding=1
или
net.ipv4.ip_forward=1
3. Команда
%# sysctl net.ipv4.conf.default.forwarding=1
Но этот способ включения forwarding действует до первой перезагрузки, а для автоматического включения на этапе старта системы необходимо использовать первый или второй методы.
4. Файл /etc/network/options:
См. /usr/share/doc/netbase/README.Debian
ip_forward=yes <-- важна эта строчка spoofprotect=yes syncookies=no
Приведённый выше способ годится для ОС Debian/Linux и основанных на нём и может не работать в других ОС.
5. Команда
echo 1 > /proc/sys/net/ipv4/ip_forward
Подходит к многим (если не всем) Linux, но также как и третий способ (см. выше) работает только до перезагрузки, для чего рекомендуется к помещению в стартовые скрипты. С другой стороны, большинство дистрибутивов предполагают свой способ включить forwarding пакетов и использовать лучше именно его.
Операционная система
%$ uname -a Linux debian 2.6.16-2-486 #1 Sat Jul 15 21:23:01 UTC 2006 i686 GNU/Linux
Инсталляция и настройка DHCP-сервера
Инсталляция DHCP-сервера
Установка DHCP-сервера:
%# apt-get install dhcp . . . NOTE: dhcpd's messages are being sent to syslog. Look there for diagnostics messages. Starting DHCP server: dhcpd failed to start - check syslog for diagnostics.
DHCP-сервер не заработал в базовой конфигурации - смотрим почему:
%# tail /var/log/daemon.log Dec 25 17:27:56 debian rpc.statd[4128]: Version 1.0.10 Starting Dec 25 17:33:43 debian dhcpd: No subnet declaration for eth0 (192.168.15.244). Dec 25 17:33:43 debian dhcpd: Please write a subnet declaration in your dhcpd.conf file for the Dec 25 17:33:43 debian dhcpd: network segment to which interface eth0 is attached. Dec 25 17:33:43 debian dhcpd: exiting.
Анализ лог-файла /var/log/daemon.log говорит, что не описана сеть 192.168.15.0/24. Указанная сеть была определена автоматически, исходя из адреса интерфейса, на котором DHCP-сервер прослушивает запросы. По умолчанию этот интерфейс eth0. Конфигурационный файл dhcpd.conf не содержит описания этой сети.
Ниже мы отредактируем этот файл и опишем в нём названную сеть.
Если бы было нужно чтобы DHCP-сервер работал на другом интерфейсе, нужно отредактировать файл /etc/default/dhcp -- указать нужный интерфейс:
%# vim /etc/default/dhcp INTERFACES="eth1"
Сейчас этого делать не нужно.
Настройка DHCP-сервера
Далее можно приступать к непосредственной настройке DHCP-сервера:
%# vim /etc/dhcp.conf option domain-name "unix.nt"; option domain-name-servers 192.168.15.254; option subnet-mask 255.255.255.0; server-name "ltsp0.unix.nt"; default-lease-time 600; max-lease-time 7200; subnet 192.168.15.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.15.200 192.168.15.220; option subnet-mask 255.255.255.0; option broadcast-address 192.168.15.255; option root-path "192.168.15.244:/opt/ltsp/i386/"; option routers 192.168.15.254; filename "pxelinux.0"; #(если pxelinux.0 не грузится, то правим: filename "ltsp/i386/pxelinux.0";) }
Вы можете ещё указать опцию:
next-server 192.168.15.180; #иначе pxe загрузчик будет пытаться брать pxelinux.0 с этого сервера (там где DHCP)
для того случая, когда TFTP-сервер и DHCP-сервер разные. В противном случае TFTP-сервер ищется на самом DHCP-сервере.
Если загрузка не выполняется, попробуйте явным образом указать в качестве next-server машину, на которой расположен TFTP-сервер и файл pxelinux.cfg/default. |
Конфигурационный файл практически ничем не отличается от файла по умолчанию. Клиентам будут выделяться IP-адреса из диапазона 192.168.15.200-192.168.15.220, указанного в range dynamic-bootp. В качестве DNS-сервера и шлюза используется хост 192.168.15.254.
Опции, имеющие непосредственно отношение к бездисковой загрузке:
- root-path
- filename
Запуск DHCP-сервера
Запуск DHCP-сервера:
# /etc/init.d/dhcp start
Инсталляция и настройка TFTP-сервера
Инсталляция TFTP-сервера
Установите пакет tftpd-hpa (другие TFTP-серверы могут работать некорректно):
%# apt-get install tftpd-hpa Чтение списков пакетов... Готово Построение дерева зависимостей... Готово НОВЫЕ пакеты, которые будут установлены: tftpd-hpa обновлено 0, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено. Необходимо скачать 32,5kБ архивов. После распаковки объем занятого дискового пространства возрастёт на 152kB. Получено:1 http://debian.org.ua etch/main tftpd-hpa 0.43-1 [32,5kB] Получено 32,5kB за 0s (554kB/c) Предварительная настройка пакетов ... Выбор ранее не выбранного пакета tftpd-hpa. (Чтение базы данных... на данный момент установлено 82089 файлов и каталогов.) Распаковывается пакет tftpd-hpa (из файла .../tftpd-hpa_0.43-1_i386.deb)... Настраивается пакет tftpd-hpa (0.43-1) ... tftpd-hpa disabled in /etc/default/tftpd-hpa
Настройка TFTP-сервера
В момент завершения установки нам было сообщено о том, что TFTP-сервер по-умолчанию не работает в режиме демона, а будет запускаться через интернет-суперсервер inetd. Проверим на наличие строки его настройки в конфигурационном файле inetd:
%# grep tftp /etc/inetd.conf tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
Перезапустим интернет суперсервер:
%# /etc/init.d/inetd restart Restarting internet superserver: inetd.
И проверим выполняет ли интернет-суперсервер прослушивание порта 69 (порт TFTP):
%# netstat -lnp | grep :69 udp 0 0 0.0.0.0:69 0.0.0.0:* 7331/inetd
На этом настройка TFTP-сервера завершена.
Я установил TFTP-server (apt-get install tftp-server), который умеет работать в режиме демона, запускается он так:
%# in.tftpd -l -s /var/lib/tftpboot
Настройка pxelinux
- Если вы собираетесь готовить полноценный сервер бездисковой загрузки, переходите к следующему разделу.
Настройка LTSP (Linux Terminal Server Project)
Установка серверной части ltsp
Необходимо установить пакет ltsp-server. В качестве зависимостей от этого компонента, будет скачан и установлен сервер NFS (при условии, что он не был установлен ранее).
%# apt-get install ltsp-server Чтение списков пакетов... Готово Построение дерева зависимостей... Готово Будут установлены следующие дополнительные пакеты: debconf-utils debootstrap esound-clients iproute libatm1 nfs-kernel-server Предлагаемые пакеты: dhcp3-server sdm audiooss Рекомендуемые пакеты: iproute-doc openssh-server ssh nbd-server НОВЫЕ пакеты, которые будут установлены: debconf-utils debootstrap esound-clients iproute libatm1 ltsp-server nfs-kernel-server обновлено 0, установлено 7 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено. Необходимо скачать 660kБ архивов. После распаковки объем занятого дискового пространства возрастёт на 2191kB. Хотите продолжить [Д/н]? Настраивается пакет nfs-kernel-server (1.0.10-4) ... Creating config file /etc/exports with new version Creating config file /etc/default/nfs-kernel-server with new version Starting NFS common utilities: statd idmapd. Exporting directories for NFS kernel daemon.... Starting NFS kernel daemon: nfsd mountd. Настраивается пакет debootstrap (0.3.3.1) ... Настраивается пакет ltsp-server (0.99debian8) ... NOTE: you will probably want to add to /etc/exports: /opt/ltsp *(ro,no_root_squash,async) and then run: invoke-rc.d nfs-kernel-server reload
После установки нам рекомендовано добавить строку
/opt/ltsp *(ro,no_root_squash,async)
в файл экспортирования файловых систем /etc/exports.
Корневая файловая система, которую будут использовать клиенты, находится в подкаталоге каталог /opt/ltsp. Она должна быть доступна через NFS. Можно изменить файл /etc/exports сейчас, а можно позже. Мы изменим позже.
Настройка шлюза
Если нужно чтобы бездисковые клиенты могли получить доступ в Интернет через наш шлюз, необходимо настроить на этом шлюзе iptables и включить forwarding пакетов между интерфейсами.
Добавляем строки в /etc/network/interfaces
post-up iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE post-up echo 1 > /proc/sys/net/ipv4/ip_forward
Создание клиентского образа ltsp
Образ создаётся с помощью скрипта ltsp-build-client. В качестве аргументов скрипту необходимо указать:
- архитектуру, для которой выполняется сборка;
- дистрибутив, на базе которого будет построен образ;
- зеркало, с которого должны инсталлироваться пакеты системы.
В каталог, который будет для бездисковой станции корневым, проинсталлируется дистрибутив etch. В качестве источника пакетов указан локальный apt-proxy. Вместо него нужно указать соответствующее зеркало.
%# ltsp-build-client --arch i386 --dist etch --mirror http://192.168.15.251:9999/debian . . . WARNING: no entry for /opt/ltsp in /etc/exports, you may want to add the following line to /etc/exports: /opt/ltsp *(ro,no_root_squash,async) and then run the command: invoke-rc.d nfs-kernel-server reload info: LTSP client installation completed successfully
Необходимо экспортировать каталог, в котором находится корневая файловая система бездисковых клиентов.
%$ ls -l /opt/ltsp/ итого 4 drwxr-xr-x 20 root root 4096 2006-12-25 18:02 i386 %$ ls /opt/ltsp/i386/ bin dev home lib mnt proc sbin sys usr boot etc initrd media opt root srv tmp var
Рекомендуется делать доступ к файловой системе в режиме read-only, дабы избежать конфликтов при совместном доступе.
Мы для экспериментов сделаем файловую систему доступной в режиме read-write. В режиме нормальной эксплуатации никогда не экспортируйте корневую систему бездисковых станций в режиме read-write, если точно не знаете к каким последствиям это приведёт!
Добавьте в файл /etc/exports строку:
/opt/ltsp/i386 *(rw,no_root_squash,async)
Теперь, необходимо указать nfs-kernel-server демону чтобы он перечитал этот файл:
%# invoke-rc.d nfs-kernel-server reload Re-exporting directories for NFS kernel daemon... exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/opt/ltsp/i386". Assuming default behaviour ('subtree_check'). NOTE: this default will change with nfs-utils version 1.1.0
И проверяем:
%# showmount -e Export list for debian: /opt/ltsp/i386 *
В ходе выполнения команды ltsp-build-client был также создан каталог /var/lib/tftpboot/ltsp/i386/ :
%# ls -l /var/lib/tftpboot/ltsp/i386/ итого 9232 -rw-r--r-- 1 root root 72400 2006-12-04 17:52 config-2.6.18-3-486 lrwxrwxrwx 1 root root 23 2006-12-25 18:05 initrd.img -> initrd.img-2.6.18-3-486 -rw-r--r-- 1 root root 3080263 2006-12-25 18:05 initrd.img-2.6.18-3-486 lrwxrwxrwx 1 root root 20 2006-12-25 18:05 nbi.img -> nbi.img-2.6.18-3-486 -rw-r--r-- 1 root root 4307968 2006-12-25 18:05 nbi.img-2.6.18-3-486 -rw-r--r-- 1 root root 13324 2006-12-25 18:05 pxelinux.0 drwxr-xr-x 2 root root 4096 2006-12-25 18:05 pxelinux.cfg -rw-r--r-- 1 root root 714765 2006-12-05 00:21 System.map-2.6.18-3-486 lrwxrwxrwx 1 root root 20 2006-12-25 18:05 vmlinuz -> vmlinuz-2.6.18-3-486 -rw-r--r-- 1 root root 1218196 2006-12-05 00:21 vmlinuz-2.6.18-3-486
Конфигурационный файл сетевого загрузчика pxelinux находится в pxelinux.cfg/default корневого каталога дистрибутива.
Проверяется не только имя default/
Необходимо создать файл /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default:
В документации сказано, что использование initrd.img необязательно при использовании nfs. На практике же, далеко не всегда получается примонтировать nfs-систему из initrd.img. Желательно предоставить пользователю возможность выбора.
DEFAULT LINUX DISPLAY boot.msg TIMEOUT 30 PROMPT 1 LABEL LINUX KERNEL vmlinuz-2.6.18-6-486 APPEND root=/dev/nfs nfsroot=192.168.15.180:/opt/ltsp/i386/ LABEL LINUX-OLD KERNEL vmlinuz-2.4.34.lan APPEND nfsdir=192.168.15.180:/opt/ltsp/i386/ lang=ru ramdisk_size=100000 (перенос) root=/dev/nfs rw nfsroot=192.168.15.180:/opt/ltsp/i386/ ip=dhcp LABEL LINUX-i KERNEL vmlinuz-2.6.18-6-486 APPEND root=/dev/nfs nfsroot=192.168.15.180:/opt/ltsp/i386/ initrd=initrd.img-2.6.18-6-486 LABEL LINUX-OLD-i KERNEL vmlinuz-2.6.18-6-486 APPEND nfsdir=192.168.15.180:/opt/ltsp/i386/ lang=ru ramdisk_size=100000 (перенос) root=/dev/nfs rw nfsroot=192.168.15.180:/opt/ltsp/i386/ ip=dhcp initrd=initrd.img-2.6.18-6-486
Не забудте создать файл /var/lib/tftpboot/ltsp/i386/boot.msg произвольного содержания. Он будет отображаться при загрузке. Его содержание, например, может быть таким:
netwok boot choose kernel ------------- LINUX LINUX-i LINUX-OLD LINUX-OLD-i
Измените версию ядра и initrd образа, посмотреть какая у Вас версия можно тут: /var/lib/tftpboot/ltsp/i386
Альтернатива LTSP (без привлечения сторонних пакетов)
Данный раздел позволяет создать клоны целевой системы. Данный раздел предоставляет сведения, полученные эмпирическим путём. Он довольно прост и опробован на практике, но не доведён до конца.
Создание "базовой площадки"
Для работы операционки все необходимые файлы можно разбить на 3 категории:
- изменяемые сохраняемые (/home ...);
- изменяемые не сохраняемые (/etc /var/log /var/run ...);
- неизменяемые (все прочие).
Мы создадим "базовую площадку", которая инициализирует файловую систему с учётом вышеописанных принципов. Для упрощения, корневую файловую систему разместим в /ltsp
Для начала экспортируем всё необходимое. Затем возьмём за основу содержимое локального initrd.img. Мы экономить не будем, а поэтому закинем необходимые бинарники, а позже библиотеки к ним. Так же возьмём busybox в качестве шелла — вы сможете использовать /bin/ash в /init для отладочных целей. Так же нам необходима часть его функций для развёртывания. ifconfig нам нужен только для того, чтобы убедится в правильности назначения IP-адреса ядром. С помощью mount.nfs будем монтировать необходимое для работы, т.к. больше ничто не может нормально работать с nfs. Так же нам необходим FIFO-файл initctl в каталоге устройств для "общения" с init'ом.
# mkdir /ltsp; # cat >> /etc/exports /ltsp/ *(ro,no_root_squash,async,no_subtree_check) /usr/ *(ro,no_root_squash,async,no_subtree_check) /var/ *(ro,no_root_squash,async,no_subtree_check) /lib/ *(ro,no_root_squash,async,no_subtree_check) /bin/ *(ro,no_root_squash,async,no_subtree_check) /sbin/ *(ro,no_root_squash,async,no_subtree_check) # /etc/init.d/nfs-server restart # cd /ltsp # gzip -cd /boot/initrd.img | cpio -imd --quiet # cp `which busybox` /ltsp/bin # cp `which ifconfig` /ltsp/bin # cp `which mount.nfs` /ltsp/bin # cp `which init` /ltsp/bin # cd /ltsp/bin # ln -s busybox ash # ln -s busybox ln # ln -s busybox tar # ln -s busybox gunzip # ln -s busybox cat # ln -s busybox mount # ln -s busybox pivot_root # mknod /ltsp/dev/initctl p
Проверить, какие библиотеки используют скопированные бинарники можно командой ldd (ldd /sbin/ifconfig). У меня получилось всего 2:
cp /lib/ld-linux.so.2 /ltsp/lib cp /lib/libc.so.6 /ltsp/lib
/sbin/init запускается первым и остаётся первым всё время. При своём запуске он читает inittab, секцию sysinit. там у нас указано выполнение нашего /init. Это сделано, по большей части, для удобства редактирования.
При загрузке необходимы "свои" конфигурационные файлы. "Выстрелим из бочки" и cнимем копию с рабочей системы скопировав /etc, подправим его. Оригинальный inittab заменит наш файл и загрузка продолжится в исходном режиме. Для уменьшения размеров и ускорения его загрузки по сети, запакуем его и будем распаковывать при каждой загрузке. Так же при загрузке у нас уже, наверняка, будет сконфигурирована сеть, поэтому удалим соответствующие файлы.
# cd /ltsp # echo будте осторожны со следующей командой. не пропустите точку!! # rm -riv ./etc/* # cp /etc/inittab ./etc # cat ./etc/inittab | grep -v 'sysinit' > ./etc/inittab # echo 'si::sysinit:/init' >> ./etc/inittab # mkdir /tmp/ltsp # cp -Rvf /etc /tmp/ltsp/ # cd /tmp/ltsp # rm ./etc/sysconfig/networking/ifcfg-eth0 # rm ./etc/sysconfig/network-scripts/ifcfg-eth0 # echo > ./etc/mtab # tar zcvf /ltsp/etc.tar.gz etc
Конечный результат выглядит так:
# ls -l /ltsp | cut -b 49 bin/ dev/ etc/ etc.tar.gz init* lib/ sbin -> bin/ sysroot/
Далее нам остаётся настроить /init.
После загрузки у нас должна оказаться примонтированная /ltsp в качестве корневой системы, назначен IP-адрес (должна быть досягаема донорная система) и запущен на выполнение /sbin/init, а соответственно и /init.
Т.к. у нас всё изначально ro, то мы создадим временную (tmpfs) rw-систему в /sysroot и будем далее работать уже с ней. Создаём на ней необходимые каталоги для неизменяемых файлов и монтируем соответствующие экспортированные разделы донорной системы. Далее — распаковываем туда наш etc.tar.gz. Копируем туда же каталог с устройствами. После этого, переходим на /sysroot и делаем pivot-root тем самым подменяя файловую систему. После этого монтируем /proc и /sys системы. С этого момента дальнейшая загрузка возможна в теории, но многим программам необходим rw-доступ в определённые места. Есть так же ряд тонкостей, которые необходимо подправить; переменная PATH — одна из них. Нам так же надо привести в соответствие файл /etc/mtab с текущим состоянием системы. В конце файла мы передаём управление скрипту, который подменили собой.
Cодержимое /init :
#!/bin/ash echo Local init running... echo Making rw root #/bin/mount /dev/ram0 /sysroot -t ramfs /bin/mount none /sysroot -t tmpfs echo copying everything necesessary echo Mounting general nodes: for nd in usr lib var bin sbin; do echo $nd mkdir /sysroot/$nd mount.nfs 192.168.0.1:/$nd/ /sysroot/$nd/ -o nolock -n done; echo extracting etc mkdir /sysroot/etc cd /sysroot/ /bin/tar zxf /etc.tar.gz cd / echo Making devs.. mkdir /sysroot/dev cp -R /dev /sysroot echo Swaping roots.. mkdir /sysroot/sysroot cd /sysroot pivot_root . sysroot #/bin/ash echo Making standart actions: mkdir /proc echo Mounting /proc filesystem mount -t proc /proc /proc echo Mounting sysfs mkdir /sys mount -t sysfs none /sys echo Correcting path PATH=/bin:/sbin:$PATH cat /proc/mounts > /etc/mtab mkdir /tmp chmod 777 /tmp mkdir /home mkdir /home/user chown user:user /home/user mount none /var/cache/samba -t tmpfs mkdir /media #echo Spawning shell /bin/bash #/bin/bash #echo Spawning shell /bin/ash #/bin/ash hostname ltsp-1 echo Initrd finished /etc/rc.d/rc.sysinit #/sbin/init 5
Данный метод опробирован на VMWare и Linux Mandiva 2008 DVD. Система загружается и работает, но процесс загрузки всё ещё имеет шероховатости. Завершение работы так же не блещет изяществом.
Если у вас что-либо не получится — можете вынести этот вопрос здесь на страницу обсуждения. Я постараюсь вам ответить.
Подготовка клиентского ядра и initrd
Необходимо подготовить ядро, под управлением которого будут работать клиентские станции.
При конфигурировании клиентского ядра обязательно нужно включить:
- Поддержку сетевой карты
- Поддержку NFS
Ниже будет рассмотренно, как это осуществить
- Поддержка сетевой карты.
Для начала необходимо выяснить, какой модуль ответственнен за сетевую карту. На работающей машине сделайте:
cat /etc/modprobe.conf | grep eth
допустим, мы получили alias eth0 pcnet32. После этого, нам необходимо выяснить, как она включается в ядро.
find /usr/src/linux/ | grep pcnet32
Так мы узнаем, в каком каталоге лежат файлы, ответственные за модуль. Для драйверов сетевых карт это
/usr/src/linux/drivers/net
Осталось только узнать define-variable для модуля.
cat /usr/src/linux/drivers/net/Makefile | grep pcnet32
В выводе будет что-то похожее на CONFIG_PCNET32. Далеко не у всех модулей имя define-variable совпадает с именем модуля. Осталось только
cd /usr/src/linux make menuconfig
и, используя клавишу [/], ввести то, что после CONFIG_. Месторасположение нам укажут. Можно, конечно, вручную поправить файл .config, но так можно нарушить зависимости. Итак, сетевые карта включаются в Device Drivers -> Network Device Support -> Ethernet (10 or 100Mbit). Как ни странно, pcnet32 оказался AMD PCNet32 PCI support.
- Поддержка NFS
File Systems -> Netwok File Systems -> NFS file system support
- Поддержка функций dhcp ядром
Networking -> Network Options -> IP: kernel level avtoconfiguration
и соответствующие протоколы к нему (bootp и DHCP, хотя, возможно, будет достаточно только второго). Подразумевается, что TCP/IP-стек будет включён в ядро. Это очень важный момент. Без этой функции ядро сразу после загрузки высвободит выделенный айпи адрес и предоставить насройку пользователю (в initrd, например), а так же ядро будет игнорировать параметр ip=dhcp. В этой ситуации поможет только явное указание адреса, что будет пригодно для загрузки только одной машины (или обязывает к немедленной смене адреса после загрузки). IP-адрес можно указать так: ip=клиент:сервер:шлюз:маска:имя:устройство, но согласитесь, ip=dhcp лучше. Кроме того, в File Systems -> Network File Systems появится не менее важный пункт:
Root file system on NFS
Заодно можно выставить оптимизацию под конкретный процессор и отключить неиспользуемые модули. Например IrDA, BlueTooth или IDE-через-LPT.
Пример конфигурационного файла можно скачать здесь.(где здесь ?) При такой конфигурации ядра initrd не используется.
В том случае, если какой-либо из необходимых для загрузки и монтирования корневой файловой системы, драйвер нельзя (или не хочется) по какой-либо причине включить в ядро, необходимо подготовить виртуальный загрузочный диск initrd.
Если бездисковый клиент будет загружать не только ядро Linux, но и initrd, нужно сделать соответствующие изменения в конфигурационном файле pxelinux.cfg/:
%# vi pxelinux.cfg/default
Дополнительная информация
- [1] (рус.) — обсуждение страницы на OpenNet
- Настройка и использование RIS-linux (рус.)
- Установка Windows XP по сети. RIS, но не Microsoft (рус.) — сетевая установка Windows без использования RIS-сервера от Microsoft
- Walkthrough: Deploy an Image by Using PXE (англ.) — установка Windows 7/Windows 2008 по PXE
PXE:
- Спецификация PXE (pdf)
- PXE на en.wikipedia.org
- rom-o-matic.net - коллекция PXE-образов
- PXELINUX на сайте SYSLINUX
- PXE Magic: Flexible Network Booting with Menus (англ.) — подробная статья, которая рассказывает как делать красивые менюшки при загрузке по PXE
LTSP:
- Linux Terminal Server Project
- LTSP.RU - Linux TERMINAL SERVER Project (Russia) - использование Linux на бездисковых рабочих станциях - сдох ресурс.
- Linux Terminal Server Project на en.wikipedia.org
- Linux Terminal Server Project на ru.wikipedia.org
Thinstation:
- Конструктор Thinstation (рус.)
Установка операционной системы через PXE:
- http://forum.ixbt.com/topic.cgi?id=7:20166-18 - Обсуждение на iXBT
Настройка:
- http://xgu.ru/l3/users/devi/ltsp-installation/ltsp0.unix.nt/root - журнал инсталляции LTSP-сервера
system-config-netboot - утилита от Red Hat, подготавливающая операционные системы (любой линукс) для загрузки бездисковых станций с терминального сервера (аналог LTSP, только без ручного труда) http://www.rhd.ru/docs/manuals/enterprise/RHEL-4-Manual/sysadmin-guide/ch-diskless.html
Материалы на Xgu.ru посвящённые загрузке системы
Приложения
Конфигурационные файлы
/etc/dhcp.conf
option domain-name "unix.nt"; option domain-name-servers 192.168.15.254; option subnet-mask 255.255.255.0; server-name "ltsp0.unix.nt"; default-lease-time 600; max-lease-time 7200; subnet 192.168.15.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.15.200 192.168.15.220; option subnet-mask 255.255.255.0; option broadcast-address 192.168.15.255; option root-path "192.168.15.244:/opt/ltsp/i386/"; option routers 192.168.15.254; filename "pxelinux.0"; }
/etc/exports
Фрагмент файла.
# ... /opt/ltsp/i386/ *(rw,no_root_squash,async)
Вместо rw, лучше использовать ro, в противном случае возможны ошибки при совместном доступе.
/etc/inetd.conf
Фрагмент файла.
# ... tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot/ltsp/i386/ # ...
/var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
Пример конфигурационного файла PXELINUX.
В этом примере в загрузке есть три пункта меню:
- Ядро 2.4, без использованя framebuffer'а
- Ядро 2.6, с использованием framebuffer'а
- То же + дополнительный параметр ядру, впоследствии доступный через /proc/cmdline
DISPLAY boot.msg TIMEOUT 300 PROMPT 1 LABEL 1 KERNEL vmlinuz-2.4.34.lan APPEND root=/dev/nfs rw nfsroot=192.168.15.244:/opt/ltsp/i386/ ip=dhcp LABEL 2 KERNEL vmlinuz-2.6.19.2 APPEND root=/dev/nfs rw nfsroot=192.168.15.244:/opt/ltsp/i386/ ip=dhcp vga=792 LABEL 3 KERNEL vmlinuz-2.6.19.2 APPEND root=/dev/nfs rw nfsroot=192.168.15.244:/opt/ltsp/i386/ ip=dhcp vga=792 rescue-ata-flash
Скрипты
/home/rdp/.xsession
SERVER=192.168.1.2 USER=user while true do LANG=C rdesktop -a24 -f -u $USER $SERVER done