Вариант создания собственного терминального клиента. (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 #
Данный адрес e-mail защищен от спам-ботов, Вам необходимо включить Javascript для его просмотра.
# 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
источник: http://www.kumanov.com/software/terminal_client.html
|