терминальное решение на базе 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 надо произвести стандартную процедуру добавления сетевого принтера.
Вячеслав Худяков
Говорят, что история развивается по спирали. Другие же утверждают, что она вовсе движется по кругу. Так или иначе, но история терминальных решений довольно любопытна — 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