Прозрачная распределенная сеть Qnet

Рассматриваются механизмы взаимодействия узлов в собственной распределенной сети ЗОСРВ «Нейтрино»

Статья включает:

Что такое Qnet?
Когда использовать протокол Qnet?
Правила именования узлов
Программные компоненты сети Qnet
Запуск Qnet
Создание файла useqnet
Запуск сетевого администратора, протоколов и драйверов
Инкапсуляция Qnet в IP
Просмотр сетевого окружения
Заполнение каталога /net
Устранение неполадок
Работает ли протокол Qnet?
Работают ли процесс io-pkt-* и драйверы?
Работает ли сетевая плата?
Как получить диагностическую информацию?
Уникально ли имя хоста?
Находятся ли узлы в одном и том же домене?

Что такое Qnet?

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


Note: Протокол, который используется в собственной сети ОС КПДА.00002-01, называется FLEET. Он несовместим с протоколом Qnet операционной системы ЗОСРВ «Нейтрино».

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

Записи всех узлов локальной подсети, на которых работает протокол Qnet, расположены в пространстве имен /net (в операционной системе КПДА.00002-01 для обращения к другому узлу применяется двойная косая черта, за которой следует номер узла).

Более подробные сведения о протоколе Qnet см. в Сетевой стек и протоколы TCP/IP.

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

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

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

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

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

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

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

Для разрешения имен узлов протокол Qnet использует следующие правила.

имя узла (node name)
символьная строка, идентифицирующая узел, с которым осуществляется связь. Это имя должно быть уникальным в домене и не может содержать косых черт и точек; По умолчанию именем узла является значение конфигурационной строки _CS_HOSTNAME. Если хост имеет имя localhost, которое назначается по умолчанию при первой загрузке, то протокол Qnet обеспечивает связь между узлами, используя имя хоста на основе MAC-адреса сетевого адаптера.
домен узла (node domain)
символьная строка, которая добавляется в конец имени узла библиотекой lsm-qnet.so. Имя и домен узла в совокупности должны составлять строку, которая является уникальной для всех узлов, взаимодействующих друг с другом по сети. По умолчанию домен узла задается значением конфигурационной строки _CS_DOMAIN;
полностью определенное имя узла (fully qualified node name, FQNN)
строка, которая формируется путем объединения имени и домена узла. Например, если узел имеет имя karl и доменное имя kpda.ru, то полностью определенным именем узла является karl.kpda.ru;
сетевой каталог (network directory)
каталог в пространстве путевых имен, который создается библиотекой lsm-qnet.so. С каждым сетевым каталогом (их может быть несколько на одном узле) связан домен узла. Сетевым каталогом по умолчанию является /net; он используется в примерах, которые приведены в этом разделе.

Note: Примечание. Элементы каталога /net, которые соответствуют узлам, расположенным в том же домене, что и локальный компьютер, не включают в себя доменное имя. Например, если локальный компьютер находится в домене kpda.ru, то элемент узла karl имеет вид /net/karl. Если компьютер находится в другом домене, то этот элемент имеет вид /net/karl.kpda.ru.

разрешение имени (name resolution)
процесс, с помощью которого модуль lsm-qnet.so преобразует полностью определенное имя узла в список адресов назначения, доступных транспортному уровню;
разрешитель имени (name resolver)
элемент кода, который реализует конкретный метод преобразования полностью определенного имени узла в список адресов назначения. Каждый сетевой каталог имеет список разрешителей имен, которые по очереди используются для разрешения полностью определенного имени узла. Разрешителем имени по умолчанию является протокол обнаружения узлов (Node Discovery Protocol, NDP).

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

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

12_1.png
Рисунок 1. Компоненты сети Qnet

io-pkt-*
администратор, который обеспечивает поддержку динамически загружаемых сетевых модулей;
сетевые драйверы (devn-*, devnp-*)
администраторы, которые образуют интерфейс с оборудованием;
lsm-qnet.so
собственный сетевой администратор операционной системы ЗОСРВ «Нейтрино», который реализует протоколы Qnet.

Запуск Qnet

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


Note: Если протокол 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

Более подробные сведения о том, что происходит при загрузке системы, см. в разделе Управление запуском ЗОСРВ «Нейтрино».

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

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


Warning: Программа распознавания устройств автоматически запускает процесс 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


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

Инкапсуляция Qnet в IP

Qnet поддерживает два режима связи: первый - напрямую через Ethernet, а второй - через IP. Используя Qnet через IP, вы можете подключиться к любому удаленному компьютеру через следующим образом:

  1. Qnet должен использовать DNS для получения IP-адреса (т. е. использовать параметр resolve=dns). Настройте имя локального хоста и домен, а затем убедитесь, что gethostbyname() может разрешать все имена хостов, с которыми вы хотите общаться (включая локальный компьютер):

  2. Запустите (или смонтируйте) Qnet с опциями bind=ip и resolve=dns. Например:

    io-pkt-v4 -d e1000 -p qnet bind=ip,resolve=dns

    или

    mount -Tio-pkt -o bind-ip,resolve=dns full_path_to_dll/lsm-qnet.so

Если Qnet работает напрямую через Ethernet, то имена узлов автоматически появляются в каталоге /net. При режиме работы через IP имена появляются по мере необходимости (например, при выполнении ls /net/host1).

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

После запуска протокола 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 вместе с сетевым драйвером, если приложения на узле не пытаются взаимодействовать с другими приложениями через Qnet, то каталог /net будет медленно заполняться остальными узлами по мере получения от них сведений, отправленных ими в широковещательном режиме.

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


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

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

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

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

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

ls -l /net &

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

rmdir /net/*

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

Для того чтобы собственная сеть операционной системы ЗОСРВ «Нейтрино» функционировала, все программные компоненты протокола Qnet должны корректно взаимодействовать с оборудованием. Если сеть Qnet не работает, то при поиске проблем с оборудованием и сетью можно воспользоваться различными Qnet-утилитами для получения диагностической информации.

Работает ли протокол Qnet?

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

$ ls /net

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

joseph/ eileen/

Работают ли процесс io-pkt-* и драйверы?

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

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

Затем следует выполнить поиск разделяемого объекта протокола Qnet в полученном выводе:

pid tid name prio STATE code data stack 118802 1 sbin/io-pkt-v4-hc 21o SIGWAITINFO 876K 672K 4096(516K)* 118802 2 sbin/io-pkt-v4-hc 21o RECEIVE 876K 672K 8192(132K) 118802 3 sbin/io-pkt-v4-hc 21r RECEIVE 876K 672K 4096(132K) 118802 4 sbin/io-pkt-v4-hc 21o RECEIVE 876K 672K 4096(132K) 118802 5 sbin/io-pkt-v4-hc 20o RECEIVE 876K 672K 4096(132K) 118802 6 sbin/io-pkt-v4-hc 10o RECEIVE 876K 672K 4096(132K) libc.so.2 @b0300000 436K 12K devnp-shim.so @b8200000 28K 4096 devn-pcnet.so @b8208000 40K 4096 lsm-qnet.so @b8213000 168K 36K

Если в выводе присутствует разделяемый объект lsm-qnet.so, то протокол 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

Уникально ли имя хоста?

Чтобы узнать имя хоста, следует воспользоваться утилитой hostname. Сеть Qnet работает только в случае, если имя хоста является уникальным.

Находятся ли узлы в одном и том же домене?

Если узлы находятся в разных доменах, то для доступа к узлу необходимо указывать домен. Пример:

ls /net/kenneth.kpda.ru




Предыдущий раздел: перейти