]> www.wagner.pp.ru Git - sites/home_page.git/blob - hints/etch-x-term.html
Ссылка на html Ясмины
[sites/home_page.git] / hints / etch-x-term.html
1 <HTML><HEAD>
2 <META HTTP-EQUIV="Content-Type" "text/html; charset=utf-8">
3 <META NAME="DESCRIPTION" CONTENT="Описание как сделать NFS-рут для
4 X-терминала минимальных размеров используя дистрибутив Debian
5 etch">
6 <TITLE>Creating diskless X-terminal with Debian etch</TITLE>
7 </HEAD><BODY>
8 <H1>Создание бездискового X-терминала с помощью Debian etch</h1>
9 <p>
10 В состав Debian etch входят пакеты ltsp-server и ltsp-utils, специально
11 предназначенные для создания тонких клиентов. Но мне что-то получившаяся
12 "тонкость" не понравилась. 
13 </p>
14 <p>
15 Поэтому я пошел другим путем
16 </p>
17 <p>
18 Сначала я честно попытался воспользоваться debootstrap, но как
19 выяснилось, зависимости у требуемых для X-терминала пакетов такие,
20 что ой. Получится не меньше, чем у ltsp.
21 </p>
22 <p>
23 А мне в итоге удалось уложиться в 28Мб. Тоже много, но уже если
24 захочется, можно вместо сетевой загрузки ненужную 32Мб CF-ку на IDE
25 прицепить.
26 </p>
27 <h2>Постановка задачи</h2>
28 <p>
29 Имеется система, содержащая видеокарту, сетевую карту с PXE-bootrom,
30 звуковую карту, флоповод и немножко памяти (у меня - 64 мб).
31 Хочется чтобы эта штука превратилась в полноценное рабочее место, где
32 можно работать с приложениями, в том числе и работающими со звуком,
33 читать дискеты и USB-флэшки.
34 </p>
35 <p>
36 Для этого нам нужно чтобы на этой системе запустились X-сервер, nasd
37 (желающие могут разработать вариант с PulseAudio или esd), и два floppyd
38 - один на дисковод, другой на устройство /dev/sda1.
39 </p>
40
41 <h2>Последовательность действий:</h2>
42 <p>
43 Сначала собираем ядро с помощью kernel-package. В пакет. Ядро собираем
44 без initrd, со всеми нужными модулями сетевых карт и поддержкой NFS-root
45 внутри. В смысле <b>NFS-клиент не должен быть модулем</b>. Иначе
46 NFS-root не включится. 
47 </p><p>
48 Звук и поддержку USB можно модулями. USB нам нужна ради
49 usb-storage, чтобы можно было втыкать флэшки в терминал и их читать с
50 помощью mtools. Кроме того, может оказаться полезным использовать
51 внешнюю USB-аудиокарту
52 </p>
53 <p>
54 Берем набор следующий пакетов  (некоторые зависимости будут
55 неудовлетворены, но для нужной нам функциональности хватит)
56 </p>
57 <pre>
58 libc6
59 busybox
60 modutils (это если с ядром 2.4. Если 2.6, то module-init-tools)
61 libwrap0
62 portmap
63 nfs-common
64 x11-common
65 libxt6
66 libice6
67 libsm6
68 libx11-6
69 libaudio2
70 libxau6
71 nas
72 floppyd
73 libfontenc1
74 libgcc1
75 libxfont1
76 zlib1g
77 libfreetype6
78 xserver-xorg-core
79 xserver-xorg-video-ati <i>(это у меня ati. У вас может быть другое. В
80 принципе, installed-size у драйверов маленький, можете хоть все
81 засобачить)</i>
82 xserver-xorg-input-kbd
83 xserver-xorg-input-mouse
84 xserver-xorg-input-evdev
85 </pre>
86 <p>
87 Выбираем некоторую директорию (у меня /var/diskless), откуда это дело
88 будет раздаваться по NFS.
89 </p>
90 <p>
91 Распаковываем туда перечисленынные пакеты c помощью 
92 </p>
93 <pre>
94 dpkg-deb -х пакет директория
95 </pre>
96 <p>
97 Никакие postinst скрипты не выполняются, но в данном случае
98 нетривиальных postinst-скриптов и нет. Вместо этого делаем следующее
99 </p>
100 <pre>
101 # chroot /var/diskless /bin/busybox sh
102 / #  mount -t proc none /proc
103 / #  busybox --install
104 / #  ldconfig
105 / #  exit
106 </pre>
107 <p>
108 Вы, наверное, удивитесь: "А где же пакет xkb-data". А нету. Мы будем запускать xkbcomp с хоста, при логине из .xsession. Таким образом у каждого юзера может быть собственная раскладка клавиатуры.
109 </p>  
110
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 специальными файлами. У меня там
120 <pre>
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
125 </pre>
126 <p>
127 В принципе, часть tty можно поотрывать, да и разделы sda кроме sda1 не
128 нужны.
129 </p>
130 <p>
131 Кладем xorg.conf в /etc/X11 (у него должен быть единственный элемент
132 font-path, указывающий на фонт-сервер) и имеем практически готовую
133 систему, за исключением init.
134 <p>
135 Если у нас несколько терминалов, которым нужны разные конфигурации x-ов,
136 то описываем в xorg.conf несколько секций ServerLayout с
137 идентификаторами, соответствущими именам хостов (которые будут потом
138 розданы по dhcp как option host-name).
139 </p>
140 <p>
141 Вместо init  кладем шелловский скрипт следующего содержания:
142 </p>
143
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>&nbsp;PATH<br>
148 respawn<font color="#aaaa00">()</font>&nbsp;<font color="#ff40ff">{</font><br>
149 &nbsp;&nbsp;&nbsp;&nbsp;<font color="#aaaa00">(</font>while true<font color="#aaaa00">;</font>&nbsp;<font color="#aaaa00">do</font><br>
150 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff40ff">$1</font><br>
151 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep <font color="#ff6060">5</font><br>
152 &nbsp;&nbsp;&nbsp;&nbsp;<font color="#aaaa00">done</font><font color="#aaaa00">)</font>&nbsp;&nbsp;<font color="#aaaa00">&amp;</font><br>
153 <font color="#ff40ff">}</font><br>
154 <font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;-n loading modules</font><br>
155 <font color="#aaaa00">for</font>&nbsp;i <font color="#aaaa00">in</font>&nbsp;usbcore uhci usb-storage opl3sa2<font color="#aaaa00">;</font>&nbsp;<font color="#aaaa00">do</font><br>
156 &nbsp;&nbsp;&nbsp;&nbsp;modprobe <font color="#ff40ff">$i</font>&nbsp;<font color="#aaaa00">&amp;&amp;</font>&nbsp;<font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;-n </font><font color="#aaaa00">&quot;</font><font color="#ff6060">&nbsp;</font><font color="#ff40ff">$i</font><font color="#aaaa00">&quot;</font><br>
157 <font color="#aaaa00">done</font><br>
158 <font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;</font><font color="#aaaa00">&quot;</font><font color="#ff6060">.</font><font color="#aaaa00">&quot;</font><br>
159 <font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;starting portmapper</font><br>
160 /sbin/portmap -v -d <font color="#aaaa00">&amp;</font><br>
161 /sbin/rpc.statd<br>
162 /sbin/rpc.lockd<br>
163 <font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;mounting all filesystems</font><br>
164 mount /proc<br>
165 mount /proc/bus/usb<br>
166 mount -t ramfs none /tmp</br>
167 chmod 1777 /tmp</br>
168 <br>
169 <font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;-n starting floppyd</font><br>
170 floppyd -r root -d /dev/fd0<font color="#aaaa00">&amp;&amp;</font>&nbsp;<font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;-n </font><font color="#aaaa00">&quot;</font><font color="#ff6060">&nbsp;floppy</font><font color="#aaaa00">&quot;</font><font color="#ff6060">&nbsp;</font><br>
171 floppyd -r root -s <font color="#ff6060">5704</font>&nbsp;/dev/sda1<font color="#aaaa00">&amp;&amp;</font>&nbsp;<font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;-n </font><font color="#aaaa00">&quot;</font><font color="#ff6060">&nbsp;flash</font><font color="#aaaa00">&quot;</font><br>
172 <font color="#aaaa00">echo</font><font color="#ff6060">&nbsp;.</font><br>
173 <br>
174 HOSTNAME=`hostname`
175 dmesg &gt; /var/log/dmesg.$hostname.log
176 respawn <font color="#aaaa00">&quot;</font><font color="#ff6060">nasd -aa</font><font color="#aaaa00">&quot;</font><br>
177 respawn <font color="#aaaa00">&quot;</font><font color="#ff6060">X -query wagner.wagner.home -logfile /var/log/Xorg.$HOSTNAME.log -layout $HOSTNAME</font><font color="#aaaa00">&quot;</font><br>
178 <font color="#aaaa00">wait</font><br>
179 </font>
180
181 Теперь получившуюся директорию надо раздать по NFS с опциями 
182 rw,no_root_squash
183 и можно настраивать собственно загрузку.
184 <h2>Настройка X-ов</h2>
185 <p>Как можно было заметить выше, X-серверу на терминале передается опция
186 "-layout $HOSTNAME", позволяющая задать свою конфигурацию X-ов для
187 каждого терминала.</p>
188 <p>
189 Соответственно, в <tt>/var/diskless/etc/X11/xorg.conf</tt> должна
190 присутствовать секция ServerLayout с идентификатором, соответствующем
191 имени терминала.
192 <pre>
193 Section "ServerLayout"
194         Identifier "xterm5"
195         Screen "xterm5-screen"
196         InputDevice "Generic Keyboard"
197         InputDevice "USB Mouse"
198 EndSection
199 </pre>
200 и соответствующая секция Screen
201 <pre>
202 Section "Screen"
203         Identifier "xterm5-screen"
204         Device "FoxConOnboard"
205         Monitor "Roverscan"
206         DefaultDepth 16
207         ...
208 </pre>  
209
210
211 <h2>Настройрка загрузки</h2>
212 <p>
213 Ставим на хост пакеты syslinux, dhcp3-server и tftp-hpa. В командную строку
214 tftp-hpa нужно добавить опцию -r blksize, потому что у некоторых PXEboot
215 ROM проблемы с этой опцией.
216 </p>
217 <p>
218 /usr/lib/pxelinux.0 и ядро из /var/diskless/boot копируем в
219 /var/lib/tftpboot.
220 </p>
221 <p>
222 Создаем директорию /var/lib/ftpboot/pxelinux.cfg и помещаем туда файл
223 default следующего содержания:
224 <pre>
225 DEFAULT term root=/dev/nfs ip=dhcp rw
226 LABEL term
227 KERNEL vmlinuz-2.4.27-terminals
228 </pre>
229 <p>
230 pxelinux
231 позволяет искать конфигурационный файл по IP-адресу или mac-адресу, а
232 через этот файл можно (в виде непонимаемых ядром опций командной строки,
233 которые потом можно скриптом извлечь из /proc/cmdline) передать много
234 такого, что не вписывается в DHCP. Но у меня пока в этом необходимости
235 не возникло.
236 </p>
237 <p>
238 Сделать ядро, которое грузится нормально на терминалах с очень разным
239 железом - вполне реально, а все последующее можно сконфигурировать из
240 init-скрипта опираясь на hostname.
241 </p>
242 <p>
243 В dhcpd.conf пишем раздел host для терминала. (если терминалов много,
244 можно написать один раздел group, но это уж читайте документацию на
245 pxelinux и dhcpd сами)
246 </p>
247 <pre>
248       host xterm3 {
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";
256
257       }
258 </pre>
259 <p>
260 Главное, не забыть команду next-server, потому что если PXE BootRom прекрасно обходится без неё, то pxelinux почему-то начинает тащить свой файл конфигурации и ядро с адреса 0.0.0.0.
261 </p>
262 <p>
263 Теперь ставим xfs, отрываем у него из  конфига no-listen = tcp,
264 и разрешаем обслуживание терминалов в display manager. В xdm для этого необходимо закоментарить строчку 
265 <pre>
266 DisplayManager.requestPort: 0 
267 </pre>
268 в xdm-config и раскоментарить строчку 
269 <pre>
270 * # any host can get a login window
271 </pre>
272 в Xaccess.
273 </p>
274 <p>
275 Готово, можно грузиться.
276 </p>
277 <h2>TBD</h2>
278 Научиться получать aдрес фонт-сервера и адрес хоста, передаваемого в опцию query по dhcp (опции font-server и x-display-manager)   
279 <p>
280 Для этого надо пересобрать busybox включив там встроенный dhcp-клиент, и
281 немного попатчить этот клиент, поскольку эти опции он из коробки не
282 умеет.
283
284 </BODY>
285 </HTML>