Issuu on Google+

Так видит журнал читатель, который забыл оформить подписку:

КА

БЫ С

ТР О ТИ РАС РА КУ Ж ПИ

НИ НО К У ВО ЛЫ ГО ЗА ДНИ ТЯ Е НУ ЛИ

ЛИ

СЬ

№5(30) май 2005 подписной индекс 81655 www.samag.ru

Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии

№3(40) март 2006 подписной индекс 20780 www.samag.ru

танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM

Так видит журнал читатель, оформивший подписку: №5(30) май 2005 подписной индекс 81655 www.samag.ru

Почему MS SQL медленно работает? Ищем причины

№3(40) март 2006

КО НЕО НЧ ЖИ ИЛ ДА ИС НН ЬД О ЕН ЬГ И ЗА

ПО АВ СЛ РА Е О Л НА ТПУ РА СКА БО ТЕ

УЕ ХА Л

ВО

ТП УС К

Интервью с Ларри Уоллом – создателем языка Perl

Узнай секреты WMI: события и провайдеры Кириллизация в Linux Знакомимся с Gentoo: установка системы Создаем порт для FreeBSD своими руками

Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl

Zserver Suite: защищаем корпоративные хранилища данных Управляем сетевым оборудованием с помощью протокола SNMP Работаем с PDF из Perl

ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Роспечать – 20780, 81655 Пресса России – 87836 Интер-почта – тел. (095) 500-00-60

Документация – экономия времени или его бесполезная трата?


оглавление 3 ТЕНДЕНЦИИ

БЕЗОПАСНОСТЬ

4 СОБЫТИЯ

52 Zserver Suite: защищаем корпоративные хранилища данных

АДМИНИСТРИРОВАНИЕ 6 Узнай секреты WMI: события и провайдеры Часть 1: дополнительные возможности

Решаем задачи обработки системных событий, используя технологию WMI на примере подключения съемных USB-дисков. Константин Леонтьев klеоnt@miсrоsоft.соm

14 Кириллизация в Linux

Принято считать, что в Linux уже давно нет проблем с кириллизацией приложений. Но на практике ситуация еще весьма далека от идеальной. Алексей Барабанов alekseybb@mail.ru

22 Знакомимся с Gentoo Часть 1: установка системы

Одним из главных завоеваний Open Source можно назвать свободу выбора. Дальше всех в этом вопросе пошли разработчики Gentoo – они решили вообще ничего не навязывать пользователю. Сергей Супрунов amsand@rambler.ru

27 Собираем собственную ОС на базе Linux

Десятки компаний и тысячи программистов соревнуются в создании лучшего Linux-проекта. Между тем, любой опытный пользователь может стать автором системы для домашнего ПК, не уступающей продуктам гигантов IT-индустрии. Илья Александров ilya_al@rambler.ru

32 Создаем порт для FreeBSD своими руками Часть 1: основные возможности

Cистема портов – то, чем по праву гордится FreeBSD. Система содержит ссылки на десятки тысяч программ, и список этот постоянно пополняется. Кто их создает, эти пополнения – некие выдающиеся специалисты? Да вовсе нет. Вы тоже сможете стать одним из них. Рашид Ачилов shelton@granch.ru

40 OpenPKG: кроссплатформенная система пакетов Обзор возможностей проекта.

Андрей Коврин kover@samag.ru

42 MikroTik – Router OS

Типичные задачи – организовать совместный доступ в Интернет и вести учет трафика. Несмотря на простоту определения, при более детальном подходе они распадаются на сотни подзадач, полноценно справиться с которыми под силу далеко не каждому. Сергей Яремчук grinder@ua.fm

46 Шлюз аутентификации пользователей NuFW

Фильтрация IP-пакетов – простое и эффективное средство защиты сетей. Но этому подходу явно не хватает детализации, а удаленность от прикладного уровня требует согласования с другими инструментальными средствами безопасности. Сергей Яремчук grinder@ua.fm

№3, март 2006

Как обеспечить защиту конфиденциальной информации, хранимой и обрабатываемой на корпоративных серверах? Алексей Шелестов info@securit.ru

ДОКУМЕНТАЦИЯ 56 Документация – экономия времени или его бесполезная трата?

Искусство составления и использования документации – неотъемлемая часть работы хорошего IT-специалиста. Алексей Коршунов akeeper@samag.ru

СЕТИ 60 Интернет «от Москвы до самых до окраин»

Недорогой Интернет в любую точку страны? Это возможно! Все этапы подключения – от покупки оборудования до настройки. Роман Ерин kid@vsnet.ru

64 Управляем сетевым оборудованием с помощью протокола SNMP

Теоретические основы работы протокола SNMP и практическая реализация решения некоторых задач с помощью сценариев на языке Perl. Андрей Бирюков mex_inet@rambler.ru

ПРОГРАММИРОВАНИЕ 70 Переходим от VBScript к ASP и ASP.NET: Часть2

Дописываем Framework на примере сетевых папок. Иван Коробко ikorobko@prosv.ru

78 Работаем с PDF из Perl

Для создания и модификации документов PDF можно применять самые различные средства: от дорогих настольных издательских систем до сценариев на популярных языках программирования. Валентин Синицын val@linuxcenter.ru

ХОББИ 84 Коллекция «Почему?» Анна Николаева Info1@samag.ru

РЕТРОСПЕКТИВА 86 История компьютеров «Амига» Часть вторая: 1995-2006

После смерти Джея Майнера и банкротства компании будущее Amiga оказалось под вопросом. Сергей Зуев megabyte2003@list.ru

92 КНИЖНАЯ ПОЛКА 77, 91

BUGTRAQ

1


конкурс

Редакция журнала «Системный администратор» объявляет об учреждении 3 премий авторам по итогам 2006 года:  1 место – 30 000 рублей  2 место – 20 000 рублей  3 место – 10 000 рублей

Номинации

1. За лучшую серию материалов 2. За лучшую новую авторскую тему 3. За лучшую аналитическую статью

Кто участвует Участие принимают все авторы, опубликовавшие свои статьи в журнале «Системный администратор» в течение 2006 года. Напоминаем, что автором может стать любой человек.

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

Общие требования к статьям

О номинациях 1. Серией материалов считается блок из не менее чем двух статей. Тема серии – по собственному выбору автора или же по выбору редакции. 2. Статья, написанная на тему, придуманную автором и одобренную редакцией. 3. Аналитическая статья может быть написана на тему, предложенную автором или же на тему, заказанную редакцией.

Кто судьи В состав жюри войдут сотрудники редакции и представители дружественных журналу информационных ресурсов.

предполагает объем, превышающий 20 тыс. знаков – разбивайте материал на несколько частей. Если вы пишете о продукте, технологии или компании, описывайте не только «плюсы», но и «минусы», а также приводите информацию о конкурентах. Рекомендуем ознакомиться со статьями на интересующую вас тему, которые уже есть на нашем сайте.

Требования к виду присылаемых материалов Статьи следует присылать в текстовом виде, предпочтительно в формате RTF или DOC. Имена пересылаемых файлов только на английском языке. Выравнивание столбцов производится табуляцией, а не пробелом. В тексте статьи рекомендуется указывать местоположение иллюстраций и подписи к ним, а сами иллюстрации не нужно вставлять в тело документа, их нужно запаковать в отдельный архив. Иллюстрации должны быть строго в формате PNG. Листинги должны содержать не более 60 символов (вместе с пробелами) в одной строчке. Переносы строк листингов должны быть указаны в явном виде (---перенос строки---). Если в статье приводятся ссылки на ресурсы в сети, URL должен быть указан в явном виде.

Статьи не должны иметь рекламный характер какого-либо продукта, компании или технологии. Контакты В статье указываются ссылки на источники информа- Адрес: 107045, г. Москва, Ананьевский переулок д. 4/2, ции. стр. 1, Редакция «Учительской газеты», журнал «СистемНе допускается несанкционированный перевод на рус- ный администратор» ский язык статей, обзоров и сравнительных тестирований Телефон: (495) 928-82-53 Факс: (495) 928-82-53 продуктов, опубликованных в иностранных изданиях. Сайт: www.samag.ru e-mail: imp@samag.ru Рекомендации авторам secretar@samag.ru Объем статьи – от 4 до 20 тыс. знаков. Если тема статьи

2


тенденции MySQL AB купила Netfrastructure В конце февраля MySQL AB, известная своей свободной базой данных, объявила о приобретении компании Netfrastructure. Руководитель приобретенной фирмы, Джим Старки, до этого возглавлял Interbase, которая занималась разработкой и поддержкой одноименной СУБД. На базе этого кода (когда он был открыт) зародился Open Source-проект Firebird, ставший фундаментом для бизнеса Netfrastructure. Возможно, MySQL AB с помощью разработок и сотрудников Netfrastructure намерена создать замену своему InnoDB.

Fedora Core 5 все-таки вышла После неоднократных переносов релиза новой версии наследника Red Hat Linux в середине марта наконец-то был официально представлен выход Fedora Core 5. Последний перенос релиза FC5 был связан с ожиданием GNOME 2.14, так что эта версия популярной графической среды и вошла в состав дистрибутива. В качестве альтернативы предлагается KDE 3.5.1. Стоит отметить, что совершенствования в графической системе Fedora Core этим не ограничились – в последнем релизе дистрибутива впервые появилась технология AIGLX (Accelerated Indirect GL X), по своей сути напоминающая XGL, разрабатываемую в Novell для SUSE. AIGLX приводит в действие GL-эффекты на рабочем столе благодаря модифицированному X-серверу (с некоторыми расширениями), обновленной версии Mesa и оконному менеджеру Metacity с композитным менеджером. Кроме того, в Fedora Core 5 представлен офисный пакет OpenOffice.org 2.0.2, открытая реализация технологии .NET Mono, ПО для виртуализации Xen, утилиты для работы с пакетами на базе Yum, поддержка SELinux.

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

BECTA «противоречиво» относится к Open Source Пол Дженкинс из компании SimpleICT указал на «непоследовательность» в отношении британского агентства по образовательным коммуникациям и технологиям (BECTA) к открытому ПО. Список образовательных программ, опубликованный BECTA, ранее сообщавшим о возможности для школ сэкономить благодаря Open Source, содержит ничтожно малое число приложений для GNU/Linux (18 против трех тысяч для различных версий Windows). Вдобавок к этому там вовсе отсутствуют свободные программы для образования. Дженкинс же видит хорошие примеры из среды открытого ПО: «TuxMaths – отличная математическая программа для детей, но ее здесь нет. На самом деле, тут вообще ничего нет. Будь вы учителем, желающим использовать Linux, официальный сайт подсказал бы вам, что для этого нет программного обеспечения». В свою очередь, представитель BECTA объявил о намерении закрыть веб-сайт и порекомендовал пользователям обращаться к базе данных Curriculum Online. Однако, как выяснилось, и в ней фактически нет программного обеспечения с открытым кодом.

Составил Дмитрий Шурупов по материалам www.nixp.ru

Ubuntu будут тестировать больше обычного Релизы Ubuntu Linux выходили каждые 6 месяцев, однако для новой стабильной версии популярного GNU/Linux-дистрибутива для настольных ПК предлагается увеличить срок тестирования на 6 недель. Следующий релиз Ubuntu, получивший кодовое название «Dapper Drake», должен появиться в апреле и станет первой версией Ubuntu Linux с продолжительной технической поддержкой для пользователей: 3 года – для десктопредакции, 5 лет – для серверного варианта (для текущей версии этот срок составляет 3 года). Как сообщил в электронном письме Марк Шаттлворт, основатель проекта Ubuntu Linux, очень важно, чтобы все новшества были хорошо опробованы на стабильную работу: «Мы будем жить с Dapper целых пять лет – так давайте предоставим релизу еще пару недель сейчас, дабы он стал достойным продуктом проекта Ubuntu на все время своей жизни». Шаттлворт не собирается повредить хорошей репутации Ubuntu, сложившейся благодаря своевременным релизам, однако небольшая задержка позволит добиться большего тестирования, проверки на совместимость с же-

№3, март 2006

3


события

DiHalt 2006: компьютерное искусство в чистом виде Добро пожаловать на DiHalt 2006, один из крупных российских фестивалей компьютерного искусства. Несколько сотен человек из разных городов России и ближнего зарубежья в очередной раз соберутся в Нижнем Новгороде.  Когда: 29-30 апреля  Где: г. Нижний Новгород, ДК им. Орджоникидзе (ул. Чаадаева, 17)

 Подробности: www.dihalt.org.ru

П

роберитесь через джунгли творческого потенциала, мастерства и искусства, созданного молодыми креативными людьми из разных стран. Вас ждет огромное количество интересных конкурсов, нацеленных на три основных направления: программирование, музыка и графика. Каждое из направлений, в зависимости от сложности реализации и методов подхода, разбито на несколько конкурсов. На фестивале будут демонстрироваться работы, созданные не только на современных быстрых персональных компьютерах, но и на редких для нашей страны компьютерах Amiga, а также довольно популярных ранее и сейчас компьютерах ZX-Spectrum, которые вошли в массы как поистине «народные компьютеры». Не исключено, что примут участие и мобильные средства (КПК, сотовые телефоны, фотоаппараты). В частности, программисты покажут свои навыки в создании программ (demo и intro), ограниченных размером: 4 kb intro; 64 kb intro и 16 mb demo. Для тех, кто не знает что такое demo, расскажем подробнее. Это программа, сочетающая в себе ряд видео-эффектов, объединённых какимлибо сюжетом или идеей, демонстрирующихся под музыку. Это не заранее подготовленная анимация, а результат программных расчётов в реальном времени, подкреплённых работой художников, дизайнеров и музыкантов. Intro – это небольшое demo, над которой программисты обычно работают в одиночку. Художники будут соревноваться в умении:  рисовать вручную на компьютере (так называемый PixelArt);  создавать рисунки с помощью 3D-пакетов (Lightwave, 3DMax, Cinema);  создавать рисунки, полученные комбинированными способами (обработка в Photoshop, рендеринг, фотография, коллаж, ручное рисование и т. п.);  ASCII-графика (изображения, составленные из обычных букв и цифр). Отдельно идут конкурсы по анимационным видеороликам и flash-анимации. Ну а музыканты будут соревноваться в умении писать музыку/песни в формате mp3, а также в трекерных редакторах с разделением на традиционные и альтернативные стили. Аналогичные конкурсы для компьютеров ZX-Spectrum, на которых центральный процессор работает на частоте все-

4

го лишь 3.5 MHz (вот уж где люди проявляют своё мастерство, чтобы создать шедевры). Есть и специальный Wild-конкурс, в котором могут участвовать работы, не подходящие по критериям в какой-либо из перечисленных конкурсов. Гарантируем, что здесь вы не увидите и не услышите старые, надоевшие вещи. Ведь среди прочих требований к конкурсным работам значится условие предоставления участниками только свежих, ранее не опубликованных нигде работ! Вне конкурсов, на открытом воздухе, пройдет соревнование по спортивному метанию жёстких дисков на дальность, а также другие забавные конкурсы. Победителей ожидают призы. Фестиваль DiHalt – это еще и повод вживую встретить старых друзей, с которыми зачастую общаешься только через Интернет, а также завести новые знакомства! Здесь вы не увидите ленивых геймеров. Только творческие люди из разных стихий. Прийти на фестиваль, посмотреть или поучаствовать может любой! Ограничений по возрасту нет. По сложившейся традиции, а также в целях удобства для посетителей и организаторов, мероприятие пройдет в ДК им. Орджоникидзе, и будет представлено зрителям в виде шоу. На протяжении двух дней на большом экране и с хорошей звуковой системой будут демонстрироваться конкурсные работы, зрители сами их будут оценивать (выставляя свою оценку работе в специальном блокноте для голосования). В конце второго дня будут подведены итоги, а победители награждены ценными призами. Любой зритель может превратиться в участника фестиваля, если пришлёт организаторам свою работу, соответствующую указанным тематикам конкурсов, а также прочим нюансам, указанным в правилах. Каждый конкурс специально имеет свои ограничения и требования, что в конечном счете делает работы более интересными, а подходы к реализации более изощренными, и это поможет выявить настоящих профессионалов своего дела. Подробнее ознакомиться с правилами и требованиями для конкурсных работ вы можете по адресу: http://www.dihalt.org.ru/rules.htm. Свои работы отправляйте на электронный адрес dihalt@flatrate.ru. После окончания первого дня по принципу самоорганизации будет устроена hidden party (которая будет идти всю ночь). На ней вы сможете обсудить увиденное с друзьями, да и просто пообщаться с людьми в более неформальной атмосфере. Иногородним посетителям будет оказана помощь по размещению в гостиницах Нижнего Новгорода. Ждем вас на DiHalt 2006 ! Все вопросы, связанные с фестивалем, отправляйте на адрес dihalt@flatrate.ru.


г. Москва, Хлебный переулок 2/3 тел. 29-161-32, 202-61-43 (круглосуточно) e-mail: support@redline.ru

Íàøà êîìïàíèÿ 12 ëåò ïðåäîñòàâëÿåò ëèíèè ñâÿçè â ñàìûõ íåïðîõîäèìûõ ìåñòàõ Ìîñêâû. 10 Ìáèò - $500, âêëþ÷åíî ÌÍÎÃÎ òðàôèêà. Anything else? Çâîíèòå, äîãîâîðèìñÿ! ;-)


администрирование

Узнай секреты WMI: события и провайдеры Часть I: дополнительные возможности Алиса терпеливо ждала, пока Гусеница не соблаговолит снова обратить на нее внимание. Минуты через две та вынула кальян изо рта, зевнула –раз, другой – и потянулась. Потом она сползла с гриба и скрылась в траве, бросив Алисе на прощанье: – Откусишь с одной стороны – подрастешь, с другой – уменьшишься! – С одной стороны чего? – подумала Алиса. – С другой стороны чего? – Гриба, – ответила Гусеница, словно услышав вопрос, и исчезла из виду. С минуту Алиса задумчиво смотрела на гриб, пытаясь определить, где у него одна сторона, а где – другая; гриб был круглый, и это совсем сбило ее с толку. Наконец, она решилась: обхватила гриб руками и отломила с каждой стороны по кусочку. Приключения Алисы в стране чудес. Чарльз Латвидж Доджсон (Пер. Н. М. Демуровой)

Константин Леонтьев Вы уже используете WMI, и эта технология помогает вам решать повседневные задачи? Настало время копнуть поглубже и открыть новые возможности WMI, о которых многие, возможно, даже и не догадываются! 6


администрирование В поход за белым кроликом… После того как азы WMI изучены [1], наша следующая цель – рассмотреть расширенные возможности технологии, до использования которых добирается лишь небольшая часть системных администраторов, так как их применение часто требует написания сценариев, что администраторы ОС Windows делать обычно не любят. Мне хочется сразу отметить, что эти возможности настолько удобны в использовании и полезны для решения нетривиальных задач, что затраты сил и времени на их освоение и применение окупятся с лихвой. К тому же я постараюсь облегчить вам эту задачу, включив в текст большое количество рабочих примеров из реальной жизни, которые послужат хорошими шаблонами для решения ваших собственных задач. Эта статья рассчитана на подготовленного читателя. К таким читателям я отношу тех, кто уже использует в своей повседневной практике WMI и самостоятельно создает сценарии, использующие WMI для решения задач системного администрирования. Однако не стоит отчаиваться и тем, кто хочет изучить эту технологию с нуля. Для таких читателей я порекомендовал бы предварительно ознакомиться с моей статьей под названием «Вы все еще не используете WMI?» из предыдущих номеров журнала «Системный администратор» [1]. Для понимания материала этой статьи также необходимы знания по программированию сценариев в среде WSH (Windows Scripting Host). С подробной информацией по этому вопросу можно ознакомиться в переводной книге Гюнтера Борна [2] и в оригинальной документации Microsoft [3]. Все примеры, которые я использую, приведены на языке VBScript и протестированы на ОС Windows XP Service Pack 2 и Windows Server 2003, хотя многие из них так же успешно будут работать и на Windows 2000, правда, для этого потребуется выполнить ряд подготовительных действий. Напомню, что в предыдущей моей статье о технологии WMI [1] очень кратко рассматривалась возможность обработки событий WMI и объяснялись общие различия между синхронной и асинхронной техникой обработки событий, а также была обозначена тема стандартных подписчиков на события WMI (Standard Event Consumers), которые могут также применяться для обработки событий. В этой статье настал черед рассмотреть все эти темы подробнее и детально разобрать примеры использования основных провайдеров WMI, установленных по умолчанию в ОС Windows.

Типы событий WMI и способы их обработки Итак, приступим к изучению расширенных возможностей WMI. Для того чтобы мой рассказ об этой теме был более предметным, я решил выбрать конкретную практическую задачку и рассмотреть ее решение поэтапно. Я остановился на задаче отслеживания событий подключения/отключения съемных дисковых устройств USB и реакции на них. Во многих организациях съемные устройства (в основном USB FlashDrive) являются головной болью для службы безопасности и администраторов. Обычно проблемы, связан-

№3, март 2006

ные с несанкционированным применением пользователями съемных устройств памяти, довольно эффективно решают с помощью различного дополнительного ПО (например, DeviceLock). Мы же с вами попробуем решить часть из них стандартными средствам WMI. Наша цель – зафиксировать факт события подключения таких устройств и выполнить некоторое ответное действие (например, сценарий VBScript). Для начала давайте рассмотрим простой пример кода на VBScript, использующего WMI для синхронного отслеживания событий подключения съемных дисковых устройств. Он послужит нам отправной точкой в данной работе. Этот пример приведен на листинге 1. Попробуйте запустить этот сценарий командой cscript <имя сценария> и посмотреть на результат его работы при подключении устройств USB FlashDrive. Листинг 1. Пример сценария синхронного отслеживания подключения устройств USB strComputer = "." Set objWMIService = GetObject("winmgmts:\\" ↵ & strComputer & "\root\CIMV2") Set objEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _ "TargetInstance ISA 'Win32_LogicalDisk'" & _ " AND TargetInstance.DriveType = 2") Wscript.Echo "Ожидаем события ..." Do While(True) Set objReceivedEvent = objEvents.NextEvent Wscript.Echo "Name: " & ↵ objReceivedEvent.TargetInstance.Name Wscript.Echo "Caption: " & ↵ objReceivedEvent.TargetInstance.Caption Wscript.Echo "FileSystem: " & ↵ objReceivedEvent.TargetInstance.FileSystem Wscript.Echo "Description: " & ↵ objReceivedEvent.TargetInstance.Description Loop

Теперь давайте чуть подробнее разберем этот пример. Первые две строки служат для подключения к репозиторию WMI и не вызывают особого интереса. Третий же оператор сценария представляет для нас существенный интерес. Здесь мы вызываем метод ExecNotificationQuery объекта objWMIService (он принадлежит к классу SWbemServices), который регистрирует временный подписчик на события WMI. Этот метод возвращает нам специальный объектподписчик, который по заданным нами критериям следит за событиями WMI. Этот объект мы сохраняем в переменной objEvents. У класса SWbemServices также существует второй метод регистрации временного подписчика на события WMI, который называется ExecNotificationQueryAsync. Этот метод позволяет регистрировать временные подписчики для асинхронной обработки событий WMI, о нем мы поговорим чуть-чуть позже. Рассмотрим внимательнее WQL-запрос, с помощью которого наш сценарий подписывается на события WMI. Для того чтобы получать уведомления об интересующих нас событиях, мы делаем выборку объектов специального класса __InstanceCreationEvent, который служит для отслеживания внутренних событий WMI, возникающих при создании экземпляров объектов любого класса, зарегистрированного в репозитории WMI. Заметим, что сущест-

7


администрирование Таблица 1. Список основных классов для подписки на внутренние (intrinsic) события WMI Внутренне классы событий

Описание

__ClassCreationEvent

Извещает подписчика о создании нового класса WMI

__ClassDeletionEvent

Извещает подписчика об удалении класса WMI

__ClassModificationEvent

Извещает подписчика об изменении класса WMI

__InstanceCreationEvent

Извещает подписчика о создании экземпляра объекта класса WMI

__InstanceOperationEvent

Извещает подписчика об изменении, удалении или создании экземпляра объекта класса.

__InstanceDeletionEvent

Извещает подписчика об удалении экземпляра объекта класса WMI

__InstanceModificationEvent

Извещает подписчика о модификации экземпляра объекта класса WMI

__NamespaceCreationEvent

Извещает подписчика о создании нового пространства имен WMI

__NamespaceDeletionEvent

Извещает подписчика об удалении пространства имен WMI

__NamespaceModificationEvent

Извещает подписчика об изменении в пространстве имен WMI

__ConsumerFailureEvent

Извещает подписчика о том, что некоторые события не были доставлены подписчику из-за ошибок на стороне подписчика

__EventDroppedEvent

Извещает подписчика о том, что некоторые события не были доставлены до их подписчика

__EventQueueOverflowEvent

Извещает подписчика о том, что некоторые события WMI не были доставлены до подписчика из-за переполнения очереди событий

__MethodInvocationEvent

Извещает подписчика о том, что был выполнен вызов метода WMI. Не поддерживается на Windows NT/2000

вуют и другие специальные классы отслеживания внутренних событий WMI, например: __InstanceDeletionEvent, __InstanceModificationEvent, __InstanceOperationEvent или __ClassCreationEvent, __ClassDeletionEvent и другие. Довольно очевидно из их названия, для отслеживания каких именно внутренних событий WMI эти специальные классы созданы. В таблице 1 перечислены все основные системные классы, обеспечивающие отслеживание внутренних событий WMI. Все они выведены из абстрактного WMI класса __Event. Далее обратим внимание на ключевое слово WITHIN в запросе WQL – в отличие от обычного языка SQL ключевое слово WITHIN в языке WQL определяет интервал опроса приходящих событий в секундах или служит для группировки событий (в сочетании с ключевым словом GROUP) в течение указанного количества секунд. В нашем конкретном случае временный подписчик событий WMI – это объект, который мы получаем в переменную objEvents в результате вызова метода ExecNotificationQuery. Он будет каждые 5 секунд осуществлять проверку всех событий WMI по созданию экземпляров объектов, соответствующих критериям, заданным после ключевого слова WHERE, а именно отслеживать появление новых объектов класса Win32_LogicalDisk, у которых свойство DriveType равно 2. Закончим разбор сценария анализом цикла ожидания событий. Вполне очевидно, что сам по себе цикл бесконечный и условия завершения не имеет. Внутри тела цикла вызывается метод NextEvent нашего экземпляра объекта objEvents – временного подписчика на события WMI.

8

Этот метод возвращает управление VBS-сценарию в тот момент, когда в системе происходит событие WMI, соответствующее условиям, заданным при создании объектаподписчика. Возвращаемый этим методом объект является объектом-описателем происшедшего события и имеет свойства TargetInstance и TIME_CREATED. Свойство TargetInstance содержит не что иное как ссылку на экземпляр объекта, вызвавшего это событие. Теперь необходимо обратить наше пристальное внимание на тот факт, что существуют два типа событий WMI. Внутренние (системные) события WMI и внешние (чуждые). Эти типы событий принципиально отличаются по своему происхождению, обслуживаются разными группами классов WMI и как следствие отличаются по некоторым приемам работы с ними. Все внутренние (intrinsic) классы отслеживания событий WMI выведены непосредственно из абстрактного класса __Event, как я уже у��оминал ранее, а вот все внешние (extrinsic) классы событий выведены из класса __ExtrinsicEvent, который уже в свою очередь выведен из класса __Event. По сути дела за генерацию событий, доступ к которым обеспечивают классы внутренних событий, отвечает само ядро службы WMI, а за генерацию событий, доступ к которым обеспечивают классы внешних событий, отвечают уже WMI-провайдеры. Таким образом, если мы хотим отслеживать события WMI, используя внутренние механизмы службы WMI, то мы будем пользоваться универсальными внутренними (intrinsic) классами. Если же интересующий нас WMI-провайдер предоставляет свои собственные (внешние) классы отслеживания событий, то использовать следует именно их, так как они по определению будут работать эффективнее. К сожалению, далеко не все провайдеры предоставляют достаточный набор собственных внешних классов для отслеживания событий. В листинге 3 дан пример использования специального внешнего класса отслеживания событий Win32_ProcessStartTrace провайдера Win32. Также в этом листинге используется пример отслеживания событий таймера с использованием внутренних классов отслеживания событий. Хочу обратить ваше внимание на тот факт, что у всех внутренних классов отслеживания событий существует свойство TargetInstance, но его нет у внешних классов отслеживания событий WMI. Зато, как правило, внешние классы, отслеживающие внешние события WMI, обладают довольно широким дополнительным набором атрибутов, позволяющим легко устанавливать источник этого события. Также надо заметить, что ключевое слово WITHIN языка WQL, позволяющее подписчику устанавливать интервал опроса экземпляров внутренних классов отслеживания событий, не требуется использовать с внешними классами отслеживания событий.

Асинхронная обработка событий WMI в сценариях WSH Вернемся к сравнению синхронного и асинхронного способа обработки событий WMI. Синхронная обработка событий – это когда процесс ожидает события и более ничем не занят. Обычно это ожидание – бесконечный цикл про-


администрирование верки условия: поступило событие или нет. В нашем случае в сценарии на листинге 1 для синхронного получения очередного события вызывается метод NextEvent объекта objEvents. Этот метод возвращает сценарию управление только тогда, когда в системе происходит событие, на которое мы подписались. Асинхронная обработка подразумевает, что сценарий VBScript регистрирует специальный обработчик (подписчик) события в объектной модели WSH и далее продолжает выполнять различные свои задачи. Когда событие возникает, нормальная работа сценария прерывается, запоминается место, где произошло прерывание, а управление передается на зарегистрированный ранее обработчик событий (event sink). После обработки события обработчиком управление возвращается на то действие сценария, которое было прервано. Для реализации такой техники в объектной модели WSH для сценариев WMI предусмотрен ряд функций, названия которых оканчиваются на суффикс Async. К таким функциям, в частности, относятся: ExecMethodAsync, ExecNotificationQueryAsync, ExecQueryAsync, GetAsync и PutAsync. Эти функции мало чем отличаются от своих синхронных аналогов. Основное их отличие состоит в двух моментах. Во-первых, эти функции ничего не возвращают в вызывающую их программу. Во-вторых, в качестве первого аргумента все они требуют передавать зарегистрированный объект асинхронного подписчика, который создается стандартной функцией CreateObject на базе класса WbemScripting.SWbemSink. Создание этого объекта регистрирует в среде WSH специальный отличительный префикс для процедур-обработчиков событий WMI. Это может быть любая текстовая строка, которая удовлетворяет правилам именования процедур в VBScript. События WMI, которые могут обрабатываться в сценариях WSH, имеют следующие названия – OnCompleted, OnObjectPut, OnObjectReady и OnProgress. Таким образом, все события WMI будут обрабатываться в процедурах, имя которых состоит из зарегистрированного префикса обработчика и названия события. Примеры этого подхода даны в листингах 2, 3. Листинг 2. Пример сценария асинхронного отслеживания подключения дисковых устройств USB Sub SINK_OnObjectReady(objReceivedEvent, objAsyncContext) Wscript.Echo "Name: " & ↵ objReceivedEvent.TargetInstance.Name Wscript.Echo "Caption: " & ↵ objReceivedEvent.TargetInstance.Caption Wscript.Echo "FileSystem: " & ↵ objReceivedEvent.TargetInstance.FileSystem Wscript.Echo "Description: " & ↵ objReceivedEvent.TargetInstance.Description End Sub strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\CIMV2") Set MySink = WScript.CreateObject( _ "WbemScripting.SWbemSink","SINK_") objWMIservice.ExecNotificationQueryAsync MySink, _ "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _ "TargetInstance ISA 'Win32_LogicalDisk'" & _ " AND TargetInstance.DriveType = 2" WScript.Echo "Ожидаем события ..."

№3, март 2006

While (True) Wscript.Sleep(1000) Wend Листинг 3. Одновременное использование синхронной и асинхронной техники обработки событий на примере Таймера Dim tCount Sub TIMER_OnObjectReady(objReceivedEvent, objAsyncContext) tCount = tCount + 1 Wscript.Echo "Произошло событие Таймера, ↵ счетчик tCount=" & tCount End Sub strComputer = "." tCount = 0 Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\CIMV2") Set MySink = WScript.CreateObject ↵ ("WbemScripting.SWbemSink","TIMER_") objWMIservice.ExecNotificationQueryAsync MySink, _ "SELECT * FROM __InstanceModificationEvent WHERE " & _ "TargetInstance ISA 'Win32_LocalTime'"& _ " AND TargetInstance.Second = 30" Set objEvents = objWMIService.ExecNotificationQuery ↵ ("SELECT * FROM Win32_ProcessStartTrace") Wscript.Echo "Ожидаем запуска новых процессов..." Do While(tCount < 10) Set objReceivedEvent = objEvents.NextEvent WScript.Echo "Новый процесс: PID=" & ↵ objReceivedEvent.ProcessID _ & " Name=" & objReceivedEvent.ProcessName

Loop

MySink.Cancel

Обратите внимание на технические особенности сценария, представленного на листинге 3. Асинхронный обработчик внутренних событий таймера, зарегистрированный в этом сценарии, увеличивает переменную tCount на единицу каждые 60 секунд (в тот момент, когда показания секунд на системных часах равны 30) и выводит об этом сообщение. Синхронный обработчик событий запуска процессов внутри цикла вызывает метод NextEvent, который возвращает управление сценарию только после того, как произойдет запуск очередного нового процесса. Становится понятно, что цикл завершится только тогда, когда от начала работы сценария пройдет более 10 минут и в системе будет запущен новый процесс.

Временные и постоянные подписчики на события Ознакомившись с вышеизложенной частью этой статьи, вы можете решить, что все, что вам необходимо для работы с событиями WMI, вы уже знаете. Теперь вы можете написать любой сценарий, который будет реагировать на подключения съемных запоминающих устройств USB и запустить его при старте компьютера через групповую политику или через системный планировщик задач. Однако все выше рассмотренные нами примеры обладают одним существенным недостатком – события WMI будут отслеживаться только тогда, когда временный подписчик существует, то есть созданный нами сценарий работает. Стоит только остановить сценарий, и обработка событий закончится. В каких то ситуациях такое решение неприемлемо, и необходимо, чтобы события отслеживались постоянно.

9


администрирование Таблица 2. Cтандартные подписчики на события WMI (Standard Event Consumers) Название подписчика

Описание

ActiveScriptEventConsumer

Служит для выполнения сценария при возникновении указанного события WMI

LogFileEventConsumer

Служит для записи произвольной строки в текстовый лог-файл при возникновении указанного события WMI. Не поддерживается на Windows 2000

NTEventLogEventConsumer

Служит для записи события в журнал приложений (Application Log) системы при возникновении указанного события WMI. Не поддерживается на Windows 2000

SMTPEventConsumer

Служит для отправки почтового сообщения по протоколу SMTP при возникновении указанного события WMI

CommandLineEventConsumer

Служит для локального запуска исполняемого файла приложения при возникновении указанного события WMI. Не поддерживается на Windows 2000

Для решения этой задачи существуют постоянные подписчики (permanent event consumer). В общем случае постоянный подписчик – это специальный компонент COM+, который постоянно зарегистрирован получать определенные события от службы WMI. Логика такой регистрации очень проста. У нас есть COM+ компонент, отвечающий за обработку событий – подписчик. У нас есть специальный класс WMI, который называется __EventFilter. Каждый экземпляр объекта класса __EventFilter содержит информацию о том, какие события WMI следует выбирать для передачи какому-нибудь постоянному подписчику. Среди этой информации наиболее важной является WQL-запрос к внутренним или внешним классам отслеживания событий WMI и пространство имен, в котором данный запрос будет выполняться. Для связывания конкретного экземпляра фильтра событий и конкретного экземпляра постоянного подписчика используется специальный связывающий объект WMI, принадлежащий к классу __FilterToConsumerBinding. Этот класс среди своих свойств содержит указатель на постоянного подписчика и указатель на фильтр событий. Таким образом, один и тот же фильтр событий может поставлять события нескольким постоянным подписчикам, а один и тот же постоянный подписчик может получать события от нескольких разных фильтров. Такой подход для связывания хорошо известен разработчикам и администраторам реляционных баз данных для создания связей типа «многие к многим».

Классы стандартных подписчиков на события WMI в ОС Windows XP Service Pack 2 и Windows Server 2003 определены в специальном пространстве WMI-имен root\subscription. Там же рекомендуется создавать экземпляры этих подписчиков, фильтры событий и объекты связывания подписчиков и фильтров событий.

Создание MOF-файла для подписки на события и его компиляция Для того чтобы воспользоваться стандартными подписчиками на события WMI, вовсе не обязательно писать сценарии VBScript. Для этого достаточно взять в качестве шаблона приведенный на листинге 4 MOF-файл и немного модифицировать его под себя. Далее достаточно просто скомпилировать его штатной утилитой mofcomp – и все готово. Листинг 4. Файл NTLog-for-remdev.mof для регистрации постоянного подписчика событий // Создает экземпляр объекта стандартного подписчика // NT Event log и обозначает его псевдонимом $CONSUMER #pragma namespace ("\\\\.\\root\\subscription") instance of NTEventLogEventConsumer as $CONSUMER { // Уникальное имя экземпляра Name = "MyStandardConsumer"; // Системный источник события SourceName = "MyMonitoring"; // Номер события в журнале приложений EventID = 235 ; // Нумеротор EVENTLOG_INFORMATION_TYPE EventType = 3; // Категорию сообщения мы не определяем (0) Category = 0; // Число текстовых строк в параметре // InsertionStringTemplates NumberOfInsertionStrings = 1;

};

// Создание экземпляра объекта фильтра событий // и присвоение ему псевдонима $FILTER instance of __EventFilter as $FILTER { // Уникальное имя экземпляра Name = "MyRemDevFilter"; // Определяем запрос WQL для отбора интересующих // нас событий Query = "SELECT * FROM __InstanceCreationEvent ↵ WITHIN 5 WHERE TargetInstance ISA " "\"Win32_LogicalDisk\" ↵ AND TargetInstance.DriveType = 2" ;

Стандартные подписчики на события Для того чтобы упростить жизнь системных администраторов и избавить их от программирования компонентов COM+, в стандартной инсталляции Microsoft Windows XP и Windows Server 2003 включены пять готовых постоянных подписчиков событий. Эти готовые постоянные подписчики носят название Стандартных Подписчиков (Standard Event Consumers). Все они перечислены в таблице 2. В Microsoft Windows 2000, к сожалению, их только два. Кроме того, один из них ActiveScriptEventConsumer не скомпилирован, поэтому прежде чем его использовать необходимо скомпилировать командой: mofcomp %windir%\wbem\Scrcons.mof

10

InsertionStringTemplates = { "Removable Drive ↵ connected under " "drive letter %TargetInstance.Caption% with ↵ file system %TargetInstance.FileSystem%" };

};

// Определяем язык запроса QueryLanguage = "WQL"; // Определяем пространство имен, где будет // выполняться запрос EventNamespace = "root\\CIMv2";

// Создаем экземпляр объекта связывания // между фильтром и подписчиком, используя их // временные псевдонимы instance of __FilterToConsumerBinding { Consumer = $CONSUMER; Filter = $FILTER; };

Создайте файл с именем NTLog-for-remdev.mof и запол-


администрирование ните его в соответствии с листингом 4. Затем выполните синтаксическую проверку файла командой: mofcomp –check NTLog-for-remdev.mof

Данный MOF-файл создает экземпляр стандартного подписчика на события WMI, который осуществляет запись информационного события с кодом 235 в журнал приложений системы (Application Log) в случае, если в системе появляется новое съемное запоминающее устройство типа USB FlashDrive. В данные события вносится информация о букве диска, которая была назначена этому съемному устройству, а также тип файловой системы, обнаруженной на подключенном съемном устройстве. Для того чтобы созданный нами MOF-файл был импортирован в репозиторий WMI и события подключения съемных дисковых устройств типа USB FlashDrive стали регистрироваться в журнале приложений, нам необходимо скомпилировать этот MOF-файл. Для этого с правами администратора выполните команду: mofcomp NTLog-for-remdev.mof

Если после выполнения команды вы увидите сообщение «Storing data in the repository... Done!», то это означает, что операция прошла успешно. Теперь проверьте журнал приложений («Event Viewer → Application») на предмет ошибок от службы WinMgmt. Скорее всего, их не будет. Если же вы увидите запись об ошибке с кодом 10 (EventID 10), в тексте которого будет присутствовать информация об ошибке WMI номер 0x80041003 [5], то знайте, что той учетной записи, под которой вы проделали компиляцию MOF-файла, недостаточно прав для активации фильтра событий. Для решения этой проблемы выполните все эти действия из-под локальной встроенной учетной записи администратора. Это ситуация довольно редкая, но она случается с доменными учетными записями, включенными в группу локальных администраторов при отсутствии подключения к контроллеру домена. Рассматривать детально причину такого провидения системы мы сейчас не будем. Просто помните об этом. После того как вы подключите к компьютеру съемное дисковое устройство, в журнале событий вы увидите событие с текстом примерно следующего содержания: Event ID: 235 Source: MyMonitoring Type: Information Description: The description for Event ID ( 235 ) in Source ( MyMonitoring ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details. The following information is part of the event: Removable Drive connected under drive letter E: with file system FAT32.

Давайте теперь немного подробнее разберем приведенный пример MOF-файла. Обратите внимание, что синтаксис MOF файлов [6] очень похож на синтаксис языка программирования C++. Первая значащая строка определяет пространство имен WMI, где будут размещены создаваемые нами экземпляры объектов. Затем идет опи-

№3, март 2006

сание экземпляра объекта класса стандартного подписчика NTEventLogEventConsumer и присвоение ему псевдонима (alias) для последующей ссылки на него. При определении экземпляра этого объекта мы задаем его свойства – это самое интересное. Мы определяем уникальное имя этого экземпляра стандартного подписчика, код события, которое будет вносить в журнал приложений этот экземпляр стандартного подписчика, тип события (0 – SUCCESS, 1 – ERROR, 2 – WARNING, 3 – INFORMATION, 4 – AUDIT_SUCCESS и 5 – AUDIT_FAILURE), источник события и его категорию. Далее мы определяем число текстовых строк, которые будут передаваться службе журнала Windows при создании события с указанным нами кодом. Для всех событий в системе обычно предусмотрены текстовые шаблоны для поля Description. Это помогает сильно экономить место в журналах событий системы. Эти шаблоны обычно содержат специальные поля для внесения текстовых строк с деталями о конкретном событии. Поскольку для нашего события такого шаблона не существует, то в поле описания события (Description) об этом будет записано предупреждение. Далее в MOF-файле создается экземпляр объекта класса __EventFilter, в котором описываются те события, на которые мы хотим назначить постоянный подписчик. Мы, как и раньше, определяем уникальное имя этого экземпляра и задаем остальные свойства. Среди этих свойств мы определяем запрос WQL, отслеживающий интересующие нас события и пространство имен WMI, в котором этот запрос следует выполнять. Наконец последнее, что мы определяем в этом MOFфайле – это связывающий объект, который собственно и отвечает за передачу событий от фильтра к подписчику. Как описано выше, существует пять классов стандартных подписчиков (см. таблицу 2). Соответственно помимо записи событий в журнал событий мы можем, например, запускать сценарий VBScript как реакцию на интересующее нас событие WMI или приложение из командной строки. Давайте посмотрим, как очень легко можно модифицировать наш пример со стандартным подписчиком, оставляющим в журнале событий системы (Event Log) свою запись о подключении съемного запоминающего устройства, на запуск сценария VBScript. Для начала давайте создадим сценарий, который мы бы хотели запускать при возникновении интересующих нас событий WMI. Я не буду подробно разбирать особенности этого сценария, так как это не соответствует тематике нашей статьи. Обозначу лишь один важный момент: когда данный сценарий WSH запускается ядром системы WMI, в объектное окружение WSH добавляется специальный объект TargetEvent, который по набору свойств соответствует тому, что возвращала бы функция NetEvent при синхронной обработке уведомляющих запросов в наших примерах выше. Пример нашего сценария дан в листинге 5: Листинг 5. Код из файла script.vbs. Файл должен находиться в папке c:\windows\system32\wbem Dim objFSO, objFile Set objFSO = CreateObject("Scripting.FileSystemObject")

11


администрирование Set objFile = objFSO.CreateTextFile ↵ ("C:\ScriptLog.txt", 8, true) objFile.WriteLine "Time: " & Now & "; ↵ Entry made by: ASEC" objFile.WriteLine "Script Started for USB Drive: " & ↵ TargetEvent.TargetInstance.Caption objFile.Close

};

"Set objFile = objFSO.CreateTextFile ↵ (\"C:\\ScriptLog.txt\", 8, true)\n" "objFile.WriteLine \"Time: \" & Now & \"; ↵ Entry made by: ASEC2\"\n" "objFile.WriteLine \"Script Started for " USB Drive: \" & " "TargetEvent.TargetInstance.Caption\n" "objFile.Close\n";

Поместите этот сценарий в папку c:\windows\system32\ Обратите внимание, что сценарий VBScript задается wbem. В принципе его можно хранить и в любой другой в виде текстовой строки, как в языке C++, и для перевопапке, но вы должны понимать, что при наличии соответс- да строк используется спецсимвол «\n», а для включения твующих прав на файл пользователь может изменить со- в текст двойных кавычек и обратных наклонных черт – спецдержимое VBS-сценария, а поскольку он выполняется символы «\"» и «\\» соответственно. в контексте безопасности SYSTEM, то пользователь моПосле того как вы проделали изменение нашего бажет поднять свои права на локальной машине и натво- зового MOF-файла, еще раз проверьте синтаксис MOFрить еще много других бед. Рекомендуемая мной папка файла и компилируйте его, так как описано выше команимеет достаточно надежные разрешения доступа к фай- дой mofcomp. После этого подключите к системе съемное лам по умолчанию и позволит избавиться от этой потен- запоминающее устройство USB FlashDrive и убедитесь, что в корне диска C: создался файл отчета ScriptLog.txt циальной уязвимости. Теперь пришел черед модифицировать наш MOF-файл. о работе нашего сценария с примерно следующим содерНа листинге 6 дано определение экземпляра объекта жимым: стандартного подписчика, ответственного за запуск сцеTime: 20.03.2006 12:43:18; Entry made by: ASEC нариев. Как вы уже могли убедиться, все довольно ��росScript Started for USB Drive: E: то. Мы, как и раньше, определяем уникальное имя экземпляра класса стандартного подписчика и задаем другие его свойства. Замените в нашем MOF-файле (см. лис- Отмена регистрации постоянных подписчиков тинг 4) описание стандартного подписчика на это новое После того как вы проделали упражнение с созданием посописание. тоянного стандартного подписчика на события WMI, этот подписчик будет работать в системе даже после ее переЛистинг 6. Пример кода MOF-файла для создания экземпляра загрузки. У пытливого читателя сразу же возникнет вопрос: стандартного подписчика, выполняющего сценарий «Как же теперь отменить все результаты наших эксперимениз указанного текстового файла тов?» Эта задача решается довольно просто. instance of ActiveScriptEventConsumer as $CONSUMER Для того чтобы отменить созданную нами постоянную { Name = "MyStandardConsumer"; регистрацию стандартных подписчиков, следует выполнить KillTimeout = 300; приведенный на листинге 8 сценарий VBScript. ScriptingEngine = "VBScript"; };

ScriptFileName = "c:\\windows\\system32\\wbem\\ ↵ script.vbs";

Наиболее важным для нас свойством является имя файла сценария, который следует исполнять в качестве реакции на события. Смысл всех остальных свойств вполне очевиден из их названия. Рассмотренная проблема с размещением файла сценария может быть решена еще одним способом. Зачем вообще сохранять сценарий на диск машины, где он может быть модифицирован пользователем, когда можно сохранить его код прямо в репозитории WMI. Конечно, в каких-то случаях этот способ может быть не очень удобным, однако я специально привел его пример на листинге 7, поскольку этот способ хранения сценария реакции на события априори более безопасный. Листинг 7. Пример кода MOF-файла для создания экземпляра стандартного подписчика, выполняющего сценарий из сохраненного в репозитории WMI кода VBScript instance of ActiveScriptEventConsumer as $CONSUMER { Name = "MyStandardConsumer"; ScriptingEngine = "VBScript"; KillTimeout = 300; ScriptText = "Dim objFSO, objFile\n" "Set objFSO = CreateObject ↵ (\"Scripting.FileSystemObject\")\n"

12

Листинг 8. Отмена регистрации постоянного стандартного подписчика для NTEventLogEventConsumer On Error Resume Next Set objWIMService = GetObject("winmgmts:\\.\root\subscription") Set objList = objWIMService.ExecQuery("references of ↵ {__EventFilter.Name='MyRemDevFilter'}") For each objInst in objList objInst.Delete_ Next Set objList = objWIMService.ExecQuery"references of ↵ {NTEventLogEventConsumer.Name='MyStandardConsumer'}") For each objInst in objList objInst.Delete_ Next Set objSTDConsumerInst = GetObject("winmgmts: ↵ \\.\root\subscription:NTEventLogEventConsumer= ↵ 'MyStandardConsumer'") objSTDConsumerInst.Delete_ Set objEventFltInst = GetObject("winmgmts: ↵ \\.\root\subscription:__EventFilter= ↵ 'MyRemDevFilter'") objEventFltInst.Delete_

Этот сценарий использует технику запроса WQL с ключевым словом references of для нахождения всех экземпляров связывающих объектов класса __FilterToConsumerBinding привязанных к экземпляру фильтра событий с именем


администрирование NTLogConsumerForRemDevFilter и к экземпляру стандартного подписчика с именем NTLogConsumerForRemDev. После нахождения всех этих связывающих объектов он удаляет их, а затем удаляет и сами экземпляры объектов стандартного подписчика и фильтра событий. Просмотр и модификацию регистрации постоянных подписчиков на события WMI также удобно осуществлять с использованием утилиты WMI Event Registration из комплекта WMI Administrative Tools [7].

Полезные примеры мониторинга системных событий

Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\DEFAULT") Set objEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM RegistryValueChangeEvent WHERE " & _ "Hive = 'HKEY_LOCAL_MACHINE'" & _ " AND KeyPath = 'SOFTWARE\\MyKey\\MySubKey\\'" & _ " AND ValueName = 'MyValue'") Wscript.Echo "Ожидаем события ..." Do While(True) Set objReceivedEvent = objEvents.NextEvent Wscript.Echo "Произошло событие ↵ RegistryValueChangeEvent." Loop

Перед заключением приведу пару простых, но часто используемых практических примеров отслеживания собыПоскольку пример довольно прост, мы не будем сейчас тий WMI. В целях упрощения эти примеры приведены в ви- останавливаться на его внимательном рассмотрении и осде сценариев синхронной обработки событий на VBScript, тавим это на вторую часть статьи, где среди прочего буоднако вы уже хорошо понимаете, как их можно легко мо- дет подробно рассматриваться работа с провайдером WMI дифицировать к асинхронному виду или применить для их для доступа к реестру. использования механизм стандартных подписчиков. Для сравнения один из них, приведенный на листин- Что еще есть на вооружении WMI? ге 9, использует внутренние (intrinsic) события и внутрен- Дополнительные возможности WMI не исчерпываются тольние классы отслеживания событий WMI, а второй, приве- ко обработкой событий и созданием постоянных стандартденный на листинге 10, использует внешние (extrinsic) со- ных подписчиков. В следующей части статьи мы поговорим о практическом использовании основных провайдеров WMI бытия, генерируемые провайдером WMI StdRegProv. и приемах работы с ними. Среди этих провайдеров я осоЛистинг 9. Пример синхронного отслеживания событий бо хотел бы отметить следующие: Win32_Ping – осущестс файлами TXT в папке c:\temp вляющий формирование ICMP Echo-запросов к указанным strComputer = "." хостам сети, Win32_NTEventLog – с которым мы частично Set objWMIService = GetObject("winmgmts:\\" & ↵ знакомы и который обеспечивает доступ к журналам собыstrComputer & "\root\CIMv2") Set objEvents = objWMIService.ExecNotificationQuery _ тий системы OC Windows. Также мы рассмотрим провай("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _ дер работы с реестром – StdRegProv и провайдер взаимо"TargetInstance ISA 'CIM_DataFile'" & _ " AND TargetInstance.Drive = 'c:'" & _ действия с Microsoft Active Directory. Кроме них, будет по" AND TargetInstance.Extension = 'txt'" & _ лезно обсудить провайдер для работы со счетчиками про" AND TargetInstance.Path = '\\temp\\'") изводительности и довольно простой вопрос, который, одWscript.Echo "Ожидаем события ..." нако, вызывает частенько сложности, – работа с датами Do While(True) Set objReceivedEvent = objEvents.NextEvent и временем через WMI. WScript.Echo "Filename: " & ↵ objReceivedEvent.TargetInstance.FileName WScript.Echo "Name: " & ↵ objReceivedEvent.TargetInstance.Name

Loop

В примере на листинге 9 сценарий, используя синхронную технику, отслеживает события создания удаления и переименования файлов с расширением TXT в папке C:\TEMP. Если вы будете экспериментировать с этим сценарием, будьте аккуратны, не увлекайтесь расширением области мониторинга за счет захвата большего числа файлов и папок. В современных версиях OC Windows изменения в файловой системе происходят очень часто, и ядро WMI может не выдержать потока всех свалившихся на него событий и заберет почти 100% процессорного времени системы на их обработку. Следующий пример, приведенный на листинге 10, показывает пример синхронной техники обработки внешних (extrinsic) событий WMI для провайдера StdRegProv. Листинг 10. Пример синхронного отслеживания событий изменения значения в реестре strComputer = "."

№3, март 2006

Ссылки, литература: 1. Леонтьев К. Вы все еще не используете WMI? Часть 1. – Журнал «Системный администратор», №1, январь 2006 г. – 4-11 с.; Леонтьев К. Вы все еще не используете WMI? Часть 2: пишем сценарии. – Журнал «Системный администратор», №2, февраль 2006 г. – 6-14 с. 2. Борн Г. Руководство разработчика на Microsoft Windows Scripting Host 2.0. Мастер класс. // Пер. с англ. – СПб.: Питер; М.: ИТД «Русская редакция», 2001. – 480 стр.: ил. 3. Microsoft Windows Script 5.6 Documentation – http://www.microsoft. com/downloads/details.aspx?FamilyId=01592C48-207D-4BE18A76-1C4099D7BBB9&displaylang=en. 4. WMI Code Creator 1.0 – http://download.microsoft.com / download /0/c /a/0ca7691c-6335-4143-8f9f-6708969f8212/ WMICodeCreator.zip. 5. Таблица кодов ошибок WMI – http://msdn.microsoft.com/library/ default.asp?url=/library/en-us/wmisdk/wmi/wbemerrorenum.asp. 6. Синтаксис MOF-файлов – http://msdn.microsoft.com/library/enus/wmisdk/wmi/managed_object_format.asp?frame=true. 7. WMI Administrative Tools – http://download.microsoft.com/ download /.NetStandardServer/Install / V1.1/NT5XP/EN-US/ WMITools.exe.

13


администрирование

Кириллизация в Linux

Алексей Барабанов Принято считать, что в Linux уже давно нет проблем с кириллизацией чего-либо. Эта ОС вслед за другими полным ходом движется в юникодный рай, где, как обещают, вавилонский кризис никому не грозит. Но на практике ситуация еще весьма далека от идеальной.

Т

ема кириллизации или «русифика- сделанных на ее основе. Увы, в дан- ляются последовательностью байт. ции», как иногда выражаются, с не- ном вопросе именно пользователи по- Таким образом, все входные потоки которых пор исчезла с первых по- падают между молотом и наковаль- данных, которые, по сути, есть файзиций рейтингов интереса со стороны ней, между стремлением разработчи- лы, тоже являются последовательноснеофитов Linux. В нашей стране уже ков дистрибутивов к псевдопрогрес- тью индифферентных байтовых кодов. давно не внедряются новые кодировки. су и консервативностью рынка при- Как же программа априори «поймет», И хотя по их числу мы не превосходим кладного программного обеспечения. что за данные ей передаются? народности с иероглифическими ме- Обсудим данный вопрос подробно на Есть два способа: по содержимому тодами написания, но в европейском примере дистрибутива SuSE Linux 10.0 самого потока данных, так называерегионе явно ходим в рекордсменах. и в сравнении на примере ряда других мый «in-band», и на основании внешнеИ вот теперь, когда, казалось бы, уже ведущих дистрибуций. го предписания, или «out-band». нет проблем, чтобы предложить польПервый способ зависит от форзователям Linux все разнообразие про- Терминология мата, второй – диктует формат. Изверенных наработок и материалов по и проблематика начально использовался только втокириллизации, многие дистрибуторы Необходимость адаптации програм- рой способ. Например, в первых перначинают экономить, можно сказать, много обеспечения к требованиям ин- сональных компьютерах исключалось на самом святом. Им кажется, что надо терфейсного окружения обуславли- применение символьных данных в коуже сейчас заставить всех пользова- вается тем, что существует из��ачаль- дировках, отличных от кодовой стрателей работать в универсальной коди- ная проблема определения кодировки ницы 437 (IBM Codepage 437). Испольровке UTF-8 (алгоритм 8-го представ- символьных данных. Например, в UNIX- зование данной кодовой таблицы быления символов UNICODE) и в локалях, подобных системах файлы представ- ло закреплено аппаратно, то есть вне-

14


администрирование шним путем. С распространением компьютерной технологии в регионах, где приняты иные требования на представление символьных данных, была определена процедура так называемой локализации, или модификации программного обеспечения для использования региональных стандартов. Но данный путь оказался слишком трудозатратным. И тогда было произведено функциональное выделение всех национально-зависимых программных компонентов так, чтобы можно было настраивать требуемую локализацию динамически. Естественно, данная процедура всецело определялась платформой. Так, в частности, на обсуждаемой платформе GNU/Linux локализация управляется единым образом на основе так называемых «локалей» (locale) с помощью системной библиотеки glibc. Второй способ, «in-band», подразумевает, что, получив некоторые символьные данные, программа самостоятельно сумеет определить их кодировку, пользуясь лишь информацией из входного потока. Например, кодировка может указываться в самом файле или в начале потока данных. Такой способ принят во многих внутренних форматах, поддерживаемых текстовыми редакторами, в формате HTML для этого используются специальные тэги, а в протоколе HTTP специальные опции и так далее. Но, несомненно, самым универсальным является способ использования кодировки такого размера (разрядности), чтобы она смогла содержать в себе все возможные символьные комбинации. Так возникла идея кодировки UNICODE (Unicode standard ISO 10646, или Universal Character Set, или UCS) и её более компактной версии UTF-8 [1]. Казалось бы, проблема решена, да не тут-то было! Универсальная кодировка не отправила использование локалей в прошлое, а лишь добавила проблем, поскольку увеличила их число!

Локали в Linux Итак, в программном окружении определяется понятие локали как совокупности данных об используемых языковых и национальных особенностях среды исполнения. Именно пользуясь параметрами локали, программа «понимает» правильным образом

№3, март 2006

символьные входные данные и выво- «out-band» указать на способ расшифдит свои отчеты в правильных коди- ровки символов. То есть программа ровках. Здесь, в самом определении, еще и различает все входные данные заложена некая условность, приводя- с использованием кодировки локали щая к неверному пониманию сущнос- и, кроме того, в той же кодировке выти происходящего. Бытует мнение, что водит все сообщения. Ну, положим, есиз привязки локали к процессу следу- ли для вывода используются объекет легкость манипулирования её на- ты среды, которые наследуют локаль стройкой. Мол, если локаль переда- программы, то еще можно надеяться, ется процессу из окружения, то ниче- что при некоторых условиях они будут го нет проще, как установить любую адекватно воспринимать и отображать локаль прямо перед запуском. Напри- кодировку данной локали. Но в отномер, в Linux используются для этого шении входных данных это не всегпеременные окружения LC_* и LANG. да верно. Точнее, в отношении входЭти переменные формируются в про- ных данных не работает обратная лоцессе отработки профиля пользова- гика. Если локаль процесса, испольтеля и далее передаются всем порож- зующего входные данные, не совпаденным процессам. Вот как все прос- дает с локалью процесса, их породивто! Если в системе в базе локализации шего, то, скорее всего, ничего хорошеприсутствует нужная локаль, то, ука- го не выйдет. Самый простой пример такой ситузав ее в окружении, мы можем заставить работать с нею любой процесс. ации, когда программа использует раУвы, нет! Это со всех сторон наивный нее накопленные данные, где тип исвзгляд. Чтобы понять свойства локали, пользуемой кодировки определяет индавайте взглянем на процесс ее обра- формацию – это имена файлов, индекзования (см. врезку «Локали и их об- сы в структурах БД, базы служебных сообщений, сохраненные из Интернета разование»). Кодировка, включенная в локаль, документы. Вы наблюдали на экранах является тем самым ключевым па- компьютеров «кракозябры» в сообщераметром, позволяющим методом ниях программ, которые в 90% случа-

Локали и их образование Стандарты локализации, применяемые в системах GNU/Linux, называются POSIXлокалями, поскольку их применение регламентируются именно этим стандартом на интерфейс между операционной системой и прикладной программой. Обычно база локалей размещается в /usr/lib/locale. В SuSE Linux указанная директория принадлежит пакету glibc-locale. Именно там ищутся описания правил национальных стандартов и прочее, что необходимо для традиционного представления данных в соответствии с принятой локалью. И если там нужная локаль отсутствует, то ее можно скомпилировать с помощью утилиты localedef. Для этого следует вызвать утилиту с параметрами: файл описания стандартов локали и файл с описанием соответствия символов юникода (unicode) тем, что приняты для кодирования информации в данной локали. Например: # localedef -i ru_RU -f CP1251 ru_RU.CP1251

создаст локаль ru_RU.CP1251. Название локали образуется по правилам [язык[_территория][.кодовая_таблица][@модификатор]] в соответствии с RFC 3066. Язык указыва-

ется двумя символами в строчном регистре, согласно международному стандарту ISO 639. Территория указывается тоже двумя символами, но уже прописными, обозначающими страну по стандарту ISO 3166. Следующая компонента привязывает к локали кодовую страницу. Модификатор в кириллических локалях пока не используется. Итак, в создании локали используются описания национальных стандартов, размещенные в /usr/share/i18n/locale/, и кодировки из деректории /usr/share/i18n/ charmaps. Обе директории в SuSE Linux поставляются в пакете glibc-i18ndata. Таким образом локаль устанавливает соответствие некоторой совокупности национальных стандартов и кодировки символьных данных. К сведению, на платформе MS Windows используется так называемый идентификатор локали (Locale Identifier – LCID), состоящий из кода языка и кода культуры. То есть кодировка исключена из локали вовсе и требует дополнительного указания, поскольку не управляется локалью. Тем самым лишний раз подчеркивается комплиментарность локали в системной среде.

15


администрирование ев работали вполне адекватно? Вам приходилось вместо имен файлов видеть всякую «бнопню»? Это именно те случаи, когда программа воспользовалась строковой константой, подготовленной в другой локали, или пыталась прочесть символьные данные, созданные с использованием иной локали. Даже точно «угадав» локаль исходных данных, то есть, казалось бы, сводя проблему к тривиальной перекодировке, не всегда удается достичь успеха. Пример тому – данные, упорядоченные или проиндексированные, в соответствии с алфавитным порядком для некоторой локали. Здесь перекодировка не даст успеха, а сортировка будет уже не только трудоемкой, но и даже невозможной, если используются разделяемые данные, что характерно для совместной сетевой работы. Ну хорошо, локаль – это типичное указание «out-band» кодировки. Примение UTF-8 должно, по идее, избавить от дополнительного указания на локаль, так как эта кодировка допускает определение локализации на основании самих данных. Но, увы, лишь в теории. Локаль, безусловно, указывает на единственную используемую в ней кодировку, а вот кодировка может использоваться в разных локалях. И чем универсальнее эта кодировка, тем больше выбор возможных локалей. То есть в случае абсолютного универсального идеала кодирования информации UTF-8 мы вообще лишились возможности по характеру данных сделать заключение о том, в какой локали эта информация представлена! Вот и получается, что кажущаяся легкость манипулирования локалью на самом деле не соответствует действительности. Таким образом, локаль, кроме национальной базы стандартов, включает в себя тип кодировки внешней среды, который от процесса не зависит, да и локаль не определяет! И, значит, для того чтобы обрабатывать широкий спектр входных данных, надо иметь в системном окружении весь необходимый перечень локалей для возможных кодировок, и все сопутствующие данные для построения правильной среды исполнения программы. Вот о сопутствующих данных далее и поговорим, но сначала проверим, какие локали нам предлагаются в SuSE Linux.

Локали в SuSE Linux 10.0 Выполним установку системы по умолчанию, лишь указав, что принимается русский язык, и в результате получим следующую настройку локализации: > locale LANG=ru_RU.UTF-8 LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=

Как можно убедиться, предлагается работать в локали

16

ru_RU в многобайтной кодировке UTF-8. При этом в системе определены следующие варианты настройки: > locale ru_RU ru_RU.koi8r ru_RU.utf8

Здесь уже должно быть понятно, что представления об используемых в нашей стране локалях у разработчиков SuSE Linux далеки от реальности. В качестве эталонного примем мнение авторо�� документа [2], прошедшего проверку опытом. Кстати, из указанного источника можно почерпнуть дополнительный комментарий, который по причине форматных ограничений не вошел в настоящий текст. Поправим в немецком дистрибутиве SuSE Linux состав локалей, которые необходимы для работы российского пользователя, следующим скриптом, запускаемым от root: #!/bin/sh LOCALE=/usr/lib/locale LP=ru_RU LD=$(which localedef) [ "1$LD" == "1" ] && { echo localedef not found ; exit -1 ; } LD="$LD -c -i $LP" [ "1$(locale $LD -f [ "1$(locale ln -sf

-a | grep ^$LP | grep utf8)" == "1" ] && ↵ UTF-8 $LP.UTF-8 -a | grep ^$LP | grep UTF-8)" == "1" ] && ↵ $LOCALE/$LP.utf8 $LOCALE/$LP.UTF-8

[ "1$(locale $LD -f [ "1$(locale ln -sf

-a | grep ^$LP | grep koi8r)" == "1" ] && ↵ KOI8-R $LP.KOI8-R -a | grep ^$LP | grep KOI8-R)" == "1" ] && ↵ $LOCALE/$LP.koi8r $LOCALE/$LP.KOI8-R

[ "1$(locale $LD -f [ "1$(locale ln -sf

-a | grep ^$LP | grep cp1251)" == "1" ] && ↵ CP1251 $LP.CP1251 -a | grep ^$LP | grep CP1251)" == "1" ] && ↵ $LOCALE/$LP.cp1251 $LOCALE/$LP.CP1251

[ "1$(locale -a | grep ^$LP | grep iso88595)" == "1" ] && ↵ $LD -f ISO-8859-5 $LP.ISO-8859-5 [ "1$(locale -a | grep ^$LP | grep ISO-8859-5)" == "1" ] && ↵ ln -sf $LOCALE/$LP.iso88595 $LOCALE/$LP.ISO-8859-5 [ "1$(locale $LD -f [ "1$(locale ln -sf

-a | grep ^$LP | grep cp866)" == "1" ] && ↵ IBM866 $LP.CP866 -a | grep ^$LP | grep CP866)" == "1" ] && ↵ $LOCALE/$LP.cp866 $LOCALE/$LP.CP866

[ "1$(locale -a | grep ^$LP | grep maccyrillic)" == "1" ] && ↵ $LD -f MAC-CYRILLIC $LP.MAC-CYRILLIC [ "1$(locale -a | grep ^$LP | grep MAC-CYRILLIC)" == "1" ] && ↵ ln -sf $LOCALE/$LP.maccyrillic $LOCALE/$LP.MAC-CYRILLIC

И тут же проверим результат: > locale -a | grep ^ru_RU ru_RU ru_RU.cp1251 ru_RU.CP1251 ru_RU.cp866 ru_RU.CP866 ru_RU.iso88595 ru_RU.ISO-8859-5 ru_RU.koi8r ru_RU.KOI8-R ru_RU.maccyrillic ru_RU.MAC-CYRILLIC ru_RU.utf8 ru_RU.UTF-8


администрирование Полученные локали позволят работать с кириллицей в соответствии с национальным стандартом ru_RU, используя кодировки UTF-8, KOI8-R, CP1251, ISO-8859-5, CP866 и MAC-CYRILLIC. Некоторого пояснения требует сосуществование полного и сокращенного (в оригинале mangled – «порубленного») наименования локали, например, ru_RU.KOI8-R и ru_RU.koi8r. В принципе достаточно лишь сокращенного. Полное имя локали, указанное в переменных окружения, будет преобразовано к сокращенному в процессе работы. Но, учитывая мнение [1] и тот факт, что в отечественных дистрибутивах, например в ALT Linux (до версии 3.0), принято использование полного наименования локали даже в директории размещения (/usr/lib/locale), вероятно в расчете на независимость и оригинальность российских программистов, создадим символьные ссылки с полными именами на директории с базами локалей, которые были построены localedef. Как видите, в недрах SuSE Linux заложен большой потенциал – расширение базы локализаций произошло без загрузки каких-либо дополнительных файлов кроме дистрибутивных. В работающей системе SuSE Linux локаль устанавливается единым образом на основании переменной RC_LANG, размещенной в файле /etc/sysconfig/language. Ранее, сразу после присвоения данной переменной нужного значения, например того же ru_RU.UTF-8, следовало выполнить:

Рисунок 1. Ввод данных с клавиатуры

# SuSEconfig -module profiles»

для модификации служебных файлов профилей, формирующих окружение командной оболочки. Но теперь в этом нет необходимости, так как профили формируются универсальными скриптами /etc/profile.d/*.sh, среди которых lang.sh непосредственно читает /etc/sysconfig/language и все настраивает интерактивно, то есть в процессе запуска командной оболочки, и потом передается всем порожденным процессам. Таким образом, после модификации переменной RC_LANG достаточно перегрузить пользовательскую сессию или запустить дополнительную через «su -», чтобы начать работу в новой локали. В других дистрибутивах возможен иной подход к формированию значений переменных окружения, указывающих на используемую локаль. Для того чтобы определить последовательность настройки, можно произвести контекстный поиск строки LANG в скриптах и конфигурационных файлах, расположенных в /etc.

Различные подходы к кириллизации Вернемся к той мысли, что кроме нужной локали процесса надо обеспечить соответствующее преобразование входных и выходных данных. То есть правильную кодировку, как это упрощенно воспринимается. И здесь нам придется проанализировать, какие методы кириллизации, то есть адаптации интерфейсов для использования кириллицы, существуют. Так как речь идет об интерфейсах, то настройки нужного преобразования кодов можно разделить на два вида: кириллизация консоли и кириллизация графической среды. Обсудим подробно консольный режим работы, как

№3, март 2006

Рисунок 2. Вывод данных на экран монитора

базовый по отношению ко всему остальному, поскольку именно этот режим поддерживается в ядре, а все остальные подсистемы, и X Window в том числе, работают лишь в качестве приложений. В современных дистрибутивах Linux присутствуют два пакета интернационализации, с помощью которых настраивается кириллическая консоль. Хронологически первым является пакет kbd [3], и более поздним, порожденным как ветвь от kdb, – console-tools [4]. Долгое время ожидалось, что console-tools, содержащий множество утилит для манипуляции шрифтами и кодировками, вытеснит «простенький» kbd. Это мнение, подогреваемое русскоязычными соразработчитками console-tools (см. страницу credits на [4]) и отечественными дистрибуторами, в частности ALT Linux, «просочилось» в многочисленные руководства и учебники, например [5]. Поторопились...

17


администрирование не только назначение определенного символа каждой клавише, но и произЛокаль Charmap Screenmap Keytable Encoding Источник водится выбор кодировки. Иначе гоru_RU.UTF-8 UTF-8 trivial ru-utf.map UTF-8 Unicode Org воря, чтобы после нажатия клавиши ru_RU.KOI8-R KOI8-R koi8-r_to_uni ru-ms.map KOI8-R RFC 1489 «А» получить символ «А» в кодировке ru_RU.CP1251 CP1251 cp1251_to_uni ru_win.map CP1251 MS Cyrillic KOI8-R, надо использовать раскладку ru_RU.ISO-8859-5 ISO-8859-5 8859-5_to_uni ru_ms-iso-8859-5.map ISO-8859-5 SUN Cyrillic или таблицу, у которой в строке, соотru_RU.CP866 IBM866 cp866_to_uni ru_ms-ibm866.map IBM866 IBM Cyrillic ветствующей клавиатурному коду клаru_RU.MAC-CYRILLIC MAC-CYRILLIC mac-cyrillic_to_uni ru_ms-mac-cyrillic.map MAC-CYRILLIC Apple Cyrillic виши с изображением «А», и в колонке для нужного кириллического реПо данным поисковой системы [6], пакет console-tools ис- гистра клавиатуры содержится код 0xE1. Если бы требопользуется в дистрибутивах: Mandrake, Mandriva, Conectiva, валось получать символы в кодировке CP1251, то там долALT Linux, RedHat 6 и 7, Turbolinux, Trustix, Engarde. С пер- жен содержаться код 0xC0. Чувствуете разницу? Не важвыми четырьмя все ясно, так как они явно исторически тя- но, что программа ожидает получать символы в соответсготеют друг к другу. А вот RedHat из перечисленных вер- твии с локалью. Если нужная таблица преобразований не сий отметим особо! будет загружена с помощью утилиты loadkeys в клавиатурПо сведениям с того же сайта, пакет kbd применяет- ный драйвер, то, как бы не менялась локаль, успешной рася в дистрибутивах SuSE, Fedora, RedHat 5 и 8, WhiteBox, боты не получится. CentOS, ASP Linux, PLD, Aurox, StartCom, Arklinux, Openwall Второй режим работы драйвера клавиатуры, который аки все таже Conectiva. Со второго по пятый в списке пред- туален для текстового режима, это UNICODE. Как следует ставлены явные «редхатоиды» и их клоны. Очень интерес- из названия, в этом режиме драйвер формирует на выходе но обсудить «пируэт», который совершили разработчики коды в соответствии с UTF-8. В этом режиме все равно исRedHat, перейдя на console-tools в релизах 6 и 7 и вернув- пользуется таблица преобразования, но на выходе драйвешись потом снова к kbd в релизе 8. Нет, они не перегрелись ра создаются не однобайтные посылки, а строки переменв солярии. Можно предположить, что в связи с ожидаемым ной длинны. В SuSE Linux параметры, управляющие работой и скорым, как думают латентные эсперантисты, переходом утилиты loadkeys, настраивающей клавиатуру, содержатся в в универсальную кодировку unicode (а как известно, в 8 вер- /etc/sysconfig/keyboard. В отличие от изображенного на рис. 1 сии RedHat Linux произошел переход на utf 8) преимущес- раскладка для режима по умолчанию указана как: тва пакета console-tools, ориентированного в основном # grep ^KEYTABLE /etc/sysconfig/keyboard на изощренные манипуляции с кодировками, теряют актуальность, а вот средства управления виртуальными консоKEYTABLE="ru1.map.gz" лями в kbd, напротив, становятся незаменимыми. Что и послужило основанием возврата к использованию kbd. Значит, используется кириллическое подмножество Принимая все перечисленное во внимание и учитывая, UTF-8 (предположительно) с переключением регистров чечто в SuSE Linux всегда применялся и применяется сейчас рез <RightAlt> + <Shift>. Но вот проблема: кириллица вропакет kbd, далее будем обсуждать именно его. де бы вводится, а при выводе на экран вместо знаков этого древнего алфавита отображаются лишь пустые знако-места. Ввод символов с консоли Linux Заглянув в исходный текст ru1.map.gz определяем, что там Консольный (иногда его называют «терминальным») драй- производится отображение не в UTF-8, а в KOI8-R. И это невер состоит из двух частей. Первая отвечает за ввод с кла- доразумение, кстати сказать, сопровождает уже несколько виатуры, а вторая за вывод на экран. То есть делится на час- версий SuSE Linux подряд. Замена раскладки на ru-utf.map. ти в соответствии с функциональным разделением самой gz исправляет ошибку разработчиков дистрибутива. консоли на клавиатуру и экран. Клавиатура может быть как Здесь отметим, что перенастройка режима ввода с конфизическим, локальным устройством, так и удаленным вир- соли производится системным скриптом /etc/init.d/kbd нетуальным. То же самое верно и в отношении экрана. Если зависимо от настроек локали. он локальный, то соответствует экрану консоли, подключенной к компьютеру, а если виртуальный, то в последова- Вывод символов в консоль Linux тельности преобразования может участвовать и консоль- Теперь обсудим, как производится вывод символьной инный драйвер удаленной системы. Поэтому для ясности бу- формац��и с помощью драйвера экрана. Для этого восдем учитывать только локальные устройства. пользуемся схемой, представленной на рис. 2. На рисунСначала разберемся, как происходит преобразование ке изображена последовательность преобразования в слувводимых данных. Воспользуемся схемой, представленной чае использования кодировки KOI8-R. Настраиваемыми на рис. 1. Изображенная там последовательность преобра- параметрами являются таблица ACM (Application Character зования будет иметь место в том случае, когда клавиатур- Map), предназначенная для перекодировки во внутреннее ный драйвер включен в режим XLATE и настроен в локали представление драйвера, таблица SFM (Screen Font Map), ru_RU.KOI8-R. На рисунке видно, что ключевую роль в ус- предназначенная для получения индекса глифа в экрантановлении соответствия некоторой клавиши и того кода, ном шрифтовом наборе, и собственно растровый шрифт. который будет получать процесс, играет специальная таб- Два последних элемента тесно связаны и очень часто обълица, называемая раскладкой. В этой таблице происходит единяются в единый файл. Файлы экранных шрифтов с имеТаблица 1. Параметры настройки кодовых преобразований и локалей

18


администрирование нами, использующими суффиксы psfu должны содержать после растрового шрифта соответствующую таблицу перекодировки SFM. Специальная управляющая подстрока CONSOLE_MAGIC используется для активации настроенного преобразования. Подробности можно узнать в [5]. В общем все достаточно тривиально. Как уже было сказано, по умолчанию SuSE Linux настраивается для использования UTF-8. Тогда все системные переменные, которые используются для настройки способа вывода принимают значения: # grep ^CONSOLE_ /etc/sysconfig/console CONSOLE_FONT="Cyr_a8x16.psfu" CONSOLE_UNICODEMAP="" CONSOLE_SCREENMAP="trivial" CONSOLE_MAGIC="(K" CONSOLE_ENCODING="UTF-8"

И здесь также отметим, что настройка вывода в консоль призводится системным скриптом /etc/init.d/kbd независимо от настроек локали. И лишь воля администратора, редактирующего соответствующий управляющий файл /etc/sysconfig/console, должна обеспечить согласование кодировок.

Настройка консоли SuSE Linux В отличие от ранее созданных локалей для обеспечения соотвествующей настройки придется подгрузить в систему дополнительные файлы. В дистрибутивной поставке отсутствует ACM для MAC-CYRILLIC и некоторые клавиатурные раскладки. Используемые для настройки разных режимов параметры перечислены в таблице 1. Недостающие отмечены отсутствием фоновой тонировки. Эти файлы, как и все приведенные или упомянутые здесь скрипты, можно найти в архиве [7]. Вот как должен выглядеть скрипт для переключения локали и консоли в режим работы с кодировкой CP1251, выполненный в точном соответствии с таблицей 1: # cat console2cp1251 #!/bin/sh PREF=/etc/sysconfig [ "1$UID" != "10" ] && { echo "you must be root!" ; exit ; } # Console perl -i -p -e 's/^CONSOLE_FONT= ↵ .*/CONSOLE_FONT=Cyr_a8x16.psfu/g' $PREF/console perl -i -p -e 's/^CONSOLE_SCREENMAP= ↵ .*/CONSOLE_SCREENMAP=cp1251_to_uni/g' $PREF/console perl -i -p -e 's/^CONSOLE_ENCODING= ↵ .*/CONSOLE_ENCODING=CP1251/g' $PREF/console # Keyboard perl -i -p -e 's/^KEYTABLE= ↵ .*/KEYTABLE=ru_win.map.gz/g' $PREF/keyboard # Language perl -i -p -e 's/^RC_LANG= ↵ .*/RC_LANG=ru_RU.CP1251/g' $PREF/language rckbd restart exit

Аналогичным образом строятся скрипты для переключения в другие локали (см. [7]). Результат перевода консоли в режим ru_RU.CP866 изображен на рис. 3.

№3, март 2006

Рисунок 3. Консоль в режиме ru_RU.CP866

Характерной особенностью является отсутствие прописной буквы «Ы» (на рисунке 3 в строке приглашения консоли), которая совпадает по коду со служебным символом управления кодовыми таблицами SCI (0x9B). Но в остальном все прекрасно работает. Итак, потенциально возможно настроить консольный драйвер и окружение пользователя для работы в любой из перечисленных локалей. Так почему же все настойчиво предлагают работать в ru_RU.UTF-8 и так пренебрежительно относятся ко всем остальным локалям?

Использование локали приложениями Безусловно, это самый важный вопрос. При его исследовании можно встретить как приятные открытия, так и озадачивающие. Тема эта неисчерпаема, как и сам набор возможных приложений. Для нас здесь принципиальным является тот факт, что корректное использование локалей всецело на совести разработчиков программного обеспечения. Более того, приложение может «уметь» использовать локали, но не поддерживать часть из них. Например, X Window в используемом большинством дистрибутивов Linux варианте Xorg является, по сути, обычным приложением. Переведем SuSE Linux в локаль ru_RU.CP1251 и затем внутри работающего X Window переключимся в CP866 и запустим новую сессию konsole. Результат на рис. 4. Получаем сразу две проблемы: во-первых, сообщение «QT: Locales not supported on X server» и, во-вторых, внутри созданного окна не наблюдается кириллицы в CP866. Первая из-за того, что нужная локаль не создана в /usr/lib/X11/locale, а вторая из-за того, что теперь надо для данного экземпляра konsole указать кодировку вручную. Вспоминаем о том, что оптимисты считают локаль свойством процесса и ... недоумеваем! Вероятно, оптимисты не входят в число авторов этих программ. Проявляем настойчивость и получаем уже несколько иной результат на рис. 5. Обратите внимание: появилась кириллица в ответе date, корректно представлена псевдографика mc, и, самое главное, нет проблем с прописной «Ы», так как клавиатура работает в «сыром» (raw в оригинале), прозрачном режиме, и текстовая консоль не участвует в процессе вы-

19


администрирование Password: Last login: Thu Mar 9 22:03:31 2006 Have a lot of fun...

alekseybb@wsvm02:~> locale LANG=ru_RU.KOI8-R LC_CTYPE="ru_RU.KOI8-R" LC_NUMERIC="ru_RU.KOI8-R" LC_TIME="ru_RU.KOI8-R" LC_COLLATE="ru_RU.KOI8-R" LC_MONETARY="ru_RU.KOI8-R" LC_MESSAGES="ru_RU.KOI8-R" LC_PAPER="ru_RU.KOI8-R" LC_NAME="ru_RU.KOI8-R" LC_ADDRESS="ru_RU.KOI8-R" LC_TELEPHONE="ru_RU.KOI8-R" LC_MEASUREMENT="ru_RU.KOI8-R" LC_IDENTIFICATION="ru_RU.KOI8-R" LC_ALL=

Рисунок 4. Запуск konsole в CP866

alekseybb@wsvm02:~> grep ^RC_LANG /etc/sysconfig/language RC_LANG=ru_RU.MAC-CYRILLIC

Как видно из протокола сеанса, командная оболочка запустилась в локали клиента. Произошло это благодаря тому, что в параметрах сервера ssh указано экспортировать переменные среды клиента: wsvm02:~ # grep ^AcceptEnv /etc/ssh/sshd_config AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL

А в параметрах клиента, аналогично, передавать переменные среды на удаленную сторону: wsalekseybb:~ # grep ^SendEnv /etc/ssh/ssh_config Рисунок 5. Konsole в CP866 с кодировкой, указанной вручную

вода. Только не получится повторить то же самое в локали ru_RU.MAC-CYRILLIC, так как в konsole эту кодировку нельзя указать принудительно – ее просто нет. Приятно то, что варианты 1-4 из таблицы 1 работают в SuSE Linux в режиме X Window, как говорится, «из коробки». Еще более интересные метаморфозы претерпевает локаль в режиме удаленной работы. Например, с помощью ssh. Если из локальной сессии, работающей в локали ru_RU.KOI8-R, подключиться к удаленному компьютеру, настроенному для работы в другой локали, то получим следующее: alekseybb@wsalekseybb:~> locale LANG=ru_RU.KOI8-R LC_CTYPE="ru_RU.KOI8-R" LC_NUMERIC="ru_RU.KOI8-R" LC_TIME="ru_RU.KOI8-R" LC_COLLATE="ru_RU.KOI8-R" LC_MONETARY="ru_RU.KOI8-R" LC_MESSAGES="ru_RU.KOI8-R" LC_PAPER="ru_RU.KOI8-R" LC_NAME="ru_RU.KOI8-R" LC_ADDRESS="ru_RU.KOI8-R" LC_TELEPHONE="ru_RU.KOI8-R" LC_MEASUREMENT="ru_RU.KOI8-R" LC_IDENTIFICATION="ru_RU.KOI8-R" LC_ALL=

alekseybb@wsalekseybb:~> ssh alekseybb@192.168.0.184

20

SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT SendEnv LC_IDENTIFICATION LC_ALL

Но если попытаться подключиться к компьютеру в локали ru_RU.MAC-CYRILLIC с помощью PyTTY из-под MS Windows, то ничего хорошего не получится, так как там нет возможности ни передать переменные программной среды, ни прямо указать перекодировку с MAC-CYRILLIC. Надо заметить, что в приложениях, не поддерживающих POSIX-локали, бывают вообще странные ситуации, вроде той, что сообщает wine при запуске некоторых абстрактно написанных программ: fixme: msvcrt:MSVCRT_setlocale : Codepage only locale not implemented

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

Подведем итоги В общем случае не представляется сложным настроить рабочую станцию GNU/Linux в любой из желаемых локалей. Как было продемонстрировано на примере SuSE Linux 10.0, который не является кириллически толерантным, что указано в предупреждении инсталлятора, даже такой дистрибутив поддается настройке. Казалось бы, отечественные дистрибутивы должны все описанное в статье иметь


администрирование Таблица 2. Уровень исходной кириллизации дистрибутивов Дистрибутивы Критерии

SuSE Linux 10.0

RHEL 4 AS

ASP Linux 10 OEM

ALT Linux Compact 3.0.4

glibc

Xorg

Уст.

fonts

glibc

Xorg

Уст.

fonts

glibc

Xorg

Уст.

fonts

glibc

Xorg

Уст.

fonts

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

UTF-8

Да

Да

Да

512

Да

Да

Да

465

Да

Да

Да

723

Да

Да

Да

59

KOI8-R

Да

Да

349

Да

Да

Да

228

Да

Да

Да

1027

Да

Да

78

CP1251

Да

0

Да

Да

0

Да

Да

Да

368

Да

Да

64

ISO8859-5

Да

102

52

Да

Да

Да

52

Да

Да

23

Да

0

Локали

CP866 MAC-CYRILLIC Число полных поддержанных локалей

Да

0

0 1

как встроенный сервис. Но этого не наблюдается. На Руси с древности повелось так, что народ учили грамоте то всякие «пришлые греки», то «ушлые варяги». Складывающаяся вокруг компьютерных кодировок ситуация следует исторической традиции. Очередные заморские гуру, в который раз предлагают отказаться от всего, что было ранее проверено и внедрено, и принять от них новую чудодейственную «пилюлю». Ожидаемо, после того как четыре зарубежные компании создали четыре взаимоисключающие способа кодирования кириллической информации, полностью игнорируя ту, что была создана независимыми отечественными разработчиками, в среде пользователей должен сформироваться иммунитет к языковым авантюрам. Тем более что, как продемонстрировано выше, единого подхода к работе с локалями не наблюдается вовсе, то есть появление новой локали закономерно приведет к новым хлопотам и проблемам с программами. Но лишь один из ведущих российских разработчиков – ASPLinux – признает сложившуюся ситуацию и предлагает набор локалей и кодировок на выбор (все из перечисленного, кроме экзотической кодировки Mac и устаревшей cp866, в версии 10 ASPLinux). А вот дистрибуция ALT Linux, копируя западный подход, с версии 3.0 полностью переходит в ru_RU.UTF-8. Причем рекомендации по «откату» на привычную KOI8-R выкладываются в Сеть синхронно с появлением этой искусственно созданной «проблемы» [8]. Вероятно, тщательная кириллизация Linux не только стала казаться неактуальной для некоторых пользователей, но даже и не считается обязательным качеством национальной продукции у некоторых разработчиков. Построим сравнительную таблицу дистрибутивов, не претендуя на полноту обзора. Рассмотрим как декларированные свойства, так и латентные, подобные тем, что позволили столь эффективно произвести многие этапы кириллизации SuSE Linux. Выберем для сравнения парочку ведущих дистрибутивов зарубежного производства и уже упомянутых лидеров отечественного рынка. Зарубежные в полном формате, а отечественные в однодисковых вариантах, для того чтобы уровнять шансы. Сравнивать будем наличие системных локалей, локалей X Window, предложения установщика (в таблице колонки, озаглавленные «Уст.») и число шрифтов выбранной кодировки для X Window (например для UTF-8: «xlsfonts | grep iso10646 | wc -l»; считая, что в них уже содержатся глифы для кириллицы, что в общем случае не всегда выполняется). Полученные результаты сведём в таблицу 2.

№3, март 2006

Да

25

0

0 2

0 4

0 1

Заметно, насколько не согласована политика внутри коллективов разработчиков. Например, в SuSE инсталлятор предлагает лишь UTF-8, тогда как внутри, еще в силу привычки, все есть для безбедной работы в KOI8-R, и это при почти полном игнорировании CP1251, от качества настройки которой в нашей стране существенно зависит интеграция с MS Windows, ну а наличие шрифтов для кодировки CP866 не объяснить никакой адекватной логикой. Точно так же непонятно, зачем в ALT Linux Compact 3.0 создана локаль для X Window, соответствующая CP866, при отсутствии всего остального для этой кодировки. На этом фоне лишь ASP Linux можно считать образцом взвешенного и разумного подхода. В строке 7 указано число локалей, полностью реализованных и поддержанных сервисом. Этот параметр является киррилическим рейтингом по факту. Так что же произошло на самом деле? Что так неоднозначно понимается создателями продукции, наполняющей внутренний рынок дистрибутивов GNU/Linux? Что их смущает? К уже имеющим хождение в России пяти кодировкам добавилась еще одна. И всего-то! После пяти предыдущих надо появление очередной, шестой, встречать с уже натренированным навыком. Успехов вам, читатели, в настройке собственных рабочих станций, иногда вопреки загадочному желанию разработчиков, далеких от общественных интересов!

Ссылки: 1. Юникод. Материал в википедии – свободной энциклопедии. http://ru.wikipedia.org/wiki/UTF-8. 2. RU.LINUX Frequently Asked Questions. Составитель Александр Канавин. Глава 3. Русификация – http://www.sensi.org/~ak/ linuxfaq/rulinux.faq-3.html#ss3.4. 3. Пакет интернационализации консоли kbd – ftp://ftp.win.tue.nl/ pub/home/aeb/linux-local/utils/kbd. 4. Пакет интернационализации консоли console-tools – http://lct. sourceforge.net. 5. Костромин Виктор Алексеевич. «Линукс для пользователя». Электронный вариант – http://nf8.jinr.ru/~kras/kostromin/gl-11/ gl_11_01.html. 6. Поисковая система для rpm – http://rpm.pbone.net. 7. Архив файлов к настоящей статье – http://www.barabanov.ru/ arts/cyrillic/cyrillic.tgz. 8. Как сменить системную локаль на KOI-8 в дистрибутиве ALT Linux Compact 3.0 – http://wiki.sisyphus.ru/utf8/ MigrateToKoi8?v=1d2w.

21


администрирование

Знакомимся с Gentoo Часть I – установка системы

Одним из главных завоеваний Open Source, и Linux в частности, можно назвать свободу выбора. Что ставить, как, куда, с какими параметрами… Дальше всех в этом вопросе пошли разработчики Gentoo – они решили вообще ничего не навязывать пользователю.

Сергей Супрунов 22


администрирование «Что за птица такая?» Интересующихся этимологией отправляем на врезку «Gentoo a.k.a. Pygoscelis papua». Здесь же поговорим о Linux-дистрибутиве Gentoo. Отличается он от большинства других тем, что очень многое в нём приходится делать вручную. До версии 2006.0, увидевшей свет в самом начале весны этого года, дистрибутив не располагал инсталлятором, и практически каждый шаг выполнялся вручную. Зато в итоге вы получали именно ту систему, о которой мечтали всю жизнь. Вторая особенность Gentoo – ориентированность на сборку из исходных кодов. Для работы с приложениями реализована очень напоминающая коллекцию портов FreeBSD система Portage, о которой у нас ещё будет возможность поговорить. Установка бинарных пакетов (которые именуются packages) не поощряется, хотя и возможна. В общем, всё направлено на достижение одной цели – не просто предоставить пользователю возможность полностью контролировать процесс установки ПО в систему, а вынудить его это делать. Это как раз то, что заложено в фундамент любой UNIX-подобной системы, – ответственность. Полная ответственность за любое действие. Если вы уже успели испугаться и потянулись к своей коллекции CD за диском с SUSE Linux – не спешите, всё не так уж и страшно. На самом деле, если держать под рукой замечательное «Руководство пользователя», то вы не только с лёгкостью справитесь с инсталляцией и настройкой, но и узнаете много нового о внутреннем устройстве Linux. К тому же начиная с версии 2006.0 установочный диск представляет собой полноценный Live CD-дистрибутив с графической средой пользователя (используется Gnome 2.12). Отсюда же можно запустить инсталлятор, который будет работать как обычная пользовательская программа, просто выполняя всё то, что до 2006.0 приходилось делать вам. Вы же в это время можете, например, поиграть или даже оформить ваши впечатления от установки в текстовом редакторе паке-

№3, март 2006

Gentoo a.k.a. Pygoscelis papua Пингвин папуанский (ослиный), именуемый по латыни Pygoscelis papua, в англоязычных странах известен под кличкой Gentoo. От сородичей отличается более крупными размерами и одной из самых высоких скоростей передвижения под водой. В общем, «быстрее, выше, сильнее». Ещё одна характерная черта – очень громкий голос (за что пингвина и назвали «ослиным»), но мы не будем проводить здесь аналогии с Gentoo-сообществом...

та OpenOffice.org, который тоже включён в Live CD. С инсталлятором, думаю, вы прекрасно разберётесь и сами (несколько советов можно найти на врезке «Всё лучшее – пользователю»). Мы же в память о том чувстве безграничной свободы, которое возникало при работе с 2005.1 и более ранними версиями, поставим всё сами.

«Где взять дистрибутив?» Раздобыть образ дистрибу тивного диска, очевидно, можно на одном из зеркал www.gentoo.org (см. раздел Mirrors). Для платформы x86 вы можете выбрать один из следующих вариантов:  Minimal CD: минимальный диск, позволяющий просто начать установку. Основные файлы системы придётся скачивать из Интернета.  Live CD: полноценный «живой» дистрибутив, который можно использовать и сам по себе. В установке Gentoo на жёсткий диск вам поможет программа-инсталлятор. Есть возможность сгенерировать необходимые для установки системы файлы из программ на диске, хотя рекомендуется всё же скачать их из Сети, чтобы получить более свежие версии.

ту. Конечно, можно выполнить установку и автономно (в инсталляторе этот режим называется GRP, в котором используются те файлы, которые обеспечивают работу Live CD). Но без широкополосного подключения к Сети Gentoo будет работать в полсилы. Впрочем, это верно почти для любой UNIX-подобной операционной системы. На тот случай, если вам проще заранее скачать наиболее крупные файлы, загрузите себе следующие два архива (пути указаны для одного из зеркал, другие можно выбрать на http:// www.gentoo.org/main/en/mirrors.xml):  ftp://ftp.citkit.ru/pub/Linux/gentoo/ releases/x86/2006.0/stages/stage3x86-2006.0.tar.bz2  ftp://ftp.citkit.ru/pub/Linux/gentoo/ snapshots/portage-20060308.tar. bz2 Естественно, к тому времени, когда вы будете читать эту статью, номера актуальных версий могут и поменяться (а для portage поменяются обязательно), так что следите за новостями. Ещё можно заранее скачать portage-архив ядра (например, отсюда: http://distfiles. gentoo.org/distfiles/linux-2.6.15.tar.bz2), но в этом случае могут возникнуть проблемы с совместимостью данного файла с вашей версией Portage на момент установки. Так что ядро лучше всё-таки ставить по сети (см. далее).

Но я открою вам страшную тайну – дистрибутив нам, по большому счёту, не нужен. А откуда же мы бу- «Куда же нам теперь дем выполнять установку? Да отку- идти?» да угодно – подойдёт любая работаю- Итак, от использования инсталлятора щая система Linux как стационарная, мы отказались. Да и, к слову сказать, так и Live CD, например Knoppix. Безу- работает он пока не очень стабильно. словно, Gentoo Live CD или Minimal CD Так что загрузитесь в ту систему, котоже сгодятся. Ну и понадобится под- торая у вас есть. И что теперь делать? ключение к Интернету с возможностью Как вы уже догадались, без толковоскачать 150-200 Мб данных. го руководства – никуда. Я постараюсь Нужно заметить, что Gentoo вооб- пояснить наиболее важные моменты, ще ориентирован на сетевую рабо- но если вам не жалко бумаги, можете

23


администрирование Немного истории Первый официальный выпуск Gentoo компьютерный мир увидел весной 2002 года. Разработчик этого дистрибутива Даниэль Роббинс (Daniel Robbins) также активно участвовал в работе над FreeBSD, поэтому не удивительно, что Gentoo перенял многие её черты. Прежде всего, это выражается в систе-

ме управления ПО – Portage, во многом аналогичной «портам» BSD, но с более развитым функционалом. В настоящее время для релизов Gentoo принята нумерация вида 2005.1, где 2005 – год выпуска дистрибутива, 1 – номер релиза в этом году. Последний релиз на данный момент – 2006.0.

заранее распечатать «Руководство» с сайта www.gentoo.org. Кстати, оно есть и на русском языке: http://www.gentoo.org/ doc/ru/handbook. Процесс установки разделён на этапы, причём вы в любое время можете прервать его и продолжить затем с того места, где остановились. А вообще, времени (и пива) понадобится немало – как для того, чтобы разобраться с дальнейшим шагом, так и на ожидание, пока выполнится компиляция той или иной программы.

«Место под солнцем» Итак, сначала нужно подготовить место на диске. Отнеситесь к этому этапу со всей ответственностью, особенно если у вас уже есть разделы с другими системами, которыми вы очень дорожите. Ответственности должно быть ещё больше, если учесть, что выполнять разбиение диска вам, возможно, придётся с помощью утилиты fdisk – одного из наиболее гибких и мощных инструментов, но в то же время наименее дружественного (по крайней мере, в версии 2005.1 использовать приходилось именно его). Если использование fdisk кажется вам слишком сложным, воспользуйтесь более дружественным инструментом, который наверняка есть в том дистрибутиве Linux, с которого вы загрузились. В частности, в Knoppix можно подготовить разделы в QtParted, легко перемещая мышкой их границы. Но запомните – вы не узнаете, как разбиваются диски, пока лично что-нибудь не сломаете. Итак, раздел у нас есть. Осталось принять ещё одно принципиальное решение – выбрать тип файловой системы.

«Что вы мне порекомендуете?» Большинство дистрибутивов Linux, желая облегчить участь своих пользователей, предлагают по умолчанию файловую систему, которую их разработчики считают наилучшей. Ну а Gentoo, как нетрудно догадаться, напротив, оставляет этот вопрос целиком и полностью на усмотрение пользователя. Я тоже не буду агитировать вас за ту или иную ФС. У каждой есть свои достоинства и недостатки, и окончательное решение можете принять на этот счёт только вы, исходя из тех задач, которые предполагаете решать. Краткое сравнение различных вариантов даётся в «Руководстве». Если же после прочтения соответствующего параграфа никаких мыслей у вас так и не возникнет – используйте проверенную временем Ext3.

24

Создаётся файловая система командой mkfs (пример дан для Ext3): # mkfs -t ext3 /dev/hda1

Понятно, что вы должны указать именно тот раздел, который подготовили на предыдущем шаге. Не ошибитесь! Если вы создавали swap, то нужно будет активировать и его: # mkswap /dev/hda3 # swapon /dev/hda3

«Порядок – прежде всего!» Примонтируйте вновь созданный раздел к вашей файловой системе. Если вы планируете использовать для Gentoo несколько разделов (например, разместить /boot или /var отдельно), то нужно будет выполнить монтирование всех этих разделов, соблюдая иерархию каталогов. Здесь мы будем предполагать, что установка выполняется на один раздел, hda1: # mkdir /mnt/gentoo # mount /dev/hda1 /mnt/gentoo

Теперь внутри каталога /mnt/gentoo нужно создать ту структуру каталогов, которая требуется для работы Linux. Разработчики Gentoo подготовили для этого специальный архив, называемый Stage3 (см. также врезку «Этапы большого пути»). Благодаря этому нам остаётся лишь распаковать его в указанный каталог (предварительно сверив часы, чтобы не было проблем со временем создания файлов): # date # tar xvjpf stage3-x86-2006.0.tar.bz2 -C /mnt/gentoo

Вдогонку распакуем и дерево Portage – оно понадобится для установки некоторых программ уже на этапе инсталляции системы: # tar xvjpf portage-20060308.tar.bz2 -C /mnt/gentoo/usr

Теперь в каталоге /mnt/gentoo размещается почти вся система за исключением ядра. Продолжим…

«Сердце системы» Дальнейшую работу лучше выполнять уже в среде Gentoo. Поэтому: # # # # # #

mount -t proc none /mnt/gentoo/proc mount -o bind /dev /mnt/gentoo/dev chroot /mnt/gentoo /bin/bash env-update source /etc/profile grep -v rootfs /proc/mounts > /etc/mtab

Первые две команды монтируют proc и dev в будущий корень устанавливаемой системы. Также нужно будет отредактировать (или скопировать из рабочей системы до перехода в chroot) файл resolv.conf, чтобы в chroot-окружении работало разрешение сетевых имён.


администрирование Всё лучшее – пользователю Начиная с релиза 2006.0 дистрибутив снабжён написанным на Python графическим инсталлятором. Работает он как обычная пользовательская программа, выполняя то, что раньше приходилось делать вручную. Стабильность инсталлятора пока оставляет желать лучшего, но всё же подобный шаг навстречу не очень опытным пользователям можно считать знаковым моментом в истории дистрибутива. Выиграет Gentoo от этого или проиграет – покажет время. Итак, осмотревшись в системе, запускайте инсталлятор. Вам придётся ответить не некоторые вопросы, которые порой понятны лишь тем, кому доводилось ставить Gentoo вручную, а именно: выбрать, откуда брать Stage3, коллекцию Portage, ядро, отметить дополнительные пакеты, настроить сеть. Если вы хотите сэкономить трафик, используйте GRP-установку и в дальнейшем (например, при выборе ядра) указывайте, что хотите использовать данные с диска. В завершение инсталлятор выполнит (по крайней мере, должен выполнить) необходимые операции по установке. Ещё пара советов по работе с Live CD, хотя напрямую к инсталлятору они и не относятся. Во-первых, никогда не используйте для подключения файловых систем непосредственно точку монтирова-

Так тоже можно ставить Gentoo

ния /mnt. Дело в том, что необходимые для работы Live CD файлы подключены как /mnt/livecd, и выполнив, скажем, команду «mount /dev/hda1 /mnt», вы разрушите эту связь и потеряете способность выполнить какую-либо команду (даже выйти из системы не удастся иначе как с помощью волшебной кнопки «Reset»). Поэтому используйте для монтирования отдельные каталоги в /mnt, например, /mnt/gentoo.

Четвёртая и пятая строки создают нужную среду окружения, исполняя сценарии из каталога /etc/env.d и обрабатывая файл /etc/profile. Последняя формирует файл mtab, который может понадобиться для правильной установки загрузчика. Перед тем как приступать к инсталляции исходных кодов ядра системы, вы можете дополнительно указать нужные вам режимы сборки (например, параметры оптимизации) в файле /etc/make.conf. Как я писал выше, исходники ядра лучше устанавливать по сети (объём закачки составит примерно 40 Мб). Если вы всё же решили скачать архив заранее, то скопируйте его в /usr/portage/distfiles, где emerge должна его найти (конечно, если версия будет соответствовать той, которая описана в дереве Portage). Установка исходных кодов выполняется простой командой: # USE="-doc symlink" emerge gentoo-sources

Здесь значение переменной окружения USE означает «не учитывать зависимости, связанные с документацией, и после установки создать символьную ссылку /usr/src/linux, указывающую на каталог с исходными кодами данной версии».

№3, март 2006

Во-вторых, если вам понадобится поработать в терминале с правами пользователя root, то использовать непосредственно команду «su» вам не удастся, т.к. вы не знаете пароля. Получить нужные права вам поможет следующий манёвр: «sudo su -». Кстати, после этого можно и установить новый пароль, чтобы иметь возможность работать в дальнейшем более привычным способом.

А волшебная команда emerge, о которой мы подробнее поговорим во второй части статьи, выполнит установку кодов ядра gentoo. Конечно, вы можете выбрать и другое, например vanilla, – собственно, поэтому ядро и не включается в Stage3, чтобы ничего вам не навязывать. Подробнее о ядрах можно прочитать в «Руководстве». Теперь нужно ядро собрать. Разработчики дистрибутива подготовили специальную программу – genkernel, которая автоматически соберёт ядро, вполне подходящее для работы. Но мы же ставим Gentoo не для того, чтобы полагаться на чей-то выбор? А раз так, то: # cd /usr/src/linux # make menuconfig

Особое внимание в настройках ядра уделите поддержке нужных вам файловых систем и оборудования (сетевые и звуковые карты, USB и т. д.). Впрочем, как вы понимаете, любая ошибка поправима – этот шаг вы всегда сможете повторить. Так что спокойно и без спешки просмотрите все опции и подумайте, нужны они вам или нет. И не забывайте о встроенной справке, где вам всегда разъяснят, зачем нужен тот или иной параметр.

25


администрирование Этапы большого пути Для решения проблемы «курицы и яйца» предлагается несколько архивов, содержащих необходимую для начала работы базовую систему. Исторически пользователь мог выбрать один из трёх вариантов – Stage1 (абсолютный минимум, основная часть системы компилируется отдельно), Stage2 (некий гибрид между Stage1 и Stage3) и Stage3 (заранее скомпилированная базовая система).

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

После того как разберётесь с опциями, запускайте сборку ядра и установку модулей: # make # make modules_install

Минут через 20 (зависит от того, что вы выбрали в настройках ядра, ну и, естественно, от возможностей вашей машины) вы получите именно то ядро, которое хотели, – даже ругать в случае проблем будет некого. Осталось лишь скопировать его в каталог /boot: # tar xvjpf portage-20060308.tar.bz2 -C /mnt/gentoo/usr

Назвать файл ядра вы вольны так, как вам удобно. Главное – потом не запутаться.

«А далеко ещё?» Итак, базовая система у нас есть. Portage есть. Ядро есть и рвётся в бой. Осталось сделать несколько последних штрихов. Во-первых, Stage3 не включает несколько нужных для работы программ. Не вошли они в базовую систему по той же причине, что и ядро, – чтобы вы могли установить именно ту реализацию, какую хотите. Итак, нам понадобятся:  утилита ведения логов в системе (одна из реализаций syslog);  утилита выполнения задач по расписанию (реализация cron);  инструменты работы с файловыми системами, отличными от Ext2/3 (если требуется);  клиент dhcp (если сеть настраивается с его помощью). Устанавливаются они очень просто (приведён пример, вы же можете выбрать и другие реализации, например, sysklogd и dcron): # emerge syslog-ng # emerge vixie-cron

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

26

# rc-update add syslog-ng default # rc-update add vixie-cron default

Это означает, что соответствующие службы будут зарегистрированы на автоматический запуск при переходе на runlevel, установленный по умолчанию (default). Более подробно о средствах конфигурирования мы поговорим во второй части статьи. Ещё я непременно ставлю на этом этапе редактор vim, поскольку необходимость работать в предлагаемом по умолчанию nano меня сильно огорчает: # USE="-X" emerge vim

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

«Осталось совсем немножко…» Последний этап – установка загрузчика. Если на вашем компьютере уже есть boot-менеджер, пригодный для запуска Linux, можно просто добавить в него пункт, указывающий на наше ядро. Если же вы хотите управлять загрузкой из Gentoo, то уже знакомым способом ставьте свой любимый загрузчик и настраивайте его: # emerge grub # vi /boot/grub/menu.lst # grub-install /dev/hdа

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

«Мы сделали это!» Итак, у нас теперь есть Gentoo. Думаю, самое главное вы поняли – любой дистрибутив Linux, и Gentoo в частности, – это всего лишь «пирамидка», которую нужно просто собрать в правильном порядке. Инсталляторы «больших» дистрибутивов скрывают это от вас, создавая вокруг этапа установки системы некоторый ореол таинственности. Но теперь и вы стали немножко волшебниками. В следующий раз мы рассмотрим вопросы настройки системы и подробнее поговорим о том, что делает Gentoo непохожей на других – о системе Portage.

Ссылки: 1. www.gentoo.org – официальный сайт проекта. 2. www.gentoo.ru – сайт русскоязычного сообщества пользователей.


администрирование

Создаём собственную ОС на базе Linux Дистрибутивов Linux существует сотни, и неизвестно, сколько появится еще. Десятки компаний и тысячи программистов соревнуются в создании лучшего Linuxпроекта, а между тем любой опытный пользователь может стать автором системы для домашнего ПК, не уступающей продуктам гигантов IT-индустрии.

Илья Александров №3, март 2006

27


администрирование

З

а долгие годы работы с Linux мною было использовано огромное количество различных дистрибутивов: Mandriva, Fedora, SlackWare, Debian, Ubuntu и многие другие. Какой-то проект нравился больше, какой-то – меньше. Но во всех дистрибутивах неминуемо приходилось сталкиваться с серьезными недостатками, которые сильно затрудняли работу. Один слишком требователен к ресурсам, в другом нет поддержки всего нужного оборудования, в третьем не хватает различного ПО. Вот тогда я вспомнил известную восточную мудрость: если нужно что-то сделать хорошо, сделай это сам.

Linux from Scratch Я не единственный, кто решил заняться построением собственной версии Linux – ОС, в которой за основу будет взята базовая часть системы и ядро, но где не будет ни единого лишнего килобайта от разработчика, то есть от вас. Большое количество Linux-дистрибутивов, не соответствующих требованиям пользователей, подтолкнуло Герарда Бикменса (Gerard Beekmans) к созданию дистрибутива, который даст возможность каждому собрать систему, где будут только необходимые ему компоненты и функции. Стремление талантливого программиста вылилось в проект Linux from Scratch (www.linuxfromscratch.org), сокращенно – LFS. Этот проект, позволяет сконструировать «с нуля», из исходных кодов, свою операционною систему на базе Linux. Компиляция LFS проходит на компьютере с уже установленной Linux-системой, впрочем, подойдет и «продвинутый» Live-CD, например, Knoppix [6]. При этом Linux-система, используемая для сборки, может быть любой – обязательно лишь наличие компилятора и системных библиотек. Linux From Scratch трудно назвать дистрибутивом в привычном смысле этого слова – это чтото вроде вспомогательного ПО, которое вкупе с базовой частью операционной системы позволит вам создать свою, уникальную версию ОС. Как известно, Линус Торвальдс разрабатывал свою операционную систему под девизом «Just for fun!» – то есть только ради удовольствия. Нужно признать, что LFS действительно не часто можно встретить на серверах, используют эту систему, как правило, компьютерные энтузиасты. Установка и работа с Linux from Scratch поможет вам разобраться во взаимосвязи компонентов ОС, что пригодится при собственных разработках Linux-дистрибутива, причем не только на базе LFS. Поэтому LFS во многом рассчитан на тех людей, для которых процесс сборки собственного дистрибутива увлекателен и интересен – а таких людей, поверьте, немало. Итак, если вы готовы потратить на конструирование системы целый день (а то и больше), то рекомендую скачать с сайта (2) LFS-packages-6.0, LFS-book, и продолжить читать эту статью.

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

28

диске выделяется раздел для новой системы. После чего на этом разделе нужно будет статически скомпилировать все необходимые программы и ядро системы. Далее происходит смена корневого каталога на раздел жесткого диска, отведенный под нашу новою ОС. Потребуется повторить компиляцию, но на этот раз ПО должно быть собрано динамически (отличие динамической компиляции от статической будет описано ниже). Последний этап включает в себя сборку важнейшей библиотеки glibc и конфигурацию установленной ОС. Как видите, ничего особенно сложного делать не придется. На протяжении всего процесса ваш главный помощник – документация из пакета LFS-book, русский перевод которой можно взять тут: http://multilinux.sakh.com/download/lfsbook. tar.bz2. В книге подробно описан каждый шаг создания ОС, поэтому обязательно обращайтесь к этому руководству в случае возникновения проблем (данная статья не призвана заменить такую обширную документацию). Создаем новый раздел – в моем случае это /dev/hda5, так как раздел /dev/hda1 уже занят установленным на жесткий диск Linux Slackware. Рекомендуется предварительно сделать бэкап системы, дабы можно было ее восстановить в случае повреждения, хотя вероятность подобного близка к нулю. И тут, думаю, все понятно: выделяем нужное количество (достаточно 2-3 Гб) под корневой каталог, пространство, равное удвоенному объему ОЗУ – под swap-раздел, по желанию можно создать отдельные разделы для домашнего каталога (/home) и для /boot. Впрочем, излюбленный многими вариант разбиения – отвести под корневой каталог все доступное пространство минус swap, и последующее создание собственно swap – также вполне допустимо при сборке LFS. На компьютере автора и Linux Slackware, являющийся родительской ОС, и LFS, используют один жесткий диск, впрочем, установить LFS на другой винчестер тоже труда не составит. Файловую систему выбирайте на ваше усмотрение: и с Ext3, и с ReiserFS никаких проблем под LFS не было. А вот поклонников XFS придется огорчить – попытки заставить Linux From Scratch работать с этой ФС не увенчались успехом. Теперь монтируем раздел, отведенный под новую ОС: $ mount /dev/hda5 /mnt/mylin

Для удобства определим переменную MYLIN: $ export MYLIN=/mnt/mylin

Отлично, для дальнейшей работы лучше создать отдельного пользователя mylin, которого и назначим владельцем смонтированного раздела. $ useradd mylin $ chown –R mylin $MYLIN

Нужно создать дерево каталогов в корне нового раздела: $ cd $MYLIN $ mkdir –p bin boot dev etc home lib mnt opt root sbin ↵ usr/{X11R6,local} var


администрирование В каталогах usr, usr/X11R6, usr/local создаем необходимую структуру: подкаталоги bin, etc, include, lib, sbin, share, src. Затем то же самое проделаем для каталогов /var и /opt будущей системы: $ mkdir var/{cache,lib,local,lock,log,opt,run,spool} $ mkdir opt/{bin,doc,include,info,lib,man}

Не будем забывать, что существуют более глубокие иерархии, например, /usr/share/man/man1. Но объем статьи не позволяет привести здесь всю информацию о структуре файлового дерева, поэтому нужно либо воспользоваться документом Filesystem Hierarhy Standart (можно найти по адресу: http://linux-ve.net/MyLDP/file-sys/fhs-2.2-rus), либо внимательно изучить структуру уже установленной у вас ОС семейства Linux. После подготовки жесткого диска приступаем к статической сборке.

Статическая сборка

$ ./configure –-enable-static-link --prefix=$MYLIN/stat $ make $ make install

По такой же схеме собираем остальные необходимые пакеты: binutils, bzip2, textutils, texinfo, tar, sh-utils, gcc, grep, gzip, gawk, diffutils, fileutils, make, patch, sed, и, собственно, linux-kernel. Да, при компиляции ядра не забываем, что для старых версий ядер (2.2.x-2.4.x) нужно использовать gcc 2.95, а для текущей версии 2.6.x рекомендуется применить gcc 3.x, дабы не возникло проблем. Не забываем заглядывать в соответствующие разделы LFS-book, там сказано об этом и многих других нюансах. В целом же компиляция ядра в LFS не отличается от подобной процедуры, проводимой при использовании установленного на HDD дистрибутива. Разархивируем исходники ядра в $MYLIN/usr/src/linux-2.6.xx, после чего конфигурируем, запуская:

Зачем мы используем статическую сборку? При статичес$ make menuconfig кой компиляции исходный код библиотеки присоединяется к коду приложения, что влечет за собой увеличение его размера, но при этом сохраняется целостность. При диПроцесс настройки параметров ядра многократно опинамической же компиляции библиотека находится в отде- сан в Интернете (6), вряд ли есть необходимость останавльном файле, к которому по мере необходимости обраща- ливаться на этом подробнее. Далее даем следующие коются приложения. В итоге все программы работают с од- манды в папке с исходными текстами Linux-kernel: ной версией библиотеки $ make bzImage Но когда мы посредством команды chroot установим $ make modules корневой каталог для вновь собираемой системы, библиотеки «родительской», установленной системы, находящиВсе, по адресу $MYLIN/usr/src/linux-2.6.xx/arch/i386/boot/ еся в /lib, /usr/lib, и прочих, станут уже недоступны, поэто- bzImage находится новое ядро. му динамически скомпилированные программы работать Далее создаем файлы $MYLIN/etc/passwd и $MYLIN/etc/ откажутся, вдобавок совместимость версий никем не га- group. В первом прописываем пока единственного пользорантирована. вателя – root с любым паролем, а во втором группы польЧтобы избежать этого, все необходимое программное зователей (для начала одной группы root тоже будет дообеспечение для нашей будущей системы мы для начала статочно). соберем статически. Начнем, пожалуй, с командного инНа этом наши приготовления к следующему шагу затерпретатора bash. (Поклонники ZSH или TCSH могут ус- кончились, и мы переходим уже к более тонкой динамитановить любимые интерпретаторы после установки сис- ческой сборке. темы, но на этапе сборки их использование не предусмотрено автором LFS). Следует проверить, есть ли у вас Динамическая сборка файл /usr/lib/libcurses.a и если его нет – установите па- Теперь нам нужно сменить корневой каталог на /mnt/mylin, кет nсurses-dev. Все пакеты надо собирать с флагами ста- где мы будем пользоваться только статически собранными тической сборки: «--enable-static-link», «--disable-shared» утилитами – к помощи инструментов из «родительской» ОС или «--static». Какой именно подходит в каждом конкрет- мы уже прибегать не сможем. Даем команду в консоли: ном случае, можно узнать из документации к конкретному $ chroot $MYLIN/usr/bin/env –i \ пакету или из вывода конфигурационного сценария, запу>HOME=/root TERM=$TERM PS1=’\u:\w\$’ \ щенного с параметром «--help». >PATH=/bin: /usr/bin: /sbin: /usr/sbin: /stat/sbin \ $ ./configure –-help

Чтобы не спутать позже статически скомпилированные программы с «динамическими», создадим для них специальный каталог: $ mkdir $MYLIN/stat

При сборке и установке пакетов не забываем добавлять параметр «--prefix=$MYLIN/stat» для перемещения файлов именно в этот каталог. И, наконец, ставим bash:

№3, март 2006

>/stat/bin/bash --login

Этой командой мы указали пути к исполняемым файлам, тип терминала, интерпретатор и вид приглашения командной строки. Для обеспечения работы некоторых программ, надо установить файловую систему proc в новой системе. $ mount proc /proc -t proc

Наступил самый ответственный момент. Сборка библиотеки glibc. Самый ответственный он потому, что рабо-

29


администрирование Таблица 1. Необходимый набор пакетов для сборки autoconf

grep

perl

automake

groff

man

bash

gzip

procinfo

bin86

kbd

procps

binutils

less

psmisc

bzip2

lfs-bootscripts

reiserfs-progs

diffutils

libtool

sed

e2fsprogs

lilo

sh-utils

ed

m4

shadow

file

make

sysklogd

fileutils

makedev

sysvinit

findutils

man-pages

tar

flex

modutils

texinfo

gawk

ncurses

textutils

gcc

netkitbase

util-linux

bison

net-tools

vim

gettext

patch

glibc и других библиотек), и того, что для установки glibc нужен интерпретатор Perl, которого у нас нет. Заменяем имя пользователя root в файле login/Makefile на его uid, то есть 0, а переменную $PERL в файле malloc/Makefile следует заменить на путь к интерпретатору – /usr/bin/perl – и при конфигурировании он просто будет проигнорирован. Далее: $ /usr/src/glibc-2.x.x/configure ↵ --prefix=/usr --enable-add-ons ↵ --libexecdir=/usr/bin && & make & make install $ make localedata/install-locales $ /stat/bash --login

Если вы все сделали правильно, glibc скомпилируется, в строке приглашения наконец-то появится «root», и можно будет динамически перекомпилировать все программы. Завершим установку ядра: $ make modules_install $ make install

Чтобы переместить новое ядро в каталог /boot, выполняем еще одну команду: $ make unstall

Рисунок 1. Схема сборки LFS

тать без нее большинство необходимых программ не будет, а в использовании Linux без основной библиотеки смысла нет. Сборка glibc же зачастую доставляет массу проблем. При сборке мы указывали параметр «--prefix=$MYLIN/stat», поэтому при смене корня все статически собранные пакеты окажутся в каталоге / stat раздела новой ОС. Итак, распаковываем архив glibc2.x.x.tar.gz (например, в дирек торию /usr/src/) и переходим в каталог glibc-linuxthreads. Придется немного подправить исходный код ввиду того, что на данном этапе в системе невозможна идентификация пользователя по имени (как раз из-за отсутствия

30

Собираем все установленные и некоторые новые программы, теперь уже без флагов статической компиляции. Нам потребуются (на данном этапе очень важно не забыть скомпилировать все нижеперечисленное) (см. таблицу 1). После выполнения динамической перекомпиляции можно удалить каталог со статически собранными пакетами: $ rm -rf /stat

Можно облегченно вздохнуть и выпить кофе – самое сложное, рутинное осталось позади. Переходим к следующему этапу – начальному конфигурированию нашей системы.

Начальное конфигурирование системы Перед тем как приступить к настройке, замечу, что все изменения нужно делать в файлах каталога новой ОС,

а не родительской системы. Для установки системного времени создадим файл /etc/sysconfig/clock, содержащий всего одну строку: UTC=0

Теперь часы компьютера будут отображать время вашего часового пояса – при условии, что значение времени в BIOS установлено верно. Дадим компьютеру имя: echo "HOSTNAME=my_linux" > ↵ /etc/sysconfig/network

Теперь разделы, которые система должна монтировать при загрузке, укажем в /etc/fstab: # filesystem mount-point fs-type ↵ options dump fsck-order /dev/hda5 / ext3 defaults 1 1 /dev/hda3 swap swap pri=1 0 0 proc /proc proc defaults 0 0

Вместо /dev/hda3 и /dev/hda5 напишите ваши разделы (корневой и swap), дополните файл при необходимости точками монтирования других разделов жесткого диска и CD-ROM. Теперь сделаем нашу систему загружаемой. Если помимо lFS вы пользуетесь другими дистрибутивами Linux, то сейчас нужно войти в старую систему – для этого выполняем команду: $ exit

Уже в родительской ОС в файл /etc/ lilo.conf добавляем следующее: # LFS image=/boot/bzImage label=lfs root=<partition> read-only

Понятно, что «/boot/bzImage» – это путь к скомпилированному вами ядру системы, а «partition» – раздел диска, где находится корневой каталог. Если же вы не планируете пользоваться другими операционными системами и дистрибутивами Linux, то сразу переходите к настройке LILO в LFS. В этом случае lilo.conf будет выглядеть примерно так: boot=/dev/hda

delay=40 compact vga=normal


администрирование root=/dev/hda1 read-only image=/boot/zImage-2.6.12 label=Linux

Сделайте необходимые изменения в зависимости от вашей конфигурации. Обновляем загрузчик командой: $ /sbin/lilo –v

И, если все предыдущие этапы были выполнены правильно, мы окажемся в новой системе. Однако долгий этап «тонкой» настройки (отдельное внимание стоит уделить безопасности новой системы, ибо LFS по умолчанию выглядит довольно-таки незащищенным, как и всякая вновь установленная ОС) еще впереди. Зато собственноручно собранная версия Linux у вас уже есть.

Постскриптум Герард Бикменс – не единственный, кому пришло в голову создать собственный Linux. Другой проект – BYOLinux, руководителем которого являлся Джонатан Торп (Jonatan Thorpe), на сегодняшний день свое развитие прекратил, хотя написанная имдокументация сохраняет актуальность и сейчас, но она не так детальна, как LFS-book и не переведена на русский. Главное отличие метода Джона в том, что библиотека glibc переносится из родительской системы в дочернюю без перекомпиляции, это не столь эффективно, но позволяет избежать многих проблем при сборке. Желание почувствовать себя конструктором ОС испытывают и некоторые пользователи FreeBSD.

№3, март 2006

Теперь такое вполне возможно – по адресу http://ezine. daemonnews.org/200302/fbsdscratch.html находится статья о сборке FreeBSD из исходников целиком – от distributions до портов, причем методом не похожим на обычный «rebuild» системы, но схожим с методом Герарда Бикменса. Что ж, теперь и у вас есть личная, уникальная система, созданная на базе Linux. В случае возникновения проблем ищите их решение в LFS-book, там все подробно описано. Также рекомендую с портала http://www.tldp.org скачать руководство Linux Network Administrator’s Guide, оно хоть и не относится непосредственно к LFS, но пригодится на этапе настройки системы. Не стоит забывать, что с каждой программой поставляются также различные man и info pages, также призванные облегчить жизнь линуксоида.

Литература и ссылки 1. LFS-book на русском – http://multilinux.sakh.com/lfs. 2. Официальный портал проекта LFS – http://www.linuxfromscratch. org. 3. Портал ByoLinux – http://www.byolinux.org. 4. Cтатья о FreeBSD from scratch – http://ezine.daemonnews.org/ 200302/fbsdscratch.html. 5. Статья о компиляции ядра Linux – http://vikos.lrn.ru/MyLDP/ kernel/kompil-2-6.html. 6. Байрак А. Обзор Knoppix 3.7 Russian Edition. – Журнал «Системный администратор», №3, март 2005 г. – 4-6 с. Ссылки на все указанные в статье программы приведены в LFS-book (Часть 3. Приложения).

31


администрирование

Создаем порт для FreeBSD своими руками Часть I: основные возможности

Автоматизированная система сборки стороннего программного обеспечения из исходных текстов (система портов) – это то, чем по праву гордится FreeBSD. Система содержит ссылки на десятки тысяч программ, и этот список постоянно пополняется. Кто их создает – эти пополнения – некие выдающиеся специалисты? Да вовсе нет. Вы тоже сможете стать одним из них.

Рашид Ачилов 32


администрирование

С

поры о том, что правильнее – собирать программы руками или использовать для этого порты, в эхоконференции FidoNet RU.UNIX.BSD не утихают никогда. Они могут стихнуть на время, но затем кто-нибудь снова задаст такой вопрос, и они разгораются с новой силой. И рано или поздно каждый приходит к мнению, что использовать порты удобнее, потому что:  Система сама ведет список файлов, входящих в порт, что позволяет просто удалить программу, не заботясь о том, что на диске останутся «хвосты».  Система сохраняет контрольную сумму MD5 по каждому файлу, что позволяет проверить его подлинность в случае возникновения сомнения, а также при удалении программы. Поскольку при удалении порта проверяются контрольные суммы файлов, его составляющих, система не удалит файл, если его контрольная сумма не совпадает с записанной. Это исключает ситуацию, когда тщательно настроенный, но как обычно нигде не зарезервированный конфигурационный файл программы пропадает при ее удалении.  Система отслеживает выход новых версий программы (это верно только для портов, которые сопровождаются кем-то еще, а не вами. О своевременном обновлении вашего порта вы должны заботиться сами).  Значительно проще ответить на вопрос «Установлена ли у меня эта программа?» или «Где у меня такой-то файл от такой-то программы?»

Основные моменты того, как устроена система портов и как с ней эффективно работать, изложены в [1], здесь я приведу только ее краткое описание, необходимое для понимания статьи. Система портов или «коллекция портов» представляет из себя древовидную структуру каталогов, которая обычно размещается в /usr/ports. Имена каталогов первого уровня (находящиеся непосредственно в /usr/ports) образуют наименования «категорий», то есть тематических групп. Например, есть категория mail, в которую входят все программы, связанные с обработкой электронной почты, есть категория dns и т. д. Решение о создании новой категории принимает FreeBSD Team, которая создает на первичных зеркалах новый каталог, переносит в него нужные порты, откуда изменения расходятся по вторичным зеркалам и обычным серверам. Перед тем как приступить к созданию порта, необходимо решить, к какой категории относится программа, которую предстоит внести в дерево портов. Имена категорий и их краткое описание приведено в [2]. Внутри каталога категории размещаются непосредственно порты – по одному в каждом отдельном каталоге. Такая структура несколько замедляет навигацию, когда в каталоге находится много файлов, и именно поэтому постоянно появляются новые и новые категории.

Из чего, собственно, состоит порт для FreeBSD? Порт для FreeBSD состоит из нескольких файлов, которые сами по себе ничего не делают. Даже несмотря на то, что один из них называется Makefile, все они представляют из себя файлы данных – описания и определения некоторых переменных, используемых системой портов в качестве исход-

№3, март 2006

33


администрирование ных данных. Механизм работы системы давным-давно отлажен, в простейшем случае необходимо только задать исходные данные. Ниже приводится список файлов, которые необходимы для порта (на самом деле порт может использовать и другие файлы, но они не являются необходимыми):  Makefile – основной файл порта. В нем задаются все необходимые переменные, которые настраивают работу системы портов в том или ином режиме. Также в этом файле может программироваться собственно поведение системы в той или иной ситуации. Текстовый файл, стандартного формата, распознаваемого программой BSD make (не путать с GNU make! О синтаксисе файлов BSD make см. man make). Данный файл условно делится на четрые секции, которые должны идти строго друг за другом, не нарушая порядка. Определения переменных, которые должны появляться в данной секции, не должны появляться ни в предыдущей, ни в последующей секции. Порядок секций таков: начальная секция → секция MAINTAINER → секция USE_* → секция доопределений.  Начальная секция идет самой первой. В нее помещаются переменные PORTNAME, PORTVERSION, CATEGORIES, MASTER_SITES и DISTNAME. Также в нее могут быть помещены другие переменные, полный перечень которых приведен в файле bsd.port.mk.  Секция MAINTAINER идет непосредственно после начальной секции. Как правило, она содержит только две переменные – MAINTAINER и COMMENT. Смысл этой секции в том, что она определяет персону, отвечающую за данный порт, и дает краткое описание этого порта. В целях безопасности все запросы на патчи (да и сами патчи тоже), пришедшие для уже принятого порта не с адреса, указанного в поле MAINTAINER, а с другого адреса, перенаправляются MAINTAINER на утверждение и вносятся в порт только в том случае, если будут им одобрены.  Секция USE_* расположена после секции MAINTAINER. Она содержит различные переменные, задающие явно или неявно зависимости для данного порта. Например, «USE_GETTEXT=yes» задаст зависимость порта от devel\gettext, «USE_KDEBASE_VER=3» задаст зависимость от x11\kdebase3 и т. д. Список всех возможных переменных USE_* приведен в файле bsd.port.mk. Может отсутствовать, но, как правило, присутствует – трудно найти порт, который вообще ни от чего не зависит.  Секция доопределений – последняя секция в файле. Может отсутствовать и зачастую так и происходит. Содержит переопределения различных мишеней, составляющих процесс сборки порта. При сборке порта последовательно выполняются мишени fetch, extract, configure, build и install. Каждая из них в свою очередь состоит из трех этапов: pre-sometarget, do-sometarget и post-sometarget. Эти этапы предназначены для проведения дополнительной предварительной или последующей обработки, а также для замещения некоторого этапа, если в этом есть необходимость. Например, этап do-extract может быть переопределен для выполнения распаковки дистрибутива нестандартным образом. Существуют и другие этапы, полный их перечень приведен в файле bsd.port.mk.

34

 distinfo – файл, описывающий все файлы, входящие в дистрибутив программы. Его нет необходимости создавать вручную – после создания Makefile достаточно выполнить команду make makesum – и он будет создан автоматически.  pkg-descr – текстовый файл с небольшим описанием программы и ее возможностей. Описание может быть вообще коротким – 2-3 строки или более подробным 10-15 строк. В конце файла желательно привести URL разработчика и его адрес электронной почты в формате: WWW: http://this.insert.link/~homepage Author: John J. Smith <jsmit@someserver.tld>

 pkg-plist – список всех файлов, входящих в программу, а также команд, выполняемых при установке и/или удалении данной программы. Файлы указываются с путями относительно каталога установки (по умолчанию /usr/local), могут содержать макросы (будут рассмотрены ниже). Команды задаются в формате, описанном в man pkg_create.  Другие файлы с произвольными именами. Например, файл сообщения, выдаваемого после успешной установки (или удаления) обычно называется pkg-message, хотя конечно никто не помешает назвать его как угодно по-другому. Итак, что понадобится для того, чтобы приступить к созданию своего собственного порта?  Дистрибутив программы. Его следует поместить в /usr/ports/distfiles – это обычно место, куда скачиваются дистрибутивы и где система портов будет их искать.  Программа должна собираться и устанавливаться без ошибок. Если создается порт для чужой программы и она собирается с ошибками, следует найти причину, но не править исходный текст, а подготовить патч (если только не предполагается выкладывать исправленный дистрибутив на собственном сервере).  Решение о присвоении программе определенной категории.  Любимый текстовый редактор.  Терпение и свободное время – возможно, порт придется пересобирать не один раз и даже не десять.

Первый порт – несложная программа для KDE Мы не будем заниматься искуственными примерами. В качестве примера первого порта возьмем несложную программу для KDE, взятую с сайта http://www.kde-apps.org. Почему именно для KDE? Сообщество разработчиков KDE огромно, программы появляются, развиваются, а потом перестают поддерживаться и развиваться постоянно, причем большинство их авторов из Европы, работающие в той или иной версии Linux и даже и не подозревающие, что их программа может работать и в другой операционной системе, и ситуация, когда на KDE applications находится интересная и нужная програ��ма, – это совершенно обычная ситуация. Итак, в качестве примера возьмем программу, которая позволяет встроить в панель KDE выпадающее меню с содержимым адресной книги. Программа так и называет-


администрирование Откуда взять имя дистрибутива и адрес домашнего сайся – «Contacts menu for Kicker». Подробное ее описание приведено в [3]. Факт успешной сборки программы уже прове- та проекта? Как правило, первоначальная закачка файла рен, программа установлена, и протокол установки сохра- производится вручную, следовательно, имя файла и URL иснен в файле, то есть была выполнена команда: ходного сайта всегда можно найти в логах программ, которыми он закачивался. Можно использовать для этого и дру# make install >& install.log гие методы, которые я не буду здесь описывать ввиду их чрезвычайно большого разнообразия. Таким образом, есВ данном примере для перенаправления в файл и обь- ли бы имя дистрибутивного файла нашей программы быединения выводов stdout и stderr используется синтаксис ло contactsmenu-0.3.4b.tar.gz, нам бы больше ничего не потtcsh, в sh необходимо выполнить: ребовалось указывать – вся информация для загрузки уже предоставлена. Но не все так просто, потому что имя наше# make install > install.log 2>> install.log го файла – 34479-contactsmenu-0.3.4b.tar.bz2. Что делать? Для таких случаев предусмотрено принуНачинаем. Сразу же необходимо иметь в виду, что су- дительное задание имени дистрибутивного файла, котоществует довольно жесткий порядок, в котором в фай- рое должно быть полным, то есть ле Makefile должны появляться определения переменных. DISTNAME= 34479-${PORTNAME}-${PORTVERSION} В нижеследующем примере приводится правильный порядок и нарушать его не рекомендуется. Включив в нижеследующие секции «USE_BZIP2=YES» Файл Makefile мы сформировали полное имя дистрибутивного файла. Для многих популярных URL типа www.apahe.org, В соответствии с рекомендациями [4] Makefile должен иметь sourceforge.net, www.kde.org и пр. определены специальследующий заголовок: ные макросы, в которых перечислены все URL, на кото# New ports collection makefile for: contactsmenu рых можно найти данную программу. Например, если бы # Date created: 01 Mar 2006 данная программа располагалась на сайте sourceforge.net, # Whom: Rashid N. Achilov <shelton@granch.ru> # то строка MASTER_SITES была бы заменена следующей # $FreeBSD$ комбинацией: На этом заголовок кончается. MASTER_SITES= ${MASTER_SITE_SOURCEFORGE} Внимание! Для впервые отправляемого порта строка MASTER_SITE_SUBDIR= contactsmenu $FreeBSD$ должна выглядеть именно так, как показана! Первыми строками, идущими за заголовком, должны что означало бы загрузку файла с сайтов, входящих в зарабыть следующие: нее определенный список из подкаталога contactsmenu. PORTNAME= PORTVERSION= CATEGORIES=

contactsmenu 0.3.4b mail kde

Эти три переменные должны идти первыми и именно в том порядке, в котором они приведены. Первая из них задает имя порта. Она должна совпадать с именем каталога с файлами порта. Вторая задает номер текущей версии программы. Именно по ней будет проводится сравнение существующей и установленной версий. Третья перечисляет список категорий, к которым относится данный порт. Выбор категории, а также требования к составлению данного списка приведены в [2]. MASTER_SITES=

http://www.kde-apps.org/content/files/

MAINTAINER= COMMENT=

shelton@granch.ru KDE 3.x addressbook Kicker applet

Эти строки должны идти в том порядке, в котором приведены. MAINTAINER задает адрес электронной почты лица, которое создало и управляет данным портом. COMMENT содержит краткое (одну строчку) описание данного порта. Внимание! При использовании нескольких адресов электронной почты в поле MAINTAINER должен быть проставлен тот адрес, который будет указан в поле From: во время отправки подготовленных файлов порта командой send-pr. Если в поле MAINTAINER будет указан один адрес, а обновления порта пойдут с другого адреса, придется дополнительно подтверждать, что данное письмо отправлено именно майнтайнером порта, а не является подделкой.

USE_KDEBASE_VER= 3 Эта переменная должна идти сразу после CATEGORIES. USE_GMAKE= yes Она задает список сайтов, с которых будет скачиваться дисUSE_BZIP2= yes трибутив программы. Имя дистрибутивного файла по умолчанию формируетНачинается секция переменных USE_*. Здесь, как прася как ${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}. вило, перечисляются неявные зависимости, заранее опEXTRACT_SUFX же по умолчанию равен «.tar.gz», если ределенные в системе. USE_KDEBASE задает зависине указано явно, каким архиватором упакован дистрибу- мость порта от пакета kdebase3, USE_GMAKE – от пакетив. Явно задать архиватор можно с помощью переменных та gmake, USE_BZIP2 – от пакета bzip2 (и заодно устанав«USE_BZIP2=YES» для архиватора Bzip2 и «USE_ZIP=YES» ливает EXTRACT_SUFX в «.tar.bz2»). для архиватора Zip. Эти переменные должны быть заданы Что означает «порт Х зависит от порта Y»? Это означаниже, в секции, где группируются все переменные USE_*. ет, что в соответствии с тем, к какому типу будет отнесена

№3, март 2006

35


администрирование share/locale/ga/LC_MESSAGES/libkickermenu_contactsmenu.mo данная зависимость (EXTRACT_DEPENDS, RUN_DEPENDS share/locale/fr/LC_MESSAGES/libkickermenu_contactsmenu.mo и т. д., см. bsd.port.mk для полного списка), то на данном этаshare/locale/pt/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/sv/LC_MESSAGES/libkickermenu_contactsmenu.mo пе построения порта (extract, install и т. д.) система проверит наличие установленного пакета, который указан как зависимость, и если он не установлен, система автоматически то есть одна динамическая библиотека, один файл .desktop перейдет к его установке. В этом проявляется еще одно пре- и восемь файлов локализации. Тут надо заметить, что, имущество системы портов – имея скоростной канал в Ин- как правило, с файлами локализации в KDE сплошная тернете и дешевый трафик, можно не думать, например, морока – их бывает по 20-30 шт. Но пропустить, случайо том, какие файлы нужны для установки KDE – достаточ- но или намеренно, какой-либо файл нельзя – порт будет но перейти в каталог x11/kde и набрать make. Построение впоследствии отослан на тестирование во FreeBSD Team, правильного списка зависимостей – одна из задач автора где проверят все этапы его установки и удаления, и если порта. Если указать ненужные программы – порт будет пы- после удаления в каталоге будут обнаружены оставшиеся таться их поставить, что будет забивать систему мусором, файлы, то майнтайнер порта получит сообщение об ошибесли же забыть нужные – порт в лучшем случае не собе- ке, не устранив которую, он никогда не увидит своего поррется, в худшем – соберется и не будет работать. та принятым. Во второй части файла pkg-plist перечисляются команGNU_CONFIGURE= yes ды, которые необходимо выполнить системе при деинсCONFIGURE_ARGS += --with-qt-dir=${QT_PREFIX} \ талляции программы. Как правило, это команды удаления --with-extra-includes=${LOCALBASE}/include \ --with-extra-libs=${LOCALBASE}/lib каталогов, которые могли быть созданы в процессе инсталляции. Если в команде упоминается каталог, который Эти строки должны присутствовать (если они есть) пос- к моменту выполнения деинсталляции непустой – он не буле всех переменных USE_*. Они определяют, что для со- дет удален. здания Makefile, управляющего сборкой программы, будет @dirrm share/locale/bg/LC_MESSAGES использоваться configure, и задают дополнительные аргу@dirrm share/locale/bg менты, передаваемые при вызове configure. При сборке @dirrm share/locale/br/LC_MESSAGES @dirrm share/locale/br программы configure получает неявные параметры, зада@dirrm share/locale/da/LC_MESSAGES ваемые, например, с помощью PREFIX, но может получать @dirrm share/locale/da @dirrm share/locale/de/LC_MESSAGES и явные параметры, перечисляемые выше. @dirrm share/locale/de Ну и последней строкой нашего Makefile обязательно @dirrm share/locale/ga/LC_MESSAGES @dirrm share/locale/ga должна быть: .include <bsd.port.mk>

которая, собственно, и загрузит основной файл. Вот и все, файл, управляющий сборкой программы создан.

@dirrm @dirrm @dirrm @dirrm @dirrm @dirrm

share/locale/fr/LC_MESSAGES share/locale/fr share/locale/pt/LC_MESSAGES share/locale/pt share/locale/sv/LC_MESSAGES share/locale/sv

Опять упоминаются в основном каталоги для сообщений, потому что их могло и не быть. Здесь опять же нельзя Файл составляется как раз на основе протокола инсталля- пропустить ни одного каталога, который создается исклюции install.log, который был сохранен во время установки чительно данной программой и больше никем не испольпрограммы. Следует также учесть, что программы для KDE зуется. часто используют локальные скрипты libtool, которые устанавливают динамические библиотеки, используя свои собс- Файл pkg-descr твенные конфигурационные файлы с расширением .la. По- Как уже говорилось выше, это просто текстовый файл с неэтому, если в протоколе установки упоминается, например, большим описанием того, что делает данная программа. kickermenu_contactsmenu.la, нужно открыть его (это тексто- Чтобы не сочинять самому описание, в нашем случае мы вый файл) и посмотреть, какая же библиотека там исполь- просто берем описание, приведенное автором на странизуется. Как правило, ее имя совпадает с именем .la фай- це kde-apps и заносим его в этот файл, сопровождая ссылла (в нашем случае kickermenu_contactsmenu.so), но могут кой на собственно страницу программы (файл см. на сайте быть отличия, в частности, файлов может быть несколько. журнала в разделе «Исходный код»). В файл pkg-plist компоненты программы вписываются по На этом этап первоначального формирования файодному в строке, с указанием пути относительно корня ус- лов можно считать законченным. Мы еще не сформироватановки (по умолчанию /usr/local). ли distinfo, но он формируется автоматически после того, То есть в нашем случае: как порт будет проверен. Переходим к проверке порта.

Файл pkg-plist

lib/kde3/kickermenu_contactsmenu.so lib/kde3/kickermenu_contactsmenu.la share/apps/kicker/menuext/contactsmenu.desktop share/locale/bg/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/br/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/da/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/de/LC_MESSAGES/libkickermenu_contactsmenu.mo

36

Для проверки правильности написания файлов порта существует специальная программа portlint, которую необходимо установить каждому, кто собирается заниматься разработкой собственных портов. Это небольшой скрипт, написанный на языке Perl, устанавливается он из devel/portlint:


администрирование # cd /usr/ports/devel/portlint # make all install

После установки запускаем portlint в текущем каталоге с ключами, которые включают все возможные проверки: # portlint -abvtAN ... WARN: /usr/ports/mail/contactsmenu/pkg-plist [4]: installing gettext translation files, please define USE_GETTEXT as appropriate ... 0 fatal errors and 9 warnings found.

Здесь приведена часть вывода portlint, в которой выводится замечание. В последней строке приводится итог – сколько ошибок и сколько замечаний было обнаружено. Отмечу сразу, что необходимо добиться устранения всех ошибок и желательно всех замечаний. В данном случае portlint предупреждает о том, что устанавливаются файлы сообщений gettext, но в порт не включено неявной зависимости от devel/gettext (это может привести к невозможности работы с данными файлами). Для исправления данной ситуации добавляем в секцию USE_* строку «USE_GETTEXT=YES» и повторно запускаем portlint. # portlint -abvtAN ... WARN: Makefile: Consider adding support for a WITHOUT_NLS knob to conditionally disable gettext support. ... WARN: Makefile: only one MASTER_SITE configured. Consider adding additional mirrors. ... 0 fatal errors and 2 warnings found.

Что нам советуют сейчас? Добавить поддержку параметра WITHOUT_NLS для тех, кто не хочет устанавливать файлы языковых сообщений и увеличить количество зеркал, на которых размещен данный файл. Здесь надо заметить, что любой дистрибутив порта после его принятия в систему дополнительно зеркалится на сайте проекта FreeBSD, так что замечание о дополнительных зеркалах мы игнорируем, а вот замечание о WITHOUT_NLS исправим. Для этого добавим в Makefile следующий код: .if defined(WITHOUT_NLS) PLIST_SUB+= NLS="@comment " .else USE_GETTEXT= yes PLIST_SUB+= NLS="" .endif

а в файле pkg-plist изменим строки, описывающие файлы языковой поддержки таким образом: %%NLS%%share/locale/bg/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/br/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/da/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/de/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/ga/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/fr/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/pt/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/sv/LC_MESSAGES/libkickermenu_contactsmenu.mo

Как это будет работать? Параметр PLIST_SUB содержит список подстановок, которые выполняются, когда система обрабатывает файл pkg-plist. Если при сборке порта будет задан параметр «WITHOUT_NLS=yes», то в pkg-

№3, март 2006

plist будет подставлено значение, превращающее строки с «%%NLS%%» в строки комментария. Обратите внимание, что в этом случае зависимость от devel/gettext не вставляется. В противном случае NLS принимает значение пустой строки, и зависимость от devel/gettext вставляется. Этот прием (модификация pkg-plist в зависимости от параметров сборки порта) является очень широко распространенным. Запускаем portlint еще раз, получаем одно замечание про MASTER_SITES, которое игнорируем. Осталось создать файл distinfo. Это просто. Система сама его создаст, если ее об этом попросить: # make makesum

Созданный файл имеет следующий вид: MD5 (34479-contactsmenu-0.3.4b.tar.bz2) = 65af4e3103c906ed13508bf1b2dd217a SHA256 (34479-contactsmenu-0.3.4b.tar.bz2) = 88e05096b2f9c8d659be61daed5e6da977a056033a52c79789dade217709afee SIZE (34479-contactsmenu-0.3.4b.tar.bz2) = 457076

Теперь пробуем собрать программу, используя порт. Для проверки правильности составления файла pkg-plist в качестве корневого каталога сборки назначим /tmp/1 (после деинсталляции программы не должно оставаться файлов или каталогов, которые она создает). # make PREFIX=/tmp/1 ===> Vulnerability check disabled, database not found ===> Extracting for contactsmenu-0.3.4b => MD5 Checksum OK for 34479-contactsmenu-0.3.4b.tar.bz2. => SHA256 Checksum OK for 34479-contactsmenu-0.3.4b.tar.bz2. ===> Patching for contactsmenu-0.3.4b ===> contactsmenu-0.3.4b depends on file: /usr/X11R6/qt33/bin/moc - found ===> contactsmenu-0.3.4b depends on executable: gmake - found ===> contactsmenu-0.3.4b depends on shared library: kfontinst - found ===> contactsmenu-0.3.4b depends on shared library: kimproxy - found ===> contactsmenu-0.3.4b depends on shared library: intl - found ===> Configuring for contactsmenu-0.3.4b ===> Building for contactsmenu-0.3.4b cd: can’t cd to /usr/ports/mail/contactsmenu/work/34479-contactsmenu-0.3.4b *** Error code 2 Stop in /usr/ports/mail/contactsmenu.

Вот мы и получили первую ошибку. Она связана с некоторой бестолковостью имен дистрибутивных файлов на http://www.kde-apps.org, когда сам файл имеет имя с числом впереди, а каталог, упакованный внутри него, – без этого числа. Для решения этой проблемы следует указать системе, что имя каталога, в которую будет распакован дистрибутив, будет задано вручную. После (!!) переменной MAINTAINER впишем следующую строчку: WRKSRC=

${WRKDIR}/${PORTNAME}-${PORTVERSION}

указывая таким образом, что дистрибутив будет распакован в каталог с именем, состоящим из имени и номера версии пакета. Повторяем сборку. Сборка проходит нормально. Запускаем установку. Видим, что в каталоге /tmp/1 появились все нужные файлы. Создаем пакет с помощью pkg_create (хотя можно то же самое проделать через make package): # cd /var/db/pkg # pkg_create -b contactsmenu-0.3.4b

37


администрирование Проверяем файл +CONTENTS внутри архива – под каж- что есть и русскоязычные коммиттеры (например, письдой строчкой, описывающей файл программы, должна рас- мо, приведенное выше, получено от Кирилла Пономарева (krion@freebsd.org). Сообщение об успешном помещении полагаться строчка комментария с контрольной суммой: в дерево портов может выглядеть так: lib/kde3/kickermenu_contactsmenu.so @comment MD5:fd3cf198770bac4e1b8453f3ba2d6f90 lib/kde3/kickermenu_contactsmenu.la @comment MD5:4de2541c36ea248066aecb851aedbbe5

Если такой строчки нет – значит, в файле pkg-plist ошибка – при установке файл не был найден. Это может быть тривиальная опечатка или же ошибка в Makefile, при которой в pkg-plist был вставлен файл, отсутствующий в данной конфигурации. Проверяем удаление пакета через plg_delete (или make deinstall в каталоге порта). При удалении не должно выдаваться сообщений о том, что файл не найден. Если такие сообщения выдаются, значит файл pkg-plist содержит ссылки на файлы, которые на самом деле не были установлены. Ну вот, все проверки проделаны. Что дальше? Последним этапом нашей работы будет отправка порта во FreeBSD Team и получение оттуда ответа об успешном помещении его в дерево портов или сообщение об ошибке. Порядок действий при этом такой:  Удаляется каталог work и все файлы, которые не входят в отсылаемый порт (отладка и пр.).  Создается shell-архив командой «shar `find contactsmenu`». При это нужно находиться в корневом каталоге категории (в нашем случае /usr/ports/mail), а не в каталоге порта!  Shell-архив отсылается во FreeBSD Team с помощью команды send-pr (помните, что email в поле MAINTAINER должен совпадать с email в поле From:, иначе замучают расспросами). О том, как использовать send-pr см. man send-pr. Некоторая информация о том, как отправить порт приведена также в [5].  Дожидаетесь ответа от одного из коммиттеров FreeBSD о том, что порт успешно помещен в дерево портов или же о том, что при тестировании порта возникли ошибки. Все присылаемые в FreeBSD Team порты тестируются ими на предмет правильной сборки, установки и удаления под всеми поддерживаемыми в данный момент ветками FreeBSD. Сообщение об ошибке может выглядеть, например так: Synopsis: [maintainer-update] Updating mail/sccmilter up to 0.94.9 version State-Changed-From-To: open->feedback State-Changed-By: krion State-Changed-When: Fri Feb 18 14:33:28 GMT 2005 State-Changed-Why: It does not honour PREFIX, it’s not very critical since it builds for LOCALBASE, but I’d like to see the PREFIX honoured though. cc -pthread -L/var/tmp/ttt/lib -L.libs -o sccmilter sccmilter.o globals.o utilites.o mlficatch.o parseconfig.o commandline.o -lmilter -lconf /usr/bin/ld: cannot find -lconf http://www.freebsd.org/cgi/query-pr.cgi?pr=77679

В этом сообщении всегда указывается причина ошибки и диагностика. Все общение с FreeBSD Team происходит, естественно, на английском языке, несмотря на то,

38

Synopsis: new port: sysutils/spassgen State-Changed-From-To: open->closed State-Changed-By: pav State-Changed-When: Sat Jul 31 09:26:28 GMT 2004 State-Changed-Why: New port added, thank you! http://www.freebsd.org/cgi/query-pr.cgi?pr=69748

После чего останется только обновить дерево портов и убедиться, что да, на самом деле порт в нем присутствует. С этого момента майнтайнер порта отвечает за его актуальное состояние – своевременное обновление в соответствии с новыми версиями программы, внесение нужных патчей и удаление устаревших. Как скоро ожидать ответа от FreeBSD Team? На этот вопрос трудно дать определенный ответ. Иногда они реагируют буквально в течение недели, а иногда приходится ждать несколько месяцев. Внесения в дерево своего первого порта, kavmilter, я ждал больше года, а например, spassgen прошел за неделю. Кроме того, FreeBSD Team временами самостоятельно вносит некоторые изменения в файлы портов, когда проводится какая-либо глобальная модификация системы в целом. Если вдруг по каким-либо причинам порт перестанет собираться, майнтайнеру будет отправлено соответствующее извещение. Если майнтайнер не устранит ошибку и не пришлет соответствующий патч, исправляющий ситуацию, порт может быть помечен как BROKEN. Как правило, порты, помеченные как BROKEN, удаляются из дерева если они находятся в таком состоянии более 3 месяцев.

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

Ссылки и литература: 1. Осинцев В. Эффективная работа с портами во FreeBSD. – Журнал «Системный администратор», №1, январь 2004 г. – 63-66 с. 2. http://www.ru.freebsd.org/doc/ru_RU.KOI8-R/books/portershandbook/makefile-categories.html. 3. http://www.kde-apps.org/content/show.php?content=34479. 4. Руководство FreeBSD по созданию портов – http://www.ru.freebsd. org/doc/ru_RU.KOI8-R/books/porters-handbook/index.html. 5. http://www.ru.freebsd.org/doc/ru_RU.KOI8-R/books/portershandbook/porting-submitting.html.


администрирование

OpenPKG: кроссплатформенная система пакетов

Андрей Коврин Несмотря на немалую, на мой взгляд, амбициозность проекта OpenPKG, знают о нем отнюдь не многие. А ведь он возник не на пустом месте, и его разработчики, создав систему пакетов с уникальными функциями, взялись за решение актуальной проблемы.

Концепция проекта OpenPKG OpenPKG – это свободная кроссплатформенная (т.е. с претензией на независимость от ОС) система пакетов программного обеспечения, распространяемого под открытыми лицензиями, и набор утилит для работы с ними. Как известно, мир Open Source – это мир альтернативных решений, и данное его свойство породило множественность не только в выборе конкретных программных продуктов для конечного пользователя, но и в принципах разработки, в самых базовых аспектах построения свободных операционных систем вообще. Наглядным отображением этого является разнообразие, наблюдаемое даже в таких «субкультурах» Open Source, как GNU/Linux-дистрибутивы. Ядро ОС у всех одно (хотя и тут не обходится без вариаций на тему – в виде общих и специализированных патчей от сторонних разработчиков), но дальше, что называется, «кто во что горазд». Несомненно, создатели постоянно оглядываются на какие-то привычные и устоявшиеся положения архитектуры, но всякий хочет привнести что-то новое и неповторимо-эксклюзивное в свой мир (неспроста уже давно не только трубят о необходимости стандартизации GNU/Linux-дистрибутивов, но и предпринимают попытки добиться этого путем создания сертификаций вроде Linux Standard Base). Одной из ключевых составляющих каждого дистрибутива является система управления программным обеспечением – без этого затруднительно называть ОС готовой для конечного использования. И здесь отчетливо прослеживаются концептуальные расхождения в подходах. Конечно, не каждый в состоянии разработать с нуля свою систему пакетов, и это положение значительно повлияло на численность подобных систем, однако единого решения нет даже среди GNU/Linux-дистрибутивов. Кто-то использует RPM, кто-то – DEB, некоторые – систему портов, всегда найдутся любители собирать приложения самостоятельно из ис-

40

ходников. И это только в Linux. А теперь добавьте к данному семейству FreeBSD ports, NetBSD Packages Collection, DMG-пакеты Mac OS X...Такое многообразие заставляет задуматься и разработчиков. Несомненно, самый простой способ – ограничиться публикацией обычных архивов с исходниками продукта, а пользователи сами смогут собрать пакеты как для себя, так и для всех обладателей определенной среды. Ничуть не странно, что желающих искать и вручную компилировать каждую программу не так уж много. В то же время скучающих альтруистов, собирающих все новые релизы каких-то пакетов под свою систему и выкладывающих это ко всеобщему удовольствию, тоже зачастую не хватает. Все эти (а также и упущенные в написанном выше) проблемы побудили к рождению проекта OpenPKG, регулярно подготавливающего наборы из унифицированных пакетов с отобранным программным обеспечением для различных систем.

Кроссплатформенность и пакеты Последним релизом OpenPKG (2.5) официально поддерживаются следующие платформы: Linux (Fedora Core 4, Red Hat Enterprise Linux 4, OpenSUSE Linux 10, SUSE Linux 9.3 и 10.0, Gentoo Linux, Mandriva 10.2, Debian GNU/Linux 3.1), FreeBSD (4.11-SOLID, 5.4-STABLE, 6.0-STABLE, 7.0-CURRENT), NetBSD 2.0.2, Solaris (8, 9, 10). Кроме того, известно, что основные функции OpenPKG работают в AIX 5.1 и HP-UX 11.11. Общее число существующих и поддерживаемых на момент последнего релиза пакетов – 579. Конечно, это существенно меньше, чем в Debian-репозитарии или в FreeBSD-портах, но стоит отметить, что OpenPKG – это, во-первых, не просто коллекция всех доступных приложений вообще, а отобранное лучшее и самое нужное, и во-вторых, проект ориентирован на применение на серверных станциях. То есть OpenPKG практически не содержит приложений для на-


администрирование стольных ПК. Тем не менее, представлены и некоторые базовые программы для удобной работы в консоли: оболочки Bash и Zsh, текстовые редакторы Emacs и Vim, веббраузеры Lynx и Links, почтовый клиент Mutt, FTP-клиенты lftp и ncftp, файловый менеджер MC и т. п. Из серверного программного обеспечения можно выделить наличие Apache, BIND, INN, MySQL, OpenLDAP, OpenSSH, OpenSSL, Postfix, PostgreSQL, ProFTPD, PureFTPd, Samba, Sendmail, SpamAssassin, SQLite, Squid. В общем, привычный набор знакомых и распространенных среди серверов пакетов. Не забыто и ПО для разработчиков: GCC, GDB, Subversion, Autoconf, Automake, Make, Perl, PHP, Python, Ruby, Tcl...

Подробности об устройстве OpenPKG Продукция OpenPKG распространяется в виде модифицированных для поддерживаемых платформ RPM-пакетов (спецификации для каждой ОС написаны разработчиками OpenPKG с нуля) двух традиционных типов: binary и source. При этом рекомендуемыми к использованию считаются, естественно, пакеты с исходниками – единые для всех платформ. К бинарным сборкам, существующим в виде отдельных для каждой ОС коллекций, советуют обращаться только в исключительных случаях, когда нет возможности уделить процессу компиляции необходимое для этого время. Связано такое положение вещей хотя бы с тем, что зачастую некоторые функции приложений «вшиваются» в бинарные файлы, в результате чего встроенные опции могут быть изменены только путем пересборки. Выбор формата RPM разработчики объясняют тем, что это единственное из всех рассмотренных ими решений (к слову, исследовать они успели еще и Debian dpkg/apt, FreeBSD ports с pkg_xxx, SVR4 pkgxxx, epkg, Build’n’Play, GNU Stow, Opt-Depot, а также другие утилиты), удовлетворяющее всем основным требованиям и предоставляющее поддержку полного цикла жизни пакета. Помимо пакетов с самим программным обеспечением в дистрибутив релиза OpenPKG входят и средства для создания собственного окружения системы пакетов и удобной работы с ними. Shellскрипт openpkg-<version>-<opkg-release>.src.sh, доступный в директории с исходниками, формирует базовое окружение для OpenPKG, после чего за работу берется специфичный для структуры скрипт openpkg-<version>-<opkgrelease>.<arch>-<platform>-openpkg.sh, устанавливающий менеджер пакетов в систему (для его запуска требуются права root). Для первой установки OpenPKG или ее обновления далее необходимо проинсталлировать пакет openpkg (как отмечают разработчики в своем руководстве, «воспользуйтесь OpenPKG для обновления OpenPKG!»). Далее с помощью удобного консольного менеджера openpkg можно управлять всеми доступными пакетами (устанавливать, удалять, собирать из исходников, просматривать информацию и т.п.).Основные административные операции осуществляются через команду openpkg rpm, принимающую параметры, знакомые любому пользователю RPM-основанных систем. Действие некоторых ключей распространяется только на binary- или только на source-пакеты, а, например, -Uvh для бинарного проводит установку или обновление, а для src – распаковку. Существует и собственный «загрузочный скрипт» (<корень_opkg>/etc/rc), позволяющий за-

№3, март 2006

пускать/останавливать/перезапускать отдельные (или все вообще) пакеты, а также выводящий различные конфигурационные значения (при вызове с --config). В качестве дополнения представлен пакет openpkg-tools – после его инсталляции появляются утилиты, которые, используя при своей работе make, binutils и gcc, позволяют автоматизировать процесс сборки и установки пакетов из исходников с учетом их зависимостей (команда openpkg build).

Подводя итоги OpenPKG – основанная исключительно на Open Source технология, предназначенная для упрощения работы с пакетами на множестве разнородных UNIX/Linux-серверов. Проект предоставляет всю необходимую унифицированную инфраструктуру управления программным обеспечением на различных платформах, облегчая тем самым жизнь системному администратору в инсталляции и обновлении привычных пакетов, общее количество которых превышает 500.С помощью OpenPKG можно как быстро развертывать серверы из бинарных пакетов, так и (почти?) полностью автоматизировать процесс сборки программных компонентов (с учетом необходимых оптимизаций и особенностей платформ). OpenPKG позволяет создавать множество полностью самодостаточных, изолированных сущностей с пакетами в единой системе (причем с возможностью использования одной сущностью пакетов из другой, что сводит на нет необходимость установки одинаковых пакетов в различных сущностях – это своего рода система зависимостей? Нет, это больше похоже на случай, когда на одном сервере множество VPS под Gentoo Linux, а база портежей для всех виртуальных серверов монтируется одна). Инсталлируемое ПО максимально обособлено от системы и независимо, может быть полностью удалено менеджером без потребности в дополнительных манипуляциях. Разработчики OpenPKG беспокоятся и о безопасности поставляемых пакетов, что особенно важно, учитывая серверную специализацию, подразумевающую возможность использования поставляемого ПО на общедоступных (через локальную или глобальную сеть) машинах. На регулярной основе для всех официально поддерживаемых пакетов выпускаются предупреждения об уязвимостях в безопасности (security advisories, SA) и исправляющие эти проблемы обновления в виде UPD-файлов формата SRPM. Поддержка распространяется только на последние версии OpenPKG (на данный момент это 2.4 и 2.5). Для цифровой подписки уведомлений о безопасности и SRPM-пакетов официальных релизов OpenPKG используются GnuPG и OpenPGP. С этого года поддержкой проекта занимается некоммерческая организация OpenPKG Foundation e.V. Финансы и ресурсы ей (на данный момент) предоставляет тройка немецких спонсоров. Следующий релиз OpenPKG – 2.6 – намечен на апрель 2006 года.

Ссылки 1. Сайт OpenPKG – http://www.openpkg.org. 2. OpenPKG FAQ – http://www.openpkg.org/faq.html. 3. OpenPKG Quick Reference – http://www.openpkg.org/doc/ quickref/openpkg.txt. 4. OpenPKG 2.5 на FTP – ftp://ftp.openpkg.org/release/2.5.

41


администрирование

MikroTik – Router OS

Сергей Яремчук Типичными задачами, стоящими перед системным администратором, являются организация совместного доступа в Интернет и учет трафика. Несмотря на простоту определения, при более детальном подходе они распадаются на сотни подзадач, полноценно справиться с которыми под силу далеко не каждому.

С

егодня разработано достаточно инструментов, позволяющих упростить решение этой задачи как полностью, так и отдельных ее участков. Среди программных решений это различные утилиты для анализа журналов и вывода результатов, графические интерфейсы к программам настройки сети, сервисов и межсетевого экрана, VPN, системы защиты и прочее. Особой популярностью у администраторов пользуются специ-

42

ализированные дистрибутивы, постро- дет речь, не похож ни на один из тех, енные на базе GNU/Linux или различ- с которыми мне приходилось ранее ных BSD-систем [2, 3, 4], которые поз- иметь дело автору. воляют превратить старый системный блок в надежный маршрутизатор. Во- Возможности MikroTik обще все дистрибутивы чем-то похо- Честно говоря, если бы MikroTik не был жи, тот же Linux только маленький, от- предложен моим интернет-провайделичаются составом приложений, воз- ром для организации доступа к нашей можностью обновления, наличием спе- районной сети, то, вероятно, я еще долцифических утилит для упрощения их го бы не знал об его существовании, настройки. Латышский дистрибутив т.к. на всех профильных интернет-проGNU/Linux MikroTik [1], о котором пой- ектах информация о MikroTik отсутс-


администрирование твует. Теперь же после полугода эксплуатации можно от- пользовать MikroTik в течение неограниченного времени. метить стабильную работу сервера. За этот период ни ра- В настоящий момент имеется 6 уровней лицензии. Урозу не понадобилось перезагружать сервер. Для организа- вень 0 означает работу без лицензии. Лицензия уровня 1 ции доступа в Интернет сети из сотни пользователей ис- или SOHO предоставляется бесплатно и имеет ограничепользовался старый системный блок с установленным Пен- ние по количеству максимальных соединений PPTP, PPPoE, тиумом 233 с 128 Мб оперативной памяти и жестким дис- Queues, NAT, EoIP и DHCP, в этом случае также отключеком на 2 Гб. Максимальная загрузка процессора составля- на поддержка беспроводных устройств, веб-кеша и Radiusла всего 25%, используемая память не превысила значе- клиента, нет технической поддержки и невозможно обновния 40 Мб, а жесткий диск заполнен на 50 Мб. Раз уже за- ление дистрибутива. Стоит особо отметить, что лицензия шла речь о системных требованиях, то в официальных ру- привязана к Software ID, его значение администратор полуководствах они еще ниже, чем указанные: частота процес- чит во время установки системы. При этом Software ID (и сосора от 100 МГц, ОЗУ 32 Мб (рекомендуется от 64 Мб), жес- ответственно и ключ лицензии) изменится только при усткий диск от 64 Мб. тановке дистрибутива на другой жесткий диск, при замеКроме того, на сайте проекта можно купить предуста- не остального оборудования маршрутизатора или добавновленную на IDE Flash-модуль дистрибутива который мо- лении нового оборудования новый ключ получать не прижет использоваться вместо жесткого диска. Кроме сис- дется. Стоимость других уровней лицензирования колебтемных требований, удивили и поистине богатые возмож- лется от 45 до 250 у.е. ности вкупе с легкостью настройки и администрирования. Приведу лишь небольшую часть из возможностей дист- Установка рибутива: На момент написания статьи актуальной была версия 2.9.14,  Межсетевой экран и NAT – полноценная фильтрация о которой и пойдет речь далее, хотя со времени версии 2.8 пакетов, source и destination NAT, классификация паке- процесс установки не изменился, увеличилось только котов по МАС, IP-портам, опциям протоколов, интерфей- личество доступных пакетов. Установить систему можно сам, внутренним маркированным пакетам, содержимо- тремя способами: му, P2P-фильтрация. Поддержка мостов между интер-  при помощи загрузочного CD; фейсами с фильтрацией пакетов.  с дискет (DiskMaker);  Маршрутизация – статическая, multi-path, на основе по-  через сеть (загрузившись при помощи флоппи лилитик (совместно с межсетевым экраном), динамичесбо сетевой карты с поддержкой загрузки по сети PXE или EtherBoot). кая маршрутизации: RIP v1/v2, OSPF v2, BGP v4;  Управление качеством облуживания – маркировка по Кроме того, на сайте доступен архив, который при помоIP, сети и подсети, порту; управление полосой пропускания, задание скорости и прочее. щи программы PhysDiskWrite для Windows либо dd в UNIX не Полноценный HotSpot – создание plug&play точек кол- обходимо перенести на CompactFlash. Первый вариант явлективного пользования Интернет с аутентификацией ляется самым простым и распространенным (кроме покупна RADIUS-сервере, с контролем работы в реальном ки предустановленного), его и будем рассматривать. Скавремени, заданием скорости, объема, времени работы чиваем с сайта архив, содержащий ISO-образ, распаковыклиента, создание walled-garden защищенных зон. ваем, записываем, выставляем загрузку с CD-ROM в BIOS  Поддержка различных Point-to-Point-протоколов – и загружаемся. Никаких опций во время загрузки не предусPPTP, PPPoE и L2TP с поддержкой RADIUS, PAP, CHAP, мотрено, на первом экране пользователю предлагается выMSCHAPv1 и v2 протоколов аутентификации; MPPE брать приложения. Здесь все просто: перемещаемся при пошифрования; компрессии и дозвона по требованию для мощи стрелок (или клавиш <p> и <n>), наводим на нужное PPPoE. приложение и выбираем его при помощи пробела. При наведении на пункт внизу экрана выдается краткое поясне Туннели – IPIP, EoIP (Ethernet over IP). ние, и в скобках указываются зависимости, system являА еще поддержка IPSec, FTP и HTTP/HTTPS кэширую- ется обязательным к установке. Нажатие на <а> приведет щий прокси-сервер, DHCP-сервер и клиенты, клиент и сер- к выбору всех пунктов, <m> – установит только минимальвер Network Time Protocol, Bonding, журналирование работы ный набор. После выбора нажимаем на <i> (install), и промежсетевого экрана, действий пользователя и поведения исходит собственно установка. Жесткий диск будет размесистемы, генерация простых отчетов. Предусмотрена воз- чен автоматически, все данные будут уничтожены, хотя вам можность настройки GPRS-соединения. Но самое интерес- будет предложено сохранить предыдущую конфигурацию MikroTik. Что очень полезно, так как SOHO-лицензия не подное, что размер дистрибутива чуть больше 14 Мб. держивает обновлений, а так есть возможность сохранить все настройки при полном обновлении системы. Обратите Лицензия MikroTik не является полностью свободным продуктом, внимание, что все версии MikroTik до 2.8 не поддерживают и за все его возможности придется заплатить. Без ли- более одного жесткого диска. В новых версиях второй диск цензии установленный сервер проработает ровно 24 часа используется только для кэширования веб-страниц. После (при выключении отсчет времени останавливается). По ис- распаковки приложений вы получите сообщение о необхотечении этого срока либо потребуется ввести ключ, либо димости нажать Enter для перезагрузки. Вот, собственно, переустановить систему. Полученный ключ позволяет ис- и все. После установки CD-ROM можно отключить.

№3, март 2006

43


администрирование лит вроде ifconfig, netstat, ping, можно обнаружить, что присутствует только последняя из них. Все пункты меню можно узнать, нажав два раза табуляцию. [admin@MikroTik] > certificate import log ppp redo special-login undo driver interface password queue routing system user export ip ping quit setup test-bridge file isdn-channels port radius snmp tool

Набираем в строке приглашения нужный пункт. Например, для установки IP-адреса интерфейса набираем ip. [admin@MikroTik] > ip [admin@MikroTik] ip>

Рисунок 1. Веб-страница настроенного маршрутизатора MikroTik

Табуляция подсказывает следующие уровни либо команды. [admin@MikroTik] ip> address [admin@MikroTik] ip address > add address: 192.168.0.1/24 interface: ether1

Обратите внимание, что адрес вводится вместе с сетевой маской. Так как на маршрутизаторе стоит несколько сетевых карт, то подобрать интерфейс можно экспериментальным путем, или лучше зайти в меню driver и, набрав print, просмотреть их порядок. Команды можно набирать полностью, не переходя в подменю. Например, то же самое, только одной командой, будет выглядеть так:

Рисунок 2. На веб-странице можно просмотреть графики загрузки системы и канала

Теперь доступ к серверу можно получить различными способами: локальная консоль, терминал, подключенный к COM-порту (9600 бит/с, 8 бит данные, 1 стоповый, аппаратное управление потоком RTS/CTS), telnet, SSH, MikroTik MAC Telnet, веб-интерфейс Webbox и графическая утилита Winbox. Первоначальные настройки осуществляются исключительно при помощи локальной консоли. Для регистрации используем логин: admin с пустым паролем. После чего будет выведено следующее сообщение, в последней строке которого вам будет показан необходимый для регистрации software ID, в моем случае это 4NHQ-GWN. Теперь заходим на сайт проекта и в правом верхнем углу, подписанном как «Account Server», выбираем «New», заполняем данные и ждем подтверждения регистрации по электронной почте. После чего регистрируемся в системе, вводим Software ID, и на ваш электронный адрес придет лицензионный ключ. В данном случае использовалась бесплатная SOHO-лицензия, при необходимости затем всегда можно поднять уровень лицензирования. Строка приглашения показывает имя маршрутизатора и уровень меню: [admin@MikroTik] >

Попробовав работу ряда привычных юниксовских ути-

44

[admin@MikroTik] > /ip address ↵ add address 192.168.0.1/24 interface ether1 [admin@MikroTik] > /ip address ↵ add address 192.168.1.100/24 interface ether2

Чтобы вернуться на уровень вверх, необходимо набрать две точки. Для удобства сетевым интерфейсам можно дать более удобные имена: [admin@MikroTik] interface> set ether1 name=Local; ↵ set ether2 name=Public

Теперь ether1 будет называться Local, а ether2 – Public. И не забываем добавить шлюз: [admin@MikroTik] ip route> add gateway=192.168.1.100/24

Да, чтобы выключить или перезагрузить компьютер, необходимо перейти в меню system и набрать shutdown или reboot. С командами разобраться легко, но понадобятся они только при удаленном управлении при помощи ssh или telnet. Для первоначальной настройки лучше воспользоваться скриптом setup и настроить только внутренний интерфейс, остальную настройку производить удаленно при помощи более наглядных утилит Webbox и Winbox. И не забываем сменить пароль администратора. [admin@MikroTik] > password old password: new password: ************ retype new password: ************


администрирование Утилиты конфигурирования Webbox и Winbox Для вызова утилиты Webbox достаточно набрать в веб-браузере IP-адрес маршрутизатора (рис. 1), здесь же можно просмотреть графики загрузки (рис. 2). Зарегистрировавшись вверху окна, можно получить доступ к некоторым настройкам системы (рис. 3), информации о работе маршрутизатора, вывести простые отчеты. С первой страницы можно скачать утилиту Winbox, которая предоставляет большие возможности по конфигурированию системы (рис. 4). В отличие от Webbox Winbox может работать по защищенному каналу, для чего при установке нужно выбрать пакет security. Режим можно определить по тому, с каким портом происходит работа. В случае незащищенной работы используется 8290 TCP-порт и 8291 – в случае шифрованного соединения. Все настройки удобно собраны по отдельным пунктам меню и понятны, дополнительные опции свернуты и не мешают. При каждом соединении с Winbox вам будут напоминать о необходимости введения лицензионного ключа и оставшемся времени, поэтому лучше сделать это сразу. Для настройки второго интерфейса заходим в «IP → Addresses» и вводим его IP-адрес. В моем случае необходимо было настроить PPPoE-подключение к провайдеру услуг Интернет. Для этого заходим в пункт PPP во вкладке Interfaces, нажимаем на «+», выбираем «PPPoE Client», далее заполняем все необходимые поля и нажимаем кнопку «OK». Если всё введено правильно, подключение заработает, что можно тут же проверить, кликнув на имени и перейдя затем на вкладку «Traffic». Хотя, набив руку, можно ввести это все и через ssh. Например: [admin@MikroTik] > /interface pppoe-client ↵ add name=pppoe-user-grinder user=grinder ↵ password=1234567 interface=Public ↵ service-name=internet disabled=no dial-on-demand=yes

Рисунок 3. Утилита веб-администрирования Webbox

Рисунок 4. Утилита администрирования Winbox

го, комплект сетевых утилит входящих в комплект MikroTik, можно запускать как при помощи Winbox, либо ssh.

И опять же напоминаю, что при наборе практически всех параметров пользуйтесь табуляцией, это ускоряет и упро- Выводы Тщательность проработки, продуманность настроек MikroTik щает набор. Межсетевой экран свежеустановленого MikroTik марш- вызывает только положительные эмоции. Несмотря на нерутизатора не содержит встроенных правил, поэтому если которую непривычность вначале, очень быстро осваивапросканировать его nmap, то можно обнаружить, что из вне- ешься и далее работаешь без затруднений. А хорошая дошней сети можно получить доступ ко многим лишним сер- кументация, форум проекта и набор утилит только помовисам. Поэтому следующим обязательным шагом необхо- гают в этом. В принципе один такой маршрутизатор вполдимо настроить фильтрацию пакетов, в первую очередь за- не способен решить все стандартные задачи по представлению доступа для небольшой и средней сети и их защипретив доступ к ftp, telnet и www. Для настройки правил межсетевого экрана переходим те. Если версии SOHO будет недостаточно, то можно лив «IP → Firewall» и во вкладке «Filter Rules» прописываем бо приобрести лицензию, либо попробовать разбить сеть правила, запрещающие подключение к портам 21, 23, 80, на более мелкие фрагменты. 137-139 и 445 с внешних адресов, и во вкладке NAT разреСсылки: шаем маскарадинг для внутренних клиентов. Кроме дистрибутива MikroTik на сайте проекта можно 1. Сайт проекта – http://www.mikrotik.com. найти и еще ряд дополнительных утилит, которые будут по- 2. Яремчук С. Роутер без диска. – Журнал «Системный администратор», №9, 2004 г. – 8-9 с. лезны в работе. Например, MikroTik Bandwidth Test позволяет оценить пропускную способность канала, Traffic Counter – 3. Яремчук С. Маленький линукс в качестве firewall. – Журнал «Системный администратор», №9, 2003 г. – 24-32 с. подсчитывать трафик, MT Syslog Daemon – демон syslog для Windows-систем, Log Downloader – сохранение жур- 4. Яремчук С. Сетевой полицейский. – Журнал «Системный администратор», №1, 2005 г. – 42-45 с. налов на другом компьютере, Dude – утилита мониторинга и построения карт сетей и некоторые другие. Кроме то- 5. Утилита PhysDiskWrite – http://www.m0n0.ch/wall.

№3, март 2006

45


администрирование

Шлюз аутентификации пользователей NuFW

Фильтрация IP-пакетов является простым, эффективным и поэтому основным средством защиты сетей. Но в то же время такому подходу явно не хватает детализации, а удаленность от прикладного уровня требует согласования с другими инструментальными средствами безопасности.

46


администрирование

Ч

Сергей Яремчук №3, март 2006

тобы удовлетворять всем требованиям безопасности, сегодняшние системы должны работать на уровне пользователей. Но классическая схема основывается на предположении: один пользователь → один компьютер → один IP-адрес. То есть системный администратор для решения проблемы управления пользователями фактически должен работать на IP-уровне. В простейшем случае это решается статическим закреплением IP-адреса, что может быть эффективно только в небольших сетях. В то же время сегодня довольно обычна ситуация, когда несколько пользователей используют одну и ту же многопользовательскую систему, и в таком случае установленные правила будут действовать для всех работающих в одной системе одинаково. Один из вариантов решения проблемы описан в [8]. Проект NuFW (Now User Filtering Works) предлагает несколько иной подход к решению – «authenticating gateway». NuFW позволяет проводить аутентификацию пользователя для каждого соединения, пытающегося получить доступ к межсетевому экрану и некоторым другим сервисам сети. Фактически после аутентификации всегда можно однозначно сказать, что в данный момент времени 192.168.0.2 = Вася Пупкин. Такой подход позволяет не только ограничивать доступ, тонко реализуя политику безопасности, но и регистрировать деятельность, выполнять подсчет трафика, выставлять различное значение QoS (Quality of Service), осуществлять маршрутизацию, динамически изменять списки контроля доступа, опираясь на данные пользователя, а не на IP. Также правила фильтрования могут в этом случае использовать и данные о приложениях, операционной системе, используемых клиентом (рис. 1). Хотелось бы отметить, что проект относительно молодой. Сама идея возникла в 2001 году при попытке добавить поддержку LDAP к прокси, обеспечивающему безопасный доступ к telnet/ftp-сервисам. Исходный проект имел название Net Security Master (сейчас GateKeeper). Рабочая альфаверсия NuFW была представлена общественности в июле 2003 г., а первый

релиз через два года – в марте 2005 г. Поэтому проекту могут быть присущи болезни молодости, и иногда возникают проблемы с безопасностью, например сообщение о возможности DOS-атаки [4].

Принцип работы В основе работы NuFW лежит взаимодействие с Netfilter – механизмом фильтрации сетевых пакетов, появившимся в ядре Linux в версии 2.4. Поэтому в настоящее время такой шлюз аутентификации может работать только на Linux, хотя разработчики планируют разработку NuFW и для других операционных систем, в первую очередь BSD. Для обеспечения услуг доступа используются два демона, которые могут быть запущены на разных компьютерах. Сервер аутентификации – nuauth и работающий на шлюзе – nufw. Последний обеспечивает связь с Netfilter через цель «-j QUEUE», и таким образом осуществляется фильтрация трафика (рис. 2). Стоит отметить, что в ядре 2.6.14 появилась новая, более мощная опция NFQUEUE, что позволяет совместно с NuFW использовать, например, и IDS Snort в режиме inline (системы остановки атак). На остальных компьютерах должны быть установлены клиентские программы, при помощи которых будет осуществляться аутентификация. Такие программы доступны для Linux, FreeBSD, MacOS X и Windows. Когда клиент пытается отправить пакет через межсетевой экран или шлюз, демон nufw связывается с демоном nuauth, который подтверждает либо отрицает полномочия пользователя. При этом фактически внимание уделяется первой фазе установления соединения, т.е. SYN-пакетам. Начиная с версии 1.1.0 обмен между клиентами и nuauth ведется в UTF-8 (��сли при конфигурировании использовалась опция «--with-utf8»). Система аутентификации пользователя выполнена в виде модуля. Демон nuauth для аутентификации пользователей и групп может использовать сервер LDAP, PAM/NSS, базу в формате DBM, обычный текстовый файл или список системных пользователей. NuFW различает протоколы, поэтому можно установить, какие из групп бу-

47


администрирование

Рисунок 1. NuFW позволяет делать фильтрацию по IP-адресам, пользователям, приложениям и операционной системе

дут иметь доступ к только электронной почте, а какие могут пользоваться http, ftp и другими сервисами. Единственное ограничение NuFW заключается в том, что пока фильтруется только TCP, но в будущем планируется работа с UDP и ICMP. Если пользователь принадлежит к группам с противоречивыми настройками, nuauth может быть настроен на разный вариант разрешения ситуации. Для регистрации действий пользователей применяется syslog, или базы данных MySQL и PostgreSQL. В случае использования базы данных такая система способна сохранить более подробную информацию.

Все соединения по умолчанию за- gcrypt, gnutls, cyrus-sasl, gdbm, libident, крываются при помощи SSL, что реша- libpam. Дистрибутив NuFW на сайте проекет проблему спуфинга адресов и раскрытия пароля. Хотя в более ранних та доступен только в исходных текстах, версиях протокола на участке клиент – хотя в архивах [6] и им подобных можnuauth использовалась только откры- но найти пакеты для Debian и некототая передача данных (на рис. 2 пока- рых rpm-дистрибутивов (для ALTLinux зано оранжевым цветом). Кроме па- в Сизифе пакетов на момент написароля для доступа пользователи могут ния статьи не было). Если планируиспользовать и TLS (Transport Layer ется контроль над полосой пропускаSecurity) сертификаты. ния и QoS, необходима перекомпиляНо это еще не все. В настоящее вре- ция ядра с патчами ip_queue_vwmark мя разработаны модули для веб-сер- и CONNMARK, которые входят в комвера Apache и Squid, позволяющие им плект patch-o-matic [7]. работать совместно с системой NuFW. # KERNEL_DIR=/usr/src/linux ↵ Пользователь в этом случае будет ауIPTABLES_DIR=/home/sergej ↵ тентифицирован только один раз. Та/src/iptables ./runme ↵ ip_queue_vwmark кой метод прозрачной аутентификации # KERNEL_DIR=/usr/src/linux ↵ назван SSO (Single Sign On). Работает IPTABLES_DIR=/home/sergej ↵ /src/iptables./runme CONNMARK система следующим образом: пользователь получает доступ к межсетевоПосле чего нужно пересобрать ядму экрану обычным образом и попадает на сервер. Модуль SSO, работаю- ро, модули и утилиты iptables. На момент написания статьи посщий на сервере, зная параметры связи, запрашивает в базе данных соот- ледней версией пакета NuFW была ветствующий вход для каждой связи. 1.0.20. Кроме того, доступен нестаЕсли пользователь аутентифицирован, бильный релиз 1.1.3, в котором клито доступ к сервису разрешается. ентская утилита nutcpc начала рабоNuFW – полностью открытый про- тать в среде ОС FreeBSD и Mac OS X. ект, все компоненты, за исключением При конфигурировании доступен ряд клиента под Windows, распространяют- опций. Вот некоторые из них: ся под лицензией GNU GPL v2, прото-  --with-user-mark – поддержка маркол полностью документирован [5]. кировки пользователя в NuFW;  --with-mysql-log, --with-pgsql-log – регистрация поддержки пользоваУстановка NuFW теля в соответствующей базе данДля установки NuFW вам потребуются последние версии: glib2.0, gpg-error, ных;  --with-system-auth, --with-ldap, --with-gdbm, --with-ident – поддержка соответствующих методов аутентификации пользователей (для текстового режима опций указывать не надо). Выбираем необходимые опции и конфигурируем. $ ./configure --with-ldap ↵ --with-system-auth ↵ --with-mysql-log ↵ --sysconfdir=/etc/nufw/ ↵ --prefix=/usr --with-debug

Дальше обычная компиляция. $ make # make install

Рисунок 2. Принцип работы NuFW

48

К сожалению, во время установки не создаются необходимые каталоги и не копируются файлы, поэтому вам придется сделать это самим.


администрирование # mkdir /etc/nufw/

Настраиваем nuauth Теперь конфигурационный файл для демона nuauth – /etc/nufw/nuauth.conf. Приведу только основные параметры. Копируем его на место и конфигурируем. # cp conf/nuauth.conf /etc/nufw/ # vi /etc/nufw/nuauth.conf # Файл /etc/nufw/nuauth.conf # Адрес, на котором демон nuauth будет принимать # клиентов, в нашем случае со всех доступных адресов nuauth_client_listen_addr="0.0.0.0" # IP-адрес, на котором nuauth слушает пакеты nufw nuauth_nufw_listen_addr="127.0.0.1" # Порт для запросов nufw nuauth_gw_packet_port=4129 # Порт для пакетов аутентификации пользователей nuauth_user_packet_port=4130 # Адрес и порт nufw маршрутизатора, на котором он будет # ожидать ответ в незащищенном UDP, – это локальный адрес. # В TLS-режиме это может быть список адресов # nufw_gw_addr="192.168.75.1 192.168.75.254" nufw_gw_addr="127.0.0.1" nufw_gw_port=4128 # Что делать в том случае, когда пользователь является # членом групп с противоречивыми установками # (0 - нет, 1 - разрешить) nuauth_prio_to_nok=1 # Аутентификация может работать в двух режимах. # POLL: клиент отправляет пакет в каждом случае, когда # требуется аутентификация в этом режиме, трафик меньше, # поэтому он может использоваться для удаленных # либо сильно загруженных сетей # PUSH: демон nuauth посылает предупреждение клиенту # о необходимости аутентификации (лучшее время отклика) nuauth_push_to_client=1 # Ограничения регистрации пользователей # 0 : без ограничений (по умолчанию) # 1 : один вход для пользователя # 2 : один вход для IP # nuauth_connect_policy=1 # Для клиентов, не поддерживающих протокол NuFW, или если # его применение затруднено, например, использованием NAT # или межсетевых экранов, разделяющих сети, применяется # аварийная (hello) аутентификация, базирующаяся только # на IP и поддерживающая только одного пользователя. # Такой способ работает для всех типов потоков IP nuauth_hello_authentication=0 nuauth_do_ip_authentication=0 # Модуль аутентификации пользователей # (libldap, dbm, plaintext, system) nuauth_user_check_module=»libdbm» # Модуль списков контроля доступом (libldap, libplaintext) nuauth_acl_check_module=»libplaintext» nuauth_acl_cache=1 # Модуль IP-аутентификации (libipauthident, rpc) nuauth_ip_authentication_module="libipauthident" # Ниже перечислены файлы для хранения сертификатов и ключей # секретный ключ сервера (по умолчанию CONFIGDIR/nuauth.pem) nuauth_tls_key="/etc/nufw/nuauth.pem" # Сертификаты сервера nuauth_tls_cert="/etc/nufw/nuauth-cert.pem" nuauth_tls_cacert="/etc/nufw/NuFW-cacert.pem" # Использование клиентом сертификата вместо пароля nuauth_tls_request_cert=0 # Регистрация событий: «mysql», «pgsql», «syslog» nuauth_user_logs_module="syslog" # Регистрация деятельности пользователей: syslog, mysql, # script. В последнем случае при подключении пользователей # будет запущен скрипт, лежащий в CONFDIR/user-up.sh # и при разъединении CONFDIR/user-down.sh nuauth_user_session_logs_module="syslog mysql" # Списки пользователей и ACL при использовании # для аутентификации текстовых файлов plaintext_userfile="/etc/nufw/users.nufw" plaintext_aclfile="/etc/nufw/acls.nufw" # Преобразование имени пользователя в верхний регистр # system_convert_username_to_uppercase=0

Также в файле можно указать время, через которое будет производиться повторная аутентификация пользовате-

№3, март 2006

ля, время ожидания подтверждения от клиента и количество повторных запросов в случае неудачи. А также время хранения списков доступа в кэше, максимальное количество клиентов и серверов nufw, параметры доступа к серверам LDAP, MySQL и PostgreSQL и уровень регистрации событий, и другие параметры.

Последние настройки и запуск В составе дистрибутива в подкаталоге certs имеются готовые сертификаты, предназначенные для тестирования, там же лежат и сертификаты разработчиков. Копируем их в /etc/nufw/. Для nufw: # cp conf/certs/nufw-* /etc/nufw/

И для nuauth: #cp conf/cert/nuauth*.pem /etc/nufw/ #cp conf/cert/NuFW*.pem /etc/nufw/

В рабочей системе создадим свои сертификаты. # openssl req –new –x509 –nodes –days 365 –out ↵ /etc/nufw/nuauth-cert.pem –keyout /etc/nufw/nuauth.pem # openssl req –new –x509 –nodes –days 365 –out ↵ /etc/nufw/nufw-cert.pem –keyout /etc/nufw/nufw-key.pem

Файл users.nufw содержит списки пользователей. Записи в нем состоят из строк вида: Username: passwd:uid:gid[,gid,gid]

Обратите внимание, в файл заносится пароль в чистом виде, а не хэш. Это не совсем хорошо с точки зрения безопасности, но при установке соответствующих прав в данном случае в принципе приемлемо. Например: sergej:passwd1:1:102 admin:admin_passwd:2:100,102,103

Для отключения пользователя достаточно добавить какой-либо знак к паролю (обычно «*» или «!»). Списки контроля доступа в этом случае хранятся в файле acls.nufw, в котором вы найдете их подробное описание. Например, для доступа к ssh для пользователей Linux, входящих в группы 100 и 102 с любого адреса, пишем такое правило. [ssh] decision=1 gid=100, 102 proto=6 SrcIP=0.0.0.0/0 SrcPort=1024-65535 DstIP=0.0.0.0/0 DstPort=22 App=/usr/bin/ssh OS=Linux

Для доступа к сервисам без ограничений группе 100. [full] decision=1 gid=100 proto=6 SrcIP=0.0.0.0/0 SrcPort=1024-65535 DstIP=0.0.0.0/0

49


администрирование Большая часть параметров очевидна, «proto=6» озна- казано, поэтому указывайте только внешний интерфейс. чает TCP, «decision» позволяет указать варианты правил, $nutcpc –S –U 102 –H 192.168.0.1 если правила пересекаются. В качестве параметров IP могут быть указаны как отдельные адреса сети, так и список, разделенный запятой. В правила можно добавить разреВводим имя пользователя и пароль. В случае неудашенные время и день работы. чи вам будут выведены сообщения, достаточные для лоДля формирования файла DBM используется утилита кализации проблемы. Сообщения также можно будет проnufw_dbm, но в случае большого числа пользователей все же смотреть в /var/log/messages. Для работы в среде Windows удобней применять LDAP, для которого правила формируются имеется графический клиент NuWINс, который доступен при помощи скрипта nuaclgen. При этом информация о соеди- в двух вариантах: один для работы в домене, работающий прозрачно для пользователя и запускающийся в качестве нении LDAP должна быть записана в файл nuaclgen.conf. сервиса, второй – в классическом варианте. Демонс��рациПравило для ssh в этом случае задается так. онную версию последнего, разрешающую только 30 минут #nuaclgen.pl –A cn=ssh,ou=Acls,dc=inl,dc=fr –p 6 ↵ сессии, можно скачать с сайта [3]. На том же сайте досту–dport 22 –AppName "/usr/bin/ssh" –j ACCEPT –g 100 пен графический клиент для Linux-систем nuapplet, предКроме того, на сайте [3] можно найти Nuface, представ- ставляющий собой апплет для Gnome 2.x. ляющий веб-интерфейс для создания правил для Netfilter, в том числе и без поддержки NuFW при помощи скрипта Работа с базами данных nupyf.py, который можно запускать и вручную. Демонстра- Превым делом необходимо создать пользователя, обладаюционная версия Nuface доступна по адресу [9]. щего привилегиями UPDATE, INSERT к conntrack_ulog, и заДалее проверяем загрузку модуля ядра. нести эти параметры в файл nuauth.conf. Для создания самих таблиц используйте готовые сценарии nulog.mysql.dump # /sbin/lsmod | grep ip_queue и nulog.pgsql.dump, которые вы найдете в подкаталоге conf дистрибутива. Кроме того, в подкаталоге script лежит скрипт ip_queue 10520 0 clean_conntrack.pl, при помощи которого таблицы очищаются При необходимости загружаем его при помощи команды: от «мертвых» соединений. Его необходимо периодически запускать при помощи cron, иначе таблица быстро будет пере# /sbin/modprobe ip_queue полняться и задерживать ответ клиентам. Время нужно подбирать индивидуально для каждой сети (обычно 5-10 минут Добавляем правило в iptables (в документации и на сай- достаточно). Для работы этого скрипта необходимо создать пользователя, обладающего привилегиями SELECT и DELETE те [2] приведено большое количество конфигураций). для таблицы «conntrack_ulog» и INSERT для «ulog». И внести # /sbin/iptables –A OUTPUT –s 192.168.0.0/24 –p tcp ↵ эти данные во внутрь скрипта (по умолчанию используется –dport 22 –m state –state NEW –syn –j QUEUE root, что излишне). Кроме того, в этом же подкаталоге лежат # /sbin/iptables –A OUTPUT –m state –state ↵ ESTABLISHED,RELATED –j ACCEPT два скрипта – ulog_rotate_daily.sh и ulog_rotate_weekly.sh, при помощи которых можно очищать базы журналов от переполнения. Для детального просмотра результатов удобно испольЗапускаем nuauth: зовать веб-приложение nulog, демонстрационная версия кото# /usr/sbin/nuauth –vvvvvvvvv рого доступна по адресу [10]. Кроме того, в настоящее время ведется работа над приложением корреляции и выдачи пре** Message: debug_level is 9 дупреждений Nualert и генератором отчетов Nureport. ** ** ** ** ** ** ** ** ** ** ** **

Message: Message: Message: Message: Message: Message: Message: Message: Message: Message: Message: Message:

Starting nuauth Auth (user) module: plaintext ACL module: libplaintext User logs module: syslog creating acl cache thread Creating search_and_fill thread Creating 3 acl checkers Creating 3 user checkers Creating 2 user loggers Creating tls authentication server thread Creating tls nufw server thread Threads system started

И nufw: #/usr/sbin/nufw –D –vvvv –d 127.0.0.1 –p 4129

Ссылки: 1. 2. 3. 4. 5.

6. 7. 8.

В комплект дистрибутива входят консольный клиент, работающий под управлением Linux, FreeBSD и Mac OS X. Параметр -S, необходимый для SSL-соединения, при тести- 9. ровании можно пока не применять. Если в качестве адреса 10. назначения использовать localhost, в соединении будет от-

50

Официальный сайт проекта – http://www.nufw.org. Сайт поддержки NuFW – http://regit.free.fr/nufw. Сайт INL develops – http://www.inl.fr. http://www.security.nnov.ru/Kdocument456.html. Протокол и алгоритм работы – EFICAAS (Extending Firewalling Infrastructure Capabilities and Aggregating Authentication Systems) – http://www.nufw.org/eficaas. Архивы программного обеспечения – http://packages.debian. org/unstable/source/nufw; http://rpm.pbone.net. Сайт проекта Netfilter – ftp://ftp.netfilter.org/pub/patch-o-matic. Ачилов Р. Настройка Squid для использования авторизации из домена Windows 2000. – Журнал «Системный администратор», №10, 2004 г. – 30-35 с. Демонстрационная версия Nuface – https://nuface.inl.fr. Демонстрационная версия nulog – http://www.inl.fr/download/ ulog-demo.


безопасность

Zserver Suite: защищаем корпоративные хранилища данных Наиболее распространенный способ хищения конфиденциальной информации – кража носителей и архивных копий и доступ посторонних лиц к серверу. Как обеспечить защиту данных, хранимых и обрабатываемых на корпоративных серверах?

Алексей Шелестов

У

течка даже части конфиденци- гает возможность физического доступа посредством шифрования. Мы расальной информации может нанес- к носителям информации. Это означает, скажем вам о возможностях компти непоправимый вред компании, что традиционные средства разграниче- лекса Zserver Suite компании SecurIT начиная от потери большей части кли- ния доступа, которыми могут быть ос- (http://www.securit.ru). В состав компентов до остановки бизнеса. Мы зачас- нащены информационные системы, не лекса входят программные продукты тую отдаем сервер или жесткий диск решают проблемы, поскольку физичес- Zserver и Zbackup, которые помогут на ремонт или замену, выбрасываем кий доступ к носителям означает обход минимизировать риски утечки констарые архивные ленты, в лучшем слу- всех таких средств защиты. Действи- фиденциальных сведений. Zserver позволит вам эффективно: чае тщательно стараясь удалить не- тельно, как может помочь корпоративкогда хранимую на нем конфиденци- ный firewall в случае, если злоумышлен-  защищать разделы жестких дисков альную информацию низкоуровневым ник каким-либо образом получил в свое от несанкционированного доступа; форматированием, либо специализи- распоряжение жесткий диск с сервера  оперативно блокировать и уничторованными утилитами, что не всегда или архивную магнитную ленту? жать информацию с любого ПЭВМ, Не стоит и недооценивать вероятбывает успешно. имеющего соединение с сервером, Некогда популярные уничтожите- ность наступления такого случая. Тольрадиоустройства, либо телефона; ли конфиденциальной информации ко за 2005 – начало 2006 года произош-  скрывать сам факт наличия конфина жестких дисках посредством элек- ло несколько десятков крупных инциденциальной информации на сертромагнитного импульса уходят в про- дентов, связанных с пропажей носитевере; шлое, поскольку ценность хранимой лей конфиденциальной информации  безопасно транспортировать ининформации стремительно растет, с участием таких всемирно известных формацию на любых носителях; разница между актуальными данны- компаний как Citigroup, Ernst & Young,  контролировать и разграничивать ми и архивной копией зачастую кри- Bank of America и т. д. доступ к защищаемой информации. Для того чтобы защитить инфортична для бизнеса. Кроме этого, в последнее время все мацию на носителе, к которому возмо- Общее описание большую популярность завоевывает жен физический доступ посторонних программно-аппаратного аутсорсинг различных информацион- лиц, необходимо использовать крип- комплекса ных служб, и нередко возникает ситуа- тографические средства. Только ког- Программно-аппаратный комплекс ция, когда сервер с конфиденциальной да информация на носителе зашиф- Zserver – средство защиты конфиденинформацией размещается в сторон- рована, а ключ шифрования хранит- циальной информации от несанкционинем дата-центре, а архивные ленты хра- ся в недоступном месте, можно не бес- рованного доступа посредством шифнятся в депозитарии за пределами кон- покоиться, если сам носитель окажет- рования разделов диска «на лету». Предназначен для защиты инфортролируемой территории предприятия. ся в руках злоумышленника. Сегодня В этих случаях количество посто- речь пойдет об одном из эффектив- мации, хранимой как на корпоративронних людей, которые могут полу- ных способов защиты конфиденциаль- ных серверах, так и на рабочих станчить доступ к информации, сущест- ной информации, хранящейся на дис- циях под управлением следующих опевенно возрастает, и, что гораздо ху- ках и лентах, с применением криптог- рационных систем: же, владелец этой информации теря- рафических средств.  MS Windows NT/2000/XP/2003 На рынке программного обеспече-  Novell NetWare ет возможность контролировать прония существует несколько програм-  Linux цесс доступа к информации. Рассмотренные угрозы имеют од- мно-аппаратных комплексов для заZserver работает с простыми и дину общую черту – они характеризуются щиты конфиденциальной информатем, что модель нарушителя предпола- ции на рабочих станциях и серверах намическими дисками (составными,

52


безопасность зеркальными, Raid-массивами). Имеется возможность установки Zserver на кластер из серверов на основе MS Cluster Service. Требования к Zserver определяются требованиями операционной системы. Zserver неприхотлив в ресурсах. Основные ресурсы требуются на реализацию криптографических процессов симметричными алгоритмами шифрования. Шифрование и дешифрование данных осуществляется «на лету» при соответствующих операциях записи и чтения. Комплект Zserver состоит из дистрибутива программного обеспечения, устройства для работы со смарт-картами ACR ACS-30U (USB), лицензионного ключа защиты (LPT или USB), двух микропроцессорных смарт-карт для хранения ключей, устройства «красной кнопки», подключаемой к COM-порту. Структура программной части Zserver состоит из трех модулей:  сервер защиты данных (ядро системы)  консоль управления сервером  модуль подачи сигнала тревоги Установка Zserver проста и не требует дополнительных навыков. Весь процесс инсталляции занимает не более 10 минут с одной перезагрузкой.

Консоль администратора Zserver

осуществляется на основе Diffie-Hellman EKE, данные шифруются 128-битным ключом по алгоритму RC5.

Алгоритмы шифрования

Генерация ключа шифрования осуществляется при непосредственном участии пользователя, с применением случайных чисел. В качестве генератора случайных чисел исСервер защиты данных Сервер защиты данных (ядро системы) устанавливает- пользуются движения мыши. В Zserver предусмотрено формирование ключа шифрося непосредственно на сервер с защищаемой информацией. Запускается с помощью службы «SecurIT Zkernel» вания с помощью двух симметричных алгоритмов:  RC5 – 128-битным ключом от пользователя System в автоматическом режиме при  AES – 256-битным ключом подсоединенном лицензионном ключе защиты. Служба не имеет зависимостей, что делает её устойчивой к сбоВозможна также поддержка российского симметричям в операционной системе. В отсутствии ключа защиты данную службу запустить невозможно. Если при уже ного алгоритма ГОСТ 28147-89 с 256-битным ключом, схозапущенной службе отключить физически ключ защиты жим с алгоритмом DES, но работающим гораздо быстZserver, то через некоторое время на этом сервере про- рее. На момент подготовки материалов статьи была возможность взлома ключа симметричных алгоритмов длиисходит «тревога». ной до 64 бит. Ключ RC5 длинной в 64 бит был взломан за 1 757 дней с привлечением 58 747 597 657 компьютеров Консоль управления Всё управление системой Zserver ведется с единой для всех пользователей. Для этого потребовалось перебрать окопродуктов компании SecurIT консоли управления. Она мо- ло 15 769 938 165 961 326 592 ключей. При скорости пежет устанавливаться как на сервер, так и на любую рабо- ребора 100 000 000 ключей в секунду потребуется около чую станцию, имеющую соединение с сервером по прото- 117 375 055 576 687907 000 дней для подбора ключа шифколу TCP/IP. В случае использования консоли управления рования длинной в 128 бит. Использование предлагаемых алгоритмов длиной клюна сервере, соединение осуществляется по внутренней петле на TCP-порт. По умолчанию используется 1245 порт. ча шифрования в 128 и 256 бит сделает неактуальной похиДля минимизации риска номер TCP-порта можно изменить щенную у вас информацию, так как на подбор ключа для доступа к данным потребуется значительное время и вычисс помощью настроек Zserver. Для разграничения полномочий и доступа к консоли ис- лительные ресурсы, а сама кража станет абсолютно беспользуется встроенная авторизация средствами Zserver, смысленной идеей. Хранение ключей шифрования возможно на смартчто позволяет разграничить администраторов сервера и адкарте, либо в файле с расширением *.key. При хранении министраторов безопасности. С версии 3.0 Zserver возможно управление настройка- ключа шифрования в файле – защиты не предусмотреми нескольких серверов одновременно с одной консоли уп- но. С целью обеспечения надежной защиты ваших конравления. Консоль управления Zserver позволяет управлять фиденциальных данных ключ необходимо хранить тольпользователями, ключами, носителями и общими ресурса- ко на смарт-карте. ми. Соединение консоли управления с сервером защиты данных осуществляется по зашифрованному каналу пос- Кворум ключей редством автоматически создаваемого одноразового сес- Для того чтобы один человек не мог совершить каких-либо сионного ключа. Процедура выработки сессионного ключа операций, критичных для бизнеса или целостности самих

№3, март 2006

53


безопасность данных, ключ шифрования можно поделить на несколько следует держать в секрете, никому не сообщать, и испольравных частей, делегировав право подключения зашиф- зовать только в системе Zserver. В комплект поставки вхорованного раздела нескольким администраторам безопас- дит PC/CS-совместимое устройство чтения-записи смартности. Разделяя ключ шифрования, вы тем самым органи- карт, подключаемое через USB-интерфейс. зуете «кворум ключей». Кворум ключей – это общее число частей, необходимое для формирования полного ключа Зашифровывание разделов шифрования. Число кворумов в системе Zserver может быть В Zserver возможно зашифровывание как уже имеющегоравным 2 или 3. Число ключей в кворуме – почти не огра- ся раздела (логического диска) с данными, так и нового. ничено (9,(9)*10 27). Таким образом, если вы выбрали число Зашифровывание существующего раздела займет более ключей – 6, а количество кворумов – 2, то любые 2 ключа длительное время, но в ходе процесса пользователи смогут из 6 сформируют полноценный ключ шифрования. При этом по-прежнему работать с данными. Время зашифровывания порядок загрузки ключей не играет роли. Если имеется не- раздела зависит только от объема всего раздела и не засколько ключей на одной смарт-карте, то при загрузке сис- висит от наличия информации на нем.. Так как доступ к затема спросит – какой ключ следует загрузить. Загрузка шифрованному разделу осуществляется только с помоключа шифрования может осуществляться с устройства щью ядра Zserver, которое запускается как сервис (служдля чтения со смарт-карт, подключенного непосредствен- ба), не могут быть зашифрованы разделы на более низком но к серверу, либо к рабочей станции. Эта функция облег- уровне, содержащие файлы операционной системы (включает процесс подключения зашифрованного раздела, ра- чая файлы подкачки и реплики Active Directory), а также заботу со смарт-картами, а также позволяет её оперативно грузочный раздел. При зашифровывании происходит «поуничтожить в случае возникновения критической ситуации. секторное» криптографическое преобразование по ключу При поломке (повреждении чипа) смарт-карты с единствен- шифрования, включая всю информацию о содержании данной копией ключа шифрования, либо его частью – инфор- ных в самом разделе. В отключенном состоянии в операмация будет утеряна навсегда. Чтобы не потерять всю ин- ционной системе зашифрованный раздел виден как неразформацию бесследно, необходимо создавать дубликаты меченная (не отформатированная) пустая область. В подключей либо увеличивать число ключей в кворуме. ключенном – зашифрованный раздел представлен как лоПосле загрузки ключи хранятся в оперативной памяти. гический диск. Естественно, при копировании данных с заВ целях защиты ключа Zserver не позволит выгрузить его шифрованного диска на незашифрованный данные оказыиз оперативной памяти сервера, даже если кто-то облада- ваются незащищенными. В случае компрометации ключа можно перешифровать ет всеми правами в системе. Для выполнения такой операции необходима только ваша смарт-карта и PIN для до- раздел другим ключом. Возможно также расшифровываступа к ней. ние всего раздела.

Система защиты смарт-карт

Работа с общими ресурсами

Микропроцессорная смарт-карта ACOS1 объемом 8 Кб Zserver позволяет предоставлять в общий доступ ресурсы, стандарта ISO 7816 может содержать до 16 ключей. Запись находящиеся на зашифрованном разделе, посредством ключей в смарт-карту осуществляется в ячейки фиксиро- «модуля управления ресурсами». Средствами операционной системы это невозможно. ванной длины. Доступ к ключу через консоль Zserver возможен только после ввода PIN-кода фиксированной дли- Авторизация пользователей производится встроенными ны в 8 символов. В случае четырехкратного неправильно- средствами. Добавить учетную запись и наделить его праго ввода PIN-кода смарт-карта блокируется, что означает вами может только администратор Zserver, а для предоставневозможность дальнейшего использования самой кар- ления в общий доступ необходима учетная запись с праты и ключей шифрования. Полезным является режим вво- вами администратора самого сервера. Естественно, весь да PIN-кода «под принуждением», представляющего со- трафик между сервером и клиентом (пользователем) пебой ввод обратной последовательности PIN. При исполь- редается в незашифрованном виде. зовании такого режима все ключи шифрования удаляются со смарт-карты, и выводится соответствующая ошибка. Модуль подачи сигнала тревоги Вы можете использовать этот режим, если кто-то, угрожая Модуль подачи сигнала тревоги служит для мгновенной бловам, требует ввести PIN. Ключ шифрования в любой мо- кировки доступа всех лиц посредством отключения зашифмент можно скопировать на другую смарт-карту, либо файл, рованных дисков и удаления из оперативной памяти клюили удалить. При удалении ключа со смарт-карты последу- чей шифрования. Имеется также возможность активации функции перезагрузки сервера при получении сигнала треющее его восстановление невозможно. В связи с тем, что функционал ввода PIN-кода под при- воги. При отключении дисков вся несохраненная информануждением реализован программно системой Zserver, ция будет утеряна. Подача сигнала тревоги может быть иниа не аппаратно смарт-картой, следует учесть, что в случае циирована с любой рабочей станции авторизованным польиспользования стороннего программно-аппаратного обес- зователем по протоколу TCP/IP, либо с помощью аппаратпечения для работы со смарт-картами ACOS число попыток ной кнопки, подключенной к компьютеру в сети, либо к серввода PIN-кода увеличивается до 8. Более того, зная PIN-код веру. «Красная кнопка» может быть двух видов: програмпод принуждением, злоумышленник может получить доступ мная (с помощью установленного программного обеспечек памяти смарт-карты. Поэтому PIN-код под принуждением ния) и аппаратного (с помощью устройства на COM-порту).

54


безопасность Программная кнопка инициируется щелчком курсора мыши в трее панели задач на любой рабочей станции, имеющей подключение к серверу по TCP-порту 1245 (по умолчанию). Сигнал тревоги можно также послать серверу путем запуска приложения ssagent.exe с указанием аргумента «-a». Для исключения случайных ложных тревог при использовании программной кнопки на клиентском рабочем месте настраиваются аутентификация и право использования этой функции. Так как данные для аутентификации хранятся в реестре операционной системы, следует завести одну либо несколько учетных записей в системе Zserver, делегировав им только право на подачу сигнала тревоги. Аппаратная кнопка – с помощью устройства на COM-порту сервера, либо на COM-порту рабочей станции с установленной «программной кнопкой» (имеющей подключение по TCP-протоколу к серверу). Принцип действия «красной кнопки» прост. Аппаратно (через COM-порт), либо программно (с помощью установленного клиентского программного обеспечения) модуль подачи сигнала тревоги аутентифицируется на сервере защиты данных и передает сигнал тревоги. Далее происходит выполнение запрограммированных действий. Возможна активация, к примеру, через SMSсообщение, либо звонка на определенный номер с вводом определенного добавочного кода в тональном режиме. Интерфейс продукта и имеющийся SDK-комплект разработчика позволит заказчику самостоятельно определить способы активации. Количество программных «красных кнопок» неограниченное. При наличии нескольких кнопок срабатывание будет только от той, которая первой пошлет сигнал тревоги. При этом нажатие остальных не будет чревато для системы. В случае подачи сигнала тревоги обратное подключение зашифрованных разделов не может быть произведено, пока сервер не будет перезагружен. Для подключения зашифрованного раздела после перезагрузки необходимо загрузить полный ключ, либо сформировать, загрузив его части с источников при наличии кворума.

сценарии при возникновении событий на сервере при возникновении тревоги, открытия-закрытия диска и т. п. К примеру, сервер при поступлении сигнала тревоги сначала должен оповестить пользователей по сети, выслать администратору безопасности письмо по электронной почте, а уже затем корректно отключить базу данных, пользователей и перезагрузить сервер. В документации к Zserver имеются несколько уже готовых типовых сценариев.

Zbackup как средство защиты архивных копий Любая система, от которой зависит стабильность технологических процессов компании, подвергается архивированию. Бессмысленно хранить в зашифрованном виде критичную для бизнеса информацию, защищать сервер межсетевыми экранами, хранить журналы доступа, когда копию своей системы вместе с данными можно украсть с архивной копией. Zbackup решает эту проблему, помещая в архив уже зашифрованные данные. Даже при хищении резервной копии доступ без ключа, которым данные на архивной копии были зашифрованы, либо длительного подбора этого ключа, будет невозможен. Zbackup может работать как отдельный продукт, так и в составе Zserver. При использовании в составе Zserver, возможно использование одних и тех же ключей шифрования. Zbackup работает как с оптическими носителями (CD/DVD-(RW)), так и со стримерными лентами. Система Zbackup совместима с часто используемыми системами архивации данных, такими как BrighStor ARCserve Backup, Veritas Backup Exec и другими. Настройка Zbackup проста и производится с единой консоли Zserver. Данные на архивном носителе хранятся в зашифрованном виде. Доступ к ним возможен только с использованием ключа шифрования. Zbackup может использовать ключ шифрования, которым зашифрованы разделы в Zserver, либо другой, но сформированный по алгоритмам, используемым в Zserver.

Протоколирование событий

Выводы

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

Применив на практике вышеописанную связку продуктов компании SecurIT, вы получаете комплексное взаимосвязанное решение для защиты конфиденциальных сведений на серверах, аналогов которому не существует. Простота интерфейса и наличие подробной документации на русском языке позволяют внедрить проект в кратчайшие сроки. Соответствие законодательству РФ и возможность поддержки российских криптографических алгоритмов позволит применить продукты компании SecurIT в различных сферах деятельности, в том числе в государственных и финансовых структурах. После внедрения в корпоративной системе один человек не сможет производить какие-либо монопольные действия, архивные копии даже в случае кражи будут непригодны к использованию, так как кворум ключей будет разделен между ответственными администраторами безопасности. Принцип разделения прав по ISO 13569 (Dual Control) мы получаем на практике в комплексном решении. Следствием применения такого решения будет неизбежное снижение рисков ваших серверов и спокойный сон администратора безопасности.

Использование сценариев Для осуществления дополнительных функций, таких как сокрытие диска, удаление файлов, подмена логического диска и т. п., в составе Zserver имеется Script Pack. Zserver Script Pack использует модуль Windows Script Components, который обеспечивает создание COM-компонентов с помощью языков создания сценариев, таких как VBScript, а также языков, совместимых со спецификацией ECMA 262 (JScript, JavaScript и других). Данная функция позволяет заказчику более тесно интегрировать Zserver с остальными компонентами операционной системы и серверными приложениями, определить дополнительные пользовательские

№3, март 2006

На правах рекламы

55


документация

Документация – экономия времени или его бесполезная трата?

Алексей Коршунов Искусство составления и использования документации – неотъемлемая часть работы хорошего IT-специалиста. Грамотно составленный документ способен помочь избежать огромной потери времени и лишних трудозатрат. До сих пор многие предпочитали игнорировать эту часть работы, но всё когда-то меняется.

К

аждый сотрудник периодичес- нает казаться, будто они никогда не за- нейшим шагом к экономии рабочеки испытывает на себе инте- кончатся. го времени. Искусство организации рабочего рес руководства с целью выяснения, чем занимается он в рабочее времени всё ещё в диковинку для мно- Документация время. Разумеется, начальству хочет- гих сотрудников, и не обязательно Я хочу сразу оговориться, что данная ся слышать, что время тратится на бла- только IT-отделов. Обычно считается, статья не преследует собой цель расго компании. Особенно это актуально что эта задача решается руководите- крыть все вопросы создания и ведедля системных администраторов ком- лями, но это не так. Никто не мешает ния технической документации, котопаний, руководители которых придер- обычному системному администрато- рая может потребоваться системному живаются позиции, будто сотрудни- ру, отдел которого насчитывает всего администратору. Здесь я лишь попытаки IT-отделов большую часть време- одну персону, научиться тратить вре- юсь очертить круг тех документов, кони «отдыхают». Зачастую именно из- мя с умом. Организация рабочего вре- торые так или иначе приходится писать за такого расхожего мнения, систем- мени сисадмина отличается от ситуа- любому работнику IT-отдела, если в его ным администраторам едва ли не в ре- ции с менеджерами ввиду различий задачи входит документирование. Покупая какой-либо программный жиме реального времени ставят зада- в их сферах деятельности. Организачи одну за другой. Однако оставаться ция рабочего времени сисадмина от- или технический продукт, пользователь на работе допоздна или засиживать- личается от ситуации с менеджерами рассчитывает получить вместе с ним ся в выходные – это не единственный в виду различий в их сферах деятель- пакет документации, который расскаспособ уберечься от загромождения ности. Умение составлять и исполь- жет, как именно использовать новообзадачами до такой степени, что начи- зовать документацию является важ- ретённое средство. Разумеется, я не

56


документация хочу сказать, что в современном мире, если вы, допустим, покупаете серверную операционную систему, то совершенно обязательно получите вместе с дистрибутивом ещё и целую книгу «в нагрузку». Конечно, нет. Книгопечатные издания не даром едят свой хлеб, выпуская массу замечательных материалов, помогающих новичкам и профессионалам учиться использовать разработки различных компаний. В данном случае я скорее говорю о встроенных help-справках, которые могут внести минимально необходимую ясность в процесс эксплуатации, а также о вложенных в «пакет» вместе с дисками документах. Это если затрагивать программные продукты. Случаи с покупками «железа» по сути мало чем от этого отличаются, но набор документации, как правило, всё-таки более широк. Причем не так уж важно, купили вы видеомагнитофон, музыкальный центр или сервер компании SUN – минимально необходимый набор документов вы получите. Причем можно смело сказать, что чем богаче набор полученной документации, тем более добросовестно относится производитель к своей работе. Дума��, каждый сталкивался с ситуациями на работе, когда вы получаете заказанное оборудование без сколько бы то ни было серьёзного пакета документов. Если это сервер или рабочие станции, заказанные в выбранной вами же конфигурации, это ещё не так критично. А если это, например, мини-АТС, то ситуация становится прямо-таки мало приятной. В большинстве случаев после некоторого диалога с продавцом всё же удаётся добиться от него какой-либо сопроводительной документации. А если нет, то, возможно, придётся обратиться напрямую к производителю или наиболее крупному дилеру. Сопроводительная документация важна для всех, начиная от директора компании и бухгалтерии, заканчивая теми, кому предстоит использовать оборудование (или программные средства). Она нужна для общего представления того, что вы приобрели, а также для банального учёта имеющегося в распоряжении предприятия. С этим вроде бы всё более или менее понятно. Но как же быть с тем, что уже имеет компания на момент вашего прихода? Хорошо, если компания

№3, март 2006

Уважаемые читатели! Наш журнал с удовольствием представляет вашему вниманию новую рубрику «Документация». Мы решили начать с того, что на наш взгляд является наиболее важным, а именно с умения и понимания необходимости составления технической документации. Многие IT-специалисты не любят заниматься «писаниной», но мы всё же попробуем показать, чем это может быть полезно. Расскажем о наиболее эффективных способах составления документации и поддержания ее актуальности. Погово-

рим о различных схемах работы с документами. Статья, открывающая рубрику, является вводной и намеренно охватывает весь вопрос в целом. В дальнейшем, каждый из наиболее интересных моментов будет рассматриваться более подробно. Если вы хотите увидеть на страницах журнала ответ на какой-то из вопросов по технической документации или имеете желание написать статью по этой теме – присылайте ваши вопросы и предложения на адрес akeeper@samag.ru.

средних размеров и у неё нет десятков ков (если таковой имеется, а если серверов и крайне разветвлённой инфнет, то, может быть, и разработать его, но об этом позже); раструктуры. А если есть? И более того, не описана ни в каких документах?  узнать принятую внутри компании Это может стать настоящим кошмаром структуру взаимодействия работдля вступающего в свои обязанносника IT-отдела с пользователями, поставщиками; ти нового сотрудника. Ведь предстоит не просто понять, что происходит  узнать схему закупки нового обона серверах компании и что на них рарудования, схему его заказа; ботает. Предстоит сделать значитель-  иметь представление об оргтехнино больше. ке, находящейся в ведении компаА именно: нии;  вникнуть в структуру локальной се-  прочие пункты (коих может быть вети; ликое множество).  понять структуру телефонной сети Это лишь основная часть того, (да-да, я знаю, что большая часть системных администраторов пред- во что предстоит вникнуть новому сопочитает не заниматься телефони- труднику. И в ситуациях, когда ввесей. Однако, как показывает практи- ти его в курс дел максимально подка, по сию пору многим сотрудни- робно некому, это может стать настокам IT-отделов приходится не толь- ящей головной болью. Даже в случако знать устройство всего этого ях увеличения штата IT-отдела на пол«хозяйства», но и принимать непос- ное ознакомление могут уйти дни и нередственное участие в её доработ- дели. Между тем пользователи рабоке или даже разработке); тают, сервера требуют необходимого  минимально необходимо знать воз- им ухода, а в планах может находитьможности существующей электро- ся немало проектов, также нуждаюсети; щихся в непосредственном внимании  составить полное представление и участии сотрудника. Выглядит довольно грустно. И главо серверном парке компании;  разобраться в программном обес- ная причина этого – отсутствие технип е ч е н и и , ф у н к ц и о н и р у ю щ е м ческой документации, куда своеврена серверах компании, о схемах менно были бы занесены все аспекрешений тех или иных вопросов, ты работы сетевой инфраструктуры системах резервного копирования предприятия. Можно долго размышлять и обо всём остальном, что смело на тему, почему каждый раз, приходя на можно отнести к огромному фрон- новое место работы, системный адмиту работ с новыми (для данного со- нистратор сталкивается с вышеобознатрудника) серверами; ченными трудностями. Это может быть  составить не менее полное пред- инертность и халатность предыдущих сотрудников («Я знаю, как это работаставление о рабочих станциях;  знать полный набор программно- ет, а после меня хоть потоп».), а может го обеспечения, принятого стан- быть и банальное незнание руководидартами компании для сотрудни- телей о необходимости ведения доку-

57


документация ми программного обеспечения. Тем бо- в будущем, так как разом решает целее что многим ГОСТам уже «сто лет лую кучу проблем. Не говоря уже об исв обед» и на половину документов, ко- чезновении проблем с нерабочими сеторые вы, возможно, захотите создать, тевыми розетками, обрывами провостандарта просто не существует. дов и так далее. С этим тоже каждому Соблюдение всех норм и правил системному администратору приходитнеобходимо в тех случаях, когда па- ся сталкиваться и не раз за время свокет технической документации гото- ей профильной деятельности. Если же эти условия не выполнявится для внешнего пользователя. Например, если вы планируете продать ются и вы являетесь «хозяином» не(как вариант, перепродать) сетевую известной структуры сети, то, наверинфраструктуру вашей компании при ное, уже потратили уйму времени на то, смене офиса. Здесь вам на помощь чтобы в ней разобраться и понять, «покак раз придут ЕСКД (Единая струк- чему этот провод торчит из стены и кутура конструкторской документации) да он ведёт». Надеюсь и с патч-панеляи ЕСПД (Единая система програм- ми у вас полный порядок. Теперь самое Что такое техническая документация мной документации), а также прочие время выделить себе один-два рабочих Итак, мы уже поговорили о том, для че- стандарты, принятые в таких случаях. дня на то, чтобы всё это задокументирого нужна техническая документация. Но это отдельный длинный разговор, вать. Надеюсь, не надо объяснять, что Теперь давайте поймём, что же это та- и пока что мы об этом умолчим. это в первую очередь нужно вам самим? Не слишком приятно будет вспоминать кое. Если за ответом на этот вопрос обваши «поползновения» с неизвестными ратиться к ныне столь популярной ви- Когда начинать вести проводами, когда (или если) такая необкипедии (wikipedia – ru.wikipedia.org.), документацию то мы получим следующий вполне кон- Резонный вопрос, возникающий пос- ходимость возникнет в будущем. Это и является ответом на вопрос кретный ответ: «Техническая докумен- ле всего, что мы узнали выше, – когда тация – набор документов, используе- же надо начинать вести документацию «Когда начинать создавать документамых при проектировании (конструиро- на подотчётное «хозяйство». Правиль- цию?». Если у вас её ещё нет – начнивании), создании (изготовлении) и ис- ным ответом было бы – сразу. То есть те прямо сегодня. Ведь это только напользовании (эксплуатации) каких-ли- ровно с того момента, как начала за- чало вашей работы по написанию полбо технических объектов: зданий, со- кладываться инфраструктура будущей ноценного пакета документов на всё, оружений, промышленных товаров, компании. Пока ещё нет десятков мет- с чем вы работаете. Как известно, Ропрограммного и аппаратного обеспе- ров непонятных сетевых, телефонных дина начинается с картинки в букваре, чения.» Другими словами, к техничес- и прочих кабелей. Пока нет неразбери- а техническая документация системкой документации относится довольно хи. Тем более что правильное планиро- ного администратора со схемы струкобширный круг документов. вание будущей сети компании с необ- туры сети. Разумеется, не всё из перечис- ходимыми планами, схемами и описаленного в определении нас интересу- ниями – это уже огромный задел для Типы технической ет. Наибольшее внимание стоит уде- весьма увесистого и крайне подробно- документации лить пункту «программное и аппарат- го пакета технических документов. Как уже было сказано выше, наибольОднако, как показывает практика, ший первоначальный интерес для сисное обеспечение». То есть собственно то, с чем работает каждый системный те или иные причины всегда препятс- темного администратора в техничесадминистратор. твуют правильному ведению дел с са- кой документации представляет схеДля создания и ведения техничес- мого начала. Самое простое, что мо- ма сети, но этим интерес не ограникой документации «по правилам» су- жет прийти на ум, – компания въезжает чивается. Краткий перечень документов, коществует целый набор принятых на го- в новый офис с уже существующей сесударственном уровне стандартов тью, на которую попросту нет докумен- торый стоит начать создавать сразу же (ГОСТ). Не всегда чёткое следование тов и схемы. К счастью, в последние па- после (или во время) описания сети: этим стандартам добавляет информа- ру лет наблюдается картина значитель-  описание схемы доступа в Интертивности к создаваемым документам ных изменений в подходе руководства нет и интранет сети; и уж тем более не всегда требуется. к инфраструктуре вообще и IT-отделам  описание серверов; Во всяком случае до тех пор, пока мы в частности. Всё чаще и чаще перед пе-  описание системы резервного коговорим о документации, создаваемой реездом в новый офис в нём делается пирования; для внутрикорпоративного использова- ремонт, а план необходимых коммуни-  описание схемы антивирусной зания. Ну в самом деле, станете ли вы пи- каций с планированием расположения щиты компании; сать настолько сложный документ, соб- серверной комнаты и сетевого обору-  описание стандартов используемолюдающий все необходимые требова- дования закладывается на стадии ещё го пользователями программного обеспечения; ния стандарта, если вам просто-напрос- только обсуждения возможности перето необходимо создать перечень наибо- езда. Безусловно, это сильно упрощает  прочие пункты, уже упомянутые лее часто используемого пользователя- работу по составлению документации в введении. ментации отделом IT. А что не требуется, то не делается. Это правило крайне распространено у системных администраторов, и не только касательно документации. Думаю, каждый хоть раз слышал о человеке, не озаботившемся разработкой и введением в эксплуатацию системы резервного копирования всех жизненно важных для работы компании файлов. Точно так же каждый знает, к чему это приводит. Поверьте, отсутствие документации рано или поздно может привести к не менее печальному результату.

58


документация Кратко рассмотрим весь этот короткий (по сравнению с полным) список документов.

ние файла с описанием операционной ные стандарты на программное обессистемы, работающих сервисов, аппа- печение, используемое пользователяратной составляющей, функциональ- ми в повседневной работе. Однако, как бы странно это ни звуной значимостью и прочими «мелочами» не требует значительных ресурсов. чало, не везде это задокументироОписание схемы доступа Ведь вы уже работаете с этими маши- вано. в Интернет и интранет сети Как следствие, с тем, чего нет Уровень развития телекоммуникаци- нами и знаете для чего каждый из них. онных компаний сейчас достиг того, Сбор сведений – дело техники. Вам ос- на бумаге, нельзя ознакомить польчто всевозможные конкуренто-способ- танется лишь задокументировать всё зователя и ввести ответственность за ные предложения просто-таки навод- это и отложить в сторону до следующих соблюдение. Где нет правил, там не монили рынок. Это даёт компаниям-поль- изменений, после которых надо сразу жет быть их исполнения. Поэтому оформление корпоразователям широкий выбор в способе и же обязательно вносить поправки. Это количестве потребления услуг досту- позволит поддерживать актуальность тивного стандарта в едином докуменпа в Интернет. Пользуясь этой ситуа- документа и избежать головной боли те и ознакомление с ним пользовацией, многие руководители, серьёзно в дальнейшем. теля во избежание эксцессов в будуотносящиеся к бесперебойному достущем – это хорошая практика. Разупу в Интернет и понимающие его важ- Описание схемы резервного меется, это не означает сто процентность, уже давно приняли (или имеют копирования ной гарантии, что на компьютере тоэто в планах на ближайшее будущее) Строго говоря, описав правильную го или иного пользователя не появитрешение о резервном канале от одного схему резервного копирования и до- ся «почтовый клиент некорпоративноиз присутствующих в районе провай- бавив к ней обоснование, почему это го стандарта». Уровень компьютерной грамотносдеров. Чем полезна схема с двумя про- важно, можно смело идти к руководсвайдерами уже обсуждалось не раз. тву и объяснить необходимость выде- ти пользователей растёт, а установЕсли у вас уже есть два канала для лить бюджетные средства на новую ка новой программы не является продоступа в Интернет, то от вас требует- технику. Но для нас это важно по дру- блемой даже для неопытного пользося всего лишь документирование этой гой причине, которая всем известна: вателя. схемы. А если нет, то чем не повод её сеть без резервного копирования – Разумеется, такие задачи чаще изобразить и пойти с ней к руководству. это бомба замедленного действия, ко- всего решаются на уровне операционЧем это полезно? Да хотя бы тем, что торая рано или поздно рванет так, что ной системы, но, как показывает праквы сами в процессе составления доку- никто не уйдёт без «подарков». Наде- тика, административные меры самые мента создаёте у себя в голове чёткое юсь, вы не из тех любителей испыты- действенные. (Особенно если за напредставление о том, как это делается, вать удачу, которые откладывают ре- рушение корпоративного стандарта и сможете применить этот навык в лю- шение такой важной задачи. штрафуют.) бое время. Полезно? Ещё бы. Кроме того, не лишним будет опи- Описание схемы антивирусной Заключение сать схему доступа в Интернет и для защиты компании Разумеется, перечислены далеко пользователей компании. Трафик, ко- Чем важна система защиты от виру- не все документы, которые стоило бы нечно, дешевеет изрядно, но практи- сов, знает каждый системный адми- начать вести каждому системному адка ограничения используемого досту- нистратор. А те, кто уже хотя бы раз бо- министратору, который серьёзно и оспа применяется всё чаще. Причем если ролись с эпидемиями, возникающими новательно подходит к своей работе. раньше большая часть системных ад- даже в казалось бы защищённой сети, Мне известно, что многие люди, рабоминистраторов (или руководства) ис- уже давно составили схему целостной тающие по этой специальности, мягпользовали схему ограничения по ре- защиты и привели антивирусную защи- ко говоря, недолюбливают написание сурсам, то сейчас наиболее популяр- ту на всех рабочих станциях и серверах технической документации. Однако ным становится ограничение по объ- к «общему знаменателю». Довольно даже они рано или поздно начинают ёму скачиваемого контента. Если вы странно звучит, но тем не менее факт – жаловаться на то, что «такой-раставсё ещё ограничиваете пользователей в сетях, где антивирусы установлены, кой предшественник не оставил поспо списку запрещённых к посещению но общей схемы защиты нет, рано или ле себя ничего». ресурсов, это хороший повод перейти поздно обязательно возникнет вирусМожет быть, стоит с себя начать на ограничение по трафику. ная эпидемия. Во всём должен быть по- и ввести практику ведения докуменрядок и максимально прозрачное пред- тации, если таковая ещё не была приставление реализации. Это касается нята в вашей компании. Описание серверов Написание документации полезно Разбираться каждый раз (или вспоми- и защиты от вирусов. во всех смыслах. Начиная от образонать, если у вас их множество), что находится на том или ином сервере, – Описание стандартов вательных, заканчивая тем, что после это занятие не из приятных. Особенно используемого сотрудниками проделывания всей той работы, котоесли именно этот сервер уже полтора программного обеспечения рая кратко была перечислена выше, года работает в штатном режиме и вни- В большинстве средних и крупных можно смело идти... за премией. А почему нет? мания не требует. В то же время созда- компаний уже приняты корпоратив-

№3, март 2006

59


сети

Интернет «от Москвы до самых до окраин»

Роман Ерин Недорогой Интернет в любую точку страны? Это возможно! Использование спутниковой связи позволит вам подключиться к сети даже там, где нет ни коммуникаций, ни людей на многие километры. Все этапы подключения – от покупки оборудования до настройки.

Как оценить свои потребности и выбрать оборудование В февральском номере журнала была опубликована статья Антона Борисова «Подключаемся к Интернету через спутник». В ней автор рассказал о так называемом «фишинге» – методе приёма со спутника данных, не предназначенных для вас. Разумеется такой способ хорош для при приёма тяжёлого контента – фильмов и музыки – за чужой счёт, но имеет один существенный недостаток – вы не можете выбирать, что вам принимать. Эта статья более полно познакомит вас с технологией использования спутникового канала доступа в сеть. Не секрет, что в нашей стране, за пределами центрального региона – Москвы и Санкт-Петербурга, магистральные провайдеры устанавливают достаточно высокие цены за интернеттрафик. Сервис-провайдеры в регионах, таким образом, вынуждены ещё увеличивать цену, в результате чего она доходит до 2-3, а в некоторых регионах и до 4 рублей за 1 Мб. При этом, как правило, оплачивается только входящий к абоненту трафик. Всё это создаёт предпосылки для использования асимметричного доступа в Интернет при помощи спутников, посредством технологии Digital Video Broadcasting (DVB) – технологии цифрового вещания. Изначально технология была разработана для телевидения, но теперь используется и для работы в сети.

60

Итак, какие выгоды вы получите от использования спутникового доступа в сеть:  дешёвый трафик (менее 1 рубля за 1 Мб при скорости до 5 Мбит);  доступность безлимитных тарифов (32 Кбита от 1200 рублей);  возможность доступа ��ри отсутствии магистральных каналов (можно использовать в качестве обратного канала модем или GRPS);  возможность доступа при полном отсутствии сетевой инфраструктуры (через приёмо-передающий комплекс). На выбор типа доступа (асимметричный или двухсторонний) и оборудования в первую очередь влияет сумма денег, которую вы хотите потратить: если вы домашний пользователь, если у вас есть наземный канал и нет больших запросов в плане стабильности – можно выбрать самый дешевый вариант – установить в свой компьютер PCI DVB приёмник, такой как Skystar1, Skystar2 и их аналоги. Если же вы собираетесь потреблять много трафика, если для вас важна стабильность и минимизация цены за трафик – ваш выбор аппаратные DVB-маршрутизаторы с поддержкой более мощных алгоритмов сжатия (про алгоритмы подробно рассказано в разделе «Используемые методы сжатия»). Разница в цене этих решений составляет примерно 10-50 раз. Симметричный доступ мы в этой статье рассматривать не будем ввиду

дороговизны оборудования, трудностей получения разрешений и большого объёма необходимой информации. Кроме приёмного оборудования вам понадобится, конечно же, и сама тарелка. Для того чтобы оценить необходимый размер тарелки, воспользуйтесь картой покрытия спутника. Как правило, на ней имеются зоны, показывающие либо сразу размеры тарелки, либо уровень сигнала на местности (см. рис 1). После того как вы определились с размером антенны – вам необходимо выбрать подходящий вид конструкции. Тарелки бывают двух видов: прямофокусные и офсетные (см. рис. 2). Оба типа имеют свои плюсы и минусы. Если для приёма сигнала вам требуется размер тарелки менее 2 метров, настойчиво рекомендую выбирать офсетную антенну – у вас будет меньше хлопот со снегом – не будет скапливаться. Кроме того, это единственный вариант при установке антенны на стене или балконе.В противном случае вам следует выбрать прямофокусный вариант. Как можно видеть на рисунке, у прямофокусной тарелки часть поверхности зеркала закрывает конвертер, поэтому для антенн небольшого диаметра лучше выбирать офсетную модель. Из антенн, представленных на российском рынке, можно выделить продукцию ОАО «Алмет», выпускающуюся под названием «Супрал», как имеющую оптимальное соотношение цена/качество.


сети Вещание со спутников ведется в двух частотных диапазонах: C (3.4-4.2 GHz) и Ku (10.7-12.75 GHz). В зависимости от того, в каком диапазоне вы будете принимать сигнал, вы должны приобрести нужный конвертер. Для того чтобы определить, какой диапазон вам нужен, надо выбрать спутник и оператора на нём.

Используемые методы сжатия При передаче информации через спутник используется несколько типов модуляции, позволяющих передавать в полосе шириной в 1 МГц эффективный поток скоростью до нескольких Мбит. BPSK, QPSK, OQPSK, 8PSK, 16QAM – эти виды модуляции расположены в порядке возрастания сжатия. Подробное описание алгоритмов их работы выходит за рамки статьи. Для практического использования достаточно знать: чем больше сжатие – тем ниже конечная цена трафика.

Рисунок 1. Карта покрытия спутника Express AM1 с отмеченными зонами уровня сигнала

Выбор спутника Итак, настало время выбрать спутник, с которого вы будете принимать сигнал. Есть два варианта: вы можете поискать в Интернете провайдеров спутникового доступа и на их сайтах посмотреть, какие спутники они используют, или, что предпочтительнее, вы можете найти подходящий спутник и выяснить, кто через него вещает. Посетите сайт http://www.lyngsat.com – на нём вы найдёте список спутников с их положением на орбите и сможете посмотреть, кто из провайдеров на них работает. Там же можно ознакомиться с картами зон вещания с каждого из транспондеров спутника. Предпочтение следует отдавать европейским операторам связи – у них цены ниже. Также имейте в виду, что многие провайдеры готовы работать с вами через спутники, на которых в данный момент их нет, поэтому личные переговоры с представителем провайдера часто позволяют многого добиться. Не стесняйтесь немного поторговаться – можно сбросить цену в некоторых случаях более чем в 2 раза.

Рисунок 2. Типы приёмных антенн

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

Настройка оборудования

где:  G1 – ваша географическая долгота;  G2 – долгота расположения интересующего вас спутника на орбите (западная с минусом);  W – ваша географическая широта.

Итак, теперь у вас есть всё необходимое: тарелка, конвертер (головка), обычный телевизионный коаксиальный кабель (75 Ом), комплект приёмного оборудования (PCI-плата или аппаратный демодулятор), компьютер (если используется PCI-плата). Для того чтобы вывести вашу тарелку на нужный спутник, вы можете воспользоваться двумя методами: применить специальное оборудование или собственную голову и руки. Если у вас есть спектроанализатор – наведение не составит большого труда. Надо всего лишь закрепить датчик прибора на месте конвертера в крепеже тарелки, примерно нацелиться на спутник и, ориентируясь по показаниям спектроанализатора, произвести точную настройку. Однако будем предполагать, что специального оборудования у вас нет, но есть голова, руки и немного знания математики. Сразу оговорюсь, я буду рассматривать установку офсетной антенны на азимутальную подвеску. Про прямофокусные тарелки и полярную подвеску вы можете прочитать в Интернете.

Соберите антенну согласно инструкции по сборке. Жестко закрепите опору в выбранной точке. При установке на балконе или лоджии загородку сверлят насквозь и прикрепляют опору обычными длинными болтами большого диаметра. При установке на стене в ней сверлят отверстия и используют саморасклинивающиеся анкерные болты. В соответствии с рис. 3, используя вышеприведённые формулы, отвес и транспортир, вам не составит труда в течение часа настроить тарелку на нужный спутник. Уровень сигнала при этом контролируется программным обеспечением (szap для Linux и setup4pc для Windows). Имеет значение не только точная установка конвертера в фокусе антены, но и правильное положение относительно оси вращения конвертера. Обычно каждый конвертер (имеются в виду конвертеры, монолитно объединенные с поляризатором и облучателем, которые используются для установки антенны на один спутник) имеет метку

№3, март 2006

61


сети Внимание! Всё, что относится к dvb, собирайте модулями. В разделе «Device Drivers → Multimedia Devices →Digital Video Broadcasting Devices» включайте:  DVB Core support  Technisat/B2C2 FlexCopII(b) and FlexCopIII adapters  Technisat/B2C2 Air/Sky/Cable2PC PCI В /etc/modprobe.conf добавьте строку: options dvb_core dvb_shutdown_timeout=0 Рисунок 3. Определение азимута и угла места

«верх», которая связана с положением встроенного поляризатора (соответствует вертикальной поляризации). Однако точно вверх эта метка должна смотреть только на географической долготе спутника. Если вы устанавливаете антенну западнее или восточнее, чем расположен спутник, то конвертер нужно повернуть в держателе вокруг своей оси. Для многих современных мощных спутников, расположенных не слишком низко над горизонтом, этим эффектом можно пренебречь из-за запаса по мощности их сигнала. Однако, если вы ловите сигнал на пределе возможностей вашей приемной системы, то правильный угол поворота конвертера может дать существенное повышение уровня сигнала и создать запас на случай ухудшения метеорологической обстановки.

Мультифиды, DiSEqC – используем тарелку эффективно Если вы планируете использовать тарелку единолично и при этом хотите не только пользоваться Интернетом, но и время от времени баловать себя просмотром телевизионных и прослушиванием радиопередач со спутника – вам может понадобиться мультифид – крепление на одну тарелку нескольких головок и устройства с поддержкой DiSEqC – протокола управления несколькими устройствами по одному кабелю. Если в вашей местности вы можете принимать несколько близко расположенных спутников – установите вместо стандартного крепления конвертера мультифид (его можно легко изготовить самостоятельно, но лучше купить).

Пример настройки компьютера под управлением Linux+Skystar2 Итак, вы имеете настроенную тарелку, компьютер под управлением Linux, DVB плату Skystar2 и, конечно же, договор с оператором связи. Ваша задача – настроить раздачу дешевого интернет-трафика всей вашей локальной сети.

Часть первая: настройка ядра Для использования DVB-платы вам, скорее всего, придётся пересобрать ядро. Чем свежее оно будет – тем лучше. Я на момент написания статьи использовал на спутниковом маршрутизаторе ядро версии 2.6.15.4 – поэтому описание будет происходить на его основе. Для более ранних ядер будьте внимательны – драйверы называются по-другому и расположены в другом месте конфигурации ядра.

62

Это необходимо сделать для того, чтобы Skystar не переходил постоянно в режим энергосбережения, в котором он перестаёт принимать сигнал. Выполните сборку, установку и перезагрузите компьютер.

Часть вторая: готовим утилиты На сайте http://www.linuxtv.org возьмите утилиты управления DVB-картами linuxtv-dvb-apps или, если вы используете Slackware Linux, скачайте бинарный пакет со специально мной пропатченными утилитами с моего сайта http://kid.tomsk.ru. Также в составе па��ета доступны man страницы на русском и английском языках, а также утилита интерактивной настройки dvb-setup. После установки этих утилит вам станут доступны следующие необходимые программы:  szap – программа настройки карты на нужную частоту;  dvbnet – программа, включающая сетевую надстройку над DVB;  dvbtraffic – программа просмотра текущей активности на спутнике – позволяет проверить приём с тарелки.

Часть третья: готовим стартовые скрипты Создайте файл /etc/channels.conf следующего содержания: Название оператора:частота в Мгц:поляризация(h|v): ↵ fec(0-авто):символьная скорость(в килосимволах в сек.): ↵ PID:PID:0

Создаем стартовый скрипт rc.dvb #!/bin/bash PREFIX=/usr/local/sbin # Ваш пид – его вам сообщит ваш оператор связи PID1=523 # Имя сетевого интерфеса (менять не нужно) DEV_NAME1=dvb0_0 # IP-адрес можно любой, лишь бы он не пересекался по маске # ни с каким другим адресом в вашей системе. Настоятельно # рекомендую оставить нули IP_ADDR=0.0.0.0 # MAC-адрес вашей карточки (как правило, его можно прочитать # на бумажной наклейке на самой карте), но можно использовать # любой. Единственное ограничение – такого MAC-адреса # не должно быть больше ни у кого, кто использует этот спутник MAC_ADDR1=xx:xx:xx:xx:xx:xx case "$1" in start) # Загружаем модули modprobe dvb_core dvb_shutdown_timeout=0 modprobe b2c2_flexcop_pci # Если у вас настроен udev, то нужно немного времени, # чтобы устройства появились в каталоге /dev


сети Используем одну карту для работы с несколькими подписками одновременно Зачастую бывает, что одной подписки оказывается мало, как например в моем случае – я хочу иметь медленную безлимитную подписку и быструю с помегабатной оплатой. Skystar2 поддерживает до 32 одновременных независимых каналов приёма с одного транспондера. Каждый канал будет различаться только mac адресом на нём. Модифицируйте стартовые скрипты необходимым образом. В качестве MAC-адресов для новых интерфейсов, как вариант, можно брать адреса со сгоревших сетевых плат. Вам также придётся потратить какое-то время для того, чтобы объяснить спутниковому провайдеру, что от него требуется. Схема взаимодействия показана на рис. 4. Основная мысль заключается в том, чтобы делать SNAT на разные адреса для разных пользователей/сервисов.

;; stop)

sleep 3 # Тюним карточку $PREFIX/szap -c /etc/channels.conf -n 1 -p $PREFIX/dvbnet -p $PID1 /sbin/ifconfig $DEV_NAME1 $IP_ADDR /sbin/ifconfig $DEV_NAME1 hw ether $MAC_ADDR1 echo 1000000 > /proc/sys/net/core/rmem_max echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter # Останавливаем szap killall szap # Останавливаем сетевой интерфейс /sbin/ifconfig $DEV_NAME1 down $PREFIX/dvbnet -d 0 # Выгружаем модули rmmod b2c2_flexcop_pci b2c2_flexcop stv0299 dvb_core

;; restart) $0 stop $0 start ;; *) echo "Usage: start | stop | restart" esac

Этот скрипт можно использовать как в Slackware, так и в SysV-системах, типа RedHat. Внимание! В этом скрипте используются пропатченные утилиты. Если вы используете оригинальные утилиты с www.linuxtv.org – вам потребуется внести изменения.

Часть четвертая: поднимаем обратный канал Итак, канал для приёма информации уже есть, осталось создать запросный канал. Я буду рассматривать сейчас подключение к оператору спутникового Интернета с помощью ipip тунеля, что подразумевает наличие у вас статического IP-адреса и скорее всего постоянного наземного подключения. Если это не так – вам придётся использо-

Ошибки, часто допускаемые начинающими Ошибки, которые делаются на этапе настройки оборудования на спутник:  путают точку отсчета при выборе угла места;  забывая основы школьного курса географии, отсчитывают азимут от юга.

Ошибки, которые делаются на этапе настройки ОС Linux: забывают отключать тайм-аут засыпания карты.

№3, март 2006

Рисунок 4. Схема взаимодействия

вать openvpn или pptp. #!/bin/bash LOCALIP=xx.xx.xx.xx # Ваш наземный постоянный IP-адрес REMOTEIP=xx.xx.xx.xx # IP-адрес сервера спутникового # провайдера LOCALGW=xx.xx.xx.xx # Ваш наземный шлюз TUN=yy.yy.yy.yy # Ваш адрес в туннеле TUNGW=xx.xx.xx.xx # Адрес провайдера в туннеле NAME="skytun" # Имя тунеля modprobe ipip # Удаляем «мусор» в случае повторных запусков скрипта ip route del $REMOTEIP >/dev/null 2>&1 # Добавляем маршрут на сервер доступа провайдера «по земле» ip route add $REMOTEIP via $LOCALGW ip tunnel del $NAME # Создаём тунель ip tunnel add $NAME mode ipip remote $REMOTEIP local ↵ $LOCALIP ttl 255 ip link set $NAME mtu 1500 ip ip ip ip ip

addr add $TUN peer $TUNGW dev $NAME link set $NAME up route del default route add default via $TUNGW route flush cache

Часть пятая: раздаем Интернет в локальную сеть # Включаем маршрутизацию echo 1>/proc/sys/net/ipv4/ip_forward

В некоторых случаях, если вы наблюдаете проблемы с загрузкой крупных объектов, при нормальном прохождении пинга, может потребоваться добавить вот такую строку: iptables -A FORWARD -p tcp -o skytun ↵ --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1300

Дальше: # Раздаём интернет в сеть mynet/masklen iptables -t nat -A FORWARD -s mynet/masklen ↵ -j SNAT –to-source yy.yy.yy.yy

Готово! Вы имеете систему с настроенным спутниковым Интернетом и раздачей его всей локальной сети.

63


сети

Управляем сетевым оборудованием с помощью протокола SNMP

Управлять активным сетевым оборудованием можно различными средствами, например, с помощью Telnet или SSH. Но одним из наиболее быстрых и удобных средств взаимодействия является протокол SNMP.

64


сети

З

адача автоматизации управления различным сетевым оборудованием существует со времени появления первых сетевых устройств. На сегодняшний день практически в любой сети можно найти активное сетевое оборудование, управление которым можно, а как правило, нужно автоматизировать. Для решения подобных задач был разработан протокол SNMP (Simple Network Management Protocol). Существует масса готовых коммерческих решений по управлению различными устройствами с помощью SNMP, например HP Open View, однако не каждой организации по карману приобретение подобного ПО, к тому же эти программные продукты предназначены для управления большим количеством устройств, и их использование в небольших сетях будет нецелесообразным. Рассмотрим теоретические основы работы протокола SNMP и практическую реализацию решения некоторых задач с помощью сценариев на языке Perl.

Описание протокола и его компонентов

Андрей Бирюков

SNMP использует UDP в качестве транспортного протокола порт 161 и предназначен для использования сетевыми управляющими станциями, как правило серверами, в качестве управляющих и активного сетевого оборудования в качестве управляемых систем. Протокол определяет формат данных, их обработка и интерпретация остаются на усмотрение управляющих станций. SNMP-сообщения не имеют фиксированного формата и фиксированных полей. При работе протокол SNMP использует управляющую базу данных MIB – (Management Information Base), которая определяется стандартами RFC-1213, 1212. Общая архитектура взаимодействия по протоколу SNMP имеет следующий вид: на устройстве, которым необходимо управлять, запущен агент SNMP (см. рис. 1). Агенты имеют доступ к инфоpмации об упpавляемом устpойстве, на котоpом они запущены и делают ее доступной для систем сетевого упpавления NMS (Network Management Systems). Упpавляемое устpойство может быть любого типа, лишь бы оно было подключено к сети, это могут быть как компьютеpы, так и сеpвеpа, пpинтеpы, маpшpутизатоpы, коммутаторы и даже DSL-модемы. Для пpимеpа: устpойство может отслеживать следующие паpаметpы:  Количество и состояние своих виpтуальных соединений (Virtual circuits).  Количество пpинятых сообщений об ошибках опpеделенного pода (Number of certain kinds of error messages received).  Количество байт и пакетов, пpинятых и посланных этим устpойством.  Максимальное значение длины очеpеди (для маpшpутизатоpов и дpугих межсетевых устpойств).  Количество пpинятых и отправленных шиpоковещательных сообщений.  Состояние каждого из своих интеpфейсов. Забегая вперед, скажу, что задача получения значе-

№3, март 2006

65


сети  ifMtu – максимальный размер пакета сетевого уровня, который можно послать через этот интерфейс.

 ifSpeed – пропускная способность интерфейса в битах в секунду (100 для Fast Ethernet).

 ifPhysAddress – физический адрес порта, для Fast      Рисунок 1. Структура взаимодействия SNMP

ний некоторых из этих параметров будет реализована далее в этой статье.

Отправляем объекты

Ethernet им будет МАС-адрес. ifAdminStatus – желаемый статус порта: up – готов передавать пакеты; down – не готов передавать пакеты; testing – находится в тестовом режиме. ifOperStatus – фактический текущий статус порта, имеет те же значения, что и ifAdmin-Status. ifin Octets – общее количество байт, принятое данным портом, включая служебные, с момента последней инициализации SNMP-агента. iflnUcastPkts – количество пакетов с индивидуальным адресом интерфейса, доставленных протоколу верхнего уровня. ifInNUcastPkts – количество пакетов с широковещательным или мультивещательным адресом интерфейса, доставленных протоколу верхнего уровня. ifinDiscards – количество пакетов, которые были приняты интерфейсом, оказались корректными, но не были доставлены протоколу верхнего уровня, скорее всего из-за переполнения буфера пакетов или же по иной причине. ifinErrors – количество пришедших пакетов, которые не были переданы протоколу верхнего уровня из-за обнаружения в них ошибок.

Существует несколько стандартов на базы данных управляющей информации для протокола SNMP. Основные – стан-  дарты MIB-I и MIB-II и версия базы данных для удаленного управления RMON MIB. Спецификация MIB-I определяла только операции чтения значений переменных. Операции изменения или установки значений объекта являются частью спецификаций MIB-II.  Версия MIB-I определяет порядка 114 объектов, которые подразделяются на 8 групп.  System – общие данные об устройстве (например, идентификатор поставщика, время последней инициализаКаждый объект в дереве значений SNMP определяетции системы). ся с помощью уникального идентификатора OID (Object ID).  Interfaces – параметры сетевых интерфейсов устройс- OID можно представить либо в числовом виде (то есть в том тва (например, их количество, типы, скорости обмена, виде, который использует SNMP), либо в текстовом, с исмаксимальный размер пакета). пользованием MIB-файлов. Следует также отметить, что су Address Translation Table – описание соответствия меж- ществуют базы MIB от различных производителей как апду сетевыми и физическими адресами (например, по паратного, так и программного обеспечения, которые позпротоколу ARP). воляют представлять числовые значения параметров сво Internet Protocol – данные протокола IP (адреса IP-шлю- их SNMP-агентов в символьном виде. Формат MIB-файлов зов, хостов, статистика о IP-пакетах). описан в RFC-1212 [3].  ICMP – данные протокола обмена управляющими сообСоставное числовое имя объекта SNMP MIB соответсщениями ICMP. твует полному имени этого объекта в дереве регистрации  TCP – данные протокола TCP (например, о TCP-соеди- объектов стандартизации ISO. нениях). Пространство имен объектов ISO имеет древовидную ие UDP – данные протокола UDP (число переданных, при- рархическую структуру. От корня этого дерева отходят три нятых и ошибочных UDP-дейтаграмм). ветви, соответствующие стандартам, контролируемым ISO,  EGP – данные протокола обмена маршрутной информа- ITU и совместно ISO-ITU. В свою очередь, организация ISO цией Exterior Gateway Protocol (число принятых с ошиб- создала ветвь для стандартов, создаваемых национальныками и без ошибок сообщений). ми и международными организациями (ветвь оrg). Объекты любых стандартов, создаваемых под эгидой ISO, однозначно В версии MIB-II был расширен набор стандартных объ- идентифицируются составными символьными именами, наектов, а число групп увеличилось до 10. В число объектов, чинающимися от корня этого дерева. В сообщениях протокоописывающих каждый конкретный интерфейс устройства, лов символьные имена не используются, а применяются одвключены следующие: нозначно соответствующие им составные числовые имена.  ifType – тип протокола, который поддерживает интер- Каждая ветвь дерева имен объектов нумеруется в дереве цефейс. Этот объект принимает значения всех стандарт- лыми числами слева направо начиная с единицы, и эти чисных протоколов канального уровня, например rfc877-x25, ла и заменяют символьные имена. Поэтому полное символьethernet-csmacd, iso88023-csmacd, iso88024-tokenBus, ное имя объекта MIB имеет вид: iso.org.dod.intemet.mgmt.mib, iso88025-tokenRmg и т. д. a полное числовое имя: 1.3.6.1.2.1 (см. рис. 2).

66


сети Таким образом, искомые значения можно получить, обратившись к соответствующим ветвям MIB с помощью числовых имен. На практике это выглядит следующим образом, для того чтобы получить информацию о наименовании устройства необходимо обратиться к следующей ветке MIB iso.org.dod.intemet.mgmt.mib.system.sysName, а в числовом представлении это будет выглядеть так 1.3.6.1.2.1.1.5.

Ловушки Еще одним важным понятием являются Traps, или ловушки, реагирующие на определенные события отправкой сообщений управляющей системе. Какая информация отправляется управляющей системе в сообщении Trap? Посылаются следующие данные:  Uptime устройства в виде пары: соответствующий OID uptime, значение. То есть время, которое прошло с момента включения устройства.  OID, содержащий информацию о произошедшем событии.  Любые пары OID и его значение, которые могут дать дополнительную информацию. Например, когда коммутатор отправляет сообщение о подключении по протоколу Telnet, он также передаёт OID, содержащий информацию о том, с какого IP-адреса, с какого и на какой порт было осуществлено подключение и OID, идентифицирующий сессию. Информация, переданная в данном уведомлении Trap, будет выглядеть следующим образом (см. рис. 3). Расшифровав это уведомление Trap (сообщение SNMP) с помощью базы MIB для коммутаторов Cisco, можно получить OID и их значения в символьном виде. Например, идентификатор .1.3.6.1.4.1.9.2.9.3.1.1 в символьном виде будет представлен так: .iso.org.dod.internet.private.enterprises.cisco. local.lts.ltsLineSessionTable.ltsLineSessionEntry.tslineSesType, и содержать значение 5. Из описания данного OID узнаем, что это telnet(5), тип сессии Телнет. Также уведомления Trap весьма полезны при различных внештатных ситуациях, например, отключения порта на коммутаторе или маршрутизаторе.

Симулятор SNMP Для лучшего понимания теоретических основ функционирования протокола SNMP можно воспользоваться специальным симулятором Advent Net, испытательную версию которого можно загрузить по адресу [6]. Данный симулятор позволяет воспроизвести точную копию различных устройств, как управляющих (MIB-браузер, Trap Recorder), так и управляемых (Agent Simulator, Trap Stormer) с поддержкой протокола SNMP, причем компоненты AdventNet можно использовать и при тестировании взаимодействия с реальными устройствами. Например, можно, включив на маршрутизаторе поддержку SNMP, получать уведомления Trap с помощью Trap Recorder и конфигурировать элементы Management Information Base через MIBбраузер. И наоборот, отправлять уведомления Traps из Trap Stormer и получать их с помощью Perl-сценариев, о которых речь пойдет далее. Следует также сказать несколько слов о поддержке MIB в Advent Net. Симулятор содержит целый

№3, март 2006

Рисунок 2. Древовидная структура MIB

Рисунок 3. Внешний вид сообщения SNMP

ряд баз для различных агентов, в частности имеется MIB для оборудования Cisco, протоколов маршрутизации OSPF и BGP, операционной системы Windows.

Настраиваем оборудование Прежде чем приступить к настройке SNMP на конкретном управляемом устройстве, необходимо определиться с топологией сети, в которой находятся управляемое устройство и сервер управления SNMP. Как уже упоминалось, данный протокол использует UDP. В связи с этим следует отметить, что при использовании технологии NAT (Network Address Translation) или соединения через VPN-канал между управляющим устройством и сервером управления могут возникнуть трудности с прохождением SNMP-сообщений. Также необходимо позаботиться о том, чтобы в соответствующих списках доступа для портов 161 и 162 (SNMP Traps) был разрешен UDP-трафик. Приступим к настройке работы SNMP на управляемом устройстве. На некоторых видах оборудования, таких как аппаратные принт-сервера, ADSL-модемы, а также в некоторых операционных системах, агент SNMP включен по умолчанию. Поэтому мы рассмотрим процедуру настройки взаимодействия по протоколу SNMP на маршрутизаторах Cisco. Данные настройки осуществляются довольно просто. В режиме конфигуратора необходимо ввести: snmp-server community <community_name> RO <access-list> snmp-server enable traps snmp-server host <host_address>

67


сети Значения первых четырех параметров, как правило указываются при первом конфигурировании устройства и заsysDescr Cisco Router тем остаются неизменными, а последние три являются счетsysContact SysAdmin чиками и постоянно изменяются. sysName Core router Как уже упоминалось, приведенный здесь сценарий позsysLocation Wiring closet воляет получать информацию через веб-интерфейс, создаipInDelivers 12991 вать странички «на лету», то есть является CGI-сценарием. ipInReceives 23632 Не увлекаясь особо веб-программированием, будем вывоipInAddrErrors 246 дить эти значения в виде таблицы. Общий алгоритм работы сценария следующий, устанавливаем SNMP-сессию, в коПервая команда определяет community или «сообщест- торой запрашиваем нужные ветки MIB. Затем полученные во», представляющее строку, используемую в процессе до- значения преобразовываются и выводятся на экран. ступа к устройству. На многих устройствах по умолчанию Листинг 1. Взаимодействие по протоколу SNMP это public. Однако лучше придумать название подлиннее и посложнее, дабы те, кому не положено, не смогли даже #!/usr/bin/perl # Первая строка – путь к интерпретатору Perl просмотреть значения MIB для данного устройства. use SNMP_Session; Второй параметр RO – это уровень доступа Read Only, use BER; # Эти две библиотеки можно найти в исходных кодах к статье существует также уровень доступа, позволяющий запись use strict; (RW), однако настоятельно рекомендую без особой необхо# Объявляем основную процедуру, выводящую значения димости не давать такого доступа, так как это может при# параметров на экран вести к самым неприятным последствиям, вплоть до полsub snmp_get($@); ной потери рабочей конфигурации. $SNMP_Session::suppress_warnings = 1; Наконец, третий параметр – это номер Access-list, списmy $ipv4_only_p = 0; ка доступа, который определяет, кому разрешен доступ my $snmp_version = 1; к данному управляемому устройству. Этот параметр не яв# По умолчанию используется версия 1 my $hostname = '172.17.39.1'; # управляемое устройство ляется обязательным, если его не указывать, то сообщеmy $community = 'admin12345'; # SNMP community ния об ошибке не будет, но для ограничения безопасности my %ugly_oids = qw( sysDescr 1.3.6.1.2.1.1.1.0 access-list необходим [1]. sysContact 1.3.6.1.2.1.1.4.0 Вторая команда включает Trap, то есть SNMP-сообщеsysName 1.3.6.1.2.1.1.5.0 sysLocation 1.3.6.1.2.1.1.6.0 ние, являющееся реакцией на событие или изменение соipInDelivers 1.3.6.1.2.1.4.9.0 стояния. В данном примере мы будем получать отклики обо ipInReceives 1.3.6.1.2.1.4.3.0 ipInAddrErrors 1.3.6.1.2.1.4.5.0 всех событиях на управляемом устройстве. ); Третья команда определяет SNMP-сервер, на который # объекты MIB (OID) в числовом виде my %pretty_oids; будут отправляться уведомления Trap. Итак, мы сконфигурировали SNMP на маршрутизаторе foreach (keys %ugly_oids) { $ugly_oids{$_} = encode_oid (split (/\./, $ugly_oids{$_})); Cisco, теперь посмотрим, как можно с помощью сценари$pretty_oids{$ugly_oids{$_}} = $_; ев Perl обратиться к управ��яемому устройству и получить } # в цикле преобразовываем OID необходимую информацию. Таблица 1. SNMP Management Monitor

Программная реализация Рассмотрим пример, позволяющий выполнить основные операции взаимодействия с управляемым устройством. Исходный код, а также библиотеки, которые были взяты за основу при написании сценариев, можно загрузить по адресу [5]. Однако эти исходные коды были немного доработаны и теперь позволяют получать информацию через веб интерфейс, так что не забудьте подправить путь к интерпретатору Perl в первой строке сценария. Итак, попробуем прочитать значения следующих объектов MIB (для простоты воспользуемся MIB RFC 1213), находящихся в ветках iso.org.dod.intemet.mgmt.mib.system и iso.org.dod.intemet.mgmt.mib.ip:  sysDescr – описание системы;  sysContact – контактная информация;  sysName – наименование системы;  sysLocation – расположение устройства;  ipInDelivers – сколько IP-пакетов отправлено;  ipInReceives – сколько IP-пакетов получено;  ipInAddrErrors – сколько пакетов с неверными адресами.

68

srand(); # устанавливаем SNMP-сессию my $session = ($snmp_version == 1) ? SNMPv1_Session->open ($hostname, $community, 161, ↵ undef, undef, undef, undef,undef, $ipv4_only_p) : SNMPv2c_Session->open ($hostname, $community, 161, ↵ undef, undef, undef, undef, undef, $ipv4_only_p) or die "Couldn’t open SNMP session to $hostname: ↵ $SNMP_Session::errmsg"; # ошибка, если не удалось установить SNMP-сессию snmp_get ($session, qw(sysDescr sysContact sysName ↵ sysLocation ipInDelivers ipInReceives ipInAddrErrors)); $session->close (); sub snmp_get ($@) { my($session, @oids) = @_; my($response, $bindings, $binding, $value, $oid); grep ($_ = $ugly_oids{$_}, @oids); my $interf=''; my $stroka=''; if ($session->get_request_response (@oids)) { $response = $session->pdu_buffer; ($bindings) = $session->decode_get_response ($response); print "Content-type: text/html\n\n"; print "<html> <title> SNMP Management monitor ↵ </title> <body> <center><b> SNMP ↵ Management Monitor ↵ </b><hr><table cellpadding=1 ↵ cellspacing=1 border=2>"; while ($bindings ne '') { ($binding, $bindings) = decode_sequence ↵ ($bindings);


сети ($oid, $value) = decode_by_template ↵ ($binding, "%O%@"); print "<tr><td bgcolor=yellow><b>", ↵ $pretty_oids{$oid}, " </b></td> "; $stroka= pretty_print($value); print '<td bgcolor=magenta><b>',$stroka, ↵ '</b></td></tr>';

}

} print "</table></body></html>"; } else { warn "SNMP problem: $SNMP_Session::errmsg\n"; }

В результате работы данного сценария получаем таблицу, содержащую значения параметров MIB (см. таблицу 1). Данный сценарий вполне можно использовать на практике. Например, для получения информации о состоянии того или иного устройства на текущий момент времени. Однако при добавлении OID своего устройства необходимо убедиться, что управляемое устройство их поддерживает (например, с помощью MIB-браузера), так как в противном случае сценарий вернет ошибку выполнения. Приведем еще один фрагмент сценария, который осуществляет прием сообщений Trap. Общий алгоритм работы аналогичен предыдущему, поэтому приведу лишь ту часть сценария, которая касается собственно получения сообщений. Листинг 2. Получение SNMP Traps … # заголовок и объявление библиотек my $trap_session = SNMPv1_Session->open_trap_session () or die "cannot open trap session"; my ($trap, $sender_addr, $sender_port) = ↵ $trap_session->receive_trap () or die "cannot receive trap"; my ($community, $enterprise, $agent, $generic, $specific, $sysUptime, $bindings) = $trap_session->decode_trap_request ($trap) # устанавливаем trap session or die "cannot decode trap received" … # команды, связанные с получением сообщения, … # аналогичные предыдущему листингу my ($binding, $oid, $value); while ($bindings ne ‘’) { ($binding,$bindings) = &decode_sequence ($bindings); ($oid, $value) = decode_by_template ($binding, "%O%@"); # декодируем полученное сообщение print BER::pretty_oid ($oid)," => ", ↵ pretty_print ($value); # выводим ветку MIB и значение в строковом формате %mail = ( To => 'admin@mynetwork.ru', From => 'snmptrap@mynetwork.ru', Message => "SNMP trap received:".$bindings, SMTP => '10.0.1.2' ); sendmail(%mail) or die $Mail::Sendmail::error; # письмо администратору } # здесь собственно производится прием сообщений Trap, # для того чтобы получать эти сообщения постоянно, # необходимо использовать бесконечный цикл, # который прерывается при нажатии любой клавиши While (@_='') { my ($trap, $sender_addr, $sender_port) = ↵ $trap_session->receive_trap () or die "cannot receive trap"; }

В результате получим содержимое сообщений SNMP Trap, которые пришли от управляемых устройств.

№3, март 2006

Например, вот так будет выглядеть сообщение SNMP, которое прислал коммутатор после отключения его интерфейса. .1.3.6.1.2.1.2.2.1.2.4 STRING FastEthernet0/4 .1.3.6.1.3.1.9.2.2.1.1.20.4 STRING LostCarrier

А так выглядит SNMP Trap, сообщающий о том, что интерфейс включен: .1.3.6.1.2.1.2.2.1.2.3 STRING FastEthernet0/3 .1.3.6.1.4.1.9.2.2.1.1.20.3 STRING up

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

Заключение В завершении хотелось бы отметить ряд моментов. Прежде всего, следует обратить внимание на то, что у многих крупных производителей имеются свои базы MIB и для более эффективного использования возможностей SNMP лучше использовать MIB для оборудования конкретного производителя. Для поиска баз MIB воспользуйтесь сайтом MIBSearch.com. Что же касается активного сетевого оборудования Cisco, то на CPAN.org можно найти множество Perl-сценариев для взаимодействия по протоколу SNMP, а также сценариев, осуществляющих разбор SNMP-сообщений для конкретных событий, например для событий, связанных с протоколами динамической маршрутизации, потерей пакетов, состоянием VLAN и так далее. Также, возможно, у вас сложилось впечатление, что протокол SNMP на практике использует только активное сетевое оборудование, канального и сетевого уровней, c встроенным программным обеспечением, однако это не так. К примеру, некоторые виды программного обеспечения, такие как корпоративные антивирусные системы, активно используют уведомления Trap для оповещения о вирусных инцидентах и эпидемиях. Также SNMP используют системы резервного копирования и системы бесперебойного питания. Так что данный протокол полезен не только для организации систем управления сетевым оборудованием, но и для решения повседневных задач системного администрирования.

Литература, ссылки: 1. Основы организации сетей Cisco. Справочное руководство. 2. www.opennet.org – интернет-ресурс со множеством статей и примеров, посвященных реализации SNMP на различных устройствах. 3. www.ietf.org – ресурс содержит все стандарты RFC, в том числе и RFC 1212, 1213. 4. www.CPAN.org – ресурс, на котором можно найти большое количество исходных кодов Perl-сценариев для работы с SNMP. 5. http://www.switch.ch/misc/leinen/snmp/perl/dist – исходный код, а также библиотеки, использованные при написании сценария. 6. http://www.adventnet.com/products/simulator – дистрибутив симулятора SNMP.

69


программирование

Переход от VBScript к ASP и ASP.NET Часть II: дописываем Framework на примере сетевых папок

Иван Коробко Программисты Microsoft, создававшие Framework, явно не ориентировались на системных и сетевых программистов, поэтому в нем отсутствуют функции по управлению DFS, сетевыми папками и т. д. Рассмотрим возможные пути решения возникших проблем.

К

сожалению, в Microsoft Framework отсутствуют функции по управлению DFS, сетевыми папками и т. д. Возникает вопрос – а как же решить данную проблему, ведь, например, в VBScript можно было без особых усилий управлять сетевыми папками (Shared Folders). Неужели в VB.NET это невозможно сделать? Существует два варианта: адаптировать сценарий на VBScript под VB.NET или, используя WIN API-функ-

70

ции, дописать Framework по своему ус- нению с VBScript. Однако стоит учесть, что скорость работы адаптированных мотрению. сценариев оставляет желать лучшего, по сравнению с API-функциями. ИсWINAPI, или адаптация VBScript пользование API-функций – занятие Рассмотрим преимущества и недостат- трудоемкое и требует много внимания, ки предлагаемых вариантов. Если гово- поскольку в MSDN приведены описарить о трудоемкости, то предпочтитель- ния функций, годящиеся для VB, а как ным является, конечно же, первый вари- известно, типы данных VB и VB.NET ант, поскольку все ограничивается под- не совпадают, так что придется занятьключением библиотеки и незначитель- ся их преобразованием. Это еще не все. ным изменением синтаксиса, по срав- Для простоты написанный програм-


программирование мный код рекомендуется поместить в отдельную библиотеку, которую опять же, чтобы использовать, необходимо подключить к проекту и вызывать нужную функцию. Итак, если для вас скорость не критична и не хочется тратить время – выбирайте адаптацию скрипта под VB.NET, если же есть желание отмучиться один раз, создав библиотеку, и каждый раз наслаждаться высокой скоростью работы созданных приложений – вам придется использовать API-функции.

Сетевые папки: от VBScript к VB.NET С сетевыми папками можно проделывать следующие операции:  предоставлять к папкам доступ из сети;  удалять сетевые папки;  просматривать свойства выбранной сетевой папки;  получать список доступных сетевых папок на указанном компьютере.

Таблица 1. Свойства сетевой папки Параметр

Описание

MaxUserCount

Максимальное число подключенных пользователей

AdsPath

ADsPath – сетевой путь к ресурсу

Class

Имя класса, к которому принадлежит объект. Для сетевой папки имя класса – «FileShare»

CurrentUserCount

Число пользователей, подключенных к сетевой папке в настоящее время

Description

Описание сетевого ресурса

GUID

Уникальный идентификатор ресурса

Name

Имя ресурса

Parent

Путь в формате AdsPath родительского объекта

Path

Системный путь к ресурсу, например «c:\folder»

Scheme

Путь в формате AdsPath к схеме класса

 в VB.NET отсутствуют операторы SET и LET (все отли-

чия синтаксиса подробно описаны в статье «Переход от VBScript к VB.NET»). Рассмотрим пример создания сетевой папки на VBScript (см. пример 1). Пример можно разделить условно на две логические части: в первой из них осуществляется проверка Текст примера, в котором создается заданный каталог, существования папки с помощью объекта FSO. В том слу- в случае его отсутствия выглядит следующим образом: чае, если папки нет, она создается. Во второй части предо' Объявление константы ставляют сетевой доступ к существующей папке, для чего Dim PathToFolder As String = "C:\Test" необходимо указать несколько обязательных параметров: Dim fso As New Scripting.FileSystemObject имя компьютера, путь к папке, название папки в сети. ПолIf fso.FolderExists(PathToFolder) = False Then ный список и описания параметров см. в таблице 1. fso.CreateFolder(PathToFolder) Пример 1. Создание сетевой папки на VBScript ' Обработчик ошибок On Error Resume Next ' Объявление констант PathToFolder="С:\Test" ShareName="Test" ObjectType="Fileshare" MaxUsers=10 ' Проверка существования каталога set fso=wscript.createobject("Scripting.FileSystemObject") If fso.FolderExists (PathToFolder)=False then set o=fso.createfolder(PathToFolder) end If ' Определение имени текущего компьютера Set WSHNetwork = CreateObject("WScript.Network") PCName=WSHNetwork.ComputerName ' Создание объекта Set ShareServiceObj = GetObject("WinNT://"+PCName+ ↵ "/LanManServer") set NewShare = ShareServiceObj.Create(ObjectType,ShareName) NewShare.Path = PathToFolder NewShare.MaxUserCount = MaxUsers NewShare.SetInfo ' сохранение изменений в файловую ' систему

При переводе данного примера на VB.NET необходимо прежде всего подключить две библиотеки: «Microsoft Scripting Runtime» и «Active DS Type Library».

Управление файловой системой Для управления файловой системой в VBScript используется объект FSO, содержащийся в библиотеке «Microsoft Scripting Runtime», подключаемый через свойства проекта. Поскольку в VB.NET в отличие от VBScript необходимо:  объявлять и указывать соответствующий им тип данных;

№3, март 2006

End If

Если использовать объект Microsoft.VisualBasic.FileIO. FileSystem, относящийся к стандартным, то пример создания заданного каталога выглядит так: ' Объявление константы Dim PathToFolder As String = "C:\Test" ' Проверка существования каталога Dim fso As New Microsoft.VisualBasic.FileIO.FileSystem If fso.DirectoryExists(PathToFolder) = False Then fso.CreateDirectory(PathToFolder) End If

Определение имени текущего компьютера Как говорилось ранее, для создания сетевой папки необходимо указать несколько обязательных параметров, среди которых имя компьютера. В том случае, если предоставляется сетевой доступ к локальной папке, то имя компьютера можно определить как с помощью объекта Wscript.Network: Dim Temp As New WshNetwork Dim PCName As String = Temp.ComputerName

так и с помощью встроенной функции в VB.NET: Dim PCName As String = My.Computer.Name

Создание сетевой папки Для этого необходимо определить обязательные параметры: локальный путь и название папки в сети, тип создаваемого объекта. Оба этих параметра – строки (string):

71


программирование Dim PathToFolder As String = "C:\Test" Dim ShareName As String = "Test" Dim ObjectType As String = "FileShare"

Также используем один необязательный параметр – MaxUserCount, указывающий максимальное количество пользователей, которое может одновременно обращаться к сетевому ресурсу (см. таблицу 1). Тип этого параметра – число (integer): Dim MaxUsers As Integer = 10

После объявления констант необходимо получить доступ к объекту LanManServer, в данном случае – локального компьютера с помощью функции GetObject(). Подключенная библиотека хранит процедуры и функции в объекте ActiveDS, пространство имен которого можно импортировать в создаваемый проект с помощью команды Imports: Imports ActiveDS

Для удобства восприятия не будем использовать импорт пространства имен, а каждый раз в примере будем разыменовывать объект. Итак, пишем: Dim con As ActiveDS

и в отображаемой нам оболочкой VB.NET подсказкой в свойствах класса не находим функцию GetObject(). Для решения вопроса обратимся к поисковой системе MSDN (http://msdn.microsoft.com), задав в качестве критерия «ActiveDS, GetObject». Среди найденных страниц остановимся на ссылке «IADsContainer::GetObject», в которой приведен пример чтения объекта (см. рис. 1). Приняв его за основу, адаптируем его под нашу задачу: Dim ShareServeceObj As ActiveDs.IADsContainer ShareServeceObj = GetObject("WinNT://" + PCName + ↵ "/LanManServer")

Рисунок 1. Свойства объекта в MSDN

72

или, что то же самое: Dim ShareServeceObj As ActiveDs.IADsContainer = ↵ GetObject("WinNT://" + PCName + "/LanManServer")

Аналогично адаптируем строку создания объекта типа FileShare и назначаем объекту необходимые свойства. Запись сделанных изменений так же, как и в VBScript, осуществляется с помощью метода SetInfo: ' Создание объекта Dim ShareServeceObj As ActiveDs.IADsContainer = ↵ GetObject("WinNT://" + PCName + "/LanManServer") Dim NewShare As ActiveDs.IADsFileShare = ↵ ShareServeceObj.Create(ObjectType, ShareName) NewShare.Path = PathToFolder NewShare.MaxUserCount = MaxUsers NewShare.SetInfo() ' сохранение изменений в файловую ' систему

Теперь необходимо создать обработчик ошибок, чтобы созданное приложение выдавало сообщение, например, о том, что создаваемая сетевая папка уже существует. Для этого рекомендуется использовать встроенную процедуру «Try … End Try». Ее шаблон выглядит следующим образом: Try ' Тестируемый программный код Catch ex As Exception MsgBox(ex.Message) End Try

Таким образом, полный вариант текста адаптированного сценария создания сетевой папки выглядит следующим образом: Try

' Объявление констант Dim PathToFolder As String = "C:\Test" Dim ShareName As String = "Test" Dim ObjectType As String = "FileShare" Dim MaxUsers As Integer = 10 ' Проверка существования каталога Dim fso As New Microsoft.VisualBasic.FileIO.FileSystem


программирование If fso.DirectoryExists(PathToFolder) = False Then fso.CreateDirectory(PathToFolder) End If ' Определение имени текущего компьютера Dim PCName As String = My.Computer.Name ' Создание объекта Dim ShareServeceObj As ActiveDs.IADsContainer = ↵ GetObject("WinNT://" + PCName + "/LanManServer") Dim NewShare As ActiveDs.IADsFileShare = ↵ ShareServeceObj.Create(ObjectType, ShareName) NewShare.Path = PathToFolder NewShare.MaxUserCount = MaxUsers NewShare.SetInfo() ' сохранение изменений в файловую ' систему Catch ex As Exception MsgBox(ex.Message) End Try

Использование WIN API-функций С помощью API-функций программисту предоставляется возможность доступа ко всему многообразию функций ОС на низком уровне. Это обозначает, что скорость работы и функционал создаваемого приложения увеличится. Итак, для начала вспомним действия, которые можно осуществлять с сетевыми папками, и приведем в таблице 2 соответствующие им процедуры, хранящиеся в библиотеке Netapi32.dll (http://msdn.microsoft.com/library/default.asp?url= /library/en-us/stgmgmt/fs/netsharesetinfo.asp). Рассмотрим подробно, как и в предыдущем разделе, процесс создания сетевой папки, а остальные функции приведем в приложении.

Маршалинг вызова функций Все данные, используемые в среде VB.NET, являются управляемыми, то есть их расположением в памяти управляет среда исполнения .NET. Обычная DLL-библиотека ничего не знает о среде исполнения и типах данных, которые используются. Чтобы установить отсутствующую связку, в игру вступает процесс, называемый маршалингом (marshal (англ.) – располагать в определенном порядке, размещать). Этот процесс позволяет перенести вызов из среды .NET на уровень операционной системы, непосредственно к самим библиотекам. Вызов функции из DLL осуществляется следующим образом:  поиск указанной в запросе библиотеки;  загрузка DLL в память;  поиск необходимой функции;  перенос параметров в стек и преобразование типов (например, из String в LTPSTR) – этот процесс и называется маршалингом;  вызов функции из DLL;  анализ возвращаемых значений и обработка ошибок  приведение типов возвращаемых значений к типам .NET.

Объявление функции Синтаксис объявления функций следующий: Declare Unicode Function NetDfsGetInfo Lib "***.DLL" (ByVal[ByRef] ParametrName As TypeOfData,…) As Integer

№3, март 2006

Таблица 2. Используемые функции WIN API для управления сетевыми папками Действие

Функция

Предоставить папку в сетевой доступ

NetShareAdd

Удалить сетевую папку

NetShareDel

Просмотреть/изменить свойства выбранной сетевой папки

NetShareGetInfo/NetShareSetInfo

Сформировать список имеющихся сетевых папок на компьютере

NetShareEnum

Таблица 3. Преобразование типов для функций Структура в MSDN

Описание в VB.NET

LPTSTR a LMSTR a

ByVal … As String

LPWSTR a LPBYTE a

ByRef … As StructName

LPBYTE a

ByRef … As IntPtr

DWORD a

ByVal … As Integer

LPWORD a

ByRef … As Integer

TCHAR a

<MarshalAs(UnmanagedType.Struct)> byRef … As String

Таблица 4. Преобразование типов для структур Структура в MSDN LPCWSTR a LMSTR a

Описание в VB.NET Public a as String

LPWSTR a

<MarshalAs(UnmanagedType.LPWStr)> Dim a As String

TCHAR a[128]

<VBFixedString(128), MarshalAs( _ UnmanagedType.ByValTStr, SizeConst:=128)> _ Public szCSDVersion As String

BYTE a

Public a as Byte

FILEOP_FLAGS a

Public a as Short

BOOL a

Public a as Boolean

LPVOID a UINT a LONG a

Public a as Integer

HWND a WORD a

Public a as Int16 или Integer

DWORD a

Public a as Int32 или Integer

LPStructureName Storage

Public a as IntPtr

Необходимо помнить, что, указывая название функции, следует различать большие и маленькие буквы. Поскольку в MSDN декларирование функций приведено для VB, а типы данных VB и VB.NET значительно отличаются, то для корректного объявления функций не обойтись без таблицы 3.

Описание структуры Синтаксис объявления структур, используемых функциями, следующий: <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _ Public Structure OSVERSIONINFOEX … End Structure

Функция всегда возвращает код ошибки, а манипуляция с данными осуществляется через память чтением или запи-

73


программирование Вызов API-функции, осуществляющей запись в структуру Рассмотрим такую функцию на примере создания сетевой папки с помощью NetShareAdd, которая объявляется следующим образом: Рисунок 2. Описание функции NetShareCheck в MSDN

Рисунок 3. Описание структуры _SHARE_INFO_2 в MSDN

сью данных в структуру. Описание структур в MSDN также требует адаптации для VB.NET (см. таблицу 4).

Вызов функции Синтаксис вызова функции зависит от нескольких факторов. Рассмотрим некоторые из возможных вариантов.

Вызов API-функции, не обращающейся к структуре Примером такой функции является API-функция NetShare Check, с помощью которой определяют статус сетевой папки. На первом этапе необходимо объявить функцию, воспользовавшись MSDN, задав в качестве искомого слова «NetShareCheck» (см. рис. 2), и таблицей 3: Declare Unicode Function NetShareCheck Lib "NETAPI32.DLL" ↵ (ByVal servername As String, ByVal device As String, ↵ ByRef type As Integer) As Integer

В обработке какого-либо события, например нажатия на кнопку, осуществляется вызов функции: Private Sub Button1_Click(ByVal sender As System.Object, ↵ ByVal e As System.EventArgs) Handles Button1.Click Dim server As String = "\\ComputerName" Dim share As String = "c:\FolderName" Const STYPE_DISKTREE = 0 Dim err_description As String = "" Dim err_code As Integer err_code = NetShareCheck(server, share, ↵ STYPE_DISKTREE) else

if err_code = 0 then err_description = "Shared Folder Status: OK " err_description = "Shared Folder Exist: Error" end if MsgBox(err_description)

End Sub

В приведенном примере функция не передает никаких данных.

74

Declare Unicode Function NetShareAdd Lib "NETAPI32.DLL" ↵ (ByVal servername As String, ByVal level As Integer, ↵ ByRef buf As _SHARE_INFO_2, ↵ ByRef parm_err As Integer) As Integer

Если обратить внимание на описание этой функции в MSDN, то видно, что она при декларировании может ссылаться на одну из структур. В приведенном примере используется структура _SHARE_INFO_2. Также необходимо описать в тексте VB-файла структуру _SHARE_INFO_2. Воспользовавшись поиском в MSDN найдем ее описание (см. рис. 3) и таблицей 4, корректно опишем структуру в VB-файле VB.NET проекта: <StructLayout(LayoutKind.Sequential, ↵ CharSet:=CharSet.Auto)> _ Public Structure _SHARE_INFO_2 <MarshalAs(UnmanagedType.LPWStr)> ↵ Public shi2_netname As String Public shi2_type As Int32 <MarshalAs(UnmanagedType.LPWStr)> ↵ Public shi2_remark As String Public shi2_permissions As Int32 Public shi2_max_uses As Int32 Public shi2_current_uses As Int32 <MarshalAs(UnmanagedType.LPWStr)> ↵ Public shi2_path As String <MarshalAs(UnmanagedType.LPWStr)> ↵ Public shi2_passwd As String End Structure

Перед тем как выполнить обращение к функции необходимо присвоить членам, описанным в структуре, соответствующие значения: Dim a As _SHARE_INFO_2 a.shi2_max_uses = 100 a.shi2_netname = "123" a.shi2_path = "c:\123"

Затем осуществляется вызов функции, с указанием необходимых параметров: Dim server As String = "\\1230pc" Dim err_code As Integer err_code = NetShareAdd(server, 2, a, Nothing)

Если все типы данных объявлены корректно, то функция возвратит 0, если же нет, необходимо воспользоваться MSDN для определения по коду ошибки ее описания ссылкой (http://msdn.microsoft.com/library/default.asp?url=/library/ en-us/debug/base/system_error_codes.asp). Полный вариант текста вызова функции приведен ниже: Private Sub Button1_Click(ByVal sender As System.Object, ↵ ByVal e As System.EventArgs) Handles Button1.Click Dim a As _SHARE_INFO_2 a.shi2_max_uses = 100 a.shi2_netname = "123" a.shi2_path = "c:\123" Dim server As String = "\\1230pc"


программирование Dim err_description As String = "" Dim err_code As Integer err_code = NetShareAdd(server, 2, a, Nothing) Select Case err_code Case 0 err_description = "Share Folder Was Created" Case 2 err_description = "Folder Not Found" Case 2118 err_description = "Share Folder Is Exist" End Select MsgBox(err_description) End Sub

Вызов API-функции, осуществляющей чтение данных из структуры Проиллюстрировать данный случай лучше всего на примере функции NetShareGetInfo. Обратите внимание на декларирование этой функции в MSDN: последний параметр является ссылкой на данные, хранящиеся в памяти, который имеет в VB.NET тип IntPtr. При вызове функции осуществляется обращение к структуре и обработка полученных данных. Итак, объявление этой функции в VB.NET выглядит следующим образом: Declare Unicode Function NetShareGetInfo ↵ Lib "NETAPI32.DLL" (ByVal servername As String, ↵ ByVal netname As String, ByVal level As Integer, ↵ ByRef bufptr As IntPtr) As Integer

Для использования этой функции необходимо описать соответствующую структуру и указать соответствующий ей номер в качестве значения параметра level. Поскольку, как и в прошлом случае будет использована структура _SHARE_INFO_2, то пропустим часть, в которой осуществляется ее декларирование. Данные считываются по следующему алгоритму: сначала осуществляется вызов функции: Dim server As String = "\\1230pc" Dim share As String = "123" Dim err_code As Integer Dim bufPtf As IntPtr err_code = NetShareGetInfo(server, share, 2, bufPtf)

Рисунок 4. Задаем пространство имен динамической библиотеки Case 0 MsgBox(b.shi2_netname) Case 2310 err_description = "Share Is Not Found" MsgBox(err_description) End Select End Sub

Создание собственной библиотеки Для создания собственных динамических библиотек необходимо создать проект, имеющий тип Class Library. Библиотека состоит минимум из одного класса, в котором описаны функции, вызов которых и осуществляется из внешних программ: Imports … Public Class ClassName1 Public Function Function1(ByVal Type As Integer, …) ↵ As String End Function Public Function Function2(ByVal Type As Integer, …) ↵ As Object End Function Function Function1(ByVal Type As Integer, …) As ↵ String End Function

… End Class … Public Class ClassNameK … End Class

затем чтение полученных данных из памяти: Dim b As _SHARE_INFO_2 b = CType(Marshal.PtrToStructure(bufPtf, ↵ GetType(_SHARE_INFO_2)), _SHARE_INFO_2) MsgBox(b.shi2_netname)

Полный текст процедуры вызова функции приведен ниже: Private Sub ByVal Dim Dim

Button6_Click(ByVal sender As System.Object, ↵ e As System.EventArgs) Handles Button6.Click server As String = "\\1230pc" share As String = "123"

Dim err_description As String = "" Dim err_code As Integer Dim b As _SHARE_INFO_2 Dim bufPtf As IntPtr err_code = NetShareGetInfo(server, share, 2, bufPtf) b = CType(Marshal.PtrToStructure(bufPtf, ↵ GetType(_SHARE_INFO_2)), _SHARE_INFO_2) Select Case err_code

№3, март 2006

Обратите внимание на то, что некоторые функции или даже классы можно сделать недоступными из других файлов, например сервисные функции. Чтобы достичь этого эффекта, при декларировании функции или класса необходимо пропустить слово Public. API-функции и необходимые структуры декларируются, как и в обычных проектах: в классе, но вне функции и процедур.

Определяем пространство имен Намеренно забегу вперед и расскажу об использовании библиотек, чтобы потом вам не пришлось переделывать названия классов и функций. Необходимо определиться с заданием 3-х категорий имен: основным пространством имен всей библиотеки, названиями классов и названиями функций. Рассмотрим поочередно все три категории. Предположим, что мы создали уже библиотеку и хотим ее использовать в другом проекте. Для получения доступа к библиотеке необходимо сначала подключить ее к проекту,

75


программирование а затем импортировать пространство имен. Присоединение к проекту, как описывалось ранее, осуществляется с помощью пункта меню «Add Reference…» через вкладку «File». После этого необходимо импортировать пространство имен с помощью ключевого слова Imports. Предположим, что мы хотим, чтобы пространство имен было SharedFolders, тогда команда импорта должна выглядеть так: Imports SharedFolders

Чтобы достичь этого эффекта, необходимо в проекте, где формируется библиотека, в его свойствах изменить заданное значение параметра Root namespace на желаемое, а именно на SharedFolders (см. рис. 4). Замечание: в качестве параметра Assembly name (см. рис. 4) задается название формируемой DLL-библиотеки. Названия классов, используемые при формировании библиотек, становятся доступными при импорте пространства имен данной библиотеки из другого проекта.

Формирование функций Приведу пример функции в DLL-библиотеки, создающей сетевую папку. В том случае, если папка отсутствует, то функция, в зависимости от установленного флага, будет ее создавать. Новая функция должна иметь несколько обязательных параметров:  Имя компьютера, на котором она должна быть создана.  Путь к локальной папке, которую необходимо предоставить в сетевой доступ.  Имя папки в сети. Если этот параметр не задан, то имя сетевой папки должно совпадать с физическим именем папки.  Описание сетевой папки.  Флаг: 0/1. Если значение 0 – при физическом отсутствии папки не создавать ее, 1 – создать папку, если ее нет. Конечно, количество параметров можно расширить или сократить, например, можно уменьшить их количество, объединив первые три в UNC-путь к папке (\\Server\C$\ Folder), при условии, что сетевое имя папки берет за основу ее физическое имя. Теперь придумайте название функции, например, AddShare. На первом этапе следеут объявить функцию. Первые четыре параметра имеют строковый формат, флаговое значение может быть числовым (0/1) либо булевым(True/False). В данной ситуации остановимся на булевом значении: Public Function AddShare(ByVal Server As String, ↵ ByVal Path As String, ByVal Share As String, ↵ ByVal Description As String, ByVal flag As Boolean) ↵ As Integer … End Function

Для удобства предлагается поместить операцию вызова API-функции в отдельную функцию, например _ AddShare. Чтобы она была не видна из других приложений, она должна иметь тип Private:

76

Private Function _AddShare(ByVal server As String, ↵ ByVal share As String, ByVal path As String, ↵ ByVal description As String) Dim a As _SHARE_INFO_2 a.shi2_netname = share a.shi2_path = Path a.shi2_remark = description _AddShare = NetShareAdd(Server, 2, a, Nothing) End Function

Рассмотрим тело основной функции. Поскольку условились, что будем проверять булевое значение, то необходимо с помощью объекта FSO проверить наличие каталога, при указанном булевом значении TRUE. В том случае, если значение равно TRUE, т.е. проверка осуществляется, то при отсутствии каталога в указанном месте он создается и предоставляется в сетевой доступ с указанными параметрами. Если же значение FALSE, то проверка на наличие каталога не осуществляется и подразумевается, что папка существует: Dim fso As Microsoft.VisualBasic.FileIO.FileSystem If flag = True Then Dim path_exist As String = "\\" + Server + ↵ "\" + Right(Path, Len(1)) + "$" + ↵ Left(Path, Len(Path - 1)) If fso.DirectoryExists(path_exist) = False Then fso.CreateDirectory(path_exist) AddShare = _AddShare(Server, Share, ↵ Path, Description) End If Else AddShare = _AddShare(Server, Share, ↵ Path, Description) End If

Полный листинг см. на сайте журнала в разделе «Исходный код».

Вызов созданной функции из библиотеки Создав и скомпилировав библиотеку, необходимо проверить работоспособность всех функций библиотеки, создав тестовый проект и подключив к нему скомпилированную в DLL-файл библиотеку. В форме нового проекта создадим кнопку, назвав ее, например, Add Share, и в процедуру обработки события добавим следующий текст: Dim a As SharedFolder.Manipulate Dim err_code As Integer err_code = a.AddShare("1230pc","c:\123","123", ↵ "TestFolder",True) MsgBox (err_code)

Если в появившемся диалоговом окне вы увидите 0, то на локальном диске С компьютера 1230pc в его корневом каталоге 123 создана сетевая папка 123. Проверив этот факт, можно убедиться, что скомпилированная библиотека работает корректно.

Вместо заключения Используя описанные методы, читатель сможет создавать свои библиотеки, объединяя в них часто используемые, если так можно сказать, скрипты. Благодаря этому скорость и качество программирования увеличатся. Вместе с тем он сможет использовать хоть и не быстрые, но хорошо известные и до боли знакомые функции.


bugtraq Множественные уязвимости в Mac OS X Программа: Apple Macintosh OS X. Опасность: Критическая. Описание: 1. Уязвимость существует в automount. Удаленный пользователь, контролирующий файловый сервер, может заставить уязвимую систему смонтировать файловую систему, содержащую зарезервированные адреса. Удачная эксплуатация уязвимости позволит злоумышленнику вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. 2. Обход каталога существует в BOM framework из-за ошибки при обработке некоторых архивов. Удаленный пользователь может с помощью специально сформированного архива распаковать файлы в произвольную директорию на системе. 3. Небезопасное создание временных файлов обнаружено в приложении passwd. Локальный пользователь может с помощью специально сформированной символической ссылки перезаписать произвольные файлы на системе с привилегиями пользователю root. Пример: Apple Mac OS X "/usr/bin/passwd" Binary Local Privilege ↵ Escalation (root) Exploit

4. Директории пользователя монтируются небезопасным образом при создании FileVault-образа. Удаленный пользователь может получить неавторизованный доступ к файлам. 5. Обнаружена ошибка в IPSec при обработке определенных состояний ошибок. Удаленный пользователь может аварийно завершить работу VPN-соединений. 6. Переполнение динамической памяти обнаружено в компоненте LibSystem при обработке запроса на большое количество памяти. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольный код на целевой системе. 7. Download Validation в Mail-компоненте не предупреждает пользователя об открытии небезопасного вложения при двойном щелчке по файлу. 8. Уязвимость существует из-за того, что Perl некорректно сбрасывает привилегии, если приложение использует выражение «$< = numeric_id;» для установки uid. 9. Переполнение динамической памяти обнаружено в приложении rsync при передаче расширенных атрибутов. Авторизованный пользователь может вызвать отказ в обслуживании приложения или выполнить произвольный код на целевой системе. 10. Переполнение динамической памяти обнаружено в WebKit при обработке HTML-кода. Удаленный пользователь может с помощью специально сформированной вебстраницы выполнить произвольный код на целевой системе. 11. Переполнении стека обнаружено в браузере Safari при обработке JavaScript-кода. Удаленный пользователь может с помощью специально сформированной веб-страницы, содержащей злонамеренный JavaScript, выполнить произвольный код на целевой системе. 12. Уязвимость обнаружена в модели безопасности браузера Safari при обработке HTTP-перенаправлений. Удаленный пользователь может выполнить произвольный код

№3, март 2006

сценария в браузер жертвы в контексте безопасности локального домена. 13. Ошибка в Safari в LaunchServices может позволить злоумышленнику выдать злонамеренный файл за безопасный и выполнить его на системе, если включена опция «Open safe files after downloading». 14. Межсайтовый скриптинг возможен в компоненте Syndication (Safari RSS). Удаленный пользователь может выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта. URL производителя: www.apple.com. Решение: Установите исправление с сайта производителя.

Переполнение буфера в LISTSERV Программа: LISTSERV 14.3 и 14.4, возможно более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за неизвестной ошибки при проверке границ в сценарии WA CGI. Удаленный пользователь может вызвать переполнение буфера и выполнить произвольный код на целевой системе. Подробности уязвимости не сообщаются. URL производителя: www.lsoft.com. Решение: Установите последнюю версию (14.5) с сайта производителя.

Переполнение буфера в RevilloC MailServer Программа: RevilloC MailServer 1.21, возможно другие версии. Опасность: Высокая. Описание: Уязвимость существует при обработке входных данных в команде USER в службе POP3. Удаленный пользователь может с помощью специально сформированного имени пользователя вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя : w w w.revilloc.com /mailser ver/ default.asp. Решение: В настоящее время способов устранения уязвимости не существует.

Переполнение буфера в службе IMAP в Mercur Messaging Программа: Mercur Messaging 2005 5.0 SP3 Опасность: Средняя. Описание: Уязвимость существует из-за ошибки проверки границ при обработке IMAP-команд. Удаленный пользователь может с помощью команд LOGIN и SELECT вызвать переполнение стека и выполнить произвольный код на целевой системе. URL производителя: www.atrium-software.com. Решение: В настоящее время способов устранения уязвимости не существует.

Составил Александр Антипов

77


программирование

Работаем с PDF из Perl Бытует мнение, что PDF – это закрытый формат, для работы с которым необходимо дорогостоящее ПО. Это не вполне верно: спецификация PDF доступна всем желающим, а для создания и правки файлов можно применять не только настольные издательские системы, но и сценарии Perl.

Валентин Синицын

М

одуль PDF::API2 (http://pdfapi2. sf.net) разрабатывается Альфредом Райбенщухом (Alfred Reibenschuh) и распространяется по лицензии GNU GPL. PDF::API2 написан на чистом Perl и имеет минимум зависимостей: Perl 5.8.4 или вы-

78

ше, Encode и Compress::Zlib (если что- удобным для вас способом. Последто и придется установить, то только ней на момент написания статьи верпоследний из них). Модуль использует сией была 0.51. стандартную объектную нотацию Perl 5 Поставляемая вместе с PDF::API2 и доступен как через CPAN, так и че- документация насчитывает более рез репозитарии ActiveState PPM, по- 160 страниц, большая часть из котоэтому может быть установлен любым рых не имеет практической ценности.


программирование дюйма, что примерно соответствует типографскому пункту (pt). Вы можете перенести начало отсчета в другую точку (translate), повернуть оси на некоторый угол (rotate), изменить масштаб (scale) или скосить их (skew). Напомним, что порядок применения этих операций имеет значение: перенос и поворот – это совсем не то же самое, что поворот и перенос. Изменения системы координат непосредственно сказываются на выводимых объектах: так, надпись, расположенная вдоль оси X в повернутой системе координат, будет идти под некоторым углом к краю страницы. Если система координат была перенесена на N пунктов влево и M пунктов вверх, окружность, центр которой якобы находится в начале (0,0), будет изображена в окрестности точки с координатами (M,N) и так далее. Геометрическая плоскость, на которой введена наша система координат, бесконечна, однако в реальном мире все имеет свой предел. Стандарт PDF предусматривает несколько различных типов границ, наиболее важными из которых являются граница физической страницы (MediaBox) и граница видимой области (CropBox). Каждая из них задается четверкой чисел, представляющих собой координаты левого нижнего и правого верхнего углов прямоугольной области в системе координат по умолчанию. Если CropBox не задан явно, он принимается равным MediaBox. Теперь, когда мы бегло познакомились с экранной моЭкранная модель PDF Основой для эффективной работы с PDF является понима- делью PDF, можно переходить к изучению функций модуля ние его экранной модели (imaging model). Аналогичные кон- PDF::API2, реализующих работу в ней на языке Perl цепции лежат в основе многих современных API для работы с векторной графикой, например, Cairo и Arthur, так что Здравствуй, мир! кое-какие представления о них в любом случае окажутся По сложившейся традиции, мы начнем свое рассмотренелишними. ние с программы «Hello, World». Данный пример был взят Спецификация PDF 1.4 предусматривает четыре типа из стандартного дистрибутива PDF::API2, но слегка модиобъектов, которые могут отображаться на странице: кон- фицирован, чтобы лучше отражать отечественные реалии. туры (path object), текст (text object) и растр (image object). Конечно, при практическом наборе кода номера строк (01:, Особняком стоит область отсечения (current clipping path) – 02:, ...) необходимо опустить; мы также не используем строспециальный контур, в пределах которого возможна отри- гий режим (use strict), чтобы слегка уменьшить объем сцесовка объектов. Любые фигуры или их части, выходящие нариев и повысить их удобочитаемость. за пределы данной области, отсекаются, откуда и происПример 1 ходит это название. Для описания объектов всех четырех типов и работы 01:#!/usr/bin/perl с ними в PDF служит специальный язык, по своим функци02:use PDF::API2; ям аналогичный PostScript. Например, для отрисовки кон03:use constant mm => 25.4/72; тура используется оператор S (stroke), а для его заливки – 04:use constant cm => 2.54/72; f (fill) (здесь нет никакой опечатки – операторы «языка PDF» 05:use constant in => 1/72; 06:use constant pt => 1; в большинстве своем одно- и двухбуквенные). Как нетрудно видеть, у этих операторов нет параметров. Точки, образую07:$pdf = PDF::API2->new; щие контур, задаются заранее, а такие атрибуты, как тол08:$fnt = $pdf->corefont('Verdana', -encode => 'cp1251'); щина соединяющей их линии, ее цвет и цвет заливки оп09:$page = $pdf->page; ределяются текущим графическим состоянием (graphics 10:$page->mediabox('A4'); state). Одним из наиболее важных элементов этого состо11:$gfx = $page->gfx; яния является матрица преобразования системы координат (current transformation matrix, CTM), определяющая теку12:# Выводим текстовую метку 13:$gfx->textlabel(210/mm/2, 297/mm/2, $fnt, 12, ↵ щее положение декартовых осей. Думается, читатели, име'Здравствуй, мир !'); ющие опыт программирования трехмерной графики, испы14:$pdf->saveas('helloworld1.pdf'); тали чувство дежа-вю, и не зря: аналогия с OpenGL/Direct3D 15:$pdf->end; налицо, разве что все преобразования координат в PDF буСтроки 1-2, будем надеяться, в особых комментариях дут двумерными. По умолчанию, система координат имеет начало в левом нижнем ��глу листа, ось X направлена впра- не нуждаются. В строках 3-6 задаются стандартные конво, ось Y – вверх. За единицу измерения принимается 1/72 станты, выражающие миллиметр (mm), сантиметр (cm),

Для повседневной работы вам потребуются лишь страницы PDF::API2, ::Content, ::Page и ::Util, где перечислены значения различных констант. PDF::API2 не является средством для редактирования PDF в прямом смысле этого слова – он не предоставляет специальных методов для «поиска и замены» существующих элементов (например, картинок). Однако с его помощью вы легко можете создавать собственные PDF-файлы, а также обрабатывать и дополнять уже существующие. Как мы вскоре увидим, этого достаточно для решения весьма широкого круга задач. Другое ограничение – невозможность работать с зашифрованными PDF-файлами. Видимых препятствий этому нет – программа дешифровки PDF на Perl (http://www.cs.cmu.edu/~dst/Adobe/Gallery/pdfdecrypt.pl) занимает менее двухсот строк кода. «Альтернативный» модуль CAM::PDF (http://search.cpan.org/~clotho/CAM-PDF-1.05), который, по моему мнению, проигрывает PDF::API2 в удобстве использования, также справляется с этой задачей безо всякого труда. Возможно, этот функционал будет реализован в следующих версиях модуля. Прежде чем мы приступим к обсуждению констант и функций, давайте поближе познакомимся с форматом PDF версии 1.4, с которой и работает PDF::API2.

№3, март 2006

79


Зд р авс тву й, м ир !

авс Зд р

ир ! й, м тву

программирование

р ми й, ву т вс ра Зд

!

Зд ра в ст ву й, м

Здравствуй, мир !

ир

!

Здравствуй, мир !

Зд

Здр

ми р

!

ра

вс

у тв

р ми й,

!

!

р! , ми

вуй

й, м ир

ств у

т авс

Здр ав

Зд ра вс тв уй ,

по умолчанию используется стандартный для США размер Letter. Помимо псевдонима «A4» в методе mediabox можно использовать пару (ширина, высота) или ту самую четверку чисел, о которой говорилось в предыдущем разделе. Подготовительные операции завершаются созданием графического объекта $gfx (можете рассматривать его как холст – canvas) в строке 11. В строке 13 мы вызываем метод textlabel – это самый простой (но не самый гибкий) способ создания текстового объекта, который будет расположен в точке с координатами 210/mm/2, 297/mm/2 (т.е. в центре листа. Обратите внимание на использование константы mm для перевода миллиметров в пункты) и отрисован шрифтом $font (Verdana) высотой 12 пунктов. В строках 14 и 15 происходит запись PDF-документа на диск и разрушение объекта. На первый взгляд подготовительный этап может показаться чересчур трудоемким, но давайте не будем спешить и займемся усовершенствованием этого, в общем-то, очень простого примера. Заменим строки 12-13 на: Пример 2: 01:$n = 10; 02:$R = 50; # $n текстовых меток по кругу 03:$gfx->translate(210/mm/2, 297/mm/2); 04:for $i (1..$n) { 05: $gfx->rotate(360/$n); 06: $gfx->textlabel($R, 0, $fnt, 12, 'Здравствуй, мир !'); 07:}

Рисунок 1. Результат работы сценария helloworld1.pl

Здесь мы перемещаем начало отсчета в центр листа (строка 3), а затем выводим в цикле 10 текстовых меток, каждый раз поворачивая систему координат на 36 градусов относительно предыдущего положения (строка 5). Что получится в результате? Правильно – десять радиально расходящихся надписей «Здравствуй, мир!». Отступ на $R пунктов по оси X (в повернутой системе координат!) нужен для того, чтобы начальные буквы фразы не накладывались друг на друга (см. рис. 1). Полученная нами картинка уже неплоха, но здесь явно напрашивается что-то большее. Давайте добавим в наш документ геометрические фигуры (в терминологии PDF – контуры) и раскрасим их в различные цвета! Вставьте данный кусочек кода после строки 2 в предыдущем примере:

дюйм (in) и пункт (pt) в принятых в PDF единицах измерения. Рекомендую включать их во все ваши скрипты. Наконец, в строке 7 создается объект PDF::API2, с которым мы и будем работать. Каждому такому объекту может соответствовать не более одного PDF-документа. В строке 8 мы выбираем шрифт, который будет использоваться для вывода текста. Параметр -encode может принимать любое значение, известное модулю Encode вашей инсталляции Perl и, конечно, совпадающее с кодировкой символов в вашем сценарии. Метод corefont указывает, что нам нужен один из «базовых» шрифтов, лицензированных компаниями Adobe и Microsoft для свободного распространения, а посему потенциально доступными на любой системе. Помимо Verdana, сюда входят Georgia, Webdings, Wingdings Пример 3 (набор «Windows Fonts»), Courier, Helvetica, Symbol, Times, ZapfDingbats (набор «Adobe Core Fonts») и их разновиднос# Синий фон 01:$gfx->fillcolor('blue'); ти: жирный, курсив и так далее. 02:$gfx->rectxy($page->get_mediabox); К сожалению, текущая версия PDF::API2 умеет коррек03:$gfx->fill(1); тно отображать русский текст лишь шрифтами Verdana # Желтый круг в центре страницы и Georgia – для остальных гарнитур отсутствует информа04:$gfx->fillcolor(‘yellow’); 05:$gfx->circle(210/mm/2, 297/mm/2, 0.95*$R); ция о ширине символов, в результате чего буквы слипают06:$gfx->fill(1); ся (см. врезку «Изъясняемся по-русски»). Кроме core-шрифтов, PDF::API2 может использовать В строке 1 задается одно из свойств текущего графипроизвольные шрифты TrueType, PostScript и BDF, предо- ческого состояния – цвет заливки (fillcolor). Строка 2 опреставленные пользователем в виде файлов. В этом случае деляет прямоугольник, в точности совпадающий с нашей шрифт внедряется в PDF-документ. страницей (поскольку координаты его вершин возвращаВ строке 9 мы добавляем в конец нашего, пока еще пус- ются методом get_mediabox). Наконец, в строке 3 даеттого документа чистую страницу, а в строке 10 устанавлива- ся команда закрасить ранее определенный контур (пряем ее размер, равный странице формата A4 (210x297 мм) – моугольник) цветом, установленным последним вызовом

80


авс тву

ир ! й, м

Здр

тву авс

й,

Здр

й,

у тв

р

ми

!

вс

ра

Зд

тв у

р

ми

!

вс

ра

Зд

Здравствуй, мир !

Здравствуй, мир !

Зд ра в

ст

ву

й,

ми

р

!

р! , ми

Зд

ра

вс

тв

уй

ир

!

, ми р!

вуй

т авс

Здр

авс тву й

Здр

fillcolor (синим). До вызова метода fill наш прямоугольник не отображается на странице. Более того, заменив вызов fill на stroke, мы получим незакрашенный прямоугольник, построенный по тем же самым точкам. Это является следствием того, что операторы S и f не имеют собственных входных параметров, а используют заданные ранее значения. Аналогичным образом в строках 4-6 строится желтый круг радиуса 0.95*$R. Сохраните сценарий и запустите его на выполнение. Если вы не допустили ошибок при наборе исходного текста, ваши старания будут вознаграждены! На синем небе ярко засияет солнышко, каждый лучик которого шлет привет этому, а может быть, и другим мирам (см. рис. 2). Конечно, возможности PDF::API2 никоим образом не ограничиваются рассмотренными здесь вызовами. Всю необходимую информацию вы можете найти в документации. От себя добавлю, что в сценариях для «серьезной» работы с текстом возможностей, предоставляемых методом textlabel, может оказаться недостаточно. Поэтому если вы намерены составить конкуренцию TeX или Adobe InDesign, советуем ознакомиться со статьей [1], в которой подробно рассмотрен процесс верстки и добавления иллюстраций.

й, м ир !

программирование

Квитанции, брошюры и все-все-все Простым созданием документов в формате PDF (пусть даже таких красивых, как наше солнышко), сейчас уже никого не удивишь. Однако модификация существующих файлов по-прежнему остается уделом избранных. Что ж, попРисунок 2. Результат работы сценария helloworld2.pl робуем приоткрыть завесу тайны и с удивлением обнару$pdf->openpage, открывающему уже существующую. Кстажим, что все необходимое у нас уже есть. Начнем с такой распространенной задачи, как заполне- ти, номер страницы (в нашем случае 1) может быть и отние бланков: счетов в интернет-магазинах, квитанций, анкет рицательным – это означает, что вы ведете отсчет не с наи т. п. Для этих целей вполне сгодится наш первый пример. чала документа, а с конца. Файл blank.pdf мы подготовили Единственное, что нужно сделать, – заменить создание но- в обычном текстовом процессоре с возможностью экспорта PDF, а расположение полей для заполнения определивого документа открытием уже существующего: ли, используя его «линейки» (297мм – высота листа форПример 4 мата A4, отступы отсчитываются от левой и верхней границ страницы) (см. рис. 3). 01:#!/usr/bin/perl Другой весьма широкий класс задач – так называемый 02:use PDF::API2; пост-процессинг PDF-документов: поворот страниц, обре03:use constant mm => 25.4/72; зание полей (crop), слияние нескольких документов в один 04:use constant cm => 2.54/72; и извлечение страниц, а также извечная проблема любите05:use constant in => 1/72; 06:use constant pt => 1; лей электронных книг – брошюровка (называемая в народе «верстка книжкой»). Рассмотрим каждую из этих задач 07:$pdf = PDF::API2->open("blank.pdf"); 08:$font = $pdf->corefont("Georgia-Italic", ↵ по очереди. Во всех последующих сценариях, где это не-encode => cp1251); обходимо, подразумевается «преамбула» в объеме строк 09:$page = $pdf->openpage(1); 1-6 примера 4. 10:$gfx = $page->gfx; 11:$gfx->textlabel(3.20/cm, 297/mm-3.30/cm, $font, 12, ↵ "Иванов И.И."); 12:$gfx->textlabel(6.0/cm, 297/mm-3.80/cm, $font, 12, ↵ "Голодающим детям Африки"); 13:$gfx->textlabel(3.05/cm, 297/mm-4.80/cm, $font, 12, ↵ "01.01.1970"); 14:$pdf->saveas("receipt.pdf"); 15:$pdf->end;

Нетрудно видеть, что вместо метода PDF::API2->new здесь используется open, принимающий в качестве параметра имя существующего PDF-файла. Вызов $pdf->page, создающий новую пустую страницу, уступил место методу

№3, март 2006

Поворот страниц 01:$pdf = PDF::API2->open("document.pdf"); 02:for $i (1..$pdf->pages) { 03: $pdf->openpage($i)->rotate(90); 04:} 05:$pdf->saveas("document_new.pdf"); 06:$pdf->end;

Мы пробегаем в цикле все страницы данного документа (их число возвращает метод pages) и для каждой из них вызываем метод rotate. Отметим, что он отличает-

81


программирование го лишь устанавливает определенный параметр в свойствах страницы. Иванов И.И. Голодающим детям Африки 01.01.1970

Слияние документов и извлечение страниц Чтобы решить эту задачу, нам придется поднапрячься и совершить качественный скачок – начать работать с двумя объектами PDF::API2 одновременно. В общем случае нам необходимо создать документ-источник и документприемник, а затем перенести страницы с помощью метода importpage. Если документ-приемник ранее не существовал (то есть был создан в процессе работы сценария), мы имеем дело с извлечением страниц, в противном случае налицо (частичное) слияние двух документов. 01:#!/usr/bin/perl 02:use PDF::API2; 03:$source = PDF::API2->open("document.pdf"); 04:$dest = PDF::API2->new; #или PDF::API2->open("document2.pdf"); 05:@pages = (1, -1); 06:for $page (@pages) { 07: $dest->importpage($source, $page, $dest->page); 08:} 09:$dest->saveas("document_new.pdf"); 10:$dest->end; 11:$source->end;

Рисунок 3. Заполненная квитанция

ся от рассмотренного нами ранее метода rotate объекта $page->gfx. Во-первых, здесь допустимы повороты только на углы, кратные 90 градусам. Во-вторых, вызов метода $page->rotate не меняет текущую матрицу преобразования (CTM), а устанавливает особый параметр страницы (можете думать о нем, как о флажке «книжной/альбомной» ориентации) и, таким образом, влияет на вид системы координат по умолчанию. Так, в нашем случае ее начало находится в левом верхнем углу страницы, оси направлены вправо и вниз. Попробуйте нарисовать на каждой странице квадрат с вершинами (0,0) – (100,100), и вы поймете, что имеется в виду.

Обрезание полей 01:$pdf = PDF::API2->open("document.pdf"); 02:for $i (1..$pdf->pages) { 03: $pdf->openpage($i)->cropbox(3/cm, 3/cm, ↵ 210/mm-3/cm, 297/mm-3/cm); 04:} 05:$pdf->saveas("document_new.pdf"); 06:$pdf->end;

Нетрудно видеть, что решение этой задачи полностью аналогично предыдущему. Всю работу выполняет метод cropbox, «отхватывающий» по 3 сантиметра от каждого края листа формата A4 (в настоящей программе было бы разумно получать текущие размеры каждой страницы при помощи метода get_mediabox). Если сейчас вы подумали об области отсечения (clipping path), то, к сожалению, ошиблись: она здесь ни при чем. Подобно методу rotate, cropbox все-

82

В строке 5 мы перечисляем страницы, которые будут импортированы из $source в $dest. В данном случае нас интересуют только первая и последняя. Всю необходимую работу выполняет метод importpage (строка 7), на вход которого подаются объект-источник ($source), номер страницы в исходном документе ($page) и номер страницы в документеприемнике или объект типа PDF::API2::Page, «в который» будет помещена импортированная страница. Мы используем результат вызова $dest->page, который, напомним, добавляет новую страницу в конец документа $dest. Следует отметить, что созданные таким образом страницы имеют кое-какие ограничения – например, их нельзя импортировать в другой документ (тому есть свои причины) до тех пор, пока они не будут сохранены в реальном файле, а затем заново открыты методом openpage. Если это для вас существенно, создайте пустой одностраничный PDF-документ любым доступным способом (например, в OpenOffice.org) и каждый раз импортируйте его единственную чистую страницу вместо вызова метода page.

Брошюровка Теперь мы можем перейти к наиболее сложной из заявленных нами задач – брошюровке. Этот процесс состоит из двух этапов. На первом из них создается набор пар – номеров страниц, подлежащих распечатке на одном листе (с двух сторон). Идея проста: исходный документ дополняется пустыми (или рекламными) страницами так, чтобы их общее число N было кратно 4, затем страницы группируют следующим образом: (N,1), (2, N-1), (N-2, 3) до тех пор, пока первое число в паре меньше второго. Затем каждая пара соответствующим образом уменьшается и копируется на печатный лист.


программирование 01:$source = PDF::API2->open("document.pdf"); 02:$dest = PDF::API2->new; 03:$left = 1; 04:$right = ($source->pages % 4 == 0) ? $source->pages : ↵ $source->pages + (4 - $source->pages % 4); 05:$reversed = 1; 06:while ($left < $right) { 07: $page = $dest->page; 08: $page->mediabox(297/mm, 210/mm); 09: $page->rotate(90); 10: draw_page($source, $left, $dest, -1, $reversed); 11: draw_page($source, $right, $dest, -1, !$reversed) ↵ if ($right <= $source->pages); 12: $left++; $right--; $reversed = !$reversed; 13:} 14: $dest->saveas("document_book.pdf"); 15:$dest->end; 16:$source->end;

Этот кусочек кода реализует первую половину нашего плана. В переменной $left хранится номер первой, а в $right – второй страницы текущей пары. Строка 4 вкупе с условием if в строке 11 эквивалентна добавлению нужного числа пустых страниц в конец документа $source. Флаг $reversed определяет, где на печатном листе будет расположена страница с меньшим номером – слева или справа. Интерес также представляют строки 7-9: здесь мы добавляем в $dest новую страницу формата «перевернутый A4» и тут же поворачиваем ее на 90 градусов. Таким образом мы получаем обычную страницу формата A4 с необычной системой координат, так что все помещенные на нее объекты будут «лежать на боку». Фактической отрисовкой страницы занимается подпрограмма draw_page, которая принимает пять параметров: объект-источник ($pdf_in) и номер исходной страницы ($in_idx), объект-приемник ($pdf_out) и номер страницы-«печатного листа» ($out_idx), а также позицию на печатном листе (0 – слева, 1 – справа): 01:sub draw_page { 02: my ($pdf_in, $in_idx, $pdf_out, $out_idx, ↵ $position) = @_; 03: my $xo = $pdf_out->importPageIntoForm($pdf_in, ↵ $in_idx); 04: my $pg_out = $pdf_out->openpage($out_idx); 05: if (my $cropbox = ↵ $pdf_in->openpage($in_idx)->find_prop("CropBox")) { 06: $xo->bbox(map {$_->val} $cropbox->elementsof); 07: } 08: 09: 10: 11:

my @ps = map {$_->val} $xo->{BBox}->elementsof; my $bbox_width = $ps[2] - $ps[0]; my $bbox_height = $ps[3] - $ps[1]; my (undef, undef, $page_width, $page_height) = ↵ $pg_out->get_mediabox;

12: my $scale_x = $page_width/(2*$bbox_width); 13: my $scale_y = $page_height/$bbox_height; 14: my ($scale, $x, $y); 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:

if ($scale_x <= $scale_y) { $scale = $scale_x; $x = 0; $y = ($page_height - $scale*$bbox_height)/2; } else { $scale = $scale_y; $x = ($page_width/2 - $scale*$bbox_width)/2; $y = 0; }

25: $pg_out->gfx->formimage($xo, $x - $ps[0] + ($position ↵ ? $page_width/2 : 0), 26:$y - $ps[1], $scale); 27:}

№3, март 2006

«Изъясняемся по-русски» «Слипание» букв русского алфавита происходит из-за того, что PDF::API2 не обладает достаточной информацией о их ширине в каждом конкретном шрифте. Существует несколько способов исправить «заморский акцент» PDF::API2:  Использовать только core-шрифты Verdana и Georgia – для них эти сведения имеются.  Использовать встраиваемые шрифты TrueType или PostScript. Здесь также не исключены проблемы, но они куда менее вероятны – вся информация берется непосредственно из файлов шрифтов.  Добавить в файлы PDF/API2/Resource/Font/Corefont/*.pm информацию о ширине символов кириллицы (U+0x04NN). Это не так-то просто, но если вы все же справитесь с этой задачей – не забудьте отправить «заплатку» автору модуля, и благодарное сообщество вас не забудет.

Метод importPageIntoForm в строке 3 возвращает нужную нам страницу исходного документа в виде «непрозрачного» объекта X-Object. С такими объектами можно выполнять различные преобразования и располагать их в любом месте страницы, но узнать, что находится у них внутри, нельзя. Условие в строках 5-7 выясняет, был ли для исходной страницы установлен CropBox (иными словами – были ли обрезаны поля), и, если это так, создает на основе этой информации область отсечения для объекта X-Object (иначе эта информация будет потеряна – X-Object включает в себя лишь содержимое страницы, но не ее свойства, где, как мы помним, находится поле CropBox). К сожалению, в текущей реализации PDF:API2 не существует метода get_cropbox, поэтому данную информацию приходится извлекать таким «низкоуровневым» способом. В строках 8-10 мы находим ширину и высоту импортируемого объекта и затем вычисляем по ним коэффициенты масштабирования (строки 11-13, обратите внимание, что подпрограмма может работать с любыми размерами исходных страниц и печатных листов). Условие в строках 15-24 обеспечивает пропорциональность масштабирования, а метод formimage в строке 25 отображает уменьшенную копию страницы на печатном листе. Ну вот и все! Теперь осталось только распечатать полученную книжку и отнести в ближайший копи-центр для сшивания, а используя этот сценарий вместе с программой для извлечения страниц, можно распечатать и удобно сшить даже самый монументальный труд. Удачи! Все обсуждаемые примеры можно загрузить с сайта журнала http://samag.ru в разделе «Исходный код».

Ссылки 1. http://www.printaform.com.au/clients/pdfapi2 – несколько устаревшая, но не потерявшая актуальности статья, детально рассматривающая вопросы верстки текста с помощью PDF::API2. 2. http://partners.adobe.com/public/developer/pdf/index_reference. html – здесь можно загрузить официальную спецификацию формата PDF от Adobe. 3. http://www.accesspdf.com/pdftk – домашняя страница PDF Toolkit – открытой программы для обработки PDF-файлов.

83


хобби

Коллекция «Почему?» Куда все делось и откуда что берется Одновременно два вопроса не решить…

Ïî÷å

Почему?

Владимир Высоцкий

ìó?

Каждый пишет, как он слышит, каждый слышит, как он дышит, как он дышит, так и пишет, не стараясь угодить... Булат Окуджава

Почему?

Почему ? Почему?

? у м е ч о

П

? у м е Поч

Почем

у? Почему?

Конечно же, Алексей Коршунов – системный администратор. Но при этом еще и коллекционер. Правда, не совсем обычный: в его собрании – не пивные пробки, использованные телефонные карты или отбитые носики от антикварных фарфоровых чайников. Алексей коллекционирует философские вопросы и не менее философские ответы. А еще он пишет задумчивые рассказы, где главные герои – говорящие лягушки, ожившие поезда и материализовавшееся Время – размышляют о несовершенном величии и величественном несовершенстве мира. Вот такой системный коллекционер получается… …«Через неделю «новый поезд будущего», наспех переименованный в «Экспериментальную разработку», перегнали на завод-производитель. Никто не пытался понять, с чего это вдруг кусок железа стал вести себя как разумное существо. Гордыня людей не позволяла допустить даже мысли, что есть еще кто-то мыслящий, кроме них самих… А Ижику, отключенному от основного питания, все снилось, как радостные пассажиры заполняют его вагоны и все вместе поют песни, пока он мчит их до далекой, но такой близкой следующей станции»…

84

Как только Алексей научился складывать буквы в слова, а случилось это, как вы понимаете, довольно давно, он тут же начал писать рассказы. Как водится, первые опыты отдавали подражанием – приключения Алисы Селезневой в исполнении Кира Булычева произвели на мальчика Алешу столь неизгладимое впечатление, что он, недолго думая, тут же сочинил четыре тетрадки собственных продолжений. Чуть позже стали появляться собственные оригинальные сюжеты, что-то из «раннего» Алексей хранит до сих пор, что-то в приступе творческой неудовлетворен-


хобби «Почемучка» Почемучка никогда не был спокойным ребенком. Он просыпался и засыпал с одним и тем же вопросом: «Почему?». Казалось, нет ничего важнее в жизни, чем вовремя узнать «что, зачем и почему». В мире столько всего интересного, и надо везде успеть. Все узнать, все понять. Прочитать все книжки и поговорить со всеми людьми. В детском саду Почемучка был заводилой, в школе – лидером. Его обожали учителя, и уважали сверстники. К нему приходили с бедами, заслушивались его советами. Почемучка всегда знал, чего хочет, и стремился к своим целям, которые менялись со скоростью звука очередного, задаром отданного совета. Он пылал энергией жизни и не мог сидеть на месте. Мириться с судьбой Почемучка не умел и не хотел, он гнул ее под себя и старался выжать

из жизни максимум, поняв «что, зачем и поЖизнь проходила мимо, а Почемучка чему». Но жизнь меняет всех, и даже наш все не мог понять, «что, зачем и почему» герой не исключение. происходит так, а не иначе. Он стал запиВремя научило, что не все советы по- сывать свои мысли в надежде, что кто-то могают людям, не всякая критика приводит найдет для себя в них что-то интересное. к улучшениям, а друзья не всегда готовы Он сдул пыль с умных книг и погрузилмириться с вечными нравоучениями, щед- ся в поиск ответа на ненавистный вопро разбавленными огромным самомнени- рос. Почемучка не мог начать менять свою ем. Да и цель в жизни как-то потерялась… жизнь, не поняв «что, зачем и почему». Надо было что-то менять, но Почемучка Почемучка бежал вприпрыжку от счаспривык советовать другим, а не действо- тья, как будто ему снова 15 лет, ведь он повать сам. нял, понял «что, зачем и почему»! Теперь-то Жизнь шла, а Почемучка все был в сом- уж он не упустит своего счастья! Теперь он нениях, ведь он много-много раз говорил все изменит, и мир никогда не будет предругим: действовать можно, только поняв жним!.. Визг тормозов и удар о лобовое «что, зачем и почему». Уже не так охотно стекло прервали жизнь впервые не посмотслушали его советы, а друзья вечно ссыла- ревшего по сторонам Почемучки. лись на занятость делами. Почемучка заВ удивленных глазах остывал вопрос: грустил. Некого стало учить жизни, некому «Что? Зачем? Почему?». стало пенять на безделье и малодушие. Извечный вопрос стал проклятием… 27 августа 2004 г.

ности было азартно порвано или сожжено. Кто не проходил через это?.. И по сей день страсть переносить свои сомнения и раздумья на бумагу, то затихает в нем, то разгорается с новой силой. Было время, когда главным развлечением нашего героя были беседы с непременными бабушками, заседающими у каждого уважающего себя подъезда. С неподдельным любопытством слушал увлекательные истории их жизни – про Сибирь и высокие кабинеты ЦК. И ничего не писал. Просто не хотелось, видимо, копил в себе эти образы и впечатления, не растрачивая их попусту. Желание взяться за «перо», «достать чернил и плакать» – оно вообще напоминает море, с его приливами и отливами. Как и положено человеку с «системным» мышлением, Алексей уже давно вывел закономерность собственной писательской активности: если в жизни его хватает живого общения, встреч, разговоров и эмоций – рассказы писать не хочется. Философские вопросы о природе мироустройства, правда, все равно никуда не уходят – как мучили, так и продолжают мучить, но придавать им литературную форму желание пропадает. И наоборот: наступает «социальное» затишье, и рассказы как блины пекутся. Пишет Алексей исключительно по ночам, лучше всего работается ему в полнолуние. Рассказы – это действительно хобби: на лавры серьезного прозаика Алексей не претендует. Он даже не хочет публиковаться, лишь несколько историй вывесил в Сети, на своем форуме, по адресу www.akeeper.ru. – Каждый мой герой мучается каким-то вопросом. Это некое существо – реже живой человек, который живет одной-единственной мыслью, и мысль эту в каждом конкретном рассказе я и пытаюсь развить. Поезд в метро, который не понимает, как люди могут ходить мимо друг друга, как мимо пустого места, лягушонок, который думает, что если он переселится в другое болото, жизнь его станет

№3, март 2006

радостнее и веселее. Конечно, все эти рассказы обо мне самом, это мои собственные поиски. Я не пытаюсь переделать мир или что-то в нем исправить, мне интересно, почему так вышло. Почему люди перестают друг друга замечать – с этим уже ничего не поделаешь, но до причины докопаться непременно нужно. А публикации до добра не доводят: на меня тут же начинают сыпаться советы и комментарии, будто я спрашивал чьей-то рецензии. Кстати, о форуме, где можно прочитать рассказы Коршунова. Он создал его два года назад. От всех своих сетевых аналогов он существенно отличается полным отсутствием единой темы. И вообще какой-либо темы. Сюда приходят люди самых разных профессий, интересов и жизненных позиций, есть ветераны Чеченской и даже один – Великой Отечественной войны. Приходят, когда им есть что сказать, обсудить, но чаще – на что пожаловаться. Когда Алексей стал более детально изучать интернет-сообщество – удивился: по всем законам жанра его форум должен был почить в бозе максимум через полгода после рождения. Однако живет до сих пор, и каждую неделю на нем появляются несколько тысяч новых сообщений. – Когда меня спрашивают о целях и задачах форума – ничего не могу ответить. Хотя на самом деле цель есть – свести вместе людей, тех, чьи кабинеты расположены на двадцать пятом этаже и в подвале одного и того же здания. Ведь они на мир смотрят совсем по-разному. Ну разве ж им не полезно встретиться? Нынче коллекция Коршунова пополнилась очередным философским утверждением, а значит, совсем скоро на свет появится и очередной литературный выплеск: делая выбор, человек всегда от чего-то отказывается, и какое бы решение мы не принимали – все равно где-то проиграем, прогадаем, останемся в минусе.

Анна Николаева

85


ретроспектива

История компьютеров «Амига» Часть вторая: 1995-2006 После смерти Джея Майнера и банкротства компании будущее Amiga оказалось под вопросом.

Сергей Зуев В поисках хозяина В начале 1995 года имущество компании стали распродавать, на права обладания популярными торговыми марками претендовали такие гиганты, как Commodore UK, IBM, Dell, Escom, CEI и Samsung. Тендер был выигран немецким гигантом по производству IBM PC-совместимых компьютеров Escom. Новая компания сразу разделила два бренда: Commodore стали продавать обычную периферию к PC (мыши, клавиатуры, колонки и прочее), а подразделение Amiga Technologies – заниматься разработкой Amiga.

86

Escom сразу объявила, что Amiga грузчики, напрямую управлявшие конне умерла, и наладила новое произ- троллером дисковода. Однако этот водство Amiga 1200 и Amiga 4000T. просчет так и не был устранен. В 1996 году президентом Amiga Tech. С последними произошла заминка, в продажу они поступили только в фев- стал староый поклонник Amiga Петро рале следующего года, что подмочило Тищенко. Он объявил о начале разрарепутацию компании. Для новых ма- боток новых моделей – Amiga Walker шин даже слегка переписали сущес- и Power Amiga. Walker, названный твующую AmigaOS 3.0, дав ей номер в честь самой первой игры для Amiga версии 3.1. У поступивших в продажу Mind Walker, имел весьма оригинальА1200 оказался не «родной» дисковод. ный дизайн, похожий на пылесос или Escom устанавливала слегка модифи- на шлем Дарта Вейдера. Внутри он цированные дисководы от IBM PC, из- имел процессор MC68030, 2 Мб Chipза чего перестали работать програм- памяти, чипсет AGA и мог расширятьмы, использующие нестандартные за- ся через слоты Zorro-3 или, ставшей


ретроспектива тогда популярной, шину PCI. Сторон- твующего парка A1200 и A4000 – и пообещала, что будет использовать ние производители объявили о нача- это были двухпроцессорные карты ее на своих новых системах Pre/Box. ле разработок Amiga-клонов. Напри- с MC68040(60) и PowerPC 603e/604e. Поскольку освоить разработку и промер, известная в кругах Mac- и Amiga- Помимо этого фирма объявила о том, изводство такого сложного комплекспользователей компания Phase 5, про- что работы над A/Box не прекраща- ного продукта, как A/Box, было достаизводящая процессорные карты, виде- ются и, если бренд Amiga будет за- точно сложно, то решено было для наокарты и прочую периферию, объявила брошен, то их новые системы с успе- чала выпустить упрощенные системы о своем новом компьютере A/Box. Он хом займут нишу Amiga как компью- Pre/Box. По планам они должны были должен был произв��сти новую муль- теры с такой же идеологией. В этом содержать один процессор 680x0 и четимедийную революцию, как и сама году были представлены видеокарты тыре PowerPC. Index объявила о разраAmiga 10 лет назад. Внутри планиро- на базе чипсета Cirrus Logic от той же ботке своего проекта Inside Out. Плавалось устанавливать до четырех про- Phase 5 – CyberVision 64 и от Village нировалось сделать PCI-карту для IBM PC, которая содержала бы AGA-чипсет цессоров PowerPC 604 с тактовой час- Tronic – Picasso IV. К 1996-97 годам компьютеры Amgia и процессор 680LC60 на 75 МГц. тотой в 200 МГц (максимум – 500 МГц) На программном рынке тоже твои до 1 Гб памяти с транфером в 1,6 Гб/с окончательно утратили свои ранее (не сравнимо выше, чем у популярной прочные позиции на рынке компьютер- рилось некоторое оживление: поскольтогда EDO RAM – 57,3 Мб/с). Но самым ных развлечений, но несмотря на это, ку были открыты исходные коды Doom главным в этом компьютере должен в этот период произошел бурный рост и Descent, то моментально появились был стать чипсет. Phase 5 объявила, новых игр. Появились два неофици- их неофициальные версии для Amiga. что весь чипсет будет заключен в одну альных релиза Quake и Myst, кото- Еще один знаменательный релиз – 128-разрядную и работающую на час- рые работали практически как слайд- 3D-shooter Genetic Species. Netscape, тоте в 200 МГц микросхему под назва- шоу (3-4 fps), но к концу года фирма проиграв в коммерческом соревнованием «Caipirinha». Планировалось уб- ClickBoom официально выпустила оп- нии браузеров Microsoft, открыла исрать разделение памяти на две облас- тимизированные версии этих игр. ходные коды своего браузера, чем выПодразделение Gateway 2000, за- звала немалый ажиотаж в сообщести, сделав единое адресное пространство, поддерживались разрешения до нимающееся Amiga, под руководством тве пользователей Amiga. Фирмой 1600 x 1200 точек на 24 бита с транфе- того же Тищенко в 1997 году объявило DiscreetFX была объявлена небольром между модулями в 3200 Мб/с. Ко о разработке новой операционной сис- шая награда тому, кто первым портивсему прочему обещалась аппарат- темы AmigaOS 3.5. Amiga International рует NN для AmigaOS. Однако это был ная MPEG-поддержка, Genlock-совмес- объявила, что больше не будет выпус- сложный комплексный продукт, и пертимый выход, два раздельных видеов- кать аппаратное обеспечение, оста- вые значительные шаги в портировахода, аппаратные окна, продвинутый вив эту прерогативу сторонним фир- нии уже Mozilla и FireFox осуществляBlitter и DSP-RISC процессор для 3D- мам наподобие Phase 5 или PIOS. ются только в наши дни. Награда же графики и видеокомпрессии. На рынке сразу появилось несколько за портирование выросла уже до почВ июле Escom внезапно объявила Amiga-совместимых машин от Draco, ти 10 тысяч долларов. о продаже своего имущества компа- Access, Eagle и прочих производитеТо время было бумом дот-комов нии VISCorp, в связи с финансовыми лей. В сентябре 1997 года Gateway и машинно-независимых языков. В сепроблемами. Последняя сразу оста- объявил о создании нового подразде- редине года было объявлено, что поновила проект Walker и начала выпуск ления Amiga Inc., которое должно бы- мимо рынка настольных систем, бренд комплектов Amiga Magic, которые пред- ло заниматься будущим Amiga. К концу Amiga будет распространяться на рынставляли собой обычную A1200 с мо- года Phase 5 наконец выпустила свои ке встраиваемых и мобильных сисдемом и 100 часами в IBM.net. Однако новые процессорные карты, а некото- тем. Для этого начали разработку финансовое положение VISCorp изна- рые сторонние фирмы ( DCE, Micronik) Java-подобной виртуальной машины чально было шатким, поэтому в дека- объявили о создании Amiga-совмести- AmigaDE. Для настольных компьютебре бренд Amiga был продан очеред- мых компьютеров нового поколения. ров предлагалось выпустить к 2000 ной фирме Quickpak. Последняя на- Маленькая фирма BlitterSoft анонсиро- году новую ОС версии 4.0. В качестве ладила выпуск A4000T с процессора- вала новый клон BoXeR, который дол- ее основы планировалось взять ядро ми MC68060 и объявила о своих пла- жен был иметь улучшенный AGA-чип- от Linux или от BeOS, но в итоге останах о переносе AmigaOS на процессо- сет, выполненный в FPGA и 680x0-про- новились на варианте QNX. Это быры DEC Alpha. Однако и этой фирме не цессор. ло очень быстрое и компактное ядро, повезло с Amiga, и бренд отошел в руки Начало 1998 года было украшено которое умещалось в кеш процессокорпорации Gateway 2000, которая бы- новыми анонсами: Phase 5 выпустила ра. С процессором новых систем тола дружественной с фирмой Microsoft. графические адаптеры на базе чипсе- же творилась неразбериха. СначаПодразделение, занимающееся Amiga, та Permedia 2 для своих новых процес- ла было объявлено об использовании переименовали в Amiga International. сорных карт, также был объявлен аль- семейства x86 от Intel, однако больянс между Phase 5, Blitter Soft и Index шая часть сообщества опротестоваInformation Ltd. о разработке PowerPC- ла переход на «вражеские» процесAmiga International Phase 5 провела демонстрацию но- рас ширения д ля BoXeR. 10 мар - соры, и тогда сообщили, что основой вых процессорных карт для сущес- та Phase 5 лицензировала AmigaOS будущих компьютеров могут равнове-

№3, март 2006

87


ретроспектива

Рисунок 1. AmigaOS4 beta

роятно стать решения от многих фирм (MIPS, Motorola, Hitachi и пр.) Следующий год начался со слияния немецкого и американского подразделений, получившийся конгломерат так и назвали – Amiga. На место Тищенко был поставлен Джим Коллас. Сразу было сделано заявление, что компания понимает стремление пользователей Amiga сохранить «дух Amiga» и все дальнейшие усилия компании будут направлены только на это. У Amiga появился новый значимый партнер – Corel, который заявил, что их популярный продукт WordPerfect будет портирован на AmigaOS. Однако программисты Corel отказались работать с чем-либо, альтернативным Windows, за исключением Linux. Для удобства компьютеры Amiga стали разделять на «классические» и новые системы. Для классики с процессорными картами с PowerPC вышел эмулятор PowerMacintosh – iFusion, превращавший Amiga в iMac. BoXeR продемонстрировал свои новые наработки в области создания Amiga-клона, однако, к сожалению, к концу года проект был свернут. В апреле были анонсированы первые игры для PowerPC и вскоре вышел порт игры с PlayStation WipeOut 2097, а Hyperion выпустила 3D-shooter Shogo. На периферийном рынке анонсировали первые контроллеры USB для шины Zorro, которые

88

впоследствии были отменены, но положили начало новым разработкам в этой области. В середине года руководство компании подписало соглашение о совместной разработке AmigaDE вместе с Microsoft. QNX разорвала с Amiga всяческие отношения и подписала договор с Phase 5 об использовании своей ОС на новых компьютерах. Phase 5 в свою очередь прекратила разработку проекта Pre/Box и объявила о создании новой, не менее впечатляющей, четырехпроцессорной системы AmiRage K2. Последовал анонс еще двух клонов – Amiga MCC (Multimedia Convergence Computer) от Gateway 2000 и компьютер от неизвестной никому Iwin Corporation. Последняя обещала сделать настоящий клон Amiga с процессором 68060 или PowerPC 604e, 8 Мб Chip-памяти, 3D-ускорителем, 16-разрядным звуком, поддержкой USB и пр., однако после анонса об этой компании больше никто ничего не слышал. К концу года проект Amiga MCC был отменен, и сразу же после этого Microsoft объявила о начале разработки X-Box, что сразу возбудило волну слухов о родственности этих двух проектов.

Возрождение Поскольку со временем все яснее становилось, что компании Gateway от Amiga нужен только хорошо раскру-

ченный бренд, то в начале 2000 года Tao Group и Amino Development выкупили Amiga. Amino сразу объявила себя новым владельцем Amiga и даже переименовала себя в Amiga Inc. 26 января 2000 года объявила о своем банкротстве фирма Phase 5, разработчик периферии для Mac и Amiga с 12-летним стажем. Это событие окончательно похоронило все надежды сообщества на A/Box, Pre/Box и последние их разработки – компьютер Amirage и процессорные карты на базе PowerPC G3/G4. Права на производство существующих товаров от Phase 5 перекупил известный немецкий завод электронной техники – DCE. На конвейер попали все топовые процессорные карты от Phase 5 и периферия к ним: для A1200 – Blizzard 1240 (процессор 68040), Blizzard 1260 (68060), Blizzard PPC (040/060 + PowerPC 603e); для A3/4000 – Cyberstorm PPC (040/060 + PowerPC 604e); видеокарты BlizzardVisionPPC и CyberVisionPPC. DCE обещала продолжить незаконченные разработки от Phase 5 (например процессорную карту с PowerPC для A2000), однако в последующие годы никаких новых товаров она не выпустила. Новая Amiga Inc. разделилась на три части:  Консульный Совет Amiga – группа Amiga-разработчиков, журналистов, пользовательских групп, и дилеров, которые были отобраны Gateway-Amiga Inc в 1999 году. Amiga Inc. привлекла этих людей, чтобы оценить собственное положение на рынке, используя мнение различных частей сообщества пользователей Amiga.  Дилерская сеть Amiga – канал для Amiga-дистрибуторов и дилеров, связывающий их с головной компанией.  Сеть поддержки разработчиков Amiga – создана для поддержки (документация, багфиксы и пр.) разработчиков. 2000 год был насыщенным с точки зрения анонса новых продуктов. Бывший состав Phase 5 решил продолжить работу на родном поприще и объявил о создании новой операционной системы – MorphOS. Внутри новая ОС очень походила на классическую AmigaOS,


ретроспектива однако коренным ее отличием было их новую разработку – шинный мост + то, что MorphOS изначально писалась процессорная карта Predator. По обепод процессоры PowerPC. Посколь- щаниям должна была получиться плаку слухи о создании новой ОС ходи- та с PCI- и AGP-слотами и процессоли уже с 1996 года, сообщество весь- ром PowerPC G3, которую также плама нега��ивно отнеслось к этой ново- нировалось использовать в tower-версти – за последние годы слишком мно- сиях A1200. Известный производитель прого чего анонсировалось и тут же уходило в небытие. Чтобы разбить эти сом- цессорных карт для PowerMacintosh нения, для публичного теста была вы- MetaBox анонсировала новую карпущена очень сырая beta, которая тем ту для A1200 на базе процессора не менее работала и даже могла запус- PowerPC G3, к сожалению, из-за внуткать некоторые программы. ренних проблем эта фирма скоро обанНесмотря на отмену дальнейшей кротилась, оставив после себя тольразработки BoXeR, на рынке аппарат- ко прототип. Amiga Inc. выпустила на рынок ного обеспечения для Amiga в этом году царил бум новых товаров. Извест- новую ОС AmigaDE и SDK под нее. ный наряду с Phase 5 в прошлом про- Для будущих систем, на которых плаизводитель периферии Apollo выпус- нировалась работа этой ОС, опублитил платы со слотами расширения ковали спецификацию Zico с системZorro-4 для переставленных в tower ными требованиями. Как было сказаА1200. Zorro-4 – это некий компромис- но ранее, AmigaDE – это аналог Java, сный вариант между Zorro-2 и Zorro-3: платформонезависимая ОС, которую шина имеет 24-битную адресацию, как планировалось использовать в самом в первом случае, и 32-битную шину широком спектре устройств – от наданных, как во втором. Польская фир- стольных компьютеров до встраивама Elbox начала продавать комплекты емой и мобильной техники. Для класMediator. Эти платы также предназна- сических компьютеров совсем неожичались для А1200 и предоставляли воз- данно начала продаваться AmigaOS можность использовать широко рас- 3.9. Если OS 3.5 была лишь набором пространенную PCI-периферию вмес- патчей для старых ОС, то OS 3.9 посто дорогих аналогов Zorro (для срав- тавлялась с поддержкой PowerPC и нанения – сетевая карта под Zorro стоит бором очень полезных утилит. 85 $, когда для PCI можно найти аналогичную по параметрам за 5-10 $). Современность Сразу после выхода Mediator, англий- В 2001 году Amiga Inc. анонсироваская компания Eyetech анонсировала ла разработку AmigaOS 4. Это было

Рисунок 2. MorphOS

№3, март 2006

Рисунок 3. MicroA1

именно то, чего долгие годы ожидало сообщество. За основу новой ОС взяли исходный код OS 3.x и начали переписывать его под современные требования. Большая часть старой AmigaOS была написана на С, однако были и рудименты в виде кусков на языке BCPL, предшественнике С, и машииннозависимых частей, написанных на ассемблере процессоров 680x0 и под чипсет. Команда разработчиков, занимающаяся новым проектом, обязалась переписать ОС под PowerPC и исключительно на С. Для демонстрации возможностей новой ОС в последующие годы была проведена серия туров по многим странам. Сначала срок выхода планировался на конец 2001 года, затем его отодвинули на 2002 год. С тех пор были выпущены три официальные бета-версии (см. рис. 1), однако дата конечного релиза до сих пор не определена. Единственное, что говорят разработчики – «when it’s done». Eyetech пересмотрела свои планы по разработке шинного моста к A1200 и выпустила новый компьютер на PowerPC под названием AmigaOne. Позже было выпущено еще несколько моделей этого компьютера, отличавшихся процессорами и форматом плат. Последняя разработка, Micro AmigaOne, представляет собой материнскую плату micro-ITX формата (см. рис. 3). Первые модели поставлялись с дистрибутивом Linux, с возможностью получения бесплатно OS 4, когда она появится в продаже. Позже все владельцы купленных AmigaOne получили по почте все три вышедшие беты, а покупатели новых компьютеров получали их сразу вместе с компьютером. В последнее время (вторая половина 2005 года) Eyetech приостановила производство своих компьюте-

89


ретроспектива

Рисунок 4. Pegasos 2

ров, и пока неизвестно, когда она продолжится. Как OS4-совместимыми было заявлено еще несколько проектов. За период 2001-2005 гг. Elbox выпустила несколько различных версий своих Mediator, в том числе и Mediator 4000 Di, который заменял стандартную Riser Card в Amiga 4000 на новую со слотами PCI. В 2002 году на выставках, посвященных Amiga, была продемонстрирована новая процессорная карта под Mediator с интерфейсом PCI – SharkPPC. Планировалось, что на ней будут устанавливаться процессоры PowerPC G3/G4 с диапазоном тактовых частот в 400-533 МГц. На деле эта карта являет собой слегка переделанную процессорную карту для PowerMac 7200 от Sonnet. Сроки выхода данного продукта объявлялись на день выхода AmigaOS 4. Так как последняя еще не вышла, то сообщество до сих пор ждет этой карты. В декабре 2004 года известный в своих кругах разработчик аппаратного обеспечения Адам Ковальчик объявил о разработке им процессорной карты для A1200 на базе процессора Freescale 8245 (аналог PowerPC 603e) с тактовой частотой в 400 МГц. На карте планировалось размещать графический контроллер ATI Mobility Radeon, слоты под SODIMM-память, USB и скоростной IDE-контроллер. Помимо всего прочего обещалось очень низкое тепловыделение и прошитый в ПЗУ JIT-компилятор для эмуляции на лету старого семейства процессоров 680x0. То есть новый процессор начинал работать сразу после включения, и можно было бы использовать AmigaOS 3.x, не устанавливая OS 4. После этого анонса последовал год молчания, и вот недавно, в ноябре 2005 года, бельгийский новостной сайт Safir.se смог взять у Адама интервью, в котором

90

сообщается, что работа над процес- плата с новым процессором с частосорной картой кипит и за год слегка той 266 МГц. поменялись характеристики. Вместо За последние годы для классичесFreescale 8245 планируется устанав- ких Amiga было разработано и выпуливать новый Freescale 5200 с тепло- щено много различной периферии. Невыделением в 1 Вт и с тактовыми час- мецкая фирма Individual Computers вытотами в 400-466 МГц, слоты под па- пускает звуковые карты, контроллеры мять заменены на распаянные прямо высокоскоростных (>115200 бод) посна плате 512 Мб Fast-памяти, а чип от ледовательных портов и многое другое ATI заменился на ноутбучный разъ- для A1200, E3B выпустила контроллеем MiniPCI для видеокарт. Сроки вы- ры USB, появилась в продаже Zorro-сехода обозначены на момент выхода тевая карта Ariadne 2 с возможностью OS 4. Одно радует – разработчики подключения различных модулей. AmigaOS 4 сообщают, что процесс коСреди сообщества за это вренечной отладки кода входит в завер- мя назрела проблема новых комшающую стадию. пьютеров. Классические компьютеОд нако н е только OS 4 о с та- ры Amiga, как и любая вещь, имеют лась на рынке операционных систем свой ресурс, и, несмотря на то, что для Amiga. Помимо классических для Escom в свое время произвела столько всех платформ Linux и BSD, свое раз- А1200, что до сих пор можно без провитие получила MorphOS (см. рис. 2). блем за рубежом купить новый (ниПосле развала Phase 5 образовалась когда не распечатавшийся) компьюновая фирма – bPlan, которая про- тер, когда-нибудь и они закончатся. должила свою работу на поприще ап- Само сообщество раскололось на непаратного обеспечения для Amiga. сколько частей: приверженцы ноВ 2000 году bPlan опубликовала спе- вых PowerPC-платформ, приверженцификации их нового компьютера цы классики и те, кто использует эмуPegasos, а к февралю следующего лятор WinUAE. Последний, несмотря года уже выпустила рабочие прото- на не очень хорошую эмуляцию чиптипы своих машин. В качестве цент- сета (проблемы с мерцанием частей рального процессора использовался изображения, проблема с VBlank, коPowerPC G3 400 МГц, а в качестве ОС – торую невозможно устранить в приSuSE Linux 7.0 и MorphOS. MorphOS, нципе и пр.), хорошо эмулирует основкак и AmigaOS 4, представляет собой ной процессор 680x0 на скоростях в 5новую операционную систему, которая 10 раз больших, чем у флагмана этой является клоном OS 3, переписанным серии 68060. WinUAE также может исполностью под PowerPC. пользовать как видеокарту графичесЗа прошедшее время Pegasos кий контроллер вашего PC, что знаи MorphOS достаточно сильно разви- чительно упрощает использование лись. Процессор обновили до Dual-G4 AmigaOS. Давно зрела идея (BoXeR, на 1 ГГц, вышло у же две версии IWin) о переносе чипсета от Amiga Pegasos (см. рис. 4). Под MorphOS раз- в современные ПЛМ. И вот совсем нерабатывается и переносится с других давно, в декабре 2005 года, было объплатформ разнообразное програм- явлено о том, что работа в этом намное обеспечение. В будущем обе- правлении ведется норвежским энщаются новые компьютеры на ба- тузиастом Деннисом ван Веереном. зе PowerPC Cell, а также суб-ноутбук По его сообщениям, в FPGA перенесена базе Freescale 5200. но уже около 60% чипсета OCS, а чтоНо и к л ас с ич е с ко е «жел е з о» бы сообщество, привыкшее к обманам не забрасывается. В последние годы за последнее время, не посчитало его Freescale выпустила новых представи- лжецом, в Интернет были выложены телей семейства процессоров 680x0 – фотографии, демонстрирующие рабоMotorola Coldfire. Этот процессор так- ту и (наверное, самое главное) ошибки же имеет много интегрированных кон- в работе эмулируемого чипсета. Надо признать, что несмотря на все троллеров, и вот, 17 декабря 2004 года Elbox анонсировала новую процес- трудности, выпавшие на ее долю, сорную карту Dragon. Конструктив- Amiga живет и до сих пор пользуется но – это тот же Mediator с AGP, только популярностью у немалой части польв один из его слотов вставляется PCI- зователей ПК.


bugtraq Отказ в обслуживании в Cisco PIX

Отказ в обслуживании в jabberd

Программа: Cisco PIX535, PIX OS ver 6.3(4), Cisco PIX515E, PIX OS ver 7.0(4), возможно, другие версии. Опасность: Средняя. Описание: 1. Уязвимость существует из-за ошибки при обработке содержимого блока данных пакета. Удаленный пользователь может с помощью специально сформированного пакета запретить установку соединения к порту сервера, расположенного за межсетевым экраном PIX, когда используется статическое перенаправление портов между локальным и глобальным IP-адресами. Например: «Атакующий → Интернет → PIX → Сервер». Удачная эксплуатация уязвимости позволит злоумышленнику заблокировать соединения между портом источником и портом назначения на 120 (PIXOS 6) и 30 секунд (PIXOS 7). Удаленный пользователь может также заблокировать доступ к сервису, расположенному за PIX (HTTP, SMTP), для определенного хоста. Пример:

Программа: jabberd 2.0. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки при обработке SASL-запросов. Удаленный пользователь может послать специально сформированный запрос, содержащий строку «response» перед строкой «auth», и вызвать отказ в обслуживании. URL производителя: www.jabberd.jabberstudio.org. Решение: Установите последнюю версию с сайта производителя.

hping2 -a $SOURCE_IP -S -c 1 -s 31337 -p 80 $TARGET_IP -d 1 hping2 -a $SOURCE_IP -S -s 0 -p 80 --faster $TARGET_IP -d 1

2. Уязвимость существует при обработке значения TTL-пакета. Удаленный пользователь может послать устройству специально сформированный пакет, содержащий значение TTL n-1. Для удачной эксплуатации уязвимости между PIX и целевым сервером должен находиться маршрутизатор, который бы возвращал ICMP-сообщение «Время истекло при передаче» (например: «Атакующий → Интернет → PIX → Маршрутизатор → Сервер»). Примеры: hping2 -a $SOURCE_IP -S -c 1 -s 31337 -p 80 -t 8 $TARGET_IP hping2 -a $SOURCE_IP -S -s 0 -p 80 --faster -t 8 $TARGET_IP

Удачная эксплуатация уязвимости позволит злоумышленнику заблокировать соединения между портом источником и портом назначения на 120 (PIXOS 6) и 30 секунд (PIXOS 7) URL производителя: www.cisco.com. Решение: В настоящее время способов устранения уязвимости не существует.

Отказ в обслуживании в MailEnable Программа: MailEnable Standard Edition версии до 1.93, MailEnable Professional Edition версии до 1.73, MailEnable Enterprise Edition версии до 1.21. Опасность: Средняя. Описание: 1. Уязвимость существует в компоненте webmail при обработке специально сформированного email. Удаленный пользователь может с помощью специально сформированного сообщения заставить систему потребить большое количество ресурсов процессора во время просмотра сообщения пользователем. 2. Неизвестная ошибка существует при обработке POPаутентификации. Подробности неизвестны. URL производителя: www.mailenable.com. Решение: Установите исправленную версию с сайта производителя.

№3, март 2006

Обход ограничений безопасности в GnuPG Программа: GnuPG версии до 1.4.2.2. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки при обнаружении неподписанных данных. Удаленный пользователь может внедрить произвольные данные в подписанное сообщение и повлиять на проверку подлинности включенных в сообщение сигнатур и сигнатур, добавленных в зашифрованное сообщение. URL производителя: www.gnupg.org. Решение: Установите последнюю версию (1.4.2.2) с сайта производителя.

Отказ в обслуживании в службе IMAP в Kerio MailServer Программа: Kerio MailServer версии до 6.1.3 Patch 1. Опасность: Средняя. Описание: Уязвимость существует из-за неизвестной ошибки при обработке входных данных в команде IMAP LOGIN. Удаленный пользователь может с помощью специально сформированной команды вызвать отказ в обслуживании приложения. URL производителя: www.kerio.com. Решение: Установите последнюю версию (6.1.3 Patch 1) с сайта производителя.

Переполнение буфера в SecureCRT/ SecureFX Программа: SecureCRT version 5.0.4 и более ранние версии, SecureFX version 3.0.4 и более ранние версии. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки при конвертации unicode-строк в многобайтные строки. Удаленный пользователь может с помощью специально сформированной строки вызвать переполнение буфера. Воздействие уязвимости неизвестно. URL производителя: www.vandyke.com. Решение: Установите последнюю версию (5.0.5 и 3.0.4)с сайта производителя.

Составил Александр Антипов

91


книжная полка

FreeBSD. Архитектура и реализация Маршал Кирк МакКузик, Джордж Невил-Нил

Думаю, я не сильно ошибусь, если предположу, что перевод этой книги был одним из самых ожидаемых событий среди системных администраторов UNIX. Сама по себе книга не нуждается в какомлибо представлении и рекламе. И это не удивительно, потому как по сути является культовой среди BSD-администраторов, можно даже в какой то степени сравнить это издание со святым

граалем. Книга начинается с введения, из которого вы узнаете о истории UNIXсистем и возникновении FreeBSD как отдельной ОС в частности. После этого своеобразного экскурса в историю начинается непосредственно раскрытие основной темы книги. Обзор дизайна FreeBSD (средства FreeBSD и ядро, управление процессами и памятью, система ввода-вывода, устройства, файловая система, терминалы, IPC, сетевая коммутация). Службы ядра (организация ядра, системные вызовы, исключения и прерывания, службы времени и ресурсов). Управление ресурсами (состояние процесса, переключение контекста, планирование потоков, создание и завершение процесса, сигналы). Управление памятью (ресурсы процесса, разделяемая память, интерфейс пейджера, страничная подкачка, замещение страниц). Обзор системы ввода-вывода (символьные и дисковые устройства, управление дескрипторами, интерфейс виртуальной файловой

системы). Устройства (обзор, уровни GEOM, CAM, ATA, конфигурирование). Локальные файловые системы (структура inode, именование, квоты, блокировки файлов, мягкие обновления, моментальные снимки файловой системы). Сетевая файловая система. Управление терминалами. Межпроцессорное взаимодействие, сетевая коммутация (интерфейс между сокетами и протоколами, маршрутизация, непосредственные сокеты). Сетевые протоколы (Ip v4 и v6, UDP, IP, TCP, безопасность). Запуск и выключение системы (начальная загрузка, инициализация ядра, модули ядра, работа системы). Замечательная во всех отношениях книга – классика.

    

Издательство: «Кудиц-Образ» Год издания: 2006 Количество страниц: 800 ISBN: 5-9579-0103-2 Цена: ≈ 697 руб. Книга предоставлена издательством «КудицОбраз».

Microsoft SQL Server 2005. Новые возможности Александр Волоха ядре SQL Server 2005, новом поддерживаемом железе и о новшествах в безопасности. Раздел «утилиты и средства администрирования баз данных» представлен материалом о управлении DB и средствами разработки, новых средствах управления и увеличения производительности. Брокер запросов SQL Server (общий обзор, настройка и администрирование, разработка приложений). Сервисы аналитики (преимущества использования, управление сервисами аналитики, средства Несмотря на свой небольшой объем, разработки). Сервисы интеграции (аркнига охватывает достаточно много ма- хитектура и компоненты сервисов, инстериала. Как ясно из названия, основ- трументы работы с пакетами). Сервисы ной акцент делается именно на рас- нотификации и отчетов. Средства воссмотрение новых возможностей про- становления данных (способы сохрадукта. Повествование начинается с опи- нения данных, поддержка баз данных, сания общих положений, а также реко- превентивные действия, резервное комендаций по установке и обновлению пирование и восстановление). ПрограмSQL Server 2005. Из главы, посвящен- мирование для SQL server (нововведеной администрированию, вы узнаете о ния, интеграция CLR и ADO.NET) Язык

92

XML и SQL Server (типы данных XML, индексы, новые возможности XML). Безопасность (обзор, изменения и преимущества SQL server 2005, хранение паролей, наборы прав доступа и новые объекты). Эту книгу сложно назвать исчерпывающим руководством по SQL Server 2005, скорее она рассчитана на людей, которые уже имеют опыт работы с SQL Server, и в данный момент перешли или только планируют перейти на версию 2005. Это издание – отличный выбор для тех, кто хочет ознакомиться со всеми новыми средствами продукта, а также приметить их на практике, в максимально сжатые сроки.

    

Издательство: «Питер» Год издания: 2005 Количество страниц: 304 ISBN: 5-469-01197-6 Цена: ≈ 375 руб. Книга предоставлена издательством «Питер».


книжная полка

Microsoft Exchange 2003 Server Алексей Вишневский

Добротная как по качеству, так и по информационному наполнению книга. Издание прежде всего рассчитано на специалистов, уже имеющих опыт работы с Exchange. Круг тем, рассмотренных в рамках книги, достаточно широк: обзор Exchange 2003 (описание новых возможностей данной версии, компоненты, а также сравнительный анализ

Exchange Server 2003 и Lotus Domino). Управление получателями (группы адСлужба каталогов Active Directory (архи- ресатов, списки рассылки). Управлетектура AD, доменная модель службы ние общими папками (формирование каталогов, пространство имен AD, фи- иерархии и администрирование). Призическая структура, репликация изме- менение политик Exchange для конфинений каталогов, а также импорт и эк- гурирования почтовой системы. Наспорт объектов каталога). Установка стройка протоколов SMTP, HTTP, NNTP, Exchange2003 (подготовка к установ- POP3, IMAP4. Маршрутизация сообщеке, приготовление корпоративной се- ний (формирование маршрутной топоти к развертыванию, работа с масте- логии, группы маршрутизации). Вопром, удаление). Выполнение обновле- росы масштабирования Exchange. Моний предыдущих версий (использова- ниторинг производительности, поиск ние Active Directory Connector, обновле- и разрешение проблем, а также восние Exchange Server 5.5/2000, особен- становление работоспособности почтоности совмест��ой работы 2003 с преды- вого сервера. Как вы сами можете убедущими версиями). Реализация адми- диться, книга охватывает практически нистративной иерархии (инструменты, все ключевые моменты администрировыбор административной модели, ис- вания Exchange 2003. пользование механизма административных групп). Управление хранили-  Издательство: «Питер» щами (архитектура информационного  Год издания: 2005 хранилища в Exchange 2003, планиро-  Количество страниц: 672 вание структуры, управление группа-  ISBN: 5-469-00386-8 ми строения, работа с базами данных  Цена: ≈ 548 руб. хранилищ и индексация содержимого). Книга предоставлена издательством «Питер».

SQL. Cправочник Кевин Клайн

Среди прочих справочников по SQL этот выгодно выделяет то, что он охватывает практически все базы данных, поддерживающие стандарт ANSI SQL 2003, а именно Microsoft SQL Server 2000 , DB2 v8.0, Sybase Adaptive server 12.5, Oracle 10g, а так же OpenSource DB – MySQL 4.x и PostgreSQL 7.x . Весь материал разделен на пять логических частей. Первая глава посвящена истории и ре-

№3 март 2006

ализации SQL, из нее вы узнаете о реляционной модели баз данных, описание стандартов SQL, познакомитесь с основными реализациями баз данных. Основные концепции в виде фундаментальных основ, необходимых для понимания принципов работы баз данных, а также основные команды описаны во второй главе. Далее читателю предлагается справочник по инструкциям SQL (отсортированным в алфавитном порядке). В качестве примера приводятся реализации для каждой из вышеописанных баз данных. В начале главы приводится таблица, из которой можно узнать о степени реализации той или иной функции в представленных базах данных. Функции SQL – также отсортированный по алфавиту перечень функций SQL 2003 с описанием реализаций (агрегатные, оконные, скалярные функции). Также, в рамках данной главы представлена информация

обо всех платформо-специфичных функциях. Программирование баз данных (общий обзор, открытие и закрытие соединений с DB, управление транзакциями, выполнение инструкций, извлечение данных, связанные параметры, обработка ошибок). Весь изложенный материал носит сугубо практический характер, а большое количество примеров поможет усвоить прочитанное наилучшим образом. Книгу можно рекомендовать всем без исключения DBA-, SQL-программистам, а также системным администраторам, работа которых так или иначе касается баз данных.

    

Издательство: «Кудиц-Образ» Год издания: 2006 Количество страниц: 832 ISBN: 5-9579-0114-8 Цена: ≈ 476 руб. Книга предоставлена издательством «КудицОбраз».

Обзор книжных новинок подготовил Александр Байрак

93


подписка на 2006 год Российская Федерация

 Подписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать»

 Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог»  Альтернативные подписные агентства: Агентство «Интер-Почта» (095) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (095) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.ru  Подписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru

СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ:  Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению печа-

ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21)

 Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс»

 Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)

 Узбекистан – по каталогу «Davriy nashrlar» российские издания через агентство по распространению печати «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик, 5/3, офис 33)  Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Давида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22)  Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42)  Молдавия – по каталогу через ГП «Пошта Молдавей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17) по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)  Подписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220

Подписные индексы:

20780* 81655** по каталогу агентства «Роспечать»

87836 по каталогу агентства «Пресса России» * **

94

годовой полугодовой


подписка на 2006 год Редакционная подписка Открыта подписка через редакцию. Вы можете оформить подписку на любое количество номеров 2006 года. Редакция не высылает журналы за пределы Российской Федерации.

Для юридических лиц:

 Отправьте заявку по факсу (095) 928-82-53 или по e-mail: info1@samag.ru.

 Укажите наименование и банковские реквизиты своей организации, почтовый индекс и адрес доставки журнала, телефон и e-mail контактного лица, период подписки и количество номеров. Редакция выставит вам счет, после оплаты которого вы начнете получать журналы по почте. Необходимые бухгалтерские документы высылаются почтой.

№5

(30 по )м д ww писн w.s ой ай 2 am ин 0

05 По ag дек Ищ чем .ru с 8165 5 ем у M пр S S Ст WP роим ичин QL м A-E з ы ед ле nte ащи На нн стр rpr ще ор is н аи Ка аб e, ную ва ота 80 уд к во ем 2.1 бес ет? ал сс UP е x т н а S Чт EA пров ны но по ов P-T од е ф вит дL аж LS ную inu ай ь но лы се x в к тана зн ть: по ать ор вл д п и ор ва Эф BS об ати ем D IPпо фек вн Sy тел ля ти ой ma ми вн еф Ко се nte по о у он ти c ль пр с п нтро и и A зо ав ntiv ом ли ва ля ощ ру iru Ин тел ем ью ем s9 ей со терв .0 OS без зд ью вA SIM оп ате с D ас ле Ла но м я рр сть зы и У се ка ол ти Pe лом rl –

Для физических лиц:

 Заполните нижеприведенную квитанцию, оплатите в любом банке и пришлите в редакцию копию с отметками банка.  После поступления платежа редакция начнет отправлять вам номера.

Стоимость подписки через редакцию: 900* руб. за 6 номеров 1800* руб. за 12 номеров

* Включая НДС и почтовую доставку

№3, март 2006

95


СИСТЕМНЫЙ АДМИНИСТРАТОР №3(40), Март, 2006 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редактор Алексей Коршунов Внештатные редакторы Алексей Барабанов Кирилл Тихонов Сергей Супрунов Татьяна Ильченко РЕКЛАМНАЯ СЛУЖБА тел./факс: (095) 928-8253 Дарья Хохлова reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук По вопросам распространения обращайтесь по телефону: (095) 928-8253 (доб. 120) 107045, г. Москва, Ананьевский переулок, дом 4/2, стр. 1 тел./факс: (095) 928-8253 Сайт журнала: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 10000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.). За содержание статьи ответственность несет автор. За содержание рекламного объявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.

ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Перспективы профессии. Автопортрет Кто такие системные администраторы, почему они этим занимаются, что ждет их впереди? Попробуем разобраться в настоящем положении дел и сделать предположения на ближайшее будущее.

тема сборки программ, используемая во FreeBSD имеет значительно большие возможности, чем те, которые мы задействовали. Какие это возможности и как их использовать в своих портах – в продолжении материала.

Используем средства библиотеки OpenSSL Архитектура и реализация для криптографической файловой системы reiser4 защиты данных

Не уступая многочисленным аналогам Защищать данные надо – с этим утв функциональности (здесь и практи- верждением трудно не согласиться. Сачески неограниченные размер раздела мым надежным способом скрыть ини количество файлов, и динамическое формацию от посторонних глаз являетразмещение объектов, и эффективная ся ее шифрование. В настоящее время работа с маленькими файлами, и быс- существует большое количество стойтрое восстановление после сбоев), про- ких криптографических алгоритмов, изводительности и масштабируемос- позволяющих надежно защитить конти, reiser4 предоставляет пользовате- фиденциальные данные, и множество лям ряд дополнительных возможностей. их программных реализаций, доступПрозрачное сжатие и шифрование фай- ных для свободного использования. лов, полное журналирование данных, Речь пойдет о библиотеке OpenSSL, а также практически неограниченную которая предоставляет в распоряже(за счет плагинной архитектуры) рас- ние пользователя набор функций, реширяемость, другими словами, способ- ализующих различные криптографиность приспосабливаться к сколь угодно ческие алгоритмы, такие как Triple-DES, сложным запросам потребителей. Blowfish, AES, RSA и другие. Не углубляясь в детали реализации алгоритСоздаем порт для FreeBSD мов, мы рассмотрим несколько праксвоими руками. тических примеров использования бибЧасть 2: расширенные лиотеки OpenSSL для генерации псеввозможности дослуч��йных чисел, вычисления хэшей В первой части статьи мы рассмотре- (дайджестов), и шифрования данных ли основные вопросы создания порта с использованием симметричных и асдля FreeBSD своими руками. Но сис- симетричных алгоритмов.

Уважаемые читатели! Спешите оформить подписку на первое полугодие 2006 года! Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.

Доставка почтой в любую точку России.

96


040 Системный Администратор 03 2006