Вариант создания собственного терминального клиента. (xterm linux dhcp initrd boot diskless pxe)


From: Андрей <sandysandy at rambler.ru>
Newsgroups: opennews
Date: Mon, 27 Apr 2004 14:31:37 +0000 (UTC)
Subject: Вариант создания собственного терминального клиента.

Оригинал: http://andrek.ipsp.ru/

            Вариант создания собственного терминального клиента.

1. Ядро, минимум опций которые я использовал:

   - тип процессора 386
   - Networking support
   - шина PCI
   - тип бинарников ELF
   - RAM диск
   - initrd

   Сетевые опции
    - packet socket
    - socket filtering
    - unix domain sockets
    - tcp networking
    - ip kernel level autoconfiguration
    - ip dhcp support

   Драйвера сетевых адаптеров
   - Virtual terminal
   - Support for console on virtual terminal
   - Standart generic serial port
   - Mouse support
   - PS/2 mouse
   - /proc file system support
   - second extended fs support
   - vga text console

2. В сети настроены и работают сервисы dhcp и dns.

   Так же необходимы работающие сервер шрифтов xfs и tftp для загрузки
   образа ядра по сети.

   Дополнительная настройка dhcpd.conf, добавляем параметры:

       allow booting;
       allow bootp;
       filename "pxelinux.0";

   Файл pxelinux.0 берется из пакета syslinux.
   Настройка xfs сводится к закоментированию параметра no-listen = tcp в
   файле /etc/X11/fs/config и перезапуска сервиса.
   Этапы процесса загрузки:

   - инициализация PXE
   - подключение к DHCP
   - загрузка загрузка pxelinux.0 чтение конфига и загрузка ядра и образа initrd
   - инициализация сетевого интерфейса
   - монтирование root фс
   - запуск /sbin/init
   - запуск скрипта инициализации rc.sysinit (http://andrek.ipsp.ru/rc.sysinit)
       * монтирование /proc
       * установка hostname (term-ip address)
       * определение системных параметров через /proc/cmdline
       * генерация  /etc/resolv.conf
       * определение видеокарты через /proc/pci
       * генерация /etc/X11/XF86Config
       * запуск X + rdesktop


3. Образ корневой фс собран на базе RedHat72, glibc-2.2.4.

   Стандартный набор XFree86 был слишком раздут. Пришлось собирать, в
   исходниках был только XFree86-4.4.0.

   Использовался host.def

       #define LinuxDistribution LinuxRedHat
       #define XF86CardDrivers nv sis s3 s3virge trident via vesa
       #define DefaultCCOptions -O2 -mcpu=i386 -march=i386
       #define BuildFontServer no
       #define BuildFonts no
       #define BuildXKB no
       #define BuildDPMS no
       #define BuildServersOnly yes

   При компиляции, пару раз вылетало с ошибками, но достаточно
   заккоментировать строки с номерами ошибок, там в основном определения
   которые мы запретили.

   Cобрано со следующими драйверами (nv, riva128, s3, s3virge, sis,
   trident, via, vesa)

   Так же присутствует поддержка мыши и PS/2 и COM1.
   Поддержка сетевых адаптеров, выбирается при сборке ядра исходя из
   потребностей.

   Загрузить образ можно здесь http://andrek.ipsp.ru/initrd.gz (4 Mb).
   Посмотреть список всех файлов (http://andrek.ipsp.ru/list.txt).

   Следующие опции определены:

   NSERVER - ip адрес DNS сервера в сети, по умолчанию 192.168.1.100
   DOMAIN  - домен, по умолчанию domain
   XFSERVER - сервер шрифтов, по умолчанию xfs.$DOMAIN
   TSERVER - сервер терминалов, по умолчанию tserver.$DOMAIN
   VIDEODRIVER - принудительное выставление драйвера
   HSYN - параметр HorizSync, по умолчанию "31-55"
   VREF - параметр VertRefresh, по умолчанию "50-160"
   MODES - разрешение экрана, по умолчанию "800x600"

   Настройка PXE загрузчика сводится к определению файла для каждого
   сетевого адреса либо default.

   Пример 1.
   файл tftpboot/pxelinux.cfg/default

   label linux
   kernel bzImage
   append ramdisk_size=11000 initrd=initrd.gz root=/dev/ram0 NSERVER=192.168.1.1 DOMAIN=runet.ru
   ipappend 1

   Пример 2.
   файл tftpboot/pxelinux.cfg/С0A801B4 для клиента с адресом 192.168.1.180

   label linux
   kernel bzImage
   append ramdisk_size=11000 initrd=initrd.gz root=/dev/ram0 NSERVER=192.168.1.1 DOMAIN=runet.ru MODES=1024x768 HSYN=31-57 VREF=55-190
   ipappend 1

   С успехом загружался и работал на клиенте с 24Мб оперативной памяти.
   В собственном варианте добавил загрузку smbd и доступ по сети к
   дисководу.

   Вопросы и рекомендации можно отправлять на icq 62270603.

   Иркутск. 2004г.


rc.sysinit: #!/bin/sh # # Terminal Linux # sandysandy@rambler.ru # echo -n "Mounting /proc filesystem..." mount -t proc /proc /proc mount -o remount,rw / echo "Ok" CONFIG='/etc/X11/XF86Config' if [ "`cat /proc/cmdline | grep NSERVER`" ]; then NSERVER="`cat /proc/cmdline | sed 's/.* NSERVER=\(\S*\) .*/\1/'`" else NSERVER='192.168.1.100' fi if [ "`cat /proc/cmdline | grep DOMAIN`" ]; then DOMAIN="`cat /proc/cmdline | sed 's/.* DOMAIN=\(\S*\) .*/\1/'`" else DOMAIN='domain' fi if [ "`cat /proc/cmdline | grep TSERVER`" ]; then TSERVER="`cat /proc/cmdline | sed 's/.* TSERVER=\(\S*\) .*/\1/'`" else TSERVER="tserver.$DOMAIN" fi echo $TSERVER > /etc/TSERVER if [ "`cat /proc/cmdline | grep TSERVER`" ]; then XFSERVER="`cat /proc/cmdline | sed 's/.* XFSERVER=\(\S*\) .*/\1/'`" else XFSERVER="xfs.$DOMAIN" fi # resolv.conf cat > /etc/resolv.conf << EOF search $DOMAIN nameserver $NSERVER EOF # up localhost /sbin/ifconfig lo 127.0.0.1 up /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo # up hostname A="`ifconfig eth0 | grep inet | cut -d: -f2 | cut -d' ' -f1 | cut -d. -f4`" HOSTNAME="term-$A" echo "Setting up hostname - $HOSTNAME" hostname $HOSTNAME VGA="`cat /proc/pci | grep VGA`" echo 'Configure XFree86 Server' echo -n ' Detecting video card - ' if [ "`echo $VGA | grep -i virge`" ]; then echo 'found S3 Virge driver.' VIDEODRIVER=s3virge elif [ "`echo $VGA | grep -i savage`" ]; then echo 'found S3 Savage driver.' VIDEODRIVER=savage elif [ "`echo $VGA | grep -i trio`" ]; then echo 'found S3 Trio driver.' VIDEODRIVER=s3 elif [ "`echo $VGA | grep -i trident`" ]; then echo 'found Trident driver.' VIDEODRIVER=trident elif [ "`echo $VGA | grep -i sis`" ]; then echo 'found SIS driver.' VIDEODRIVER=sis elif [ "`echo $VGA | grep -i via`" ]; then echo 'found VIA driver.' VIDEODRIVER=via elif [ "`echo $VGA | grep -i nvidia`" ]; then echo 'found Nvidia driver.' VIDEODRIVER=nv else echo 'not found. Use default - Vesa driver.' VIDEODRIVER=vesa fi if [ "`cat /proc/cmdline | grep VIDEODRIVER`" ]; then VIDEODRIVER="`cat /proc/cmdline | sed 's/.* VIDEODRIVER=\(\S*\) .*/\1/'`" fi if [ "`cat /proc/cmdline | grep MODES`" ]; then MODES="`cat /proc/cmdline | sed 's/.* MODES=\(\S*\) .*/\1/'`" else MODES="800x600" fi if [ "`cat /proc/cmdline | grep HSYN`" ]; then HSYN="`cat /proc/cmdline | sed 's/.* HSYN=\(\S*\) .*/\1/'`" else HSYN="31-55" fi if [ "`cat /proc/cmdline | grep VREF`" ]; then VREF="`cat /proc/cmdline | sed 's/.* VREF=\(\S*\) .*/\1/'`" else VREF="50-160" fi # XF86Cofig cat > $CONFIG << EOF Section "Files" FontPath "tcp/$XFSERVER:7100" RgbPath "/usr/X11R6/lib/X11/rgb" EndSection Section "ServerLayout" Identifier "Default Layout" Screen 0 "Screen0" 0 0 InputDevice "Mouse0" "CorePointer" InputDevice "Mouse1" "AlwaysCore" InputDevice "Keyboard0" "CoreKeyboard" EndSection Section "InputDevice" Option "XkbDisable" Identifier "Keyboard0" Driver "keyboard" EndSection Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "IntelliMouse" Option "Device" "/dev/ttyS0" EndSection Section "InputDevice" Identifier "Mouse1" Driver "mouse" Option "Protocol" "IMPS/2" Option "Device" "/dev/psaux" Option "ZAxisMapping" "4 5" Option "Emulate3Buttons" "no" EndSection Section "Monitor" Identifier "Monitor0" HorizSync $HSYN VertRefresh $VREF EndSection Section "Device" Identifier "Videocard0" Driver "$VIDEODRIVER" EndSection Section "Screen" Identifier "Screen0" Device "Videocard0" Monitor "Monitor0" DefaultDepth 16 SubSection "Display" Depth 16 Modes "$MODES" EndSubSection EndSection EOF