Вариант создания собственного терминального клиента. (xterm linux dhcp initrd boot diskless pxe)
Ключевые слова: 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
# [email protected]
#
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
1 , andrek (? ), 05:36, 17/11/2004 [ответить ]
+ /–
ссылка http://andrek.ipsp.ru/term/
rdesktop из CVS умеет делать редирект дисков.
для нормальной кодировки необходим патч из sourceforge.net
редирект портов через rdesktop работает только для одной сессии.
для нормального редиректа LPT, можно использовать демон lp_server, создает стандартный сетевой принтер.
для редиректа COM используйте mdmpoold и клиент под windows - npccomm (включает в себя и сервер под windows).