терминальное решение на базе LTSP и Windows 2003 Terminal Server

о терминальном решении

Говорят, что история развивается по спирали. Другие же утверждают, что она вовсе движется по кругу. Так или иначе, но история терминальных решений довольно любопытна — IT-технологии, казалось, окончательно ушли от меинфреймов в сторону персональных компьютеров в начале девяностых, но вот теперь опять возвращаются к ним. Через 15 лет.

Терминальные решения имеют множество недостатков перед архитектурой ПК. Это и меньшая гибкость, и жесткая зависимость от центрального сервера, повышенные требования к надежности сети, обязательна необходимость дублирования основных сервисов. Но в тоже время они обеспечивают повышенную безопасность, простоту администрирования, высокий уровень контроля системы. А в ряде случаев позволяют и существенно экономить на ПО. Рассматриваемое решение комбинирует использование проприетарного и открытого программного обеспечения. Использование Linux в качестве терминальных клиентов позволяет существенно сэкономить на программном обеспечении и повысить надежность решения. Ни для кого не секрет, что решения на базе Unix являются более надежными, чем на базе Windows. В тоже время, использование в качестве серверной операционной системы Windows 2003 TS избавляет нас от сложностей с совместимостью программного обеспечения, обучением пользователей и пр. — ваши пользователи работают в родной для них среде, даже не догадываясь, что на их терминальных машинах запущен Линукс.

краткая схема используемого решения

Решение основывается на трех составляющих:

- терминальный сервер с Windows 2003 Terminal Server;

- Linux-сервер, на котором запущены DHCP, NFS, TFTP и хранится образ системы LTSP;

- бездисковые терминальные станции с возможностью загрузки по сети.

Я не буду подробно останавливаться на особенностях настройки Windows 2003 Terminal Server. По данной тематике написано немало статей, да и сама настройка довольно тривиальна. Рекомендую лишь внимательно отнестись к аппаратному обеспечению — хот-свап блоки питания, оперативная память с ECC выбирается из расчета — не меньше 512 Мб оперативной памяти под систему и 64 Мб оперативной памяти на каждого пользователя, обслуживаемого сервером, RAID-массивы с быстрыми дисками. Также обращаю ваше внимание на особенности лицензирования программного обеспечения Microsoft — версия Windows 2003 Server Standard Edition допускает использование от 1 до 4 процессоров и не более 4 Гб оперативной памяти. Версия Enterprise Edition поддерживает до 64 Гб в 32-битной версии, и до 2 Тб в 64х.

Линукс-часть состоит из сервера, на котором запущены демоны DHCP, NFS, TFTP и хранится загружаемый терминалом образ Линукса. В принципе, его можно создать и самостоятельно, но гораздо удобнее использовать готовую систему — Linux Terminal Server Project (LTSP).

Терминальный клиент загружается по сети: получает по DHCP IP-адрес, загружает по TFTP ядро Linux, монтирует по NFS образ корневой файловой системы, загружает ramdisk, запускает графическую подсистему xwindow и стартует терминальный клиент rdesktop, с помощью которого подсоединяется к Windows 2003 Terminal Server.

настройка Linux-сервера – DHCP

Для загрузки ваших клиентских станций по сети необходимо наличие DHCP-сервера. DHCP-сервер выделяет IP-адреса для терминалов, передает параметры загрузки и сообщает путь к образу ядра ОС. Рекомендуется, чтобы этим DHCP-сервером был сервер Linux или Unix. В вашей сети могут существовать другие DHCP-серверы, например, от ADSL-рутера или какого-либо сетевого устройства. Чтобы исключить конфликт DHCP-серверов, рекомендую оставить один главный DHCP-сервер. Однако, если это невозможно, то придется цеплять ваш новый DHCP-сервер на альтернативный порт, например, 1067, и передавать загрузчику в параметрах ядра новый порт. В такой схеме раздачей IP-адресов будет заниматься один DHCP-сервер, а передачей ядра и параметров загрузки — другой. Эта схема возможна, но неудобна, так что в общем случае рекомендую оставить один DHCP-сервер.

Инсталируем DHCP-сервер. Скачиваем исходники с http://www.isc.org/index.pl?/sw/dhcp/, конфигурируем, собираем и ставим.

Переходим к файлу конфигурации, /etc/dhcp/dhcpd.conf , вносим, при необходимости, изменения.

Файл конфигурации DHCP-сервера - /etc/dhcp/dhcpd.conf.

# Глобальные настройки
not authoritative;
default-lease-time 28800; # 8 часов
max-lease-time 86400; # 1 день
use-host-decl-names on; # Задавать hostname клиента
ddns-update-style none; # Сособ обновления динамического DNS
# Сетевые настройки
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.99; # Шлюз по умолчанию
option domain-name-servers 192.168.0.99; # Наш сервер
option log-servers 192.168.0.99; # Сервер remote logging
option nntp-server 192.168.0.99; # time server
next-server 192.168.1.2; # TFTP сервер
# Настройки загрузки
boot-unknown-clients false; # Запретить загрузку неизвстных клиентов
allow booting;
allow bootp;
# Настройки PXE
option option-128 code 128 = string;
option option-129 code 129 = text;
option option-128 e4:45:74:68:00:00; # magic value
# Describe workstations
shared-network LTSPCLIENTS {
option domain-name “ltsp.works.kamrock.com”; # Имитация доменного имени для ltsp клиентов
option root-path “192.168.0.99:/opt/ltsp-4.2/i386"; # NFS путь к корню образа ltsp клиента
if substring (option vendor-class-identifier, 0, 9) = “PXEClient” {
filename “/pxe/pxelinux.0"; # PXE bootrom
}
else if substring (option vendor-class-identifier, 0, 9) = “Etherboot” {
filename “/lts/vmlinuz-2.6.17.8-ltsp-1"; # Etherboot kernel
}
subnet 192.168.0.0 netmask 255.255.255.0 {
# Диапазон IP адресов для DHCP
range 192.168.0.30 192.168.0.90;
group DESKTOP {
host ws001 {
hardware ethernet 00:0C:29:72:48:44;
fixed-address 192.168.0.30;
}
host ws002 {
hardware ethernet 00:15:F2:60:18:67;
fixed-address 192.168.0.31;
}
host ws003 {
hardware ethernet 00:17:31:4B:35:45;
fixed-address 192.168.0.32;
}
}
# group LIBRARY {
# # Пример для альтернативного DHCP порта 1067 (Etherboot)
# host ws100 {
# hardware ethernet 00:C0:4F:AD:5C:BC;
# fixed-address 10.0.0.100;
# option option-129 “DPORT=1067";
# }
# # support for DHCP port 1067 & slow 3Com ISA NIC
# host ws101 {
# hardware ethernet 00:60:08:5C:CB:BE;
# fixed-address 10.0.0.101;
# option option-129 “DPORT=1067 NIC=3c509 MOPTS=nolock,ro,wsize=2048,rsize=2048";
# }
# another client with a slow ISA NIC
# host ws102 {
# hardware ethernet 00:C0:4F:AD:5D:55;
# fixed-address 10.0.0.102;
# group LAB {
# # trick to use, when there are two conflicting DHCP servers
# # and the dumb one is authoritative
# host ws103 {
# hardware ethernet 00:C0:4F:AD:5D:55;
# fixed-address 10.0.0.103;
# option option-129 “nfsroot=10.0.0.11:/opt/ltsp/i386";
#
# }
# }
}
}


Запускаем dhcp:

~ # /etc/init.d/dhcpd start
* Starting dhcpd … [ ok ]


и проверяем его работу — запускаем загрузку прописанного в настройках DHCP клиента по сети.

При этом мы должны получить примерно такую картину:

Network boot from AMD Am79C970A
Copyright (c) 2003-2005 VMware, Inc.
Copyright (c) 1997-2000 Intel Corporation
CLIENT MAC ADDR: 00 0C 29 72 48 44 GUID: 564D4E8E4-08DF-DAC3-A4C3-BDF5F9724844
CLIENT IP: 192.168.0.30 MASK: 255.255.255.0 DHCP IP: 192.168.0.99
GATEWAY IP: 192.168.0.99
PXE-E32: TFTP open timeout


Она зависит от типа используемого адаптера, но смысл один — клиент получает от DHCP-сервера IP-адрес и производит неудачную попытку загрузить ядро по TFTP. Это означает, что DHCP-сервер настроен и работает.

настройка Linux-сервера – TFTP

При загрузке LTSP-клиент получает образ ядра от сервера с помощью протокола TFTP. Соответственно, необходимо установить некий TFTP-сервер. Существует несколько реализаций TFTP под Unix. Я остановился на tftp-hpa. Есть еще atftp - по сути то же самое.

У tftp-hpa есть один неприятный баг, по крайней мере, в использованной версии 0.48 и более ранних. При наличии нескольких сетевых интерфейсов он намертво цепляется к первому, несмотря на опции запуска. Причем цепляется таким образом, что принимает соединение и на тот интерфейс на который забинден, но отправлять пакеты хочет только от первого интерфейса. Чувствуете разницу? Фактически по телнету ошибки не будет, но ядро не перешлется.

Имейте это в виду — баг не фатальный, можно использовать и второй интерфейс для раздачи TFTP, но крови попьет он массу — клиент просто не будет загружаться, несмотря ни на что.

Так что биндим сразу при запуске TFTP на первый интерфейс:

-u nobody -s -a 192.168.1.2:69 /tftpboot

и в настройках DHCP в директиве

next-server 192.168.1.2;

прописать IP-адрес первого сетевого адаптера для TFTP-сервера.

Кроме того, необходимо открыть порт 69 udp на вашем файрволле, если он у вас есть.

Все готово, запускаем tftpd:

~ # /etc/init.d/in.tftpd start
* Starting tftpd … [ ok ]


И заново пробуем загрузить LTSP-клиента:

Network boot from AMD Am79C970A
Copyright (c) 2003-2005 VMware, Inc.
Copyright (c) 1997-2000 Intel Corporation
CLIENT MAC ADDR: 00 0C 29 72 48 44 GUID: 564D4E8E4-08DF-DAC3-A4C3-BDF5F9724844
CLIENT IP: 192.168.0.30 MASK: 255.255.255.0 DHCP IP: 192.168.0.99
GATEWAY IP: 192.168.0.99
PXELINUX 2.13 2004-12-14 Copyright (C) 1994-2004 H. Peter Anvin
UNDI data segment at: 0009C7F0

Could not find kernel image: bzImage-2.6.17.8-ltsp-1
boot:


Делаем вывод — DHCP работает, TFTP работает. Приступаем к настройке LTSP.

настройка Linux-сервера – LTSP

Метод инсталляции LTSP достаточно примечателен. Первым делом идем на ltsp.org и утягиваем пакет ltsp-utils.

Запускаем ltspadmin, выбираем “Install/Update LTSP Packages”, выделяем все объекты и нажимаем “Q”. Инсталятор скачивает нужные пакеты из сети и копирует их в /opt/ltsp-версия.

После инсталяции скрипт возвращает нас в основное меню. Выбираем “Configure LTSP”. Если при этом вываливаются какие-либо ошибки в тесте, игнорируем их.

Дальше выполняем:

# [c]
# [8]
# [enter]
# [10]
# [enter]
# [11]
# [enter]
# [q]
mkdir /tmp/{mnt,var}
cd /opt/
ln -s ltsp-${VER} ltsp
cd /tftpboot/
mv pxelinux.cfg/ pxe/
ln -s pxe/pxelinux.cfg pxelinux.cfg


и выходим из скрипта инсталятора.

Переходим к настройке LTSP. Основным файлом с настройками LTSP является /opt/ltsp/i386/etc/ltsp.conf:

#————————————————————
# It test
#————————————————————
[ws001]
SCREEN_01 = rdesktop -k ru -f 192.168.0.97
SERVER = 192.168.0.99
XSERVER=auto
X_MODE_0 = 1024Ч768
X_MOUSE_PROTOCOL=”PS/2"
X_MOUSE_DEVICE=”/dev/psaux”
X_MOUSE_RESOLUTION=200
X_MOUSE_BUTTONS=3
X_COLOR_DEPTH=16
#————————————————————
# IT Dima
#————————————————————
[ws002]
SCREEN_01 = rdesktop -k ru -f 192.168.0.97
SERVER = 192.168.0.99
XSERVER = auto
PRINTER_0_DEVICE = /dev/usb/lp0
PRINTER_0_TYPE = U
XF86CONFIG_FILE = X86Config.Samsung710N
X_MOUSE_PROTOCOL = “ImPS/2"
X_MOUSE_DEVICE = “/dev/input/mice”
X_MOUSE_RESOLUTION=200
X_MOUSE_BUTTONS=3
X_COLOR_DEPTH=16


Все прозрачно. Секции начинаются с имени конфигурируемого LTSP-клиента.

Первая строка — открываемая сессия. Мы запускаем rdesktop, включаем русскую раскладку клавиатуры и соединяемся с терминальным сервером 192.168.0.97 в полноэкранном режиме. Дальше идут параметры иксов — разрешение, тип используемой мыши, разрешение отклика мыши, глубина цветности. Для первого клиента используем мышь PS/2, для второго USB. Если вы не знаете, какой тип мыши на машине клиента — перечислите оба. Кроме того, для второго клиента мы определили, что подключаем локальный USB-принтер, а настройки исков прописаны в отельном файле
X86Config.Samsung710N. Об этом подробнее немного позже, когда я дойду до описания локальных устройств терминального клиента.

Добавляем нужное число секций по числу клиентов.

Кроме этого, не забываем отразить добавленного клиента в /etc/dhcp/dhcpd.conf в секции group DESKTOP:

host ws001 {
hardware ethernet 00:0C:29:72:48:44;
fixed-address 192.168.0.30;
}


А также добавить строчку в /etc/hosts:

192.168.0.30 ws001.works.kamrock.com ws001

Проверяем работу. Снова запускаем нашего несчастного LTSP-клиента и получаем картину сливочным маслом:

Network boot from AMD Am79C970A
Copyright (c) 2003-2005 VMware, Inc.
Copyright (c) 1997-2000 Intel Corporation
CLIENT MAC ADDR: 00 0C 29 72 48 44 GUID: 564D4E8E4-08DF-DAC3-A4C3-BDF5F9724844
CLIENT IP: 192.168.0.30 MASK: 255.255.255.0 DHCP IP: 192.168.0.99
GATEWAY IP: 192.168.0.99
PXELINUX 2.13 2004-12-14 Copyright (C) 1994-2004 H. Peter Anvin
UNDI data segment at: 0009C7F0

Mounting root filesystem: /opt/ltsp-4.2/i386 from: 192.168.0.99
mount: RPC: Unable to receive; errno = Connection refused
mount: nfsmount failed: Bad file descriptor
mount: Mounting 192.168.0.99:/opt/ltsp-4.2/i386 on /newroot/nfsroot failed: Inva
lid argument
ERROR! Failed to mount the root directory via NFS!
Possible reasons include:
1) NFS services may not be running on the server
2) Workstation IP does not map to a hostname, either
in /etc/hosts, or in DNS
3) Wrong address for NFS server in the DHCP config file
4) Wrong pathname for root directory in the DHCP config file
Kernel panic — not syncing: Attempted to kill init!


настройка Linux-сервера –NFS

После загрузки ядра LTSP-клиент пытается подмонтировать файловую систему с образом системы клиента. Для этого необходимо установить и настроить сервер NFS.

Скачиваем и настраиваем nfs-utils. Подробно на этой части останавливаться не буду, в сети много примеров. Да и никаких багов на этом этапе замечено мною не было.

После инталяции выполняем следущее:

~ # mkdir -p /var/opt/ltsp/swapfiles
~ # vim /etc/exports


Правим /etc/exports:

# NFS file systems being exported. See exports(5).
/opt/ltsp-4.2/i386 192.168.0.99/255.255.255.0(ro,async,subtree_check)
/var/opt/ltsp/swapfiles 192.168.0.99/255.255.255.0(rw,async,subtree_check)


Кроме того, если у вас есть фаервол, вам необходимо произвести ряд действий для настройки портов, по которым работает NFS.

Запускаем и тестируем:

~ # /etc/init.d/portmap start
~ # /etc/init.d/nfs start


Загружаем наш LTSP-клиент. Если все сделано правильно, то запускается Линукс, стартуют иксы и появляется интерфейс логина в Windows 2003 Server. Ну или просто иксы, если Windows у вас еще не настроен и не запущен.

исправление багов - ошибка залипающего ALT

LTSP и rdesktop имеют одну особенность. Проявляется она при попытках переключения между раскладками с использованием ALT + SHIFT. При использовании такой комбинации возникает эффект залипания левого ALT, и клавиатура зависает.

Исправляется следующим образом:

в файле /opt/ltsp/i386/usr/X11R6/lib/X11/xkb/keycodes/xfree86 комментируем строчку

#< lalt >= 64;

Таким образом мы отключаем левый ALT в Линуксе. Так как rdesktop работает с Windows 2003 Terminal Server метом передачи кодов нажатых клавиш, то на функциональности клавишы LEFT ALT в windows это сказывается только положительно — она перестает конфликтовать с такой же клавишей в Linux и при переключении раскладок по LEFT ALT + SHIFT клавиши не залипают.

русификация

При запуске rdesktop мы используем русскую раскладку клавиатуры для rdesktop. Напоминаю строчку из /opt/ltsp/i386/etc/ltsp.conf:

SCREEN_01 = rdesktop -k ru -f 192.168.0.97

К сожаленью, раскладка требует доработки. Я бы сказал — кардинальной. При использовании дефолтной ru-раскладки не работает часть клавиш, в частности не ставится точка в русской раскладке (та, что совмещена с клавишей “/”). Кроме того, не работает shift + \ . То есть не ставится бекслеш. Метод исправления состоит в следующем:

идем в /opt/ltsp/i386/usr/share/rdesktop/keymaps и замещаем файл с раскладкой ru файлом с раскладкой en-us:

~ # rm /opt/ltsp/i386/usr/share/rdesktop/keymaps/ru
~ # cp /opt/ltsp/i386/usr/share/rdesktop/keymaps/en-us /opt/ltsp/i386/usr/share/rdesktop/keymaps/ru


После чего заменяем в /opt/ltsp/i386/usr/share/rdesktop/keymaps/ru map 0Ч409 на map 0Ч419.

“Новая” ru-раскладка готова. Все клавиши работают корректно.

локальные устройства: нестандартные мониторы

В ряде случаев скрипт из LTSP, призванный автоопределить параметры устройств для запуска xorg, дает сбой. В частности, у меня некорректно определялись параметры горизонтальной развертки для части мониторов. Например, для Samsung 710N. Как результат, было невозможно выставить родное для данного монитора разрешение.

Вариант решения проблемы следующий — написать специальный X86Config для данного монитора. Так как угадывать параметры устройства самому и писать файл конфига довольно муторно, то можно воспользоваться следующим хитрым методом. Скачиваем дистрибутив с Knoppix. Загружаемся с CD или DVD с Кноппиксом на проблемной машине с проблемным монитором. В составе Knoppix идет гениальный скрипт распознования параметров устройств, mkxf86config, практически не дающий сбоев. После загрузки копируем сгенирированный кнопиксом X86Config из рам диска Кнопикса к нам на сервер, в каталог с ltsp.conf. И задаем данный конфиг в параметрах запуска ltsp клиента в ltsp.conf:
XF86CONFIG_FILE = X86Config.Samsung710N

После загругзки LTSP получаем нужное разрешение монитора.

локальные устройства: принтеры

LTSP позволяет использовать локальные принтеры, подключенные к терминальной машине как по USB, так и по LTP. Для этого в /etc/ltsp.conf, в секции настройки клиента, прописываем для USB-принтера:

PRINTER_0_DEVICE = /dev/usb/lp0
PRINTER_0_TYPE = U


После загрузки принтер работает и доступен. При этом, LTSP-клиент становится принт-сервером и принтер становится сетевым, обладая IP-адресом LTSP-клиента. Таким образом, для добавления принтера в Windows надо произвести стандартную процедуру добавления сетевого принтера.



Вячеслав Худяков


Сетевые решения. Статья была опубликована в номере 11 за 2007 год в рубрике sysadmin

©1999-2024 Сетевые решения