Рассматриваются механизмы взаимодействия узлов в собственной распределенной сети ЗОСРВ «Нейтрино»
Статья включает:
Собственная сеть ЗОСРВ «Нейтрино» представляет собой группу соединенных между собой рабочих станций, каждая из которых работает под управлением операционной системы ЗОСРВ «Нейтрино». В этой сети программа имеет прозрачный доступ к любому ресурсу, который расположен на любом другом узле (компьютере или рабочей станции) локальной подсети, будь то файл, устройство или процесс. Собственная сеть ЗОСРВ «Нейтрино» даже позволяет запускать программы на других узлах.
Протокол, который используется в собственной сети ОС КПДА.00002-01, называется FLEET. Он несовместим с протоколом Qnet операционной системы ЗОСРВ «Нейтрино». |
В сущности, протокол Qnet прозрачно распространяет действие механизма межзадачного взаимодействия (IPC) на сеть микроядер, используя принцип передачи сообщений ЗОСРВ «Нейтрино» для реализации собственной сети.
Записи всех узлов локальной подсети, на которых работает протокол Qnet, расположены в пространстве имен /net
(в операционной системе КПДА.00002-01 для обращения к другому узлу применяется двойная косая черта, за которой следует номер узла).
Более подробные сведения о протоколе Qnet см. в Сетевой стек и протоколы TCP/IP.
Когда следует использовать протокол 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 использует следующие правила.
_CS_HOSTNAME
. Если хост имеет имя localhost
, которое назначается по умолчанию при первой загрузке, то протокол Qnet обеспечивает связь между узлами, используя имя хоста на основе MAC-адреса сетевого адаптера. karl
и доменное имя kpda.ru
, то полностью определенным именем узла является karl.kpda.ru
; /net
; он используется в примерах, которые приведены в этом разделе. Примечание. Элементы каталога /net , которые соответствуют узлам, расположенным в том же домене, что и локальный компьютер, не включают в себя доменное имя. Например, если локальный компьютер находится в домене kpda.ru , то элемент узла karl имеет вид /net/karl . Если компьютер находится в другом домене, то этот элемент имеет вид /net/karl.kpda.ru . |
Для функционирования сети Qnet наряду с оборудованием требуются следующие программные компоненты (рис. 1):
Протокол Qnet можно запустить одним из следующих способов:
Если протокол Qnet работает на локальном компьютере, то пользователь любого компьютера сети с работающим протоколом Qnet может просматривать файлы и процессы локального компьютера при наличии прав доступа к ним. Более подробные сведения см. в следующих источниках: |
Чтобы автоматически запускать протокол 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
. Разделяемые объекты организованы в виде иерархии, где вершиной является конечный пользователь, а нижним уровнем – оборудование.
Программа распознавания устройств автоматически запускает процесс 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
Qnet поддерживает два режима связи: первый - напрямую через Ethernet, а второй - через IP. Используя Qnet через IP, вы можете подключиться к любому удаленному компьютеру через следующим образом:
_CS_DOMAIN
значение вашего домена.
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
После загрузки и запуска Qnet вместе с сетевым драйвером, если приложения на узле не пытаются взаимодействовать с другими приложениями через Qnet, то каталог /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/*
Для того чтобы собственная сеть операционной системы ЗОСРВ «Нейтрино» функционировала, все программные компоненты протокола 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 в полученном выводе:
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
Предыдущий раздел: перейти