PXE boot

Материал из support.qbpro.ru

(рус.)

Авторы: Сергей Черепенин, Игорь Чубин

На данной странице детально описывается процесс загрузки бездисковых 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:


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-сервере.

Tip-icon.png

Если загрузка не выполняется, попробуйте явным образом указать в качестве 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

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

PXE:

LTSP:

Thinstation:

Установка операционной системы через PXE:

Настройка:

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.

В этом примере в загрузке есть три пункта меню:

  1. Ядро 2.4, без использованя framebuffer'а
  2. Ядро 2.6, с использованием framebuffer'а
  3. То же + дополнительный параметр ядру, впоследствии доступный через /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