2 <META HTTP-EQUIV="Content-Type" "text/html; charset=utf-8">
3 <META NAME="DESCRIPTION" CONTENT="Описание как сделать NFS-рут для
4 X-терминала минимальных размеров используя дистрибутив Debian
6 <TITLE>Creating diskless X-terminal with Debian etch</TITLE>
8 <H1>Создание бездискового X-терминала с помощью Debian etch</h1>
10 В состав Debian etch входят пакеты ltsp-server и ltsp-utils, специально
11 предназначенные для создания тонких клиентов. Но мне что-то получившаяся
12 "тонкость" не понравилась.
15 Поэтому я пошел другим путем
18 Сначала я честно попытался воспользоваться debootstrap, но как
19 выяснилось, зависимости у требуемых для X-терминала пакетов такие,
20 что ой. Получится не меньше, чем у ltsp.
23 А мне в итоге удалось уложиться в 28Мб. Тоже много, но уже если
24 захочется, можно вместо сетевой загрузки ненужную 32Мб CF-ку на IDE
27 <h2>Постановка задачи</h2>
29 Имеется система, содержащая видеокарту, сетевую карту с PXE-bootrom,
30 звуковую карту, флоповод и немножко памяти (у меня - 64 мб).
31 Хочется чтобы эта штука превратилась в полноценное рабочее место, где
32 можно работать с приложениями, в том числе и работающими со звуком,
33 читать дискеты и USB-флэшки.
36 Для этого нам нужно чтобы на этой системе запустились X-сервер, nasd
37 (желающие могут разработать вариант с PulseAudio или esd), и два floppyd
38 - один на дисковод, другой на устройство /dev/sda1.
41 <h2>Последовательность действий:</h2>
43 Сначала собираем ядро с помощью kernel-package. В пакет. Ядро собираем
44 без initrd, со всеми нужными модулями сетевых карт и поддержкой NFS-root
45 внутри. В смысле <b>NFS-клиент не должен быть модулем</b>. Иначе
46 NFS-root не включится.
48 Звук и поддержку USB можно модулями. USB нам нужна ради
49 usb-storage, чтобы можно было втыкать флэшки в терминал и их читать с
50 помощью mtools. Кроме того, может оказаться полезным использовать
51 внешнюю USB-аудиокарту
54 Берем набор следующий пакетов (некоторые зависимости будут
55 неудовлетворены, но для нужной нам функциональности хватит)
60 modutils (это если с ядром 2.4. Если 2.6, то module-init-tools)
79 xserver-xorg-video-ati <i>(это у меня ati. У вас может быть другое. В
80 принципе, installed-size у драйверов маленький, можете хоть все
82 xserver-xorg-input-kbd
83 xserver-xorg-input-mouse
84 xserver-xorg-input-evdev
87 Выбираем некоторую директорию (у меня /var/diskless), откуда это дело
88 будет раздаваться по NFS.
91 Распаковываем туда перечисленынные пакеты c помощью
94 dpkg-deb -х пакет директория
97 Никакие postinst скрипты не выполняются, но в данном случае
98 нетривиальных postinst-скриптов и нет. Вместо этого делаем следующее
101 # chroot /var/diskless /bin/busybox sh
102 / # mount -t proc none /proc
103 / # busybox --install
108 Вы, наверное, удивитесь: "А где же пакет xkb-data". А нету. Мы будем запускать xkbcomp с хоста, при логине из .xsession. Таким образом у каждого юзера может быть собственная раскладка клавиатуры.
111 Теперь надо дополнительно создать файл
112 <tt>/var/diskless/etc/X11/Xwrapper.config</tt>
113 (я не мудрствуя лукаво скопировал его с хоста),
114 создать симлинк <tt>/var/diskless/etc/X11/X</tt>, ведущий на
115 <tt>/usr/bin/Xorg</tt> (ага,
116 именно со слэшом вначале). Большие эстеты могут создавать его зайдя в
117 chroot и запустив там busybox-овский шелл, но я и так обошелся,
118 создать директории /dev /tmp и /var/log и населить dev соответствующими
119 специальными файлами. У меня там
121 audio dsp0 mem port sda1 sda13 sda3 sda7 tty1 tty5
122 audio0 fd0 mixer psaux sda10 sda14 sda4 sda8 tty2 tty6
123 console full mixer0 random sda11 sda15 sda5 sda9 tty3 urandom
124 dsp kmem null sda sda12 sda2 sda6 tty0 tty4 zero
127 В принципе, часть tty можно поотрывать, да и разделы sda кроме sda1 не
131 Кладем xorg.conf в /etc/X11 (у него должен быть единственный элемент
132 font-path, указывающий на фонт-сервер) и имеем практически готовую
133 систему, за исключением init.
135 Если у нас несколько терминалов, которым нужны разные конфигурации x-ов,
136 то описываем в xorg.conf несколько секций ServerLayout с
137 идентификаторами, соответствущими именам хостов (которые будут потом
138 розданы по dhcp как option host-name).
141 Вместо init кладем шелловский скрипт следующего содержания:
144 <font face="monospace">
145 <font color="#8080ff">#!/bin/sh</font><br>
146 <font color="#00ffff">PATH</font>=/bin:/sbin:/usr/bin:/usr/sbin<br>
147 <font color="#aaaa00">export</font> PATH<br>
148 respawn<font color="#aaaa00">()</font> <font color="#ff40ff">{</font><br>
149 <font color="#aaaa00">(</font>while true<font color="#aaaa00">;</font> <font color="#aaaa00">do</font><br>
150 <font color="#ff40ff">$1</font><br>
151 sleep <font color="#ff6060">5</font><br>
152 <font color="#aaaa00">done</font><font color="#aaaa00">)</font> <font color="#aaaa00">&</font><br>
153 <font color="#ff40ff">}</font><br>
154 <font color="#aaaa00">echo</font><font color="#ff6060"> -n loading modules</font><br>
155 <font color="#aaaa00">for</font> i <font color="#aaaa00">in</font> usbcore uhci usb-storage opl3sa2<font color="#aaaa00">;</font> <font color="#aaaa00">do</font><br>
156 modprobe <font color="#ff40ff">$i</font> <font color="#aaaa00">&&</font> <font color="#aaaa00">echo</font><font color="#ff6060"> -n </font><font color="#aaaa00">"</font><font color="#ff6060"> </font><font color="#ff40ff">$i</font><font color="#aaaa00">"</font><br>
157 <font color="#aaaa00">done</font><br>
158 <font color="#aaaa00">echo</font><font color="#ff6060"> </font><font color="#aaaa00">"</font><font color="#ff6060">.</font><font color="#aaaa00">"</font><br>
159 <font color="#aaaa00">echo</font><font color="#ff6060"> starting portmapper</font><br>
160 /sbin/portmap -v -d <font color="#aaaa00">&</font><br>
163 <font color="#aaaa00">echo</font><font color="#ff6060"> mounting all filesystems</font><br>
165 mount /proc/bus/usb<br>
166 mount -t ramfs none /tmp</br>
169 <font color="#aaaa00">echo</font><font color="#ff6060"> -n starting floppyd</font><br>
170 floppyd -r root -d /dev/fd0<font color="#aaaa00">&&</font> <font color="#aaaa00">echo</font><font color="#ff6060"> -n </font><font color="#aaaa00">"</font><font color="#ff6060"> floppy</font><font color="#aaaa00">"</font><font color="#ff6060"> </font><br>
171 floppyd -r root -s <font color="#ff6060">5704</font> /dev/sda1<font color="#aaaa00">&&</font> <font color="#aaaa00">echo</font><font color="#ff6060"> -n </font><font color="#aaaa00">"</font><font color="#ff6060"> flash</font><font color="#aaaa00">"</font><br>
172 <font color="#aaaa00">echo</font><font color="#ff6060"> .</font><br>
175 dmesg > /var/log/dmesg.$hostname.log
176 respawn <font color="#aaaa00">"</font><font color="#ff6060">nasd -aa</font><font color="#aaaa00">"</font><br>
177 respawn <font color="#aaaa00">"</font><font color="#ff6060">X -query wagner.wagner.home -logfile /var/log/Xorg.$HOSTNAME.log -layout $HOSTNAME</font><font color="#aaaa00">"</font><br>
178 <font color="#aaaa00">wait</font><br>
181 Теперь получившуюся директорию надо раздать по NFS с опциями
183 и можно настраивать собственно загрузку.
184 <h2>Настройка X-ов</h2>
185 <p>Как можно было заметить выше, X-серверу на терминале передается опция
186 "-layout $HOSTNAME", позволяющая задать свою конфигурацию X-ов для
187 каждого терминала.</p>
189 Соответственно, в <tt>/var/diskless/etc/X11/xorg.conf</tt> должна
190 присутствовать секция ServerLayout с идентификатором, соответствующем
193 Section "ServerLayout"
195 Screen "xterm5-screen"
196 InputDevice "Generic Keyboard"
197 InputDevice "USB Mouse"
200 и соответствующая секция Screen
203 Identifier "xterm5-screen"
204 Device "FoxConOnboard"
211 <h2>Настройрка загрузки</h2>
213 Ставим на хост пакеты syslinux, dhcp3-server и tftp-hpa. В командную строку
214 tftp-hpa нужно добавить опцию -r blksize, потому что у некоторых PXEboot
215 ROM проблемы с этой опцией.
218 /usr/lib/pxelinux.0 и ядро из /var/diskless/boot копируем в
222 Создаем директорию /var/lib/ftpboot/pxelinux.cfg и помещаем туда файл
223 default следующего содержания:
225 DEFAULT term root=/dev/nfs ip=dhcp rw
227 KERNEL vmlinuz-2.4.27-terminals
231 позволяет искать конфигурационный файл по IP-адресу или mac-адресу, а
232 через этот файл можно (в виде непонимаемых ядром опций командной строки,
233 которые потом можно скриптом извлечь из /proc/cmdline) передать много
234 такого, что не вписывается в DHCP. Но у меня пока в этом необходимости
238 Сделать ядро, которое грузится нормально на терминалах с очень разным
239 железом - вполне реально, а все последующее можно сконфигурировать из
240 init-скрипта опираясь на hostname.
243 В dhcpd.conf пишем раздел host для терминала. (если терминалов много,
244 можно написать один раздел group, но это уж читайте документацию на
245 pxelinux и dhcpd сами)
249 hardware ethernet xx:xx:xx:xx:xx:xx;
250 fixed-address 192.168.217.5;
251 option host-name "xterm3";
252 next-server 192.168.217.1;
253 option domain-name "wagner.home";
254 filename "pxelinux.0";
255 option root-path "/var/diskless";
260 Главное, не забыть команду next-server, потому что если PXE BootRom прекрасно обходится без неё, то pxelinux почему-то начинает тащить свой файл конфигурации и ядро с адреса 0.0.0.0.
263 Теперь ставим xfs, отрываем у него из конфига no-listen = tcp,
264 и разрешаем обслуживание терминалов в display manager. В xdm для этого необходимо закоментарить строчку
266 DisplayManager.requestPort: 0
268 в xdm-config и раскоментарить строчку
270 * # any host can get a login window
275 Готово, можно грузиться.
278 Научиться получать aдрес фонт-сервера и адрес хоста, передаваемого в опцию query по dhcp (опции font-server и x-display-manager)
280 Для этого надо пересобрать busybox включив там встроенный dhcp-клиент, и
281 немного попатчить этот клиент, поскольку эти опции он из коробки не