X-терминалы Linux.
  Николай Ткаченко, 01/2003.

X Window Server - сетевой продукт, позволяющий строить сеть Linux по принципу сервера терминальных служб.

Изо всех графических пользовательских интерфейсов ОС UNIX лишь X Window server удалось выйти за рамки внутрикорпоративного продукта. Возможно, секрет в том, что этот интерфейс лучше других соответствует природе UNIX.

Вспомним девиз Билла Джоя и компании Sun: "Сеть - это компьютер". Эта идеология во многом определяет "живучесть" и популярность программных продуктов для этой ОС. X Window - полноценный сетевой продукт, построенный по принципу "клиент-сервер". В его состав входят две части, взаимодействующие друг с другом,- X-сервер и графические клиенты.

X-сервер непосредственно взаимодействует с консольным оборудованием - клавиатурой, мышью, дисплеем и другими манипуляторами. Он воспринимает команды пользователя и формирует соответствующие запросы для клиентских программ. Результаты работы различных графических программ также передаются ему - как единственному агенту, который имеет возможность выводить данные непосредственно на дисплей.

Таким образом, X-сервер лучше, чем другие интерфейсы, ориентирован на восприятие оператора-человека. Это важно: ведь пользователи, да и многие администраторы, привыкли думать, что сервер - это нечто удаленное, не допускающее непосредственного контакта! (Большинство программистов не обращает на это внимания, для них различия между клиентами и серверами весьма условны.)

Основой взаимодействия графических приложений с сервером является протокол X. В его основе лежит принцип единообразия сетевой среды, в которой работает X. Часто и сервер и приложения выполняются на одном и том же компьютере. Но надо понимать, что для X-сервера совершенно не важно, где он расположен и с помощью какой сетевой среды осуществляется контакт с графическими клиентами. Следует отметить, что сам X-протокол довольно примитивен, и программы обычно используют дополнительные графические библиотеки, описывающие пользовательский интерфейс более высокого уровня. Одна из основных задач X-сервера - сокрытие от программ аппаратных особенностей терминала, что позволяет использовать для программирования графических задач одни и те же универсальные методы.

Учитывая принципы функционирования X-протокола, будет естественным принять решение, свойственное сетевым технологиям,- разделить клиентскую и серверную части физически, то есть разместить их на разных машинах. Такая организация вычислительного процесса обычно позволяет более эффективно использовать компьютерный парк организации: все ресурсоемкие операции выполняются на специально выделенном мощном компьютере.

Но ситуация с X-сервером в некотором роде противоположна: он выполняется в оперативной памяти машины, на которой работает оператор. Таким образом, клиент и сервер в определенном смысле меняются местами. Картина выглядит примерно следующим образом. Есть несколько "слабых" компьютеров, на которых работают операторы: набирают и редактируют текст, а также выполняют другие подобные задачи. На этих компьютерах установлен UNIX и X Window server. Такие ПК называются рабочими станциями X или X-терминалами. Операционная система X-терминалов получает события, создаваемые пользователем, и передает их для обработки серверу, а также получает от него графический результат обработки и выводит его на экран. Компьютер, выполняющий основную работу, называют сервером графических приложений. Именно на нем работают веб-браузеры, текстовые редакторы, игры и другие прикладные программы. Естественно, что к ресурсам такого компьютера предъявляются особые требования. Особенно это касается оперативной памяти, которой должно хватать на все эти задачи. Зато к рабочим станциям требования гораздо ниже. Это могут быть очень старые компьютеры - вплоть до "четверок".

Мы рассмотрим два варианта организации X-терминалов на ПК, выступающих в роли "толстых клиентов", то есть компьютеров, в оперативной памяти которых выполняется операционная система. В нашем случае это Linux.

Терминология

Бездисковый X терминал.Компьютер, который загружается с использованием памяти EPROM или подобной ей и устанавливает примитивный контакт с сервером для загрузки операционной системы в оперативную память. В дальнейшем ведет себя как "немой" X-терминал.

"Немой" X-терминал. Компьютер, который загружает ОС с локального диска, запускающего только X-Server. Его задача - установить контакт с сервером графических приложений и получить от него графическую сессию.

Рабочая X-станция. Компьютер, на котором ОС, X-Server и графическая сессия загружаются самостоятельно. Эта станция может вести себя как "немой" X-терминал.

Сервер графических приложений. Здесь: компьютер, на котором работают приложения, осуществляющие ввод/вывод с удаленного X-терминала.

X-сервер. Программа, выполняемая на компьютере, к которому непосредственно подключены манипуляторы ввода (клавиатура, мышь и др.) и дисплей. X-сервер предоставляет другим программам интерфейс графического ввода/вывода.

X-клиент. Программа, которой для осуществления процедур ввода/вывода нужен X-сервер. Она может выполняться локально, то есть на том же компьютере, к которому подключены манипуляторы, так и удаленно, обмениваясь данными с X-сервером через сетевое соединение.

X-сервер для PC

Рассмотрим процедуру настройки полноценной рабочей станции, на которой установлены Linux и XFree86 - реализация X Window server для архитектуры PC. Опустим инсталляцию ОС Linux - сегодня существует множество публикаций на эту тему. Будем считать, что сервер графических приложений и рабочая станция у нас уже есть. Напомним, что под сервером графических приложений понимается достаточно мощный компьютер, на котором установлены необходимые графические пакеты (KDE, GNOME и др.), а под рабочей станцией - компьютер, на котором установлена ОС Linux, XFree86. Оба компьютера, разумеется, подключены к сети Ethernet.

Теперь рассмотрим несколько моментов, непосредственно связанных с функционированием X-терминалов. Мы привыкли, что в текстовом режиме процессами управляет пользовательская оболочка (такая как sh или bash). Когда компьютер работает в графическом режиме, ее заменяет интерфейс X Display Manager (XDM). Он запускается с привилегиями root, выводит окно регистрации и открывает так называемую сессию пользователя, сконфигурированную надлежащим образом.

Одна из переменных, входящих в состав параметров сессии, $DISPLAY, определяет систему, на которую будут выводиться графические данные. Например, если IP-адрес сервера графических приложений - 192.168.0.1, а другая рабочая станция с X-сервером имеет IP-адрес 192.168.0.2, и если в параметрах некоторой сессии задано DISPLAY="192.168.0.2", то все графические приложения, принадлежащие этой сессии, будут отправлять результаты своей работы на экран удаленной машины 192.168.0.2.

Наиболее эффективным способом конфигурирования сессии X-станции является использование протокола XDMCP (X Display Manager Control Protocol). Эта программа работает на сервере графических приложений и управляет сессиями, выделяемыми X-серверам, работающим на терминалах. Однако следует помнить, что такой способ организации X-терминалов уязвим для атак, основанных на прослушивании сети, поскольку данные между компьютерами передаются в незашифрованном виде. Рекомендуется использовать технологии, описанные в этой статье, только в доверяемых сетях.

Прием XDM-сервером запроса от X-сервера

Существует две основные возможности взаимодействия X Display Manager (XDM) и X-сервера:

  • прием запроса от X-сервера;
  • управление X-сервером.

В первом случае X-сервер, запущенный на терминальной рабочей станции, должен генерировать в формате XDMCP запрос с просьбой выделить окно регистрации и открыть графическую сессию на определенном хосте. До получения такого запроса XDM, расположенный на сервере графических приложений, не предпринимает никаких действий.

Запрос может быть осуществлен следующими способами.

  • Прямой запрос - запрос, напрямую адресованный известному хосту.
  • Широковещательный запрос - запрос, который адресован всем XDM-серверам в сети. Сеанс предоставляется первым обнаруженным XDM-сервером.
  • Непрямой запрос - направляется определенному хосту с просьбой вернуть список серверов, предоставляющих сервис XDM. Из списка выбирается один, наиболее подходящий, сервер, с ним устанавливается контакт и инициируется процесс регистрации.



Настройка X-сервера XDM-сервером

Для того чтобы создать группу компьютеров, которые будут работать с единственным в сети сервером приложений, этот сервер можно сконфигурировать так, чтобы он автоматически направлял XDM на X-терминалы ("немые" X-терминалы).

Поведение X Display Menager определяется следующими системными файлами, которые находятся в каталоге /etc/X11/xdm (для RedHat-совместимых ОС):

  • xdm-config;
  • Xaccess;
  • Xservers;
  • Xresources.

В файле xdm-config описано расположение других основных конфигурационных файлов, а также скриптов, выполняемых при инициализации сессии. При запуске системы XDM инициализируется процедурой init с параметрами, указанными в /etc/inittab или с помощью скрипта startx.

В некоторых дистрибутивах Linux (в том числе в RH7.1 и RH7.2) файл xdm-config в целях безопасности сконфигурирован таким образом, чтобы не принимать запросы от терминалов на открытие XDM. Для того чтобы сервер смог принимать запросы, необходимо изменить следующий фрагмент:

! SECURITY: do not listen for XDMCP or Chooser requests
! Comment out this line if you want to manage X terminals with xdm
DisplayManager.requestPort: 0

Строку DisplayManager.requestPort: 0 нужно закомментировать, чтобы получилось:

! SECURITY: do not listen for XDMCP or Chooser requests
! Comment out this line if you want to manage X terminals with xdm
!DisplayManager.requestPort: 0

В файле Xaccess определены хосты и шаблоны для контроля прямого, косвенного и широковещательного запроса XDMCP.

В файле Xresources описаны ресурсы, используемые окном XDM,- размер, цвет, шрифт и др.

Запуск X-сервера

Для эффективной работы терминалов желательно настроить их на автоматический запуск X-сервера с необходимыми параметрами. Как известно, в Linux существует понятие "уровень выполнения" (runlevel). При запуске системы процесс init анализирует файл /etc/inittab и определяет, на какой уровень загружать ОС. Обычно это уровень 3 (текстовый режим) или 5 (графический). Для выбора по умолчанию уровня 5 необходимо изменить inittab, чтобы строка id:3:initdefault: выглядела так:

# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

Теперь X-сервер запустится автоматически при загрузке ПК.

В этом же файле находится строка с параметрами, которые передаются в систему при ее работе на уровне 5:

# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon

Эти параметры также можно изменять в зависимости от ситуации.

Альтернативы XDM

Обычно пользователи предпочитают пакеты с дополнительными пользовательскими интерфейсами: KDE, GNOME и др. Эти оболочки заменяют стандартный XDM своими менеджерами - KDM и GDM. В этом нет ничего страшного, следует только внести изменения в конфигурационные файлы, чтобы можно было использовать протокол XDMCP.

Для KDM в файл /usr/share/config/kde/kdmrc нужно внести следующие изменения:

[Xdmcp]
# Whether KDM should listen to XDMCP requests. Default is true.
Enable=true

Для GDM нужно внести изменения в файл /etc/X11/gdm/gdm.conf:

[xdmcp]
Enable=true

XDM-сервер графических приложений управляет X-сервером терминала

Теперь рассмотрим настройку системы, в которой сервер графических приложений "раздает" сеансы "немым" терминалам.

В файле Xservers сервера графических приложений нужно указать список хостов, которые к нему подключены:

:0 local /usr/X11R6/bin/X
wolf:0 foreign
192.168.0.11:0 foreign

Строка :0 local /usr/X11R6/bin/X стандартна и означает, что XDM работает на локальном ПК. Две другие строки описывают терминалы, которым будет отсылаться приглашение XDM. Как видим, хост может быть задан как по имени, так и по адресу. Цифра 0 указывает на номер дисплея и подходит практически всегда, кроме случая, когда на компьютере выполняется сразу несколько X-серверов или подключено несколько дисплеев.

Терминал запускается путем загрузки X-сервера без клиентов и с параметром, отменяющим контроль доступа с удаленных машин. Для этого нужно в файле /etc/inittab на компьютере, используемом в качестве терминала ("wolf"), заменить строку:

x:5:respawn:/etc/X11/prefdm -nodaemon

на следующий фрагмент:

# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/usr/X11R6/bin/X -ac

После перезагрузки сервера приложений и терминала сервер должен запустить на консоли терминала XDM-сессию. Аналогичные действия, естественно, нужно выполнить и с машиной 192.168.0.11.

Прием XDM-сервером графических приложений прямого запроса от X-сервера терминала

Для начала следует указать XDM, работающему на сервере приложений, что он может принимать прямые запросы от X-сервера. Эта функция описывается в файле Xaccess. Формат файла прост и описывает три вида обращений: прямой, непрямой и избирательный (chooser) запрос. Для определения хостов используется имя или шаблон имени (где "?" обозначает любой символ, а "*" - любое количество символов). Знак "!" используется для инверсии значения шаблона хостов. Можно также использовать IP-адрес хоста. Строки проверяются последовательно до первого совпадения и могут снабжаться комментариями. Для того чтобы продолжить строку, используется знак "\". Пустые строки игнорируются. Указание опции NOBROADCAST означает исключение определенного хоста из широковещательного запроса, то есть доступ к нему только по прямому запросу. Вот пример такого описания:

wolf # хост wolf
!guest.socrat.com # все хосты, кроме guest.socrat.com
*.socrat.com  # все хосты домена socrat.com
192.168.0.15 NOBROADCAST # хост 192.168.0.15

В приведенном примере разрешены запросы от хоста wolf, хоста 192.168.0.15 (только прямые запросы) и всего домена socrat.com, кроме хоста guest (это правило имеет приоритет перед доменным). Для того чтобы разрешить прямой и широковещательный запрос всем хостам, нужно изменить файл Xaccess следующим образом:

# .........
#.........
* #разрешена регистрация для всех хостов
#

Для запуска X-сервера с функцией прямого запроса к XDM нужно внести изменения в файл inittab машины wolf:

/usr/X11R6/bin/X -query xdmserver.socrat.com

где xdmserver.socrat.com - имя сервера приложений (вместо него можно указать IP-адрес).

Прием XDM-сервером графических приложений широковещательного запроса от X-терминала

В этом случае настройка подобна предыдущей. В файле Xaccess снова разрешаем широковещательный опрос XDM (как в предыдущем разделе), а X-сервер запускаем строкой из inittab:

/usr/X11R6/bin/X -broadcast

LTSP: готовое решение для Linux-терминалов

Если компьютер выступает в роли терминала, перекладывая заботу о выполнении задач на сервер приложений, то возникает один интересный эффект. Пока пользователь находится в графической среде, он работает в системном окружении удаленного сервера и, таким образом, теряет доступ к локальным файловым ресурсам, в том числе и к жесткому диску. Получается, что последний нужен на компьютере только для загрузки ОС и запуска X-сервера.

А нельзя ли обойтись без него? Оказывается, можно. Такие ПК называются бездисковыми рабочими станциями. Принцип их работы основан на расширении функций стандартного BIOS путем подключения ROM сетевой платы. Если в память чипа ROM записать программу начальной загрузки, то с ее помощью можно обращаться к ОС сервера по сети.

Если мы хотим загружать на терминалы Linux, то нужно решить две важные задачи: предоставить возможность загрузки по сети ядра Linux и создать на сервере структуру директорий, которая будет служить корневой структурой подключаемых терминалов. Первая задача решается путем динамического конфигурирования сетевого интерфейса (dhcp-запроса) и протокола TFTP (Trivial File Transfer Protocol, примитивный протокол передачи файлов). Корневой раздел монтируется с сервера по протоколу NFS. Этим же способом создается раздел подкачки.

Основная сложность заключается в выборе минимального, но необходимого набора пакетов для успешной загрузки и работы Linux. Любая перспективная операционная система предусматривает разные варианты решения той или иной задачи, а характеристикой развитой ОС является наличие готовых решений для стандартных задач. Исследуя наиболее простые схемы организации удаленных терминалов, я остановился на LTSP (Linux Terminal Server Project) - Linux-проекте терминального сервера. Это небольшой пакет, работающий с Red Hat, SuSe, Mandrake, Debian и совместимыми с ними платформами. Рассмотрим процессы, которые происходят при подключении терминала к серверу под управлением LTSP.

Загрузка бездискового терминала: теория

Загрузка бездискового терминала происходит следующим образом.

При включении питания управление компьютером передается функциям основного BIOS, которые выполняют начальную инициализацию (POST - power-on self test) и анализируют дополнительные платы компьютера.

В ходе выполнения этой операции обнаруживается Etherboot BOOTROM сетевой карты. После завершения POST начинает выполняться записанный в нем код. Etherboot находит сетевую карту и инициализирует ее.

Затем программа сетевой загрузки инициирует DHCP-запрос, передавая в нем путем широковещательной рассылки свой MAC-адрес. Сервер принимает запрос, находит конфигурацию, соответствующую данному MAC-адресу, и возвращает данные, необходимые для конфигурирования сетевого интерфейса:

  • IP-адрес рабочей станции;
  • маску сети;
  • путь к ядру ОС;
  • путь к директории, которая должна быть смонтирована в качестве корневого раздела;
  • при необходимости - параметры ядра.

Etherboot конфигурирует TCP/IP-параметры сетевого интерфейса, используя информацию из ответа на DHCP-запрос.

Используя TFTP, ядро ОС загружается в память. По окончании загрузки управление переходит к ядру, и оно выполняет стандартную инициализацию локального оборудования.

К моменту завершения работы ядра на RAM-диске при помощи опции root=/dev/ram0 монтируется корневая файловая система.

Обычно при завершении своей работы ядро загружает программу init, которая продолжает загрузку ОС. В данном пакете используется ядро со встроенной опцией init=/linuxrc, и вместо init вызывается срипт linuxrc.

Этот скрипт сканирует PCI-слоты. Если в одном из них он обнаруживает сетевую карту и идентифицирует ее с помощью файла описаний /etc/niclist, то загружается соответствующий модуль.

Затем терминал генерирует еще один запрос к DHCP-серверу. По получении ответа он конфигурирует интерфейс eth0.

К этому моменту корневой раздел находится на RAM-диске. Теперь все готово к монтированию корня поверх NFS. Для этого в ответе на DHCP-запрос указывается путь к образу корневой системы (обычно /opt/ltsp/i386), но ядро не может просто смонтировать его в корень. Вначале сетевой ресурс монтируется как /mnt. Затем программа pivot_root перемещает /mnt в корень, а старая корневая система монтируется в директорию /oldroot. В результате этих действий образуется новая корневая система. В конце работы скрипта linuxrc вызывается обычная процедура init, которая для установки системного окружения init читает /etc/inittab.

Терминал запускается на уровне 2, согласно параметрам строки initdefault в /etc/inittab. Вначале система инициализируется скриптом rc.local. Он создает в памяти диск объемом 1 Мб и монтирует его в директорию /tmp. Туда копируются все необходимые программы, и на них создаются символические ссылки.

Если терминал сконфигурирован для использования сетевого раздела подкачки, то NFS-ресурс /var/opt/ltsp/swapfiles монтируется в точку /tmp/swapfiles. При необходимости создается файл подкачки и выполняется swapon.

Затем создаются и монтируются необходимые Linux-директории - var, proc, run и т. п. - и выполняется конфигурирование Xserver. Для этого в файле /etc/lts.conf ищется параметр XSERVER. Если он отсутствует или равен auto, предпринимается попытка автоматического определения. Если установлена PCI-видеокарта, то по ее производителю и идентификатору устройства выполняется поиск в списке серверов /etc/vidlist.

Если видеокарта поддерживается системой XFree86 4.X, то для построения конфигурационного файла XF86Config вызывается скрипт /etc/rc.setupx, а если используется сервер XFree86 3.3.6 - /etc/rc.setupx3. Необходимые параметры уточняются в файле /etc/lts.conf.

Затем создается скрипт /tmp/start_ws, отвечающий за запуск X-сервера, создается конфигурационный файл демона syslog и производится его запуск.

Управление передается к процедуре init, которая читает /etc/inittab и определяет необходимый уровень загрузки. В текущей версии LTSP это уровень 2.

На уровне 2 с помощью lts.conf определяется индивидуальный уровень загрузки для каждого терминала. По умолчанию это уровень 5, который соответствует графической среде.

Установка LTSP на сервере приложений

Пакет LTSP поставляется в TAR-архивах и в RPM-пакетах и состоит из четырех следующих частей:

  • LTSP Core pakage;
  • Kernel pakage;
  • X Core pakage;
  • X Fonts pakage.

Перед установкой LTSP необходимо установить в системе сервисы DHCP, TFTP, NFS и PORTMAP. Их настройкой можно заняться после инсталляции основного пакета. Установка пакета выполняется при помощи следующих команд.

Для RPM:
rpm -ivh lts_core-3.0.3-0.i386.rpm
Для tar-архивов:
tar xzf ltsp_core-3.0.0-i386.tgz
cd ltsp_core
 ./install.sh
cd ..
(подобные действия нужно произвести и для трех остальных частей).

В результате создается rfnfkju /opt/ltsp с тремя подкаталогами: i386, templates, install_scripts. Причем каталог /opt/tsp/i386 в дальнейшем будет служить корневым для терминалов. Дальнейшую установку предлагается производить командой ltsp_initialize из каталога templates. Она внесет изменения в конфигурационные файлы перечисленных сервисов. Настоятельно рекомендуется вам сделать резервную копию следующих файлов:

  • /etc/X11/xdm/Xaccess (контроль доступа к XDMCP-сервису);
  • /etc/dhcpd.conf (конфигурация DHCP-сервера);
  • /etc/exports (конфигурация NFS);
  • /etc/sysconfig/syslog (конфигурация syslogd);
  • /etc/hosts.allow (конфигурация демона tcpd);
  • /etc/inittab (файл инициализации init);
  • /etc/X11/gdm/gdm.conf (конфигурация Gnome Desktop Manager);
  • /etc/kde/kdm/kdmrc (конфигурация KDE Desktop Manager);
  • /etc/X11/xdm/xdm-config (конфигурация XDM-сервиса);
  • /etc/X11/xdm/Xaccess (прямой запрос XDM-сессии).

Впрочем, программа сама заботится о создании резервных копий этих файлов.

Теперь все готово к выполнению команды

cd /opt/ltsp/templates
 ./ltsp_initialize

Но здесь есть одно замечание. Дело в том, что скрипт инициализации все равно не в состоянии полностью сконфигурировать все системные файлы. Приходится прибегать к "ручной доводке" системы. В связи с этим лучше выполнить всю работу (ее не много) самостоятельно, полностью контролируя все изменения. Это важно, если вас беспокоит целостность ОС.

Прежде всего, нужно настроить сервис TFTP.

Сервис примитивной передачи файлов - TFTP

Задача этого сервиса - предоставить доступ терминалам к ядру ОС на этапе начальной загрузки. Сервис работает посредством суперсервера xinetd, и его конфигурация находится в файле /etc/xinetd/tft. Обычно достаточно лишь заменить запись disable=yes на disable=no и перезапустить xinetd:

# service xinet restart

В результате файл /etc/xinetd/tftp будет выглядеть так:

service tftp
{
 disable = no
 socket_type = dgram
 protocol = udp
 wait = yes
 user = root
 server = /usr/sbin/in.tftpd
 server_args = -s /tftpboot
}

Существенная для нас информация содержится также в записи

server_args = -s /tftpboot

Здесь указывается, что описываемый сервис открывает каталог /tftpboot для доступа, а при помощи ключа -s он становится корневым. Как известно, терминал загружает ядро ОС именно отсюда. Пакет LTSP поставляется с двумя ядрами, поддерживающими большинство сетевых карт. Это файлы vmlinuz-2.4.9-ltsp-6 и vmlinuz-2.4.9-ltsp-lpp-6. Второй из них снабжен Linux Progres Patch. Впоследствии надо будет указать имя ядра загрузки для всех терминалов или для отдельного терминала.

Настройка сервиса DHCP

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

touch /etc/dhcpd.conf

Здесь надо оговориться о некоторых допущениях, связанных с конфигурацией локальной сети.

Предположим, в сети 192.168.0.0/255.255.255.0 для бездисковых терминалов выделены адреса с 192.168.0.200 по 192.168.0.254. Серверы LTSP и DHCP находятся на одной и той же машине с адресом 192.168.0.1. Тогда параметры DHCPD в файле /etc/dhcpd.conf могут выглядеть так:

subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.2 192.168.0.199;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name-servers 192.168.0.1;

host term01 {
 hardware ethernet 00:30:84:0a:62:8d;
 fixed-address 192.168.0.200;
 option host-name "term01";
 filename "vmlinuz-2.4.9-ltsp-6";
 option root-path "/opt/ltsp/i386";
 option log-servers 192.168.0.1;
}

}

Здесь требуются небольшие пояснения. Для удобства управления терминалами их IP-адреса выбираются по значению MAC сетевой карты в диапазоне 200-254 последнего октета. Диапазон 2-199 отдан остальным машинам, которые не требуют индивидуального контроля IP.

В первой части конфигурационного файла приведены инструкции, относящиеся ко всем компьютерам сети:

 option subnet-mask 255.255.255.0;
 option broadcast-address 192.168.0.255;
 option routers 192.168.0.1;
 option domain-name-servers 192.168.0.1;

Их смысл очевиден. Далее идут записи, относящиеся к каждому терминалу в отдельности. Здесь, кстати, можно переопределить значения глобальных инструкций. Рассмотрим эту часть подробнее.

IP-адрес терминала назначается в соответствии с MAC-адресом сетевой карты:

 hardware ethernet 00:30:84:0a:62:8d;
 fixed-address 192.168.0.200;

Сетевое имя хоста указывается опцией

option host-name "term01";

Строка

filename "vnlinuz-2.4.9-ltsp-6";

описывает файл, содержащий ядро ОС. Поскольку ftpt делает соответствующую папку корневой для подключаемых по этому сервису терминалов, необходимо указать только имя файла. После загрузки ядра Linux потребуется смонтировать корневой раздел, находящийся в NFS. Этот ресурс указывает опция

option root-path "/opt/ltsp/i386";

Поскольку на наших терминалах не предполагается использование локальных дисковых ресурсов, то демону журналирования событий системы (syslogd) требуется указать удаленный сервер, который будет принимать сообщения от него. Эта информация предоставляется с помощью опции

option log-servers 192.168.0.1;

И еще одно замечание. Настоятельно рекомендуется записать данные о каждом терминале, загружаемом по сети, в файл /etc/hosts сервера приложений:

127.0.0.1  loclahost.localdomain localhost
 ......
192.168.0.200 term01

Впоследствии это поможет избежать многих проблем, вплоть до краха системы.

Сетевая файловая система NFS

В Red Hat сетевыми ресурсами NFS управляет файл /etc/exports. Для обеспечения работы пакета LTSP достаточно внести в него несколько строк:

/opt/ltsp/i386 192.168.0.0/255.255.255.0(ro,no_root_squash)
/var/opt/ltsp/swapfiles 192.168.0.0/255.255.255.0(rw,no_root_squash)

Слева указаны директории, предназначенные для сетевого монтирования, а справа - соответствующие им опции. Опции ro и rw означают доступ только для чтения и доступ для записи и чтения, соответственно; no_root_squash обычно заменяет идентификатор пользователя root на идентификатор nobody, блокируя таким образом неограниченный доступ к ресурсу. Первая строка в этом файле реализует корневую структуру ОС, а вторая - раздел своппинга, если есть необходимость использовать его по сети.

Настройка демона syslog

Как уже говорилось, терминальные машины заносят в журнал события, происходящие в ОС, и передают их на сервер приложений (или другой, заданный в конфигурации DHCP). В связи с этим необходимо настроить демон syslogd на сервере так, чтобы он воспринимал сведения от удаленных машин. Для этого в файле конфигурации /etc/sysconfig/syslog используется ключ -r:

# See syslogd(8) for more details
SYSLOGD_OPTIONS="-m 0 -r"

Контроль доступа к TCP-сервисам

Если в системе производится ограничение/контроль доступа к сетевым портам посредством TCPD, необходимо открыть все необходимые сервисы для терминалов в сети. Для этого нужно внести изменения в файл /etc/host.allow:

in.tftpd: 192.168.0.
portmap: 192.168.0.

Настройка XDM

Для того чтобы терминалы могли запрашивать у сервера сеанс XDM, нужно правильно настроить файлы /etc/X11/xdm/Xaccess и /etc/X11/xdm/x/dm-config. Кроме того, LTSP использует предварительную настройку XDM-окна, добавляя в список xdm-config скрипт Xsetup_workstation. Таким образом, список xdm-config в файле /etc/X11/xdm/xdm-config имеет следующий вид (изменения выделены жирным шрифтом):

! SECURITY: do not listen for XDMCP or Chooser requests
! Comment out this line if you want to manage X terminals with xdm
! DisplayManager.requestPort: 0
DisplayManager.*.setup: /etc/X11/xdm/Xsetup_workstation

Сам скрипт Xsetup_workstation, расположенный в файле /etc/X11/xdm/Xsetup_workstation, выглядит так:

#!/bin/sh
/usr/X11R6/bin/xsetroot -solid "#356390"
if [ -x /usr/bin/xsri ]; then
/usr/bin/xsri -geometry +5+5 -avoid 300x250 -keep-aspect \
/etc/X11/xdm/ltsp.gif
fi

В файле ltsp.gif находится логотип LTSP, который отображается на начальной стадии загрузки XDM.

На этом настройка сервера завершена. Переходим к подготовке терминалов.

Получение ядра сетевой загрузки Etherboot

Для того чтобы обеспечить возможность начальной загрузки бездисковой рабочей станции, необходимо создать образ загрузчика, поддерживающего необходимую сетевую карту, и записать его в EPROM.

Мы воспользуемся пакетом Etherboot, распространяемым по лицензии GNU. На помощь нам придет веб-проект, предоставляющий удобный интерфейс для загрузки etherboot-образа сетевой карты или дискеты. Дело в том, что для записи EPROM нам потребуются услуги специализированных центров, а на этапе отладки удобно воспользоваться загрузкой с флоппи-диска.

Итак, идем на сайт и выбираем версию продукта (я пользовался версией 5.06). Затем выбираем модуль сетевой карты и тип загружаемого образа (для EPROM или загрузочной дискеты). Если загружен образ дискеты, далее следует выполнить команду

# cat eb-5.0.6-yournic.lzdsk > /dev/fd0

Не забудьте указать правильное название загруженного файла.

Это команда Linux. В DOS следует воспользоваться утилитой RAWRITE, поставляемой с дистрибутивами Linux. Теперь все готово к загрузке терминала. Если все настроено правильно, то на экране появится приглашение XDM. Впрочем, если видеокарта не поддерживает XFree86 4.x, возможно, придется выполнить дополнительную настройку данного терминала.

Подбор X-сервера для устаревших видеокарт

X-серверы версий 3.3.6 и 4.x поддерживают видеокарты по-разному. XFree86 4.0 просто загружает необходимый видеомодуль - если только данная видеокарта поддерживается этой версией. Если же в терминале установлена старая видеокарта (например, очень популярная в свое время S3Trio или S3Virge), то система будет использовать X-сервер версии 3.3.6, где каждому типу видеокарты соответствует свой вид этой программы (например, для S3Virge это XF86_S3V). Если в системе LTSP не установлен нужный XFree, то X-сервер откажется загружаться, о чем вы узнаете из информационной строки на экране терминала:

/tmp/start_ws: /usr/X11R6/bin/XF86_S3V : No such file or directory

Чтобы устранить эту проблему, достаточно указать в каталоге /opt/ltsp/i386/usr/X11R6/bin/ подходящий сервер. В нашем случае это программа XF86_S3V.

Единые параметры настройки терминалов

В проекте LTSP существует возможность корректировки общих и индивидуальных параметров терминалов, благодаря чему система достаточно легко адаптируется к аппаратным и программным особенностям среды. Необходимые параметры и значения хранятся в файле /opt/ltsp/i386/etc/lts.conf. Знакомство с ним мы начнем с секции [Default], определяющей значения, общие для всех подключаемых терминалов. При необходимости для отдельных терминалов эти значения могут быть переопределены:

[Default]
 SERVER  = 192.168.0.1
 XSERVER  = auto
 X_MOUSE_PROTOCOL  = "PS/2"
 X_MOUSE_DEVICE   = "/dev/psaux"
 X_MOUSE_RESOLUTION  = 400
 X_MOUSE_BUTTONS  = 3
 USE_XFS  = N
 LOCAL_APPS  = N
 RUNLEVEL  = 5

Рассмотрим эти параметры по очереди.

SERVER = 192.168.0.1 обозначает машину, выступающую в роли сервера графических приложений.

XSERVER = auto указывает на то, что система сама определяет тип загружаемого сервера XFree86. Рекомендуется это значение не изменять.

X_MOUSE_PROTOCOL = "PS/2" - название протокола манипулятора мыши, используемого на удаленной машине. Если в большинстве компьютеров используется мышь с последовательным интерфейсом, это значение следует изменить на

X_MOUSE_PROTOCOL = "Microsoft"

X_MOUSE_DEVICE = "/dev/psaux" - порт PS/2. Для порта COM1 следует использовать значение /dev/ttyS0.

USE_XFS = N показывает, надо ли использовать сетевой сервер X-шрифтов. Советую настроить XFS-сервер приложений так, чтобы он мог использоваться удаленными машинами (подробнее об этом будет рассказано отдельно). После этого не забудьте изменить соответствующую запись в lts.conf:

USE_XFS = Y

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

Используя этот же файл, можно произвести настройку отдельного терминала, параметры которого отличаются от остальных. Для этого создается секция [terminal], где указываются дополнительные опции или опции, уже существующие в [Default]. В последнем случае локальные значения параметров "перекрывают" общие. В качестве определения [terminal] может выступать имя хоста (в этом случае оно должно быть определено в /etc/hosts или средствами DNS), IP- или MAC-адрес терминала, например [ 00:30:84:0a:62:8d], [192.168.0.200] или [term01].

Теперь можно указать, что данный компьютер использует мышь на порту COM1 и получает список шрифтов с сетевого сервера:

[192.168.0.200]
 X_MOUSE_PROTOCOL  = "Microsoft"
 X_MOUSE_DEVICE   = "/dev/ttyS0"
 USE_XFS  = Y

Важные параметры файла lts.conf

Теперь рассмотрим наиболее часто используемые параметры в конфигурации lts.conf.

XSERVER. Определяет тип X-сервера, который будет выполняться на рабочей станции. Для XFree86 4.x указывают видеомодуль, например atati ati, cirrus, i810. Для XFree86 3.3.6 надо указать имя сервера, например XF86_SVGA, XF86_S3.

X_MODE_0 … X_MODE_10. Настраивает параметры вывода на экран. Можно просто указать разрешение: X_MODE_0 = 800x600, а можно все параметры полностью:

X_MODE_6 = 1280x1024 157.5 1280 1344 1504 1728 1024 1025 1028 1072 +HSync +Vsync

X_MOUSE_PROTOCOL. Тип мыши. Обычно это "PS/2" или "Microsoft".

X_MOUSE_DEVICE. Порт, к которому подключена мышь: /dev/psaux для PS/2 и /dev/ttyS0 для COM1.

X_MOUSE_BUTTONS. Количество кнопок мыши - 2 или 3 (по умолчанию 3).

X_MOUSE_EMULATE3BTN. Режим "Y" соответствует эмуляции третьей кнопки мыши (нажатием двух кнопок одновременно).

USE_XFS. Использование внешнего сервера X-шрифтов.

XFS_SERVER. Имя или IP-адрес сервера шрифтов.

XF86CONFIG_FILE. Использование для терминала собственного конфигурационного файла XFree86. Можно создать для терминала term01 отдельную конфигурацию X, например в файле XF86Config.term01, который находится в папке /tftpboot/ltsp/etc. Затем нужно ввести в секции [term01] параметр, указывающий на этот файл с индивидуальными параметрами настройки X-сервера терминала:

XF86CONFIG_FILE = XF86Config.term01

XkbModel. Модель клавиатуры. Наиболее распространенные значения - "pc101", "pc102", "pc105".

XkbLayout. Раскладка клавиатуры - например, "us" или "ru(winkeys)".

XkbSymbols. Таблица скан-кодов. По умолчанию это "us(pc101)", но ее можно заменить на "en_US(pc105)+ru".

Запуск X-клиента по шифрованному каналу SSH

Для того чтобы повысить защиту коммуникаций от различных способов прослушивания сетевого трафика, можно использовать шифрование канала передаваемых данных методом ssh. В этом случае следует использовать в настройках ssh-демона и ssh-клиента ключ ForwardX11 = yes. Для того чтобы X-сервер терминала принимал данные от удаленного клиента, следует модифицировать список хостов, которым предоставлено право устанавливать сетевое соединение. Для этого используется команда xhost. Например, команда

xhost +remote.dom.com

предоставляет графическим клиентам, работающим на компьютере remote.dom.com, доступ к локальным X-терминалам. Если после этого открыть ssh-соединение и запустить любое приложение, например gedit:

[faust@murmansk]$gedit

то для вывода результатов работы gedit будет использоваться удаленная консоль. К тому же поток данных будет передаваться по шифрованному ssh-каналу.

Русская раскладка в LTSP
Как известно, переключение национальной раскладки клавиатуры в Linux осуществляется двумя способами - непосредственно в X-сервере с помощью Xkb или в графической среде KDE/GNOME с помощью утилит, использующих xmodmap. Первый способ в последнее время становится все более популярным, опираясь на развитые средства интернационализации Xkb. Для установки англо-русской раскладки Xkb использует две опции из файла XF86Config (для XFree86 3.3.6; особенности версии 4 описаны далее).

XkbLayout "ru(winkeys)"

XkbOptions "grp:alt_shift_toggle,grp_led:scroll"

XkbLayout "ru(winkeys)" указывает на русскую раскладку, совместимую с Windows; XkbOptions "grp:alt_shift_toggle" определяет комбинацию клавиш для переключения между раскладками. В нашем случае это <ALT> + <SHIFT>. В настойках lts.conf есть возможность указать XkbLayout, но не XkbOptions. Чтобы "перехитрить" LTSP, придется немного поработать над инициализационными скриптами этого пакета.

Дело в том, что в процессе загрузки терминала скрипт /opt/ltsp/i386/etc/rc.setupx3 генерирует конфигурационный файл для Xfree 3.3.6 - XF86Config. В этот скрипт надо добавить одну строчку. Найдите блок определения клавиатуры, начинающийся строками:

Section "Keyboard"

Protocol "Standard"

AutoRepeat 500 5

После опций

XkbModel "${XkbModel}"

XkbLayout "${XkbLayout}"

добавьте

XkbOptions "grp:alt_shift_toggle"

Это подходит, если на терминале выполняется X-сервер версии 3. Для XFree86 4.0 конфигурация строится при помощи скрипта /opt/ltsp/i386/etc/rc.setupx. В этом файле находим раздел

Section "InputDevice"

Identifier "Keyboard0"

Driver "keyboard"

Option "XkbLayout" "${XkbLayout:-"us"}"

EndSection

И в нем после Option "XkbLayout" "${XkbLayout:-"us"}" добавляем

Option "XkbOptions" "grp:ctrl_shift_toggle"

Установка сетевого сервера X-шрифтов
При использовании группы X-терминалов, подключаемых к серверу приложений, последний часто используют в качестве сервера шрифтов. Тогда уделенные X-серверы получают единообразный набор шрифтов, что обеспечивает еще один уровень централизованного администрирования. Для реализации этой идеи нужно сначала подготовить сам сервер к выполнению этой роли.

Для этого демон xfs должен запускаться в режиме, допускающем обращение сетевых компьютеров к его ресурсам. С этой целью можно использовать конфигурационный файл /etc/X11/fs/config. Деактивируем в нем параметр no-listen = tcp:

# don't listen to TCP ports by default for security reasons

#no-listen = tcp

Затем надо установить загрузку демона xfs с ключом, предполагающим его конфигурирование необходимым файлом. В системе RH можно исправить стартовый сценарий /etc/rc.d/init.d/xfs, заменив в секции start() строчку

daemon xfs -droppriv -daemon

на

daemon xfs -droppriv -daemon -config /etc/X11/fs/config

Для использования сетевого сервера шрифтов конфигурация X-сервера предусматривает параметр FontPath "unix/:7100" в файле XF86Config и XF86Config-4. Это значение используется по умолчанию и означает обращение к локальному xfs через порт 7100. Для загрузки шрифтов с сетевого ресурса вместо unix нужно указать имя хоста или IP-адрес сервера:

FontPath "192.168.0.1/:7100"

Пакет LTSP, в свою очередь, предлагает использовать для этой цели параметры

USE_XFS = Y

XFS_SERVER = 192.168.0.1

Типы энергонезависимой памяти

ROM. Read-Only Memory, память, доступная только для чтения. Используется в BIOS для хранения постоянных данных. Не требует энергопитания. Другими словами, информация на таких чипах не стирается, даже если выключить компьютер. Эти чипы программируются на стадии производства и изменить записанную на них информацию нельзя.

PROM. Programmable ROM, программируемая память ROM. Эта технология предполагает возможность однократной записи информации, после чего она остается в микросхеме навсегда. Для ее хранения также не требуется энергопитания. На этапе производства PROM чипы не несут информации. Для их программирования нужны специальные приборы, называемые PROM-программаторами.

EPROM. Erasable PROM, перезаписываемая память PROM. Память, сходная по своей функциональности c PROM, но допускающая в процессе эксплуатации стирание и запись информации. Для стирания информации память поддается воздействию ультрафиолетового излучения. Для записи также необходимы специальные проборы - EPROM-программаторы. Возможность программирования такой памяти делает эту разновидность микрочипов привлекательной для использования в индустрии персональных компьютеров.

EEPROM. Electrically EPROM, электроуправляемая EPROM. Разновидность EPROM, в которой стирание информации в микросхеме и подготовка ее к записи производится электрическим зарядом. Такая память отстает от RAM по скорости работы, но зато является энергонезависимой. Особенность ее принципа записи - один байт за такт.

FRAM. Ferroelectric Random Access Memory, ферроэлектрическая память произвольного доступа. Эта технология обеспечивает скорость работы, сравнимую с DRAM и SDRAM, в сочетании с энергонезависимым хранением информации. Все это привело к тому, что FRAM вытеснила EEPROM во многих устройствах. FRAM - зарегистрированная торговая марка Ramtron International Corporation.

NVRAM. Non-Volatile RAM, энергонезависимая RAM. NVRAM - попытка наделить RAM возможностями энергонезависимого хранения информации. Для решения этой проблемы в одном из случаев предполагается запись содержимого RAM в EEPROM при выключении вычислительного устройства.

Flash Memory. Разновидность EEPROM, которая позволяет записывать информацию блоками, в отличие от обычной EEPROM. Практически все микросхемы BIOS современных ПК построены на ее основе, что значительно упрощает обновление программ BIOS. По этой же причине память Flash получила значительное распространение в производстве модемов, где она позволяет решить проблему перехода на новые протоколы коммуникаций.