Объявление,
поиск
и использование (подключение)
служб в сети
Синтаксис:
gns
[-cv]
[имя_узла
...]
gns
[-sv]
[имя_узла]
Поддерживаемые
платформы:
Neutrino
Опции:
-c
Выполнить
в
режиме клиента. Используется по
умолчанию.
-s
Выполнить
в
режиме сервера.
-v
Вывести
расширенную
информацию.
имя_узла
Узел,
на
котором запущен сервер GNS.
Описание:
Менеджер
глобальных
служб имен (gns)
является
автономным менеджером ресурсов.
С помощью утилиты gns
приложение может выполнять объявление,
поиск и использование (подключение)
служб в сети при отсутствии информации
о местоположении службы и ее поставщике.
GNS
работает
в двух различных режимах:
сервер и клиент. Менеджер в режиме
сервера представляет собой централизованную
базу данных, в которой хранятся объявленные
службы, а также обрабатываются запросы
на поиск и подключение. Менеджер в режиме
клиента выполняет передачу запросов
на объявление, поиск и подключение между
локальным приложением и сервером gns.
Интерфейсы
API
и
правила объявления
Для
использования
в руководстве по библиотекам
Neutrino Library
Reference
доступно несколько функций: name_attach()
для объявления, name_open()
для подключения, name_close()
для отключения от конкретной службы и
name_detach()
для удаления имени из пространства
имен.
Объявление
(привязка)
службы (представленной путевым
именем) со стороны приложения может
быть локальным
или глобальным.
При
локальном объявлении службы поиск
этой службы приложениями с другого
компьютера посредством утилиты gns
невозможен. При глобальном объявлении
служб доступ к ним будет открыт для
любого компьютера в сети, на котором
запущен менеджер gns.
Объявление
службы
в приложении может быть локальным
только при отсутствии локального
объявления этой службы в другом
приложении. Для приложений, объявленных
в качестве локальных служб, ограничения
по параметрам доступа отсутствуют.
Объявление
службы
в приложении может быть глобальным
только при наличии полномочий root.
Несмотря
на
то, что глобальное объявление
выполняется в масштабе всей сети,
приложение на другом компьютере может
быть объявлено глобально с тем же именем
службы. При этом возникает избыточность
служб, поскольку одна служба доступна
на нескольких хостах в сети.
Примечание.
В
реализации GNS использован API name_*,
однако
поведение относительно предыдущей
реализации операционной системы
реального времени Neutrino несколько
изменилось.
Пространство
путевых
имен
Служба
представлена
пространством путевых
имен (без первого символа "/") в
каталоге /dev/name/global
или /dev/name/local
в зависимости от способа ее объявления.
Представление
пространства
имен /dev/name/global
идентично для каждого компьютера, на
котором запущен клиент или сервер gns.
Помимо
этого для каждого компьютера
определено специфичное локальное
пространство имен /dev/name/local.
Для
получения
дополнительной информации
см. раздел "Примеры".
Правила
подключения
для
GNS
Для
подключения
приложений к глобальной
службе имен используется API name_open().
Если
одна служба зарегистрирована на
нескольких хостах, то для выбора
конкретного экземпляра службы, к которой
осуществляется подключение, применяются
следующие правила:
-
Если
поставщик
службы существует на том же компьютере, что и
запросившее
службу приложение, менеджер gns
сначала выполняет попытку подключения к локальному
поставщику. При
успешном подключении приложение локально взаимодействует
с поставщиком
службы для оптимизации производительности.
-
При
отсутствии локального поставщика службы, либо если по
некоторым
причинам локальный поставщик отказывается предоставить
службу, менеджер gns
выполняет попытку подключения к другим поставщикам. При
наличии
нескольких удаленных поставщиков порядок попыток
подключения к ним
(т.е. последовательность подключения) не определен.
Работа
с
несколькими серверами GNS
В
режиме
сервера на разных компьютерах
можно запустить несколько менеджеров
глобальных служб имен.
Работа
с
несколькими
доменами служб
Можно
установить
несколько клиентов для
подключения к серверу server1
и несколько клиентов для подключения
к серверу server2.
При
этом создаются отдельные "домены
служб". Клиенты, подключенные к серверу
server1
(в "домене служб 1") не могут
использовать службы, зарегистрированные
на сервере server2
(в "домене служб 2").
На
некоторых
клиентах:
#
gns
-c server1
На
других
клиентах:
#
gns
-c server2
Резервные
серверы
GNS
Поскольку
сервер
GNS является централизованной
базой данных, отсутствие резервных
серверов GNS означает прерывание работы
службы (объявление, поиск и использование)
в сети. Для устранения этой проблемы
можно запустить несколько серверов GNS
и направить клиенты на все эти серверы.
На
сервере
1:
#
gns
-s
На
сервере
2:
#
gns
-s
На
всех
клиентах:
#
gns
-c server1 server2
В
этом
случае при каждой попытке регистрации
глобальной службы приложением сообщение
о регистрации отправляется одновременно
на сервер server1
и server2.
При
каждой попытке подключения приложением
глобальной службы запрос направляется
одновременно на сервер server1
и server2.
Примечание.
GNS
на сервере server1
не взаимодействует с GNS на сервере
server2.
Это
означает, что при необходимости
регистрации приложением на сервере
server1
глобальной службы на клиентских узлах,
процесс gns
на сервере server1
не может направить этот запрос на сервер
server2,
поскольку
процесс gns
не функционирует как клиент и сервер
одновременно. Однако это не влияет на
приложения, выполняющие попытку
подключения к данной службе, поскольку
запрос направляется на оба сервера.
Автоматическое
сканирование
клиентов
Каждый
менеджер
GNS зарегистрирован по пути
/dev/name/gns_server
или /dev/name/gns_client.
При
запуске клиента GNS без присвоения
целевого сервера выполняется автоматическое
сканирование для поиска сервера(-ов)
GNS в локальной сети.
На
клиенте:
#
gns
-c
Автоматическое
сканирование
выполняется по каталогам
локальной сети (обычно /net)
для
поиска путевого имени
/net/компьютер/proc/mount/dev/name/gns_server.
Примечание.
Автоматическое
сканирование не является
гарантией
обнаружения сервера, т.к. в сети Qnet в
каталоге /net
могут находиться не все локальные
компьютеры.
Автоматическое
сканирование
клиентов целесообразно
при потере соединения с сервером. В этом
случае для поиска сервера клиентом
выполняется повторное сканирование.
Это упрощает запуск другого сервера
GNS и его синхронизацию с первым сервером
(синхронизация рассматривается ниже),
а также последующее уничтожение первого
сервера GNS.
Если
для
клиента в командной строке указан
конкретный сервер (конкретные серверы)
GNS, то автоматическое сканирование не
выполняется. При потере соединения с
сервером он пытается восстановить
соединение при каждом запросе на
регистрацию, поиск или подключение.
Режим
резервного
сервера
Менеджер
GNS
можно запустить в режиме "резервный
сервер". Для этого следует запустить
менеджер GNS в режиме сервера и ввести
конкретный серверный компьютер в
командной строке.
В
узле
node1 запускается стандартный сервер:
#
gns
-s
а
в
узле node2 – резервный сервер:
#
gns
-s node1
Менеджер
GNS
на сервере node2
выполняет синхронизацию с менеджером
GNS на сервере node1,
получает
всю информацию о глобальных
службах из узла node1
и сохраняет ее локально.
Все
клиенты
GNS, уже подключенные к серверу
GNS в узле node1,
получают
информацию о новом сервере в
узле node2
и подключаются к нему. При этом для
клиентов существует несколько серверов,
аналогично выполнению запуска следующим
образом:
#
gns
-c node1 node2
GNS
и
сеть с высокой степенью связности
Для
сети
с высокой степенью связности
менеджер GNS можно запустить только в
режиме сервера. Для всех клиентских
узлов может использоваться префикс к
пространству имен сервера вместо запуска
менеджера GNS локально в режиме клиента.
На
сервере:
#
gns
-s
На
других
клиентах:
#
ln
-sP /net/gsrv/dev/name/global /dev/name/global
Если
поставщик_службы
регистрирует имя глобальной службы из
клиентского узла (без выполнения gns
-c)
информация
направляется напрямую
менеджеру GNS на сервер. Далее если
потребитель_службы
выполняет попытку поиска имени сервера,
менеджеру GNS на сервер отправляется
сообщение о поиске, которое возвращает
данные поставщика службы.
Если
поставщик
регистрирует имя локальной
службы, он просто регистрирует себя в
менеджере локальных путей. Менеджер
локальных путей обслуживает потребителя
во время поиска локальной службы.
Вместо
использования
описанных выше префиксов
следует учитывать эти различия в работе
менеджера GNS в режиме клиента. Менеджер
GNS в режиме клиента, функционирующий
локально, может кэшировать информацию
поставщика служб, что устраняет
необходимость обращения к менеджеру
GNS на сервере при каждом поиске. Это
обеспечивает успешное завершение поиска
даже при временной потере подключения
к менеджеру GNS.
Кроме
того,
если указываются префиксы для
пространства путевых имен, просмотр
клиентом каталога /dev/name/net
для определения узла, поставляющего
службы, невозможен. Однако эта информация
при выполнении обычных операций
объявления/поиска не является важной.
Специальное
путевое
имя
Все
менеджеры
GNS зарегистрированы как
/dev/name/gns_server
или /dev/name/gns_client.
Это
путевое имя может содержать
статистическую информацию об менеджере
GNS. Пример:
$
cat
/dev/name/gns_client
Global
Name
Service Mode: Client
Server:
xtang (connected)
Registered
services:
net/netsrv.ott.qnx.com/0,1818649,1,0,-1
(No Expiration)
network/tcpip/51,20533309,1,0,12
(Fri Feb 7 13:57:39 2003)
printer/ps/techpub/0,1826845,1,0,12
(No Expiration)
Из
этого
примера следует, что процесс gns
является клиентом одного сервера
(компьютер с именем xtang);
подключение
к серверу уже установлено.
Также перечислены все службы, известные
менеджеру GNS. Обратите внимание, что для
службы network/tcpip
установлено ограничение срока действия,
что свидетельствует о кэшировании этой
записи в результате запроса сервера
gns.
Примеры:
При
использовании
gns
типичная сеть выглядит следующим
образом:
Узел
сервера:
#
gns
-s
Узел
клиента(-ов):
#
gns
-c server1 server2
Пример
результата
глобального объявления
службы printer/ps/techpub:
$
ls
-l /dev/name/global/
total
2
dr-xr-xr-x
0 root techies 1 Feb 06 16:20 net
dr-xr-xr-x
0 root techies 1 Feb 06 16:21 printer
$
ls
-l /dev/name/global/printer/ps
total
1
dr-xr-xr-x
0 root techies 1 Feb 06 16:21 techpub
Обратите
внимание
на способ регистрации
/dev/name/global/printer/ps/techpub.
Путь
/dev/name/global/net
зарезервирован менеджером gns
(следовательно объявление приложением
службы, запущенной как net/
невозможно). На компьютерах по пути
/dev/name/global/net
выполняется менеджер GNS. Например, в
следующем списке менеджер GNS запущен
на двух компьютерах:
$
ls
-l /dev/name/global/net total 2
dr-xr-xr-x
0 root techies 1 Feb 06 18:32 netsrv.ott.qnx.com
dr-xr-xr-x
0 root techies 2 Feb 06 16:20 xtang.ott.qnx.com
Объявление
одной
службы может быть выполнено на
нескольких серверах приложений на
разных компьютерах. Поэтому одно путевое
имя может соответствовать нескольким
серверам. По этой причине менеджер GNS
автоматически создает имя в формате nd
идентификатор_процесса
идентификатор_канала
описатель
тип_файла
по зарегистрированному путевому имени:
$
ls
/dev/name/global/printer/ps/techpub
0,16834613,1,0,12
8,1826845,1,0,12
Из
этого
примера можно сделать вывод о
наличии двух приложений, связанных со
службой printer/ps/techpub.
В
некоторых
случаях требуется определить,
какую именно службу предоставляет
компьютер netsrv.ott.qnx.com.
Для
этого можно просмотреть файл
/dev/name/global/net/netsrv.ott.qnx.com,
в
котором перечислены службы, связанные
процессом с netsrv.ott.qnx.com:
$
ls
/dev/name/global/net/netsrv.ott.qnx.com/printer/ps/techpub
0,1826845,1,0,12
Для
точного
определения компьютера,
зарегистрировавшего службу, используется
следующее:
$
ls
-l /dev/name/global/printer/ps/techpub
total
0
lr-xr-xr-x
0 root techies 0 Feb 06 16:48
0,16834613,1,0,12
->
../../../net/xtang.ott.qnx.com/printer/ps/techpub/0,16834613,1,0,12
lr-xr-xr-x
0 root root 0 Feb 06 16:28 8,1826845,1,0,12
->
../../../net/netsrv.ott.qnx.com/printer/ps/techpub/0,1826845,1,0,12
Из
этого
примера можно заключить, что
процессом на компьютере xtang.ott.qnx.com
с идентификатором процесса 16834613
зарегистрирована служба printer/ps/techpub.
Эта
же служба зарегистрирована и
процессом 1826845 на компьютере
netsrv.ott.qnx.com.