MIS, NIS+ и WINS
Разработчики из Sun Microsystems, осознав, что «редактирование по одному файлу на каждой машине» вряд ли можно назвать масштабируемым подходом, придумали нечто под названием желтые страны цы (Yellow Pages или YP). YP были созданы для распространения информации из конфигурационных файлов сетевого масштаба, таких как /etc/hosts, /etc/passwd, /etc/services и т. д. В этой главе мы оетано вимся на
использовании «желтых страниц» в качестве информационной службы сети для предоставления сведений о связи между именем машины и ее IP-адресом.
YP были переименованы в
Информационную службу сети (Network Information Service или NIS) в 1990 г., когда компания British Telecom (совместно с юристами) заявила о правах на торговую марку «Yellow Pages» в Великобритании. Призрак «желтых страниц» по-прежнему витает во многих Unix-системах, и сегодня для команд и библиотечных вызовов NIS употребляются имена
у peat, ypmatch, yppush и т. д. Все современные разновидности Unix поддерживают NIS. На машинах с NT можно использовать NIS для авторизации, если применить специальные библиотеки авторизации, но о существовании NIS-серверов для NT я не знаю. Мне также не известно о существовании NIS для MacOS.
В NIS администратор определяет одну или несколько машин как серверы, от которых другие машины получают клиентский сервис. Один из серверов является главным (master), все остальные - подчиненные (slave). На главном сервере хранятся основные копии текстовых файлов (например /etc/hosts или /etc/passwd), которые используют все машины. Эти файлы изменяются на главном сервере и затем распространяются на подчиненные.
Теперь, если машине в сети необходимо получить информацию о связи IP-адресов и имен узлов, она обращается к серверу, вместо того чтобы хранить собственную локальную копию этой информации. Клиент может запрашивать информацию как с главного, так и с любого из подчиненных серверов. Запросы клиентов просматриваются в NIS-тшр-тах.
Карты - это другое название основных файлов, уже преобразованных в формат базы данных Unix DBM и распространенных на подчиненные серверы. С подробностями этого процесса преобразования (который включает в себя makedbm и некоторые другие изменения текста) можно ознакомиться в файле Makefile, в большинстве случаев расположенном в /var/yp. Группа NIS-серверов и клиентов, использующих одни и те же карты, называется NIS-доменом.
NIS значительно упрощает администрирование сетей. Так, если в сети oog.org появляются новые машины, то добавить их в существующую сеть совсем не сложно. Менеджер сети редактирует файл узлов на главном NIS-сервере и «проталкивает» новую версию на все подчиненные. Теперь каждый клиент из NIS-домена будет «знать» о существовании новых машин. NIS обеспечивает легкость администрирования, объединенную с избыточностью (если один сервер недоступен, клиент может обратиться к другому) и распределением нагрузки (не все клиенты в сети используют один и тот же сервер).
Теперь, когда мы знакомы с теорией, можно посмотреть, как Perl помогает в вопросах, связанных с NIS. Начнем мы с процесса размещения данных в NIS. Вы, наверное, удивитесь, но это уже практически сделано. Файлы узлов, созданные в предыдущем разделе, можно импортировать в NIS, просто перенеся их в нужное место в каталоге исходных файлов на главном сервере и активировав обычные механизмы принудительной рассылки (проталкивания, push mechanisms), как правило, для этого надо выполнить make в /var/yp. По умолчанию Makefile из каталога /var/yp
использует в качестве исходников для NIS-карт содержимое конфигурационных файлов главного сервера.
Обычно имеет смысл создать отдельный каталог для исходных файлов NIS-карт и соответствующим образом изменить Makefile. Это позволит хранить различные данные для главного сервера и остальных членов NIS-домена. Например, вы можете не захотеть, чтобы файл /etc/passwd с главного сервера применялся в качестве файла паролей для всего домена, или наоборот.
Более интересная задача - получить данные из NIS, запрашивая NIS-сервер. Проще всего это сделать при помощи модуля Net: : NIS Рика Ха-риса (Rik Harris). Данный модуль, начиная с 1995 года, находится в состоянии альфа-версии, но, тем не менее, он вполне рабочий.
Вот пример, позволяющий получить и напечатать содержимое карты при помощи одной функции, применяя Net: : NIS. Это похоже на команду NIS уpeat:
use Net::NIS;
NIS-домен по умолчанию
Sdomain = Net: :NIS: :yp_get_default_domain();
считываем карту
(Sstatus, $info) = Net::NIS::yp_all($domain."hosts.byname");
oreach my $name (sort keys %{$info}){
print "$name => $info->{$name}\n";
}
Сначала необходимо обратиться к локальному узлу для получения имени домена. Используя эту информацию, можно вызвать функцию Net: :NIS: :yp_all() и получить карту. Функция возвращает переменную состояния (фиктивную, как видно из сноски) и ссылку на хэш-таблицу, содержащую данные из этой карты. Мы выводим эту информацию, применяя обычный синтаксис разыменования.
Если нужно узнать только IP-адрес одного узла, эффективнее было бы запросить у сервера именно это значение:
use Net::NIS;
Shostname = "olaf.oog.org";
Sdomain = Net::NIS::yp_get_default_domain();
(Sstatus. Sinfo) = Net: :NIS: :yp_match(Sdomain. "hosts. byrame". Sfiostr. w.t.'
print $info, "\n":
Функция Net: :NIS: :yp_match() возвращает еще одну фиктивную переменную состояния и значение (скаляр), соответствующее запрашиваемой информации.
Если не удается скомпилировать модуль Net: : NIS или он просто не работает, всегда остается возможность вызвать внешнюю программу. Например, так:
(5>hosts='<nyrb K>/ypcat hosts' или так:
open(YPCAT,"<путь K>/ypcat hostsl");
while (<YPCAT>){...}
Завершит данный раздел пример, в котором применяются оба способа. Этот маленький, но полезный фрагмент программы получает список текущих NIS-серверов и опрашивает каждый из них при помощи программы yppoll. Если какой-либо из серверов не отвечает как полагается, выводится соответствующее сообщение:
use Net::NIS;
Syppollex = "/usr/etc/yp/yppoll";
полный путь к программе yppoll
Sdomain = Net::NIS::yp_get_default_domain();
(Sstatus,Sinfo) = Net::NIS::yp_all($domain,"ypservers");
foreach my $name (sort keys %{$info}) {
Sanswer = 'Syppollex -h Sname hosts.byname':
if (Sanswer !" /has order number/) { warn "Sname отвечает неверно1\n";
}
}
NIS+
В состав операционной системы Solaris входит NISH— следующая версия NIS. В NIS+ решены многие из наиболее серьезных проблем, которые были в NIS, в частности, проблема безопасности. К сожалению (а может быть и к счастью, т. к. NIS+ администрировать несколько NIS, NIS+nWINS 181
сложнее), NIS+ не стала столь популярной в мире Unix, как NIS. До недавнего времени она практически не поддерживалась на машинах, созданных не в Sun. NIS+ постепенно «приживается» в стандартных дистрибутивах Linux, благодаря работе Торстена Кукука (Thorsten Kukuk) (http://www.suse.de/~kukuk/nisplus/index.html), но она отнюдь не преобладает в мире Unix и ее просто не существует в NT и MacOS.
Принимая во внимание то, что NIS+ используется незначительно, говорить о ней в книге мы больше не будем. Если вам необходимо работать с NIS+ из Perl, можете применять еще один модуль Хариса - Net::NISPlus.
Windows-служба имен Интернета (WINS)
Когда в Microsoft стали использовать свой патентованный сетевой протокол NetBIOS поверх TCP/IP (NetBT), возникла необходимость решать проблему соответствия IP-адресов и имен узлов. Первым решением стало использование файла Imhosts, спроектированного по аналогии со стандартным файлом узлов. Но это было быстро дополнено NIS-подобным механизмом. В NT 3.5 появилась централизованная схема под названием Windows-служба имен Интернета (Windows Internet Name Service, или WINS). WINS несколько отличается от NIS:
WINS, как и NIS, позволяет иметь несколько серверов, повышающих надежность и разделяющих загрузку, по принципу«тяни-толкай». В Windows 2000 WINS вышла из употребления (читай «от нее избавились»), вместо нее теперь используется служба динамических доменных имен (Dynamic Domain Name Service), являющаяся расширением DNS-системы, о которой мы очень скоро поговорим еще.
Учитывая, что WINS больше не существует, мы не будем приводить примеров для работы с ней. В настоящее время работа с WINS напрямую из Perl поддерживается очень слабо. Я не знаю о существовании модулей, созданных специально для работы с WINS. В этом случае лучше всего вызывать некоторые утилиты, работающие в командной строке из Windows NT Server Resource Kit, например WINSCHK и WINSCL.