98
Роспечать – 20780, 81655 Пресса России – 87836 Интер-почта – тел. (095) 500-00-60 Так видит журнал читатель, который забыл оформить подписку: ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Так видит журнал читатель, оформивший подписку: НОВОГОДНИЕ КАНИКУЛЫ ЗАТЯНУЛИСЬ БЫСТРО РАСКУПИЛИ ТИРАЖ НЕОЖИДАННО ЗАКОНЧИЛИСЬ ДЕНЬГИ УЕХАЛ В ОТПУСК ПОСЛЕ ОТПУСКА АВРАЛ НА РАБОТЕ №5(30) май 2005 подписной индекс 81655 www.samag.ru Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl №5(30) май 2005 подписной индекс 81655 www.samag.ru Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl №3(40) март 2006 №3(40) март 2006 подписной индекс 20780 www.samag.ru Узнай секреты WMI: события и провайдеры Кириллизация в Linux Знакомимся с Gentoo: установка системы Создаем порт для FreeBSD своими руками Zserver Suite: защищаем корпоративные хранилища данных Управляем сетевым оборудованием с помощью протокола SNMP Работаем с PDF из Perl Документация – экономия времени или его бесполезная трата?

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

Embed Size (px)

DESCRIPTION

№3(40) март 2006 подписной индекс 20780 www.samag.ru Н Е О Ж И Д А Н Н О Б Ы С Т Р О Р А С К У П И Л И Т И Р А Ж Н О В О Г О Д Н И Е П О С Л Е О Т П У С К А А В Р А Л Н А Р А Б О Т Е №3(40) март 2006 Почему MS SQL медленно работает? Ищем причины Почему MS SQL медленно работает? Ищем причины Настраиваем UPS под Linux

Citation preview

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

Роспечать – 20780, 81655Пресса России – 87836Интер-почта – тел. (095) 500-00-60

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

ПОДПИШИТЕСЬ И ЧИТАЙТЕ!

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

НОВОГОДНИЕ

КАНИКУЛЫ

ЗАТЯ

НУЛИСЬ

БЫСТР

О РАСКУПИЛИ

ТИРА

Ж

НЕОЖ

ИДАННО

ЗАКОНЧИЛИСЬ Д

ЕНЬГИ

УЕХАЛ В

ОТП

УСК

ПОСЛЕ ОТП

УСКА

АВРАЛ Н

А РАБОТЕ

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

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

Строим защищенную беспроводную сеть:WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0в корпоративной сети

Эффективно управляем полями пользователей в AD

Контролируем безопасность сетис помощью OSSIM

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

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

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

Строим защищенную беспроводную сеть:WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0в корпоративной сети

Эффективно управляем полями пользователей в AD

Контролируем безопасность сетис помощью OSSIM

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

№3(

40)

мар

т 20

06

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

Узнай секреты WMI: события и провайдеры

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

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

Создаем порт для FreeBSD своими руками

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

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

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

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

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

1№3, март 2006

оглавление

ТЕНДЕНЦИИ3

ХОББИ

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

32

Рашид Ачилов[email protected]

Узнай секреты WMI: события и провайдерыЧасть 1: дополнительные возможности

6

АДМИНИСТРИРОВАНИЕ

Константин Леонтьевklеоnt@miсrоsоft.соm

Решаем задачи обработки системных событий, исполь-зуя технологию WMI на примере подключения съем-ных USB-дисков.

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

22

Сергей Супрунов[email protected]

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

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

Алексей Барабанов[email protected]

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

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

Илья Александров [email protected]

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

ПРОГРАММИРОВАНИЕ

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

СЕТИ

История компьютеров «Амига»Часть вторая: 1995-2006

86

Сергей Зуев[email protected]

РЕТРОСПЕКТИВА

КНИЖНАЯ ПОЛКА

77, 91 BUGTRAQ

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

После смерти Джея Майнера и банкротства компании будущее Amiga оказалось под вопросом.

СОБЫТИЯ4

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

40

Андрей Коврин[email protected]

Обзор возможностей проекта.

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

42

Сергей Яремчук[email protected]

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

MikroTik – Router OS

46

Сергей Яремчук[email protected]

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

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

52

Алексей Шелестов[email protected]

Как обеспечить защиту конфиденциальной инфор-мации, хранимой и обрабатываемой на корпоратив-ных серверах?

ДОКУМЕНТАЦИЯ

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

56

Алексей Коршунов[email protected]

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

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

60

Роман Ерин[email protected]

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

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

64

Андрей Бирюков[email protected]

Теоретические основы работы протокола SNMP и практи-ческая реализация решения некоторых задач с помощью сценариев на языке Perl.

Переходим от VBScript к ASP и ASP.NET: Часть2

70

Иван Коробко[email protected]

Дописываем Framework на примере сетевых папок.

Работаем с PDF из Perl78

Валентин Синицын[email protected]

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

Коллекция «Почему?»84Анна Николаева

[email protected]

92

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

2

конкурс

1 место – 30 000 рублей 2 место – 20 000 рублей 3 место – 10 000 рублей

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

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

О номинациях1. Серией материалов считается блок из не менее чем

двух статей. Тема серии – по собственному выбору ав-тора или же по выбору редакции.

2. Статья, написанная на тему, придуманную автором и одобренную редакцией.

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

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

Условия публикацииПринимаются материалы, нигде ранее не опубликованные (в том числе в Интернете, прочих глобальных сетях, печат-ных изданиях и т. д.). Статьи не рецензируются.

За содержание статьи ответственность несет автор.В течение двух недель редакция принимает решение

о публикации статьи и сообщает об этом автору.Редакция оставляет за собой право редактировать пре-

доставленные материалы.Редакция имеет эксклюзивное право на распростране-

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

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

По истечении одного года с момента первой публика-ции автор имеет право опубликовать свой материал в дру-гом месте без предварительного письменного согласия редакции.

Общие требования к статьямСтатьи не должны иметь рекламный характер какого-либо продукта, компании или технологии.

В статье указываются ссылки на источники информа-ции.

Не допускается несанкционированный перевод на рус-ский язык статей, обзоров и сравнительных тестирований продуктов, опубликованных в иностранных изданиях.

Рекомендации авторамОбъем статьи – от 4 до 20 тыс. знаков. Если тема статьи

предполагает объем, превышающий 20 тыс. знаков – раз-бивайте материал на несколько частей.

Если вы пишете о продукте, технологии или компании, описывайте не только «плюсы», но и «минусы», а также при-водите информацию о конкурентах.

Рекомендуем ознакомиться со статьями на интересую-щую вас тему, которые уже есть на нашем сайте.

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

КонтактыАдрес: 107045, г. Москва, Ананьевский переулок д. 4/2, стр. 1, Редакция «Учительской газеты», журнал «Систем-ный администратор»Телефон: (495) 928-82-53Факс: (495) 928-82-53Сайт: www.samag.rue-mail: [email protected] [email protected]

Редакция журнала «Системный администратор» объявляет об учреждении 3 премий авторам по итогам 2006 года:

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

3№3, март 2006

тенденции

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.

Ubuntu будут тестировать больше обычногоРелизы Ubuntu Linux выходили каждые 6 месяцев, однако для новой стабильной версии популярного GNU/Linux-дист-рибутива для настольных ПК предлагается увеличить срок тестирования на 6 недель.

Следующий релиз Ubuntu, получивший кодовое назва-ние «Dapper Drake», должен появиться в апреле и станет первой версией Ubuntu Linux с продолжительной техничес-кой поддержкой для пользователей: 3 года – для десктоп-редакции, 5 лет – для серверного варианта (для текущей версии этот срок составляет 3 года).

Как сообщил в электронном письме Марк Шаттлворт, основатель проекта Ubuntu Linux, очень важно, чтобы все новшества были хорошо опробованы на стабильную рабо-ту: «Мы будем жить с Dapper целых пять лет – так давай-те предоставим релизу еще пару недель сейчас, дабы он стал достойным продуктом проекта Ubuntu на все время своей жизни».

Шаттлворт не собирается повредить хорошей репута-ции Ubuntu, сложившейся благодаря своевременным ре-лизам, однако небольшая задержка позволит добиться большего тестирования, проверки на совместимость с же-

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

BECTA «противоречиво» относится к Open SourceПол Дженкинс из компании SimpleICT указал на «непосле-довательность» в отношении британского агентства по об-разовательным коммуникациям и технологиям (BECTA) к открытому ПО.

Список образовательных программ, опубликованный BECTA, ранее сообщавшим о возможности для школ сэко-номить благодаря Open Source, содержит ничтожно малое число приложений для GNU/Linux (18 против трех тысяч для различных версий Windows). Вдобавок к этому там вовсе от-сутствуют свободные программы для образования.

Дженкинс же видит хорошие примеры из среды откры-того ПО: «TuxMaths – отличная математическая программа для детей, но ее здесь нет. На самом деле, тут вообще ни-чего нет. Будь вы учителем, желающим использовать Linux, официальный сайт подсказал бы вам, что для этого нет про-граммного обеспечения».

В свою очередь, представитель BECTA объявил о наме-рении закрыть веб-сайт и порекомендовал пользователям обращаться к базе данных Curriculum Online. Однако, как вы-яснилось, и в ней фактически нет программного обеспече-ния с открытым кодом.

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

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

4

события

го лишь 3.5 MHz (вот уж где люди проявляют своё мастерс-тво, чтобы создать шедевры). Есть и специальный Wild-кон-курс, в котором могут участвовать работы, не подходящие по критериям в какой-либо из перечисленных конкурсов.

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

Вне конкурсов, на открытом воздухе, пройдет соревнова-ние по спортивному метанию жёстких дисков на дальность, а также другие забавные конкурсы. Победителей ожида-ют призы.

Фестиваль DiHalt – это еще и повод вживую встретить старых друзей, с которыми зачастую общаешься только че-рез Интернет, а также завести новые знакомства! Здесь вы не увидите ленивых геймеров. Только творческие люди из разных стихий.

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

Любой зритель может превратиться в участника фестива-ля, если пришлёт организаторам свою работу, соответству-ющую указанным тематикам конкурсов, а также прочим ню-ансам, указанным в правилах. Каждый конкурс специально имеет свои ограничения и требования, что в конечном счете делает работы более интересными, а подходы к реализации более изощренными, и это поможет выявить настоящих про-фессионалов своего дела. Подробнее ознакомиться с прави-лами и требованиями для конкурсных работ вы можете по ад-ресу: http://www.dihalt.org.ru/rules.htm. Свои работы отправляй-те на электронный адрес [email protected].

После окончания первого дня по принципу самоорганиза-ции будет устроена hidden party (которая будет идти всю ночь). На ней вы сможете обсудить увиденное с друзьями, да и прос-то пообщаться с людьми в более неформальной атмосфере.

Иногородним посетителям будет оказана помощь по раз-мещению в гостиницах Нижнего Новгорода.

Ждем вас на DiHalt 2006 !Все вопросы, связанные с фестивалем, отправляйте

на адрес [email protected].

DiHalt 2006: компьютерное искусство в чистом виде

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

ное количество интересных конкурсов, нацеленных на три ос-новных направления: программирование, музыка и графика. Каждое из направлений, в зависимости от сложности реали-зации и методов подхода, разбито на несколько конкурсов. На фестивале будут демонстрироваться работы, созданные не только на современных быстрых персональных компью-терах, но и на редких для нашей страны компьютерах 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, на которых центральный процессор работает на частоте все-

Добро пожаловать на DiHalt 2006, один из крупных российских фестивалей компьютерного искусства. Несколько сотен человек из разных городов России и ближнего зарубежья в очередной раз соберутся в Нижнем Новгороде.

Когда: 29-30 апреля Где: г. Нижний Новгород, ДК им. Орджоникидзе (ул. Чаадаева, 17) Подробности: www.dihalt.org.ru

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

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

Anything else?

Çâîíèòå, äîãîâîðèìñÿ! ;-)

г. Москва, Хлебный переулок 2/3тел. 29-161-32, 202-61-43

(круглосуточно)e-mail: [email protected]

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

6

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

Узнай секреты WMI: события и провайдерыЧасть I: дополнительные возможности

Константин Леонтьев

Алиса терпеливо ждала, пока Гусеница не соблаговолит снова обратить на нее

внимание. Минуты через две та вынула кальян изо рта, зевнула –раз, другой – и потянулась.

Потом она сползла с гриба и скрылась в траве, бросив Алисе на прощанье:

– Откусишь с одной стороны – подрастешь, с другой – уменьшишься!

– С одной стороны чего? – подумала Алиса. – С другой стороны чего?

– Гриба, – ответила Гусеница, словно услышав вопрос, и исчезла из виду.

С минуту Алиса задумчиво смотрела на гриб, пытаясь определить, где у него одна сторона,

а где – другая; гриб был круглый, и это совсем сбило ее с толку. Наконец, она решилась:

обхватила гриб руками и отломила с каждой стороны по кусочку.

Приключения Алисы в стране чудес.Чарльз Латвидж Доджсон

(Пер. Н. М. Демуровой)

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

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

7№3, март 2006

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

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

ные с несанкционированным применением пользователя-ми съемных устройств памяти, довольно эффективно ре-шают с помощью различного дополнительного ПО (напри-мер, DeviceLock). Мы же с вами попробуем решить часть из них стандартными средствам WMI. Наша цель – зафик-сировать факт события подключения таких устройств и вы-полнить некоторое ответное действие (например, сцена-рий VBScript).

Для начала давайте рассмотрим простой пример ко-да на VBScript, использующего WMI для синхронного от-слеживания событий подключения съемных дисковых ус-тройств. Он послужит нам отправной точкой в данной ра-боте. Этот пример приведен на листинге 1. Попробуйте запустить этот сценарий командой cscript <имя сценария> и посмотреть на результат его работы при подключении ус-тройств USB FlashDrive.

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

Рассмотрим внимательнее WQL-запрос, с помощью которого наш сценарий подписывается на события WMI. Для того чтобы получать уведомления об интересующих нас событиях, мы делаем выборку объектов специально-го класса __InstanceCreationEvent, который служит для от-слеживания внутренних событий WMI, возникающих при создании экземпляров объектов любого класса, зарегис-трированного в репозитории WMI. Заметим, что сущест-

Листинг 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

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

8

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

вуют и другие специальные классы отслеживания внут-ренних событий 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.

Этот метод возвращает управление 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. Синхронная обработка собы-тий – это когда процесс ожидает события и более ничем не занят. Обычно это ожидание – бесконечный цикл про-

Внутренне классы событий Описание

__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

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

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

9№3, март 2006

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

верки условия: поступило событие или нет. В нашем слу-чае в сценарии на листинге 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.

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

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

Листинг 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.DescriptionEnd 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 "Ожидаем события ..."

While (True) Wscript.Sleep(1000)Wend

Листинг 3. Одновременное использование синхронной и асинхронной техники обработки событий на примере Таймера

Dim tCount

Sub TIMER_OnObjectReady(objReceivedEvent, objAsyncContext) tCount = tCount + 1 Wscript.Echo "Произошло событие Таймера, ↵ счетчик tCount=" & tCountEnd 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.ProcessNameLoop

MySink.Cancel

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

10

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

Для решения этой задачи существуют постоянные подпис-чики (permanent event consumer). В общем случае постоян-ный подписчик – это специальный компонент COM+, кото-рый постоянно зарегистрирован получать определенные события от службы WMI.

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

Стандартные подписчики на событияДля того чтобы упростить жизнь системных администра-торов и избавить их от программирования компонентов COM+, в стандартной инсталляции Microsoft Windows XP и Windows Server 2003 включены пять готовых постоянных подписчиков событий. Эти готовые постоянные подписчики носят название Стандартных Подписчиков (Standard Event Consumers). Все они перечислены в таблице 2.

В Microsoft Windows 2000, к сожалению, их только два. Кроме того, один из них ActiveScriptEventConsumer не ском-пилирован, поэтому прежде чем его использовать необхо-димо скомпилировать командой:

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

Создание MOF-файла для подписки на события и его компиляцияДля того чтобы воспользоваться стандартными подпис-чиками на события WMI, вовсе не обязательно писать сценарии VBScript. Для этого достаточно взять в качест-ве шаблона приведенный на листинге 4 MOF-файл и не-много модифицировать его под себя. Далее достаточно просто скомпилировать его штатной утилитой mofcomp – и все готово.

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

Название подписчика Описание

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

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

NTEventLogEventConsumer

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

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

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

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

Листинг 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;

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

// Создание экземпляра объекта фильтра событий// и присвоение ему псевдонима $FILTER

instance of __EventFilter as $FILTER{ // Уникальное имя экземпляра Name = "MyRemDevFilter";

// Определяем запрос WQL для отбора интересующих // нас событий Query = "SELECT * FROM __InstanceCreationEvent ↵ WITHIN 5 WHERE TargetInstance ISA " "\"Win32_LogicalDisk\" ↵ AND TargetInstance.DriveType = 2" ;

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

// Создаем экземпляр объекта связывания// между фильтром и подписчиком, используя их// временные псевдонимы

instance of __FilterToConsumerBinding{ Consumer = $CONSUMER; Filter = $FILTER;};

mofcomp %windir%\wbem\Scrcons.mof

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

11№3, март 2006

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

ните его в соответствии с листингом 4. Затем выполните синтаксическую проверку файла командой:

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

Для того чтобы созданный нами MOF-файл был импор-тирован в репозиторий WMI и события подключения съем-ных дисковых устройств типа USB FlashDrive стали регист-рироваться в журнале приложений, нам необходимо ском-пилировать этот MOF-файл. Для этого с правами админис-тратора выполните команду:

Если после выполнения команды вы увидите сообщение «Storing data in the repository... Done!», то это означает, что операция прошла успешно. Теперь проверьте журнал при-ложений («Event Viewer → Application») на предмет ошибок от службы WinMgmt. Скорее всего, их не будет. Если же вы увидите запись об ошибке с кодом 10 (EventID 10), в текс-те которого будет присутствовать информация об ошибке WMI номер 0x80041003 [5], то знайте, что той учетной за-писи, под которой вы проделали компиляцию MOF-фай-ла, недостаточно прав для активации фильтра событий. Для решения этой проблемы выполните все эти действия из-под локальной встроенной учетной записи админист-ратора. Это ситуация довольно редкая, но она случается с доменными учетными записями, включенными в группу локальных администраторов при отсутствии подключения к контроллеру домена. Рассматривать детально причину такого провидения системы мы сейчас не будем. Просто помните об этом.

После того как вы подключите к компьютеру съемное дисковое устройство, в журнале событий вы увидите собы-тие с текстом примерно следующего содержания:

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

сание экземпляра объекта класса стандартного подпис-чика 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:

mofcomp –check NTLog-for-remdev.mof

mofcomp NTLog-for-remdev.mof

Event ID: 235Source: MyMonitoringType: InformationDescription: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 froma remote computer. You may be able to use the /AUXSOURCE= flagto 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.

Листинг 5. Код из файла script.vbs. Файл должен находиться в папке c:\windows\system32\wbem

Dim objFSO, objFile

Set objFSO = CreateObject("Scripting.FileSystemObject")

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

12

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

Поместите этот сценарий в папку c:\windows\system32\wbem. В принципе его можно хранить и в любой другой папке, но вы должны понимать, что при наличии соответс-твующих прав на файл пользователь может изменить со-держимое VBS-сценария, а поскольку он выполняется в контексте безопасности SYSTEM, то пользователь мо-жет поднять свои права на локальной машине и натво-рить еще много других бед. Рекомендуемая мной папка имеет достаточно надежные разрешения доступа к фай-лам по умолчанию и позволит избавиться от этой потен-циальной уязвимости.

Теперь пришел черед модифицировать наш MOF-файл. На листинге 6 дано определение экземпляра объекта стандартного подписчика, ответственного за запуск сце-нариев. Как вы уже могли убедиться, все довольно прос-то. Мы, как и раньше, определяем уникальное имя экзем-пляра класса стандартного подписчика и задаем другие его свойства. Замените в нашем MOF-файле (см. лис-тинг 4) описание стандартного подписчика на это новое описание.

Наиболее важным для нас свойством является имя фай-ла сценария, который следует исполнять в качестве реакции на события. Смысл всех остальных свойств вполне очеви-ден из их названия. Рассмотренная проблема с размеще-нием файла сценария может быть решена еще одним спо-собом. Зачем вообще сохранять сценарий на диск маши-ны, где он может быть модифицирован пользователем, ког-да можно сохранить его код прямо в репозитории WMI. Ко-нечно, в каких-то случаях этот способ может быть не очень удобным, однако я специально привел его пример на лис-тинге 7, поскольку этот способ хранения сценария реакции на события априори более безопасный.

Обратите внимание, что сценарий VBScript задается в виде текстовой строки, как в языке C++, и для перево-да строк используется спецсимвол «\n», а для включения в текст двойных кавычек и обратных наклонных черт – спец-символы «\"» и «\\» соответственно.

После того как вы проделали изменение нашего ба-зового MOF-файла, еще раз проверьте синтаксис MOF-файла и компилируйте его, так как описано выше коман-дой mofcomp. После этого подключите к системе съемное запоминающее устройство USB FlashDrive и убедитесь, что в корне диска C: создался файл отчета ScriptLog.txt о работе нашего сценария с примерно следующим содер-жимым:

Отмена регистрации постоянных подписчиковПосле того как вы проделали упражнение с созданием пос-тоянного стандартного подписчика на события WMI, этот подписчик будет работать в системе даже после ее пере-загрузки. У пытливого читателя сразу же возникнет вопрос: «Как же теперь отменить все результаты наших эксперимен-тов?» Эта задача решается довольно просто.

Для того чтобы отменить созданную нами постоянную регистрацию стандартных подписчиков, следует выполнить приведенный на листинге 8 сценарий VBScript.

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

Листинг 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"

Time: 20.03.2006 12:43:18; Entry made by: ASECScript Started for USB Drive: E:

Листинг 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_

Листинг 6. Пример кода MOF-файла для создания экземпляра стандартного подписчика, выполняющего сценарий из указанного текстового файла

instance of ActiveScriptEventConsumer as $CONSUMER{ Name = "MyStandardConsumer"; KillTimeout = 300; ScriptingEngine = "VBScript"; ScriptFileName = "c:\\windows\\system32\\wbem\\ ↵ script.vbs";};

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";};

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

13№3, март 2006

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

NTLogConsumerForRemDevFilter и к экземпляру стандарт-ного подписчика с именем NTLogConsumerForRemDev. Пос-ле нахождения всех этих связывающих объектов он удаля-ет их, а затем удаляет и сами экземпляры объектов стан-дартного подписчика и фильтра событий.

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

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

Для сравнения один из них, приведенный на листин-ге 9, использует внутренние (intrinsic) события и внутрен-ние классы отслеживания событий WMI, а второй, приве-денный на листинге 10, использует внешние (extrinsic) со-бытия, генерируемые провайдером WMI StdRegProv.

В примере на листинге 9 сценарий, используя синх-ронную технику, отслеживает события создания удаления и переименования файлов с расширением TXT в папке C:\TEMP. Если вы будете экспериментировать с этим сцена-рием, будьте аккуратны, не увлекайтесь расширением об-ласти мониторинга за счет захвата большего числа фай-лов и папок. В современных версиях OC Windows измене-ния в файловой системе происходят очень часто, и ядро WMI может не выдержать потока всех свалившихся на не-го событий и заберет почти 100% процессорного времени системы на их обработку.

Следующий пример, приведенный на листинге 10, по-казывает пример синхронной техники обработки внешних (extrinsic) событий WMI для провайдера StdRegProv.

Поскольку пример довольно прост, мы не будем сейчас останавливаться на его внимательном рассмотрении и ос-тавим это на вторую часть статьи, где среди прочего бу-дет подробно рассматриваться работа с провайдером WMI для доступа к реестру.

Что еще есть на вооружении WMI?Дополнительные возможности WMI не исчерпываются толь-ко обработкой событий и созданием постоянных стандарт-ных подписчиков. В следующей части статьи мы поговорим о практическом использовании основных провайдеров WMI и приемах работы с ними. Среди этих провайдеров я осо-бо хотел бы отметить следующие: Win32_Ping – осущест-вляющий формирование ICMP Echo-запросов к указанным хостам сети, Win32_NTEventLog – с которым мы частично знакомы и который обеспечивает доступ к журналам собы-тий системы OC Windows. Также мы рассмотрим провай-дер работы с реестром – StdRegProv и провайдер взаимо-действия с Microsoft Active Directory. Кроме них, будет по-лезно обсудить провайдер для работы со счетчиками про-изводительности и довольно простой вопрос, который, од-нако, вызывает частенько сложности, – работа с датами и временем через WMI.

Ссылки, литература: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-4BE1-8A76-1C4099D7BBB9&displaylang=en.

4. WMI Code Creator 1.0 – ht tp: / /download.microsof t.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/en-us/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.

Листинг 9. Пример синхронного отслеживания событий с файлами TXT в папке c:\temp

strComputer = "."Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\CIMv2") Set objEvents = objWMIService.ExecNotificationQuery _("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _ "TargetInstance ISA 'CIM_DataFile'" & _ " AND TargetInstance.Drive = 'c:'" & _ " AND TargetInstance.Extension = 'txt'" & _ " AND TargetInstance.Path = '\\temp\\'")

Wscript.Echo "Ожидаем события ..."Do While(True) Set objReceivedEvent = objEvents.NextEvent

WScript.Echo "Filename: " & ↵ objReceivedEvent.TargetInstance.FileName WScript.Echo "Name: " & ↵ objReceivedEvent.TargetInstance.NameLoop

Листинг 10. Пример синхронного отслеживания событий изменения значения в реестре

strComputer = "."

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

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

14

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

Тема кириллизации или «русифика-ции», как иногда выражаются, с не-которых пор исчезла с первых по-

зиций рейтингов интереса со стороны неофитов Linux. В нашей стране уже давно не внедряются новые кодировки. И хотя по их числу мы не превосходим народности с иероглифическими ме-тодами написания, но в европейском регионе явно ходим в рекордсменах. И вот теперь, когда, казалось бы, уже нет проблем, чтобы предложить поль-зователям Linux все разнообразие про-веренных наработок и материалов по кириллизации, многие дистрибуторы начинают экономить, можно сказать, на самом святом. Им кажется, что надо уже сейчас заставить всех пользова-телей работать в универсальной коди-ровке UTF-8 (алгоритм 8-го представ-ления символов UNICODE) и в локалях,

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

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

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

Есть два способа: по содержимому самого потока данных, так называе-мый «in-band», и на основании внешне-го предписания, или «out-band».

Первый способ зависит от фор-мата, второй – диктует формат. Из-начально использовался только вто-рой способ. Например, в первых пер-сональных компьютерах исключалось применение символьных данных в ко-дировках, отличных от кодовой стра-ницы 437 (IBM Codepage 437). Исполь-зование данной кодовой таблицы бы-ло закреплено аппаратно, то есть вне-

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

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

Алексей Барабанов

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

15№3, март 2006

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

шним путем. С распространением компьютерной технологии в регионах, где приняты иные требования на пред-ставление символьных данных, была определена процедура так называе-мой локализации, или модификации программного обеспечения для ис-пользования региональных стандар-тов. Но данный путь оказался слиш-ком трудозатратным. И тогда было произведено функциональное выде-ление всех национально-зависимых программных компонентов так, чтобы можно было настраивать требуемую локализацию динамически. Естествен-но, данная процедура всецело опреде-лялась платформой. Так, в частности, на обсуждаемой платформе GNU/Linux локализация управляется единым об-разом на основе так называемых «ло-калей» (locale) с помощью системной библиотеки glibc.

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

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

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

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

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

Самый простой пример такой ситу-ации, когда программа использует ра-нее накопленные данные, где тип ис-пользуемой кодировки определяет ин-формацию – это имена файлов, индек-сы в структурах БД, базы служебных сообщений, сохраненные из Интернета документы. Вы наблюдали на экранах компьютеров «кракозябры» в сообще-ниях программ, которые в 90% случа-

Локали и их образованиеСтандарты локализации, применяемые в системах GNU/Linux, называются POSIX-локалями, поскольку их применение рег-ламентируются именно этим стандартом на интерфейс между операционной сис-темой и прикладной программой. Обычно база локалей размещается в /usr/lib/locale. В SuSE Linux указанная директория при-надлежит пакету glibc-locale. Именно там ищутся описания правил национальных стандартов и прочее, что необходимо для традиционного представления данных в со-ответствии с принятой локалью.

И если там нужная локаль отсутствует, то ее можно скомпилировать с помощью утилиты localedef. Для этого следует вы-звать утилиту с параметрами: файл описа-ния стандартов локали и файл с описанием соответствия символов юникода (unicode) тем, что приняты для кодирования инфор-мации в данной локали. Например:

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

# localedef -i ru_RU -f CP1251 ru_RU.CP1251

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

16

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

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

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

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

Вот о сопутствующих данных далее и поговорим, но сна-чала проверим, какие локали нам предлагаются в SuSE Linux.

Локали в SuSE Linux 10.0Выполним установку системы по умолчанию, лишь указав, что принимается русский язык, и в результате получим сле-дующую настройку локализации:

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

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

Здесь уже должно быть понятно, что представления об используемых в нашей стране локалях у разработчиков SuSE Linux далеки от реальности. В качестве эталонного примем мнение авторов документа [2], прошедшего провер-ку опытом. Кстати, из указанного источника можно почер-пнуть дополнительный комментарий, который по причине форматных ограничений не вошел в настоящий текст.

Поправим в немецком дистрибутиве SuSE Linux со-став локалей, которые необходимы для работы российс-кого пользователя, следующим скриптом, запускаемым от root:

И тут же проверим результат:> locale

LANG=ru_RU.UTF-8LC_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=

> locale

ru_RUru_RU.koi8rru_RU.utf8

#!/bin/sh

LOCALE=/usr/lib/localeLP=ru_RULD=$(which localedef)

[ "1$LD" == "1" ] && { echo localedef not found ; exit -1 ; }

LD="$LD -c -i $LP"

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

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

[ "1$(locale -a | grep ^$LP | grep cp1251)" == "1" ] && ↵ $LD -f CP1251 $LP.CP1251[ "1$(locale -a | grep ^$LP | grep CP1251)" == "1" ] && ↵ ln -sf $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 -a | grep ^$LP | grep cp866)" == "1" ] && ↵ $LD -f IBM866 $LP.CP866[ "1$(locale -a | grep ^$LP | grep CP866)" == "1" ] && ↵ ln -sf $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_RUru_RU.cp1251ru_RU.CP1251ru_RU.cp866ru_RU.CP866ru_RU.iso88595ru_RU.ISO-8859-5ru_RU.koi8rru_RU.KOI8-Rru_RU.maccyrillicru_RU.MAC-CYRILLICru_RU.utf8ru_RU.UTF-8

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

17№3, март 2006

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

Полученные локали позволят работать с кириллицей в соответствии с национальным стандартом 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, следовало выполнить:

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

В других дистрибутивах возможен иной подход к фор-мированию значений переменных окружения, указываю-щих на используемую локаль. Для того чтобы определить последовательность настройки, можно произвести контекс-тный поиск строки LANG в скриптах и конфигурационных файлах, расположенных в /etc.

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

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

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

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

# SuSEconfig -module profiles»

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

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

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

18

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

По данным поисковой системы [6], пакет console-tools ис-пользуется в дистрибутивах: Mandrake, Mandriva, Conectiva, ALT Linux, RedHat 6 и 7, Turbolinux, Trustix, Engarde. С пер-выми четырьмя все ясно, так как они явно исторически тя-готеют друг к другу. А вот RedHat из перечисленных вер-сий отметим особо!

По сведениям с того же сайта, пакет kbd применяет-ся в дистрибутивах SuSE, Fedora, RedHat 5 и 8, WhiteBox, CentOS, ASP Linux, PLD, Aurox, StartCom, Arklinux, Openwall и все таже Conectiva. Со второго по пятый в списке пред-ставлены явные «редхатоиды» и их клоны. Очень интерес-но обсудить «пируэт», который совершили разработчики RedHat, перейдя на console-tools в релизах 6 и 7 и вернув-шись потом снова к kbd в релизе 8. Нет, они не перегрелись в солярии. Можно предположить, что в связи с ожидаемым и скорым, как думают латентные эсперантисты, переходом в универсальную кодировку unicode (а как известно, в 8 вер-сии RedHat Linux произошел переход на utf 8) преимущес-тва пакета console-tools, ориентированного в основном на изощренные манипуляции с кодировками, теряют акту-альность, а вот средства управления виртуальными консо-лями в kbd, напротив, становятся незаменимыми. Что и пос-лужило основанием возврата к использованию kbd.

Принимая все перечисленное во внимание и учитывая, что в SuSE Linux всегда применялся и применяется сейчас пакет kbd, далее будем обсуждать именно его.

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

Сначала разберемся, как происходит преобразование вводимых данных. Воспользуемся схемой, представленной на рис. 1. Изображенная там последовательность преобра-зования будет иметь место в том случае, когда клавиатур-ный драйвер включен в режим XLATE и настроен в локали ru_RU.KOI8-R. На рисунке видно, что ключевую роль в ус-тановлении соответствия некоторой клавиши и того кода, который будет получать процесс, играет специальная таб-лица, называемая раскладкой. В этой таблице происходит

не только назначение определенного символа каждой клавише, но и произ-водится выбор кодировки. Иначе го-воря, чтобы после нажатия клавиши «А» получить символ «А» в кодировке KOI8-R, надо использовать раскладку или таблицу, у которой в строке, соот-ветствующей клавиатурному коду кла-виши с изображением «А», и в колон-ке для нужного кириллического ре-

гистра клавиатуры содержится код 0xE1. Если бы требо-валось получать символы в кодировке CP1251, то там дол-жен содержаться код 0xC0. Чувствуете разницу? Не важ-но, что программа ожидает получать символы в соответс-твии с локалью. Если нужная таблица преобразований не будет загружена с помощью утилиты loadkeys в клавиатур-ный драйвер, то, как бы не менялась локаль, успешной ра-боты не получится.

Второй режим работы драйвера клавиатуры, который ак-туален для текстового режима, это UNICODE. Как следует из названия, в этом режиме драйвер формирует на выходе коды в соответствии с UTF-8. В этом режиме все равно ис-пользуется таблица преобразования, но на выходе драйве-ра создаются не однобайтные посылки, а строки перемен-ной длинны. В SuSE Linux параметры, управляющие работой утилиты loadkeys, настраивающей клавиатуру, содержатся в /etc/sysconfig/keyboard. В отличие от изображенного на рис. 1 раскладка для режима по умолчанию указана как:

Значит, используется кириллическое подмножество UTF-8 (предположительно) с переключением регистров че-рез <RightAlt> + <Shift>. Но вот проблема: кириллица вро-де бы вводится, а при выводе на экран вместо знаков этого древнего алфавита отображаются лишь пустые знако-места. Заглянув в исходный текст ru1.map.gz определяем, что там производится отображение не в UTF-8, а в KOI8-R. И это не-доразумение, кстати сказать, сопровождает уже несколько версий SuSE Linux подряд. Замена раскладки на ru-utf.map.gz исправляет ошибку разработчиков дистрибутива.

Здесь отметим, что перенастройка режима ввода с кон-соли производится системным скриптом /etc/init.d/kbd не-зависимо от настроек локали.

Вывод символов в консоль LinuxТеперь обсудим, как производится вывод символьной ин-формации с помощью драйвера экрана. Для этого вос-пользуемся схемой, представленной на рис. 2. На рисун-ке изображена последовательность преобразования в слу-чае использования кодировки KOI8-R. Настраиваемыми параметрами являются таблица ACM (Application Character Map), предназначенная для перекодировки во внутреннее представление драйвера, таблица SFM (Screen Font Map), предназначенная для получения индекса глифа в экран-ном шрифтовом наборе, и собственно растровый шрифт. Два последних элемента тесно связаны и очень часто объ-единяются в единый файл. Файлы экранных шрифтов с име-

# grep ^KEYTABLE /etc/sysconfig/keyboard

KEYTABLE="ru1.map.gz"

Локаль 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

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

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

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

19№3, март 2006

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

нами, использующими суффиксы psfu должны содержать после растрового шрифта соответствующую таблицу пе-рекодировки SFM. Специальная управляющая подстрока CONSOLE_MAGIC используется для активации настроенно-го преобразования. Подробности можно узнать в [5]. В об-щем все достаточно тривиально.

Как уже было сказано, по умолчанию SuSE Linux настра-ивается для использования UTF-8. Тогда все системные пе-ременные, которые используются для настройки способа вывода принимают значения:

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

Настройка консоли SuSE LinuxВ отличие от ранее созданных локалей для обеспечения соотвествующей настройки придется подгрузить в систе-му дополнительные файлы. В дистрибутивной поставке от-сутствует ACM для MAC-CYRILLIC и некоторые клавиатур-ные раскладки. Используемые для настройки разных ре-жимов параметры перечислены в таблице 1. Недостаю-щие отмечены отсутствием фоновой тонировки. Эти фай-лы, как и все приведенные или упомянутые здесь скрипты, можно найти в архиве [7].

Вот как должен выглядеть скрипт для переключения ло-кали и консоли в режим работы с кодировкой CP1251, вы-полненный в точном соответствии с таблицей 1:

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

Характерной особенностью является отсутствие про-писной буквы «Ы» (на рисунке 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 в оригинале), прозрачном режиме, и текстовая консоль не участвует в процессе вы-

# grep ^CONSOLE_ /etc/sysconfig/console

CONSOLE_FONT="Cyr_a8x16.psfu"CONSOLE_UNICODEMAP=""CONSOLE_SCREENMAP="trivial"CONSOLE_MAGIC="(K"CONSOLE_ENCODING="UTF-8"

# cat console2cp1251#!/bin/sh

PREF=/etc/sysconfig

[ "1$UID" != "10" ] && { echo "you must be root!" ; exit ; }

# Consoleperl -i -p -e 's/^CONSOLE_FONT= ↵ .*/CONSOLE_FONT=Cyr_a8x16.psfu/g' $PREF/consoleperl -i -p -e 's/^CONSOLE_SCREENMAP= ↵ .*/CONSOLE_SCREENMAP=cp1251_to_uni/g' $PREF/consoleperl -i -p -e 's/^CONSOLE_ENCODING= ↵ .*/CONSOLE_ENCODING=CP1251/g' $PREF/console

# Keyboardperl -i -p -e 's/^KEYTABLE= ↵ .*/KEYTABLE=ru_win.map.gz/g' $PREF/keyboard

# Languageperl -i -p -e 's/^RC_LANG= ↵ .*/RC_LANG=ru_RU.CP1251/g' $PREF/language

rckbd restart

exit

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

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

20

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

вода. Только не получится повторить то же самое в лока-ли ru_RU.MAC-CYRILLIC, так как в konsole эту кодировку нельзя указать принудительно – ее просто нет. Приятно то, что варианты 1-4 из таблицы 1 работают в SuSE Linux в ре-жиме X Window, как говорится, «из коробки».

Еще более интересные метаморфозы претерпевает локаль в режиме удаленной работы. Например, с помо-щью ssh. Если из локальной сессии, работающей в лока-ли ru_RU.KOI8-R, подключиться к удаленному компьюте-ру, настроенному для работы в другой локали, то получим следующее:

Как видно из протокола сеанса, командная оболочка за-пустилась в локали клиента. Произошло это благодаря то-му, что в параметрах сервера ssh указано экспортировать переменные среды клиента:

А в параметрах клиента, аналогично, передавать пере-менные среды на удаленную сторону:

Но если попытаться подключиться к компьютеру в ло-кали ru_RU.MAC-CYRILLIC с помощью PyTTY из-под MS Windows, то ничего хорошего не получится, так как там нет возможности ни передать переменные программной среды, ни прямо указать перекодировку с MAC-CYRILLIC.

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

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

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

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

Рисунок 5. Konsole в CP866 с кодировкой, указанной вручную

alekseybb@wsvm02:~> grep ^RC_LANG /etc/sysconfig/language

RC_LANG=ru_RU.MAC-CYRILLIC

wsvm02:~ # grep ^AcceptEnv /etc/ssh/sshd_config

wsalekseybb:~ # grep ^SendEnv /etc/ssh/ssh_config

SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGESSendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENTSendEnv LC_IDENTIFICATION LC_ALL

fixme: msvcrt:MSVCRT_setlocale : Codepage only locale not implemented

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGESAcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENTAcceptEnv LC_IDENTIFICATION LC_ALL

alekseybb@wsalekseybb:~> locale

LANG=ru_RU.KOI8-RLC_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 [email protected]

Password:Last login: Thu Mar 9 22:03:31 2006Have a lot of fun...

alekseybb@wsvm02:~> locale

LANG=ru_RU.KOI8-RLC_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=

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

21№3, март 2006

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

как встроенный сервис. Но этого не наблюдается. На Руси с древности повелось так, что народ учили грамоте то вся-кие «пришлые греки», то «ушлые варяги». Складывающая-ся вокруг компьютерных кодировок ситуация следует исто-рической традиции. Очередные заморские гуру, в который раз предлагают отказаться от всего, что было ранее прове-рено и внедрено, и принять от них новую чудодейственную «пилюлю». Ожидаемо, после того как четыре зарубежные компании создали четыре взаимоисключающие способа кодирования кириллической информации, полностью игно-рируя ту, что была создана независимыми отечественными разработчиками, в среде пользователей должен сформи-роваться иммунитет к языковым авантюрам. Тем более что, как продемонстрировано выше, единого подхода к работе с локалями не наблюдается вовсе, то есть появление но-вой локали закономерно приведет к новым хлопотам и про-блемам с программами. Но лишь один из ведущих россий-ских разработчиков – 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.

Заметно, насколько не согласована политика внутри коллективов разработчиков. Например, в 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.

Дистрибутивы 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

CP866 25 0 0 Да 0

MAC-CYRILLIC 0 0 0 0

Число полных поддержанных локалей 1 2 4 1

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

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

22

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

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

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

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

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

23№3, март 2006

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

«Что за птица такая?»Интересующихся этимологией от-правляем на врезку «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 прихо-дилось делать вам. Вы же в это время можете, например, поиграть или да-же оформить ваши впечатления от ус-тановки в текстовом редакторе паке-

ту. Конечно, можно выполнить уста-новку и автономно (в инсталляторе этот режим называется 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/stage3-x86-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 на мо-мент установки.

Так что ядро лучше всё-таки ста-вить по сети (см. далее).

«Куда же нам теперь идти?»Итак, от использования инсталлятора мы отказались. Да и, к слову сказать, работает он пока не очень стабильно. Так что загрузитесь в ту систему, ко-торая у вас есть. И что теперь делать? Как вы уже догадались, без толково-го руководства – никуда. Я постараюсь пояснить наиболее важные моменты, но если вам не жалко бумаги, можете

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 на жёсткий диск вам поможет программа-инсталлятор. Есть возможность сгенерировать необходимые для установки сис-темы файлы из программ на диске, хотя рекомендуется всё же скачать их из Сети, чтобы получить более свежие версии.

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

Нужно заметить, что Gentoo вооб-ще ориентирован на сетевую рабо-

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

24

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

заранее распечатать «Руководство» с сайта www.gentoo.org. Кстати, оно есть и на русском языке: http://www.gentoo.org/doc/ru/handbook.

Процесс установки разделён на этапы, причём вы в лю-бое время можете прервать его и продолжить затем с того места, где остановились. А вообще, времени (и пива) пона-добится немало – как для того, чтобы разобраться с даль-нейшим шагом, так и на ожидание, пока выполнится ком-пиляция той или иной программы.

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

Если использование fdisk кажется вам слишком слож-ным, воспользуйтесь более дружественным инструментом, который наверняка есть в том дистрибутиве Linux, с кото-рого вы загрузились. В частности, в Knoppix можно подго-товить разделы в QtParted, легко перемещая мышкой их границы. Но запомните – вы не узнаете, как разбиваются диски, пока лично что-нибудь не сломаете.

Итак, раздел у нас есть. Осталось принять ещё одно принципиальное решение – выбрать тип файловой сис-темы.

«Что вы мне порекомендуете?»Большинство дистрибутивов Linux, желая облегчить участь своих пользователей, предлагают по умолчанию файло-вую систему, которую их разработчики считают наилуч-шей. Ну а Gentoo, как нетрудно догадаться, напротив, ос-тавляет этот вопрос целиком и полностью на усмотрение пользователя.

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

Создаётся файловая система командой mkfs (пример дан для Ext3):

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

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

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

Вдогонку распакуем и дерево Portage – оно понадобит-ся для установки некоторых программ уже на этапе инс-талляции системы:

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

Продолжим…

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

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

# tar xvjpf portage-20060308.tar.bz2 -C /mnt/gentoo/usr

# 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

# date# tar xvjpf stage3-x86-2006.0.tar.bz2 -C /mnt/gentoo

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

ме управления ПО – Portage, во многом аналогичной «пор-там» BSD, но с более развитым функционалом.

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

# mkswap /dev/hda3# swapon /dev/hda3

# mkdir /mnt/gentoo# mount /dev/hda1 /mnt/gentoo

# mkfs -t ext3 /dev/hda1

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

25№3, март 2006

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

Четвёртая и пятая строки создают нужную среду окру-жения, исполняя сценарии из каталога /etc/env.d и обраба-тывая файл /etc/profile. Последняя формирует файл mtab, который может понадобиться для правильной установки загрузчика.

Перед тем как приступать к инсталляции исходных ко-дов ядра системы, вы можете дополнительно указать нуж-ные вам режимы сборки (например, параметры оптимиза-ции) в файле /etc/make.conf.

Как я писал выше, исходники ядра лучше устанавливать по сети (объём закачки составит примерно 40 Мб). Если вы всё же решили скачать архив заранее, то скопируйте его в /usr/portage/distfiles, где emerge должна его найти (конеч-но, если версия будет соответствовать той, которая описа-на в дереве Portage).

Установка исходных кодов выполняется простой ко-мандой:

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

А волшебная команда emerge, о которой мы подробнее поговорим во второй части статьи, выполнит установку ко-дов ядра gentoo.

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

Подробнее о ядрах можно прочитать в «Руководс-тве».

Теперь нужно ядро собрать. Разработчики дистрибутива подготовили специальную программу – genkernel, которая автоматически соберёт ядро, вполне подходящее для ра-боты. Но мы же ставим Gentoo не для того, чтобы полагать-ся на чей-то выбор?

А раз так, то:

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

# USE="-doc symlink" emerge gentoo-sources

# cd /usr/src/linux# make menuconfig

Всё лучшее – пользователюНачиная с релиза 2006.0 дистрибутив снабжён написанным на Python графи-ческим инсталлятором. Работает он как обычная пользовательская программа, выполняя то, что раньше приходилось де-лать вручную.

Стабильность инсталлятора пока остав-ляет желать лучшего, но всё же подобный шаг навстречу не очень опытным пользова-телям можно считать знаковым моментом в истории дистрибутива. Выиграет Gentoo от этого или проиграет – покажет время.

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

Ещё пара советов по работе с Live CD, хотя напрямую к инсталлятору они и не от-носятся. Во-первых, никогда не исполь-зуйте для подключения файловых сис-тем непосредственно точку монтирова-

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

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

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

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

26

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

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

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

Осталось лишь скопировать его в каталог /boot:

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

«А далеко ещё?»Итак, базовая система у нас есть. Portage есть. Ядро есть и рвётся в бой. Осталось сделать несколько последних штрихов.

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

Итак, нам понадобятся: утилита ведения логов в системе (одна из реализаций

syslog); утилита выполнения задач по расписанию (реализация

cron); инструменты работы с файловыми системами, отлич-

ными от Ext2/3 (если требуется); клиент dhcp (если сеть настраивается с его помо-

щью).

Устанавливаются они очень просто (приведён пример, вы же можете выбрать и другие реализации, например, sysklogd и dcron):

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

Это означает, что соответствующие службы будут заре-гистрированы на автоматический запуск при переходе на runlevel, установленный по умолчанию (default).

Более подробно о средствах конфигурирования мы по-говорим во второй части статьи.

Ещё я непременно ставлю на этом этапе редактор vim, поскольку необходимость работать в предлагаемом по умолчанию nano меня сильно огорчает:

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

«Осталось совсем немножко…»Последний этап – установка загрузчика. Если на вашем компьютере уже есть boot-менеджер, пригодный для за-пуска Linux, можно просто добавить в него пункт, указыва-ющий на наше ядро.

Если же вы хотите управлять загрузкой из Gentoo, то уже знакомым способом ставьте свой любимый загрузчик и настраивайте его:

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

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

В следующий раз мы рассмотрим вопросы настройки системы и подробнее поговорим о том, что делает Gentoo непохожей на других – о системе Portage.

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

телей.

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

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

# emerge grub# vi /boot/grub/menu.lst# grub-install /dev/hdа

# make# make modules_install

# tar xvjpf portage-20060308.tar.bz2 -C /mnt/gentoo/usr

# emerge syslog-ng # emerge vixie-cron

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

# USE="-X" emerge vim

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

27№3, март 2006

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

Создаём собственную ОС на базе Linux

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

Илья Александров

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

28

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

За долгие годы работы с 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, разбивается диск. На жестком

диске выделяется раздел для новой системы. После чего на этом разделе нужно будет статически скомпилировать все необходимые программы и ядро системы. Далее про-исходит смена корневого каталога на раздел жесткого дис-ка, отведенный под нашу новою ОС. Потребуется повторить компиляцию, но на этот раз ПО должно быть собрано дина-мически (отличие динамической компиляции от статичес-кой будет описано ниже). Последний этап включает в себя сборку важнейшей библиотеки 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 работать с этой ФС не увенча-лись успехом.

Теперь монтируем раздел, отведенный под новую ОС:

Для удобства определим переменную MYLIN:

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

Нужно создать дерево каталогов в корне нового раз-дела:

$ mount /dev/hda5 /mnt/mylin

$ export MYLIN=/mnt/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

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

29№3, март 2006

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

В каталогах usr, usr/X11R6, usr/local создаем необходимую структуру: подкаталоги bin, etc, include, lib, sbin, share, src.

Затем то же самое проделаем для каталогов /var и /opt будущей системы:

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

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

Но когда мы посредством команды chroot установим корневой каталог для вновь собираемой системы, библи-отеки «родительской», установленной системы, находящи-еся в /lib, /usr/lib, и прочих, станут уже недоступны, поэто-му динамически скомпилированные программы работать откажутся, вдобавок совместимость версий никем не га-рантирована.

Чтобы избежать этого, все необходимое программное обеспечение для нашей будущей системы мы для начала соберем статически. Начнем, пожалуй, с командного ин-терпретатора bash. (Поклонники ZSH или TCSH могут ус-тановить любимые интерпретаторы после установки сис-темы, но на этапе сборки их использование не предус-мотрено автором LFS). Следует проверить, есть ли у вас файл /usr/lib/libcurses.a и если его нет – установите па-кет nсurses-dev. Все пакеты надо собирать с флагами ста-тической сборки: «--enable-static-link», «--disable-shared» или «--static». Какой именно подходит в каждом конкрет-ном случае, можно узнать из документации к конкретному пакету или из вывода конфигурационного сценария, запу-щенного с параметром «--help».

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

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

По такой же схеме собираем остальные необходимые пакеты: 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, после чего конфи-гурируем, запуская:

Процесс настройки параметров ядра многократно опи-сан в Интернете (6), вряд ли есть необходимость останав-ливаться на этом подробнее. Далее даем следующие ко-манды в папке с исходными текстами Linux-kernel:

Все, по адресу $MYLIN/usr/src/linux-2.6.xx/arch/i386/boot/bzImage находится новое ядро.

Далее создаем файлы $MYLIN/etc/passwd и $MYLIN/etc/group. В первом прописываем пока единственного пользо-вателя – root с любым паролем, а во втором группы поль-зователей (для начала одной группы root тоже будет до-статочно).

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

Динамическая сборкаТеперь нам нужно сменить корневой каталог на /mnt/mylin, где мы будем пользоваться только статически собранными утилитами – к помощи инструментов из «родительской» ОС мы уже прибегать не сможем. Даем команду в консоли:

Этой командой мы указали пути к исполняемым фай-лам, тип терминала, интерпретатор и вид приглашения ко-мандной строки.

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

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

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

$ make menuconfig

$ make bzImage$ make modules

$ chroot $MYLIN/usr/bin/env –i \>HOME=/root TERM=$TERM PS1=’\u:\w\$’ \>PATH=/bin: /usr/bin: /sbin: /usr/sbin: /stat/sbin \>/stat/bin/bash --login

$ mount proc /proc -t proc

$ mkdir var/{cache,lib,local,lock,log,opt,run,spool}$ mkdir opt/{bin,doc,include,info,lib,man}

$ ./configure –-help

$ mkdir $MYLIN/stat

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

30

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

glibc и других библиотек), и того, что для установки glibc нужен интерпре-татор Perl, которого у нас нет.

Заменяем имя пользователя root в файле login/Makefile на его uid, то есть 0, а переменную $PERL в файле malloc/Makefile следует заменить на путь к интерпретатору – /usr/bin/perl – и при конфигурировании он просто бу-дет проигнорирован.

Далее:

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

Завершим установку ядра:

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

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

После выполнения динамической перекомпиляции можно удалить ка-талог со статически собранными па-кетами:

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

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

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

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

При сборке мы указывали пара-метр «--prefix=$MYLIN/stat», поэтому при смене корня все статически соб-ранные пакеты окажутся в каталоге /stat раздела новой ОС.

Итак, распаковываем архив glibc-2.x.x.tar.gz (например, в директо-рию /usr/src/) и переходим в каталог glibc-linuxthreads. Придется немного подправить исходный код ввиду того, что на данном этапе в системе невоз-можна идентификация пользовате-ля по имени (как раз из-за отсутствия

а не родительской системы.Для установки системного време-

ни создадим файл /etc/sysconfig/clock, содержащий всего одну строку:

Теперь часы компьютера будут отображать время вашего часового по-яса – при условии, что значение време-ни в BIOS установлено верно.

Дадим компьютеру имя:

Теперь разделы, которые система должна монтировать при загрузке, ука-жем в /etc/fstab:

Вместо /dev/hda3 и /dev/hda5 напи-шите ваши разделы (корневой и swap), дополните файл при необходимости точками монтирования других разде-лов жесткого диска и CD-ROM.

Теперь сделаем нашу систему за-гружаемой.

Если помимо lFS вы пользуетесь другими дистрибутивами Linux, то сей-час нужно войти в старую систему – для этого выполняем команду:

Уже в родительской ОС в файл /etc/lilo.conf добавляем следующее:

Понятно, что «/boot/bzImage» – это путь к скомпилированному вами ядру системы, а «partition» – раздел диска, где находится корневой каталог.

Если же вы не планируете пользо-ваться другими операционными систе-мами и дистрибутивами Linux, то сразу переходите к настройке LILO в LFS.

В этом случае lilo.conf будет выгля-деть примерно так:

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

echo "HOSTNAME=my_linux" > ↵ /etc/sysconfig/network

# filesystem mount-point fs-type ↵ options dump fsck-order

/dev/hda5 / ext3 defaults 1 1/dev/hda3 swap swap pri=1 0 0proc /proc proc defaults 0 0

$ exit

# LFSimage=/boot/bzImage label=lfs root=<partition> read-only

boot=/dev/hda delay=40 compact vga=normal

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

$ make modules_install$ make install

$ make unstall

$ rm -rf /stat

UTC=0

$ /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

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

31№3, март 2006

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

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

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

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

Теперь такое вполне возможно – по адресу 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. Приложения).

$ /sbin/lilo –v

root=/dev/hda1 read-only image=/boot/zImage-2.6.12 label=Linux

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

32

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

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

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

Рашид Ачилов

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

33№3, март 2006

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

Споры о том, что правильнее – собирать програм-мы руками или использовать для этого порты, в эх-оконференции FidoNet RU.UNIX.BSD не утихают

никогда. Они могут стихнуть на время, но затем кто-ни-будь снова задаст такой вопрос, и они разгораются с но-вой силой.

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

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

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

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

Значительно проще ответить на вопрос «Установлена ли у меня эта программа?» или «Где у меня такой-то файл от такой-то программы?»

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

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

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

34

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

ных данных. Механизм работы системы давным-давно отла-жен, в простейшем случае необходимо только задать исход-ные данные. Ниже приводится список файлов, которые необ-ходимы для порта (на самом деле порт может использовать и другие файлы, но они не являются необходимыми): 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.

distinfo – файл, описывающий все файлы, входящие в дистрибутив программы. Его нет необходимости со-здавать вручную – после создания Makefile достаточно выполнить команду make makesum – и он будет создан автоматически.

pkg-descr – текстовый файл с небольшим описанием программы и ее возможностей. Описание может быть вообще коротким – 2-3 строки или более подробным 10-15 строк. В конце файла желательно привести URL разра-ботчика и его адрес электронной почты в формате:

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 выпадающее меню с содержимым адресной книги. Программа так и называет-

WWW: http://this.insert.link/~homepageAuthor: John J. Smith <[email protected]>

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

35№3, март 2006

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

ся – «Contacts menu for Kicker». Подробное ее описание при-ведено в [3]. Факт успешной сборки программы уже прове-рен, программа установлена, и протокол установки сохра-нен в файле, то есть была выполнена команда:

В данном примере для перенаправления в файл и обь-единения выводов stdout и stderr используется синтаксис tcsh, в sh необходимо выполнить:

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

Файл MakefileВ соответствии с рекомендациями [4] Makefile должен иметь следующий заголовок:

На этом заголовок кончается.Внимание! Для впервые отправляемого порта строка

$FreeBSD$ должна выглядеть именно так, как показана!Первыми строками, идущими за заголовком, должны

быть следующие:

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

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

Имя дистрибутивного файла по умолчанию формирует-ся как ${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}. EXTRACT_SUFX же по умолчанию равен «.tar.gz», если не указано явно, каким архиватором упакован дистрибу-тив. Явно задать архиватор можно с помощью переменных «USE_BZIP2=YES» для архиватора Bzip2 и «USE_ZIP=YES» для архиватора Zip. Эти переменные должны быть заданы ниже, в секции, где группируются все переменные USE_*.

Откуда взять имя дистрибутива и адрес домашнего сай-та проекта? Как правило, первоначальная закачка файла производится вручную, следовательно, имя файла и URL ис-ходного сайта всегда можно найти в логах программ, кото-рыми он закачивался. Можно использовать для этого и дру-гие методы, которые я не буду здесь описывать ввиду их чрезвычайно большого разнообразия. Таким образом, ес-ли бы имя дистрибутивного файла нашей программы бы-ло contactsmenu-0.3.4b.tar.gz, нам бы больше ничего не пот-ребовалось указывать – вся информация для загрузки уже предоставлена. Но не все так просто, потому что имя наше-го файла – 34479-contactsmenu-0.3.4b.tar.bz2.

Что делать? Для таких случаев предусмотрено прину-дительное задание имени дистрибутивного файла, кото-рое должно быть полным, то есть

Включив в нижеследующие секции «USE_BZIP2=YES» мы сформировали полное имя дистрибутивного файла.

Для многих популярных URL типа www.apahe.org, sourceforge.net, www.kde.org и пр. определены специаль-ные макросы, в которых перечислены все URL, на кото-рых можно найти данную программу. Например, если бы данная программа располагалась на сайте sourceforge.net, то строка MASTER_SITES была бы заменена следующей комбинацией:

что означало бы загрузку файла с сайтов, входящих в зара-нее определенный список из подкаталога contactsmenu.

Эти строки должны идти в том порядке, в котором при-ведены. MAINTAINER задает адрес электронной почты ли-ца, которое создало и управляет данным портом. COMMENT содержит краткое (одну строчку) описание данного порта.

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

Начинается секция переменных USE_*. Здесь, как пра-вило, перечисляются неявные зависимости, заранее оп-ределенные в системе. USE_KDEBASE задает зависи-мость порта от пакета kdebase3, USE_GMAKE – от паке-та gmake, USE_BZIP2 – от пакета bzip2 (и заодно устанав-ливает EXTRACT_SUFX в «.tar.bz2»).

Что означает «порт Х зависит от порта Y»? Это означа-ет, что в соответствии с тем, к какому типу будет отнесена

# make install >& install.log

# make install > install.log 2>> install.log

# New ports collection makefile for: contactsmenu# Date created: 01 Mar 2006# Whom: Rashid N. Achilov <[email protected]>## $FreeBSD$

PORTNAME= contactsmenuPORTVERSION= 0.3.4bCATEGORIES= mail kde

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

DISTNAME= 34479-${PORTNAME}-${PORTVERSION}

MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}MASTER_SITE_SUBDIR= contactsmenu

MAINTAINER= [email protected]= KDE 3.x addressbook Kicker applet

USE_KDEBASE_VER= 3USE_GMAKE= yesUSE_BZIP2= yes

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

36

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

данная зависимость (EXTRACT_DEPENDS, RUN_DEPENDS и т. д., см. bsd.port.mk для полного списка), то на данном эта-пе построения порта (extract, install и т. д.) система проверит наличие установленного пакета, который указан как зави-симость, и если он не установлен, система автоматически перейдет к его установке. В этом проявляется еще одно пре-имущество системы портов – имея скоростной канал в Ин-тернете и дешевый трафик, можно не думать, например, о том, какие файлы нужны для установки KDE – достаточ-но перейти в каталог x11/kde и набрать make. Построение правильного списка зависимостей – одна из задач автора порта. Если указать ненужные программы – порт будет пы-таться их поставить, что будет забивать систему мусором, если же забыть нужные – порт в лучшем случае не собе-рется, в худшем – соберется и не будет работать.

Эти строки должны присутствовать (если они есть) пос-ле всех переменных USE_*. Они определяют, что для со-здания Makefile, управляющего сборкой программы, будет использоваться configure, и задают дополнительные аргу-менты, передаваемые при вызове configure. При сборке программы configure получает неявные параметры, зада-ваемые, например, с помощью PREFIX, но может получать и явные параметры, перечисляемые выше.

Ну и последней строкой нашего Makefile обязательно должна быть:

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

Файл pkg-plistФайл составляется как раз на основе протокола инсталля-ции install.log, который был сохранен во время установки программы. Следует также учесть, что программы для KDE часто используют локальные скрипты libtool, которые уста-навливают динамические библиотеки, используя свои собс-твенные конфигурационные файлы с расширением .la. По-этому, если в протоколе установки упоминается, например, kickermenu_contactsmenu.la, нужно открыть его (это тексто-вый файл) и посмотреть, какая же библиотека там исполь-зуется. Как правило, ее имя совпадает с именем .la фай-ла (в нашем случае kickermenu_contactsmenu.so), но могут быть отличия, в частности, файлов может быть несколько. В файл pkg-plist компоненты программы вписываются по одному в строке, с указанием пути относительно корня ус-тановки (по умолчанию /usr/local).

То есть в нашем случае:

то есть одна динамическая библиотека, один файл .desktop и восемь файлов локализации. Тут надо заметить, что, как правило, с файлами локализации в KDE сплошная морока – их бывает по 20-30 шт. Но пропустить, случай-но или намеренно, какой-либо файл нельзя – порт будет впоследствии отослан на тестирование во FreeBSD Team, где проверят все этапы его установки и удаления, и если после удаления в каталоге будут обнаружены оставшиеся файлы, то майнтайнер порта получит сообщение об ошиб-ке, не устранив которую, он никогда не увидит своего пор-та принятым.

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

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

Файл pkg-descrКак уже говорилось выше, это просто текстовый файл с не-большим описанием того, что делает данная программа. Чтобы не сочинять самому описание, в нашем случае мы просто берем описание, приведенное автором на страни-це kde-apps и заносим его в этот файл, сопровождая ссыл-кой на собственно страницу программы (файл см. на сайте журнала в разделе «Исходный код»).

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

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

GNU_CONFIGURE= yesCONFIGURE_ARGS += --with-qt-dir=${QT_PREFIX} \ --with-extra-includes=${LOCALBASE}/include \ --with-extra-libs=${LOCALBASE}/lib

.include <bsd.port.mk>

lib/kde3/kickermenu_contactsmenu.solib/kde3/kickermenu_contactsmenu.lashare/apps/kicker/menuext/contactsmenu.desktopshare/locale/bg/LC_MESSAGES/libkickermenu_contactsmenu.moshare/locale/br/LC_MESSAGES/libkickermenu_contactsmenu.moshare/locale/da/LC_MESSAGES/libkickermenu_contactsmenu.moshare/locale/de/LC_MESSAGES/libkickermenu_contactsmenu.mo

share/locale/ga/LC_MESSAGES/libkickermenu_contactsmenu.moshare/locale/fr/LC_MESSAGES/libkickermenu_contactsmenu.moshare/locale/pt/LC_MESSAGES/libkickermenu_contactsmenu.moshare/locale/sv/LC_MESSAGES/libkickermenu_contactsmenu.mo

@dirrm share/locale/bg/LC_MESSAGES@dirrm share/locale/bg@dirrm share/locale/br/LC_MESSAGES@dirrm share/locale/br@dirrm share/locale/da/LC_MESSAGES@dirrm share/locale/da@dirrm share/locale/de/LC_MESSAGES@dirrm share/locale/de@dirrm share/locale/ga/LC_MESSAGES@dirrm share/locale/ga@dirrm share/locale/fr/LC_MESSAGES@dirrm share/locale/fr@dirrm share/locale/pt/LC_MESSAGES@dirrm share/locale/pt@dirrm share/locale/sv/LC_MESSAGES@dirrm share/locale/sv

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

37№3, март 2006

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

После установки запускаем portlint в текущем каталоге с ключами, которые включают все возможные проверки:

Здесь приведена часть вывода portlint, в которой вы-водится замечание. В последней строке приводится итог – сколько ошибок и сколько замечаний было обнаружено. От-мечу сразу, что необходимо добиться устранения всех оши-бок и желательно всех замечаний. В данном случае portlint предупреждает о том, что устанавливаются файлы сооб-щений gettext, но в порт не включено неявной зависимости от devel/gettext (это может привести к невозможности рабо-ты с данными файлами). Для исправления данной ситуации добавляем в секцию USE_* строку «USE_GETTEXT=YES» и повторно запускаем portlint.

Что нам советуют сейчас? Добавить поддержку пара-метра WITHOUT_NLS для тех, кто не хочет устанавливать файлы языковых сообщений и увеличить количество зер-кал, на которых размещен данный файл. Здесь надо заме-тить, что любой дистрибутив порта после его принятия в сис-тему дополнительно зеркалится на сайте проекта FreeBSD, так что замечание о дополнительных зеркалах мы игнори-руем, а вот замечание о WITHOUT_NLS исправим. Для это-го добавим в Makefile следующий код:

а в файле pkg-plist изменим строки, описывающие файлы языковой поддержки таким образом:

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

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

Запускаем portlint еще раз, получаем одно замечание про MASTER_SITES, которое игнорируем. Осталось со-здать файл distinfo. Это просто. Система сама его создаст, если ее об этом попросить:

Созданный файл имеет следующий вид:

Теперь пробуем собрать программу, используя порт. Для проверки правильности составления файла pkg-plist в качестве корневого каталога сборки назначим /tmp/1 (пос-ле деинсталляции программы не должно оставаться фай-лов или каталогов, которые она создает).

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

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

# cd /usr/ports/devel/portlint# make all install

# 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 -abvtAN

...WARN: Makefile: Consider adding support for a WITHOUT_NLS knob toconditionally disable gettext support....WARN: Makefile: only one MASTER_SITE configured. Consider addingadditional mirrors....0 fatal errors and 2 warnings found.

.if defined(WITHOUT_NLS)PLIST_SUB+= NLS="@comment ".elseUSE_GETTEXT= yesPLIST_SUB+= NLS="".endif

%%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

# make makesum

MD5 (34479-contactsmenu-0.3.4b.tar.bz2) = 65af4e3103c906ed13508bf1b2dd217aSHA256 (34479-contactsmenu-0.3.4b.tar.bz2) = 88e05096b2f9c8d659be61daed5e6da977a056033a52c79789dade217709afeeSIZE (34479-contactsmenu-0.3.4b.tar.bz2) = 457076

# 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.4bcd: can’t cd to /usr/ports/mail/contactsmenu/work/34479-contactsmenu-0.3.4b*** Error code 2

Stop in /usr/ports/mail/contactsmenu.

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

# cd /var/db/pkg# pkg_create -b contactsmenu-0.3.4b

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

38

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

Проверяем файл +CONTENTS внутри архива – под каж-дой строчкой, описывающей файл программы, должна рас-полагаться строчка комментария с контрольной суммой:

Если такой строчки нет – значит, в файле 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. Сообщение об ошибке может выглядеть, например так:

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

что есть и русскоязычные коммиттеры (например, пись-мо, приведенное выше, получено от Кирилла Пономарева ([email protected]). Сообщение об успешном помещении в дерево портов может выглядеть так:

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

handbook/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/porters-

handbook/porting-submitting.html.

lib/kde3/kickermenu_contactsmenu.so@comment MD5:fd3cf198770bac4e1b8453f3ba2d6f90lib/kde3/kickermenu_contactsmenu.la@comment MD5:4de2541c36ea248066aecb851aedbbe5

Synopsis: [maintainer-update] Updating mail/sccmilter up to 0.94.9 version

State-Changed-From-To: open->feedback State-Changed-By: krionState-Changed-When: Fri Feb 18 14:33:28 GMT 2005State-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

Synopsis: new port: sysutils/spassgen

State-Changed-From-To: open->closedState-Changed-By: pavState-Changed-When: Sat Jul 31 09:26:28 GMT 2004State-Changed-Why: New port added, thank you!

http://www.freebsd.org/cgi/query-pr.cgi?pr=69748

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

40

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

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

ходников. И это только в 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 практически не содержит приложений для на-

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

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

Андрей Коврин

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

41№3, март 2006

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

стольных ПК. Тем не менее, представлены и некоторые базовые программы для удобной работы в консоли: обо-лочки 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>-<opkg-release>.<arch>-<platform>-openpkg.sh, устанавливающий менеджер пакетов в систему (для его запуска требуются права root). Для первой установки OpenPKG или ее обнов-ления далее необходимо проинсталлировать пакет openpkg (как отмечают разработчики в своем руководстве, «вос-пользуйтесь OpenPKG для обновления OpenPKG!»). Далее с помощью удобного консольного менеджера openpkg мож-но управлять всеми доступными пакетами (устанавливать, удалять, собирать из исходников, просматривать инфор-мацию и т.п.).Основные административные операции осу-ществляются через команду openpkg rpm, принимающую параметры, знакомые любому пользователю RPM-основан-ных систем. Действие некоторых ключей распространяет-ся только на binary- или только на source-пакеты, а, напри-мер, -Uvh для бинарного проводит установку или обновле-ние, а для src – распаковку. Существует и собственный «за-грузочный скрипт» (<корень_opkg>/etc/rc), позволяющий за-

пускать/останавливать/перезапускать отдельные (или все вообще) пакеты, а также выводящий различные конфигу-рационные значения (при вызове с --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.

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

42

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

Сегодня разработано достаточ-но инструментов, позволяющих упростить решение этой зада-

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

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

дет речь, не похож ни на один из тех, с которыми мне приходилось ранее иметь дело автору.

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

MikroTik – Router OS

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

Сергей Яремчук

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

43№3, март 2006

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

твует. Теперь же после полугода эксплуатации можно от-метить стабильную работу сервера. За этот период ни ра-зу не понадобилось перезагружать сервер. Для организа-ции доступа в Интернет сети из сотни пользователей ис-пользовался старый системный блок с установленным Пен-тиумом 233 с 128 Мб оперативной памяти и жестким дис-ком на 2 Гб. Максимальная загрузка процессора составля-ла всего 25%, используемая память не превысила значе-ния 40 Мб, а жесткий диск заполнен на 50 Мб. Раз уже за-шла речь о системных требованиях, то в официальных ру-ководствах они еще ниже, чем указанные: частота процес-сора от 100 МГц, ОЗУ 32 Мб (рекомендуется от 64 Мб), жес-ткий диск от 64 Мб.

Кроме того, на сайте проекта можно купить предуста-новленную на IDE Flash-модуль дистрибутива который мо-жет использоваться вместо жесткого диска. Кроме сис-темных требований, удивили и поистине богатые возмож-ности вкупе с легкостью настройки и администрирования. Приведу лишь небольшую часть из возможностей дист-рибутива: Межсетевой экран и NAT – полноценная фильтрация

пакетов, source и destination NAT, классификация паке-тов по МАС, IP-портам, опциям протоколов, интерфей-сам, внутренним маркированным пакетам, содержимо-му, P2P-фильтрация. Поддержка мостов между интер-фейсами с фильтрацией пакетов.

Маршрутизация – статическая, multi-path, на основе по-литик (совместно с межсетевым экраном), динамичес-кая маршрутизации: RIP v1/v2, OSPF v2, BGP v4;

Управление качеством облуживания – маркировка по IP, сети и подсети, порту; управление полосой пропус-кания, задание скорости и прочее.

Полноценный HotSpot – создание plug&play точек кол-лективного пользования Интернет с аутентификацией на RADIUS-сервере, с контролем работы в реальном времени, заданием скорости, объема, времени работы клиента, создание walled-garden защищенных зон.

Поддержка различных Point-to-Point-протоколов – PPTP, PPPoE и L2TP с поддержкой RADIUS, PAP, CHAP, MSCHAPv1 и v2 протоколов аутентификации; MPPE шифрования; компрессии и дозвона по требованию для PPPoE.

Туннели – IPIP, EoIP (Ethernet over IP).

А еще поддержка IPSec, FTP и HTTP/HTTPS кэширую-щий прокси-сервер, DHCP-сервер и клиенты, клиент и сер-вер Network Time Protocol, Bonding, журналирование работы межсетевого экрана, действий пользователя и поведения системы, генерация простых отчетов. Предусмотрена воз-можность настройки GPRS-соединения. Но самое интерес-ное, что размер дистрибутива чуть больше 14 Мб.

ЛицензияMikroTik не является полностью свободным продуктом, и за все его возможности придется заплатить. Без ли-цензии установленный сервер проработает ровно 24 часа (при выключении отсчет времени останавливается). По ис-течении этого срока либо потребуется ввести ключ, либо переустановить систему. Полученный ключ позволяет ис-

пользовать MikroTik в течение неограниченного времени. В настоящий момент имеется 6 уровней лицензии. Уро-вень 0 означает работу без лицензии. Лицензия уровня 1 или SOHO предоставляется бесплатно и имеет ограниче-ние по количеству максимальных соединений PPTP, PPPoE, Queues, NAT, EoIP и DHCP, в этом случае также отключе-на поддержка беспроводных устройств, веб-кеша и Radius-клиента, нет технической поддержки и невозможно обнов-ление дистрибутива. Стоит особо отметить, что лицензия привязана к Software ID, его значение администратор полу-чит во время установки системы. При этом Software ID (и со-ответственно и ключ лицензии) изменится только при ус-тановке дистрибутива на другой жесткий диск, при заме-не остального оборудования маршрутизатора или добав-лении нового оборудования новый ключ получать не при-дется. Стоимость других уровней лицензирования колеб-лется от 45 до 250 у.е.

УстановкаНа момент написания статьи актуальной была версия 2.9.14, о которой и пойдет речь далее, хотя со времени версии 2.8 процесс установки не изменился, увеличилось только ко-личество доступных пакетов. Установить систему можно тремя способами: при помощи загрузочного CD; с дискет (DiskMaker); через сеть (загрузившись при помощи флоппи ли-

бо сетевой карты с поддержкой загрузки по сети PXE или EtherBoot).

Кроме того, на сайте доступен архив, который при помо-щи программы PhysDiskWrite для Windows либо dd в UNIX не-обходимо перенести на CompactFlash. Первый вариант яв-ляется самым простым и распространенным (кроме покуп-ки предустановленного), его и будем рассматривать. Ска-чиваем с сайта архив, содержащий ISO-образ, распаковы-ваем, записываем, выставляем загрузку с CD-ROM в BIOS и загружаемся. Никаких опций во время загрузки не предус-мотрено, на первом экране пользователю предлагается вы-брать приложения. Здесь все просто: перемещаемся при по-мощи стрелок (или клавиш <p> и <n>), наводим на нужное приложение и выбираем его при помощи пробела. При на-ведении на пункт внизу экрана выдается краткое поясне-ние, и в скобках указываются зависимости, system явля-ется обязательным к установке. Нажатие на <а> приведет к выбору всех пунктов, <m> – установит только минималь-ный набор. После выбора нажимаем на <i> (install), и про-исходит собственно установка. Жесткий диск будет разме-чен автоматически, все данные будут уничтожены, хотя вам будет предложено сохранить предыдущую конфигурацию MikroTik. Что очень полезно, так как SOHO-лицензия не под-держивает обновлений, а так есть возможность сохранить все настройки при полном обновлении системы. Обратите внимание, что все версии MikroTik до 2.8 не поддерживают более одного жесткого диска. В новых версиях второй диск используется только для кэширования веб-страниц. После распаковки приложений вы получите сообщение о необхо-димости нажать Enter для перезагрузки. Вот, собственно, и все. После установки CD-ROM можно отключить.

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

44

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

Теперь доступ к серверу можно получить различными способами: локальная консоль, терминал, подключенный к COM-порту (9600 бит/с, 8 бит данные, 1 стоповый, аппа-ратное управление потоком RTS/CTS), telnet, SSH, MikroTik MAC Telnet, веб-интерфейс Webbox и графическая утили-та Winbox.

Первоначальные настройки осуществляются исключи-тельно при помощи локальной консоли. Для регистрации используем логин: admin с пустым паролем. После чего бу-дет выведено следующее сообщение, в последней стро-ке которого вам будет показан необходимый для регист-рации software ID, в моем случае это 4NHQ-GWN. Теперь заходим на сайт проекта и в правом верхнем углу, подпи-санном как «Account Server», выбираем «New», заполняем данные и ждем подтверждения регистрации по электрон-ной почте. После чего регистрируемся в системе, вводим Software ID, и на ваш электронный адрес придет лицензи-онный ключ. В данном случае использовалась бесплатная SOHO-лицензия, при необходимости затем всегда можно поднять уровень лицензирования.

Строка приглашения показывает имя маршрутизато-ра и уровень меню:

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

лит вроде ifconfig, netstat, ping, можно обнаружить, что при-сутствует только последняя из них. Все пункты меню мож-но узнать, нажав два раза табуляцию.

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

Табуляция подсказывает следующие уровни либо ко-манды.

Обратите внимание, что адрес вводится вместе с се-тевой маской.

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

Чтобы вернуться на уровень вверх, необходимо набрать две точки. Для удобства сетевым интерфейсам можно дать более удобные имена:

Теперь ether1 будет называться Local, а ether2 – Public. И не забываем добавить шлюз:

Да, чтобы выключить или перезагрузить компьютер, необходимо перейти в меню system и набрать shutdown или reboot.

С командами разобраться легко, но понадобятся они только при удаленном управлении при помощи ssh или telnet. Для первоначальной настройки лучше воспользо-ваться скриптом setup и настроить только внутренний интер-фейс, остальную настройку производить удаленно при по-мощи более наглядных утилит Webbox и Winbox.

И не забываем сменить пароль администратора.

[admin@MikroTik] > passwordold password:new password: ************retype new password: ************

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

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

[admin@MikroTik] ip route> add gateway=192.168.1.100/24

[admin@MikroTik] interface> set ether1 name=Local; ↵ set ether2 name=Public

[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] >

[admin@MikroTik] >certificate import log ppp redo special-login undodriver interface password queue routing system userexport ip ping quit setup test-bridgefile isdn-channels port radius snmp tool

[admin@MikroTik] ip> address[admin@MikroTik] ip address > add

[admin@MikroTik] ip>

[admin@MikroTik] > ip

address: 192.168.0.1/24interface: ether1

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

45№3, март 2006

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

Утилиты конфигурирования 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. Например:

И опять же напоминаю, что при наборе практически всех параметров пользуйтесь табуляцией, это ускоряет и упро-щает набор.

Межсетевой экран свежеустановленого MikroTik марш-рутизатора не содержит встроенных правил, поэтому если просканировать его nmap, то можно обнаружить, что из вне-шней сети можно получить доступ ко многим лишним сер-висам. Поэтому следующим обязательным шагом необхо-димо настроить фильтрацию пакетов, в первую очередь за-претив доступ к ftp, telnet и www.

Для настройки правил межсетевого экрана переходим в «IP → Firewall» и во вкладке «Filter Rules» прописываем правила, запрещающие подключение к портам 21, 23, 80, 137-139 и 445 с внешних адресов, и во вкладке NAT разре-шаем маскарадинг для внутренних клиентов.

Кроме дистрибутива MikroTik на сайте проекта можно найти и еще ряд дополнительных утилит, которые будут по-лезны в работе. Например, MikroTik Bandwidth Test позволя-ет оценить пропускную способность канала, Traffic Counter – подсчитывать трафик, MT Syslog Daemon – демон syslog для Windows-систем, Log Downloader – сохранение жур-налов на другом компьютере, Dude – утилита мониторин-га и построения карт сетей и некоторые другие. Кроме то-

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

ВыводыТщательность проработки, продуманность настроек MikroTik вызывает только положительные эмоции. Несмотря на не-которую непривычность вначале, очень быстро осваива-ешься и далее работаешь без затруднений. А хорошая до-кументация, форум проекта и набор утилит только помо-гают в этом. В принципе один такой маршрутизатор впол-не способен решить все стандартные задачи по представ-лению доступа для небольшой и средней сети и их защи-те. Если версии SOHO будет недостаточно, то можно ли-бо приобрести лицензию, либо попробовать разбить сеть на более мелкие фрагменты.

Ссылки:1. Сайт проекта – http://www.mikrotik.com.2. Яремчук С. Роутер без диска. – Журнал «Системный адми-

нистратор», №9, 2004 г. – 8-9 с.3. Яремчук С. Маленький линукс в качестве firewall. – Журнал

«Системный администратор», №9, 2003 г. – 24-32 с.4. Яремчук С. Сетевой полицейский. – Журнал «Системный ад-

министратор», №1, 2005 г. – 42-45 с.5. Утилита PhysDiskWrite – http://www.m0n0.ch/wall.

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

Рисунок 4. Утилита администрирования Winbox[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

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

46

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

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

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

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

47№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 различает протоколы, поэтому можно установить, какие из групп бу-

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

48

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

дут иметь доступ к только электронной почте, а какие могут пользоваться http, ftp и другими сервисами.

Единственное ограничение NuFW заключается в том, что пока фильтру-ется только TCP, но в будущем плани-руется работа с UDP и ICMP.

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

Для регистрации действий пользо-вателей применяется syslog, или базы данных MySQL и PostgreSQL. В случае использования базы данных такая сис-тема способна сохранить более под-робную информацию.

gcrypt, gnutls, cyrus-sasl, gdbm, libident, libpam.

Дистрибутив NuFW на сайте проек-та доступен только в исходных текстах, хотя в архивах [6] и им подобных мож-но найти пакеты для Debian и некото-рых rpm-дистрибутивов (для ALTLinux в Сизифе пакетов на момент написа-ния статьи не было). Если планиру-ется контроль над полосой пропуска-ния и QoS, необходима перекомпиля-ция ядра с патчами ip_queue_vwmark и CONNMARK, которые входят в ком-плект patch-o-matic [7].

После чего нужно пересобрать яд-ро, модули и утилиты iptables.

На момент написания статьи пос-ледней версией пакета NuFW была 1.0.20. Кроме того, доступен неста-бильный релиз 1.1.3, в котором кли-ентская утилита nutcpc начала рабо-тать в среде ОС FreeBSD и Mac OS X. При конфигурировании доступен ряд опций. Вот некоторые из них: --with-user-mark – поддержка мар-

кировки пользователя в NuFW; --with-mysql-log, --with-pgsql-log –

регистрация поддержки пользова-теля в соответствующей базе дан-ных;

--with-system-auth, --with-ldap, --with-gdbm, --with-ident – подде-ржка соответствующих методов аутентификации пользователей (для текстового режима опций ука-зывать не надо).

Выбираем необходимые опции и конфигурируем.

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

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

Все соединения по умолчанию за-крываются при помощи SSL, что реша-ет проблему спуфинга адресов и рас-крытия пароля. Хотя в более ранних версиях протокола на участке клиент – nuauth использовалась только откры-тая передача данных (на рис. 2 пока-зано оранжевым цветом). Кроме па-роля для доступа пользователи могут использовать и TLS (Transport Layer Security) сертификаты.

Но это еще не все. В настоящее вре-мя разработаны модули для веб-сер-вера Apache и Squid, позволяющие им работать совместно с системой NuFW. Пользователь в этом случае будет ау-тентифицирован только один раз. Та-кой метод прозрачной аутентификации назван SSO (Single Sign On). Работает система следующим образом: пользо-ватель получает доступ к межсетево-му экрану обычным образом и попа-дает на сервер. Модуль SSO, работаю-щий на сервере, зная параметры свя-зи, запрашивает в базе данных соот-ветствующий вход для каждой связи. Если пользователь аутентифицирован, то доступ к сервису разрешается.

NuFW – полностью открытый про-ект, все компоненты, за исключением клиента под Windows, распространяют-ся под лицензией GNU GPL v2, прото-кол полностью документирован [5].

Установка NuFWДля установки NuFW вам потребуют-ся последние версии: glib2.0, gpg-error,

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

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

# KERNEL_DIR=/usr/src/linux ↵ IPTABLES_DIR=/home/sergej ↵ /src/iptables ./runme ↵ ip_queue_vwmark # KERNEL_DIR=/usr/src/linux ↵ IPTABLES_DIR=/home/sergej ↵ /src/iptables./runme CONNMARK

$ ./configure --with-ldap ↵ --with-system-auth ↵ --with-mysql-log ↵ --sysconfdir=/etc/nufw/ ↵ --prefix=/usr --with-debug

$ make# make install

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

49№3, март 2006

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

Настраиваем nuauthТеперь конфигурационный файл для демона nuauth – /etc/nufw/nuauth.conf. Приведу только основные парамет-ры. Копируем его на место и конфигурируем.

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

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

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

И для nuauth:

В рабочей системе создадим свои сертификаты.

Файл users.nufw содержит списки пользователей. Запи-си в нем состоят из строк вида:

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

Для отключения пользователя достаточно добавить ка-кой-либо знак к паролю (обычно «*» или «!»). Списки контро-ля доступа в этом случае хранятся в файле acls.nufw, в кото-ром вы найдете их подробное описание. Например, для до-ступа к ssh для пользователей Linux, входящих в группы 100 и 102 с любого адреса, пишем такое правило.

Для доступа к сервисам без ограничений группе 100.

# 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 слушает пакеты nufwnuauth_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 и поддерживающая только одного пользователя.# Такой способ работает для всех типов потоков IPnuauth_hello_authentication=0nuauth_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.shnuauth_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

# cp conf/certs/nufw-* /etc/nufw/

#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

Username: passwd:uid:gid[,gid,gid]

sergej:passwd1:1:102admin:admin_passwd:2:100,102,103

[ssh]decision=1 gid=100, 102proto=6SrcIP=0.0.0.0/0SrcPort=1024-65535DstIP=0.0.0.0/0DstPort=22App=/usr/bin/sshOS=Linux

[full]decision=1 gid=100proto=6SrcIP=0.0.0.0/0SrcPort=1024-65535DstIP=0.0.0.0/0

# mkdir /etc/nufw/

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

50

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

Большая часть параметров очевидна, «proto=6» озна-чает TCP, «decision» позволяет указать варианты правил, если правила пересекаются. В качестве параметров IP мо-гут быть указаны как отдельные адреса сети, так и список, разделенный запятой. В правила можно добавить разре-шенные время и день работы.

Для формирования файла DBM используется утилита nufw_dbm, но в случае большого числа пользователей все же удобней применять LDAP, для которого правила формируются при помощи скрипта nuaclgen. При этом информация о соеди-нении LDAP должна быть записана в файл nuaclgen.conf.

Правило для ssh в этом случае задается так.

Кроме того, на сайте [3] можно найти Nuface, представ-ляющий веб-интерфейс для создания правил для Netfilter, в том числе и без поддержки NuFW при помощи скрипта nupyf.py, который можно запускать и вручную. Демонстра-ционная версия Nuface доступна по адресу [9].

Далее проверяем загрузку модуля ядра.

При необходимости загружаем его при помощи команды:

Добавляем правило в iptables (в документации и на сай-те [2] приведено большое количество конфигураций).

Запускаем nuauth:

И nufw:

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

казано, поэтому указывайте только внешний интерфейс.

Вводим имя пользователя и пароль. В случае неуда-чи вам будут выведены сообщения, достаточные для ло-кализации проблемы. Сообщения также можно будет про-смотреть в /var/log/messages. Для работы в среде Windows имеется графический клиент NuWINс, который доступен в двух вариантах: один для работы в домене, работающий прозрачно для пользователя и запускающийся в качестве сервиса, второй – в классическом варианте. Демонстраци-онную версию последнего, разрешающую только 30 минут сессии, можно скачать с сайта [3]. На том же сайте досту-пен графический клиент для Linux-систем nuapplet, пред-ставляющий собой апплет для Gnome 2.x.

Работа с базами данныхПревым делом необходимо создать пользователя, обладаю-щего привилегиями UPDATE, INSERT к conntrack_ulog, и за-нести эти параметры в файл nuauth.conf. Для создания са-мих таблиц используйте готовые сценарии nulog.mysql.dump и nulog.pgsql.dump, которые вы найдете в подкаталоге conf дистрибутива. Кроме того, в подкаталоге script лежит скрипт clean_conntrack.pl, при помощи которого таблицы очищаются от «мертвых» соединений. Его необходимо периодически за-пускать при помощи cron, иначе таблица быстро будет пере-полняться и задерживать ответ клиентам. Время нужно под-бирать индивидуально для каждой сети (обычно 5-10 минут достаточно). Для работы этого скрипта необходимо создать пользователя, обладающего привилегиями SELECT и DELETE для таблицы «conntrack_ulog» и INSERT для «ulog». И внести эти данные во внутрь скрипта (по умолчанию используется root, что излишне). Кроме того, в этом же подкаталоге лежат два скрипта – ulog_rotate_daily.sh и ulog_rotate_weekly.sh, при помощи которых можно очищать базы журналов от перепол-нения. Для детального просмотра результатов удобно исполь-зовать веб-приложение nulog, демонстрационная версия кото-рого доступна по адресу [10]. Кроме того, в настоящее время ведется работа над приложением корреляции и выдачи пре-дупреждений Nualert и генератором отчетов Nureport.

Ссылки:1. Официальный сайт проекта – http://www.nufw.org.2. Сайт поддержки NuFW – http://regit.free.fr/nufw.3. Сайт INL develops – http://www.inl.fr.4. http://www.security.nnov.ru/Kdocument456.html.5. Протокол и алгоритм работы – EFICAAS (Extending Firewalling

Infrastructure Capabilities and Aggregating Authentication Systems) – http://www.nufw.org/eficaas.

6. Архивы программного обеспечения – http://packages.debian.org/unstable/source/nufw; http://rpm.pbone.net.

7. Сайт проекта Netfilter – ftp://ftp.netfilter.org/pub/patch-o-matic.8. Ачилов Р. Настройка Squid для использования авторизации

из домена Windows 2000. – Журнал «Системный админист-ратор», №10, 2004 г. – 30-35 с.

9. Демонстрационная версия Nuface – https://nuface.inl.fr.10. Демонстрационная версия nulog – http://www.inl.fr/download/

ulog-demo.

#nuaclgen.pl –A cn=ssh,ou=Acls,dc=inl,dc=fr –p 6 ↵ –dport 22 –AppName "/usr/bin/ssh" –j ACCEPT –g 100

# /sbin/lsmod | grep ip_queue

ip_queue 10520 0

# /sbin/modprobe ip_queue

# /sbin/iptables –A OUTPUT –s 192.168.0.0/24 –p tcp ↵ –dport 22 –m state –state NEW –syn –j QUEUE# /sbin/iptables –A OUTPUT –m state –state ↵ ESTABLISHED,RELATED –j ACCEPT

# /usr/sbin/nuauth –vvvvvvvvv

** Message: debug_level is 9

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

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

$nutcpc –S –U 102 –H 192.168.0.1

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

52

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

Утечка даже части конфиденци-альной информации может нанес-ти непоправимый вред компании,

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

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

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

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

Рассмотренные угрозы имеют од-ну общую черту – они характеризуются тем, что модель нарушителя предпола-

посредством шифрования. Мы рас-скажем вам о возможностях комп-лекса Zserver Suite компании SecurIT (http://www.securit.ru). В состав комп-лекса входят программные продукты Zserver и Zbackup, которые помогут минимизировать риски утечки кон-фиденциальных сведений.

Zserver позволит вам эффективно: защищать разделы жестких дисков

от несанкционированного доступа; оперативно блокировать и уничто-

жать информацию с любого ПЭВМ, имеющего соединение с сервером, радиоустройства, либо телефона;

скрывать сам факт наличия конфи-денциальной информации на сер-вере;

безопасно транспортировать ин-формацию на любых носителях;

контролировать и разграничивать доступ к защищаемой информации.

Общее описание программно-аппаратного комплексаПрограммно-аппаратный комплекс Zserver – средство защиты конфиден-циальной информации от несанкциони-рованного доступа посредством шиф-рования разделов диска «на лету».

Предназначен для защиты инфор-мации, хранимой как на корпоратив-ных серверах, так и на рабочих стан-циях под управлением следующих опе-рационных систем: MS Windows NT/2000/XP/2003 Novell NetWare Linux

Zserver работает с простыми и ди-намическими дисками (составными,

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

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

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

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

Не стоит и недооценивать вероят-ность наступления такого случая. Толь-ко за 2005 – начало 2006 года произош-ло несколько десятков крупных инци-дентов, связанных с пропажей носите-лей конфиденциальной информации с участием таких всемирно известных компаний как Citigroup, Ernst & Young, Bank of America и т. д.

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

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

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

53№3, март 2006

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

зеркальными, Raid-массивами). Имеется возможность установки Zserver на кластер из серверов на основе MS Cluster Service.

Требования к Zserver определяются требованиями опера-ционной системы. Zserver неприхотлив в ресурсах. Основные ресурсы требуются на реализацию криптографических про-цессов симметричными алгоритмами шифрования. Шифро-вание и дешифрование данных осуществляется «на лету» при соответствующих операциях записи и чтения. Комплект Zserver состоит из дистрибутива программного обеспечения, устройства для работы со смарт-картами ACR ACS-30U (USB), лицензионного ключа защиты (LPT или USB), двух микро-процессорных смарт-карт для хранения ключей, устройства «красной кнопки», подключаемой к COM-порту.

Структура программной части Zserver состоит из трех модулей: сервер защиты данных (ядро системы) консоль управления сервером модуль подачи сигнала тревоги

Установка Zserver проста и не требует дополнительных навыков. Весь процесс инсталляции занимает не более 10 минут с одной перезагрузкой.

Сервер защиты данныхСервер защиты данных (ядро системы) устанавливает-ся непосредственно на сервер с защищаемой информа-цией. Запускается с помощью службы «SecurIT Zkernel» от пользователя System в автоматическом режиме при подсоединенном лицензионном ключе защиты. Служба не имеет зависимостей, что делает её устойчивой к сбо-ям в операционной системе. В отсутствии ключа защи-ты данную службу запустить невозможно. Если при уже запущенной службе отключить физически ключ защиты Zserver, то через некоторое время на этом сервере про-исходит «тревога».

Консоль управленияВсё управление системой Zserver ведется с единой для всех продуктов компании SecurIT консоли управления. Она мо-жет устанавливаться как на сервер, так и на любую рабо-чую станцию, имеющую соединение с сервером по прото-колу TCP/IP. В случае использования консоли управления на сервере, соединение осуществляется по внутренней петле на TCP-порт. По умолчанию используется 1245 порт. Для минимизации риска номер TCP-порта можно изменить с помощью настроек Zserver.

Для разграничения полномочий и доступа к консоли ис-пользуется встроенная авторизация средствами Zserver, что позволяет разграничить администраторов сервера и ад-министраторов безопасности.

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

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

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

В Zserver предусмотрено формирование ключа шифро-вания с помощью двух симметричных алгоритмов: RC5 – 128-битным ключом AES – 256-битным ключом

Возможна также поддержка российского симметрич-ного алгоритма ГОСТ 28147-89 с 256-битным ключом, схо-жим с алгоритмом DES, но работающим гораздо быст-рее. На момент подготовки материалов статьи была воз-можность взлома ключа симметричных алгоритмов дли-ной до 64 бит. Ключ RC5 длинной в 64 бит был взломан за 1 757 дней с привлечением 58 747 597 657 компьютеров пользователей. Для этого потребовалось перебрать око-ло 15 769 938 165 961 326 592 ключей. При скорости пе-ребора 100 000 000 ключей в секунду потребуется около 117 375 055 576 687907 000 дней для подбора ключа шиф-рования длинной в 128 бит.

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

Хранение ключей шифрования возможно на смарт-карте, либо в файле с расширением *.key. При хранении ключа шифрования в файле – защиты не предусмотре-но. С целью обеспечения надежной защиты ваших кон-фиденциальных данных ключ необходимо хранить толь-ко на смарт-карте.

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

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

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

54

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

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

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

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

В связи с тем, что функционал ввода PIN-кода под при-нуждением реализован программно системой Zserver, а не аппаратно смарт-картой, следует учесть, что в случае использования стороннего программно-аппаратного обес-печения для работы со смарт-картами ACOS число попыток ввода PIN-кода увеличивается до 8. Более того, зная PIN-код под принуждением, злоумышленник может получить доступ к памяти смарт-карты. Поэтому PIN-код под принуждением

следует держать в секрете, никому не сообщать, и исполь-зовать только в системе Zserver. В комплект поставки вхо-дит PC/CS-совместимое устройство чтения-записи смарт-карт, подключаемое через USB-интерфейс.

Зашифровывание разделовВ Zserver возможно зашифровывание как уже имеющего-ся раздела (логического диска) с данными, так и нового. Зашифровывание существующего раздела займет более длительное время, но в ходе процесса пользователи смогут по-прежнему работать с данными. Время зашифровывания раздела зависит только от объема всего раздела и не за-висит от наличия информации на нем.. Так как доступ к за-шифрованному разделу осуществляется только с помо-щью ядра Zserver, которое запускается как сервис (служ-ба), не могут быть зашифрованы разделы на более низком уровне, содержащие файлы операционной системы (вклю-чая файлы подкачки и реплики Active Directory), а также за-грузочный раздел. При зашифровывании происходит «по-секторное» криптографическое преобразование по ключу шифрования, включая всю информацию о содержании дан-ных в самом разделе. В отключенном состоянии в опера-ционной системе зашифрованный раздел виден как нераз-меченная (не отформатированная) пустая область. В под-ключенном – зашифрованный раздел представлен как ло-гический диск. Естественно, при копировании данных с за-шифрованного диска на незашифрованный данные оказы-ваются незащищенными.

В случае компрометации ключа можно перешифровать раздел другим ключом. Возможно также расшифровыва-ние всего раздела.

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

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

Модуль подачи сигнала тревогиМодуль подачи сигнала тревоги служит для мгновенной бло-кировки доступа всех лиц посредством отключения зашиф-рованных дисков и удаления из оперативной памяти клю-чей шифрования. Имеется также возможность активации функции перезагрузки сервера при получении сигнала тре-воги. При отключении дисков вся несохраненная информа-ция будет утеряна. Подача сигнала тревоги может быть ини-циирована с любой рабочей станции авторизованным поль-зователем по протоколу TCP/IP, либо с помощью аппарат-ной кнопки, подключенной к компьютеру в сети, либо к сер-веру. «Красная кнопка» может быть двух видов: програм-мная (с помощью установленного программного обеспече-ния) и аппаратного (с помощью устройства на COM-порту).

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

55№3, март 2006

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

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

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

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

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

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

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

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

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

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

56

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

Каждый сотрудник периодичес-ки испытывает на себе инте-рес руководства с целью выяс-

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

нает казаться, будто они никогда не за-кончатся.

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

нейшим шагом к экономии рабоче-го времени.

ДокументацияЯ хочу сразу оговориться, что данная статья не преследует собой цель рас-крыть все вопросы создания и веде-ния технической документации, кото-рая может потребоваться системному администратору. Здесь я лишь попыта-юсь очертить круг тех документов, ко-торые так или иначе приходится писать любому работнику IT-отдела, если в его задачи входит документирование.

Покупая какой-либо программный или технический продукт, пользователь рассчитывает получить вместе с ним пакет документации, который расска-жет, как именно использовать новооб-ретённое средство. Разумеется, я не

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

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

Алексей Коршунов

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

57№3, март 2006

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

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

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

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

С этим вроде бы всё более или менее понятно. Но как же быть с тем, что уже имеет компания на момент ва-шего прихода? Хорошо, если компания

средних размеров и у неё нет десятков серверов и крайне разветвлённой инф-раструктуры. А если есть? И более то-го, не описана ни в каких документах? Это может стать настоящим кошмаром для вступающего в свои обязаннос-ти нового сотрудника. Ведь предсто-ит не просто понять, что происходит на серверах компании и что на них ра-ботает. Предстоит сделать значитель-но больше.

А именно: вникнуть в структуру локальной се-

ти; понять структуру телефонной сети

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

минимально необходимо знать воз-можности существующей электро-сети;

составить полное представление о серверном парке компании;

разобраться в программном обес-печении, функционирующем на серверах компании, о схемах решений тех или иных вопросов, системах резервного копирования и обо всём остальном, что смело можно отнести к огромному фрон-ту работ с новыми (для данного со-трудника) серверами;

составить не менее полное пред-ставление о рабочих станциях;

знать полный набор программно-го обеспечения, принятого стан-дартами компании для сотрудни-

ков (если таковой имеется, а если нет, то, может быть, и разработать его, но об этом позже);

узнать принятую внутри компании структуру взаимодействия работ-ника IT-отдела с пользователями, поставщиками;

узнать схему закупки нового обо-рудования, схему его заказа;

иметь представление об оргтехни-ке, находящейся в ведении компа-нии;

прочие пункты (коих может быть ве-ликое множество).

Это лишь основная часть того, во что предстоит вникнуть новому со-труднику. И в ситуациях, когда ввес-ти его в курс дел максимально под-робно некому, это может стать насто-ящей головной болью. Даже в случа-ях увеличения штата IT-отдела на пол-ное ознакомление могут уйти дни и не-дели. Между тем пользователи рабо-тают, сервера требуют необходимого им ухода, а в планах может находить-ся немало проектов, также нуждаю-щихся в непосредственном внимании и участии сотрудника.

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

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

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

В дальнейшем, каждый из наиболее интересных моментов будет рассматри-ваться более подробно. Если вы хоти-те увидеть на страницах журнала ответ на какой-то из вопросов по технической документации или имеете желание на-писать статью по этой теме – присылай-те ваши вопросы и предложения на адрес [email protected].

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

58

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

ментации отделом IT. А что не требует-ся, то не делается. Это правило край-не распространено у системных адми-нистраторов, и не только касательно до-кументации. Думаю, каждый хоть раз слышал о человеке, не озаботившем-ся разработкой и введением в эксплу-атацию системы резервного копирова-ния всех жизненно важных для работы компании файлов. Точно так же каж-дый знает, к чему это приводит. Поверь-те, отсутствие документации рано или поздно может привести к не менее пе-чальному результату.

Что такое техническая документацияИтак, мы уже поговорили о том, для че-го нужна техническая документация. Теперь давайте поймём, что же это та-кое. Если за ответом на этот вопрос об-ратиться к ныне столь популярной ви-кипедии (wikipedia – ru.wikipedia.org.), то мы получим следующий вполне кон-кретный ответ: «Техническая докумен-тация – набор документов, используе-мых при проектировании (конструиро-вании), создании (изготовлении) и ис-пользовании (эксплуатации) каких-ли-бо технических объектов: зданий, со-оружений, промышленных товаров, программного и аппаратного обеспе-чения.» Другими словами, к техничес-кой документации относится довольно обширный круг документов.

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

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

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

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

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

Однако, как показывает практика, те или иные причины всегда препятс-твуют правильному ведению дел с са-мого начала. Самое простое, что мо-жет прийти на ум, – компания въезжает в новый офис с уже существующей се-тью, на которую попросту нет докумен-тов и схемы. К счастью, в последние па-ру лет наблюдается картина значитель-ных изменений в подходе руководства к инфраструктуре вообще и IT-отделам в частности. Всё чаще и чаще перед пе-реездом в новый офис в нём делается ремонт, а план необходимых коммуни-каций с планированием расположения серверной комнаты и сетевого обору-дования закладывается на стадии ещё только обсуждения возможности пере-езда. Безусловно, это сильно упрощает работу по составлению документации

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

Если же эти условия не выполня-ются и вы являетесь «хозяином» не-известной структуры сети, то, навер-ное, уже потратили уйму времени на то, чтобы в ней разобраться и понять, «по-чему этот провод торчит из стены и ку-да он ведёт». Надеюсь и с патч-панеля-ми у вас полный порядок. Теперь самое время выделить себе один-два рабочих дня на то, чтобы всё это задокументиро-вать. Надеюсь, не надо объяснять, что это в первую очередь нужно вам самим? Не слишком приятно будет вспоминать ваши «поползновения» с неизвестными проводами, когда (или если) такая необ-ходимость возникнет в будущем.

Это и является ответом на вопрос «Когда начинать создавать документа-цию?». Если у вас её ещё нет – начни-те прямо сегодня. Ведь это только на-чало вашей работы по написанию пол-ноценного пакета документов на всё, с чем вы работаете. Как известно, Ро-дина начинается с картинки в букваре, а техническая документация систем-ного администратора со схемы струк-туры сети.

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

Краткий перечень документов, ко-торый стоит начать создавать сразу же после (или во время) описания сети: описание схемы доступа в Интер-

нет и интранет сети; описание серверов; описание системы резервного ко-

пирования; описание схемы антивирусной за-

щиты компании; описание стандартов используемо-

го пользователями программного обеспечения;

прочие пункты, уже упомянутые в введении.

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

59№3, март 2006

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

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

Описание схемы доступа в Интернет и интранет сетиУровень развития телекоммуникаци-онных компаний сейчас достиг того, что всевозможные конкуренто-способ-ные предложения просто-таки навод-нили рынок. Это даёт компаниям-поль-зователям широкий выбор в способе и количестве потребления услуг досту-па в Интернет. Пользуясь этой ситуа-цией, многие руководители, серьёзно относящиеся к бесперебойному досту-пу в Интернет и понимающие его важ-ность, уже давно приняли (или имеют это в планах на ближайшее будущее) решение о резервном канале от одного из присутствующих в районе провай-деров. Чем полезна схема с двумя про-вайдерами уже обсуждалось не раз. Если у вас уже есть два канала для доступа в Интернет, то от вас требует-ся всего лишь документирование этой схемы. А если нет, то чем не повод её изобразить и пойти с ней к руководству. Чем это полезно? Да хотя бы тем, что вы сами в процессе составления доку-мента создаёте у себя в голове чёткое представление о том, как это делается, и сможете применить этот навык в лю-бое время. Полезно? Ещё бы.

Кроме того, не лишним будет опи-сать схему доступа в Интернет и для пользователей компании. Трафик, ко-нечно, дешевеет изрядно, но практи-ка ограничения используемого досту-па применяется всё чаще. Причем если раньше большая часть системных ад-министраторов (или руководства) ис-пользовали схему ограничения по ре-сурсам, то сейчас наиболее популяр-ным становится ограничение по объ-ёму скачиваемого контента. Если вы всё ещё ограничиваете пользователей по списку запрещённых к посещению ресурсов, это хороший повод перейти на ограничение по трафику.

Описание серверовРазбираться каждый раз (или вспоми-нать, если у вас их множество), что на-ходится на том или ином сервере, – это занятие не из приятных. Особенно если именно этот сервер уже полтора года работает в штатном режиме и вни-мания не требует. В то же время созда-

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

Описание схемы резервного копированияСтрого говоря, описав правильную схему резервного копирования и до-бавив к ней обоснование, почему это важно, можно смело идти к руководс-тву и объяснить необходимость выде-лить бюджетные средства на новую технику. Но для нас это важно по дру-гой причине, которая всем известна: сеть без резервного копирования – это бомба замедленного действия, ко-торая рано или поздно рванет так, что никто не уйдёт без «подарков». Наде-юсь, вы не из тех любителей испыты-вать удачу, которые откладывают ре-шение такой важной задачи.

Описание схемы антивирусной защиты компанииЧем важна система защиты от виру-сов, знает каждый системный адми-нистратор. А те, кто уже хотя бы раз бо-ролись с эпидемиями, возникающими даже в казалось бы защищённой сети, уже давно составили схему целостной защиты и привели антивирусную защи-ту на всех рабочих станциях и серверах к «общему знаменателю». Довольно странно звучит, но тем не менее факт – в сетях, где антивирусы установлены, но общей схемы защиты нет, рано или поздно обязательно возникнет вирус-ная эпидемия. Во всём должен быть по-рядок и максимально прозрачное пред-ставление реализации. Это касается и защиты от вирусов.

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

ные стандарты на программное обес-печение, используемое пользователя-ми в повседневной работе.

Однако, как бы странно это ни зву-чало, не везде это задокументиро-вано.

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

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

Уровень компьютерной грамотнос-ти пользователей растёт, а установ-ка новой программы не является про-блемой даже для неопытного пользо-вателя.

Разумеется, такие задачи чаще всего решаются на уровне операцион-ной системы, но, как показывает прак-тика, административные меры самые действенные. (Особенно если за на-рушение корпоративного стандарта штрафуют.)

ЗаключениеРазумеется, перечислены далеко не все документы, которые стоило бы начать вести каждому системному ад-министратору, который серьёзно и ос-новательно подходит к своей работе. Мне известно, что многие люди, рабо-тающие по этой специальности, мяг-ко говоря, недолюбливают написание технической документации. Однако даже они рано или поздно начинают жаловаться на то, что «такой-раста-кой предшественник не оставил пос-ле себя ничего».

Может быть, стоит с себя начать и ввести практику ведения докумен-тации, если таковая ещё не была при-нята в вашей компании.

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

А почему нет?

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

60

сети

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

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

Итак, какие выгоды вы получите от использования спутникового до-ступа в сеть: дешёвый трафик (менее 1 рубля

за 1 Мб при скорости до 5 Мбит); доступность безлимитных тарифов

(32 Кбита от 1200 рублей); возможность доступа при отсутс-

твии магистральных каналов (мож-но использовать в качестве обрат-ного канала модем или GRPS);

возможность доступа при полном отсутствии сетевой инфраструк-туры (через приёмо-передающий комплекс).

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

дороговизны оборудования, трудно-стей получения разрешений и большо-го объёма необходимой информации.

Кроме приёмного оборудования вам понадобится, конечно же, и сама тарелка. Для того чтобы оценить не-обходимый размер тарелки, восполь-зуйтесь картой покрытия спутника. Как правило, на ней имеются зоны, по-казывающие либо сразу размеры та-релки, либо уровень сигнала на мест-ности (см. рис 1).

После того как вы определились с размером антенны – вам необходимо выбрать подходящий вид конструкции. Тарелки бывают двух видов: прямофо-кусные и офсетные (см. рис. 2).

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

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

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

Роман Ерин

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

61№3, март 2006

сети

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

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

BPSK, QPSK, OQPSK, 8PSK, 16QAM – эти виды моду-ляции расположены в порядке возрастания сжатия. Под-робное описание алгоритмов их работы выходит за рам-ки статьи.

Для практического использования достаточно знать: чем больше сжатие – тем ниже конечная цена трафика.

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

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

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

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

где: G1 – ваша географическая долгота; G2 – долгота расположения интересующего вас спутни-

ка на орбите (западная с минусом); W – ваша географическая широта.

Соберите антенну согласно инструкции по сбор-ке. Жестко закрепите опору в выбранной точке. При ус-тановке на балконе или лоджии загородку сверлят на-сквозь и прикрепляют опору обычными длинными бол-тами большого диаметра. При установке на стене в ней сверлят отверстия и используют саморасклинивающие-ся анкерные болты.

В соответствии с рис. 3, используя вышеприведённые формулы, отвес и транспортир, вам не составит труда в те-чение часа настроить тарелку на нужный спутник. Уровень сигнала при этом контролируется программным обеспече-нием (szap для Linux и setup4pc для Windows).

Имеет значение не только точная установка конверте-ра в фокусе антены, но и правильное положение относи-тельно оси вращения конвертера. Обычно каждый конвер-тер (имеются в виду конвертеры, монолитно объединен-ные с поляризатором и облучателем, которые использу-ются для установки антенны на один спутник) имеет метку

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

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

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

62

сети

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

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

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

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

Внимание! Всё, что относится к 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 добавьте строку:

Это необходимо сделать для того, чтобы 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 следующего содержа-ния:

Создаем стартовый скрипт rc.dvb

Рисунок 3. Определение азимута и угла места

options dvb_core dvb_shutdown_timeout=0

Название оператора:частота в Мгц:поляризация(h|v): ↵fec(0-авто):символьная скорость(в килосимволах в сек.): ↵PID:PID:0

#!/bin/bashPREFIX=/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:xxcase "$1" instart) # Загружаем модули modprobe dvb_core dvb_shutdown_timeout=0 modprobe b2c2_flexcop_pci # Если у вас настроен udev, то нужно немного времени, # чтобы устройства появились в каталоге /dev

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

63№3, март 2006

сети

Этот скрипт можно использовать как в Slackware, так и в SysV-системах, типа RedHat.

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

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

вать openvpn или pptp.

Часть пятая: раздаем Интернет в локальную сеть

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

Дальше:

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

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;;stop) # Останавливаем 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

#!/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 $LOCALGWip tunnel del $NAME# Создаём тунельip tunnel add $NAME mode ipip remote $REMOTEIP local ↵ $LOCALIP ttl 255

ip link set $NAME mtu 1500

ip addr add $TUN peer $TUNGW dev $NAMEip link set $NAME upip route del defaultip route add default via $TUNGWip 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/maskleniptables -t nat -A FORWARD -s mynet/masklen ↵ -j SNAT –to-source yy.yy.yy.yy

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

Skystar2 поддерживает до 32 одновременных независимых каналов приёма с одного транспондера. Каждый канал будет различаться только mac адресом на нём. Модифицируйте стар-товые скрипты необходимым образом. В качестве MAC-адресов для новых интерфейсов, как вариант, можно брать адреса со сго-ревших сетевых плат.

Вам также придётся потратить какое-то время для того, чтобы объяснить спутниковому провайдеру, что от него требуется. Схе-ма взаимодействия показана на рис. 4.

Основная мысль заключается в том, чтобы делать SNAT на разные адреса для разных пользователей/сервисов. Рисунок 4. Схема взаимодействия

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

азимут от юга.

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

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

64

сети

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

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

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

65№3, март 2006

сети

Задача автоматизации управления различным се-тевым оборудованием существует со времени по-явления первых сетевых устройств. На сегодняш-

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

Забегая вперед, скажу, что задача получения значе-

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

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

66

сети

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

Отправляем объектыСуществует несколько стандартов на базы данных управля-ющей информации для протокола SNMP. Основные – стан-дарты MIB-I и MIB-II и версия базы данных для удаленно-го управления RMON MIB. Спецификация MIB-I определя-ла только операции чтения значений переменных. Опера-ции изменения или установки значений объекта являются частью спецификаций MIB-II.

Версия MIB-I определяет порядка 114 объектов, кото-рые подразделяются на 8 групп. System – общие данные об устройстве (например, иден-

тификатор поставщика, время последней инициализа-ции системы).

Interfaces – параметры сетевых интерфейсов устройс-тва (например, их количество, типы, скорости обмена, максимальный размер пакета).

Address Translation Table – описание соответствия меж-ду сетевыми и физическими адресами (например, по протоколу ARP).

Internet Protocol – данные протокола IP (адреса IP-шлю-зов, хостов, статистика о IP-пакетах).

ICMP – данные протокола обмена управляющими сооб-щениями ICMP.

TCP – данные протокола TCP (например, о TCP-соеди-нениях).

UDP – данные протокола UDP (число переданных, при-нятых и ошибочных UDP-дейтаграмм).

EGP – данные протокола обмена маршрутной информа-цией Exterior Gateway Protocol (число принятых с ошиб-ками и без ошибок сообщений).

В версии MIB-II был расширен набор стандартных объ-ектов, а число групп увеличилось до 10. В число объектов, описывающих каждый конкретный интерфейс устройства, включены следующие: ifType – тип протокола, который поддерживает интер-

фейс. Этот объект принимает значения всех стандарт-ных протоколов канального уровня, например rfc877-x25, ethernet-csmacd, iso88023-csmacd, iso88024-tokenBus, iso88025-tokenRmg и т. д.

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

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

ifPhysAddress – физический адрес порта, для Fast Ethernet им будет МАС-адрес. ifAdminStatus – желаемый статус порта:

up – готов передавать пакеты; down – не готов передавать пакеты; testing – находится в тестовом режиме. ifOperStatus – фактический текущий статус порта, име-

ет те же значения, что и ifAdmin-Status. ifin Octets – общее количество байт, принятое данным

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

iflnUcastPkts – количество пакетов с индивидуальным адресом интерфейса, доставленных протоколу верхне-го уровня.

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

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

ifinErrors – количество пришедших пакетов, которые не были переданы протоколу верхнего уровня из-за обна-ружения в них ошибок.

Каждый объект в дереве значений SNMP определяет-ся с помощью уникального идентификатора OID (Object ID). OID можно представить либо в числовом виде (то есть в том виде, который использует SNMP), либо в текстовом, с ис-пользованием MIB-файлов. Следует также отметить, что су-ществуют базы MIB от различных производителей как ап-паратного, так и программного обеспечения, которые поз-воляют представлять числовые значения параметров сво-их SNMP-агентов в символьном виде. Формат MIB-файлов описан в RFC-1212 [3].

Составное числовое имя объекта SNMP MIB соответс-твует полному имени этого объекта в дереве регистрации объектов стандартизации ISO.

Пространство имен объектов ISO имеет древовидную ие-рархическую структуру. От корня этого дерева отходят три ветви, соответствующие стандартам, контролируемым ISO, ITU и совместно ISO-ITU. В свою очередь, организация ISO создала ветвь для стандартов, создаваемых национальны-ми и международными организациями (ветвь оrg). Объекты любых стандартов, создаваемых под эгидой ISO, однозначно идентифицируются составными символьными именами, на-чинающимися от корня этого дерева. В сообщениях протоко-лов символьные имена не используются, а применяются од-нозначно соответствующие им составные числовые имена. Каждая ветвь дерева имен объектов нумеруется в дереве це-лыми числами слева направо начиная с единицы, и эти чис-ла и заменяют символьные имена. Поэтому полное символь-ное имя объекта MIB имеет вид: iso.org.dod.intemet.mgmt.mib, a полное числовое имя: 1.3.6.1.2.1 (см. рис. 2).

Рисунок 1. Структура взаимодействия SNMP

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

67№3, март 2006

сети

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

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

Настраиваем оборудованиеПрежде чем приступить к настройке SNMP на конкретном управляемом устройстве, необходимо определиться с то-пологией сети, в которой находятся управляемое устройс-тво и сервер управления SNMP. Как уже упоминалось, дан-ный протокол использует UDP. В связи с этим следует от-метить, что при использовании технологии NAT (Network Address Translation) или соединения через VPN-канал между управляющим устройством и сервером управления могут возникнуть трудности с прохождением SNMP-сообщений. Также необходимо позаботиться о том, чтобы в соответству-ющих списках доступа для портов 161 и 162 (SNMP Traps) был разрешен UDP-трафик.

Приступим к настройке работы SNMP на управляемом устройстве.

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

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

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

snmp-server community <community_name> RO <access-list> snmp-server enable traps snmp-server host <host_address>

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

68

сети

Первая команда определяет community или «сообщест-во», представляющее строку, используемую в процессе до-ступа к устройству. На многих устройствах по умолчанию это public. Однако лучше придумать название подлиннее и посложнее, дабы те, кому не положено, не смогли даже просмотреть значения MIB для данного устройства.

Второй параметр RO – это уровень доступа Read Only, существует также уровень доступа, позволяющий запись (RW), однако настоятельно рекомендую без особой необхо-димости не давать такого доступа, так как это может при-вести к самым неприятным последствиям, вплоть до пол-ной потери рабочей конфигурации.

Наконец, третий параметр – это номер Access-list, спис-ка доступа, который определяет, кому разрешен доступ к данному управляемому устройству. Этот параметр не яв-ляется обязательным, если его не указывать, то сообще-ния об ошибке не будет, но для ограничения безопасности access-list необходим [1].

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

Третья команда определяет SNMP-сервер, на который будут отправляться уведомления Trap.

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

Программная реализацияРассмотрим пример, позволяющий выполнить основ-ные операции взаимодействия с управляемым устройс-твом. Исходный код, а также библиотеки, которые были взяты за основу при написании сценариев, можно загру-зить по адресу [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 – сколько пакетов с неверными адресами.

Значения первых четырех параметров, как правило ука-зываются при первом конфигурировании устройства и за-тем остаются неизменными, а последние три являются счет-чиками и постоянно изменяются.

Как уже упоминалось, приведенный здесь сценарий поз-воляет получать информацию через веб-интерфейс, созда-вать странички «на лету», то есть является CGI-сценарием. Не увлекаясь особо веб-программированием, будем выво-дить эти значения в виде таблицы. Общий алгоритм работы сценария следующий, устанавливаем SNMP-сессию, в ко-торой запрашиваем нужные ветки MIB. Затем полученные значения преобразовываются и выводятся на экран.

sysDescr Cisco Router

sysContact SysAdmin

sysName Core router

sysLocation Wiring closet

ipInDelivers 12991

ipInReceives 23632

ipInAddrErrors 246

Таблица 1. SNMP Management Monitor

Листинг 1. Взаимодействие по протоколу SNMP

#!/usr/bin/perl # Первая строка – путь к интерпретатору Perluse SNMP_Session;use BER;# Эти две библиотеки можно найти в исходных кодах к статьеuse strict;

# Объявляем основную процедуру, выводящую значения# параметров на экранsub snmp_get($@);

$SNMP_Session::suppress_warnings = 1;

my $ipv4_only_p = 0;my $snmp_version = 1;# По умолчанию используется версия 1my $hostname = '172.17.39.1'; # управляемое устройствоmy $community = 'admin12345'; # SNMP community

my %ugly_oids = qw( sysDescr 1.3.6.1.2.1.1.1.0 sysContact 1.3.6.1.2.1.1.4.0 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 );# объекты MIB (OID) в числовом видеmy %pretty_oids;

foreach (keys %ugly_oids) { $ugly_oids{$_} = encode_oid (split (/\./, $ugly_oids{$_})); $pretty_oids{$ugly_oids{$_}} = $_;}# в цикле преобразовываем OIDsrand();# устанавливаем 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);

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

69№3, март 2006

сети

В результате работы данного сценария получаем таб-лицу, содержащую значения параметров MIB (см. табли-цу 1).

Данный сценарий вполне можно использовать на прак-тике.

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

Приведем еще один фрагмент сценария, который осу-ществляет прием сообщений Trap. Общий алгоритм рабо-ты аналогичен предыдущему, поэтому приведу лишь ту часть сценария, которая касается собственно получения сообщений.

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

Например, вот так будет выглядеть сообщение SNMP, которое прислал коммутатор после отключения его ин-терфейса.

А так выглядит SNMP Trap, сообщающий о том, что ин-терфейс включен:

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

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

Листинг 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 => '[email protected]', From => '[email protected]', 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";}

.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

.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

($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"; }}

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

70

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

К сожалению, в Microsoft Framework отсутствуют функции по управ-лению DFS, сетевыми папками

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

Существует два варианта: адап-тировать сценарий на VBScript под VB.NET или, используя WIN API-функ-

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

ции, дописать Framework по своему ус-мотрению.

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

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

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

Иван Коробко

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

71№3, март 2006

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

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

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

ном компьютере.

Рассмотрим пример создания сетевой папки на VBScript (см. пример 1). Пример можно разделить условно на две ло-гические части: в первой из них осуществляется проверка существования папки с помощью объекта FSO. В том слу-чае, если папки нет, она создается. Во второй части предо-ставляют сетевой доступ к существующей папке, для чего необходимо указать несколько обязательных параметров: имя компьютера, путь к папке, название папки в сети. Пол-ный список и описания параметров см. в таблице 1.

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

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

ных;

в VB.NET отсутствуют операторы SET и LET (все отли-чия синтаксиса подробно описаны в статье «Переход от VBScript к VB.NET»).

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

Если использовать объект Microsoft.VisualBasic.FileIO.FileSystem, относящийся к стандартным, то пример созда-ния заданного каталога выглядит так:

Определение имени текущего компьютераКак говорилось ранее, для создания сетевой папки необхо-димо указать несколько обязательных параметров, среди ко-торых имя компьютера. В том случае, если предоставляется сетевой доступ к локальной папке, то имя компьютера мож-но определить как с помощью объекта Wscript.Network:

так и с помощью встроенной функции в VB.NET:

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

Пример 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 ' сохранение изменений в файловую ' систему

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

Параметр Описание

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

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

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

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

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

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

Name Имя ресурса

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

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

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

' Объявление константыDim PathToFolder As String = "C:\Test"

Dim fso As New Scripting.FileSystemObjectIf fso.FolderExists(PathToFolder) = False Then fso.CreateFolder(PathToFolder)End If

' Объявление константыDim PathToFolder As String = "C:\Test"

' Проверка существования каталогаDim fso As New Microsoft.VisualBasic.FileIO.FileSystemIf fso.DirectoryExists(PathToFolder) = False Then fso.CreateDirectory(PathToFolder) End If

Dim Temp As New WshNetworkDim PCName As String = Temp.ComputerName

Dim PCName As String = My.Computer.Name

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

72

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

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

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

Для удобства восприятия не будем использовать им-порт пространства имен, а каждый раз в примере будем разыменовывать объект.

Итак, пишем:

и в отображаемой нам оболочкой VB.NET подсказкой в свойствах класса не находим функцию GetObject(). Для решения вопроса обратимся к поисковой системе MSDN (http://msdn.microsoft.com), задав в качестве крите-рия «ActiveDS, GetObject».

Среди найденных страниц остановимся на ссылке «IADsContainer::GetObject», в которой приведен пример чте-ния объекта (см. рис. 1). Приняв его за основу, адаптируем его под нашу задачу:

или, что то же самое:

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

Теперь необходимо создать обработчик ошибок, что-бы созданное приложение выдавало сообщение, напри-мер, о том, что создаваемая сетевая папка уже сущест-вует. Для этого рекомендуется использовать встроенную процедуру «Try … End Try». Ее шаблон выглядит следую-щим образом:

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

Dim con As ActiveDS

Dim ShareServeceObj As ActiveDs.IADsContainerShareServeceObj = GetObject("WinNT://" + PCName + ↵ "/LanManServer")

Dim ShareServeceObj As ActiveDs.IADsContainer = ↵ GetObject("WinNT://" + PCName + "/LanManServer")

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

' Создание объектаDim ShareServeceObj As ActiveDs.IADsContainer = ↵ GetObject("WinNT://" + PCName + "/LanManServer")Dim NewShare As ActiveDs.IADsFileShare = ↵ ShareServeceObj.Create(ObjectType, ShareName)NewShare.Path = PathToFolderNewShare.MaxUserCount = MaxUsersNewShare.SetInfo() ' сохранение изменений в файловую ' систему

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

Dim PathToFolder As String = "C:\Test"Dim ShareName As String = "Test"Dim ObjectType As String = "FileShare"

Dim MaxUsers As Integer = 10

Imports ActiveDS

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

73№3, март 2006

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

Использование 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.

Объявление функцииСинтаксис объявления функций следующий:

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

Описание структурыСинтаксис объявления структур, используемых функция-ми, следующий:

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

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

Действие Функция

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

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

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

NetShareGetInfo/NetShareSetInfo

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

NetShareEnum

Declare Unicode Function NetDfsGetInfo Lib "***.DLL" (ByVal[ByRef] ParametrName As TypeOfData,…) As Integer

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

Структура в MSDN Описание в VB.NET

LPTSTR a

ByVal … As StringLMSTR a

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

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _ Public Structure OSVERSIONINFOEX … End Structure

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

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

Структура в MSDN Описание в VB.NET

LPCWSTR aPublic a as String

LMSTR a

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

Public a as IntegerUINT a

LONG a

HWND a

WORD a Public a as Int16 или Integer

DWORD a Public a as Int32 или Integer

LPStructureName Storage Public a as IntPtr

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

74

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

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

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

Вызов API-функции, не обращающейся к структуреПримером такой функции является API-функция NetShare Check, с помощью которой определяют статус сетевой папки.

На первом этапе необходимо объявить функцию, вос-пользовавшись MSDN, задав в качестве искомого слова «NetShareCheck» (см. рис. 2), и таблицей 3:

В обработке какого-либо события, например нажатия на кнопку, осуществляется вызов функции:

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

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

Если обратить внимание на описание этой функции в MSDN, то видно, что она при декларировании может ссы-латься на одну из структур. В приведенном примере исполь-зуется структура _SHARE_INFO_2.

Также необходимо описать в тексте VB-файла структу-ру _SHARE_INFO_2. Воспользовавшись поиском в MSDN найдем ее описание (см. рис. 3) и таблицей 4, корректно опишем структуру в VB-файле VB.NET проекта:

Перед тем как выполнить обращение к функции необ-ходимо присвоить членам, описанным в структуре, соот-ветствующие значения:

Затем осуществляется вызов функции, с указанием не-обходимых параметров:

Если все типы данных объявлены корректно, то функ-ция возвратит 0, если же нет, необходимо воспользоваться MSDN для определения по коду ошибки ее описания ссыл-кой (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp). Полный вариант текста вызова функции приведен ниже:

Рисунок 2. Описание функции NetShareCheck в MSDN

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

Dim a As _SHARE_INFO_2a.shi2_max_uses = 100a.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)

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"

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)

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

End Sub

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

<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

Declare Unicode Function NetShareCheck Lib "NETAPI32.DLL" ↵ (ByVal servername As String, ByVal device As String, ↵ ByRef type As Integer) As Integer

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

75№3, март 2006

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

Вызов API-функции, осуществляющей чтение данных из структурыПроиллюстрировать данный случай лучше всего на приме-ре функции NetShareGetInfo. Обратите внимание на декла-рирование этой функции в MSDN: последний параметр яв-ляется ссылкой на данные, хранящиеся в памяти, который имеет в VB.NET тип IntPtr. При вызове функции осущест-вляется обращение к структуре и обработка полученных данных. Итак, объявление этой функции в VB.NET выгля-дит следующим образом:

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

затем чтение полученных данных из памяти:

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

Создание собственной библиотекиДля создания собственных динамических библиотек необ-ходимо создать проект, имеющий тип Class Library.

Библиотека состоит минимум из одного класса, в кото-ром описаны функции, вызов которых и осуществляется из внешних программ:

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

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

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

Dim server As String = "\\1230pc"Dim share As String = "123"Dim err_code As IntegerDim bufPtf As IntPtrerr_code = NetShareGetInfo(server, share, 2, bufPtf)

Dim b As _SHARE_INFO_2b = CType(Marshal.PtrToStructure(bufPtf, ↵ GetType(_SHARE_INFO_2)), _SHARE_INFO_2)MsgBox(b.shi2_netname)

Private Sub Button6_Click(ByVal sender As System.Object, ↵ ByVal e As System.EventArgs) Handles Button6.Click Dim server As String = "\\1230pc" Dim 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

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

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

Рисунок 4. Задаем пространство имен динамической библиотеки

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

Case 0 MsgBox(b.shi2_netname) Case 2310 err_description = "Share Is Not Found" MsgBox(err_description) End Select End Sub

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

76

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

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

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

Замечание: в качестве параметра Assembly name (см. рис. 4) задается название формируемой DLL-библи-отеки.

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

Формирование функцийПриведу пример функции в DLL-библиотеки, создающей се-тевую папку. В том случае, если папка отсутствует, то фун-кция, в зависимости от установленного флага, будет ее со-здавать.

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

вить в сетевой доступ. Имя папки в сети. Если этот параметр не задан, то имя

сетевой папки должно совпадать с физическим именем папки.

Описание сетевой папки. Флаг: 0/1. Если значение 0 – при физическом отсутствии

папки не создавать ее, 1 – создать папку, если ее нет.

Конечно, количество параметров можно расширить или сократить, например, можно уменьшить их количест-во, объединив первые три в UNC-путь к папке (\\Server\C$\Folder), при условии, что сетевое имя папки берет за осно-ву ее физическое имя.

Теперь придумайте название функции, например, AddShare.

На первом этапе следеут объявить функцию. Первые че-тыре параметра имеют строковый формат, флаговое зна-чение может быть числовым (0/1) либо булевым(True/False). В данной ситуации остановимся на булевом значении:

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

Рассмотрим тело основной функции. Поскольку усло-вились, что будем проверять булевое значение, то необхо-димо с помощью объекта FSO проверить наличие катало-га, при указанном булевом значении TRUE. В том случае, если значение равно TRUE, т.е. проверка осуществляет-ся, то при отсутствии каталога в указанном месте он со-здается и предоставляется в сетевой доступ с указанны-ми параметрами.

Если же значение FALSE, то проверка на наличие ка-талога не осуществляется и подразумевается, что папка существует:

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

Вызов созданной функции из библиотекиСоздав и скомпилировав библиотеку, необходимо прове-рить работоспособность всех функций библиотеки, создав тестовый проект и подключив к нему скомпилированную в DLL-файл библиотеку.

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

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

Проверив этот факт, можно убедиться, что скомпили-рованная библиотека работает корректно.

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

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

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

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

Dim a As SharedFolder.ManipulateDim err_code As Integererr_code = a.AddShare("1230pc","c:\123","123", ↵ "TestFolder",True)MsgBox (err_code)

Imports SharedFolders

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

77№3, март 2006

bugtraq

Множественные уязвимости в Mac OS XПрограмма: Apple Macintosh OS X.Опасность: Критическая.Описание: 1. Уязвимость существует в automount. Удален-ный пользователь, контролирующий файловый сервер, мо-жет заставить уязвимую систему смонтировать файловую систему, содержащую зарезервированные адреса. Удач-ная эксплуатация уязвимости позволит злоумышленнику вызвать отказ в обслуживании или выполнить произволь-ный код на целевой системе.

2. Обход каталога существует в BOM framework из-за ошибки при обработке некоторых архивов. Удаленный поль-зователь может с помощью специально сформированно-го архива распаковать файлы в произвольную директо-рию на системе.

3. Небезопасное создание временных файлов обнару-жено в приложении passwd. Локальный пользователь мо-жет с помощью специально сформированной символичес-кой ссылки перезаписать произвольные файлы на системе с привилегиями пользователю root. Пример:

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-перенаправлений. Уда-ленный пользователь может выполнить произвольный код

сценария в браузер жертвы в контексте безопасности ло-кального домена.

13. Ошибка в Safari в LaunchServices может позволить злоумышленнику выдать злонамеренный файл за безо-пасный и выполнить его на системе, если включена опция «Open safe files after downloading».

14. Межсайтовый скриптинг возможен в компоненте Syndication (Safari RSS). Удаленный пользователь может выполнить произвольный код сценария в браузере жерт-вы в контексте безопасности уязвимого сайта.URL производителя: www.apple.com.Решение: Установите исправление с сайта производите-ля.

Apple Mac OS X "/usr/bin/passwd" Binary Local Privilege ↵ Escalation (root) Exploit

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

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

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

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

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

78

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

Модуль PDF::API2 (http://pdfapi2.sf.net) разрабатывается Аль-фредом Райбенщухом (Alfred

Reibenschuh) и распространяется по лицензии GNU GPL. PDF::API2 на-писан на чистом Perl и имеет мини-мум зависимостей: Perl 5.8.4 или вы-

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

удобным для вас способом. Послед-ней на момент написания статьи вер-сией была 0.51.

Поставляемая вместе с PDF::API2 документация насчитывает более 160 страниц, большая часть из кото-рых не имеет практической ценности.

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

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

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

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

79№3, март 2006

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

Для повседневной работы вам потребуются лишь страни-цы 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.

Экранная модель PDFОсновой для эффективной работы с PDF является понима-ние его экранной модели (imaging model). Аналогичные кон-цепции лежат в основе многих современных API для рабо-ты с векторной графикой, например, Cairo и Arthur, так что кое-какие представления о них в любом случае окажутся нелишними.

Спецификация PDF 1.4 предусматривает четыре типа объектов, которые могут отображаться на странице: кон-туры (path object), текст (text object) и растр (image object). Особняком стоит область отсечения (current clipping path) – специальный контур, в пределах которого возможна отри-совка объектов. Любые фигуры или их части, выходящие за пределы данной области, отсекаются, откуда и проис-ходит это название.

Для описания объектов всех четырех типов и работы с ними в PDF служит специальный язык, по своим функци-ям аналогичный PostScript. Например, для отрисовки кон-тура используется оператор S (stroke), а для его заливки – f (fill) (здесь нет никакой опечатки – операторы «языка PDF» в большинстве своем одно- и двухбуквенные). Как нетрудно видеть, у этих операторов нет параметров. Точки, образую-щие контур, задаются заранее, а такие атрибуты, как тол-щина соединяющей их линии, ее цвет и цвет заливки оп-ределяются текущим графическим состоянием (graphics state). Одним из наиболее важных элементов этого состо-яния является матрица преобразования системы коорди-нат (current transformation matrix, CTM), определяющая теку-щее положение декартовых осей. Думается, читатели, име-ющие опыт программирования трехмерной графики, испы-тали чувство дежа-вю, и не зря: аналогия с OpenGL/Direct3D налицо, разве что все преобразования координат в PDF бу-дут двумерными. По умолчанию, система координат имеет начало в левом нижнем углу листа, ось X направлена впра-во, ось Y – вверх. За единицу измерения принимается 1/72

дюйма, что примерно соответствует типографскому пунк-ту (pt). Вы можете перенести начало отсчета в другую точ-ку (translate), повернуть оси на некоторый угол (rotate), из-менить масштаб (scale) или скосить их (skew). Напомним, что порядок применения этих операций имеет значение: перенос и поворот – это совсем не то же самое, что пово-рот и перенос. Изменения системы координат непосредс-твенно сказываются на выводимых объектах: так, надпись, расположенная вдоль оси X в повернутой системе коорди-нат, будет идти под некоторым углом к краю страницы. Ес-ли система координат была перенесена на N пунктов влево и M пунктов вверх, окружность, центр которой якобы нахо-дится в начале (0,0), будет изображена в окрестности точ-ки с координатами (M,N) и так далее.

Геометрическая плоскость, на которой введена наша система координат, бесконечна, однако в реальном мире все имеет свой предел. Стандарт PDF предусматривает не-сколько различных типов границ, наиболее важными из ко-торых являются граница физической страницы (MediaBox) и граница видимой области (CropBox). Каждая из них зада-ется четверкой чисел, представляющих собой координаты левого нижнего и правого верхнего углов прямоугольной области в системе координат по умолчанию. Если CropBox не задан явно, он принимается равным MediaBox.

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

Здравствуй, мир!По сложившейся традиции, мы начнем свое рассмотре-ние с программы «Hello, World». Данный пример был взят из стандартного дистрибутива PDF::API2, но слегка моди-фицирован, чтобы лучше отражать отечественные реалии. Конечно, при практическом наборе кода номера строк (01:, 02:, ...) необходимо опустить; мы также не используем стро-гий режим (use strict), чтобы слегка уменьшить объем сце-нариев и повысить их удобочитаемость.

Строки 1-2, будем надеяться, в особых комментариях не нуждаются. В строках 3-6 задаются стандартные кон-станты, выражающие миллиметр (mm), сантиметр (cm),

Пример 1

01:#!/usr/bin/perl

02:use PDF::API2;

03:use constant mm => 25.4/72;04:use constant cm => 2.54/72;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;10:$page->mediabox('A4');

11:$gfx = $page->gfx;

12:# Выводим текстовую метку13:$gfx->textlabel(210/mm/2, 297/mm/2, $fnt, 12, ↵ 'Здравствуй, мир !');

14:$pdf->saveas('helloworld1.pdf');15:$pdf->end;

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

80

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

дюйм (in) и пункт (pt) в принятых в PDF единицах измере-ния. Рекомендую включать их во все ваши скрипты. Нако-нец, в строке 7 создается объект PDF::API2, с которым мы и будем работать. Каждому такому объекту может соот-ветствовать не более одного PDF-документа. В строке 8 мы выбираем шрифт, который будет использоваться для вывода текста. Параметр -encode может принимать лю-бое значение, известное модулю Encode вашей инсталля-ции Perl и, конечно, совпадающее с кодировкой символов в вашем сценарии. Метод corefont указывает, что нам ну-жен один из «базовых» шрифтов, лицензированных ком-паниями Adobe и Microsoft для свободного распростране-ния, а посему потенциально доступными на любой системе. Помимо Verdana, сюда входят Georgia, Webdings, Wingdings (набор «Windows Fonts»), Courier, Helvetica, Symbol, Times, ZapfDingbats (набор «Adobe Core Fonts») и их разновиднос-ти: жирный, курсив и так далее.

К сожалению, текущая версия PDF::API2 умеет коррек-тно отображать русский текст лишь шрифтами Verdana и Georgia – для остальных гарнитур отсутствует информа-ция о ширине символов, в результате чего буквы слипают-ся (см. врезку «Изъясняемся по-русски»).

Кроме core-шрифтов, PDF::API2 может использовать произвольные шрифты TrueType, PostScript и BDF, предо-ставленные пользователем в виде файлов. В этом случае шрифт внедряется в PDF-документ.

В строке 9 мы добавляем в конец нашего, пока еще пус-того документа чистую страницу, а в строке 10 устанавлива-ем ее размер, равный странице формата A4 (210x297 мм) –

по умолчанию используется стандартный для США размер Letter. Помимо псевдонима «A4» в методе mediabox мож-но использовать пару (ширина, высота) или ту самую чет-верку чисел, о которой говорилось в предыдущем разде-ле. Подготовительные операции завершаются создани-ем графического объекта $gfx (можете рассматривать его как холст – canvas) в строке 11.

В строке 13 мы вызываем метод textlabel – это самый простой (но не самый гибкий) способ создания текстового объекта, который будет расположен в точке с координата-ми 210/mm/2, 297/mm/2 (т.е. в центре листа. Обратите вни-мание на использование константы mm для перевода мил-лиметров в пункты) и отрисован шрифтом $font (Verdana) высотой 12 пунктов. В строках 14 и 15 происходит запись PDF-документа на диск и разрушение объекта.

На первый взгляд подготовительный этап может пока-заться чересчур трудоемким, но давайте не будем спешить и займемся усовершенствованием этого, в общем-то, очень простого примера. Заменим строки 12-13 на:

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

Полученная нами картинка уже неплоха, но здесь явно напрашивается что-то большее. Давайте добавим в наш документ геометрические фигуры (в терминологии PDF – контуры) и раскрасим их в различные цвета!

Вставьте данный кусочек кода после строки 2 в преды-дущем примере:

В строке 1 задается одно из свойств текущего графи-ческого состояния – цвет заливки (fillcolor). Строка 2 опре-деляет прямоугольник, в точности совпадающий с нашей страницей (поскольку координаты его вершин возвраща-ются методом get_mediabox). Наконец, в строке 3 дает-ся команда закрасить ранее определенный контур (пря-моугольник) цветом, установленным последним вызовом

Пример 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

# Синий фон01:$gfx->fillcolor('blue');02:$gfx->rectxy($page->get_mediabox);03:$gfx->fill(1);

# Желтый круг в центре страницы04:$gfx->fillcolor(‘yellow’);05:$gfx->circle(210/mm/2, 297/mm/2, 0.95*$R);06:$gfx->fill(1);

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

81№3, март 2006

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

fillcolor (синим). До вызова метода fill наш прямоугольник не отображается на странице. Более того, заменив вызов fill на stroke, мы получим незакрашенный прямоугольник, пос-троенный по тем же самым точкам. Это является следстви-ем того, что операторы S и f не имеют собственных вход-ных параметров, а используют заданные ранее значения. Аналогичным образом в строках 4-6 строится желтый круг радиуса 0.95*$R.

Сохраните сценарий и запустите его на выполнение. Ес-ли вы не допустили ошибок при наборе исходного текста, ваши старания будут вознаграждены! На синем небе яр-ко засияет солнышко, каждый лучик которого шлет привет этому, а может быть, и другим мирам (см. рис. 2).

Конечно, возможности PDF::API2 никоим образом не ог-раничиваются рассмотренными здесь вызовами. Всю не-обходимую информацию вы можете найти в документа-ции. От себя добавлю, что в сценариях для «серьезной» работы с текстом возможностей, предоставляемых мето-дом textlabel, может оказаться недостаточно. Поэтому ес-ли вы намерены составить конкуренцию TeX или Adobe InDesign, советуем ознакомиться со статьей [1], в которой подробно рассмотрен процесс верстки и добавления ил-люстраций.

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

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

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

$pdf->openpage, открывающему уже существующую. Кста-ти, номер страницы (в нашем случае 1) может быть и от-рицательным – это означает, что вы ведете отсчет не с на-чала документа, а с конца. Файл blank.pdf мы подготовили в обычном текстовом процессоре с возможностью экспор-та PDF, а расположение полей для заполнения определи-ли, используя его «линейки» (297мм – высота листа фор-мата A4, отступы отсчитываются от левой и верхней гра-ниц страницы) (см. рис. 3).

Другой весьма широкий класс задач – так называемый пост-процессинг PDF-документов: поворот страниц, обре-зание полей (crop), слияние нескольких документов в один и извлечение страниц, а также извечная проблема любите-лей электронных книг – брошюровка (называемая в наро-де «верстка книжкой»). Рассмотрим каждую из этих задач по очереди. Во всех последующих сценариях, где это не-обходимо, подразумевается «преамбула» в объеме строк 1-6 примера 4.

Поворот страниц

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

Здра

вств

уй, м

ир !

Здра

вств

уй, мир

!

Здра

вств

уй, мир

!

Здра

вств

уй, м

ир !

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

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

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

ир !

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

ир !

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

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

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

Пример 4

01:#!/usr/bin/perl

02:use PDF::API2;

03:use constant mm => 25.4/72;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);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;

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;

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

82

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

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

Обрезание полей

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

го лишь устанавливает определенный параметр в свойс-твах страницы.

Слияние документов и извлечение страницЧтобы решить эту задачу, нам придется поднапрячься и со-вершить качественный скачок – начать работать с дву-мя объектами PDF::API2 одновременно. В общем случае нам необходимо создать документ-источник и документ-приемник, а затем перенести страницы с помощью метода importpage. Если документ-приемник ранее не существовал (то есть был создан в процессе работы сценария), мы име-ем дело с извлечением страниц, в противном случае нали-цо (частичное) слияние двух документов.

В строке 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:#!/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;

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;

Иванов И.И.

Голодающим детям Африки

01.01.1970

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

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

83№3, март 2006

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

Метод 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-файлов.

Этот кусочек кода реализует первую половину на-шего плана. В переменной $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:$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;

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: my @ps = map {$_->val} $xo->{BBox}->elementsof;09: my $bbox_width = $ps[2] - $ps[0];10: my $bbox_height = $ps[3] - $ps[1];11: 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: if ($scale_x <= $scale_y) {16: $scale = $scale_x;17: $x = 0;18: $y = ($page_height - $scale*$bbox_height)/2;19: } 20: else {21: $scale = $scale_y;22: $x = ($page_width/2 - $scale*$bbox_width)/2;23: $y = 0;24: }

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

«Изъясняемся по-русски»«Слипание» букв русского алфавита происходит из-за того, что PDF::API2 не обладает достаточной информацией о их ширине в каждом конкретном шрифте. Существует несколько способов исправить «заморский акцент» PDF::API2: Использовать только core-шрифты Verdana и Georgia – для них

эти сведения имеются. Использовать встраиваемые шрифты TrueType или PostScript.

Здесь также не исключены проблемы, но они куда менее ве-роятны – вся информация берется непосредственно из фай-лов шрифтов.

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

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

84

хобби

Почему?

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

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

Почему?

Почему?

Ïî÷åìó?

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

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

Коллекция «Почему?»Куда все делось и откуда что берется -

Одновременно два вопроса не решить…

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

Каждый пишет, как он слышит, каждый слышит, как он дышит,

как он дышит, так и пишет, не стараясь угодить...

Булат Окуджава

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

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

85№3, март 2006

хобби

ности было азартно порвано или сожжено. Кто не прохо-дил через это?..

И по сей день страсть переносить свои сомнения и раз-думья на бумагу, то затихает в нем, то разгорается с но-вой силой. Было время, когда главным развлечением на-шего героя были беседы с непременными бабушками, за-седающими у каждого уважающего себя подъезда. С не-поддельным любопытством слушал увлекательные исто-рии их жизни – про Сибирь и высокие кабинеты ЦК. И ни-чего не писал.

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

Пишет Алексей исключительно по ночам, лучше всего работается ему в полнолуние.

Рассказы – это действительно хобби: на лавры серь-езного прозаика Алексей не претендует. Он даже не хочет публиковаться, лишь несколько историй вывесил в Сети, на своем форуме, по адресу www.akeeper.ru.

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

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

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

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

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

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

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

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

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

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

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

Жизнь шла, а Почемучка все был в сом-нениях, ведь он много-много раз говорил другим: действовать можно, только поняв «что, зачем и почему». Уже не так охотно слушали его советы, а друзья вечно ссыла-лись на занятость делами. Почемучка за-грустил. Некого стало учить жизни, некому стало пенять на безделье и малодушие. Из-вечный вопрос стал проклятием…

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

Почемучка бежал вприпрыжку от счас-тья, как будто ему снова 15 лет, ведь он по-нял, понял «что, зачем и почему»! Теперь-то уж он не упустит своего счастья! Теперь он все изменит, и мир никогда не будет пре-жним!.. Визг тормозов и удар о лобовое стекло прервали жизнь впервые не посмот-ревшего по сторонам Почемучки.

В удивленных глазах остывал вопрос: «Что? Зачем? Почему?».

27 августа 2004 г.

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

86

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

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

Escom сразу объявила, что Amiga не умерла, и наладила новое произ-водство Amiga 1200 и Amiga 4000T. С последними произошла заминка, в продажу они поступили только в фев-рале следующего года, что подмочило репутацию компании. Для новых ма-шин даже слегка переписали сущес-твующую AmigaOS 3.0, дав ей номер версии 3.1. У поступивших в продажу А1200 оказался не «родной» дисковод. Escom устанавливала слегка модифи-цированные дисководы от IBM PC, из-за чего перестали работать програм-мы, использующие нестандартные за-

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

В 1996 году президентом Amiga Tech. стал староый поклонник Amiga Петро Тищенко. Он объявил о начале разра-боток новых моделей – Amiga Walker и Power Amiga. Walker, названный в честь самой первой игры для Amiga Mind Walker, имел весьма оригиналь-ный дизайн, похожий на пылесос или на шлем Дарта Вейдера. Внутри он имел процессор MC68030, 2 Мб Chip-памяти, чипсет AGA и мог расширять-ся через слоты Zorro-3 или, ставшей

История компьютеров «Амига»Часть вторая: 1995-2006

После смерти Джея Майнера и банкротства компании будущее Amiga оказалось под вопросом.

Сергей Зуев

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

87№3, март 2006

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

тогда популярной, шину PCI. Сторон-ние производители объявили о нача-ле разработок Amiga-клонов. Напри-мер, известная в кругах Mac- и Amiga-пользователей компания Phase 5, про-изводящая процессорные карты, виде-окарты и прочую периферию, объявила о своем новом компьютере A/Box. Он должен был произвести новую муль-тимедийную революцию, как и сама Amiga 10 лет назад. Внутри планиро-валось устанавливать до четырех про-цессоров PowerPC 604 с тактовой час-тотой в 200 МГц (максимум – 500 МГц) и до 1 Гб памяти с транфером в 1,6 Гб/с (не сравнимо выше, чем у популярной тогда EDO RAM – 57,3 Мб/с). Но самым главным в этом компьютере должен был стать чипсет. Phase 5 объявила, что весь чипсет будет заключен в одну 128-разрядную и работающую на час-тоте в 200 МГц микросхему под назва-нием «Caipirinha». Планировалось уб-рать разделение памяти на две облас-ти, сделав единое адресное пространс-тво, поддерживались разрешения до 1600 x 1200 точек на 24 бита с транфе-ром между модулями в 3200 Мб/с. Ко всему прочему обещалась аппарат-ная MPEG-поддержка, Genlock-совмес-тимый выход, два раздельных видеов-хода, аппаратные окна, продвинутый Blitter и DSP-RISC процессор для 3D-графики и видеокомпрессии.

В июле Escom внезапно объявила о продаже своего имущества компа-нии VISCorp, в связи с финансовыми проблемами. Последняя сразу оста-новила проект Walker и начала выпуск комплектов Amiga Magic, которые пред-ставляли собой обычную A1200 с мо-демом и 100 часами в IBM.net. Однако финансовое положение VISCorp изна-чально было шатким, поэтому в дека-бре бренд Amiga был продан очеред-ной фирме Quickpak. Последняя на-ладила выпуск A4000T с процессора-ми MC68060 и объявила о своих пла-нах о переносе AmigaOS на процессо-ры DEC Alpha. Однако и этой фирме не повезло с Amiga, и бренд отошел в руки корпорации Gateway 2000, которая бы-ла дружественной с фирмой Microsoft. Подразделение, занимающееся Amiga, переименовали в Amiga International.

Amiga InternationalPhase 5 провела демонстрацию но-вых процессорных карт для сущес-

твующего парка A1200 и A4000 – это были двухпроцессорные карты с MC68040(60) и PowerPC 603e/604e. Помимо этого фирма объявила о том, что работы над A/Box не прекраща-ются и, если бренд Amiga будет за-брошен, то их новые системы с успе-хом займут нишу Amiga как компью-теры с такой же идеологией. В этом году были представлены видеокарты на базе чипсета Cirrus Logic от той же Phase 5 – CyberVision 64 и от Village Tronic – Picasso IV.

К 1996-97 годам компьютеры Amgia окончательно утратили свои ранее прочные позиции на рынке компьютер-ных развлечений, но несмотря на это, в этот период произошел бурный рост новых игр. Появились два неофици-альных релиза Quake и Myst, кото-рые работали практически как слайд-шоу (3-4 fps), но к концу года фирма ClickBoom официально выпустила оп-тимизированные версии этих игр.

Подразделение Gateway 2000, за-нимающееся Amiga, под руководством того же Тищенко в 1997 году объявило о разработке новой операционной сис-темы AmigaOS 3.5. Amiga International объявила, что больше не будет выпус-кать аппаратное обеспечение, оста-вив эту прерогативу сторонним фир-мам наподобие Phase 5 или PIOS. На рынке сразу появилось несколько Amiga-совместимых машин от Draco, Access, Eagle и прочих производите-лей. В сентябре 1997 года Gateway объявил о создании нового подразде-ления Amiga Inc., которое должно бы-ло заниматься будущим Amiga. К концу года Phase 5 наконец выпустила свои новые процессорные карты, а некото-рые сторонние фирмы ( DCE, Micronik) объявили о создании Amiga-совмести-мых компьютеров нового поколения. Маленькая фирма BlitterSoft анонсиро-вала новый клон BoXeR, который дол-жен был иметь улучшенный AGA-чип-сет, выполненный в FPGA и 680x0-про-цессор.

Начало 1998 года было украшено новыми анонсами: Phase 5 выпустила графические адаптеры на базе чипсе-та Permedia 2 для своих новых процес-сорных карт, также был объявлен аль-янс между Phase 5, Blitter Soft и Index Information Ltd. о разработке PowerPC-расширения для BoXeR. 10 мар-та Phase 5 лицензировала AmigaOS

и пообещала, что будет использовать ее на своих новых системах Pre/Box. Поскольку освоить разработку и про-изводство такого сложного комплекс-ного продукта, как A/Box, было доста-точно сложно, то решено было для на-чала выпустить упрощенные системы Pre/Box. По планам они должны были содержать один процессор 680x0 и че-тыре PowerPC. Index объявила о разра-ботке своего проекта Inside Out. Пла-нировалось сделать PCI-карту для IBM PC, которая содержала бы AGA-чипсет и процессор 680LC60 на 75 МГц.

На программном рынке тоже тво-рилось некоторое оживление: посколь-ку были открыты исходные коды Doom и Descent, то моментально появились их неофициальные версии для Amiga. Еще один знаменательный релиз – 3D-shooter Genetic Species. Netscape, проиграв в коммерческом соревнова-нии браузеров Microsoft, открыла ис-ходные коды своего браузера, чем вы-звала немалый ажиотаж в сообщес-тве пользователей Amiga. Фирмой DiscreetFX была объявлена неболь-шая награда тому, кто первым порти-рует NN для AmigaOS. Однако это был сложный комплексный продукт, и пер-вые значительные шаги в портирова-нии уже Mozilla и FireFox осуществля-ются только в наши дни. Награда же за портирование выросла уже до поч-ти 10 тысяч долларов.

То время было бумом дот-комов и машинно-независимых языков. В се-редине года было объявлено, что по-мимо рынка настольных систем, бренд Amiga будет распространяться на рын-ке встраиваемых и мобильных сис-тем. Для этого начали разработку Java-подобной виртуальной машины AmigaDE. Для настольных компьюте-ров предлагалось выпустить к 2000 году новую ОС версии 4.0. В качестве ее основы планировалось взять ядро от Linux или от BeOS, но в итоге оста-новились на варианте QNX. Это бы-ло очень быстрое и компактное ядро, которое умещалось в кеш процессо-ра. С процессором новых систем то-же творилась неразбериха. Снача-ла было объявлено об использовании семейства x86 от Intel, однако боль-шая часть сообщества опротестова-ла переход на «вражеские» процес-соры, и тогда сообщили, что основой будущих компьютеров могут равнове-

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

88

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

роятно стать решения от многих фирм (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, которые

впоследствии были отменены, но по-ложили начало новым разработкам в этой области.

В середине года руководство ком-пании подписало соглашение о сов-местной разработке 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,

Рисунок 1. AmigaOS4 beta

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

89№3, март 2006

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

однако коренным ее отличием было то, что MorphOS изначально писалась под процессоры PowerPC. Посколь-ку слухи о создании новой ОС ходи-ли уже с 1996 года, сообщество весь-ма негативно отнеслось к этой ново-сти – за последние годы слишком мно-го чего анонсировалось и тут же уходи-ло в небытие. Чтобы разбить эти сом-нения, для публичного теста была вы-пущена очень сырая beta, которая тем не менее работала и даже могла запус-кать некоторые программы.

Несмотря на отмену дальнейшей разработки BoXeR, на рынке аппарат-ного обеспечения для Amiga в этом го-ду царил бум новых товаров. Извест-ный наряду с Phase 5 в прошлом про-изводитель периферии Apollo выпус-тил платы со слотами расширения Zorro-4 для переставленных в tower А1200. Zorro-4 – это некий компромис-сный вариант между Zorro-2 и Zorro-3: шина имеет 24-битную адресацию, как в первом случае, и 32-битную шину данных, как во втором. Польская фир-ма Elbox начала продавать комплекты Mediator. Эти платы также предназна-чались для А1200 и предоставляли воз-можность использовать широко рас-пространенную PCI-периферию вмес-то дорогих аналогов Zorro (для срав-нения – сетевая карта под Zorro стоит 85 $, когда для PCI можно найти ана-логичную по параметрам за 5-10 $). Сразу после выхода Mediator, англий-ская компания Eyetech анонсировала

их новую разработку – шинный мост + процессорная карта Predator. По обе-щаниям должна была получиться пла-та с PCI- и AGP-слотами и процессо-ром PowerPC G3, которую также пла-нировалось использовать в tower-вер-сиях A1200.

Известный производитель про-цессорных карт для PowerMacintosh MetaBox анонсировала новую кар-ту для A1200 на базе процессора PowerPC G3, к сожалению, из-за внут-ренних проблем эта фирма скоро обан-кротилась, оставив после себя толь-ко прототип.

Amiga Inc. выпустила на рынок новую ОС AmigaDE и SDK под нее. Для будущих систем, на которых пла-нировалась работа этой ОС, опубли-ковали спецификацию Zico с систем-ными требованиями. Как было сказа-но ранее, AmigaDE – это аналог Java, платформонезависимая ОС, которую планировалось использовать в самом широком спектре устройств – от на-стольных компьютеров до встраива-емой и мобильной техники. Для клас-сических компьютеров совсем неожи-данно начала продаваться AmigaOS 3.9. Если OS 3.5 была лишь набором патчей для старых ОС, то OS 3.9 пос-тавлялась с поддержкой PowerPC и на-бором очень полезных утилит.

СовременностьВ 2001 году Amiga Inc. анонсирова-ла разработку AmigaOS 4. Это было

именно то, чего долгие годы ожидало сообщество. За основу новой ОС взя-ли исходный код 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 приостано-вила производство своих компьюте-Рисунок 2. MorphOS

Рисунок 3. MicroA1

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

90

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

ров, и пока неизвестно, когда она про-должится.

Как 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 смог взять у Адама интервью, в котором

сообщается, что работа над процес-сорной картой кипит и за год слегка поменялись характеристики. Вместо Freescale 8245 планируется устанав-ливать новый Freescale 5200 с тепло-выделением в 1 Вт и с тактовыми час-тотами в 400-466 МГц, слоты под па-мять заменены на распаянные прямо на плате 512 Мб Fast-памяти, а чип от ATI заменился на ноутбучный разъ-ем MiniPCI для видеокарт. Сроки вы-хода обозначены на момент выхода OS 4. Одно радует – разработчики AmigaOS 4 сообщают, что процесс ко-нечной отладки кода входит в завер-шающую стадию.

Однако не только OS 4 оста-лась на рынке операционных систем для Amiga. Помимо классических для всех платформ Linux и BSD, свое раз-витие получила MorphOS (см. рис. 2). После развала Phase 5 образовалась новая фирма – bPlan, которая про-должила свою работу на поприще ап-паратного обеспечения для Amiga. В 2000 году bPlan опубликовала спе-цификации их нового компьютера Pegasos, а к февралю следующего года уже выпустила рабочие прото-типы своих машин. В качестве цент-рального процессора использовался PowerPC G3 400 МГц, а в качестве ОС – SuSE Linux 7.0 и MorphOS. MorphOS, как и AmigaOS 4, представляет собой новую операционную систему, которая является клоном OS 3, переписанным полностью под PowerPC.

За прошедшее время Pegasos и MorphOS достаточно сильно разви-лись. Процессор обновили до Dual-G4 на 1 ГГц, вышло уже две версии Pegasos (см. рис. 4). Под MorphOS раз-рабатывается и переносится с других платформ разнообразное програм-мное обеспечение. В будущем обе-щаются новые компьютеры на ба-зе PowerPC Cell, а также суб-ноутбук на базе Freescale 5200.

Но и к лассическое «железо» не забрасывается. В последние годы Freescale выпустила новых представи-телей семейства процессоров 680x0 – Motorola Coldfire. Этот процессор так-же имеет много интегрированных кон-троллеров, и вот, 17 декабря 2004 го-да Elbox анонсировала новую процес-сорную карту Dragon. Конструктив-но – это тот же Mediator с AGP, только в один из его слотов вставляется PCI-

плата с новым процессором с часто-той 266 МГц.

За последние годы для классичес-ких Amiga было разработано и выпу-щено много различной периферии. Не-мецкая фирма Individual Computers вы-пускает звуковые карты, контроллеры высокоскоростных (>115200 бод) пос-ледовательных портов и многое другое для A1200, E3B выпустила контролле-ры USB, появилась в продаже Zorro-се-тевая карта Ariadne 2 с возможностью подключения различных модулей.

Среди сообщества за это вре-мя назрела проблема новых ком-пьютеров. Классические компьюте-ры Amiga, как и любая вещь, имеют свой ресурс, и, несмотря на то, что Escom в свое время произвела столько А1200, что до сих пор можно без про-блем за рубежом купить новый (ни-когда не распечатавшийся) компью-тер, когда-нибудь и они закончатся. Само сообщество раскололось на не-сколько частей: приверженцы но-вых PowerPC-платформ, привержен-цы классики и те, кто использует эму-лятор WinUAE. Последний, несмотря на не очень хорошую эмуляцию чип-сета (проблемы с мерцанием частей изображения, проблема с VBlank, ко-торую невозможно устранить в при-нципе и пр.), хорошо эмулирует основ-ной процессор 680x0 на скоростях в 5-10 раз больших, чем у флагмана этой серии 68060. WinUAE также может ис-пользовать как видеокарту графичес-кий контроллер вашего PC, что зна-чительно упрощает использование AmigaOS. Давно зрела идея (BoXeR, IWin) о переносе чипсета от Amiga в современные ПЛМ. И вот совсем не-давно, в декабре 2005 года, было объ-явлено о том, что работа в этом на-правлении ведется норвежским эн-тузиастом Деннисом ван Веереном. По его сообщениям, в FPGA перенесе-но уже около 60% чипсета OCS, а что-бы сообщество, привыкшее к обманам за последнее время, не посчитало его лжецом, в Интернет были выложены фотографии, демонстрирующие рабо-ту и (наверное, самое главное) ошибки в работе эмулируемого чипсета.

Надо признать, что несмотря на все трудности, выпавшие на ее долю, Amiga живет и до сих пор пользуется популярностью у немалой части поль-зователей ПК.

Рисунок 4. Pegasos 2

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

91№3, март 2006

bugtraq

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

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

Отказ в обслуживании в 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.Решение: Установите исправленную версию с сайта про-изводителя.

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

Обход ограничений безопасности в 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) с сайта производителя.

Отказ в обслуживании в Cisco PIXПрограмма: 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), для определенного хоста. Пример:

2. Уязвимость существует при обработке значения TTL-пакета. Удаленный пользователь может послать ус-тройству специально сформированный пакет, содержа-щий значение TTL n-1. Для удачной эксплуатации уязви-мости между PIX и целевым сервером должен находить-ся маршрутизатор, который бы возвращал ICMP-сообще-ние «Время истекло при передаче» (например: «Атакую-щий → Интернет → PIX → Маршрутизатор → Сервер»). Примеры:

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

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

hping2 -a $SOURCE_IP -S -c 1 -s 31337 -p 80 -t 8 $TARGET_IPhping2 -a $SOURCE_IP -S -s 0 -p 80 --faster -t 8 $TARGET_IP

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

92

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

Несмотря на свой небольшой объем, книга охватывает достаточно много ма-териала. Как ясно из названия, основ-ной акцент делается именно на рас-смотрение новых возможностей про-дукта. Повествование начинается с опи-сания общих положений, а также реко-мендаций по установке и обновлению SQL Server 2005. Из главы, посвящен-ной администрированию, вы узнаете о

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

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

Microsoft SQL Server 2005. Новые возможностиАлександр Волоха

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

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Питер».

«Питер»

2005

304

5-469-01197-6

≈ 375 руб.

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

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

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Кудиц-

Образ».

«Кудиц-Образ»

2006

800

5-9579-0103-2

≈ 697 руб.

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

93№3 март 2006

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

Среди прочих справочников по 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 . Весь материал разделен на пять логических частей. Первая глава посвящена истории и ре-

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

Microsoft Exchange 2003 ServerАлексей ВишневскийExchange Server 2003 и Lotus Domino). Служба каталогов Active Directory (архи-тектура AD, доменная модель службы каталогов, пространство имен AD, фи-зическая структура, репликация изме-нений каталогов, а также импорт и эк-спорт объектов каталога). Установка Exchange2003 (подготовка к установ-ке, приготовление корпоративной се-ти к развертыванию, работа с масте-ром, удаление). Выполнение обновле-ний предыдущих версий (использова-ние Active Directory Connector, обновле-ние Exchange Server 5.5/2000, особен-ности совместной работы 2003 с преды-дущими версиями). Реализация адми-нистративной иерархии (инструменты, выбор административной модели, ис-пользование механизма администра-тивных групп). Управление хранили-щами (архитектура информационного хранилища в Exchange 2003, планиро-вание структуры, управление группа-ми строения, работа с базами данных хранилищ и индексация содержимого).

Управление получателями (группы ад-ресатов, списки рассылки). Управле-ние общими папками (формирование иерархии и администрирование). При-менение политик Exchange для конфи-гурирования почтовой системы. На-стройка протоколов SMTP, HTTP, NNTP, POP3, IMAP4. Маршрутизация сообще-ний (формирование маршрутной топо-логии, группы маршрутизации). Воп-росы масштабирования Exchange. Мо-ниторинг производительности, поиск и разрешение проблем, а также вос-становление работоспособности почто-вого сервера. Как вы сами можете убе-диться, книга охватывает практически все ключевые моменты администриро-вания Exchange 2003.

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

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

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

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Питер».

«Питер»

2005

672

5-469-00386-8

≈ 548 руб.

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Кудиц-

Образ».

«Кудиц-Образ»

2006

832

5-9579-0114-8

≈ 476 руб.

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

94

подписка на 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

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

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

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

95№3, март 2006

подписка на 2006 год

Стоимость подписки через редакцию:

900* руб.за 6 номеров

1800* руб.за 12 номеров

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

Для юридических лиц: Отправьте заявку по факсу (095) 928-82-53 или по e-mail:

[email protected]. Укажите наименование и банковские реквизиты своей

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

Для физических лиц: Заполните нижеприведенную квитанцию, оплатите в лю-

бом банке и пришлите в редакцию копию с отметками банка.

После поступления платежа редакция начнет отправ-лять вам номера.

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

№5(30) май 2005

подписной индекс 81655

www.samag.ruПочему MS SQL медленно работает?

Ищем причины

Строим защищенную беспроводную сеть:

WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить

удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0

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

Эффективно управляем

полями пользователей в AD

Контролируем безопасность сети

с помощью OSSIM

Интервью с Ларри Уоллом –

создателем языка Perl

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

96

СИСТЕМНЫЙ АДМИНИСТРАТОР№3(40), Март, 2006 год

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинРедакторАлексей КоршуновВнештатные редакторыАлексей БарабановКирилл ТихоновСергей СупруновТатьяна Ильченко

РЕКЛАМНАЯ СЛУЖБАтел./факс: (095) 928-8253Дарья Хохловаreс[email protected]

Верстка и оформление[email protected]Дизайн обложкиНиколай Петрочук

По вопросам распространенияобращайтесь по телефону:(095) 928-8253 (доб. 120)

107045, г. Москва,Ананьевский переулок, дом 4/2, стр. 1тел./факс: (095) 928-8253Сайт журнала: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр Положевец

УЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейГП «Московская Типография №13»Тираж 10000 экз.

Журнал зарегистрированв Министерстве РФ по делам печати, телерадиовещания и средств массо-вых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002 г.).

За содержание статьи ответственность несет автор. За содержание рекламно-го объявления ответственность несет рекламодатель. Все права на опубли-кованные материалы защищены.

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

Уважаемые читатели!

Спешите оформить подпискуна первое полугодие 2006 года!

Приобрести новые и старые номера журналавы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.

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

Перспективы профессии. АвтопортретКто такие системные администрато-ры, почему они этим занимаются, что ждет их впереди? Попробуем разо-браться в настоящем положении дел и сделать предположения на ближай-шее будущее.

Архитектура и реализация файловой системы reiser4Не уступая многочисленным аналогам в функциональности (здесь и практи-чески неограниченные размер раздела и количество файлов, и динамическое размещение объектов, и эффективная работа с маленькими файлами, и быс-трое восстановление после сбоев), про-изводительности и масштабируемос-ти, reiser4 предоставляет пользовате-лям ряд дополнительных возможностей. Прозрачное сжатие и шифрование фай-лов, полное журналирование данных, а также практически неограниченную (за счет плагинной архитектуры) рас-ширяемость, другими словами, способ-ность приспосабливаться к сколь угодно сложным запросам потребителей.

Создаем порт для FreeBSD своими руками.Часть 2: расширенные возможностиВ первой части статьи мы рассмотре-ли основные вопросы создания порта для FreeBSD своими руками. Но сис-

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

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