12. Прозрачная распределенная обработка с помощью протокола Qnet


Что такое Qnet?

Собственная сеть QNX Neutrino представляет собой группу соединенных между собой рабочих станций, каждая из которых работает под управлением операционной системы QNX Neutrino. В этой сети программа имеет прозрачный доступ к любому ресурсу, который расположен на любом другом узле (компьютере или рабочей станции) локальной подсети, будь то файл, устройство или процесс. Собственная сеть QNX Neutrino даже позволяет запускать программы на других узлах.

Примечание. Протокол, который используется в собственной сети ОС QNX 4, называется FLEET. Он несовместим с протоколом Qnet операционной системы QNX Neutrino.

В сущности, протокол Qnet прозрачно распространяет действие механизма межзадачного взаимодействия (IPC) на сеть микроядер, используя принцип передачи сообщений ОС QNX Neutrino для реализации собственной сети.

Записи всех узлов локальной подсети, на которых работает протокол Qnet, расположены в пространстве имен /net (в операционной системе QNX 4 для обращения к другому узлу применяется двойная косая черта, за которой следует номер узла).

Более подробные сведения о протоколе Qnet см. в главе 13 руководства "Описание применения. Часть 1. Системная архитектура" КПДА.10964-01 31 01". Программирование с использованием протокола Qnet рассмотрено в разделе "Transparent Distributed Networking via Qnet" руководства "Programmer’s Guide".

Когда использовать протокол Qnet?

Когда следует использовать протокол Qnet, а когда — TCP или какой-либо другой протокол? Все зависит от того, какие компьютеры требуется объединить в сеть.

Протокол Qnet предназначен для сети доверенных компьютеров, которые работают под управлением операционной системы QNX Neutrino и имеют один и тот же порядок следования байтов. В этих условиях компьютеры могут совместно использовать ресурсы с небольшими накладными расходами. Протокол Qnet дает возможность пользоваться утилитами операционной системы QNX Neutrino (cp, mv и т. д.) для работы с файлами, которые находятся в любом месте сети Qnet так же, как если бы они находились на локальном компьютере.

Поскольку протокол Qnet предназначен для группы доверенных компьютеров (например, входящих в состав встроенной системы), он не выполняет аутентификацию запросов. Защита файлов осуществляется с помощью обычных прав доступа, которые применяются к пользователям и группам (см. подразд. "Владение файлами и права доступа" раздела 6), однако ключи maproot и mapany позволяют в некоторых пределах управлять действиями удаленных пользователей на компьютере. В отличие от NFS, протокол Qnet является протоколом с установлением соединения; сообщения о сетевых ошибках передаются клиентскому процессу.

Протокол TCP/IP предназначен для компьютеров, которые связаны между собой не столь тесно и могут работать под управлением разных операционных систем. Для управления доступом к компьютеру протокол TCP/IP выполняет процедуру аутентификации; он полезен для соединения с компьютерами, которые не обязательно являются доверенными. Протокол TCP/IP используется как основа для специализированных протоколов, например FTP и Telnet, и обеспечивает высокую производительность потоковой передачи данных. Более подробные сведения см. в разделе 13.

Протокол NFS предназначен для выполнения операций над файловыми системами на любых хостах с любым порядком следования байтов и пользуется широкой поддержкой. NFS является протоколом без установления соединения; сервер можно остановить и перезапустить, а клиент автоматически возобновляет взаимодействие с сервером. Кроме того, протокол NFS использует аутентификацию и управляет доступом к каталогам. Более подробные сведения см. в подразд. "Файловая система NFS" раздела 11.

Правила именования узлов

Для разрешения имен узлов протокол Qnet использует следующие правила.
По умолчанию именем узла является значение конфигурационной строки _CS_HOSTNAME. Если хост имеет имя localhost, которое назначается по умолчанию при первой загрузке, то протокол Qnet обеспечивает связь между узлами, используя имя хоста на основе MAC-адреса сетевого адаптера.
Примечание. Элементы каталога /net, которые соответствуют узлам, расположенным в том же домене, что и локальный компьютер, не включают в себя доменное имя. Например, если локальный компьютер находится в домене qnx.com, то элемент узла karl имеет вид /net/karl. Если компьютер находится в другом домене, то этот элемент имеет вид /net/karl.qnx.com.

Программные компоненты сети Qnet

Для функционирования сети Qnet наряду с оборудованием требуются следующие программные компоненты (рис. 12.1):



Рис. 12.1. Компоненты сети Qnet


Запуск Qnet

Протокол Qnet можно запустить одним из следующих способов:

или:

Примечание. Если протокол Qnet работает на локальном компьютере, то пользователь любого компьютера сети с работающим протоколом Qnet может просматривать файлы и процессы локального компьютера при наличии прав доступа к ним. Более подробные сведения см. в следующих источниках:

Создание файла useqnet

Чтобы автоматически запускать протокол Qnet при загрузке системы, следует войти в нее как пользователь root и создать пустой файл useqnet следующим образом:

touch /etc/system/config/useqnet

Если этот файл существует, сценарий /etc/system/sysinit запускает протокол Qnet при загрузке компьютера. Чтобы передать протоколу Qnet какие-либо параметры, следует отредактировать файл sysinit, изменив следующие его строки:


# Запустить протокол qnet, если пользователь включил его.

if test -r /etc/system/config/useqnet -a -d /dev/io-net; then

mount -Tio-pkt lsm-qnet.so

fi


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

# Запустить протокол qnet, если пользователь включил его.

if test -r /etc/system/config/useqnet -a -d /dev/io-net; then

mount -Tio-pkt -o do_crc=1 lsm-qnet.so

fi


Более подробные сведения о том, что происходит при загрузке системы, см. в разделе 8.


Запуск сетевого администратора, протоколов и драйверов

Администратор io-pkt* — это процесс, который выполняет ключевую функцию загрузки набора разделяемых объектов. Он является основой всего стека протоколов и обеспечивает передачу данных между модулями. Множество разделяемых объектов собственной сети QNX Neutrino включает в себя библиотеку lsm-qnet.so и сетевые драйверы, например devn-ppc800-ads.so. Разделяемые объекты организованы в виде иерархии, где вершиной является конечный пользователь, а нижним уровнем — оборудование.

Предупреждение.

Программа распознавания устройств автоматически запускает процесс io-pkt* при загрузке компьютера и загружает драйверы обнаруженных устройств. Можно запустить несколько экземпляров администратора io-pkt*, однако для этого необходима специальная настройка. Если требуется запустить процесс io-pkt* вручную, то сначала следует завершить работающий процесс io-pkt* с помощью команды slay.

Процесс io-pkt* можно запустить из командной строки, указав ему, какие драйверы и протоколы следует загрузить:

$ io-pkt* -del900 -p npm-qnet &

В этом примере администратор io-pkt-v4 загружает Ethernet-драйвер devn-el900.so и стек протоколов Qnet.

Модули можно запускать и останавливать динамически при помощи команд mount и umount следующим образом:

$ io-pkt-v6-hc &

$ mount -Tio-pkt devn-el900.so

$ mount -Tio-pkt lsm-qnet.so

Чтобы выгрузить драйвер, следует ввести команду:

umount /dev/io-net/en0


Примечание. Демонтировать стеки протоколов, такие как TCP/IP и Qnet, нельзя.

Просмотр сетевого окружения

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

Например, чтобы отобразить содержимое файла, который находится на другом компьютере, можно воспользоваться утилитой less, указав путь с префиксом /net:

less /net/alonzo/etc/TIMEZONE

Чтобы считать системную информацию обо всех удаленных узлах, которые перечислены в каталоге /net, следует воспользоваться утилитой pidin с аргументом net:

$ pidin net

Можно вызвать утилиту pidin с параметром -n, чтобы получить информацию о процессах на другом компьютере:

pidin -n alonzo | less


Можно даже запустить процесс на другом компьютере, используя собственную консоль для ввода и вывода, с помощью команды
on с параметром -f:

on -f alonzo date


Заполнение каталога /net

После загрузки и запуска Qnet вместе с сетевым драйвером, если приложения на узле не пытаются взаимодействовать с другими приложениями через Qnte, то каталог /net будет медленно заполняться остальными узлами по мере получения от них сведений, отправленных ими в широковещательном режиме.

По умолчанию для этого задан интервал 30 секунд, и он может изменяться с помощью опции auto_add=X модуля lsm-qnet.so. Другими словами, через 30 секунд после загрузки каталог /net, возможно, будет заполнен настолько, насколько это возможно.

Примечание. Для взаимодействия с удаленным узлом не требуется ждать 30 секунд; приложения могут обращаться через Qnet к удаленным узлам сразу после инициализации Qnet и сетевого драйвера.

Если существует некоторый элемент каталога /net, то это значит только то, что Qnet отображает представленное в ASCII-символах текстовое имя узла на MAC-адрес Ethernet. Это лишь немного замедляет процесс распознавания имен, но это позволяет пользователям увидеть, какие еще узлы доступны в данной сети.

Элементы каталога /net не удаляются пока кто-либо пытается их использовать, поэтому они могут быть некорректными.

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

Для удаления неправильных элементов из /net можно воспользоваться командой:

ls -l /net &

Для полной очистки /net необходимо выполнить команду:


rmdir /net/*


Устранение неполадок

Для того чтобы собственная сеть операционной системы QNX Neutrino функционировала, все программные компоненты протокола Qnet должны корректно взаимодействовать с оборудованием. Если сеть Qnet не работает, то при поиске проблем с оборудованием и сетью можно воспользоваться различными Qnet-утилитами для получения диагностической информации.
Протокол Qnet создает каталог /net. Чтобы убедиться в том, что этот каталог существует, следует воспользоваться командой

$ ls /net

Если каталог /net не содержит ни одного подкаталога, то протокол Qnet не работает. Этот каталог должен содержать как минимум один элемент с именем локального компьютера, которое выводит команда hostname. Если используется привязка протокола Ethernet, то все остальные доступные компьютеры также отображаются в каталоге /net. Пример:

joseph/ eileen/

Как было отмечено ранее, процесс io-pkt* является связующим звеном между драйверами и протоколами. Чтобы проверить наличие неполадок в нем, следует воспользоваться командой pidin:

$ pidin -P io-pkt-v4-hc mem


Затем следует выполнить поиск разделяемого объекта протокола Qnet в полученном выводе:
Чтобы определить, работает ли сетевая плата (другими словами, выполняет ли она прием и передачу пакетов), следует воспользоваться командой nicinfo. Переменная окружения PATH пользователя root включает в себя каталог, в котором находится исполняемый файл nicinfo; всем остальным пользователям необходимо указывать полный путь к этому файлу:

$ /usr/sbin/nicinfo

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

en0:

AMD PCNET-32 Ethernet Controller

Physical Node ID ...........................000C29 DD3528

Current Physical Node ID ...................000C29 DD3528

Current Operation Rate .....................10.00 Mb/s

Active Interface Type ......................UTP

Maximum Transmittable data Unit ............1514

Maximum Receivable data Unit ...............1514

Hardware Interrupt .........................0x9

I/O Aperture ...............................0x1080 - 0x10ff

Memory Aperture ............................0x0

Promiscuous Mode ...........................Off

Multicast Support ..........................Enabled


Packets Transmitted OK ..................... 588

Bytes Transmitted OK ....................... 103721

Memory Allocation Failures on Transmit ..... 0


Packets Received OK ........................ 11639

Bytes Received OK .......................... 934712

Memory Allocation Failures on Receive ...... 0


Single Collisions on Transmit ...............0

Deferred Transmits ..........................0

Late Collision on Transmit errors ...........0

Transmits aborted (excessive collisions) ....0

Transmit Underruns ..........................0

No Carrier on Transmit ......................0

Receive Alignment errors ....................0

Received packets with CRC errors ............0

Packets Dropped on receive ..................0

Следует обратить особое внимание на значения счетчиков Total Packets Txd OK и Total Packets Rxd OK. Если они равны нулю, то, возможно, драйвер не работает или отсутствует подключение к сети. Следует проверить запись Current Operation Rate и убедиться в том, что драйвер корректно автоматически определил скорость передачи данных.

Диагностическая информация находится в файле /proc/qnetstats. Если этот файл не существует, протокол Qnet не работает.

Файл qnetstats содержит много диагностической информации, которая имеет смысл для разработчиков, использующих протокол Qnet, но бесполезна для других пользователей. Тем не менее, можно воспользоваться утилитой grep, чтобы извлечь определенные поля из файла /proc/qnetstats:

# cat /proc/qnetstats | grep "compiled"

**** Qnet compiled on Jun 3 2008 at 14:08:23 running on EAdd3528


Еще один пример:

# cat /proc/qnetstats | grep -e "ok" -e "bad"

txd ok 930

txd bad 0

rxd ok 2027

rxd bad dr 0

rxd bad L4 0


Если для запуска протокола Qnet требуется помощь, отдел технической поддержки компании QNX Software Systems может попросить предоставить эту информацию.
Чтобы узнать имя хоста, следует воспользоваться утилитой hostname. Сеть Qnet работает только в случае, если имя хоста является уникальным. Если узлы находятся в разных доменах, то для доступа к узлу необходимо указывать домен. Пример:

ls /net/kenneth.qnx.com