98
№6(67) июнь 2008 №6(67) июнь 2008 подписной индекс 20780 www.samag.ru Что представляет собой система мониторинга GroundWork Monitor btrfs от Oracle: наш ответ ZFS Какие документы нужны, чтобы подтвердить право на использование свободного ПО? Endian Firewall 2.2: продвинутый Linux-шлюз Как построить информационный портал с помощью JBoss Portal OpenSolaris 2008.05: что нового? Настраиваем Apache+PHP+MySQL на базе OpenBSD 4.3 Оцениваем технологию Adobe AIR Дефекты проектирования Intel Core 2 Duo Роспечать – 20780, 81655 Пресса России – 88099, 87836 Интер-почта – тел. (495) 500-00-60 ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Так видит журнал читатель, который забыл оформить подписку: Так видит журнал читатель, оформивший подписку: НОВОГОДНИЕ КАНИКУЛЫ ЗАТЯНУЛИСЬ БЫСТРО РАСКУПИЛИ ТИРАЖ НЕОЖИДАННО ЗАКОНЧИЛИСЬ ДЕНЬГИ УЕХАЛ В ОТПУСК ПОСЛЕ ОТПУСКА АВРАЛ НА РАБОТЕ

067 Системный Администратор 06 2008

Embed Size (px)

DESCRIPTION

Какие документы нужны, чтобы подтвердить право на использование свободного ПО? btrfs от Oracle: наш ответ ZFS Оцениваем технологию Adobe AIR Так видит журнал читатель, оформивший подписку: Так видит журнал читатель, который забыл оформить подписку: НЕОЖ ИДАННО ЗАКОНЧИЛИСЬ КАНИКУЛЫ Реклама Рек лама

Citation preview

Page 1: 067 Системный Администратор 06 2008

№6(

67)

июнь

200

8

№6(67) июнь 2008подписной индекс 20780www.samag.ru

Что представляет собойсистема мониторингаGroundWork Monitor

btrfs от Oracle: наш ответ ZFS

Какие документы нужны,чтобы подтвердить правона использование свободного ПО?

Endian Firewall 2.2:продвинутый Linux-шлюз

Как построить информационный порталс помощью JBoss Portal

OpenSolaris 2008.05: что нового?

Настраиваем Apache+PHP+MySQLна базе OpenBSD 4.3

Оцениваем технологию Adobe AIR

Дефекты проектирования Intel Core 2 Duo

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

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

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

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

НОВОГОДНИЕ

КАНИКУЛЫ ЗА

ТЯНУЛ

ИСЬ

БЫСТРО РА

СКУПИЛИ

ТИРА

Ж

НЕОЖ

ИДАННО

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

ЕНЬГИ

УЕХАЛ В О

ТПУСК

ПОСЛЕ ОТП

УСКА

АВРАЛ Н

А РАБОТЕ

Page 2: 067 Системный Администратор 06 2008

Реклама

Рек

лама

Page 3: 067 Системный Администратор 06 2008

�№6, июнь 2008

в номере

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

BUGTRAQ44, 49, 59, 7�

ТЕНДЕНЦИИ3

РЕПОРТАЖ

Мир! Труд! May Perl!4 17-18 мая в Москве прошла конференция YAPC:Russia 2008 «May Perl».

Кирилл Сухов

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

Управляем объектами в Active DirectoryЧасть 2

8

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

Иван Коробко

Что представляет собой система мониторинга GroundWork Monitor

�4

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

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

Endian Firewall 2.2: из Италии с любовью�8Организация шлюза в Интернет – типовая задача, кото-рую с разным успехом решает множество специализи-рованных продуктов. Нужен ли нам еще один?

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

Обзор OpenSolaris 2008.0522OpenSolaris 2008.05 демонстрирует текущий резуль-тат разработки новой системы управления пакетами и средами загрузки.

Андрей Соколов

OpenBSD 4.3: что новенького?28Последние новшества и изменения, вошедшие в фи-нальный релиз открытой операционной системы OpenBSD 4.3.

Влад Глаголев

Настраиваем связку Apache + PHP + MySQL на базе ОС OpenBSD 4.3

32

Предположим, у вас возникла необходимость в раз-вертывании веб-сервера с поддержкой PHP и MySQL. Данную задачу просто решить, имея под рукой свежий дистрибутив OpenBSD 4.3. Остается только прикрутить к нему PHP и MySQL.

Максим Гришков

btrfs от Oracle: наш ответ ZFS36Цели и задачи, которые ставят перед собой разработ-чики новой файловой системы btrfs от компании Oracle, впечатляют даже после знакомства с особенностями ZFS, которую, казалось бы, никто не сможет превзой-ти еще много лет.

Андрей Пешеходов

ЗАКОН ЕСТЬ ЗАКОН

Какие документы нужны, чтобы подтвердить право на использование свободного ПО?

45

В новой рубрике юрист Юлия Штокало отвечает на воп-росы читателей.

АДМИНИСТРИРОВАНИЕ «�С»

Технологический журнал «�С:Предприятие 8.�»

46

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

Андрей Луконькин

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

Дефекты проектирования Intel Core 2 Duo – аналитический обзор с точки зрения безопасности

50

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

Крис Касперски

Корпоративный информационный портал, который построил Джек

60

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

Антон Борисов

WEB

Оцениваем технологию Adobe AIR72 С бурным развитием технологий все больше и больше стирается грань между Интернетом и системами поль-зователей. Появляется много сервисов, заменяющих стандартные настольные программы. Идет бурное ос-воение десктопа интернет-приложениями, и свидетель-ством тому – новая технология от Adobe.

Александр Майоров

PHP-GTK – вторая попытка80 После нескольких лет разработки и тестирования обще-ственности был представлен новый релиз – пакет PHP-GTK2. Он представляет собой интерфейс PHP для ра-боты с библиотекой GTK2 и предназначен для постро-ения на этом языке полноценных настольных оконных приложений.

Кирилл Сухов

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

Долгая счастливая жизнь – история компании IBM

88

Мы называем наш век компьютерным, общество – ин-формационным, и тесно связываем будущее челове-чества с технологиями. Мечтательные мысли писате-лей-фантастов становятся будничным явлением. Это статья о компании, которая сделала все, чтобы буду-щее наступило быстрее. Наверно, она и была главным конструктором этого будущего. International Business Machines – IBM.

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

Page 4: 067 Системный Администратор 06 2008

Рек

лама

Page 5: 067 Системный Администратор 06 2008

�№6, июнь 2008

тенденции

Open Source-проекты продолжают отказываться от CVSПо изменению в репозитарии исходников свободной опе-рационной системы FreeBSD от 1 июня стало известно, что разработчики уже начали использовать систему управле-ния версиями Subversion вместо CVS. Важно заметить, что CVS-хранилище исходного кода FreeBSD является одним из старейших и крупнейших: его история насчитывает около 12 лет и около 180 тысяч изменений. Ветвь последнего ре-лиза, RELENG_7, содержит более 42 тысяч файлов (482 Мб). Тема перехода с CVS на Subversion активно обсуждалась на мероприятии DevSummit, проходившем в рамках конферен-ции BSDCan 2008. И некоторые существенные недостатки CVS (например, невозможность переименовывать/переме-щать файлы, плохая работа с ветвями при непрекращаю-щемся процессе разработки и добавлениях в дерево, неа-томарные коммиты) окончательно убедили разработчиков в том, что от этой системы пора отказываться.

Вскоре стало известно о том, что постепенный отказ от CVS наблюдается и в проекте Mozilla. Правда, разработ-чики Firefox предпочли не Subversion, а еще более совре-менное средство. Они уже начали вносить свои изменения в исходный код в mozilla-central – новое дерево Mozilla, уп-равляемое Mercurial. При этом новый репозитарий mozilla-central предназначен только для кода Firefox, XULRunner, Gecko. Остальные проекты Mozilla (Thunderbird, SeaMonkey и др.) вольны самостоятельно решать, какую систему конт-роля версий они будут использовать.

Intel и Acer придают новый импульс GNU/Linux на ноутбукахВ начале июня тайваньский компьютерный производитель Acer представил первый в мире компьютер на базе процес-сора Intel Centrino Atom – так называемый «нетбук» (netbook), который получил название Aspire One. На него предвари-тельно устанавливается операционная система GNU/Linux.

Термин netbooks был введен компанией Intel и нацелен на продвижение ее процессора Intel Atom, предназначенного для использования в ультрапортативных компьютерах. Та-кие устройства в первую очередь ориентированы на рабо-ту в сети Интернет. Aspire One основан на процессоре Intel Centrino Atom N270 с тактовой частотой 1,6 ГГц и включает в себя 512 Мб или 1 Гб оперативной памяти (RAM), 8 Гб Flash-карту для хранения данных, 8,9-дюймовый дисплей, подде-рживающий разрешение 1024x600. В качестве предвари-тельно устанавливаемой на Aspire One операционной сис-темы используется Linpus Linux – дистрибутив от тайвань-ской компании Linpus Technologies, основанный на Fedora и ориентированный на азиатский рынок.

Одновременно с этим в Acer объявили о намерении ус-танавливать Linux и на свои лаптопы.

В Acer видят два основных преимущества Linux: фун-кционирование и цена. Предустановленный Linux-дист-рибутив будет запускаться значительно быстрее Windows, время работы устройства от батареи увеличится с 5 часов до 7. А разница в цене, достигаемая путем предваритель-ной установки на компьютеры Linux вместо Windows, поз-волит Acer сделать более выгодные предложения на рын-ке недорогих устройств.

Финансовую выгоду Linux пояснил Дэвид Драммонд (David Drummond), управляющий директор в британском от-делении Acer: «Операционная система от Microsoft обычно стоит порядка 50 фунтов стерлингов за штуку. Для ПК сто-имостью в 1000 фунтов это несущественно, но для компью-тера ценой в 200 фунтов это очень важный фактор».

Кроме того, компания Canonical, занимающаяся под-держкой и продвижением популярного Linux-дистрибути-ва Ubuntu, анонсировала новую редакцию своей системы, предназначенную специально для «нетбуков», – Ubuntu Netbook Remix. Она призвана упростить жизнь пользова-телю, предоставив ему все удобства десктопной версии Ubuntu с небольшими доработками. В качестве последних отмечается появление специальной панели, обеспечиваю-щей быстрый запуск приложений для работы в сети. Они покрывают стандартный функционал, к которому относится работа с электронной почтой и IM-сообщениями, веб-брау-зер, онлайн-доступ к фотографиям, видео и музыке.

В своем пресс-релизе Canonical описывает Ubuntu Netbook Remix как отличный выбор для производителей уст-ройств типа netbooks, поскольку этот дистрибутив – готовое и проверенное решение, позволяющее им быстро выйти на конкурентный рынок. Сообщается также, что Canonical уже работает с рядом производителей оборудования (Original Equipment Manufacturers, OEM) по вопросам предваритель-ной установки Ubuntu на устройства, которые появятся поз-же в этом году.

Подготовил Дмитрий Шуруповпо материалам www.nixp.ru

Page 6: 067 Системный Администратор 06 2008

репортаж

Конференция такого форма-та состоялась в России впер-вые. В ноябре 2007-го в Моск-

ве уже проходила встреча разработ-чиков в «младшем» формате – Perl Workshop, спустя полгода организато-ры (Moscow.pm-московская группа Perl-программистов, perl6.ru, deeptext.net) сумели довести уровень меропри-ятия до настоящей Yet Another Perl Conference, серии форумов, объеди-няющих Perl-разработчиков по всему миру. От Perl Workshop, YAPC отлича-ется как количеством докладов и учас-тников, так и международным характе-ром мероприятия.

День первый – Lambda, POE и MVCПриведённые в введении новости со-держались во вступительном слове Ан-дрея Шитова (Moscow.pm). После него

начались доклады. Слово взял Дмит-рий Карасик (Copenhagen.pm), расска-завший о модуле IO::Lambda, предна-значенном для асинхронного програм-мирования асинхронного ввода-выво-да. Модуль отличается использовани-ем техник функционального програм-мирования (отсюда название), а Дмит-рий – живостью изложения и интерес-ной подачей материала.

Затем конференция разделилась на два потока. В одной аудитории Дмитрий Осиенко (Eludia.pm) делился с коллегами опытом разработки кор-поративных информационных систем на MVC-платформе Eludia. Хоть это и был рассказ представителя компа-нии о собственной разработке, доклад перерос в обсуждение методов пост-роения внутрикорпоративных инфор-мационных систем.

Алексей Карпанов (Rambler) сооб-

щил о методах и инструментах профи-лирования Perl-кода (цитата: «Сколько ни есть профилировщиков для Perl – все кривые, но...»). Познавательный доклад был подкреплён блиц-выступ-лением о применении профайлинга при построении Рамблер-почты, со-стоявшимся на следующий день («Ком-пиляция шаблонов в машинный код», ни больше, ни меньше).

Доклад Анатолия Шарифулина (RostovOnDon.pm) «My POE» стал, на-верное, самым интересным в пер-вый день конференции. Впрочем, тем, кто уже давно в курсе технологии ра-боты событийной машины Perl, он мог показаться излишне обзорным, но та-ких было не очень много.

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

Мир! Труд! May Perl!

17-18 мая 2008 года в Москве в аудиториях Высшей школы экономики прошла конференция YAPC:Russia 2008 «May Perl».

Page 7: 067 Системный Администратор 06 2008

�№6, июнь 2008

репортаж

чуть не было испорчено своеобрази-ем доступа в Интернет, реализованно-го местными администраторами (цита-та: «Кто бы мог подумать, что Интер-нетом называется только HTTP и толь-ко через прокси, который выдаёт DNS и только Explorer?»).

Ивану Серёжкину (Yandex) приш-лось демонстрировать решение средс-твами POE на ходу скорректированной задачи, но делал он это настолько ин-тересно и, я бы сказал, с артистизмом, что кажется, не будь трудностей с се-тью, их стоило бы придумать.

В основной аудитории тем време-нем прошёл доклад Руслана Закиро-ва «Сайт на Jifty за пару часов», в кото-ром рассказывалось об основных при-нципах организации этого относитель-но нового MVC-каркаса.

После перерыва последовал до-клад Сергея Антонинко (UMI.CMS) «Ар-гументы в пользу XSLT». Он несколь-ко выбивался из общей тематики кон-ференции, так как непосредствен-но про Perl не было сказано почти ни-чего, но зато были очень ярко проде-монстрированы преимущества техно-логии XSLT в веб-разработке. Надо сказать, что сделано это было инте-ресно и убедительно, но мне показа-лось, что вопрос «причём здесь Perl», повисший с начала доклада, так и ви-сел до его окончания.

Очень интересным оказался до-клад Николая Лавлинского «Построе-ние совместимых Perl/mod_perl-систем с веб-интерфейсом». Было рассказа-но об особенностях конфигурации веб-сервера Apache для организации mod_perl-хостинга, а также использовании модуля SOAP::Lite для создания систе-мы управления сайтом.

Доклад Александра Котова «Perl и Web2.0» на самом деле был посвя-щен значению этого языка в совре-менном мире веб-разработки. Алек-сандр привёл анализ рынка труда, ана-лиз книжных новинок, показывающий востребованность различных в той или иной степени конкурентных техноло-гий. Выводы напрашивались средней утешительности – хоть Perl и уступает по востребованности некоторым язы-кам, зато его положение (а, следова-тельно, и ниша) стабильно. Впрочем, народ откровенно веселился. Дело в том, что при демонстрации графи-ков популярности различных средств

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

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

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

ром гонга Алекса Капранова. Все бы-ло очень здорово и слушалось на од-ном дыхании.

Запомнился доклад Карасика, про «секретные операторы» в Perl, провокационная речь «CGI.pm – зло?!» Анатолия Шарифулина, «Презентации в стиле Такахаси» Алекса Капранова и особенно блиц Ивана Сережкина, который не произнёс не слова, прос-то набирал в редакторе текст, сорвав аплодисменты.

Доклад Сережкина «ООП. Пэррот. Можно использовать» ввёл слушате-лей в дебри практики написания и ис-пользования модулей для будущего Perl 6 (цитата: «Он только родится, опа, а модули уже есть»). Основная мысль – работать с Parrot уже не только можно, но и нужно. И как можно больше!

Регистрация участников (Иван Сережкин «сканирует» очередного посетителя)

Слушатели мастер-класса про POE (организаторы ожидали гораздо меньше посетителей этого мастер-класса)

Page 8: 067 Системный Администратор 06 2008

репортаж

Ярослав-Александр Литот (Oxigen) в докладе «Perl + виртуализация» рас-сказал про построение системы хос-тинг-виртуализации и способах управ-ления виртуальными машинами.

В докладе «UTF Perl Practicе» Вла-димир Перепелица (Агава) говорилось о функциях utf8 и о состоянии под-держки Unicode в Perl. Его речь вызва-ла большое количество вопросов, за-вязалась небольшая дискуссия.

Далее последовал доклад Ильи Об-щадко (Travel.ru) об истории разработ-ки и архитектуре CMS Travel.ru, кото-рая, несомненно, представляет инте-рес для изучения. Отдельно были пред-ставлены убедительные обоснования выбора Perl как языка разработки круп-нейшего туристического портала.

В последнем докладе Егор Шипо-валов рассказал о различных реализа-циях ORM в Perl, провёл их сравнитель-ный анализ, продемонстрировал прак-тическое применения модуля DBIx::Class. На этом двухдневный марафон был окончен, и появилась возможность перевести дух и подвести итоги.

В самом начале конференции всем участникам раздали задания на Perl Golf – традиционного соревнования программистов. Были поставлены две задачи, которые требовалось решить с использованием минимума симво-лов. Первая – написать, используя только управляющие конструкции и ре-гулярные выражения, проверку дели-мости числа на 11. Вторая с чуть бо-лее сложным условием. При заданном блоке строк из пробелов и символов # требовалось найти максимальное чис-ло символов #, попадающих в любой из прямоугольников, площадью точно равных заданному на STDIN числу N и всеми своими клетками, лежащими внутри заданного блока.

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

В заключение хотелось бы побла-годарить организаторов и лично Анд-рея Шитова за хорошо проведённое мероприятие. По-моему, первая рос-сийская конференция YAPC вполне удалась.

Текст Кирилла Сухова, фотографии Андрея Шитова

Анатолий Шарифулин и Иван Сережкин ведут мастер-класс «POE в повседневной жизни»

Спонтанное выступление Руслана Закирова о том, как зарабатывать на публикации модулей

Выступление Александра Котова о рынке Perl-программистов было одним из докладов, привлекших большое внимание

Page 9: 067 Системный Администратор 06 2008

Реклам

а

Page 10: 067 Системный Администратор 06 2008

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

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

Управляем объектами в Active DirectoryЧасть 2

Иван Коробко

Page 11: 067 Системный Администратор 06 2008

�№6, июнь 2008

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

В предыдущей статье [6] мы рассмотрели типы объек-тов, существующие в Active Directory; было рассказа-но о методике создания объектов на примере учет-

ной записи пользователя, узнали, что происходит в Active Directory в процессе создания учетной записи. В этой статье уделим внимание типам данных объектов в Active Directory и методике их чтения.

Чтение/изменение свойств объекта осуществляется од-ним из следующих способов:n программным способом;n с помощью мастера MMC-консоли Active Directory.

В этой статье будет описан программный способ чте-ния параметров учетной записи. Второй способ будет рас-смотрен в следующий раз.

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

Определение типа данных объектаИнформация в Active Directory хранится в объектах. Для определения типа объекта в VBScript обычно используют функцию VarType(), которая имеет следующий синтаксис:

где:n VarName – переменная, тип которой необходимо опре-

делить;n Value – возвращаемое функцией значение.

Функция VarType() возвращает числовое значение, по которому из таблицы 1 можно определить тип данных объекта. Шаблон сценария, в котором реализовано опре-деление типов данных переменной с помощью функции VarType(), приведен в листинге 1.

Особое внимание стоит уделить чтению данных из мас-сивов. Во время определения типа данных массива функ-ция VarType() возвращает сумму, состоящую из двух слага-емых. С помощью первого слагаемого, равного 8192, иден-тифицируется массив данных. С помощью второго – эле-менты массива. Например, если массив состоит из чисел (Integer), то функция VarType() возвратит значение 8194 = 8192 + 2. Поскольку элементами массива не могут быть пустые значения (vbEmpty), то функция VarType(Array) ни-когда не возвратит значение 8192.

Методика чтения данных из Active DirectoryРассмотрим методику чтения параметров следующих ти-пов данных:n Long (VarType = 3) – длинное число; n Date (VarType = 7) – дата-время; n String (VarType = 8) – строка; n Object (VarType = 9) – объект; n Array (VarType = 8192+х) – массив элементов.

Тип данных Long (VarType = 3)Длинному числу в интерпретации VBScript соответствует тип данных Long. В таблице 2 приведены характерные для учетной записи пользователя параметры, соответствующие

Value=VarType(VarName)

Константа Значение Описание

vbEmpty 0 Empty (пустое значение)

vbNull 1 Null (не содержит данных)

vbInteger 2 Integer

vbLong 3 Long

vbSingle 4 Single (число с плавающей точкой)

vbDouble 5 Double (число с плавающей точкой)

vbCurrency 6 Currency

vbDate 7 Date

vbString 8 String

vbObject 9 Object

vbError 10 Error

vbBoolean 11 Boolean

vbVariant 12 Variant (используется только с массивами)

vbDataObject 13 Object

vbByte 17 Byte

vbArray 8192 Array

Таблица 1. Значения, возвращаемые функцией VarType()

Листинг 1. Шаблон использования функции VarType()

'Создание ADODB–соединенияSet objConn = CreateObject("ADODB.Connection")Set objCom = CreateObject("ADODB.Command")objConn.CommandTimeout = 120objConn.Provider = "ADsDSOObject"objConn.Open "Active Directory Provider"Set objCom.ActiveConnection=objConn

Переменная Комментарий Пример

codePage Код страны. Используется для переключения языка интерфейса. Появился в Windows 2003. В настоящее время не используется

0

countryCode 0

instanceType Значением параметра описывается статус объекта на сервере. Возможные значения – 1, 2, 4, 8, 16, 32. По умолчанию принимает значение 4

4

primaryGroupID Идентификатор группы безопасности, назначенной по умолчанию (см. вкладку MemberOf свойств пользователя). RID группы Domain Users, назначаемой по умолчанию, равен 513

513

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

805306368

Таблица 2. Параметры объектов типа Long для учетной записи пользователя

'Определение имени доменаSet oRoot = GetObject("LDAP://rootDSE")LdapDomain = "LDAP://" & oRoot.Get("DefaultNamingContext")

'составление и обработка SQL–запросаQuery = "SELECT ПЕРЕМЕННАЯ FROM '" & LdapDomain & "' ↵ WHERE objectclass='group' and name='Test'"Set st = objConn.Execute(Query)

'Вывод результата типа данных переменнойwscript.echo VarType(st.Fields("ПЕРЕМЕННАЯ").Value)

Page 12: 067 Системный Администратор 06 2008

10

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

этому типу данных. При чтении данных значение типа Long автоматически преобразуется к строке (String).

Чтение данных осуществляется с помощью ADODB-со-единения или функции GetObject(). В том случае, когда из-вестен путь к объекту, стоит отдать предпочтение функ-ции GetObject(), поскольку этот способ значительно про-ще (см. листинг 2а).

Когда точное местоположение объекта неизвестно, то необходимо выполнить поиск объекта в Active Directory по заданным критериям, однако в запросе можно задать путь к объекту явным образом (см. листинг 2б) – как в функции GetObject(). Для реализации функции поиска используют ADODB-соединение провайдера ADsDSOObject.

Тип данных Date (VarType = 7)В Active Directory присутствует ряд обязательных для всех объектов параметров, к их числу относятся параметры ти-

па Date, характеризующие дату и время создания и изме-нения объектов (см. таблицу 3). Данные в формате дата-время в процессе чтения автоматически преобразуются в строку. Несмотря на это, для получения понятного всем значения необходимо преобразовать это значение в соот-ветствии с алгоритмом (см. листинг 3а и 3б).

В Active Directory эти параметры хранятся в формате Generalized-Time. Значения параметров этого типа имеют следующую структуру (см. рис. 1, таблицу 3):

где: YYYY – год, MM – месяц, DD – день, HH – час, ММ – ми-нута, SS – секунда, MS – доля секунды, Z (от Zero) – обоз-начает нулевой меридиан.

Чтение параметров в формате Generalized-Time рекомен-дуется осуществлять с помощью ADODB-соединения (лис-тинг 3а), поскольку значения параметров createTimeStamp и modifyTimeStamp невозможно получить с помощью функ-ции GetObject(). Это связано с тем, что функция перво-начально использовалась для чтения данных через про-вайдер WinNT (листинг 3б). К ним относятся параметры whenCreated и whenChanged.

Результатом работы сценария является дата и время в привычном для человека формате (см. рис. 2).

Тип данных string (VarType = �)Большинство данных в каталоге Active Directory хранится в строковом виде. В таблице 4 приведено описание полей, которые чаще всего используются в сценариях.

Чтение данных осуществляется с помощью функции GetObject() или универсального способа – с помощью ADODB-соединения. Первый спо-соб (см. листинг 4а) хорош своей лаконичностью: всего две строки. Его основной недостаток – не-обходимо знать LDAP URL-путь к объекту.

Когда точное местоположение объекта неизвестно, используют

Переменная Комментарий Пример

createTimeStamp Дата и время создания объекта. При попытке получить значение с помощью функции GetObejct() выдает ошибку

20070222080007.0Z

modifyTimeStamp Дата и время последнего изменения свойств объекта. При попытке получить значение с помощью функции GetObejct() выдает ошибку

20080507120605.0Z

whenCreated Дата и время создания объекта. Значение совпадает со значением параметра createTimeStamp. Используется для совместимости с доменами Windows NT. Чтение данных с помощью функции GetObejct() осуществляется корректно

20070222080007.0Z

whenChanged Дата и время последнего изменения свойств объекта. Значение совпадает со значением параметра modifyTimeStamp. Используется для совместимости с доменами Windows NT. Чтение данных с помощью функции GetObejct() осуществляется корректно

20080507120605.0Z

Таблица 3. Параметры типа Date всех типов объектов

YYYYMMDDHHMMSS.MS Z

Рисунок 1. Параметры в формате Generalized–Time

Листинг 3а. Чтение параметров в формате UTC–Time

'Создание ADODB–соединенияSet objConn = CreateObject("ADODB.Connection")Set objCom = CreateObject("ADODB.Command")objConn.CommandTimeout = 120objConn.Provider = "ADsDSOObject"objConn.Open "Active Directory Provider"Set objCom.ActiveConnection=objConn'Составление и обработка SQL–запросаQuery = "SELECT createTimeStamp ↵ FROM 'LDAP://CN=Ivan\, Petrov,CN=Users,DC=msk,DC=ru'"Set st = objConn.Execute(Query)'Вывод результатаwscript.echo vartype(st.Fields("createTimeStamp").Value)wscript.echo (st.Fields("createTimeStamp").Value)

Листинг 3б. Чтение параметров в формате UTC–Time

' Только для параметров whenCreated, whenChangedset objUser = GetObject("LDAP://CN=Ivan\, ↵ Petrov,CN=Users,DC=msk,DC=ru")WScript.echo objUser.Get("whenCreated")

Листинг 2а. Чтение значений типа Long с помощью функции GetObject()

Set obj = GetObject("LDAP://CN=Test,OU=Group,DC=msk, ↵ DC=ru")Wscript.Echo obj.sAMAccountType

Листинг 2б. Чтение значения строковых параметров с помощью ADODB–соединения

'Создание ADODB–соединенияSet objConn = CreateObject("ADODB.Connection")Set objCom = CreateObject("ADODB.Command")objConn.CommandTimeout = 120objConn.Provider = "ADsDSOObject"objConn.Open "Active Directory Provider"Set objCom.ActiveConnection=objConn'Составление и обработка SQL–запросаQuery = "SELECT sAMAccountType ↵ FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'"Set st = objConn.Execute(Query)'Вывод результатаwscript.echo st.Fields("sAMAccountType").Value

Рисунок 2. Чтение параметра в формате Generalized–Time

Page 13: 067 Системный Администратор 06 2008

11№6, июнь 2008

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

возможность поиска ADODB-соединения (см. листинг 4б). В приведенном примере механизм поиска объекта не ис-пользован. (Поиск объекта осуществляется на основе SQL-запроса, в котором указан путь к корневой папке домена.) Путь к объекту задан в явном виде. Во всех трех примерах продемонстрировано чтения одного и того же параметра.

Тип данных object (VarType = �)Хранящаяся в Active Directory информация, соответствую-щая типу данных Large Integer, воспринимается интерпре-татором VBScript как объект (см. таблицу 5).

Все данные типа Object, хранящиеся в Active Directory, считываются с помощью функции Get(). Впоследствии по-лученное значение складывают из двух: HighPart (Дата) и LowPart (Время). Пример чтения в листинге 5.

Часть параметров, например pwdLastSet (см. табли-цу 5) имеет несколько другую методику чтения, которая также используется для полей accountExpires, uSNChanged, lastLogonTimestamp, lastLogon, badPasswordTime. Значение параметра pwdLastSet – промежуток времени от 1 января 1601 года по настоящее время с точностью 100 миллисе-кунд. Преобразование данных осуществляется с помощью функции (см. листинг 6).

Тип данных array (VarType = �1�2+х)Возвращаемое значение функции VarType складывается из двух составляющих: 8192 (array) + х. В данном выраже-нии х – число, обозначающее тип данных элементов мас-сива. Так, массив, элементы которого являются строками, возвращает значение 8200 = 8192 + 8; если массив состо-ит из бинарных элементов, то возвращаемое значение – 8209 = 8192 + 17 (см. таблицу 6).

Массивы, возвращаемые Active Directory, как прави-ло, состоят из неопределенных элементов (Variant = 12). Функция в этом случае возвращает значение 8204 = 8192 + 12. Элементами массива в данном случае является либо строка, либо число, которое при получении значений эле-ментов автоматически преобразуется в строку (см. лис-тинг 7). Чтение массива осуществляется с помощью цик-ла For…Each.

Листинг 4а. Чтение значения строковых параметров

Set obj = GetObject("LDAP://CN=Test,OU=Group,DC=msk, ↵ DC=ru")Wscript.Echo obj.cn

Листинг 4б. Чтение значения строковых параметров с помощью ADODB–соединения

'Создание ADODB–соединенияSet objConn = CreateObject("ADODB.Connection")Set objCom = CreateObject("ADODB.Command")objConn.CommandTimeout = 120objConn.Provider = "ADsDSOObject"objConn.Open "Active Directory Provider"Set objCom.ActiveConnection=objConn'Составление и обработка SQL–запросаQuery = "SELECT cn ↵ FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'"Set st = objConn.Execute(Query)'Вывод результатаwscript.echo st.Fields("cn").Value

Переменная Комментарий Пример

cn Составное имя пользователя (cn – сокращение от Canonical Name), формирующееся из фамилии (поле givenName), имени (поле sn) и необязательного инициала (поле initials)

Ivan, Petrov

displayName Отображаемое имя. Его значение идентично составному имени пользователя (поле cn). Используется для совместимости с доменами Windows NT

Ivan, Petrov

distinguishedName Составной путь (DC) к объекту в соответствии c RFC 1779, 2247

CN=Ivan\,Petrov, CN=Users,DC=msk, DC=ru

mail Адрес электронной почты в формате UPN. Заполняется после создания ящика электронной почты для учетной записи пользователя

[email protected]

sAMAccountName Имя пользователя для входа в сеть. Используется для совместимости пространств имен Active Directory c доменами на основе Windows NT

IPetrov

sn Фамилия пользователя (sn – сокращение от Second Name)

Petrov

userPrincipalName UPN-имя пользователя, описанное в RFC 822. Это основной формат имен, используемый в Active Directory

[email protected]

givenName Имя учетной записи пользователя. Является обязательным параметром

Ivan

initials Инициалы пользователя. Необязательный параметр длиной до 6 символов

V

Таблица 4. Параметры типа String для учетной записи пользователяЛистинг 5. Получение значения типа Object

Set obj = GetObject("LDAP://CN=Ivan\, ↵ Petrov,CN=Users,DC=msk,DC=ru")Set objUSN = obj.Get("uSNChanged")Wscript.Echo Abs(objUSN.HighPart * 2^32 + objUSN.LowPart)

Листинг 6. Чтение параметра lastLogonTimestamp (accountExpires, lastLogon, pwdLastSet)

Set obj = GetObject("LDAP://CN=Ivan\, ↵ Petrov,CN=Users,DC=msk,DC=ru")Set objUSN = obj.Get("lastLogonTimestamp")Wscript.Echo ConvertTime(objUSN)

Function ConvertTime(objDate)

Set objShell = CreateObject("Wscript.Shell")Key="HKLM\System\CurrentControlSet\Control\ ↵ TimeZoneInformation\ActiveTimeBias"TempKey = objShell.RegRead(Key)

If (VarType(TempKey) = 3) Then Temp = TempKeyElseIf (VarType(TempKey)=12) Then

Temp = 0 For k = 0 To UBound(TempKey) Temp = Temp + (TempKey(k) * 256^k) NextEnd If

lngHigh = objDate.HighPartlngLow = objDate.LowPartIf (lngLow < 0) Then lngHigh = lngHigh + 1End IfIf (lngHigh = 0) And (lngLow = 0 ) Then dtmDate = #1/1/1601#Else dtmDate = #1/1/1601# + (((lngHigh * ↵ (2 ^ 32))+ lngLow)/6/10^8 - Temp)/1440End IfConvertTime=dtmDateEnd Function

Page 14: 067 Системный Администратор 06 2008

12

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

В Active Directory присутствует два массива бинарных элементов, которые необходимо выделить отдельно: SID (параметр objectSID) и GUID (параметр objectGUID) объек-та. В связи с этим функция VarType() возвращает значение 8209 = 8192 + 17. После того как элементы массива счи-таны, их необходимо преобразовать в понятный всем вид (см. рис. 3) с помощью функции HEX.

Шаблон чтения данныхСуммируя сказанное, заметим, что грамотно написанный сценарий чтения каких-либо данных из Active Directory име-

ет следующую структуру. Сначала с помощью ADODB-со-единения получают доступ к каталогу Active Directory, ука-зывая в запросе названия полей, значения которых необ-ходимо получить. Затем определяется тип данных объек-та и в зависимости от этого – считывание объекта по ука-занному алгоритму.

Конечно, возникает вопрос: «Если я знаю название по-ля и я точно знаю его тип данных – зачем использовать функцию VarType(). Ведь это усложняет сценарий, делает его громоздким?» Да, вопрос правомерный. Ответ на него очень прост: «Если всем параметрам присвоены значения, то все именно так – в функции VarType() нет необходимос-ти. Однако на практике это не так. Более того. Часто со-здают сценарии, чтобы выявить незаполненные поля. Ес-ли поле не заполнено, например поле description, то функ-ция VarType() возвратит значение NULL (см. таблицу 1).» В листинге 8 приведен пример чтения данных с провер-кой функцией VarType().

Обратите внимание, что в сценарии осуществляется проверка типа данных только для переменной description. Это связано с тем, что параметру cn всегда присвоено значение, поскольку оно является обязательным. Объект без этого параметра не может существовать.

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

1. Коробко И. Администрирование сетей Windows с помощью сценариев. //СПб.: БХВ-Петербург, 2007. – 368 с.: ил. – (Сис-темный администратор). ISBN 978-5-9775-0140-8.

2. RFC 822. Standard for the format of ARPA internet text messages.

3. RFC 1779. A string representation of distinguished names.4. RFC 2247. Using Domains in LDAP/X.500 Distinguished Names.5. RFC 2251. Lightweight Directory Access Protocol (v3).6. Коробко И. Управляем объектами в Active Directory. Часть 1.

//Системный администратор, №5, 2008 г. – С. 4-9.

Переменная Комментарий Пример

description Комментарий, описание объекта. Как ни странно – это не строка, а массив символов

Тестовая учетная запись

memberOf Список групп, членом которой является пользователь

Domain UsersTest

objectClass Список идентификаторов класса, к которому относится объект

TopPerson

objectGUID Глобальный идентификатор объекта 93 C5 2A A1 1D AF 10 42 AA 3E 7A 33 0F A3 E3 96

objectSID Идентификатор безопасности объектов

01 05 00 00 00 00 00 05 15 00 00 00 2C 8F EC FB

Таблица 6. Параметры типа Array для учетной записи пользователя

Рисунок 3. Преобразование SID–объекта

Листинг 8. Рекомендуемый сценарий чтения данных из AD

'Создание ADODB–соединенияSet objConn = CreateObject("ADODB.Connection")Set objCom = CreateObject("ADODB.Command")objConn.CommandTimeout = 120objConn.Provider = "ADsDSOObject"objConn.Open "Active Directory Provider"Set objCom.ActiveConnection=objConn'Составление и обработка SQL–запросаQuery = "SELECT description, cn ↵ FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'"Set st = objConn.Execute(Query)'Вывод результатаwscript.echo st.Fields("cn").Valuetemp = ""if VarType(st.Fields("description").Value)>8192 thenFor Each description In st.Fields("description ").Valuetemp = temp + description NextElse temp = "Поле description пусто"End IfWscrit.Echo temp

Переменная Комментарий Пример

uSNChanged Порядковый номер изменений свойств объекта, отсчитывающийся с момента создания объекта. Количество изменений, произошедших с объектом, равно разности uSNChanged – uSNCreated

794175

uSNCreated Значением является порядковый номер изменений, сделанных в Active Directory на момент создания объекта

794169

accountExpires Дата и время, по истечении которых учетная запись пользователя будет автоматически заблокирована. Если значение равно 0 – функция дезактивирована

9223372036854775807

lastLogon Дата и время последней регистрации пользователя в сети. При попытке получить значение с помощью функции GetObejct() выдает ошибку

128555016510096179

pwdLastSet Дата и время последней смены пароля 128527377084375000

Таблица 5. Параметры типа Object для учетной записи пользователя

Листинг 7. Чтение массива строк с помощью ADODB–соединения

'Создание ADODB–соединенияSet objConn = CreateObject("ADODB.Connection")Set objCom = CreateObject("ADODB.Command")objConn.CommandTimeout = 120objConn.Provider = "ADsDSOObject"objConn.Open "Active Directory Provider"Set objCom.ActiveConnection=objConn'составление и обработка SQL–запросаQuery = "SELECT OBJECTCLASS ↵ FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'"Set st = objConn.Execute(Query)'Вывод результата For each el in st.Fields("OBJECTCLASS").Value wscript.echo el Next

Page 15: 067 Системный Администратор 06 2008
Page 16: 067 Системный Администратор 06 2008

14

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

Что представляет собой система мониторинга GroundWork Monitor

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

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

Page 17: 067 Системный Администратор 06 2008

15№6, июнь 2008

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

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

как коммерческих, так и бесплатных. К сожалению, не каждый админист-ратор по разным причинам сможет или захочет использовать популярные Open Source-решения вроде Nagios [3] или Cacti [4]. Некоторые посчитают их требующими значительных затрат времени в настройке. Примерно на таких администраторов и рассчита-на система мониторинга GroundWork Monitor [1].

Проект предлагает три версии своей системы: Community Edition, Proffesional и Enterprise.

Версия Community Edition распро-страняется свободно по лицензии GNU GPL и обеспечивает все необходимые возможности по наблюдению за серве-рами, устройствами и приложениями. Речь в статье пойдет именно об этом варианте. Тем более что Community Edition построен на той же кодовой ба-зе, что и старшие версии продукта. По-этому при необходимости версию мож-но повысить без серьезной перестрой-ки системы.

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

В основу GroundWork Monitor взяты 15 популярных Open Source-продуктов: Nagios, Cacti, RRDtool, nmap, MySQL и другие, которые объединены в еди-ную систему, позволяющую увидеть все реально происходящие события.

Для управления и вывода инфор-мации используется понятный веб-ин-терфейс, построенный на базе Monarch (MONitor ARCHitecture) [5] и Fruity [6].

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

Удобство настроек обеспечивает-ся в том числе и наличием подготов-ленных профилей, позволяющих быс-тро подключить сервис. Сегодня име-ются профили для telnet, smtp, ftp и не-которых других.

GroundWork Monitor имеет систе-му поиска новых устройств в сети, что очень упрощает администрирова-ние и подготовку к работе.

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

Поддержка Community Edition осу-ществляется сообществом пользова-телей GroundWork Monitor. Кроме этого, на сайте доступны видеоуроки, в кото-рых разъяснены базовые настройки.

Версии и релизыВ настоящее время на сайте проек-та доступны две версии продукта: 5.1 и 5.2.1. Версия 5.2.1 некоторое время после выхода не была анонсирована на сайте, но уже была доступна на стра-нице проекта на SourceForge [2].

По функциональности они прак-тически не отличаются. В 5.2.1 обнов-лены программы Nagios 2.10 и плаги-ны 1.4.10, в том числе и NSCA до 2.7.2. Плюс устранены некоторые ошибки в Monarch.

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

Так, 5.2.1 доступна только в виде пакетов для дистрибутивов RHEL 4 и 5, а также SLES 9 и 10. Пакеты соб-раны для архитектур i386 и x86_64. Варианты версий несколько разно-

образней и интересней. Так, есть ISO-образ готовой к использованию сис-темы и образ для виртуальной ма-шины VMware, построенные на базе CentOS. Кроме того, есть и deb-пакет для Ubuntu 6.06. Последний без проб-лем устанавливается в Ubuntu 7.04, 7.10 и Debian 4 (Etch).

Кроме этого, на странице закачки доступны модули для совместной ра-боты с системами мониторинга Nagios и Ganglia, WMI-модуль для мониторин-га Windows-систем и другие.

Для самостоятельной установки понадобится модуль perl-DBI, сервер Apache с поддержкой PHP и MySQL, а также Java JDK. Их можно установить из репозитария дистрибутива.

Cсылки на все нужные RPM-па-кеты для RHEL и SLES есть на сайте GroundWork Monitor. В общем, установ-ка GroundWork Monitor при помощи па-кетов проблем не вызывает.

Для доступа к серверу в версии для VMware следует использовать учетную запись GroundWork с паролем monitor или root с паролем opensource. Пароль для входа в систему монито-ринга будет подсказан после регист-рации в системе (admin/admin).

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

Окно мониторинга позволяет наблюдать за системами в реальном времени

Page 18: 067 Системный Администратор 06 2008

16

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

ню, справа отображаются параметры и настройки. Чтобы добавить пользо-вателя, имеющего право подключать-ся в GroundWork Monitor, следует пе-рейти в меню «Administration».

Для удобства управления использу-ются группы, права назначаются на ос-нове ролей. По умолчанию имеются две роли: Administrators и Operator.

View to this role» и нажать «Add View». Как вариант создается отдельная груп-па с нужными правами.

Другие настройки во вкладке «Administration» позволяют установить или удалить специфические для сис-темы мониторинга пакеты и изменить тему оформления. Правда, в поставке всего одна такая тема и где взять дру-гие – не ясно.

Во вкладке «Status» в реальном времени выводится статус работы сис-тем и сервисов. Информация в общем доступна в виде круговых диаграмм (отдельно для узлов и сервисов) и под-робнее в таблицах.

В подменю «Trouble View» собраны ссылки на узлы и сервисы, статус ко-торых должен вызывать беспокойство администратора.

Найти нужный объект при большом количестве контролируемых систем поможет поиск.

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

Подробный статус мониторинга лю-бого сервера доступен в «Monitoring Server». Здесь полностью показана ин-формация по каждому сервису на вы-бранном узле, процессам, производи-тельности и запросам системы мони-торинга.

Во вкладке «Performance» можно настроить вывод, в том числе и в ре-альном времени, отдельных пара-метров производительности, любой из систем, подключенных к серверу GroundWork Monitor. Настройка проста. При помощи раскрывающегося списка выбираем узел, после чего в следую-щем столбце будут показаны парамет-ры, которые можно контролировать. Выбираем нужные и нажимаем «Add Data Set(s)». Затем внизу выбираем тип графика и период времени.

Добавление узлов и сервисов про-изводится в меню «Configuration EZ». Предусмотрено несколько вариантов: ручное добавление, импорт настроек и выбор «Discover» позволит проска-нировать сеть в поиске объектов при помощи nmap. Схожие узлы сгруппи-рованы в Hosts Group.

Отчеты Nagios

Вывод информации по статусу сервисов на отдельном узле

Во второй пользователи имеют пра-во только на просмотр некоторых отче-тов и статуса работы контролируемых объектов (в терминологии GroundWork Monitor – Subscriptions).

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

Page 19: 067 Системный Администратор 06 2008

17№6, июнь 2008

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

bin и запускаем nrpe_nt в качестве сервиса (нужны соот-ветствующие права).

В списке сервисов должен появиться «Nagios Remote Plugin Executor for NT/W2K», настроенный на ручной за-пуск. Запускаем его.

В случае неудачи описание ошибки можно найти в nrpe_nt.log. Теперь новый сервис будет доступен в ок-не GroundWork. Проверить правильность работы скрипта в Windows можно при помощи сервера сценариев:

Или свободное место на дисках.

Команда на сервере GroundWork Monitor для провер-ки версии ОС на компьютере с IP-адресом 192.168.1.5 вы-глядит так:

В документации подробно описан процесс настройки ра-боты клиентов через защищенное SSL-соединение.

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

Удачи!

1. Сайт проекта GroundWork Monitor – ht tp://www.ground workopensource.com.

2. Страница на SourсeForge – http://sourceforge.net/projects/gwmos.

3. Бешков А. Установка Nagios. //Системный администратор, № 2, 2003 г. – C. 6-14.

4. Яремчук С. Cacti – простой и удобный инструмент для мони-торинга и анализа сети. //Системный администратор, № 4, 2007 г. – C. 22-27.

5. Сайт проекта Monarch – http://sourceforge.net /projects/monarch.

6. Сайт проекта Fruity – http://sourceforge.net/projects/fruity.7. Сайт проекта nrpe_nt – http://www.miwi-dv.com/nrpent.

В меню «Profile» собраны варианты мониторинга вы-бранных узлов: ping, ssh и snmp.

Информация, необходимая для отсылки предупрежде-ний для пользователей, и временные промежутки, в кото-рых разрешена их отправка, указываются в подвкладке «Notifications». В настройках можно указать адрес электрон-ной почты и адрес пейджера (SMS). На последний в отличие от e-mail будут отсылаться короткие сообщения.

В подвкладке «Commit» находится меню проверки кон-фигурационных файлов и перезапуска Nagios.

Другим вариантом настройки является пункт меню «Configuration», который представляет собой удобный ин-терфейс к конфигурационным файлам Nagios. Для до-бавления нового узла или сервиса предлагается понят-ный мастер.

В меню «Escalations» настраиваются объекты, на ко-торых будет отсылаться Notifications при возникновении проблем.

Вкладка «WrappIt» позволяет подключить другое веб-приложение, котрое будет доступно из окна GroundWork Monitor и настроить однократную аутентификацию (Single Sing-on).

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

Любимая администраторами карта доступна в вклад-ке «Nagios Map». Отчеты по любому узлу и сервису за выбранный период можно сгенерировать, зайдя в меню «Nagios Report».

Мониторинг Windows-системДля мониторинга Windows-систем нам понадобится вер-сия nrpe (Nagios Remote Plugin Executor) – nrpe_nt [7] и ар-хив WMI Plugins, взятый с сайта GroundWork Monitor.

Распаковываем nrpe_nt в любой каталог, например C:\nrpe_nt. Исполняемый файл NRPE_NT.exe и конфигура-ционный файл nrpe.cfg находятся в подкаталоге bin.

Cоздаем дополнительно подкаталог C:\NRPE_NT\Plugins\V2, в который копируем все файлы с расширением VBS из архива WMI Plugins.

Файл V2_nrpe_commands.cfg перемещаем в bin и под-ключаем его в nrpe.cfg, добавив строку:

В этом же файле разрешаем подключение сервера Nagios, указав его IP-адрес в параметре allowed_hosts. Ес-ли на компьютере несколько сетевых карт, то соединения от сервера Nagios будут приниматься со всех. Ограничить единственным интерфейсом можно при помощи парамет-ра server_address.

И наконец, указав:

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

Теперь в интерпретаторе cmd.exe, переходим в каталог

include=C:\NRPE_NT\bin\V2_nrpe_commands.cfg

dont_blame_nrpe=1

C:\nrpe_nt\bin>nrpe_nt -i

NRPE_NT Service sucessfully installed!

C:\nrpe_nt\bin>net start nrpe_nt

Служба "Nagios Remote Plugin Executor for NT/W2K" запускается.....Служба "Nagios Remote Plugin Executor for NT/W2K" успешно запущена.

> cscript //nologo C:\NRPE_NT\Plugins\V2\ ↵ verify_wmi_status.vbs -h 127.0.0.1

OK - Microsoft Windows XP Professional, SP 2.0

> cscript //nologo check_disks_percentage_space_used.vbs ↵ -h 127.0.0.1 -inst * -w 40 -c 60

# /usr/local/groundwork/nagios/libexec/check_nrpe ↵ -H 192.168.1.5 -c show_os -a 127.0.0.1

Page 20: 067 Системный Администратор 06 2008

18

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

Название этого продукта наводит на мысли о путешествиях Гулли-вера, остро- и тупоконечниках

или, на худой конец, порядке следо-вания байтов. Подозреваю, что на род-ном языке его разработчиков – италь-янском – это слово тоже значит что-нибудь хорошее, хотя документаль-ных подтверждений тому мне обнару-жить не удалось. Как бы там ни было, под именем Endian скрывается специ-ализированный дистрибутив Linux, ре-ализующий функции брандмауэра, ин-тернет-шлюз (с поддержкой несколь-ких подключений), хот-спота (только в коммерческой версии) и контроля за сетевыми угрозами (Unified Threat Management, UTM).

Endian Firewall (EFW) поставляет-ся в двух основных редакциях: свобод-ной (GPLv2) и бесплатной Community и коммерческой Appliance. Последняя, в свою очередь, подразделяется на ап-паратные (Mini, Mercury, Macro, Macro X2 – в порядке наращивания возмож-ностей) и программную (Software) раз-новидности. Endian Firewall Software Appliance можно установить на любой x86-совместимый компьютер подходя-щей мощности (рекомендуется 1 ГГц и 512 МБ оперативной памяти, а также не менее 4 ГБ на жестком диске, при-вод CD-ROM, клавиатура и монитор понадобятся только на этапе инстал-ляции и устранения неполадок). Фир-менные аппаратные решения Endian

(за исключением младшей модели – Mini – обладающей пассивным-охлаж-дением и настольным корпусом) мон-тируются в стандартной девятнадцати-дюймовой стойке и имеют высоту 1U.

Как правило, в продуктах, обла-дающих открытой и закрытой верси-ями, первая служит своего рода тес-товым полигоном для второй: на ней обкатываются новые идеи и функции, которые (после стабилизации) ложат-ся в основу бизнес-решения. В слу-чае с Endian, похоже, все происхо-дит наоборот: Community-версия по-лучается путем урезания стандарт-ного Endian Firewall (он же – Software Appliance) и при этом еще проходит свое собственное тестирование! Так,

Endian Firewall 2.2: из Италии с любовью

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

Организация шлюза в Интернет – типовая задача, которую с разным успехом решает множество специализированных продуктов. Нужен ли нам еще один?

Page 21: 067 Системный Администратор 06 2008

19№6, июнь 2008

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

на момент написания обзора, Endian Firewall Community 2.2 находился в ста-дии релиз-кандидата, тогда как ком-мерческая версия готовилась отме-тить первый месяц продаж.

О «родословной» Endian Firewall ходят противоречивые слухи. Офи-циальный сайт [1] лаконично сооб-щает, что-де он «includes a Hardened Linux Based Operating System» (имен-но так, большими буквами, как имя собственное); DistroWatch.com утверж-дает, что в основе дистрибутива ле-жит Red Hat Enterprise Linux, а Вики-педия и вовсе предлагает почти биб-лейскую историю в духе: «IPCop ро-дил Endian, SmoothWall родил IPCop, а SmoothWall родился от LFS и Red Hat». Беглый анализ системы пока-зывает, что каждый из них по-своему прав: скрипты инициализации и схема хранения настроек явно были позаимс-твованы у SmoothWall/IPCop (сейчас они, по правде сказать, уже достаточ-но сильно модифицированы), а распро-странение всего дистрибутива в виде набора RPM-пакетов и выбор языка Python для реализации большей части собственных функций (кроме, пожалуй, веб-интерфейса – он написан на Perl, более традиционном для дистрибути-вов такого класса) – это влияние Red Hat. К слову сказать, для EFW выпуска-ется комплект разработчика и исход-ные тексты (тоже в форме RPM-паке-тов), однако на момент написания дан-ной статьи они относились к предыду-щей версии – 2.1.

На первый взглядПроцесс установки Endian Firewall Communty (и, надо полагать, не-Communty) вполне стандартен: сис-тема задает минимум вопросов на английском, итальянском или немец-ком языках – на выбор пользователя – и занимает весь жесткий диск (не за-будьте сохранить с него ценные дан-ные). Единственным сюрпризом явля-ется последовательная консоль: ес-ли на компьютере, отведенном вами для EFW, есть COM-порт и вам посчас-тливится найти нуль-модемный кабель, можете начисто избавиться от клавиа-туры с монитором и, в случае возник-новения неполадок, входить в систе-му через Minicom или HyperTerminal, как в старые добрые времена. Ну а по-ка дистрибутив работает, как часы (на-

деюсь, что так и будет), к вашим ус-лугам все блага современной циви-лизации: административный веб-ин-терфейс с элементами AJAX (русский язык здесь присутствует, хотя перевод и не полон) и SSH. Для их использова-ния необходимо только настроить «зе-леный» (GREEN) сетевой интерфейс, указав его IP-адрес и маску подсети (по умолчанию это 192.168.0.15/24; ес-ли вы намереваетесь включить EFW в существующую локальную сеть, зна-чения, естественно, придется подпра-вить) – что и делает инсталлятор не-посредственно перед тем, как начать копирование файлов. Не удивляйтесь, что у вас никто не спросит пароль root – это задача следующего этапа.

Первая загрузка тут же выдает встраиваемую природу EFW с голо-вой: вместо традиционного приглаше-ния ввести имя пользователя и пароль вам сообщат, по какому адресу досту-пен веб-интерфейс и предложат «сер-висное меню» из трех вариантов: вход в систему, сброс настроек и установка заводских параметров и перезагрузка. Вся пост-инсталляционная настройка и сопровождение происходит через веб-интерфейс (см. рис. 1), доступный по протоколу HTTPS. SSL-сертификат является самоподписанным, кроме то-го, он удостоверяет доменное имя (ко-торое автоматически генерируется при установке и может быть измене-но впоследствии), а доступ из локаль-ной сети с большой вероятностью бу-дет происходить по IP-адресу – в об-щем, предупреждения браузера мож-но спокойно проигнорировать. Ког-да вы откроете веб-интерфейс в пер-вый раз, вам (совсем как при знаком-стве с новой точкой доступа или бес-проводным маршрутизатором) предло-жат выбрать язык и часовой пояс, при-нять лицензию (GPLv2), восстановить резервную копию настроек (полезно, если вы переустанавливали дистри-бутив) и ввести пароль администрато-ра для доступа через Web, а также па-роль root. Затем откроется мастер, со-

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

Endian Firewall использует стан-дартную нотацию сетевых зон: зеле-ная (GREEN) – локальная (доверяе-мая) сеть, оранжевая (DMZ) – демили-таризированная зона, красная (RED) – Интернет и синяя (BLUE) для беспро-водных клиентов. В каждой зоне дол-жен находиться как минимум один се-тевой интерфейс, при этом каждый интерфейс может быть ассоциирован лишь с одной зоной. Для красной зо-ны поддерживаются следующие ти-пы подключений: Ethernet (статичес-кий и DHCP), PPPoE, ADSL (PCI и USB), ISDN, аналоговый/UMTS-модем (толь-ко в коммерческой версии – и поче-му бы?), а также специальный вари-ант Gateway (шлюз), который исполь-зуется в тех редких случаях, когда ма-шина с EFW не имеет красного интер-фейса (то есть не подключена к Интер-нету напрямую), а для доступа в сеть используется внешний маршрутиза-тор. Все эти варианты подробно опи-саны в распространяющемся по ли-цензии GFDL англоязычном руководс-тве Endian Firewall [2], которое, на мо-мент написания материала, было по-мечено как «разрабатываемое» («work in progress»).

На наш взгляд, подсистема на-стройки сети реализована в EFW не самым лучшим образом. Она, должно быть, прекрасно справлялась со своей задачей в предыдущих вер-сиях продукта, но в 2.2, после реали-зации поддержки нескольких внеш-них каналов (uplink), стала несколько путаной. Предположим, у вас есть два Ethernet-интерфейса, подключенных к различным провайдерам, и вы хоти-те организовать с их помощью отказо-устойчивость; красная зона же, по оп-ределению, одна. Вы не можете прос-то расширить ее на обе сетевых кар-

Основные компоненты Endian Firewall 2.2 Ядро Linux 2.6.22.18. Apache 1.3.33 (для веб-интерфейса). Squid 2.6STABLE-18 и DansGuardian

2.9.9.3.

Антивирус: ClamAV 0.93 и Amavisd 2.5.4. Антиспам: SpamAssasin 2.2.7 и Pyzor

0.4. OpenVPN 2.1. Ntop 3.3. OpenSSH 3.9p1.

Page 22: 067 Системный Администратор 06 2008

20

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

ты, поскольку в данном случае они бу-дут включены в мост с одним общим IP-адресом. Для решения данной зада-чи и были предложены внешние кана-лы, редактор которых доступен в меню «Networking → Interfaces». Внешний ка-нал обладает таким же набором пара-метров, что и красная зона (впрочем, здесь есть одно, но важное исключе-ние: uplink может быть PPTP-подклю-ченим. Будем считать, что это не ар-хитектурное решение, а просто ошиб-ка) – уже это наталкивает на мысль о «неполной нормализации», хотя сама идея – разделить «локальные» пара-метры настройки (IP-адрес, маску под-сети, имя хоста и т. п.) от глобальных (адрес шлюза в сети провайдера) ка-жется вполне здравой, особенно если рассмотреть систему, у которой будет более одного канала в Сеть в каждый момент времени. Внешний канал мо-жет служить назначением (destination)

правила маршрутизации, задава-емого по соседству («Networking → Routing»). Прискорбно, но маршрути-зация на основе политик (policy routing) в Community-версии не поддерживает-ся, так что решать, что и куда посылать, можно лишь на основании сетевых ад-ресов отправителя и получателя.

С маршрутизацией тесно связа-на другая тема – фильтрация паке-тов. В основе ее реализации в EFW лежит, конечно, Netfilter [3], сложность правильной настройки которого (по-средством утилиты iptables) уже вош-ла в хрестоматию стандартных «стра-шилок» начинающего Linux-админи-стратора. Неудивительно, что Endian Firewall, как и многие другие проекты, стремится скрыть ее за набором чело-веко-понятных правил. Последние раз-биты по группам: Portforwarding/NAT, исходящий трафик (Outgoing traffic), обмен данными между зонами (Inter-

zone traffic), VPN и доступ к системе. Настройки по умолчанию вполне ра-зумны: из любой зоны разрешен исхо-дящий трафик к внешним DNS-серве-рам и отправка наружу «пингов», бес-проводные клиенты (зона BLUE), кро-ме этого, могут обращаться к веб-сер-верам по протоколам HTTP/HTTPS, ну а локальным компьютерам (зона GREEN) доступны сверх этого FTP, POP3/IMAP, SMTP и их защищенные разновидности. Все, что не разреше-но явно, запрещено, поэтому вам, ве-роятно, придется добавить, как мини-мум, правила, открывающие доступ к сетям обмена мгновенными сооб-щениями (кстати, во встроенном спис-ке сервисов присутствуют ICQ и MSN Messenger, но нет Jabber – для него но-мера портов придется вводить вруч-ную). Впрочем, фильтрацию исходяще-го трафика можно и отключить.

Правила взаимодействия между зонами более простые – их суть сво-дится к тому, чтобы полностью изоли-ровать DMZ (оранжевая зона) и бес-проводных клиентов от локальной се-ти. Опять же, в реальной ситуации мо-жет потребоваться оставить некоторые хорошо определенные лазейки – ска-жем, активировать для зоны BLUE дос-туп по протоколу SMB. Разрешать все бессмысленно – тогда уж проще не вы-делять специальную зону. Как и в слу-чае с исходящим трафиком, межзон-ный брандмауэр можно выключить.

Правила доступа к системе сто-ят особняком. Во-первых, встроен-ные записи нельзя редактировать (возможно, разработчики опасают-ся, что излишне ретивый пользова-тель отрежет себе доступ к адми-нистративному интерфейсу), во-вто-рых, они всегда активны. Доступ к ад-министративному веб-интерфей-су разрешается из любой внутрен-ней зоны (т.е. GREEN,BLUE,ORANGE и VPN), а вот SSH-соединение можно установить только из «зеленой» се-ти. По умолчанию, ICMP-запросы из красной сети не принимаются, и это следует иметь в виду при общении со службами поддержки интернет-про-вайдеров.

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

Рисунок 2. «Диаграммы Ганта» для фильтров Squid

Рисунок 1. Веб-интерфейс Endian Firewall выполнен не слишком просто, но со вкусом

Page 23: 067 Системный Администратор 06 2008

21№6, июнь 2008

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

мином понимается веб-кэш наподобие Squid [4], но Endian Firewall идет гораздо дальше: здесь собраны прокси-серве-ры для HTTP, FTP, SMTP/POP3, SIP и даже DNS. Большая часть из них обеспечивает также антивирусный (ClamAV) и антиспам (SpamAssassin/Pyzor) контроль.

Начнем, пожалуй, с World Wide Web. Его проксирова-ние и фильтрация осуществляются традиционной связкой Squid и DansGuardian. Прокси-сервер может быть как про-зрачным, так и обычным, причем эта настройка задается в отдельности для каждой зоны (т.е. можно, например, раз-решить свободный доступ в Интернет из локальной сети и принудительно «заворачивать» на прокси беспроводных клиентов). Поддерживаются всевозможные механизмы ав-торизации: локальная (NCSA), LDAP (в том числе, в домене Active Directory), Windows (наверное, было бы уместнее на-писать NTLM и не вводить людей в заблуждение, тем более что в руководстве раздел по HTTP-прокси еще пока не на-писан) и Radius, а также политики. С помощью последних можно ограничить порты, доступные для проксирования, веб-клиенты и MIME-типы, а также указать, какие филь-тры и когда будут доступны: скажем, активировать филь-трацию содержимого лишь в рабочее время. Конфигурация фильтров отображается в графическом виде внизу страни-цы (см. рис. 2), и можно легко видеть, какой участок неде-ли остался неохваченным.

Вторым по популярности интернет-протоколом являет-ся электронная почта. Endian Firewall предоставляет прокси для POP3 и SMTP. Это может показаться странным, но в до-кументации по их поводу не говорится практически ничего, а доступные настройки несколько сбивают с толку. Риск-ну, однако, упомянуть одну интересную функцию – защиту от спама. На чем можно тренировать спам-фильтр в POP3-прокси, у которого и собственной базы сообщений-то нет? По мнению разработчиков EFW – на любом удаленном сер-вере с поддержкой IMAP4, достаточно лишь рассортиро-вать хранящиеся на нем сообщения на спамовые и хэмо-вые (а еще лучше – делать это на регулярной основе, к при-меру, попросив пользователей перемещать спам в опреде-ленную папку). POP3-прокси позволяет выискивать и по-мечать спам-сообщения, на какой (внешний) ящик они бы ни приходили – это выглядит интересным, но не снижает нагрузки на интернет-канал организации, так что пользы от такой фильтрации будет едва ли больше, чем от локаль-ной (средствами почтового клиента получателя).

Мы – за безопасные связиРазумеется, Endian Firewall может быть не только посред-ником, но и предоставлять сервисы сам по себе. Особого упоминания заслуживает VPN. EFW поддерживает две тех-нологии: IpSec и OpenVPN; мы будем говорить о последней. Доступны два режима работы: OpenVPN-сервер и OpenVPN-клиент (также известный как Gw2Gw – «шлюз/шлюз»; он пригодится, например, при подключении сети филиала к центральному офису). Примечательно, что OpenVPN-сер-вер запускается в режиме Bridged (а значит, удаленные кли-енты смогут работать со всеми протоколами, полагающи-мися на широковещательную доставку: от Half-Life до SMB Browse) и перевести его в Routing средствами GUI нет ника-кой возможности. Для VPN-клиентов зарезервированы ад-

реса 192.168.0.129-192.168.0.190 (разумеется, если вы не ме-няли подсеть, выбранную по умолчанию).

Из других сервисов можно перечислить систему обнару-жения вторжений Snort [5] и сетевой монитор Ntop [6]. А вот чего в EFW, по сравнению с его предком – SmoothWall – не достает, так это системы обновлений. Это тем более странно для дистрибутива, обеспечивающего безопасность целой сети, единственная уязвимость в котором может при-вести к очень серьезным последствиям.

В целом же Endian Firewall можно назвать весьма раз-витым и законченным решением.

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

1. Официальный сайт Endian Firewall – http://www.endian.com.2. Endian Firewall Reference Manual r. 2.2.0.2 – http://docs.endian.

com/2.2/en.3. Проект Netfilter отвечает за фильтрацию пакетов в ядре Linux –

http://www.netfilter.org.4. Прокси-сервер Squid – http://www.squid-cache.org.5. Система обнаружения вторжений Snort – http://www.snort.org.6. Сетевой монитор Ntop – http://www.ntop.org.

Рек

лам

а

Page 24: 067 Системный Администратор 06 2008

22

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

Что такое OpenSolaris 2008.05OpenSolaris 2008.05 – это выпущенный в начале мая 2008 года первый релиз предназначенного для конечных поль-зователей бинарного дистрибутива на основе Solaris Nevada. Разрабаты-вать такой дистрибутив взялись участ-ники проекта Indiana, поставив перед собой задачу – создать образ LiveCD для установки операционной системы и окружения рабочего стола с возмож-ностью установить при необходимости дополнительные программы из репо-зиториев, доступных по сети. Проект ведет свою историю с июня 2007 года и поддерживается в основном компа-нией Sun Microsystems, а его руководи-телем является перешедший на рабо-ту в эту корпорацию основатель Debian GNU/Linux Ян Мердок. Название вы-брано не случайно – лидер проекта ро-дом из одноименного штата. Основной центр документации по Indiana нахо-дится на веб-узле http://opensolaris.org/os/project/indiana/documents.

В ходе реализации проекта Indiana были созданы еще два предваритель-ных релиза для разработчиков: в но-ябре 2007 г. и в феврале 2008 г. Пла-нируется, что следующие версии дис-трибутива будут появляться каждые 6 месяцев.

OpenSolaris 2008.05 основан на

86-й сборке Solaris Nevada. Он пред-назначен только для x86-архитекту-ры как для 32-битной, так и 64-бит-ной версии. Есть поддержка различ-ных языков, включая русский. В дис-трибутив входят традиционные тех-нологии, как DTrace, ZFS, контейнеры, функции предсказуемого самовосста-новления, а также новинки – система управления пакетами IPS, напомина-ющая APT из Debian, и утилита управ-ления несколькими средами загрузки. Пакеты IPS, которые отсутствуют в ис-ходном установочном образе, напри-мер инструменты разработки, можно загрузить после установки. Поддер-живаются как пакеты IPS, так и паке-ты SVR4. Программы из образа LiveCD распространяются под различными ли-цензиями, позволяющими бесплатно использовать, копировать и распро-странять их.

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

Если установлена ОС Linux или

Linux и Windows и загрузка осущест-вляется с помощью программы GRUB, перед установкой ОС OpenSolaris тре-буется сохранить содержимое файла меню GRUB /boot/grub/menu.lst. По за-вершении загрузки эту информацию потребуется внести в файл /boot/grub/menu.lst, расположенный на файло-вой системе OpenSolaris. Важно отме-тить, что при установке ОС OpenSolaris в мультизагрузочной системе, в ко-торой установлена ОС Linux, раздел Solaris должен находиться перед раз-делом свопинга Linux, так как оба ви-да разделов имеют одинаковые иден-тификаторы.

Перед установкой OpenSolaris 2008.05 следует убедиться, что ком-пьютер удовлетворяет следующим системным требованиям: 512 Мб опе-ративной памяти и 3 Гб дискового про-странства (рекомендуется 10 Гб). Да-лее нужно добыть LiveCD. Образ раз-мером 686 Мб доступен для скачива-ния на страничке http://www.opensolaris.com/get/. Заказать CD можно, заполнив форму по адресу: https://www2.sun.de/dct/forms/reg_us_2307_228_0.jsp.

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

Обзор OpenSolaris 2008.05

Андрей Соколов

Технологии будущих версий Solaris доступны для ознакомления уже сегодня. OpenSolaris 2008.05 демонстрирует текущий результат разработки новой системы управления пакетами и средами загрузки.

Page 25: 067 Системный Администратор 06 2008

23№6, июнь 2008

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

указать русскую. Переключение рас-кладки клавиатуры с русской на анг-лийскую и наоборот осуществляется традиционным для Solaris способом: Ctrl+пробел. В системе после загрузки имеются 2 учетные записи: jack с па-ролем jack и root с паролем opensolaris. Служба nwam обеспечивает автомати-ческое управление сетевыми интер-фейсами.

OpenSolaris поставляется с прилич-ным количеством драйверов для мно-гих устройств, но в целом спектр под-держиваемых устройств не так широк, как у Windows или даже Linux. Поэто-му перед установкой рекомендуется воспользоваться программой Device Driver Utility, ярлык которой расположен на рабочем столе. Эта утилита позво-ляет оценить возможность полноцен-ной работы OpenSolaris на данной ма-шине и определить какие дополнитель-ные драйверы для этого потребуются. Для поиска драйверов можно посетить следующие сайты:n http://www.sun.com/bigadmin/hcl –

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

n http://homepage2.nifty.com/mrym3/taiyodo/eng – большая коллекция драйверов для сетевых карт.

Запуск инсталлятора осущест-вляется двойным щелчком по ярлы-ку «Установить OpenSolaris» на рабо-чем столе LiveCD. Процесс установ-ки сделан очень простым, ориенти-рованным на начинающего пользо-вателя. Во время установки щелчком по кнопке «Далее» предстоит преодо-леть семь форм:

«Добро пожаловать». Содержит информацию о том, где можно полу-чить справочные сведения по установ-ке и началу работы.

«Диск». На данном шаге следует выбрать первичный раздел на одном из дисков для установки OpenSolaris или создать такой раздел на выбран-ном устройстве. На отведенном под OpenSolaris разделе создаются более мелкие структурные единицы – слай-сы. Всего их может быть 10, каждому присваивается номер от 0 до 9. В ходе установки будут выделены три слай-са: загрузочный (с номером 8, содер-жащий программу загрузки и таблицу слайсов), корневой (с номером 0, для

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

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

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

Device Driver Utility

Создание образа pkg image-create [-FPUz] -a

Установка новых пакетов или обновление существующих

pkg install [-nv] pkg_fmri

Поиск пакетов pkg search [-lr] [-s server] token

Обновление всех пакетов образа pkg image-update [-nv]

Отображение информации о состоянии пакетов

pkg list [-aHsuv] pkg_fmri

Проверка того, что пакеты установлены корректно

pkg verify -[fv] pkg_fmri

Отображение информации о пакете pkg info [--license] pkg_fmri

Отображение атрибутов действий pkg contents [-Hm] [-o attribute] [ -s sort_key] [-t action_type]

Удаление пакетов pkg uninstall [-nrv] pkg_fmri

Добавление информации о доступных репозиториях

pkg set-authority [-P] [-k ssl_key] [-c ssl_cert] [-O origin_url] authority

Удаление информации о репозитории pkg unset-authority authority

Отображение информации о репозиториях pkg authority [-H] authority

Обновление информации о доступных в репозиториях пакетах

pkg refresh

Таблица 1. Функциональность утилиты pkg

Page 26: 067 Системный Администратор 06 2008

24

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

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

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

определяет доступные локали в рас-крывающемся списке. В любое время при входе в установленную систему можно изменить локаль для конкрет-ного сеанса или локаль по умолчанию. Для этого необходимо нажать кнопку «Параметры» в диалоговом окне «Ре-гистрация».

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

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

«Завершить». Появляется после завершения установки, предоставля-ет возможность просмотра журнала установки, а также перезагрузки ком-пьютера.

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

В результате установки будет по-лучена система, окружение рабоче-го стола которой построено на базе X.Org и GNOME 2.20.2. В комплекте будут следующие приложения: про-игрыватели Rhythmbox и Totem, ло-гические игры, графический редак-тор GIMP, программа просмотра изоб-ражений на цифровом фотоппарате Gtkam, браузер Firefox, почтовые кли-енты Evolution и Thunderbird, клиент об-мена мгновенными сообщениями (ICQ, jabber, IRC…) Pidgin, программа про-смотра документов Evince.

Управление пакетамиСистема управления пакетами в OpenSolaris 2008.05 называется Image Packaging System(IPS). На данный мо-мент работа над ней еще не заверше-на, поэтому разработчики рекоменду-ют только экспериментальное внед-рение. Текущая версия удовлетворя-ет только 4 из 7 требований, сфор-мулированных сообществом (http://www.opensolaris.org/os/project/indiana/resources/problem_statement).

Программное обеспечение для OpenSolaris распространяется в виде пакетов, представляющих собой кол-лекции устанавливаемых объектов: файлов, каталогов, ссылок, драйве-ров – а также информации о зависи-мостях. Каждый элемент этой коллек-ции по терминологии IPS называется действием. Место, куда устанавлива-ются пакеты, в IPS обозначается по-нятием «образ». Образ выступает как IPS-клиент, взаимодействующий с IPS-сервером (репозиторием). Установлен-ная OpenSolaris 2008.05 представляет собой образ, настроенный на репози-торий http://pkg.opensolaris.org/:80. Ус-тановка пакета в один образ никак не

Инсталлятор. Форма «Диск»

Package Manager

Page 27: 067 Системный Администратор 06 2008

25№6, июнь 2008

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

влияет на другой образ, что особенно важно при организации зон.

Утилита IPS pkg позволяет созда-вать образы, устанавливать, искать, обновлять, удалять пакеты в образе, при этом полностью проверяя зави-симости между ними. Она может быть вызвана со следующими параметра-ми (см. таблицу 1).

В формате команды параметр pkg_fmri представляет собой идентифика-тор пакета. В идентификаторе pkg://opensolaris.org/library/[email protected],5.11-0.75:20071001T163427Z:n opensolaris.org – это репозиторий;n libc – это название пакета, после ко-

торого через символ «собака» идет строка версии из четырех компо-нентов: 5.11 – версия компонента; 5.11 – версия сборки; 0.75 – версия ветки; 20071001T163427Z – код време-

ни.

Не все составные части pkg_fmri обязательны. Например, установка openoffice выполняется по команде: «pkg install openoffice».

Более подробную информацию о возможностях утилиты pkg можно по-лучить по команде «man pkg».

Как вариант для управления паке-тами можно использовать графичес-кое приложение Package Manager, име-ющее интуитивно понятный интерфейс и похожее на Synaptic. Однако его воз-можности значительно уступают воз-можностям pkg.

Существуют инструменты, поз-воляющие разработчикам создавать собственные репозитории (pkg.depotd) и располагать пакеты в них (pkgsend). Планируется реализовать зеркалиро-вание сетевого репозитория, службу автоматического обновления и груп-пировку пакетов.

В таблице 2 приведены доступные в Интернете репозитории и количест-во пакетов в них.

Управление средами загрузкиПод средой загрузки понимается на-бор критически важных для работы OpenSolaris файловых систем.

При выполнении команды «pkg image-update», обновляющей все ус-тановленные в текущем образе па-

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

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

Создавать снимки и клоны сред загрузки и управлять ими можно при помощи утилиты /usr/sbin/beadm. Ко-манды beadm позволяют выполнять действия над средами загрузки в це-лом, а не над отдельными наборами данных (файловыми системами, сним-ками и клонами). Теперь не требуется пользоваться для этого сериями ко-манд ZFS над каждым отдельным на-бором данных и ручным конфигуриро-ванием меню GRUB.

Утилита beadm может быть запу-щена со следующими параметрами (см. таблицу 3).

ЗаключениеА теперь позволю себе порассуж-дать на счет области применения OpenSolaris 2008.05.

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

себе будущее этой операционной сис-темы. Приятно видеть почти полную ру-сификацию и справку на русском язы-ке. В то же время русификация еще не доведена до конца: достаточно стран-ным кажется смешение русских пунк-тов с английскими в меню GNOME, при установке информация о состоя-нии установки англоязычная, в то вре-мя как все остальные надписи русские. Несмотря на то что OpenSolaris 2008.05 позиционируется как дистрибутив, ориентированный на конечного поль-зователя, в нем отсутствует некото-рая важная для применения на деск-топах функциональность: по умолча-нию невозможна перезагрузка от име-ни непривиллегированного пользова-теля, аудио и видео не проигрывают-ся. Еще одним недостатком является то, что в терминале не воспринима-ются весьма полезные клавиши PgUp, PgDown, Home, Insert.

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

Будем ждать следующих релизов с доделанной IPS и исправленными недостатками.

http://pkg.opensolaris.org/:80 4464

http://pkg.sunfreeware.com:9000/ 296

http://blastwave.network.com:10000/ 1714

Таблица 2. Количество пакетов в имеющихся репозиториях

Выбор активной среды загрузки beadm activate beName

Создание новой среды загрузки из снимка или клонированием существующей

beadm create [-a] [-e non-activeBeName | beName@snapshot] [-o property=value] ...[-p zpool] beName

Создание снимка текущей среды загрузки beadm create beName@snapshot

Удаление среды загрузки или снимка beadm destroy [-f] beName | beName@snapshot

Отображение информации о средах загрузки beadm list [-a | [-ds] [-H] [beName]

Монтирование среды загрузки beadm mount beName mountpoint

Переименование среды загрузки beadm rename beName newBeName

Отмонитрование среды загрузки beadm unmount beName

Таблица 3. Функциональность утилиты beadm

Page 28: 067 Системный Администратор 06 2008

Журнал «Системный администратор» совместно с партнерами

приглашает Вас принять участие в розыгрышах призов, которые

будут проводиться во втором полугодии 2008 года.

Для участия в розыгрышах:

Отыщите специальные коды в журналах «Системный

администратор» за второе полугодие 2008 года.

Зарегистрируйтесь на сайте журнала www.samag.ru

в разделе «Админский Приз».

Последовательно активируйте коды из журналов.

Будет проводиться 3 розыгрыша призов:

Админский Приз «РАЗ»: активируйте коды

из журналов №7, 8, 9 за 2008 год.

Админский Приз «ДВА»: активируйте коды

из журналов №10, 11, 12 за 2008 год.

Админский Приз «ТРИ»: активируйте коды

из всех журналов за второе полугодие 2008 года.

Три шанса выиграть А

дминский Приз

Page 29: 067 Системный Администратор 06 2008

Более подробную информацию о сроках и правилах проведения розыгрышей призов смотрите на сайте журнала – www.samag.ru

Журнал «Системный администратор» совместно с партнерами

приглашает Вас принять участие в розыгрышах призов, которые

будут проводиться во втором полугодии 2008 года.

Для участия в розыгрышах:

Отыщите специальные коды в журналах «Системный

администратор» за второе полугодие 2008 года.

Зарегистрируйтесь на сайте журнала www.samag.ru

в разделе «Админский Приз».

Последовательно активируйте коды из журналов.

Будет проводиться 3 розыгрыша призов:

Админский Приз «РАЗ»: активируйте коды

из журналов №7, 8, 9 за 2008 год.

Админский Приз «ДВА»: активируйте коды

из журналов №10, 11, 12 за 2008 год.

Админский Приз «ТРИ»: активируйте коды

из всех журналов за второе полугодие 2008 года.

Админский Приз «РАЗ»

Коммуникатор

Учебные курсы

Программные продукты

Виртуальные выделенные серверы

Админский Приз «ДВА»

Коммуникатор

Учебные курсы

Программные продукты

Виртуальные выделенные серверы

Админский Приз «ТРИ»

Ноутбук

Учебные курсы

Программные продукты

Три шанса выиграть А

дминский Приз

Все только начинается...

Page 30: 067 Системный Администратор 06 2008

28

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

OpenBSD 4.3: что новенького?

Влад Глаголев

Данная статья знакомит с последними новшествами и изменениями, вошедшими в финальный релиз открытой операционной системы OpenBSD 4.3.

Page 31: 067 Системный Администратор 06 2008

29№6, июнь 2008

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

Как известно, релизы OpenBSD выходят дважды в год: 1 мая и 1 ноября, и перед нами оче-

редной релиз OpenBSD 4.3 (http://www.openbsd.org/43.html).

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

OpenBSD – это полноценная опе-рационная система, включающая в се-бя не только ядро (kernel), но ещё и ог-ромный набор встроенных программ (userland). Именно это делает OpenBSD такой близкой к UNIX, где множество программ напрямую зависит от сис-темных вызовов. Такой подход пред-ставляет каждую UNIX-подобную опе-рационную систему уникальной.

Так, большинство программ для OpenBSD (например, tar) были перепи-саны в своё время под лицензии BSD/ISC, что сделало её в большинстве слу-чаев независимой от «свободы» GNU.

В последние релизы также вхо-дит X.Org (под кодовым названием Xenocara). X.Org в OpenBSD представ-ляет собой постоянно обновляющуюся ветку X.Org 7 с множественными моди-фикациями исходников разработчика-ми из команды OpenBSD.

Новшества в ядреn Долгожданная многопроцессорная

поддержка для архитектур sparc64 (исключением пока является лишь Sun Enterprise 10000) и mvme88k (MVME188 и MVME188A).

n OpenBSD теперь может похвас-таться поддержкой систем класса K (K200 и K410) для архитектуры hppa.

n Множество новых драйверов до-бавлено для архитектуры sgi.

n Улучшена поддержка оборудова-ния в системе, включающая драй-веры для широкого спектра уст-ройств (более 30 новых чипсетов): с е те в ы х к а р т (BC M 59 0 6 /

BCM5906M 10/100 и BCM5755 10/100/Gigabit);

аудиокарт (VIA Envy24); RAID-контроллеров (Dell CERC6/

PERC6 и LSI SAS1078); температурных сенсоров (TI

THMC50, Analog ADM1022/1028); и другой экзотической перифе-

рии.

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

Новшества в пользовательском окруженииНовые программы:n snmpd/snmpctl – SNMP-сервер

и программа его управления;n pcidump – позволяет получить

детализированную информацию о подключенных PCI-устройствах;

n ldattach – служит для привязки об-работчика к последовательному интерфейсу, что позволяет отправ-лять/получать данные через него.

Обновление функционала:n добавлена поддержка X11 для ар-

хитектуры sgi;n некоторые драйверы аудиоуст-

ройств поддерживают многока-нальное воспроизведение и запись (если железо это обеспечивает): c mpc i (C - M ed ia CM I 8 3 3 8 ,

CMI8738, CMI8768); auvia (встроенные устройства

AC'97 VIA VT82C686A, VT8233, VT8235, VT8237);

auich (карточки Intel (ICH)); eso (ESS Technology Solo-1 PCI

AudioDrive);n 64-битная адресация блоков в фай-

ловой системе FFS: обеспечивает поддержку дисков, разделов и фай-ловых систем, размер которых пре-вышает 2 Тб;

n автоматическое размонтирование файловых систем на USB-устрой-ствах;

n улучшена производительность ра-боты с Flash-устройствами посред-ством включения DMA (что увели-чило скорость записи/чтения);

n упрощена конфигурация баланси-ровки нагрузки CARP;

n несуществующие разделы в fstab просто игнорируются, что теперь не будет мешать монтированию ни-жеследующих разделов;

n автоматическое определение раз-делов EXT2 для архитектур sparc и sparc64;

n в основной файл пакетного филь-тра PF (pf.conf) теперь можно под-ключать дополнительные;

n поддержка IPv6 для демона sppp;n псевдоустройства svnd теперь мо-

гут работать с блоковыми устройст-вами;

Столлман о свободе OpenBSDК каждому релизу команда OpenBSD вы-пускает комикс и размещает его на сайте (http://www.openbsd.org/lyrics.html#43) с не-которыми комментариями, а также песню в форматах ogg и mp3. Не буду вдаваться в музыкальные предпочтения разработчи-ков, а посмотрим, чему посвящены их худо-жественные старания в выпуске 4.3.

В этот раз команда OpenBSD опроверг-ла представления о свободе одного из име-нитых личностей в мире Open Source – Ри-чарда Столлмана (Richard Stallman), основа-теля проекта GNU и Free Software Foundation. Связано это с ситуацией, когда в списках рассылки OpenBSD Ричард упрекнул раз-работчиков (http://marc.info/?l=openbsd- misc&m=119730630513821&w=2) в том, что система портов не полностью «чиста» в ли-цензионном плане, и призвал людей не ис-пользовать эту операционную систему.

Конечно же, такие изречения вызвали волну негодования у пользователей и раз-работчиков OpenBSD. Они сразу же «сбе-жались» и стали опровергать ляп, который допустил всем известный RMS.

Дело в том, что составляющая часть портов OpenBSD – это скрипты (как и в лю-бой другой системе управления програм-мным обеспечением), написанные разра-ботчиками. Они отвечают за скачивание исходных кодов, компиляцию и установ-ку. В них также отмечается, под какой ли-цензией распространяется устанавливае-мый продукт, и в некоторых случаях (как с Java Development Kit) пользователю прихо-дится самостоятельно скачивать дистри-бутивы программ и только потом исполь-зовать систему управления пакетами для их установки.

Чистота кода была в очередной раз до-казана упорными усилиями, и разработчи-ки OpenBSD придумали на эту тему комикс к грядущему релизу. Начинается коммента-рий со смешной истории Ричарда Столлма-на в самолёте, а последние строки закан-чиваются следующим: «That man is a false leader. He is a hypocrite. There may be some people who listen to him. But we don't listen to people who do not follow their own stupid rules».

В общем, судите сами.

Page 32: 067 Системный Администратор 06 2008

30

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

n улучшена работа программы disklabel, добавлена возможность определения разделов NTFS;

n SCSI -драйверы теперь более надёжны на многопроцессорных системах;

n TCP-ответы на высокофрагменти-рованные пакеты теперь формиру-ются без опасения за повреждение памяти ядра;

n установка длины ключей AES 192 и 256 бит для IPSEC в конфигура-ционном файле.

Новые возможности системы пор-тов:n программа make была перерабо-

тана с целью обеспечения много-задачной/параллельной сборки (multijob/parallel build): на многопро-цессорных системах это значитель-но повышает производительность сборки портов из исходников.

Изменения в процессе установки/обновления:n поддержка консоли для всех су-

ществующих (поддерживаемых) платформ;

n определение скорости консоли и автоматическое создание /etc/ttys на этапе установки;

n запоминание DNS-серверов при рестарте процесса установки;

n образы установочных дисков те-перь доступны и для архитектуры vax.

Обновления основных встроенных программ:n OpenBGPD 4.3: улучшена коррект-

ная обработка префиксов, приво-дящих к возникновению маршрут-ных «петель» (route loops);

n OpenNTPD 4.3: реализовано более изящное управление изменением IP-адресов клиентов, улучшения в обработке ошибок и системного протоколирования;

n OpenOSPFD 4.3: опции командной строки теперь синхронизированы с bgpd;

n relayd 4.3 (hoststated/hoststatectl были переименованы в relayd/relayctl): улучшены синтаксис конфигу-

рационного файла; поддержка перезапуска; поддержка фильтров для URL;

добавлена поддержка совмест-ной работы с snmpd (для от-правки SNMP-треппинга);

добавлена поддержка DNS-трансляций, основанных на UDP;

n OpenSSH 4.8: добавлена поддержка chroot

для sshd; sf tp -server теперь встроен

в sshd; снят лимит на использование

100 файловых дескрипторов (теперь он определяется дина-мически в зависимости от ко-личества доступных дескрип-торов);

множество других улучшений (http://www.openssh.com/txt /release-4.8).

Более 4900 портов, в состав кото-рых входят:n GNOME 2.20.3;n KDE 3.5.8;n Xfce 4.4.2;n GNUstep 1.14.2;n Mozilla Firefox/Thunderbird 2.0.0.12;n MySQL 5.0.51a;n PostgreSQL 8.2.6;n OpenMotif 2.3.0;n OpenOffice.org 2.3.1.

Статистика портов для поддержи-ваемых архитектур для релиза 4.3:n i386: 4782;n amd64: 4708;n powerpc: 4634;n sparc64: 4613;n alpha: 4233;n hppa: 3971;n arm: 3377;n sparc: 3159;n sh: 2046;n mips64: 1897;n m68k: 830;n vax: 296.

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

Основные из них в версии 4.3:n Xenocara (базируется на X.Org 7.3

(+ патчи), freetype 2.3.5, fontconfig

2.4.2, Mesa 7.0.2, xterm 232 и мно-гие другие составляющие);

n GCC 2.95.3 (+ патчи) и 3.3.5 (+ пат-чи);

n Perl 5.8.8 (+ патчи);n улучшенная версия Apache 1.3,

с поддержкой SSL/TLS и DSO;n OpenSSL 0.9.7j (+ патчи);n Groff 1.15;n Sendmail 8.14.1 (вместе с libmilter);n BIND 9.4.2 (+ патчи);n Lynx 2.8.5rel.4 с поддержкой HTTPS

и IPv6 (+ патчи);n Sudo 1.6.9p12;n Ncurses 5.2;n KAME IPv6;n Heimdal 0.7.2 (+ патчи);n Arla 0.35.7;n Binutils 2.15 (+ патчи);n Gdb 6.3 (+ патчи).

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

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

И напоследокСпустя несколько дней после офици-ального выхода OpenBSD 4.3 в дерево исходников (ветка -current) была добав-лена поддержка WPA/WPA2 для бес-проводных устройств, что предвеща-ет интересные тенденции в развитии операционной системы на ноутбуках и других портативных устройствах (где сейчас в основном и использу-ется WPA). Поэтому дождёмся осени и релиза OpenBSD 4.4, который обе-щает быть ещё более дружелюбным к пользователям.

Page 33: 067 Системный Администратор 06 2008

Реклам

а

Page 34: 067 Системный Администратор 06 2008

32

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

Максим Гришков

Настраиваем связку Apache + PHP + MySQL на базе ОС OpenBSD 4.3

Предположим, у вас возникла необходимость в развертывании веб-сервера с поддержкой PHP и MySQL. Данную задачу просто решить, имея под рукой свежий дистрибутив ОС OpenBSD 4.3, поскольку базовая установка данной ОС уже содержит настроенный и готовый к работе веб-сервер Apache версии 1.3. Остается только прикрутить к нему PHP и MySQL.

Page 35: 067 Системный Администратор 06 2008

33№6, июнь 2008

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

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

Установка СУБД MySQLУстанавливаем пакет mysql-server:

Следуя совету, создаем системные таблицы в служеб-ной БД:

Настраиваем безопасность с помощью скрипта mysql_secure_installation, для этого запускаем СУБД:

Запускаем скрипт настройки безопасности:

Вводим пустой пароль пользователя root:

Соглашаемся установить пароль для пользователя root и вводим пароль:

Удаляем анонимного пользова-теля:

# pkg_add -v mysql-server

parsing mysql-server-5.0.51a<--- --->mysql-server-5.0.51a: complete--- mysql-server-5.0.51a -------------------You can find detailed instructions on how to install a databasein /usr/local/share/doc/mysql/README.OpenBSD.

Using MySQL in an OpenBSD environment

If you are installing MySQL for the first time, you have to createa default database first. In order to create the database, please run/usr/local/bin/mysql_install_db

# /usr/local/bin/mysql_install_db

Installing MySQL system tables...OKFilling help tables...OKPLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !To do so, start the server, then issue the following commands:/usr/local/bin/mysqladmin -u root password 'new-password'/usr/local/bin/mysqladmin -u root -h bsd.my.domain password 'new-password'

Alternatively you can run:/usr/local/bin/mysql_secure_installation

# /usr/local/bin/mysqld_safe &

# /usr/local/bin/mysql_secure_installation

Enter current password for root (enter for none):OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQLroot user without the proper authorisation.

Set root password? [Y/n] yNew password:Re-enter new password:Password updated successfully!Reloading privilege tables.. ... Success!

Remove anonymous users? [Y/n] y ... Success!

Соглашаемся, что пользователю root можно заходить только с localhost:

Удаляем тестовую БД:

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

Настройка безопасности закончена.Поскольку в OpenBSD Аpache сконфигурирован для ра-

боты в chroot-окружении в директории /var/www, а сокет MySQL находится по адресу /var/run/mysql/mysql.sock, воз-никает проблема – Apache «не видит» директорию /var/run и сокет MySQL.

Решить проблему можно, создав жесткую ссылку на файл MySQL сокета mysql.sock:

Для того чтобы активировать запуск СУБД MySQL во время загрузки, необходимо добавить следующую строч-ку в файл /etc/rc.conf.local:

После этого добавляем скрипт для запуска mysqld в файл /etc/rc.local после строки «starting local daemons» пе-ред строкой «echo '.'»:

# mkdir -p /var/www/var/run/mysql# ln -f /var/run/mysql/mysql.sock/var/www/var/run/mysql/mysql.sock

mysqld=YES

if [ X"${mysqld}" == X"YES" -a -x ↵ /usr/local/bin/mysqld_safe ]; thenecho -n " mysqld"; /usr/local/bin/mysqld_safe ↵ --user=_mysql --log --open-files-limit=256 &for i in 1 2 3 4 5 6; doif [ -S /var/run/mysql/mysql.sock ]; thenbreakelsesleep 1

OpenBSDВ мае этого года команда разработчиков OpenBSD объявила о выходе очередного релиза этой операционной системы под но-мером 4.3 (подробности см. на стр. 28-30). Операционная система OpenBSD берет на-чало от программной платформы Berkeley Software Distribution (BSD), разрабатывав-шейся специалистами Калифорнийского университета в Беркли. Проект OpenBSD был основан Тео де Раадтом, одним из глав-

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

Disallow root login remotely? [Y/n] y ... Success!

Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success!

Reload privilege tables now? [Y/n] y ... Success!Cleaning up...All done! If you've completed all of the above steps, your MySQLinstallation should now be secure.Thanks for using MySQL!

Page 36: 067 Системный Администратор 06 2008

34

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

Установка и настройка СУБД MySQL закончена.

Установка PHP

Следуя полученным советам, активируем модуль php5 путем создания символической ссылки:

А также создаем директорию /var/www/tmp, принадлежа-щую пользователю www из группы www (apache), необходи-мую для корректной работы РНР в chroot-окружении:

Устанавливаем модуль php5-mysql

Следуя полученному совету, активируем модуль php5-mysql путем создания символической ссылки:

Замечание: почему-то был создан пустой файл /var/www/conf/php5.sample/mysql.ini, исправим это:

Добавляем другие необходимые модули РНР, например, MCRYPT, GD, MHASH:

Активируем модуль php5-mcrypt путем создания сим-волической ссылки:

Устанавливаем модуль php5-mhash:

Далее аналогично php5-mcrypt.Замечание: если во время установки системы вы не ус-

танавливали компонент xbase43.tgz (базовая установка X11), то необходимо устанавливать пакет php5-gd-5.2.5-no_x11, в остальных случаях – php5-gd-5.2.5. Делается это при по-мощи параметра -i утилиты pkg_add:

Вводим с клавиатуры «2» и жмем клавишу <Enter>.

Далее аналогично php5-mcrypt.

Настройка автозапуска ApacheДля того чтобы активировать запуск веб-сервера Apache во время загрузки, необходимо изменить значение фла-га httpd_flags в файле /etc/rc.conf.local:

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

Удачи!

1. Вышла операционная система OpenBSD 4.3 – ht tp: //www.astera.ru/software/?id=57346.

2. How-to: OpenBSD 3.8+Apache+PHP+MySQL – ht tp: //www.freeyourbox.org/tutorials/bsd/obsd3.8_apache_php_mysql.html.

3. Установка OpenBSD 4.2 – http://www.lissyara.su/?id=1589.4. Package Management – http://www.openbsd.org/faq/faq15.html.

Your choice: 2

httpd_flags=""# for normal use: "" (or "-DSSL" after reading ssl(8))

# pkg_add -v php5-core

<--- --->php5-core-5.2.5p2: complete--- php5-core-5.2.5p2 -------------------To enable the php5 module please create a symboliclink from /var/www/conf/modules.sample/php5.confto /var/www/conf/modules/php5.conf.

ln -s /var/www/conf/modules.sample/php5.conf /var/www/conf/modules

The recommended php configuration has been installedto /var/www/conf/php.ini.

Don't forget that the default OpenBSD httpd is chrootedinto /var/www by default, so you may need to create supportdirectories such as /var/www/tmp for PHP to work correctly.

# ln -s /var/www/conf/modules.sample/php5.conf ↵ /var/www/conf/modules

#mkdir /var/www/tmp#chown www:www /var/www/tmp

# pkg_add -v php5-mysql

<--- --->php5-mysql-5.2.5: complete--- php5-mysql-5.2.5 -------------------You can enable this module by creating a symboliclink from /var/www/conf/php5.sample/mysql.ini to/var/www/conf/php5/mysql.ini.

ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini

# ln -fs /var/www/conf/php5.sample/mysql.ini ↵ /var/www/conf/php5/mysql.ini

cat extension=mysql.so > ↵ /var/www/conf/php5.sample/mysql.ini

# pkg_add -v php5-mcrypt

<--- --->php5-mcrypt-5.2.5: complete--- php5-mcrypt-5.2.5 -------------------You can enable this module by creating a symboliclink from /var/www/conf/php5.sample/mcrypt.ini to/var/www/conf/php5/mcrypt.ini.

ln -fs /var/www/conf/php5.sample/mcrypt.ini /var/www/conf/php5/mcrypt.ini

# ln -fs /var/www/conf/php5.sample/mcrypt.ini ↵ /var/www/conf/php5/mcrypt.ini

# pkg_add -v php5-mhash

# /usr/local/bin/mysql_install_db

echo -n "."fidone## Создаем MySQL-сокет в chroot-окружении Apachemkdir -p /var/www/var/run/mysqlsleep 2ln -f /var/run/mysql/mysql.sock ↵ /var/www/var/run/mysql/mysql.sockfi

Ambiguous: choose package for php5-gd 0: <None> 1: php5-gd-5.2.5 2: php5-gd-5.2.5-no_x11

Page 37: 067 Системный Администратор 06 2008

35№6, июнь 2008

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

При весьма умеренной стоимос-ти, Handy Backup Server соче-тает в себе самые современ-

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

Взаимодействие серверной час-ти Handy Backup Server с рабочими станциями осуществляется при помо-щи программ-агентов, дающих дос-туп к данным на компьютерах-клиен-тах прямо из приложения. Стандартная лицензия включает 20 агентов для ус-тановки на рабочие станции.

Помимо резервирования пользо-вательских файлов, программа вы-полняет автоматический поиск, копи-рование и восстановление информа-ции, как правило, хранимой на сер-верах – баз и конфигураций «1С», групп хранения MS Exchange и Lotus

Notes, баз данных MySQL, MS Access, FoxPro, MS SQL и других, совмес-тимых с протоколом ODBC. Причем в случае с MS SQL, базы копируют-ся как по протоколу ODBC, так и с ис-пользованием «родного» Microsoft API. Такой способ позволяет избегать оши-бок и дает возможность скопировать всю базу целиком, включая таблицы, хранимые процедуры, функции, паке-ты и триггеры.

Handy Backup Server предлага-ет системному администратору пол-ный набор инструментов, делающих резервное копирования корпоратив-ной информации быстрым, безопас-

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

Получить подробную информацию о программе, а также загрузить про-бную версию можно на сайте продук-та по адресу http://www.handybackup.ru/handybackup-server.shtml.

Handy Backup Server – решение проблемы резервного копирования для малого и среднего бизнеса

Программа резервного копирования корпоративной информации Handy Backup Server компании «Новософт» представляет собой мощное серверное решение для защиты данных в Windows-сетях малых и средних предприятий.

Page 38: 067 Системный Администратор 06 2008

36

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

Btrfs, о начале разработки ко-торой было объявлено в июне 2007 года, находится сейчас

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

Посмотрим подробнее, что имен-но предлагает пользователям Chris Mason – основной разработчик btrfs:n Поддержка доступных на запись

снапшотов.

n Поддержка субтомов – множест-венных именованных корней в од-ной файловой системе с общим пу-лом хранения.

n Поддержка сложных многодиско-вых конфигураций – RAID уровней 0, 1, 5, 6 и 10, а также реализация различных политик избыточности на уровне объектов ФС – то есть возможно назначить, к примеру, зеркалирование для какого-либо каталога или файла.

n Copy-on-write (COW)-журналирова-ние.

n Контроль целостности блоков дан-ных и метаданных с помощью кон-трольных сумм.

n Зеркалирование метаданных даже в однодисковой конфигурации.

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

Btrfs от Oracle: наш ответ ZFS

Андрей Пешеходов

Файловая система ZFS от Sun Microsystems, вышедшая в 2005 году, явилась настоящим прорывом в области архитектуры универсальных файловых систем общего назначения. Однако цели и задачи, которые ставят перед собой разработчики новой файловой системы btrfs от компании Oracle, впечатляют даже после знакомства с особенностями ZFS, которую, казалось бы, никто не сможет превзойти еще много лет.

Page 39: 067 Системный Администратор 06 2008

37№6, июнь 2008

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

ные проблемы с производительностью. В btrfs распре-деленное блокирование реализовано для верхних уров-ней всех B-деревьев. Алгоритмы обработки метаданных продуманы таким образом, чтобы не удерживать блоки-ровки на разделяемых данных во время ожидания вво-да/вывода. В ZFS этому вопросу также уделено серьез-ное внимание.

n Поддержка ACL.n Защита от потери данных.n Выбор хэш-алгоритма.n Поддержка NFS.n Флаги совместимости, необходимые для изменения

дискового формата в новых версиях btrfs с сохранени-ем совместимости со старыми.

n Резервные копии суперблока, по крайней мере – по од-ной на устройство.

n Скоростные приоритеты для дисков. Диск-итемы btrfs (своего рода дескрипторы дисков пула; их роль и струк-тура будут показаны ниже) имеют поля для хранения по-казателей производительности устройства. Эти счетчи-ки учитываются при выборе устройства для размеще-ния данных того или иного типа. Аллокатор также стре-мится выбирать наименее занятый диск для равномер-ного распределения нагрузки по всему пулу.

n Гибридные пулы. btrfs старается перемещать наиболее используемые данные на самое быстрое устройство, вытесняя с него «залежавшиеся» блоки. Эта полити-ка хорошо согласуется с появившейся недавно моде-лью использования SSD (Solid State Drive). В частности, компания Sun Microsystems планирует c 2008 года на-чать выпуск серверов с небольшими SDD, используе-мыми в качестве быстрой памяти для наиболее «попу-лярных» данных. К слову сказать, в ZFS возможности приоретизации дискового трафика не предусмотрено, поэтому Sun вынуждена будет реализовывать ее на бо-лее высоких уровнях, теряя универсальность такого ре-шения. Справедливости ради стоит заметить, что под-держка приоритетов устройств может быть относитель-но легко добавлена и в ZFS – правда, ценой изменения дискового формата.

n Балансировка данных между устройствами в btrfs воз-можна сразу после добавления диска к пулу, отдельной командой – а не только постепенно, в процессе исполь-зования (как это реализовано в ZFS).

n Диски для горячей замены, поддержка которых появи-лась и в ZFS.

n Онлайн-конфигурирование RAID будет реализова-но на уровне объектов файловой системы – субтомов, снапшотов, файлов. Возможно будет также устанавли-вать некоторые параметры ввода-вывода для катало-гов – с наследованием этих свойств всеми дочерними объектами.

n Выделение и резервирование objectid. В настоящее время вновь выделенный objectid (аналог номера inode) представляет собой число, равное последнему objectid+1. Более оптимальным будет резервирование диапазона objectid каждым каталогом, для чего планируется вес-ти специальный итем (итемом здесь называется объ-ект B-дерева, инкапсулирующий какие-либо сторонние,

не относящиеся к самому дереву данные). Код выделе-ния inode также должен искать «дыры» в пространстве ключей, а не просто инкрементировать последний.

n Производительность вызова fsync(), фиксирующего на диск все «грязные» данные, является для btrfs боль-шей проблемой, нежели для других ФС, т.к. объем по-бочного дискового трафика (за счет множества мета-данных, разбросанных по разным B-деревьям) достаточ-но велик. Решением проблемы видится создание свое-образного журнала логических операций и частичный сброс только пользовательских данных. При частичной фиксации вызов fsync() будет сбрасывать на диск изме-нившиеся части только одного дерева, занося информа-цию об остальных модификациях в особый итем дерева корней. Смонтированная после крэша ФС будет считы-вать эти данные и вносить оставшиеся изменения уже во время эксплуатации пула, незаметно для пользова-теля.

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

n Конвертер из ext2/3/4.

ДизайнBtrfs реализована на простых и хорошо известных меха-низмах. Все они должны давать хороший результат и сра-зу после mkfs, но более важным разработчики сочли сохра-нение хорошей производительности на старой, интенсив-но используемой файловой системе.

Btrfs, как и подавляющее большинство современных файловых систем, начинается с суперблока, отстоящего на 16 Кб от начала диска. Его структура описана в ctree.h:

Устройства файловой системы описываются dev-итема-

/* * Суперблок btrfs — по сути, список всех B-деревьев пула */struct btrfs_super_block { u8 csum[BTRFS_CSUM_SIZE]; /* контрольная сумма */ u8 fsid[16]; /* UUID файловой системы */ __le64 bytenr; /* номер этого блока */ __le64 flags;

__le64 magic; /* 8 байт, "_B5RfS_M" */ __le64 generation; /* ID транзакции */ __le64 root; /* указатель на дерево корней */ __le64 chunk_root; /* указатель на дерево сегментов */ __le64 total_bytes; /* размер ФС в байтах */ __le64 bytes_used; /* использовано байт */ __le64 root_dir_objectid; /* objectid корневого * каталога */ __le64 num_devices; /* количество устройств в пуле */ __le32 sectorsize; /* размер сектора */ __le32 nodesize; /* размер узла дерева */ __le32 leafsize; /* размер листа дерева */ __le32 stripesize; __le32 sys_chunk_array_size; u8 root_level; /* глубина основного дерева ФС */ u8 chunk_root_level; /* глубина дерева сегментов */ struct btrfs_dev_item dev_item; /* дескриптор этого * устройства */ char label[BTRFS_LABEL_SIZE]; /* символьная метка * ФС */ u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];};

Page 40: 067 Системный Администратор 06 2008

38

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

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

Все остальные метаданные btrfs являются частью ка-кого-либо B-дерева. Причем количество деревьев гораз-до меньше количества типов метаданных – т.е. во многих из них хранятся объекты различных, но логически связан-ных классов. Это напоминает архитектуру reiser4 – когда вся файловая система, по сути, является одним большим B-деревом, состоящим из данных и метаданных всех раз-новидностей.

Как будет показано позже, это далеко не последнее сходство btrfs с файловыми системами компании NameSys.

Структура B-дереваРеализация B-дерева btrfs (это классическое B+ дерево с данными в листьях и указателями в узлах) обеспечива-ет базовую функциональность для эффективного хране-ния и поиска большого количества типов данных. Btree-код знает только о трех структурах: ключи, итемы и заголовки блоков (см. ctree.h):

Внутренние узлы дерева содержат только пары ключ-

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

Заголовок блока дерева содержит контрольную сум-му содержимого блока, UUID (Universally Unique Identifier – универсальный уникальный идентификатор стандарта OSF DCE) файловой системы, которой принадлежит блок, уро-вень блока в дереве и смещение, по которому блок распо-лагается на диске. Эти поля позволяют проверить целост-ность метаданных при чтении. В будущем планируется так-же хранить здесь 64-битный sequence-номер, который бу-дет содержаться также и в родительском для данного блока узле. Это позволит файловой системе обнаруживать и ис-правлять фантомные записи на диск (когда блок пишется по ошибочным координатам). Контрольная сумма дочерне-го узла не хранится в его родителе для упрощения отката транзакции. Sequence-номер будет эквивалентен времени вставки блока в дерево, в то время как контрольная сумма вычисляется еще до размещения блока и к тому же меня-ется при каждой модификации блока.

Поле generation соответствует ID транзакции, в рамках которой был размещен или переразмещен данный блок. Оно позволяет легко поддерживать инкреметальные бэ-капы (снапшоты) и подсистему COW-транзакций – совер-шенно так же, как это сделано в ZFS.

Структуры данных файловой системыКаждый объект файловой системы имеет objectid, динами-чески выделяемый при его создании. Свободный objectid – просто «дыра» в пространстве ключей B-дерева файло-вой системы. Поле offset ключа хранит логическое смеще-ние данных в пределах описываемого объекта. Например, для файловых экстентов это будет смещение экстента от начала файла. Поле type содержит идентификатор типа итема, а также зарезервированное пространство для рас-ширения в будущем.

InodesInodes хранятся в структуре btrfs_inode_item (ctree.h), по-ле offset ключа inode-итема всегда равно нулю, поле type – единице. Таким образом, математически, ключ inode-итема всегда наименьший для данного объекта. Inode-итем, оче-видно, хранит традиционные stat-данные:

/* * Каждый блок дерева (листовой или внутренний) начинается * с заголовка блока */struct btrfs_header { u8 csum[BTRFS_CSUM_SIZE]; /* контрольная сумма * блока */ u8 fsid[BTRFS_FSID_SIZE]; /* UUID файловой системы, * содержащий блок */ __le64 bytenr; /* адрес блока на диске */ __le64 flags; u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; /* UUID дерева * сегментов * (см. ниже) */ __le64 generation; /* ID транзакции */ __le64 owner; /* ссылка на родителя блока */ __le32 nritems; /* количество итемов в блоке */ u8 level; /* уровень блока в дереве */};

/* Ключ */struct btrfs_key { u64 objectid; u8 type; u64 offset;};

/* Итем */struct btrfs_item { struct btrfs_disk_key key; /* Ключ */ __le32 offset; /* Смещение пакета данных в листе */ __le32 size; /* Длина пакета данных */};

struct btrfs_inode_item { __le64 generation; /* ID транзакции создания файла */ __le64 size; /* Размер файла в байтах */ __le64 nblocks; /* Количество занимаемых блоков */ __le64 block_group; /* Предпочитаемая группа блоков */ __le32 nlink; /* Счетчик ссылок на файл */ __le32 uid; /* UID владельца */ __le32 gid; /* GID владельца */ __le32 mode; /* Маска типа и прав доступа */ __le64 rdev; /* [minor:major] для устройств */ __le16 flags; /* Флаги */ __le16 compat_flags; /* Флаги */ struct btrfs_timespec atime; /* Времена доступа, * модификации, * и т. д. */ struct btrfs_timespec ctime; struct btrfs_timespec mtime; struct btrfs_timespec otime;};

struct btrfs_dev_item { __le64 devid; /* ID устройства */ __le64 total_bytes; /* размер устройства */ __le64 bytes_used; /* использовано байт */ __le32 io_align; /* оптимальное выравнивание */ __le32 io_width; /* оптимальная пропускная * способность */ __le32 sector_size; /* размер сектора диска */ __le64 type; /* тип устройства */ __le32 dev_group; /* информация о группе */ u8 seek_speed; /* скорость перемещения головки * диска */ u8 bandwidth; /* максимальная полоса пропускания */ u8 uuid[BTRFS_UUID_SIZE]; /* UUID файловой системы, * которой принадлежит * диск */};

Page 41: 067 Системный Администратор 06 2008

39№6, июнь 2008

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

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

ФайлыСодержимое маленьких файлов (размером не более бло-ка) может храниться прямо в B-дереве, в данных экстент-итема. В этом случае поле offset ключа экстент-итема хра-нит смещение данных внутри файла, а поле size структу-ры btrfs_item показывает, сколько места в листе занимает данный итем. Таких своеобразных экстент-итемов может быть несколько на файл.

Большие файлы хранятся в экстентах. Структура btrfs_file_extent_item содержит ID транзакции размещения экстента (поле generation) и пару [смещение,длина], опи-сывающую его положение на диске. Эскстент также хра-нит логические смещения и длину в уже существующем экстенте. Это позволяет btrfs безопасно писать в середи-ну длинного экстента без предварительного перечитыва-ния старых данных файла (относящихся к предыдущему снапшоту, к примеру).

Контрольные суммы данных файла хранятся в B-де-реве в csum-итеме с соответствующим objectid (структура btrfs_csum_item, ctree.h). Поле offset ключа csum-итема ука-зывает на смещение защищаемого пакета данных от нача-ла файла. Один такой итем может хранить несколько кон-трольных сумм. Csum-итем используется только для фай-ловых экстентов, встроенные в дерево маленькие файлы защищаются контрольной суммой в заголовке блока. Если csum-итем для некоторого пакета данных не представлен, пакет считается не инициализированным – при чтении воз-вращается блок нулей (в будущем поведение в этом случае будет выбираться пользователем при создании ФС – мо-жет возвращаться также код ошибки EIO).

КаталогиКаталоги btrfs индексируются двумя способами. Для по-иска по имени файла используется индекс, составлен-ный из objectid каталога, константы BTRFS_DIR_ITEM_KEY и 64-битного хэша имени. По умолчанию использует-

ся TEA-хэш, но могут быть добавлены и другие алгоритмы (определяется по полю flags в inode каталога). Второй спо-соб индексирования используется вызовом readdir(), воз-вращающем данные в порядке возрастания номеров inodes, приближенном к порядку следования блоков на диске (со-гласно принятой политике размещения). Этот способ дает большую производительность при чтении данных больши-ми пакетами (бэкапы, копирование и т. д.), а также позво-ляет быстро проверить линковку inode с каталогом (подсчет количества ссылок на файл при fsck). Этот индекс состо-ит из objectid каталога, константы BTRFS_DIR_INDEX_KEY и inode objectid.

Учет ссылок на экстентыУчет ссылок на объекты – основа любой файловой систе-мы с поддержкой снапшотов. Для каждого экстента, вы-деленного дереву или файлу, btrfs записывает количество ссылок в структуре btrfs_extent_item. Деревья, хранящие эту информацию, служат также картами размещенных эк-стентов файловой системы. Некоторые деревья не поддер-живают учета ссылок и защищаются только COW-журна-лированием. Однако структура экстент-итемов одинакова для всех выделенных блоков.

Группы блоковГруппы блоков позволяют оптимизировать аллокатор путем разбиения диска на участки длиной от 256 Мб. Для каждо-го участка доступна информация о свободных блоках. По-ле block_group каждого inode хранит номер предпочита-емой группы блоков, в которой btrfs будет стараться раз-местить новые данные объекта. Группа блоков – надстрой-ка над сегментом (см. ниже), позволяющая быстро оценить количество свободного пространства и тип (данные/мета-данные) без обращения к дереву сегментов, которое про-исходит, когда найден сегмент, располагающий достаточ-ным пространством и подходящим типом.

Группа блоков имеет флаг, показывающий, данные или метаданные она хранит. При создании ФС 33% групп блоков выделяются под метаданные, 66% – под данные. При заполнении диска это предпочтение может быть пере-смотрено, однако в любом случае btrfs старается избежать смешивания данных и метаданных в одной группе блоков. Это решение существенно улучшает производительность fsck и уменьшает количество перемещений головок диска при отложенной записи ценой небольшого увеличения ко-личества перемещений при чтении.

Деревья свободных экстентовДеревья свободных экстентов, в том числе, служат btrfs для разбиения доступного дискового пространства на учас-тки с различными политиками выделения блоков. Каждое дерево экстентов владеет сегментом указанного диска, блоки которого могут быть выделены объектам различ-

struct btrfs_file_extent_item { __le64 generation; u8 type; /* * Дисковое пространство, используемое экстентом. * Блоки конторольных сумм включены */ __le64 disk_bytenr; __le64 disk_num_bytes;

/* * Логиическое смещение данного экстента в файле * (без учета блоков контрольных сумм). Это позволяет * экстент-итему указывать в середину существующего * экстента, разделяя его между двумя снапшотами * (если в новом снапшоте изменились данные) */ __le64 offset;

/* Логическое количество блоков (без учета * контрольных сумм)*/ __le64 num_bytes;};

struct btrfs_block_group_item { __le64 used; /* использовано блоков */ __le64 chunk_objectid; /* objectid соответствующего * сегмента */ __le64 flags; /* флаги */}

Page 42: 067 Системный Администратор 06 2008

40

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

ных субтомов. Политики будут определять, каким образом распределять данные по доступным деревьям экстентов, позволяя пользователю назначать зеркалирование, рас-пределение данных (strippping) или квотирование различ-ных частей диска.

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

Обратные ссылкиОбратные ссылки в btrfs служат для:n учета всех владельцев ссылки на экстент для коррект-

ного его освобождения;n обеспечения информации для быстрого поиска ссыла-

ющихся на данный экстент объектов, если некоторый блок нуждается в исправлении или переразмещении;

n упрощения перемещения блока при урезании ФС и дру-гих операциях управления пулом.

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

Структура обратной ссылки такова (ctree.h):

При выделении файлового экстента эти поля заполня-ются следующей информацией: objectid корня субтома, id транзакции, inode objectid и смещение в файле. При захва-те ссылки на лист новая обратная ссылка добавляется для каждого файлового экстента. Это похоже на создание эк-стента, однако поле generation инициализируется иденти-фикатором текущей транзакции.

При удалении файлового экстента или некоторого снапшота находится и удаляется соответствующая обрат-ная ссылка.

Обратные ссылки на btree-экстентыСсылки на btree-экстенты могут захватывать следующие объекты:n различные субтома;n разные поколения одного субтома.

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

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

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

В некоторых деревьях btrfs учет обратных ссылок не ве-дется: например, в деревьях экстентов и корней. Обратные ссылки в этих деревьях всегда имеют поле generation=0.

При размещении блока дерева создается обратная ссылка:n objectid корня субтома;n id транзакции или ноль;n уровень узла;n наименьший objecid узла.

Уровень хранится в поле objectid структуры btrfs_extent_ref, так как максимальный уровень равен 255, а минимальный objectid 256. Таким образом btrfs отличает файловые обрат-ные ссылки от btree-ссылок.

Если ссылка на блок захватывается неким объектом, в дерево также вставляется обратная ссылка с соответс-твующими данными о владельце и транзакции.

Построение ключа обратной ссылкиОбратная ссылка имеет четыре 64-битных поля, которые хэ-шируются в единственно 64-битное значение, что помеща-ется в поле offset ключа. Поле objectid ключа соответству-ет ID описываемого объекта, а поле type инициализирует-ся константой BTRFS_EXTENT_REF_KEY.

Снапшоты и субтомаСубтома представляют собой именованные B-деревья, со-держащие иерархию файлов и каталогов, и имеют inodes в дереве корней. Субтом может быть ограничен квотой на количество блоков; на все блоки и файловые экстенты, при-надлежащие субтому, ведется учет ссылок для поддержки снапшотов. Предельное количество субтомов в файловой системе btrfs – 264.

Снапшоты по внутренней структуре идентичны субто-мам, однако их корневой блок изначально разделяется с другим (родительским) субтомом. Когда снапшот создан, файловая система увеличивает количество ссылок на кор-невой блок, и далее подсистема COW-транзакций фикси-рует изменения, сделанные в корневых блоках субтома и снапшота, уже в разных местах. Снапшоты btrfs доступ-ны на запись и бесконечно рекурсивны. При необходимос-ти создания read-only снапшота его блочная квота устанав-ливается в единицу сразу при инициализации.

Корни B-деревьевКаждая файловая система формата btrfs состоит из нес-кольких корней B-деревьев. Только что созданная ФС име-ет корни для:n дерева корней;n дерева выделенных экстентов;n дерева default-субтома.

Дерево корней содержит корневые блоки для дерева эк-

struct btrfs_extent_ref { __le64 root; /* objectid корня субтома */ __le64 generation; /* номер поколения дерева, * владеющего ссылкой */ __le64 objectid; /* objectid файла, владеющего * ссылкой */ __le64 offset; /* смещение в файле */};

Page 43: 067 Системный Администратор 06 2008

41№6, июнь 2008

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

стентов, а также корневые блоки и имена деревьев для каж-дого субтома и снапшота в ФС. При фиксации транзакции указатели на корневые блоки обновляются по COW-семан-тике в этом дереве, и его новый корневой блок записыва-ется в суперблок btrfs.

Дерево корней организовано в виде каталога всех дру-гих деревьев файловой системы и имеет directiry-итемы для хранения имен снапшотов и субтомов. Каждый субтом имеет objectid в этом дереве и не менее одной структуры btrfs_root_item. Directory-итемы отображают имена субто-мов на их root-итемы Так как ключ root-итема обновляется на каждой транзакции, directory-итем ссылается на номер поколения, что позволяет всегда найти наиболее новую вер-сию какого-либо корня. Структура root-итема (ctree.h):

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

Суперблок btrfs указывает на дерево корней, которое, в свою очередь, содержит указатели на деревья свободных экстентов и субтомов (субтома хранятся в root-итемах). Де-рево корней также имеет указатель на каталог, отобража-ющий имена субтомов на root-итемы в дереве корней. По-казанная файловая система имеет один субтом с именем «default» и один его снапшот с именем «snap» (см. рис. 1).

Многодисковые конфигурацииBtrfs, как и основной ее аналог – ZFS – поддерживает ор-ганизацию сложных пулов хранения из нескольких дисков. Основные ее возможности в этой области таковы:n зеркалирование метаданных в конфигурации до N зер-

кал (N>2);n зеркалирование метаданных на одном устройстве;n зеркалирование экстентов данных;n обнаружение ошибок записи с помощью контрольных

сумм и их коррекция из зеркальной копии;n распределенные (stripped) экстенты данных;n различные политики зеркалирования на одном уст-

ройстве;n эффективное перемещение данных между устройства-

ми;n эффективное переконфигурирование хранилища;n динамическое выделение пространства для каждого

субтома.

Если бы btrfs полагалась на device mapper или MD для ре-

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

В настоящее время btrfs поддерживает конфигурации RAID0, RAID1 и RAID10, реализация RAID5 и RAID6 запла-нирована.

Сегменты (storage chunks)Сегментом btrfs называется обособленный участок диска с логической адресацией. Все указатели на экстенты ра-ботают с сегментными адресами вместо физических дис-ковых. Суперблок имеет особую секцию, отображающую сегменты на дисковые адреса через дерево сегментов. Код сегментации – единственная часть btrfs, имеющая де-ло с физическими адресами. Весь остальной драйвер ра-ботает с сегментами.

Каждый сегмент располагает пространством, выде-ленным с одного или нескольких устройств, для реализа-ции зеркала или распределенного хранилища (stripe). Ми-нимальный размер сегмента btrfs равен 256 Мб, средний – 1/100 объема устройства.

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

Разрешение сегментных адресовКаждому устройству, добавляемому к файловой системе, назначается 64-битный идентификатор (device id). Инфор-мация обо всех устройствах пула отсортирована по device id в особом B-дереве. Каждый корень дерева в ФС свя-зан с единственным деревом сегментов для разрешения

struct btrfs_root_item { struct btrfs_inode_item inode; /* inode-описатель */ __le64 root_dirid; /* obhectid основного дерева * субтома */ __le64 bytenr; /* размер */ __le64 byte_limit; /* квота */ __le64 bytes_used; /* использовано байт */ __le32 flags; __le32 refs; /* количество ссылок */ struct btrfs_disk_key drop_progress; u8 drop_level; u8 level;};

Рисунок 1. B-деревья btrfs

Page 44: 067 Системный Администратор 06 2008

42

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

сегментных адресов. ID сегмента продублирован в каж-дом блоке дерева, поэтому может использоваться во вре-мя fsck.

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

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

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

Устройства в файловой системе могут быть удалены или сбалансированы благодаря перемещению сегментов. На вновь добавленное устройство могут быть перенесены существующие сегменты с других дисков (для балансиров-ки нагрузки). Диск может использоваться и только для но-вых размещений.

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

Разрешение ID дисковИдентификатор устройства хранится в суперблоке диска. Устройства ска-нируются утилитой btrfsctl для постро-ения списка дисков, назначенных фай-ловой системе с данным UUID. Дере-вья сегментов также хранят инфор-мацию о каждом из устройств, так что корректность списка может быть проверена во время монтирования (см. рис. 2).

Btrfs для администратораПопробуем btrfs в работе. Исходные тексты модуля ядра и утилит стабиль-ной на данный момент версии 0.14 до-ступны по ссылке [2].

Модуль ядра собираем и уста-навливаем так (не забываем, что он зависит от CONFIG_LIBCRC32C):

Набор утилит btrfs-progs использует libuuid, которая вхо-дит в состав e2fsprogs – то есть при сборке нужны соответ-ствующие заголовки. В дистрибутивах необходимый пакет называется e2fsprogs-devel или libuuid-devel. Сборка btrfs-progs производится вполне привычно:

Теперь попробуем создать и смонтировать файловую систему на одном диске – здесь все вполне традиционно:

mkfs.btrfs можно использовать с опциями:n -b, --byte-count – задает размер файловой системы;n -l, --leafsize – задает размер листового узла дерева;n -n, --nodesize – задает размер внутреннего узла дере-

ва;n -s, --sectorsize – задает размер минимального выделяе-

мого элемента (не менее физического сектора диска).

Монтируем субтом default (создается по умолчанию):

Можно смонтировать не какой-либо субтом, а все де-рево корней:

Тогда содержимое субтома default окажется в папке /mnt/test/default. Создать новый субтом можно командой:

Рисунок 2. Трансляция сегментных адресов

make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD ↵ modulesmake -C /lib/modules/`uname -r`/build SUBDIRS=$PWD ↵ modules_install

makemake install

modprobe btrfsmkfs.btrfs /dev/sda1

mount -t btrfs /dev/sda1 /mnt/test

btrfsctl -s new_subvol /mnt/test

mount -t btrfs /dev/sda1 /mnt/test -o subvol=.

Page 45: 067 Системный Администратор 06 2008

43№6, июнь 2008

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

Видим, что теперь в папке /mnt/test 2 элемента: default и new_subvol. Посмотрим, как btrfs создает снапшоты:

Также с помощью btrfsctl можно поменять размер фай-ловой системы (если она еще не занимает весь диск или в пул было добавлено новое устройство):

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

Создадим btrfs на двух дисках:

Организуем распределенный пул (stripe):

Зеркало:

Этой командой можно создать ФС, не зеркалирующую метаданные на одном диске:

После создания btrfs команде mount можно передавать любой из дисков. Однако следует учитывать, что после вы-грузки модуля btrfs.ko (после перезагрузки в том числе) не-обходимо пройтись по всем дисковым устройствам вашей системы командой:

Или передать ей только используемые устройства:

Команда btrfs-show выдаст список всех обнаружен-ных файловых систем с их UUID и задействованными уст-ройствами.

Добавить новый диск в пул можно так:

Файловую систему можно сбалансировать – то есть рас-пределить часть данных и метаданных между существую-щими и вновь добавленным диском:

Также в btrfs-progs включена программа-конвертер фай-ловой системы из ext3. В версии 0.14 пакета утилит код кон-вертера имеется, однако сборка его по умолчанию отклю-чена, так как безопасно использовать его пока рано. Если риск возможной потери данных вас не пугает, собрать и ис-пользовать его можно так:

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

Конвертер использует libe2fs для чтения метаданных ext3, и размещает метаданные btrfs только в свободных блоках оригинальной файловой системы. Работает он в та-кой последовательности:n копирует первый мегабайт диска в «запас»;n читает каталоги и inodes, создает их копии в btrfs;n вставляет ссылки на блоки данных ext3 в метаданные

btrfs.

Первый мегабайт диска копируется в альтернативное местоположение, на его место записываются метадан-ные btrfs. Остальные блоки, используемые ext3, благода-ря COW-журналированию не перезаписываются. Откат об-ратно к ext3, очевидно, представляет собой восстановле-ние первого мегабайта диска.

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

Смонтируем снапшот ext3:

Смонтируем образ оригинальной ФС:

Выполнить откат можно так:

Если необходимости в откате больше нет и нужно ос-вободить место, занимаемое метаданными ext3, доста-точно удалить файл image в снапшоте ext2_saved. Если есть желание избавиться от всех данных ext3 – удаляем сам снапшот.

1. Официальный сайт проекта – btrfs.wiki.kernel.org.2. Исходники btrfs – www.kernel.org/pub/linux/kernel/people/mason/

btrfs.3. «Архитектура ZFS» – www.filesystems.nm.ru/my/zfs_arch.pdf.

btrfsctl -s new_subvol_snap /mnt/test/new_subvol

btrfsctl -r +4g /mnt/test

mkfs.btrfs /dev/sda1 /dev/sda2

mkfs.btrfs -m raid0 /dev/sda1 /dev/sda2

mkfs.btrfs -m raid1 /dev/sda1 /dev/sda2

mkfs.btrfs -m single /dev/sda1

btrfsctl -a

btrfsctl -A /dev/sda1

mount -t btrfs /dev/sda1 /mnt/test -o subvol=.btrfs-vol -a /dev/sda3 /mnt/test

cd btrfs-progsmake convert./btrfs-convert /dev/sda4

mount -t btrfs /dev/sda4 /mnt/test -o subvol=ext2_saved

mount -t ext3 -o loop /mnt/test/image /mnt/ext3

umount /mnt/ext3umount /mnt/testbtrfs-convert -r /dev/sda4

btrfs-vol -b /mnt/test

Page 46: 067 Системный Администратор 06 2008

44

bugtraq

Множественные уязвимости в GnuTLSПрограмма: GnuTLS версии до 2.2.4.Опасность: Высокая.Описание: 1. Уязвимость существует из-за ошибки провер-ки границ данных при обработке сообщений «Client Hello», содержащих расширение Server Name. Удаленный поль-зователь может с помощью специально сформированного TLS-пакета вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе.

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

3. Уязвимость существует из-за ошибки при обработ-ке знаковых переменных в функции _gnutls_ciphertext2 compressed() в файле lib/gnutls_cipher.c. Удаленный поль-зователь может с помощью специально сформированных TLS-данных вызвать переполнение буфера и аварийно за-вершить работу приложения.URL производителя: www.gnu.org/software/gnutls.Решение: Установите последнюю версию 2.2.5 с сайта производителя.

Переполнение буфера в IBM Lotus SametimeПрограмма: IBM Lotus Sametime 7.5.1Опасность: Высокая.Описание: Уязвимость существует из-за ошибки проверки границ данных в Community Services Multiplexer (StMux.exe) при обработке URL. Удаленный пользователь может с по-мощью слишком длинного HTTP-запроса, отправленного Sametime-серверу, вызвать переполнение стека и выпол-нить произвольный код на целевой системе.URL производителя: www-142.ibm.com/software/sw-lotus/sametime.Решение: Установите исправление с сайта производителя.

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

Переполнение буфера в SambaПрограмма: Samba 3.0.29 и более ранние версии.Опасность: Высокая.Описание: Уязвимость существует из-за ошибки провер-ки границ данных при обработке SMB-пакетов в функции receive_smb_raw() в файле lib/util_sock.c. Удаленный поль-зователь может с помощью слишком длинного SMB-паке-та вызвать переполнение динамической памяти и выпол-нить произвольный код на целевой системе. Для успешной эксплуатации уязвимости злоумышленник должен обманом заставить пользователя подключиться к злонамеренному серверу (нажать на ссылку типа «smb://») или отправить спе-циально сформированные пакеты демону nmbd, сконфигу-рированному как основной браузер домена.URL производителя: www.samba.org.Решение: Установите последнюю версию 3.0.30 с сайта производителя.

Множественные уязвимости в Sun Java System Active Server PagesПрограмма: Sun Java System Active Server Pages 4.0.2, воз-можно, более ранние версии.Опасность: Высокая.Описание: 1. Уязвимость существует из-за того, что неиз-вестный файл, который подключается в различных ASP-при-ложениях, недостаточно проверяет входные данные перед созданием файлов на системе. Удаленный пользователь может создать и изменить произвольные файлы на систе-ме. Для успешной эксплуатации уязвимости требуется дос-туп к административному серверу (порт 5100/TCP).

2. Уязвимость существует из-за того, что пароли и кон-фигурационные данные хранятся в корневой директории веб-сервера. Удаленный пользователь может получить доступ к потенциально важным данным, включая хеши паролей пользователей. Для успешной эксплуатации уяз-вимости требуется доступ к административному серверу (порт 5100/TCP).

3. Уязвимость существует из-за недостаточной об-работки входных данных в некоторых ASP-приложени-ях. Удаленный пользователь может с помощью специаль-но сформированного HTTP-запроса, содержащего симво-лы обхода каталога, просмотреть или удалить произволь-ные файлы на системе. Для успешной эксплуатации уяз-вимости требуется доступ к административному серверу (порт 5100/TCP).

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

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

6. Уязвимость существует из-за ошибки дизайна при об-работке аутентификации. Удаленный пользователь может отправить специально сформированные запросы на порт 5102/TCP и обойти процесс аутентификации.URL производителя: www.sun.com/software/chilisoft /index.xml.Решение: Установите последнюю версию 4.0.3 с сайта про-изводителя.

Уязвимость в реализации Secure Shell в Cisco IOSПрограмма: Cisco IOS 12.4.Опасность: Средняя.Описание: Множественные уязвимости существуют из-за ошибок в реализации SSH. Удаленный пользователь мо-жет вызвать перезагрузку устройства.URL производителя: ww.cisco.comРешение: Установите исправление с сайта производителя, доступное для зарегистрированных клиентов.

Page 47: 067 Системный Администратор 06 2008

45№6, июнь 2008

закон есть закон

Какие документы нужны, чтобы подтвердить право на использова-ние свободного ПО? Не раз встречал упоминания, что нужны нотариаль-но заверенные переводы открытых лицензий и пр.Для подтверждения права на исполь-зование свободного программного обеспечения предпочтительнее сде-лать нотариально заверенный перевод лицензий используемого программно-го обеспечения. Заверение перевода производится в соответствии со ст. 81 Основ законодательства РФ о нотари-ате. К переводу прилагается текст ли-цензии на английском языке.

Сейчас очень часто можно услы-шать мнение о том, что после введе-ния в действие четвертой части ГК РФ лицензии на свободное программное обеспечение на территории России применяться не могут. Мотивируется такой ответ ссылкой на п. 5 ст. 1235 ГК РФ, в соответствии с которым лицензи-ат обязуется уплатить лицензиару ука-занное в лицензионном договоре воз-награждение, если договором не пре-дусмотрено иное. Однако из анализа процитированной выше статьи следу-ет возможность заключения как воз-мездных, так и безвозмездных лицен-зионных договоров. Для действитель-ности данного договора в нем должна

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

Свободное программное обеспе-чение может быть приобретено по договору (коробочный вариант, диск с программой и пр.). При этом лицен-зия GPL не запрещает взимать плату за передачу экземпляра программы и оказание услуг по гарантийной под-держке программы. Если свободное программное обеспечение передава-лось по договору с российской орга-низацией, то должны прилагаться: до-говор; накладные; акты приемо-пере-дачи программного обеспечения; до-кументы, подтверждающие факт оп-латы по договору; а также лицензии на программное обеспечение с их пе-реводом на русский язык.

Если свободное ПО было скачано из Глобальной сети, как быть в этом случае?Теперь рассмотрим вариант, когда сво-бодное программное обеспечение ска-чивается из Глобальной сети. На такое программное обеспечение нужно сде-лать перевод используемых лицензий (предпочтительнее нотариально заве-ренный) с приложением текста лицен-зий на английском языке; распеча-

тать страницу сайта, с которой произ-водилось его скачивание; рекомендую также записать ссылки. Обычно сай-ты, с которых можно скачать свобод-ное программное обеспечение, имеют раздел, в котором описываются права на использование скачиваемых с сай-та программ (раздел legal). Рассмот-рим на примере продукта фирмы – Ubuntu: http://www.ubuntu.com/legal, указанная ссылка приведет пользо-вателя к разделу, регламентирующе-му права на распространяемое про-граммное обеспечение. Данная стра-ница вместе со страницей, с которой производилось скачивание, распеча-тывается, переводится, перевод жела-тельно заверить нотариально.

Остается разобрать еще один воп-рос. В тексте GPL прописано, что юри-дическую силу для сторон имеет толь-ко английский текст лицензии, соот-ветственно перевод текста на русский язык носит рекомендательный харак-тер. Согласно действующему зако-нодательству государственным язы-ком в России является русский язык, но иностранные языки могут приме-няться в коммерческой деятельнос-ти организации. Такое использова-ние иностранного языка определяет-ся договорами с деловыми партнера-ми фирмы (ст. 22 ФЗ «О языках наро-дов РФ»). А поскольку, скачивая и ус-танавливая программу, мы принима-ем условия лицензии, по которой она распространяется, то юридически мы присоединяемся к лицензионному до-говору, по которому она распростра-няется.

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

Рубрику ведет юрист Юлия Штокало

Присылайте Ваши вопросы по адресу [email protected] или оставляйте на фо-руме журнала www.samag.ru/forum.

Page 48: 067 Системный Администратор 06 2008

46

администрирование «1С»

Технологический журнал «1С:Предприятие 8.1»

Андрей Луконькин

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

Page 49: 067 Системный Администратор 06 2008

47№6, июнь 2008

администрирование «1С»

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

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

Файлы журнала имеют текстовый формат, каждый файл содержит со-бытия за 1 час.

Технологический ж урнал мо -жет вестись на любом компьютере, на котором инсталлирована система «1С:Предприятие 8.1».

За параметры ведения технологи-ческого журнала отвечает конфигу-рационный файл logcfg.xml, в котором описываются:n каталог, в котором будут распола-

гаться файлы технологического журнала;

n состав информации, которая бу-дет помещаться в технологичес-кий журнал;

n время, в течение которого хранят-ся файлы технологического журна-ла;

n параметры дампа, создаваемого при аварийном завершении при-ложения.

Файл logcfg.xml должен быть по-мещен в подкаталог conf каталога за-грузочных модулей «1С:Предприятие» (обычно это каталог C:\Program Files\1cv81\bin).

Если файл logcfg.xml отсутствует или содержит ошибки, то технологи-ческий журнал считается выключен-ным и не создается. Следует избегать использования комментариев (конст-рукции типа <!-- содержание коммен-тария -->).

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

Состав конфигурационного файла logcfg.xmlПо мере выхода новых версий плат-формы «1С:Предприятие» отслежи-ваемые события могут меняться и до-полняться, но общий принцип структу-ры остается единым.

Элемент <config> определяет на-стройки технологического журнала. Он может содержать несколько эле-ментов <log> и один элемент <dump>.

Элемент <log> определяет каталог технологического журнала. Его атри-бут location – это имя каталога, в кото-ром будет размещаться технологичес-кий журнал. Атрибут history – это коли-чество часов, через которое информа-ция будет удаляться из технологичес-кого журнала.

Например:

Это означает, что файлы будут хра-ниться 12 часов в каталоге c:\1c8logs.

Элемент <dump> определяет ката-лог для записи дампов аварийного за-вершения программы. Чтобы отклю-чить запись дампов, нужно в элементе <dump> установить значение парамет-ра «create = "0"» или «create = "false"».

В элемент <log> могут быть вложе-ны элементы <event> и <property>, сос-тав которых определяет условие за-писи в журнал каждого события и ус-ловия записи каждого свойства со-бытия.

Событие включается в журнал, ес-ли оно удовлетворяет всем услови-ям внутри хотя бы одного из элемен-тов <event>. Условия задаются эле-ментами:n eq – равно;n ne – не равно;n gt – больше;n ge – больше или равно;n lt – меньше;n le – меньше или равно;n like – соответствие маске.

Например:

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

Возможные имена групп событий смотрите в таблице.

Элемент <property> определяет ус-ловия попадания в журнал значения ключевого свойства события, имя ко-торого является значением атрибу-та name.

Элемент <property name="all"> </property> включает записи в журнал всех свойств событий.

<config …> <log …> … </log> <log …> … </log> <dump … /></config>

PROC События, относящиеся к процессу целиком и влияющие на дальнейшую работоспособность процесса. Например: старт, завершение, аварийное завершение и т.п.

SCOM События создания или удаления серверного контекста, обычно связанного с информационной базой

EXCP Исключительные ситуации приложений системы «1С:Предприятие 8.1», которые штатно не обрабатываются и могут послужить причиной аварийного завершения серверного процесса или подсоединенного к нему клиентского процесса

EXCPCNTX События, которые начались, но не закончились в момент возникновения нештатной ситуации

SDBL События, связанные с исполнением запросов к модели базы данных «1С:Предприятие 8.1»

QERR События, связанные с обнаружением ошибок компиляции запроса или ограничения на уровне записей и полей базы данных

PERR События, связанные с обнаружением ошибок работы с настройками пользователя

CONN Установка или разрыв клиентского соединения с сервером

ADMIN Управляющие воздействия администратора кластера серверов «1С:Предприятия 8.1»

DBV8DBEng Исполнение операторов SQL файловой СУБД

DBMSSQL Исполнение операторов SQL СУБД Microsoft SQL Server

DBPOSTGRS Исполнение операторов SQL СУБД PostgreSQL

DB2 Исполнение операторов SQL СУБД DB2

CALL Удаленный вызов

TLOCK Управление транзакционными блокировками в управляемом режиме

Возможные имена групп событий

<log location="c:\1c8logs" ↵ history="12">

<event> <eq property="Name" value="PROC"/></event>

Page 50: 067 Системный Администратор 06 2008

48

администрирование «1С»

Используя свойства элемента <property>, в технологи-ческий журнал можно записывать контекст исполнения двух видов: контекст встроенного языка и интерфейсный кон-текст. Чтобы включить запись контекста, нужно среди филь-тров свойств записать элемент <property name="context"> или элемент <property name="all">.

Рассмотрим несколько примеров использования техно-логического журнала.

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

Следующий конфигурационный файл будут регистри-ровать все исключительные ситуации, связанные с блоки-

ровками и ожидания, превысившие 10 секунд (длительность событий выражается в сотнях микросекунд).

Этот конфигурационный файл определяет, что техно-логический журнал будет содержать только обращения «1С:Предприятие» к СУБД и информацию об ошибочных ситуациях.

Файл logcfg.xml легко создается в любом текстовом ре-дакторе, но также можно воспользоваться внешней обра-боткой «Настройка технологического журнала» с диска ИТС (февраль 2008 г.).

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

После редактирования появляется готовый текст кон-фигурационного файла, который можно сохранить или ско-пировать.

ЗаключениеТаким образом, использование технологического журна-ла позволяет зафиксировать широкий спектр действий и событий, а также дает возможность проанализировать возникшие проблемы при работе с «1С:Предприятие». На базе технологического журнала построена вся работа специализированной конфигурации «1С:Центр управле-ния производительностью» (см. выпуск журнала №3(64) за март 2008 года).

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

Рисунок 1. Форма обработки «Настройка технологического журнала»

Рисунок 2. Окно редактирования отслеживаемых событий

<config xmlns="http://v8.1c.ru/v8/tech-log"> <log location="c:\v81\logs" history="8"> <event> <eq property="Name" value="EXCP"/> </event> <event> <eq property="Name" value="TLOCK"/> <gt property="Duration" value="100000"/> </event> <property name="all"/> <property name="Context"> <event> <eq property="Name" value=""/> </event> </property> </log> <dump location="c:\v81\dumps" create="1" type="2"/></config>

<config xmlns="http://v8.1c.ru/v8/tech-log"> <log location="C:\\1cv81\logs" history="8"> <event> <eq property="Name" value="DBV8DBEng"/> </event> <event> <eq property="Name" value="DBMSSQL"/> </event> <event> <eq property="Name" value="DBPOSTGRS"/> </event> <event> <eq property="Name" value="DB2"/> </event> <event> <eq property="Name" value="EXCP"/> </event> <property name="all"> </property> </log></config>

<config xmlns="http://v8.1c.ru/v8/tech-log"> <log location="C:\\1cv81\logs" history="8"> <event> <ne property="Name" value=""/> </event> <property name="all"> </property> </log></config>

Page 51: 067 Системный Администратор 06 2008

49№6, июнь 2008

bugtraq

Несколько уязвимостей в IBM Lotus Domino Web ServerПрограмма: IBM Lotus Domino версии до 7.0.3 Fix Pack 1 (FP1) и 8.0.1.Опасность: Высокая.Описание: 1. Уязвимость существует из-за недостаточ-ной обработки входных данных в сервлете веб-контейне-ра. Удаленный пользователь может с помощью специаль-но сформированного запроса выполнить произвольный код сценария в браузере жертвы в контексте безопаснос-ти уязвимого сайта.

2. Уязвимость существует из-за ошибки проверки гра-ниц данных в Lotus Domino Web Server. Удаленный пользо-ватель может с помощью слишком длинного HTTP-заголов-ка Accept-Language вызвать переполнение стека и выпол-нить произвольный код на целевой системе.URL производителя: www.lotus.com/products/product4.nsf/wdocs/dominohomepage.Решение: Установите последнюю версию 7.0.3 Fix Pack 1 (FP1) или 8.0.1 с сайта производителя.

Переполнение буфера в EvolutionПрограмма: GNOME Evolution 2.22.1, возможно, более ран-ние версии; Novell Evolution 2.22.1, возможно, более ран-ние версии.Опасность: Высокая.Описание: 1. Уязвимость существует из-за ошибки провер-ки границ данных при обработке строк временной зоны, со-держащихся во вложениях iCalendar. Удаленный пользова-тель может с помощью слишком длинной строки вызвать переполнение статического буфера и выполнить произволь-ный код на целевой системе. Для успешной эксплуатации уязвимости плагин ITip Formatter должен быть отключен.

2. Уязвимость существует из-за ошибки проверки гра-ниц данных при ответе на запрос iCalendar при включен-ном виде календаря. Удаленный пользователь может внед-рить слишком длинное свойство DESCRIPTION во вложе-ние iCalendar, вызвать переполнение динамической па-мяти и выполнить произвольный код на целевой систе-ме. Для успешной эксплуатации уязвимости пользователь должен принять запросы iCalendar и ответить на них из ок-на Calendars.URL производителя: www.novell.com/products/desktop/features/evolution.html.Решение: В настоящее время способов устранения уязви-мости не существует. Некоторые производители Linux-сис-тем выпустили исправления.

Переполнение буфера в CA Secure Content ManagerПрограмма: CA eTrust Content Manager 8.0.Опасность: Высокая.Описание: 1. Уязвимость существует из-за ошибки провер-ки границ данных в службе HTTP Gateway (icihttp.exe on port 8080/TCP) при обработке определенных FTP-команд. Уда-ленный пользователь может с помощью слишком длинно-го ответа для команд LIST и PASV вызвать переполнение стека и выполнить произвольный код на целевой системе с привилегиями учетной записи SYSTEM.

2. Уязвимость существует из-за ошибки проверки гра-ниц данных в службе HTTP Gateway (icihttp.exe on port 8080/TCP) во время преобразования списка FTP-директорий и файлов в HTML. Удаленный пользователь может с помо-щью слишком длинной строки вызвать переполнение стека и выполнить произвольный код на целевой системе с при-вилегиями учетной записи SYSTEM.URL производителя: www3.ca.com/Solutions/Product.asp?ID=4673.Решение: Установите исправление с сайта производителя.

Множественные уязвимости в Black Ice Barcode SDKПрограмма: Black Ice Barcode SDK 5.01, возможно, более ранние версии.Опасность: Высокая.Описание: 1. Уязвимость существует из-за использова-ния небезопасного метода DownloadImageFileURL() в BIDIB.BIDIBCtrl.1 ActiveX (BIDIB.ocx)-компоненте. Удаленный поль-зователь может с помощью специально сформированного веб-сайта загрузить злонамеренный файл в произвольную директорию на системе.

2. Уязвимость существует из-за ошибки в BIDIB.BIDIBCtrl.1 ActiveX-компоненте при обработке метода «DownloadImageFileURL()». Удаленный пользователь может с помощью специально сформированного веб-сайта пере-дать уязвимому методу слишком длинные аргументы, вы-звать повреждение памяти и выполнить произвольный код на целевой системе.

3. Уязвимость существует из-за ошибки проверки гра-ниц данных в BITIFF.BITiffCtrl.1 ActiveX (BITiff.ocx)-компонен-те при обработке аргументов в методе SetByteOrder(). Уда-ленный пользователь может с помощью специально сфор-мированного веб-сайта передать слишком длинные ар-гументы уязвимому методу, вызвать переполнение стека и выполнить произвольный код на целевой системе.URL производителя: www.blackice.com/barcode.htm.Решение: В настоящее время способов устранения уязви-мости не существует.

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

Целочисленное переполнение в OpenOfficeПрограмма: OpenOffice 2.4 и более ранние версии.Опасность: Высокая.Описание: Целочисленное переполнение обнаружено в функции rtl_allocateMemory(). Удаленный пользователь может с помощью специально сформированного докумен-та вызвать переполнение динамической памяти и выпол-нить произвольный код на целевой системе.URL производителя: www.openoffice.org.Решение: Установите последнюю версию 2.4.1 с сайта про-изводителя.

Page 52: 067 Системный Администратор 06 2008

50

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

Критикуя Windows (и отчасти Linux) за большое количест-во программных ошибок, мы

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

сили единичный характер и учитыва-лись разработчиками компиляторов. Сейчас они представляют разве что познавательный интерес. Легендар-ный «Hamarsoft's 86BUGS list», насчи-тывающий свыше сотни ошибок, недо-кументированных машинных команд и особенностей их поведения, послед-ний раз обновлялся в 1994 году, пос-ле чего отправился на свалку истории, захлебнувшись в потоке дефектов, об-наруженных в первых моделях Pentium-

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

Возьмем, к примеру, инструкцию битового сканирования «BSF dst, src», копирующую в dst индекс первого ус-

Дефекты проектирования Intel Core 2 DuoАналитический обзор с точки зрения безопасности

Крис Касперски

Процессоры Intel Core 2 Duo (и не только они одни!) содержат множество ошибок, приводящих к сбоям программного обеспечения, зависаниям операционной системы и даже возможности удаленного захвата управления компьютером! Часть ошибок обходится программным путем, часть – обновлением микрокода ЦП или прошивки BIOS, оставшиеся – неисправимы и требуют смены процессора. Насколько реальны эти угрозы? Попробуем разобраться!

Page 53: 067 Системный Администратор 06 2008

51№6, июнь 2008

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

тановленного бита в src. Как вам нра-вится тот факт, что если src равен ну-лю, то содержимое dst становится не-определенным, то есть там может ока-заться любой мусор, что серьезно ос-ложняет отладку программ. Допустим, на машине разработчика установлен ЦП, оставляющий dst неизменным, и разработчик (или его компилятор) закладывается именно на такое пове-дение ЦП. А вот у конечного пользо-вателя dst может сбрасываться в нуль, нарушая работоспособность програм-мы и заставляя разработчика терять-ся в догадках, с какого момента про-грамма пошла разнос. Обычно в таких случаях все списывается на Windows или «у вас на компьютере вирусы, пе-реустановите операционную систему… ах, вы уже ее переустановили?! ну тог-да мы не знаем, разбирайтесь со сво-ей машиной сами».

Кстати, это уже давно не ошиб-ка, а вполне документированная осо-бенность. Intel даже приводит псев-докод команды BSF во втором томе «Instruction Set Reference»:

С такими «особенностями» мож-но еще и смириться, но куда прика-жете девать эпизодически возникаю-щие исключения на 486+, возникаю-щие при загрузке регистра CR3 (указа-тель на каталог страниц) в регистр об-щего назначения? Конечно, непредви-денные исключения можно и подавить, что делает Linux и OpenBSD. Делать-то она это делает, но… местами. А мес-тами не делает. Обращения к регист-ру CR3 происходят из многих функций ядра, а ядро пишет целая армия раз-работчиков, часть из которых осведом-лена об этом дефекте, а часть – даже не подозревает. В результате мы име-ем нестабильно работающую систему.

Windows не пытается сражаться с этим. А зря. Запрещение кэширо-

вания на запись в некоторых моделях процессоров разрушает содержимое кэша, откуда процессор продолжа-ет брать ранее скэшированные дан-ные (уже разрушенные), и чтобы про-грамма не «грохнулась», кэш необхо-димо очистить программным образом, последовательно считывая ячейки па-мяти – неважно какие – лишь бы за-полнить его. Поскольку считываемые данные не были модифицированы, то при последующем поступлении дан-ных в кэш ранее прочитанные ячейки памяти не будут вытесняться ни в кэш вышестоящего уровня, ни в оператив-ную память, замещаясь новыми данны-ми. На прикладном уровне такая ситу-ация, конечно, маловероятна, да и не-льзя на прикладном уровне управлять кэшированием, но вот драйверы сов-сем другое дело! Если некоторый ре-гион памяти используется для обмена данными с внешним устройством (ви-деоконтроллером или платой телемет-рии), владельцы «неправильных» про-цессоров окажутся очень «рады» все-возможным артефактам на экране монитора и неверным телеметричес-ким результатам. Стоит ли удивлять-ся, что x86 не используются в крити-ческих инфраструктурах, где работа-ют простые и тщательно протестиро-ванные микроконтроллеры?

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

Производители ЦП ведут с де-фектами проектирования ожесточен-ную борьбу, прогоняя каждую коман-

ду (а то и комбинации команд) через серию агрессивных тестов, результа-ты которых так или иначе отражаются в документации или же «specification updates». В частности, последние обновления спецификации на Intel Core 2 Duo в любой момент можно скачать с официального сайта Intel: http://www.intel.com/design/core2duo/documentation.htm#specupdt, раздел erraata которого на момент написа-ния этих строк (май 2008) насчитывает 126 ошибок, многие из которых крити-ческие и затрагивают не только ядер-ный, но и прикладной уровень.

Немногим лучше обстоит ситуация с серверными процессорами: Intel Xeon Quad-Core 5400 и его младший собрат Xeon Dual-Core 5100 насчитывают по 54 официально признанных дефекта каж-дый. И даже Itanium 9000, рекомендо-ванный фирмой Intel для критических инфраструктур (massive, mission-critical computing), хранит в своих недрах 85 «жуков», способных обрушить сервер в любой момент. А ведь это одно из са-мых дорогих и тщательно протестиро-ванных произведений Intel, ориентиро-ванное на корпоративный сегмент рын-ка, который ошибок не прощает и на ко-

Ошибка деления в PentiumСамая громкая ошибка в Pentium была об-наружена в 1995 году и продемонстриро-вана на следующем примере: x – (x/y)*y, результат которого (если только y != 0), должен быть равен нулю, однако при оп-ределенных значениях x и y (x = 4195835, y = 3145727) процессор выдавал… 256! Потрясающая точность, однако!

Журналисты подхватили сенсацию, вы-нудив Intel пойти на замену процессоров, чего она изначально делать не хотела, до-

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

С тех пор сообщений об ошибках в ЦП как будто бы не отмечалось. И потому за-явление Тео де Раадта, что Core 2 Duo со-держит огромное количество ошибок, мно-гие из которых допускают удаленный за-хват управления, стало очередной сенса-цией года.

Листинг 1. Псевдокод команды BSF с «узаконенной» ошибкой

IF SRC = 0 THEN ZF := 1; DEST is undefined; ELSE ZF := 0; temp := 0; WHILE Bit(SRC, temp) = 0 DO temp := temp + 1; DEST := temp; OD;FI;

Рисунок 1. Intel Core 2 Duo со всеми ошибками, которые в нем только есть

Page 54: 067 Системный Администратор 06 2008

52

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

тором помимо Intel имеются и другие игроки, впрочем, стал-кивающиеся с теми же самыми проблемами.

Мир не совершенен, никто из нас не без греха. Обнов-лять микрокод ЦП, прошивку BIOS (а в критических случа-ях – и сами процессоры!) нужно так же регулярно, как на-кладывать заплатки на операционные системы и прочее программное обеспечение. Ах да, операционные системы… С них-то все и началось!

…и грянул громОзнакомившись с очередной errata на Core 2 Duo, Тео де Раадт (Theo de Raadt), ведущий разработчик операционной системы OpenBSD, славящейся своей надежностью и за-

щищенностью, пришел в ярость, и набросился на произво-дителей Core 2 Duo с обличительными заявлениями в сти-ле: «Как дальше жить и что нам делать?!», тут же подхва-ченными прессой и ставшими достоянием широкой обще-ственности, постепенно начинающей осознавать, что по-мощи нет и не будет. Ситуация очень серьезна – доста-точно большое число ошибок не только приводит к краху системы, но и (теоретически) допускает возможность уда-ленного захвата управления, поскольку некоторые инс-трукции при определенных обстоятельствах выполняют-ся не так, как ожидалось, например, программа, написан-ная на JavaScript, интенсивно работающая с кэшем, мо-жет вызывать направленный удар по памяти, искажая ад-

Текст сообщения Тео де Раадта, опубликованный в конце июня 2007 годаВ настоящий момент разработчики про-граммного обеспечения и производите-ли железа заняты разработкой «косты-лей», исправляющих серьезные ошибки в процессорах серии Intel Core 2, содер-жащих адское количество багов, и неко-торых из этих багов не просто мелкие де-фекты проектирования, а реальные дыры, которые несомненно могут быть использо-ваны для атак с прикладного уровня. Ряд ошибок невозможно ни исправить, ни най-ти обходное решение для предотвращения их возникновения. Intel ограничивается тем, что предоставляет техническую информа-цию производителям BIOS и ведущим раз-работчикам коммерческих операционных систем. Open Source-сообщество брошено на произвол судьбы.

Вот полная (текущая) errata: http://download. inte l .com/design /processor/specupdt/31327914.pdf (ссылка не рабо-тает, т.к. номер спецификации посто-янно обновляется, и последняя версия может быть найдена по базовой ссыл-ке: http://www.intel.com/design/core2duo/documentation.htm?iid=prod_core2duo+ tab_techdocs#specupdt. – Прим. перевод-чика): Мы готовы биться об заклад, что оши-

бок на самом деле гораздо больше, чем анонсировано – с каждым месяцем errata становится все больше и больше (так оно и оказалось в последствии. – Прим. автора).

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

В сущности MMU (Memory Management Unit – блок управления памятью) под-вергся существенным конструктивным

изменениям и работает совсем не так, как в предыдущем поколении x86-про-цессоров. Мало того, что он превратил-ся в сплошное скопище «тараканов», Intel сделала решительный шаг вперед, определив, по ее выражению, «новые методы обработки страничных таблиц» (см. стр. 58 – тут не совсем понятно, что именно смотреть и где, поиск по фра-зе в Google выдает ссылки только на сообщение Тео де Раадта и ни одного документа от самой Intel. – Прим. ав-тора).

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

Все это кажется совершенно неверо-ятным, но это факт!

Вот краткий сводный конспект ошибок Core 2 Duo для нетехнических людей: http://www.geek.com/images/geeknews/2006Jan/core_duo_errata__2006_01_21__full.gif (тут Theo de Raadt слегка противоречит сам се-бе, поскольку приводит конспект совсем другой errata, с другими ошибками и другой нумераций, поэтому перечисленные ниже номера ошибок не имеют к нему никакого отношения. – Прим. автора).

Примечание: некоторые ошибки ти-па AI65, AI79, AI43, AI39, AI90, AI99 пуга-ют нас так, что душа, минуя пятки, спуска-

ется прямо в преисподнюю. Эти «штучки» не могут быть исправлены программным путем, т.е. посредством модификации ис-ходного кода операционной системы и/или приложений, и некоторые из них затраги-вают все операционные системы, выпу-щенные до середины 2008 года, поскольку MMU любых Intel/AMD и совместимых с ни-ми процессоров всегда управлялся одним и тем же способом. И вот теперь Intel гово-рит нам, что TLB-буферы, входящие в со-став MMU, должны «сбрасываться» на со-вершенно иной манер. Но даже сделав это, ошибки процессора, перечисленные в errata, не позволят создать стабильно ра-ботающей операционной системы.

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

Например, AI90 подходит для атаки на некоторые операционные системы (дво-ичные сборки OpenBSD в конфигурации по умолчанию к ним не относятся). В насто-ящий момент я бы не рекомендовал приоб-ретать машины, построенные на базе Intel Core 2, до тех пор пока дефекты проекти-рования не будут исправлены (что, по мо-им подсчетам, займет больше года). Intel должна стать более «прозрачной» (а не за-жимать технические детали, рассылая их только разработчикам BIOS и коммерчес-ких операционных систем. – Прим. авто-ра). Между тем мне хотелось бы отметить, что AMD с каждым днем становится все ме-нее и менее полезной для Open Source-со-общества, поскольку количество ошибок, обнаруженных в ее процессорах, растет не менее стремительно.

Page 55: 067 Системный Администратор 06 2008

53№6, июнь 2008

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

рес возврата или другие указатели на функции.

Ряд ошибок процессора «сотруд-ничает» с ошибками программного переполнения. Широко распростра-нена ошибка неявного приведения ти-пов (кастинга) – signed int в unsigned int. Огромное количество программ, напи-санных на Си, хранят длину копируе-мого блока памяти в переменной ти-па signed int, передавая ее функции типа memcpy() и выполняя при этом проверку «if (len > MAX) return -1», за-бывая о том, что если len < 0, то дан-ная проверка проходит на «ура», а вот в процессе передачи аргумента len функции memcpy() происходит неяв-ное преобразование типов в unsigned int и, поскольку на x86-процессорах знаковый бит является старшим би-том, то memcpy пытается скопировать по меньшей мере 2 Гб памяти (при 32-разрядном int). Вот именно, что «пы-тается». В ходе копирования функция непременно «врезается» в регион, не-доступный на запись, и генерируется исключение, приводящее к аварий-ному завершению программы (хотя в Windows-системах есть надежда, что в процессе копирования удастся пере-записать адрес обработчика исключе-ний до наступления исключения, пере-хватывая управления при его генера-ции, но техника SafeSEH предотвраща-ет такой вариант развития событий). Однако в процессоре Core 2 Duo име-ется целый класс ошибок, приводя-щих к преждевременному прерыванию копирования блока памяти, когда его размер превышает размеры адресного пространства. В нормальных програм-мах такие ошибки никак не проявляют-ся, поскольку никто из программистов не копирует блоки памяти по 4 Гб или более того, но вот хакеры… им пре-ждевременное прерывание копирова-ния очень на руку – отличное средство для «дозированного» переполнения буфера в условиях неявного преобра-зования signed int в unsigned int.

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

вомодному Server 2008, для которого заплаток нет и не предвидится. Что же тогда говорить о «морально устарев-шем», но все еще работающем парке Windows 2000, XP, Server 2003?!

Но вернемся к исходному сообще-нию Тео де Раадта, опубликованному в конце июня 2007 года, когда обнару-женных ошибок было вдвое меньше, чем сейчас: http://marc.info/?l=openbsd-misc&m=118296441702631.

Сенсация или реальная угроза?Интересно разобраться, что же так на-пугало Тео де Раадта и насколько ве-лика вероятность атаки на Core 2 Duo, тем более, что за время, прошедшее с момента публикации, количество об-наруженных ошибок удвоилось. Ана-лизировать ошибки мы будем в поряд-ке, обозначенном де Раадтом, с уче-том специфики операционных сис-тем семейства NT (Windows 2000, XP, Server 2003/2008, Vista), Linux и ли-нейки BSD – Free, Net и Open, приво-дя официальную информацию из errata со всеми выкладками и рассуждения-ми, а местами – сценариями реализа-ции атаки.

AI65: Температурное прерывание не генерируется при выходе текущей температуры за пределыn Проблема: когда DTS (Digital

Thermal Sensor – цифровой тем-пературный сенсор) достигает од-ного из установленных порого-вых значений, процессор генери-рует прерывание, протоколируя данное событие в журнале (IA32_THERM_STATUS MSR (019Ch) би-ты [9,7]). Вследствие конструктив-ного дефекта при достижении поро-говой температуры (что индициру-ется MSR-регистром IA32_THERM_STATUS бит [31]) DTS не генерирует прерывания и не устанавливает би-ты журнала, даже если было прой-дено одно из пороговых значений.

n Последствия: при выходе темпе-ратуры кристалла за пороговые границы процессор не генерирует прерывания.

n Решение: не найдено.

В общем, не такой уж и страшный дефект, хотя… учитывая, что:

n 99% машинного времени процессор «спит», практически не нагреваясь;

n при активной работе одного или нес-кольких блоков процессора тепло-выделение резко возрастет;

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

Некоторые производители исполь-зуют внешний термодатчик, но большая часть полагается на показания процес-сора – так и дешевле, и точнее, но ес-ли DTS не работает, то возникает пря-мая угроза перегрева кристалла, осо-бенно если хакер загрузит его на пол-ную мощность, что очень легко сде-лать Java-скрипитом или Flash-роликом. Кратковременный перегрев для ЦП в общем-то не опасен, но вот система-тический «перекал» ведет к необрати-мой деградации кристалла. Первым, как правило, гибнет кэш, и система на-чинает выдавать критические ошибки приложений и выбрасывать голубые эк-раны смерти.

Таким образом, атаковать систему не нужно. Она и сама умрет через ка-кое-то время.

AI79: Инструкции записи с префиксом REP при определенных обстоятельствах могут завесить ЦПn Проблема: во время выполнения

серии инструкций записи, пред-варенных префиксом REP (REP STOSx/MOVSx), содержимое про-межуточного буфера может выгру-жаться в память до того, как туда поступят актуальные данные. По-ведение процессора зависит от по-рядка выполнения инструкций, вре-менных характеристик «спекуля-тивных» переходов и временных характеристик некэшируемого бу-фера записи. Этот дефект распро-страняется на все операции записи с префиксом REP.

Page 56: 067 Системный Администратор 06 2008

54

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

n Последствия: проявления дефекта варьируются от зависания процес-сора или операционной системы.

n Решение: дефект можно обойти на уровне BIOS.

Да… тут есть о чем задуматься. Инструкции REP STOSx/MOVSx отно-

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

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

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

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

AI43: Параллельные записи в «чистые» страницы памяти на многопроцессорных системах ведут к неопределенному поведениюn Проблема: когда логический

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

n Последствия: данный дефект при-водит к непредсказуемому поведе-нию системы и возможному зави-санию.

n Решение: дефект может быть уст-ранен на уровне BIOS.

Ох, столько мудрости в этих сло-вах «неопределенное поведение». Ин-

Рисунок 2. Сводный конспект основных ошибок Core 2 Duo, на который ссылается Theo de Raadt

Page 57: 067 Системный Администратор 06 2008

55№6, июнь 2008

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

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

Флаг модификации, являясь раз-деляемым ресурсом, весьма придир-чив к порядку, и все операции с ним должны быть упорядочены теми или иными механизмами синхрониза-ции. Даже не сколько сам этот бит, а его окружение. Модифицировать отдельные биты процессор не обу-чен и он оперирует машинными сло-вами (длина которых не обязатель-но равна двум байтам, в данном кон-тексте – это минимальная порция об-мена с памятью, которая, на Core 2 Duo по одним данным составляет 16, по другим – 32, а по третьим – 64 би-та). Процессор сначала читает машин-ное слово целиком в свой внутренний буфер, взводит/сбрасывает один или несколько бит, после чего записыва-ет его обратно.

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

Как это можно использовать для атаки?! Завесить систему – это ерунда, при желании можно разрушить диско-вый кэш, для этого нужно организо-вать операции записи одних и тех же файлов из двух (или более) разных по-токов, параллельно с этим «съедая» всю свободную оперативную память. На NTFS самым главным файлом яв-ляется $MFT, хранящий информацию обо всех остальных файлах тома. Пря-мое обращение к нему операционная система блокирует, но вот косвенное – создание/удаление/изменение атрибу-тов одних и тех же файлов из разных потоков – допускает даже с гостевы-ми правами. А крах дискового тома – это пострашнее зависания.

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

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

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

Рисунок 3. Сводный конспект основных ошибок Core 2 Duo, на который ссылается Theo de Raadt (продолжение)

Page 58: 067 Системный Администратор 06 2008

56

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

Грубым решением проблемы явля-ется переход в однопроцессорный ре-жим, что осуществляется добавлени-ем ключа /ONECPU в boot.ini). Конеч-но, производительность при этом па-дает, но если целостность данных пре-выше производительности – это не та-кая уж и безумная мера. А надеяться на производителей BIOS… где гаран-тия, что они действительно справятся с ошибкой?!

AI39: Запрос кэш-линейки L1-кэша из одного ядра разрушает модифицированную кэш-линейку другого ядра, приводя к непредсказуемому поведению системыn Проблема: когда запрос данных

из Ядра 1 приводит к «промаху» L1-кэша, запрос перенаправляет-ся к L2-кэшу. Если же данная кэш-линейка уже находится в L1-кэше Ядра 2 и была им модифицирова-на, при определенных обстоятель-ствах Ядру 1 возвращается невер-ный результат.

n Последствия: непредсказуемое поведение системы.

n Решение: BIOS может справиться с этой проблемой.

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

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

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

Как можно использовать данный дефект для атаки? Самое простое – ни-чего не делать с системой. Она и сама упадет. Разрушение дисковых данных достаточно маловероятно, хотя и не ис-ключено на 100%, а вот критические сбои приложений и голубые экраны смерти – вполне ожидаемое явление. Действительно, если программа что-то записала в память (на самом деле в кэш, но это уже не важно), а при пос-ледующем чтении не обнаружила ни-каких изменений, тут может произой-ти все что угодно.

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

Шторм запросов к любому драй-веру (например, шторм IP-пакетов) также потенциально способен вызы-вать крах системы, но, учитывая, что шторма зачастую вызывают BSOD даже на «правильных» процессорах (из-за ошибок синхронизации, допу-щенных разработчиками драйверов), очень трудно определить, с каким де-фектом мы имеем дело: с програм-мным или аппаратным. Тем не менее хакерский потенциал у атак данно-го типа весьма весомый, что главным

образом обуславливается простотой их реализации.

Самое непонятное в этой исто-рии – какое отношение имеет BIOS с «разборкам» внутри процессора?! Единственное разумное предположе-ние – BIOS просто заливает обновлен-ный микрокод, предоставленный Intel. По-другому справиться с проблемой навряд ли получится.

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

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

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

n Решение: пагубное влияние де-фекта может быть нейтрализова-но путем установки сторожевой страницы (отсутствующей в памя-ти или неисполняемой), отделяю-щей кодовый сегмент от последу-ющего за ним семена.

Вот мы и добрались до дефек-та, особо отмеченного Тео де Раад-том в качестве подходящего кандида-та для атаки на операционные систе-мы (за исключением OpenBSD в кон-фигурации по умолчанию). Что же это за операционные системы такие?!

В NT лимиты сегментов кода, дан-ных и стека «распахнуты» на все ад-ресное пространство, нижнюю поло-вину которого занимает прикладной код, верхнюю – операционная систе-ма. Так что за пределами кодового сегмента вообще ничего нет. Да и что-бы добраться до его конца, необхо-димо сначала как-то попасть на уро-вень ядра, где можно делать что угод-но и без всяких дефектов процессора (правда, в Core 2 Duo есть еще один интересный дефект, обнаруженный

Page 59: 067 Системный Администратор 06 2008

57№6, июнь 2008

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

автором и не описанный в последней errata – при выполнении кусочка инс-трукции, находящегося в самом кон-це кодового сегмента, декодер, опре-деляя длину инструкции по первым байтам, пытается считать ее продол-жение, которого нет, в результате че-го происходит «заворот» в начало сег-мента, первой странице которого так-же присваивается атрибут доступа, после чего генерируется исключение, которое хакеру необходимо отловить, чтобы система не свалилась в BSOD, но что это даст?!

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

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

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

А вот из 32-разрядного приложе-ния вызвать 16-разрядное, ну не то чтобы невозможно, но все-таки до-статочно сложно (имеется в виду вы-зов из shell-кода, исполняющегося в 32-разрядном приложении). Други-ми словами, на Windows этот дефект не оказывает ровным счетом никако-го воздействия.

А что на счет BSD и Linux? Штат-ные ядра также исповедуют плоскую

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

shell-кода уже назрела – произошло вот что: нестандартные ядерные рас-ширения урезали лимиты стека и сег-мента данных (расположенных в нача-ле) и отобрали у них атрибут «испол-няемый». А за ними расположили сег-мент кода. Вот если бы они поступили в обратном порядке (сначала код, по-том стек и данные), то у хакеров была бы потенциальная возможность досту-

Рисунок 4. Сводный конспект основных ошибок Core 2 Duo, на который ссылается Theo de Raadt (продолжение)

Page 60: 067 Системный Администратор 06 2008

58

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

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

Конечно, можно предположить, что где-то есть операци-онная система, в которой сначала идут пользовательские сегменты кода и данных, а потом расположен сегмент опе-рационной системы, хранящий данные, защищенные от чте-ния, поскольку, будучи прочитанными, они позволят повы-сить уровень своих привилегий, например, но… если такая операционная система и есть, то это не Linux, не Windows, не BSD и не QNX… а какая-то студенческая поделка. Воп-рос: какой интерес ее атаковать?! Короче, на этот дефект процессора можно вообще не обращать внимания. Ну раз-ве что при разработке новых операционных систем, ради-кально отличающихся от уже существующих.

AI99: Обновление атрибутов директории кодовых страниц без «инвалидации» TLB может привести к некорректной обработке исключения #PFn Проблема: исключение #PF (Page Fault – страничный

отказ) обычно обрабатывается с другими исключени-ями, перечисленными в порядке увеличения приори-тета: #DB (Debug Exception – отладочное исключение), Segment Limit Violation (исключение выхода за пределы Сегмента), #GP (General Protection Fault – общее нару-шение защиты). Вследствие дефекта проектирования, #PF исключение обрабатывается некорректно, при на-ступлении одного из следующих событий: PDE (Page Directory Entry – запись каталога страниц)

модифицируется без «инвалидации» (to invalidate – делать недействительным) соответствующей запи-си TLB (Translation Look-aside Buffer – буфер обрат-ной трансляции);

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

цированной PDE; PTE (Page Table Entry – запись таблицы страниц)

для целевого линейного адреса имеет сброшен-ный бит доступа;

транзакции предшествует одно из двух следующих исключений: #DB и #PF; #GP и #PF.

n Последствия: программное обеспечение должно либо отслеживать некорректное #PF исключение, предшест-вующее #GP исключению, так же как #PF исключению перед #DB.

n Решение: не найдено.

Наконец-то мы добрались до дефекта, который Тео де Раадт характеризует как «ну вот, теперь нам Intel гово-рит, что TLB нужно обрабатывать совершенно иным пу-тем, не похожим на старый». Ох и врет! Intel ничего тако-го не говорит, признавая за собой дефект и расписываясь в бессилии найти приемлемое обходное решение. Дефект, конечно, серьезный, и остается только удивляться, как су-ществующие операционные системы ухитряются работать на Core 2 Duo, не падать каждые шесть-семь минут (хотя, возможно, они и падают, но не так часто).

Выход только один – ждать новой ревизии процессо-ра, с исправленной ошибкой обработки TLB (после чего все будет «как при бабушке»), либо же модифицировать (причем весьма значительно) ядро операционной систе-мы, чтобы оно стабильно работало и на дефектных ЦП. Microsoft выпуском такой заплатки не озаботилась, хотя похоже, что при ее манерах обращения с TLB обозначен-ный дефект не особо и мешает. А вот де Раадт доработал ядро OpenBSD, застраховав систему от возможных «сюр-призов» со стороны процессора. Естественно, ядро испра-вить (да еще таким необычным способом) – это не просто две строчки кода местами поменять, так что его можно по-нять. Кому хочется отдуваться за чужие ошибки?! А между тем ошибок в процессорах много…

ЗаключениеРазработчики популярных операционных систем за послед-ние годы существенно усилили их защиту, и золотое время атак на переполняющиеся буферы закончилось. Основные лазейки уже закрыты, и поиск реально «работающих» дыр требует все больших и больших усилий. Но усилило ли это общую безопасность?! Едва ли. Это только раззадорило хакеров, спровоцировав активный поиск принципиально новых методов атак.

Нетронутую целину дефектов железа хакеры только-только начали осваивать. До сих пор не представлено ни одного proof-of-concept exploit и не зафиксировано случа-ев вторжения, основанных на ошибках ЦП, однако… в ат-мосфере определенно что-то происходит. Что-то такое.., не предвещающее ничего хорошего.

Впрочем, не будем изображать из себя пророков, пре-доставив событиям развиваться своим чередом, а сами тем временем приложим максимум усилий по обеспече-нию собственной безопасности, скачивая свежие прошив-ки BIOS и выбирая продукцию тех производителей, кото-рым можно верить и которые действительно борются с де-фектами процессоров, отмечая свои достижения в сопро-водительных файлах. Что же касается операционных сис-тем, то в линейке BSD – OpenBSD несомненный лидер, Linux все на одно лицо, и особой разницы между ними нет (у од-них одни недостатки, у других – другие). Microsoft похоже бороться в ошибками процессоров вообще не собирается, а это большой минус.

Рисунок 5. Windows использует «плоскую» модель памяти с «распахнутыми» границами сегментов

Page 61: 067 Системный Администратор 06 2008

59№6, июнь 2008

bugtraq

Обход ограничений безопасности в SnortПрограмма: Snort версии до 2.8.1.Опасность: Средняя.Описание: Уязвимость существует из-за ошибки дизай-на при обработке фрагментированных IP-пакетов. Когда Snort получает фрагментированный пакет, осуществляет-ся проверка значения Time To Live (TTL) и сравнение его со значением начального фрагмента. Если разница меж-ду значениями TTL-фрагментов больше, чем сконфигури-ровано (максимальное значение 5), фрагмент будет про-игнорирован. Удаленный пользователь может с помощью фрагментированных валидных IP-пакетов обойти все пра-вила фильтрации Snort.URL производителя: www.snort.org.Решение: Установите последнюю версию 2.8.1 с сайта про-изводителя.

Утечка памяти в vsftpd в Red Hat LinuxПрограмма: Fedora 7, 8, 9; Red Hat Enterprise Linux (v. 5 server); Red Hat Enterprise Linux Desktop Workstation (v. 5 client); rPath Linux 1.x.Опасность: Средняя.Описание: Уязвимость существует из-за ошибки в исправ-лении для Red Hat-платформ, которая привела к тому, что vsftpd dthcbb 2.0.5 не освобождает распределенную па-мять при обработке пользовательских команд, если вклю-чена опция deny_file в конфигурационном файле vsftpd.conf. Удаленный пользователь может подключиться к удаленно-му серверу, выполнить большое количество CWD-команд и потребить все доступные ресурсы на системе.URL производителя: www.redhat.com.Решение: Установите исправление с сайта производителя.

Отказ в обслуживании в OpenSSLПрограмма: OpenSSL версии 0.9.8f и 0.9.8g.Опасность: Средняя.Описание: 1. Уязвимость существует из-за ошибки двой-ного освобождения памяти при обработке данных расши-рения имени сервера. Удаленный пользователь может вы-звать отказ в обслуживании приложения, использующего OpenSSL. Для успешной эксплуатации уязвимости OpenSSL должен быть собран с использованием TLS-расширений имени сервера.

2. Уязвимость существует из-за неизвестной ошибки, которая позволяет удаленному пользователю, контролиру-ющему злонамеренный сервер, вызвать отказ в обслужи-вании клиентского приложения, использующего OpenSSL, когда «Server Key exchange message» не участвует в кли-ентском TLS-рукопожатии.URL производителя: www.openssl.org.Решение: Установите последнюю версию 0.9.8h с сайта производителя.

Множественные уязвимости в MDaemonПрограмма: MDaemon 9.6.5, возможно, более ранние вер-сии.Опасность: Средняя.Описание: 1. Уязвимость существует из-за ошибки разы-менования нулевого указателя при обработке HTTP-за-просов, отправленных интерфейсу WordClient (порт 3000/TCP). Удаленный пользователь может с помощью специ-ально сформированного HTTP POST-запроса, отправлен-ного WorldClient.dll, аварийно завершить работу службы WordClient.

2. Уязвимость существует из-за ошибки проверки гра-ниц данных в WordClient-интерфейсе при обработке Reply-запросов с, например, слишком длинным полем Subject. Удаленный пользователь может с помощью специально сформированного e-mail-сообщения вызвать переполне-ние стека и выполнить произвольный код на целевой сис-теме. Для успешной эксплуатации уязвимости требуется действительная учетная запись.URL производителя: www.altn.com/products/default.asp/product_id/MDaemon.Решение: В настоящее время способов устранения уязви-мости не существует.

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

Обход ограничений безопасности в SkypeПрограмма: Skype 3.6.0.248, возможно, более ранние вер-сии.Опасность: Средняя.Описание: Уязвимость существует из-за ошибки провер-ки расширений файлов в «file:» URI-обработчике. Удален-ный пользователь может изменить регистр в расширении файла или указать файл, который не содержится в спис-ке опасных файлов (список состоит из следующих расши-рений: .ade, .adp, .asd, .bas, .bat, .cab, .chm, .cmd, .com, .cpl, .crt, .dll, .eml, .exe, .hlp, .hta, .inf, .ins, .isp, .js), это приведет к тому, что приложение не отобразит окно предупреждения об опасном типе файла.URL производителя: www.skype.com.Решение: Установите последнюю версию 3.8.0.139 с сай-та производителя.

Множественные уязвимости в IBM DB2Программа: IBM DB2 9.1.Опасность: Средняя.Описание: 1. Уязвимость существует из-за неизвестной ошибки в плагинах разработки CLR-хранимых процедур в Visual Studio.

2. Уязвимость существует из-за ошибки проверки гра-ниц данных в функции SQLRLAKA(). Удаленный пользова-тель может вызвать переполнение стека.

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

4. Уязвимость существует из-за ошибок проверки гра-ниц данных в XQUERY, XMLQUERY, XMLEXISTS и XMLTABLE. Удаленный пользователь может вызвать переполнение бу-фера.URL производителя: www-306.ibm.com/software/data/db2/9.Решение: Установите исправление с сайта производителя.

Page 62: 067 Системный Администратор 06 2008

60

web

Корпоративный информационный портал, который построил Джек

Антон Борисов

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

Page 63: 067 Системный Администратор 06 2008

61№6, июнь 2008

web

Исторические предпосылкиВ середине 90-х годов прошлого ве-ка мы запомнили такие веб-порталы, как Excite, Webcrawler, Yahoo!, Lycos, Altavista. Эти сайты предоставляли такую информацию, как новости, по-году, биржевые сводки, поиск, а так-же ряд других сервисов. Зачастую она была представлена в виде отдельных веб-приложений (портлетов). По ме-ре того как предприятия переходили на электронный документооборот, рос-ла и их потребность в таких же пор-талах, что имеют Yahoo! и им подоб-ные, но в рамках данного конкретно-го предприятия.

Корпоративный информационный портал – это место для интеграции информации, процессов и сообщест-ва людей в рамках организации. От-личительными чертами порталов яв-ляются: децентрализованные источ-ники информации система управле-ние содержимым (Content Management System). За счет того, что портал пре-доставляет унифицированную точ-ку доступа к информации, появляет-ся возможность настроить получение информации в той форме, которая на-иболее удобна пользователю.

Портал может состоять из следую-щих модульных подсистем:n визуальный слой – интерфейс веб-

пользователя;n персонализация – способность

формировать динамический ответ пользователю в зависимости от его персонального профиля;

n средства совместной работы – инструменты для обмена инфор-мацией между пользователями (электронная почта, общие ресур-сы и т. д.);

n портлеты – структуры, предназна-ченные для легкого подключения программных модулей и сервисов приложений;

n поиск и навигация – когда содер-жимое портала скомпоновано по ка-тегориям и предоставлено средство поиска необходимой информации;

n публикация и подписки – возмож-ность авторизовать новое содер-жимое и публиковать его подпис-чикам;

n администрирование и безопас-ность – планировщик страниц, сред-ства мониторинга метаданных.

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

Программная платформа могла ба-зироваться как на открытых техноло-гиях, так и на закрытых, с коммерчес-ким лицензированием или лицензи-

рованием в соответствии с GPL/LGPL/MIT/Apache License. Примерами могут служить:

Рисунок 1. Структурная схема портала, созданного из портлетов

Рисунок 2. Портал администрации Воронежской области

Рисунок 3. Исполнительная власть Москвы реализует программу «Одно Окно»

Page 64: 067 Системный Администратор 06 2008

62

web

n WebSphere Portal Server – J2EE/ком-мерческое лицензирование;

n Microsoft Office Sharepoint Server – ASP.NET/коммерческое лицензи-рование;

n Oracle Application Server Portal – J2EE/коммерческое лицензирова-ние;

n Sun Java System Portal Server – J2EE/смешанное лицензирование;

n Jetspeed – J2EE/Apache License;n JBoss Portal – J2EE/LGPL;n Liferay Portal – J2EE/MIT.

Однако в 2003 году появляется ини-циатива использовать единый стан-

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

Сферы примененияНазначение порталов может быть раз-личным. Это может быть портал компа-нии, портал органа власти, портал го-суслуг, портал вуза. Все они призваны служить какой-либо определенной це-ли, которые детально описаны по ссыл-ке [1]. Приведу лишь примеры реализа-ции порталов.

Корпоративные порталы:n ОАО «Вымпелком» – http://www.msk.

beeline.ru;n Steelcase Inc. – http://www.steelcase.

com;n Siemens AG – http://siemens.com.

Порталы органов власти:n Еврейская автономная область –

http://www.eao.ru;n администрация Воронежской об-

ласти – http://www.govvrn.ru;n администрация Тульской области –

http://admportal.tula.ru;n Министерство экономического

развития РФ – http://www.economy.gov.ru.

Порталы госуслуг:n Федеральное агентство по техни-

ческому регулированию и контро-лю – http://www.gost.ru;

n электронная приемная города Москвы («Одно Окно») – http://oo.mos.ru;

n проект портала Зеленограда с его мобильными услугами – http://zelao.mobi;

n портал госуслуг Республики Кирги-зия – http://www.govservices.kg.

Порталв вузов:n Брянская сельскохозяйственная

академия – http://www.bgsha.com;n Санкт-Петербургский университет

информационных технологий, меха-ники и оптики – http://www.ifmo.ru;

n портал информационной под-держки ЕГЭ – http://ege.edu.ru;

n портал непрерывного образования преподавателей – http://www.neo.edu.ru;

Рисунок 4. JBoss Portal успешно развернут

Рисунок 5. Может показаться, что за внешней простотой скрывается простой механизм, однако это не так

дарт (Java Specification Request 168 или JSR168) для корпоративных порталов, построенных на основе Java. Цель дан-ного стандарта – предоставить единый API для взаимодействия между порта-лами и портлетами. Поэтому если вы запустили на предприятии портал, ко-торый поддерживает стандарт JSR168, то у вас высокие шансы, что портлеты, созданные в соответствии с данным стандартом, заработают и у вас.

Что же такое портлет на самом де-ле? В первую очередь это веб-прило-жение, которое запущено на сервере приложений Java, например Tomcat. И во-вторых, это компонент, который

Page 65: 067 Системный Администратор 06 2008

63№6, июнь 2008

web

n Казанский государственный технический университет – http://www.kai.ru;

n Академия управления ТИСБИ – http://www.tisbi.ru.

В качестве международного портала стоит взглянуть на пример Индии – http://india.gov.in и на пример поисково-го портала – http://lycos.com.

Что интересно, у такой разноплановой компании, как Microsoft, есть рекомендательный документ, как сле-дует строить порталы, в частности, портал органов госу-дарственной власти [2].

Проблема выбораПочему был выбран именно JBoss Portal? На то было не-сколько причин:n хотелось отказаться от привязки к какой-либо конкрет-

ной операционной системе;n иметь поддержку Java-приложений;n иметь программное решение на открытых стандартах;n иметь возможность хранить дан-

ные в различных СУБД.

Для первых трех пунктов в ка-честве аргумента выступила связка JAVA + JSR168. Что касается СУБД, то работа со следующими базами – MySQL, PostgreSQL, Oracle, MSSQL, HyperSonic DB – также оказалась до-статочной.

Ну и напоследок: за спиной JBoss стоит компания RedHat, которую вряд-ли можно соблазнить эфемерны-ми проектами. В 2006 году компания JBoss была куплена последней и пре-образована в структурное подразде-ление – RedHat Middleware LLC. На-помню, что на протяжении уже боль-ше десяти лет RedHat работает флаг-маном, который медленно, но вер-но двигает информационный рынок в части Linux-решений. Поэтому есть оп-

ределенные предпосылки, что портальное решение будет развиваться и в будущем. Этот факт тоже внес свою леп-ту в выбор JBoss Portal.

Установка порталаИтак, забираем дистрибутив с JBoss Portal [3], создаем в системе пользователя с именем jboss. Распаковываем, например, в директорию jboss-portal. Впоследствии при упо-минании JBOSS_HOME будем знать, что подразумевает-ся директория /home/jboss/jboss-portal. Но перед стартом проведем несколько операций с СУБД. В данном приме-ре выбран MySQL.

Шаг 1. Создаем в MySQL-хранилище новую базу с име-нем html_data:

Шаг 2. Для пользователя jbossuser разрешаем доступ к этой базе, как с локального хоста, где крутится JBoss

mysql> create database html_data charset = utf8;

Рисунок 6. В административном режиме начинаем формировать свой портал

Рисунок 7. Для каждой языковой группы посетителей можно назначить нужные названия страниц

Page 66: 067 Системный Администратор 06 2008

64

web

Portal, так и с рабочего места, откуда будут вноситься из-менения в структуру базы:

Шаг 3. Зайдем в MySQL-хранилище под именем поль-зователя jbossuser:

Шаг 4. И создадим таблицу с названием news:

Шаг 5. Затем с рабочего места заполним эту таблицу значениями с помощью SQLyog.

Шаг 6. Далее следует в JBoss Portal выставить, что сле-дует использовать MySQL-хранилище, т.к. по умолчанию бу-дет использоваться база в формате Hypersonic DB.

Для этого из директории $JBOSS_HOME/setup/ сле-дует скопировать файл portal-mysql5-ds.xml в директорию $JBOSS_HOME/server/default/deploy/. Файл, который исполь-зуется по умолчанию, portal-hsqldb-ds.xml, нужно либо уда-лить, либо переименовать как portal-hsqldb-ds.xml.original.

Затем в файле portal-mysql5-ds.xml следует поменять имя пользователя и его пароль, от имени которого будет со-здана портальная база. Примерное содержимое файла:

Ключевые параметры выделены красным шрифтом.Не забудем также взять с сайта MySQL.com jdbc-коннек-

тор [4] и скопировать его в $JBOSS_HOME/server/default/lib/mysql-connector-java-5.1.6-bin.jar. Обращаю ваше внимание на то, что таблица в MySQL-базе хранится в UTF8-форме (см. «create table ... charset = utf8»). Это связано с тем, что внутри JBP используется несколько языковых интерфейс-ных схем, в частности испанская и французская. И чтобы минимизировать проблемы с перекодировкой между пор-талом и браузерами, было решено хранить в UTF8. Еще од-но замечание – проследите, чтобы в файле my.cnf было яв-но указано, какая кодировка используется:

В частности, моя рабочая система работает с такими параметрами:

И еще один шаг перед запуском портала. Дело в том, что JBoss Portal хранит в базе данных не только имена поль-зователей портала, их электронные адреса и другую слу-жебную информацию, но и содержимое CMS (HTML-файлы). Ясно, что по мере того как портал будет заполняться новой информацией (читай, новыми HTML-страницами), то будет расти и размер базы. Но есть вариант, использовать вне-шнее хранение – непосредственно на диске, а не в базе. Для этого изменим значения параметров externalBLOBs в фай-ле $JBOSS_HOME/server/default/deploy/jboss-portal.sar/portal-cms.sar/META-INF/jboss-service.xml с «false» на «true»:

Шаг 7. Запускаем портал:

Как видите, для доступа к порталу нужно вводить URI в виде http://192.168.194.1:8080/portal/, что представляется не совсем удобным. Варианты следующие: включить пе-ренаправление входящих запросов с порта 80 на локаль-ный порт 8080 и изменить расположение доступа к порта-лу – Context Path:

И поменяем Context Path в файле $JBOSS_HOME/server/default/deploy/jboss-portal.sar/portal-server.war/WEB-INF/jboss-web.xml.

Новое значение будет выглядеть как:

Зайдя на адрес 192.168.194.1, вы увидите стандартное окно JBoss Portal.

Создаем простейшее представлениеПервым делом попробуем составить свой собственный пор-тал, немного отличный от стандартного.

<param name="externalBLOBs" value="true"/>

$ $JBOSS_HOME/bin/run.sh --host 192.168.194.1

# /usr/sbin/iptables -t nat -A PREROUTING -i eth0 ↵ -p tcp --dport 80 -j REDIRECT --to-port 8080

<context-root>/</context-root>

mysql> grant select, insert, update, delete, create, ↵ drop on html_data.* to 'jbossuser'@'localhost';mysql> grant select, insert, update, delete, create, ↵ drop on html_data.* to 'jbossuser'@'192.168.194.128';mysql> grant select, insert, update, delete, create, ↵ drop on html_data.* to 'jbossuser'@'192.168.194.1' ↵ identified by 'jboss';

ab@abc:~> mysql -u jbossuser html_data

mysql> create table news ↵ (id integer not null auto_increment, `text` text, ↵ primary key (id)) charset = utf8;

<datasources> <local-tx-datasource> <jndi-name>PortalDS</jndi-name> <connection-url>jdbc:mysql://127.0.0.1:3306/ ↵ jbossportal?useServerPrepStmts=false&amp; ↵ jdbcCompliantTruncation=false</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>jbossdb</user-name> <password>jbossdb</password> </local-tx-datasource></datasources>

[mysqld]character_set_server=utf8

mysql> show variables like 'character%';

+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+8 rows in set (0.00 sec)

mysql> show variables like 'collation%';

+----------------------+-------------------+| Variable_name | Value |+----------------------+-------------------+| collation_connection | latin1_swedish_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-------------------+3 rows in set (0.00 sec)

Page 67: 067 Системный Администратор 06 2008

65№6, июнь 2008

web

Для этого заходим под пользова-телем admin (его имя и пароль высве-чиваются в портлете Welcome – на-звание шапки «Greetings!»). Следуем в меню «Admin», что находится среди Dashboard, Admin, Logout, и во вкладке «Portal Objects» увидим, что существует 3 портала – admin, default и template. Причем портал default выбран теку-щим, что и понятно из названия и по-метки в виде галочки.

Вводим название создаваемого портала, например myPortal. Нажима-ем на кнопку «Create Portal» и затем на-жимаем на ссылку «Make Default». Зай-дя по адресу http://192.168.194.1, мож-но полюбоваться на новый пустой пор-тал (см. рис. 5).

Первым делом попробуем создать несколько страниц, которые наполним текстом и добавим на них несколько портлетов. Заодно и поменяем тему, чтобы можно было отличить наш пор-тал от тысячи таких же, построенных на JBoss Portal.

Создадим 4 страницы с названия-ми: «Страница1», «Страница2», «Стра-ница3» и «Страница4». Лучше писать их названия в латинской раскладке, а затем назначить русский перевод.

Итак, выбираем нужный портал – myPortal. В этом окне в поле «Create a page named:» набираем Page1 и под-тверждаем, нажав на кнопку «Create page». Аналогично для остальных страниц.

Первую страницу делаем страни-цей по умолчанию. Зайдем на вклад-ку для страницы Page1, названную «Display Names». Здесь для каждо-го языка можно сделать свой собст-венный перевод названия страни-цы. Зачем это нужно? Представь-те, что на страницы портала заходят посетители из различных языковых групп, в качестве примера: из Фран-ции, Германии, США и русскоязыч-ные пользователи. Чтобы каждому из них страница показывалась не толь-ко как «Page1», но и как «Seite1», «La Page1», «Страница1», и придуман дан-ный раздел.

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

Type: «Portlets»), так называемые вид-жеты (Content Type: «widget/netvibes»), виджеты с сайта google.com (Content Type: «widget /google») или непос-редственно скомпоновать из различ-ных HTML-документов (Content Type: «cms»). Разместим портлеты Who's Online и User на данной странице (см рис. 8).

Для второй страницы предвари-тельно нужно создать несколько HTML-файлов. Для этого переходим в раздел CMS и создаем там файлы: content1.html, content2.html, content3.html. Нажи-маем на кнопку «Select Action...» и вы-бираем «Create File» (см. рис. 9).

зывает, что страница не найдена. Впро-чем, это еще впереди.

Переходим к наполнению страниц. На заглавную давайте поместим не-сколько стандартных портлетов из со-става дистрибутива, вторую страницу сделаем композитной из нескольких HTML-страниц, а на остальные помес-тим свои собственные портлеты: один сторонний – GooglePortlet и один, ко-торый делает выборку из MySQL-хра-нилища.

Мы находимся во вкладке «Portals → myPortal portal → Page1 page layout». Мы можем поместить на страницу пре-дустановленные портлеты (Content

Рисунок 8. Размещаем на страницу портлеты

Рисунок 9. Работаем в CMS-редакторе

Page 68: 067 Системный Администратор 06 2008

66

web

Во встроенном HTML-редакторе придумываем содержимое, редакти-руем и украшаем, а затем публикуем, нажав на «Create» (см. рис. 10).

Аналогично для двух других фай-лов. В итоге должно получиться офор-мление, как на рис. 11.

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

Поисковые службы для любого пор-тала, как мне кажется, являются одной из главных состав-ных частей. Закономерно, что был выбран механизм поиска компании Google – GooglePortlet. Если вы помните, то в 2002 году они представили свой сервис, известный как Google SOAP Search API. Разработчикам предлагалось, однажды зарегистрировавшись на сайте Google, получить доступ к весьма удобному интерфейсу поисковой машины.

Забираем архив с GooglePortlet по адресу [5], затем ар-хив с jar-файлом от Google SOAP API по ссылке [6]. Чтобы портлет заработал, следует разместить googleapi.jar в путь переменной classpath. Либо поместить его в сам портлет, в директорию lib.

Но и это пока не все, следующий шаг – это разме-щение ключевого файла от поискового сервиса Google. На данный момент генерация новых ключей приос-тановлена, поэтому воспользуемся уже существую-щим ключом (если он у вас есть) либо используем ключ NC8jGG8c+SYzP3IuclPD+a0lFjAj87Yd. Его следует помес-тить в файл portlet.xml в раздел <init-param>.

Размещаем портлет в JBP, скопировав его в директо-рию $JBOSS_HOME/server/default/deploy.

И затем аналогичным образом, так же как мы поступили с идущими в комплекте стандартными портлетами, размес-тим его на третьей странице. Полюбоваться поиском мож-но, перейдя на раздел «Страница3» портала и набрав, на-пример, «BMW AG» (см. рис. 12).

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

Например, сформировав запрос вида «Слово_для_по-иска + Название_Своей_Компании», где «Слово_для_по-иска» берется из собственного портлета, а «Название_Сво-ей_компании» подставляется в строку запроса из этого же

портлета.С другими особенностями Google

API можно ознакомиться на сайте GoogleDuel [7].

И наконец, пора разместить свой собственный портлет на последней странице портала. Он несложен, про-изводит выборку новостных событий из базы и выводит ее результат в те-ло портлета. Воспользуемся приме-ром портлета «Hello, World», правда, добавив несколько конструкций для доступа в MySQL-хранилище. Этот пример можно забрать со страницы JBoss Labs [8].

Оригинальный портлет выглядит следующим образом:

<portlet-class>com.plumtree.portlet.portlets. ↵ GooglePortlet</portlet-class> <init-param> <name>key</name> <value>NC8jGG8c+SYzP3IuclPD+a0lFjAj87Yd</value> </init-param>

Рисунок 11. А так выглядит «составная» страница в окне браузера пользователя

Рисунок 10. В итоге структура очередной страницы портала состоит из нескольких HTML-страниц

Page 69: 067 Системный Администратор 06 2008

67№6, июнь 2008

web

Модифицированный портлет:

Рисунок 12. Поисковый портлет от Google в действии

package org.jboss.portlet.hello;

import javax.portlet.GenericPortlet;import javax.portlet.PortletException;import javax.portlet.RenderRequest;import javax.portlet.RenderResponse;import javax.portlet.UnavailableException;import java.io.IOException;import java.io.PrintWriter;

public class HelloWorldPortlet extends GenericPortlet{ protected void doView(RenderRequest rRequest, ↵ RenderResponse rResponse) throws PortletException,IOException, UnavailableException { rResponse.setContentType("text/html"); PrintWriter writer = rResponse.getWriter(); writer.write("Hello World!"); writer.close(); }}

1 package org.jboss.portlet.samplesql;

2 import javax.portlet.GenericPortlet;3 import javax.portlet.PortletException;4 import javax.portlet.RenderRequest;5 import javax.portlet.RenderResponse;6 import javax.portlet.UnavailableException;7 import java.io.IOException;8 import java.io.PrintWriter;

9 import java.sql.*; 10 import java.util.Properties;

11 public class SampleSQLPortlet extends GenericPortlet12 {

13 Connection conn = null; 14 String url = "jdbc:mysql://localhost:3306/"; 15 String userName = "jbossuser"; 16 String password = "";

17 public void init()18 {

19 }

20 protected void doView(RenderRequest rRequest, ↵ RenderResponse rResponse) throws PortletException, ↵ IOException, UnavailableException21 {22 rResponse.setContentType("text/html");23 PrintWriter writer = rResponse.getWriter(); 24 try 25 { 26 Class.forName ↵ ("com.mysql.jdbc.Driver").newInstance ( ); 27 conn = DriverManager.getConnection (url, ↵ userName, password); 28 Statement s = conn.createStatement ( ); 29 s.executeQuery ("SELECT * from ↵ html_data.news order by id"); 30 ResultSet rs = s.getResultSet ( ); 31 while (rs.next ( ))32 { 33 int uid = rs.getInt (1); 34 String name = rs.getString(2); 35 String name3 = name.replaceAll("\n", ↵ "<br>");36 writer.println("<b>NewsID: " + uid + ↵ "</b>, content: " + name3 + ↵ "<br><hr>");37 writer.flush(); 38 }39 rs.close ( );40 s.close ( );

41 } catch (Exception e) { System.err.println ↵ ("Cannot connect to server" + e); 42 }

43 finally 44 {

45 if (conn != null) 46 { 47 try 48 { 49 conn.close ( ); 50 } catch (Exception e) { /* ignore close ↵ errors */ } 51 }

Page 70: 067 Системный Администратор 06 2008

68

web

В данном примере мы расширили функционал стан-дартной функции портлета doView(), добавив обработ-ку запроса к MySQL-хранилищу (строки 24-41) по адресу localhost:3306, под именем пользователя jbossuser и с пус-тым паролем (строки 13-16). Выборка осуществлена запро-сом (строка 29):

Так как портлет – это веб-приложение, то представле-ние в нем уже является HTML-страницей. Поэтому весь тот текст, что мы выводим из базы, нужно выводить как HTML. В этой связи все переводы строк заменены на их HTML-эк-виваленты (строки 34-35), плюс мы еще выделили жирным номер новости (строка 36).

Не забудьте поменять название портлета в файле сбор-ки build.xml c «helloworldportlet» на «samplesqlportlet», а также в файлах-ресурсах в директории resources/samplesqlportlet-war/WEB-INF/.

Сборка портлета относительно проста:

Готовый портлет можно найти в директории Sample SQLPortlet/output/lib. Его следует переписать в директо-рию горячего разворачивания портала либо сделать раз-ворачивание портлета в автоматическом режиме. Для это-го в build.xml вносим конструкцию копирования в нужное нам место:

Тогда каждая новая сборка портлета будет автомати-

чески скопирована и в директорию разворачивания пор-тала и автоматически им развернута.

При этом в портале, в административном режиме, вы увидите, что появился наш портлет под именем SampleSQL PortletInstance (см. рис. 13).

Его-то и размещаем на четвертой странице. Выглядит, на мой взгляд, любопытно (см. рис. 14).

Смена визуальной цветовой «одежки»Конечно, было бы интересно сделать сайт визуально раз-личимым, хотя бы в цветовой гамме. Для этого в стандар-тной установке присутствуют следующие темы: industrial, renaissance, maple, nphalanx и mission-critiсal. В частности, industrial выглядит вот так.

Вы обратили внимание, что в примерах используется отнюдь не стандартная тема. Все правильно, тема называ-ется «havana-affair» и может быть загружена с сайта JBoss, подраздел portletswap: http://www.jboss.org/portletswap/downloads/layouts.

Давайте рассмотрим, что же из себя представляет те-ма. Распаковав файл havana_affair.zip, мы видим, что со-держимое темы (графические файлы и CSS-раскладка) хранятся в директории havana_affair.war. Тема, как и пор-тлеты, может быть развернута в реальном режиме – так-же как и портлеты, данную директорию нужно переписать в $JBOSS_HOME/server/default/deploy.

Посмотрим на CSS-раскладку темы – файл «portal_style.css». За описание портальных страниц отвечают те-ги: #body, #spacer, #header-container, #header, #logoName. Так, тэг #body выглядит следующим образом:

Что это означает – страницы будут «залиты» фоновым рисунком из файла portal_background.gif. Причем если ри-сунок представляет собой полоску, то фон страницы бу-дет составлен из множества таких полосок – за это отве-чает параметр «background-repeat: repeat-x». Цвет страни-цы в нашем примере: #d5d9be (в hex-нотации R-G-B). Ис-

17:21:07,200 INFO [TomcatDeployer] deploy, ctxPath=/samplesql-portlet, warUrl=.../tmp/deploy/tmp41874samplesqlportlet-exp.war/17:21:07,262 INFO [PortletAppDeployment] Parsing /samplesqlport-let/jboss-portlet.xml17:21:07,285 INFO [PortletAppDeployment] These instances have been found in -object.xml, you should put them in the file /home/jboss/jboss-portal-2.6.4/server/default/./tmp/deploy/tmp41874sam-plesqlportlet-exp.war/WEB-INF/portlet-instances.xml17:21:07,285 INFO [PortletAppDeployment] <?xml version="1.0" encoding="utf-8" standalone="yes"?><deployments><deployment><instance><instance-id>SampleSQLPortletInstance</instance-id><portlet-ref>SampleSQLPortlet</portlet-ref></instance></deployment></deployments>

#body { background-image: url(images/portal_background.gif); background-repeat: repeat-x; background-color: #d5d9be; margin: 0px; padding: 0px; font-family: Georgia, "Times New Roman", Times, serif; font-size: 12px; color: #353634;}

52 writer.println("<br><b>(TM) BoldText</b>");53 writer.close();54 }55 }

56 }

"SELECT * from html_data.news order by id"

ant clean; ant

<target name="deploy" depends="clover-yes, clover-no"> <javac srcdir="${src.dir}" destdir="${classes.dir}" classpath="${libs}" debug="off" optimize="on" deprecation="on" compiler="${compiler}"> <include name="main/org/jboss/portlet/**/*.java"/> </javac>

<!-- portal-hello-lib.jar --> <jar jarfile="${build.lib}/samplesqlportlet-lib.jar"> <fileset dir="${classes.dir}"/> </jar>

<mkdir dir="${build.resources}/samplesqlportlet-war/ ↵ WEB-INF/lib"/> <copy file="${build.lib}/samplesqlportlet-lib.jar" ↵ todir="${build.resources}/samplesqlportlet-war/ ↵ WEB-INF/lib"/>

<!-- portal-hello.war --> <jar jarfile="${build.lib}/samplesqlportlet.war"> <fileset dir="${build.resources}/ ↵ samplesqlportlet-war"/> </jar>

<copy todir="/home/jboss/jboss-portal/server/ ↵ default/deploy" file="${build.lib}/ ↵ samplesqlportlet.war"/>

</target>

Page 71: 067 Системный Администратор 06 2008

69№6, июнь 2008

web

Рисунок 13. В списке портлетов появился и наш

Рисунок 14. Результат выборки MySQL-базы в теле портлета

пользуется шрифт, указанный в пара-метре font-family с размером в 12 пунк-тов. Его цвет – #353634.

Как видите, с дизайнерской точки зрения понятно. Первым делом после установки портала хочется поменять логотип компании – в тэге #logoName за это отвечает параметр background-image. Осталось только не запутаться с другими тэгами, отвечающими за бо-лее тонкую раскладку, такими как, на-пример, #regionA, #regionB, #regionC, UL#tabsHeader. Они подробно описаны в документации к порталу, поэтому ес-ли вы хотите сделать «лицо» компании действительно эксклюзивным, то про-читайте раздел «24. Layouts and Themes» из JBossPortal Reference Guide.

Стоит также отметить, что за пред-ставление портлетов отвечают тэги ви-да .portlet-название. Например, .portlet-container, .portlet-titlebar-title, .portlet-titlebar-decoration и другие.

Так, тэг .portlet-body управляет цве-товой гаммой портлета

В свете вышеизложенного можно и нужно попросить вашего дизайнера поработать над вашим собственным стилем. Знание CSS, разметки стра-ницы и артистический вкус – и вас за-помнят. Темы, как и портлеты, разво-рачиваются в «горячем» режиме – ко-пированием в директорию deploy.

Пару слов об управляемости пор-тлетов. Как мы уже показали выше, портлеты разворачиваются в реаль-ном времени – нет смысла останав-ливать портал, копировать единич-ные портлеты и запускать заново пор-тал. Если вы составляете свой собст-венный портлет, то внимательно сле-дите за тем, как вы составляете пара-метры (файлы-ресурсы должны иметь корректные параметры). В противном случае портлет не развернется.

Мы рассмотрели одну из са-мых простых реализаций портлета – SampleSQLPortlet. От него не требуется какой-то сложной динамики. Главная его задача – выводить информацию из локальной базы (см. рис. 15).

Добавив более сложную бизнес-логику, мы можем сделать его интел-лектуальнее, например, выводить ин-формацию за последние несколько Рисунок 15. Информация, что будет выводить SampleSQLPortlet

.portlet-body { background-color: #fafaf9;}

Page 72: 067 Системный Администратор 06 2008

70

web

дней. Отмечу также, что обновление содержимого данной базы (html.data) не представляет из себя что-то архислож-ное (см. рис. 16, 17).

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

Где взять дополнительные портлеты? Например, на сай-те JBoss в разделе portletswap. Также можно обратиться к ресурсам https://gems.dev.java.net, http://www.adenin.com/Intranet-Suite/Enterprise-Portal.aspx, http://www.syncex.com, http://portlet-opensrc.sourceforge.net.

Цена вопросаПри проектировании портала стоит помнить, что ваш вы-бор не ограничивается JBoss Portal. Вы можете взять, на-пример, конкурентные продукты – Liferay, uPortal, GridSphere (они все принадлежат к классу Open Source) и попробовать построить портальное решение с их помощью. С финансо-вой точки зрения вы оплачиваете только свои собственные издержки, и, как правило, они будут значительно ниже по-купки коммерческих решений.

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

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

По мере роста масштабов производства и, соответ-ственно, потоков информации зацикливаться на стоимос-ти продукта и его внедрении уже не имеет смысла. В этом случае коммерческие решения выливаются в следующие примерные суммы:n IBM WebSphere Portal Server – 51500 долларов за про-

цессор;n IBM WebSphere Portal Express – 2300 долларов за па-

кет на 20 пользователей или лицензия за каждый CPU до 39999 долларов;

n Oracle AS Portal – лицензия за одного пользователя – 200 долларов или лицензия за каждый CPU – 10000 дол-ларов;

n Oracle AS Portal Standard Edition One – лицензия за од-ного пользователя – 149 долларов или лицензия за каж-дый CPU – 4995 долларов.

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

И в качестве заключения процитирую Юлия Матево-сова (директора аналитического департамента Dresdner Kleinwort Wasserstein): «Сейчас в России многие компании малого бизнеса предпочитают не вкладывать средства в развитие внутренних IT-решений, ограничиваясь кор-поративным сайтом для сотрудников. Как правило, такой подход не приносит компании особой пользы и не влияет на эффективность ее деятельности. Однако при дальней-шем расширении оргструктуры все равно, рано или позд-но, приходится использовать хотя бы минимальный пакет IT-услуг. Иначе эта самая расширенная оргструктура пре-вратится в колосса на глиняных ногах».

1. http://www.kck.ru/kcksite/kckmain2008.nsf/pages/spheres_all.html.

2. http://www.microsoft.com/Rus/Government/Solutions/portal/architecture/default.mspx.

3. http://downloads.sourceforge.net/jboss/jboss-portal-2.6.4-bundled.zip.

4. http://dev.mysql.com/downloads/connector/j/5.1.html.

5. http://prdownloads.sourceforge.net/portlet-opensrc/GooglePortlet.zip?download.

6. ht tp://debian.fmi.uni-sofia.bg/~hiena/googleapi.zip.

7. http://www.googleduel.com/apiexample.php.

8. http://labs.jboss.com/portal/portletswap/portlets_tutorial.html.

9 http://en.wikipedia.org/wiki/JSR_168.10. http://en.wikipedia.org/wiki/Enterprise_

portal.

Рисунок 16. К MySQL-базе можно подключаться с помощью, например, SQLyog

Рисунок 17. Заполнять новыми значениями базу легче простого

Page 73: 067 Системный Администратор 06 2008

71№6, июнь 2008

bugtraq

Множественные уязвимости в Cisco Service Control EngineПрограмма: Cisco Service Control Engine 1000; Cisco Service Control Engine 2000.Опасность: Средняя.Описание: 1. Уязвимость существует из-за ошибки при об-работке попыток авторизации на SCE SSH-сервере. Уда-ленный пользователь может создать большое количест-во подключений и вызвать нестабильную работу устройс-тва или перезагрузку. Уязвимость существует в SCE 1000 и 2000 в версиях до 3.1.6.

2. Уязвимость существует из-за наличия некорректных операций ввода/вывода при обработке легитимного SSH-тра-фика на SCE-интерфейсе управления совместно с некоторы-ми задачами по управлению. Удаленный пользователь мо-жет вызвать отказ в обслуживании устройства. Уязвимость существует в SCE 1000 и 2000 в версиях до 3.0.7 и 3.1.0.

3. Уязвимость существует из-за ошибки в процессе ав-торизации в SCE SSH-сервере, которая не связана с час-тотой попыток входа или другими задачами. Злоумышлен-ник может попытаться использовать определенные учетные данные для попытки смены метода аутентификации, что мо-жет сказаться на производительности системы. Уязвимость существует в SCE 1000 и 2000 в версиях до 3.1.6.URL производителя: ww.cisco.com.Решение: Установите исправление с сайта производителя, доступное для зарегистрированных клиентов.

Переполнение буфера в ядре LinuxПрограмма: Linux kernel версии до 2.6.25.5 и 2.4.36.6.Опасность: Средняя.Описание: Уязвимость существует из-за ошибки проверки границ данных в модулях ip_nat_snmp_basic и cifs в ASN.1 BER декодере. Удаленный пользователь может с помощью специально сформированных BER-кодированных данных вызвать отказ в обслуживании или скомпрометировать це-левую систему.URL производителя: www.kernle.org.Решение: Установите последнюю версию ядра 2.6.25.5 или 2.4.36.6 с сайта производителя.

Множественные уязвимости в Cisco ASA и PIXПрограмма: Cisco Adaptive Security Appliance (ASA) 7.x, 8.x; Cisco PIX 7.x, 8.x.Опасность: Средняя.Описание: 1. Уязвимость существует из-за неизвестной ошибки при обработке TCP ACK-пакетов. Удаленный поль-зователь может с помощью специально сформированного пакета вызвать отказ в обслуживании устройства. Уязви-мости подвержены версии 7.1.x, 7.2.x и 8.0.x.

2. Уязвимость существует из-за неизвестной ошибки при обработке TLS-протокола. Удаленный пользователь мо-жет с помощью специально сформированного TLS-пакета вызвать перезагрузку устройства. Уязвимости подверже-ны версии 8.0.x и 8.1.x.

3. Уязвимость существует из-за неизвестной ошибки в Instant Messaging Inspection. Удаленный пользователь мо-жет вызвать отказ в обслуживании устройства. Для успеш-ной эксплуатации уязвимости Instant Messaging Inspection должен быть включен. Уязвимости подвержены версии 7.2.x, 8.0.x и 8.1.x.

4. Уязвимость существует из-за неизвестной ошибки, ко-торая позволяет вызвать перезагрузку устройства посред-ством специально сформированного трафика (например, с помощью сканера уязвимостей/портов) на порт 443/TCP.

5. Уязвимость существует из-за неизвестной ошибки, которая приводит к некорректной работе списков контроля доступа. Удаленный пользователь может обойти ограниче-ния ACL. Уязвимости подвержены версии 8.0.x.URL производителя: www.cisco.com.Решение: Установите исправления с сайта производителя.

Отказ в обслуживании в Apache mod_proxyПрограмма: Apache 2.2.8 и 2.0.63, возможно, более ран-ние версии.Опасность: Низкая.Описание: Уязвимость существует из-за ошибки в функ-ции ap_proxy_http_process_response() при перенаправле-нии промежуточных ответов. Удаленный пользователь мо-жет заставить модуль mod_proxy отправить большое коли-чество промежуточных ответов клиенту и потребить боль-шое количество памяти на системе.URL производителя: www.apache.org.Решение: Установите исправление из SVN-репозитория производителя.

Выполнение произвольного кода в ядре LinuxПрограмма: Linux kernel 2.6.18, возможно, другие версии.Опасность: Средняя.Описание: Уязвимость существует из-за недостаточной проверки входных данных в функции dccp_feat_change() файла net/dccp/feat.c в подсистеме DCCP (Datagram Congestion Control Protocol). Удаленный пользователь мо-жет вызвать переполнение буфера и выполнить произволь-ный код на целевой системе.URL производителя: www.kernel.org.Решение: В настоящее время способов устранения уязви-мости не существует. Некоторые производители Linux-сис-тем выпустили исправления.

Спуфинг-атака в Net-SNMPПрограмма: Net-SNMP версии до 5.4.1.1, 5.3.2.1 и 5.2.4.1.Опасность: Низкая.Описание: Уязвимость существует из-за ошибки при про-верке подлинности HMAC-дайджеста. Удаленный поль-зователь может с помощью специально сформированно-го SNMPv3-пакета, с неполным однобайтным HMAC-дай-джестом, увеличить возможность удачной подмены до 1 из 256 пакетов.URL производителя: net-snmp.sourceforge.net.Решение: Установите последнюю версию 5.4.1.1, 5.3.2.1 или 5.2.4.1 с сайта производителя.

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

Page 74: 067 Системный Администратор 06 2008

72

web

Суть проблемыВ последнее время наблюдается неко-торый спад тотального доминирования ОС семейства Windows от компании Microsoft. Многие корпоративные сек-торы начали переходить на альтерна-тивные системы. Также идет рост раз-вития смартофонов и прочих мобиль-ных персональных устройств. В связи

с этим наблюдается повышенный инте-рес к кроссплатформенному програм-мированию. И это понятно. Писать для каждой платформы свою версию ПО с учетом всевозможных особеннос-тей очень дорогое удовольствие. Мно-гие знают о языке Java компании Sun Microsystems, девизом которого явля-ется выражение «Написано однажды –

работает везде!». Java является плат-формо-независимым технологическим решением. При разработке на Java нет необходимости в разработке програм-много обеспечения под каждую плат-форму: приложения можно внедрять без каких-либо изменений на любых платформах (ну почти, достаточно хо-тя бы попробовать написать програм-

Оцениваем технологию Adobe AIR

Александр Майоров

С бурным развитием технологий все больше и больше стирается грань между Интернетом и системами пользователей. Появляется много сервисов, заменяющих стандартные настольные программы. Идет бурное освоение десктопа интернет-приложениями, и свидетельством тому – новая технология от Adobe.

Page 75: 067 Системный Администратор 06 2008

73№6, июнь 2008

web

му на J2ME, работающее одинаково хорошо в полноэкранном режиме на разных телефонах). Для работы такого ПО на каждой платформе должна быть установлена среда выполнения Java (Java Runtime Environment, JRE).

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

Представьте себе, что сервис Gmail мог бы работать даже в оффлайно-вом режиме и мог бы запускаться не только через браузер, но и как са-мостоятельное настольное приложе-ние. И вам не обязательно было бы все время иметь соединение с Интерне-том для работы данного сервиса. На-пример, вы находитесь в метро с но-утбуком. У вас тем не менее открыт Gmail, оформленный в виде нативной программы, и вы пишете письмо. На-жимаете кнопку «Отправить», и Gmail сообщает вам, что письмо поставле-но в очередь на отправление. Заме-чательно, не правда ли? Как такое возможно, спросите вы? Если бы мы писали такое приложение, то общая схема работы должна была быть сле-дующей:n проверка соединения с Интерне-

том;n если соединение установлено – от-

правляем почту;n если соединение не установлено –

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

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

вались бы только часто используемые данные. Фантастика? Ну почему же.

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

А что, если в качестве инструмен-та программирования для написания такого клиентского настольного при-ложения мы бы использовали те же самые инструменты что и для WEB? А само приложение выполнялось бы в некоторой среде исполнения по ти-пу Java-приложений. И весь наш сер-вис был бы доступен как из браузеров (естественно, с ограничениями, накла-дываемыми браузерами), так и в ви-де отдельного самостоятельного при-ложения, работающего независимого от того, есть ли в данный момент со-единение с Интернетом. Причем оди-наково вне зависимости от ОС, на ко-торой это приложение исполняется в данный момент!

Воздушное решение от AdobeКомпания Adobe решила попытаться сделать миф реальностью и начала разработку проекта под кодовым наз-ванием Apollo, который в последствии был переименован в Adobe AIR (Adobe Integrated Runtime). Эта технология как раз и создана для веб-разработчиков, которые хотели бы не просто создавать веб-сервисы, но и писать обычные на-стольные приложения для десктоп-систем. Раньше это означало бы, что веб-разработчик должен переквали-фицироваться в системного програм-миста и освоить языки программиро-вания типа C/C++, Java, ObjectPascal или что-то подобное. Но теперь, с вы-ходом новой платформы, это не обяза-тельно. Adobe AIR позволяет частично решить эту проблему.

Adobe Integrated Runtime – это не просто средство для разработки многофункциональных мультимедий-ных сетевых RIA-приложений (Rich Internet Applications), но и среда вы-полнения для веб-сервисов на рабо-чем столе. Особенностью таких про-грамм является обладание привлека-тельным интерфейсом и, конечно же, возможность работы как онлайн, так и оффлайн.

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

Таким образом становится ясна двойственная природа AIR. С одной стороны, это программа запуска Flash-приложений, которая может показать-ся лишь усложненной версией старого Flash-плейера.

С другой стороны, она предназна-чена для запуска приложений, напи-санных на DHTML и JavaScript, что ста-новится возможным благодаря меха-низму браузера Webkit, являющимся неотъемлемой частью Adobe AIR.

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

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

Page 76: 067 Системный Администратор 06 2008

74

web

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

Возможности AIRК основным возможностям, которыми обладает Adobe AIR, можно отнести встроенный браузерный движок, поз-воляющий использовать все возмож-ности DHTML, CSS, JavaScript и Flash в едином рабочем пространстве.

При разработке приложений про-граммист одновременно может ис-пользовать Javascript для доступа к возможностям Flash, а Flash-про-граммист, в свою очередь, к JavaScript-библиотекам.

В итоге можно создавать гибрид-ные приложения, сочетающие в се-бе плюсы обеих технологий. Имеется встроенное хранилище данных на ба-зе SQLite, в котором приложение может хранить пользовательскую информа-цию на локальной системе. AIR-прило-жения имеют доступ к файловой сис-теме на пользовательском компьюте-ре, что позволяет осуществлять рабо-ту с файлами пользователя. Есть под-держка «Drag'n'Drop», что обеспечи-вает возможность «перетаскивания» данных между приложениями посред-ством мыши, как и во многих настоль-ных приложениях. Поддержка прозрач-ности окон, возможность работы с бу-фером обмена и мультимедиа (зву-ком, видео (FLV), экраном). Возможна асинхронная работа с сетевыми ресур-сами, поддержка отправки и загрузки данных. Доступна работа с PDF и уп-равление цифровыми правами на кон-

тент. Создана возможность для са-мостоятельного обновления прило-жений встроенными программными средствами.

Все основные возможности Adobe AIR по пунктам:n File I/O API (встроенное API для ра-

боты с файловой системой пользо-вателя);

n SQLite API (API для работы с SQLIte из Adobe AIR-приложений);

n Flash Player 9;n полнофункциональный HTML;n с в я з ь м е ж д у A c t i o n S c r i p t 3

и JavaScript;n поддержка drag-and-drop;n поддержка буфера обмена;n ассоциация с типами файлов;n иконки приложения;n поддержка PDF.

Наряду с вышедшей бетой Adobe Flex 3 Adobe AIR является основой ком-плексной платформы компании, дела-ющей возможным для разработчиков создание RIA-приложений и их достав-ку на устройства под управлением всех основных ОС. На сегодняшний день платформа поддерживает три опера-ционные системы: Windows, MacOS и Linux. При разработке AIR-приложе-ний можно использовать следующие технологии и библиотеки:n Flash/Flex;n DHTML;n XML;n CSS;n JavaScript: Yahoo User Interface (YUI);

Prototype; Dojo; Ext JS; Adobe Spry; Aflax; jQuery; Mootools; Rico; Scriptaculos.

ИнструментарийВ то время как для Windows и MacOS доступна уже 3-я бета, то для Linux до-ступна всего лишь альфа-версия. По-этому приложения AIR для GNU/Linux пока не могут работать в полном объ-еме и использовать весь заявленный разработчиками функционал. Более того, Adobe AIR доступна не для всех GNU/Linux-платформ. Альфа-версия Linux AIR поддерживает следующие ОС: Red Hat Desktop 4, RHEL 5, Novell Desktop 9, SUSE 10, Ubuntu 6.06. Тре-бует рабочую среду GNOME или KDE, а также наличия композитных менед-жеров Beryl, Compiz, Compiz-fusion для поддержки эффектов прозрачнос-ти. Не поддерживаются уведомления об обновлениях, регистрация типов файлов, запуск приложений из брау-зера, сочетания клавиш, печать, авто-запуск приложений, отображение PDF и SWF внутри DHTML, стек протоколов Ipv6. Нет возможности корректной ра-боты с кириллицей.

Несомненно, все эти недостат-ки исправят в ближайшем будущем, и разрыв между версиями для раз-ных платформ сократится. А пока луч-ше всего пробовать технологию на ОС семейства Windows или MacOS, хо-тя и под GNU/Linux стоит посмотреть (лично я, мягко говоря, не был в вос-торге от 1-й альфы, установленной под OpenSUSE 10.3).

Прежде чем приступить к разработ-ке, следует скачать и установить не-обходимый набор инструментов. Аль-фа-версию Adobe AIR для GNU/Linux можно скачать по этой ссылке: http://labs.adobe.com/downloads/air_linux.html. Бета-версии для Windows и MacOS до-ступны на странице http://labs.adobe.com/downloads/air.html.

Помимо самой среды исполнения для разработки AIR-приложений вам необходим AIR SDK. Он состоит из сле-дующих основных компонентов:n AIR runtime;

Рисунок 1. Среда разработки Aptana Studio

Page 77: 067 Системный Администратор 06 2008

75№6, июнь 2008

web

n ADT;n ADL.

ADT – AIR Developer Tool – утилита, позволяющая соз-давать AIR-архивы (файлы с расширением air) для распро-странения. По сути это утилита, создающая инсталятор ва-шего AIR-приложения.

ADL – AIR Debug Launcher, является ключевым компо-нентом в AIR SDK. C его помощью вы тестируете AIR-при-ложение, перед созданием финального релиза.

AIR SDK доступна на сайте Adobe по адресу http://www.adobe.com/products/air/tools. Также там доступны средства разработки. AIR SDK можно скачать как отдельно, так и в виде расширения для Adobe Dreamweaver, что, несомнен-но, будет очень удобно разработчикам. Но лично мне по-казалось, что писать под AIR более удобно в специализи-рованной студии Aptana Studio (http://www.aptana.com), ос-нованной на Eclipse (см. рис. 1). Сам AIR SDK подключает-ся к студии плагином. Естественно, никто не мешает прос-то подключить плагин в самой Eclipse. Особенно приятно, что эта среда разработки кроссплатформенная и сущест-вует почти для всех операционных систем.

Пишем приложениеПосле того, как вы установите среду Adobe AIR (см. рис. 2) и скачаете SDK, можно приступать к работе. С установкой среды проблем возникнуть не должно, так как даже для GNU/Linux-систем среда распространяется в виде бинар-ных пакетов. Что касается SDK, то это просто набор фай-лов и программ, которые можно установить куда угодно. До-пустим, если это ОС Windows, то можете распаковать архив прямо в корень, в директорию C:\AirSDK, так будет удобней работать. Тут уже вы сами решаете, как вам лучше сделать. Создайте директорию для ваших AIR-проектов, допустим это C:\AirProjects. Теперь почти все готово. Кстати, хочу ска-зать, что я буду показывать, как писать приложение без все-возможных дополнительных инструментов, таких как Aptana Studio. Дело в том, что таким образом вы лучше всего смо-жете понять архитектуру системы. А впоследствии, если вы всерьез займетесь разработкой на AIR, лучшим реше-нием будет использовать специализированные инструмен-тальные средства. Просто та же Aptana Studio при создании приложения за вас генерит стартовый код, как и все студии вобщем-то, что не очень годится для первого знакомства и понятия сути и идеологии разработки.

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

Итак, приступим. Не будем нарушать традиции, нач-

нем с банального «Hello World», так как нам надо понять суть создания приложений на AIR. Создаем в нашей ди-ректории проектов новую папку, назовем ее HiPeople (на-доело писать «хелловорлд»). В директории вашего проек-та структуру вы задаете сами, как считаете нужным. Если это простое приложение, то можно все скинуть в кучу. Если вы делаете сложное приложение, то лучше разделять фай-лы. Минимальное разделение можно сделать таким обра-зом: создать для каждого типа файлов свои директории. Например, для нашего проекта в директории C:\AirProjects\HiPeople создаем следующую иерархию:n air;n css;n js;n dhtml;n xml;n icons.

Далее условимся, что корневой директорией проекта бу-дем называть каталог C:\AirProjects\HiPeople\ для краткос-ти. Чтобы среда AIR могла понять, что у нас за программа и как ее запускать, нужно создать так называемый файл-дескриптор приложения. Это обычный XML-файл, в кото-ром описываются основные свойства нашей будущей про-граммы, например, такие как: название и автор ПО, раз-меры и свойства главного окна, иконки и многое другое. Без этого файла AIR-приложение работать не сможет. Итак, в корневом каталоге проекта создаем файл descriptor.xml. Содержимое файла приведено ниже:

Рисунок 2. Установка среды Adobe AIR

<?xml version="1.0" encoding="utf-8" standalone="no"?><application xmlns="http://ns.adobe.com/air/application/1.0"> <id>majorsoft.ru.example.HiPeople</id> <filename>main</filename> <name>HiPeople!</name> <version>0.1</version> <description>MajoRSofT</description> <initialWindow> <content>index.html</content> <title/> <transparent>false</transparent> <visible>true</visible> <minimizable>true</minimizable> <maximizable>false</maximizable> <resizable>false</resizable> <width>600</width>

Page 78: 067 Системный Администратор 06 2008

76

web

Некоторые записи файла нуждаются в пояснении:n Параметр id – должен принимать уникальное значе-

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

n Параметр filename – используется для создания дирек-тории установки на системе пользователя. Параметр обязательный.

n Параметр version – служит для контроля версий. Обя-зательный параметр.

n Параметр name – имя, отображаемое в инсталяторе при установке вашего приложения. Устанавливается опци-онально по вашему желанию. То есть его можно даже не писать, если не хотите.

n Параметры description, title, copyright – говорят о сво-ем предназначении сами за себя и не нуждаются в опи-сании. Устанавливаются опционально.

n Раздел initialWindow – настройки главного окна прило-жения. Обязательный раздел. Без него приложение ра-ботать не будет. Этот раздел содержит: Параметр content – стартовая страница приложе-

ния. Обязательный параметр. Не будем нарушать традиции веб-разработчиков и назовем наш стар-товый файл index.html.

n Раздел icon – служит для описания доступных иконок приложения и устанавливается опционально. Если в ва-шем приложении нет иконок, то опустите этот раздел.

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

ректорию для установки по умолчанию. Этот путь вы-свечивается в инсталяторе при установке вашего AIR-пакета.

n Параметр programMenuFolder – позволяет задать ди-ректорию, которая высвечивается в «Start → Programs» в Windows. Параметр не обязателен и устанавливается только для ОС Windows.

С дескриптором закончим. Перейдем к нашему файлу стартового окна index.html.

Для примера хватит. В файле css/main.css , как вы поня-ли, я создал описание стилей моего приложения. Вдаваться в подробности по поводу CSS не вижу смысла. Теперь в ди-ректорию air нашего проекта скопируйте файл AIRAliases.js из директории, куда вы устанавливали SDK. Для приме-ра у меня этот путь выглядит так: C:\AirSDK\frameworks. Это файл для создания псевдонимов AIR API, осуществляющий быстрый доступ к классам среды.

Настал черед тестирования нашего приложения. Для этого нам понадобится утилита ADL. Она находится в папке bin в директории с SDK. Запускаете консоль и пи-шете команду:

Так как пути не прописаны, то вам придется указывать полные пути до утилит и файлов. Вы можете прописать пути в переменные окружения вашей ОС (способ зависит от ОС), можете написать простейший сценарий для запуска вашего приложения на тест, чтобы каждый раз не писать весь путь руками в консоли. Для Windows это будет файл такого типа:

Положите этот файл в корневую директорию проекта, назовите run.cmd и запустите. Для пользователей Windows есть еще 1 способ. Достаточно перетащить мышкой ваш файл дескриптора на приложение adl.exe, и оно запустит-ся, приняв в качестве аргумента ссылку на ваш файл де-скриптор. После запуска вы увидите окно с заданными па-раметрами и нашей надписью.

Теперь попробуем использовать Javascript в нашем при-ложении. Попробуем загрузить текстовый файл и вывес-ти его содержимое. Добавьте в файл index.html следую-щие строки:

Потом добавьте в файл js/main.js код следующего со-держания:

<html><head><link href="/css/main.css" rel="stylesheet" type="text/css"><title>My first application</title>

adl descriptor.xml

@echo offC:\AirSDK\bin\adl.exe descriptor.xmlpause

<div> <div id="divLocalFile">Empty...</div> <input type="button" onclick="document.getElementById('divLocalFile'). ↵ innerHTML = readLocalFile('LocalFile.txt')" value="Load local file" ></div>

function readLocalFile(name){ name || alert('Empty file name!');

var file = new air.File("app:/" + name); var content = '';

if (file.exists) { var fp = new air.FileStream(); fp.open(file, air.FileMode.READ); if (fp.bytesAvailable > 0)

<height>400</height> <x>200</x> <y>200</y> <minSize>400 200</minSize> <maxSize>1280 1024</maxSize> </initialWindow> <icon> <image16x16>icons/AIRApp_16.png</image16x16> <image32x32>icons/AIRApp_32.png</image32x32> <image48x48>icons/AIRApp_48.png</image48x48> <image128x128>icons/AIRApp_128.png ↵ </image128x128> </icon></application>

<script type="text/javascript" ↵ src="/air/AIRAliases.js"></script></head><body> <div class="class1">Hi, people!</div></body></html>

Page 79: 067 Системный Администратор 06 2008

77№6, июнь 2008

web

Как видите, ничего сложного. Мы открываем файл, ко-торый должен находиться внутри нашего проекта, на что указывает app:/ в имени файла. После чего создается объ-ект air.File, с информацией о нашем файле. Например, раз-мер файла можно узнать, обратившись к свойству объек-та size: alert(file.size). Таким образом только что было про-демонстрировано, как можно работать с File/IO API, реа-лизованном в AIR.

Кстати, для отладки не обязательно использовать alert() как привыкли многие веб-разработчики. В AIR есть специ-альная функция для этих целей. Если вы хотите вывести на консоль отладочную информацию, то используйте air.trace(). Вывод будет осуществляться именно в консоль, а не в ви-де всплывающих окон.

Также в комплекте есть специализированный инстру-мент для отладки приложений – интроинспектор. Эта кон-соль своего рода Firebug для Adobe AIR. Чтобы им вос-пользоваться, добавьте в директорию air нашего прило-жения файл AIRIntrospector.js из AIR SDK. В index.html до-бавьте строчку:

Теперь, после запуска приложения, вы можете нажать клавишу <F12>, и будет запущен интроинспектор, который поможет вам отладить приложение.

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

можно заменить следующей:

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

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

то напишите в ссылке «target="_blank"». То есть схема по-ведения понятна, здесь все то же самое, что и в обычных браузерах. Но вот если вы хотите открыть ссылку именно в браузере пользователя, который у него стоит, то для это-го можно написать небольшую Javascript-функцию. В файл js/main.js добавьте следующий код:

В файле index.html для проверки функции достаточно написать:

Рассказывать про то, как отсылать файлы на сервер по-средством XMLHttpRequest() не буду, так как по этой теме вы точно найдете документацию. Лучше расскажу, как отпра-вить файлы на сервер средствами AIR, и не просто, а через механизм «Drag & Drop». Итак, для начала напишем функ-цию инициализатор:

Добавьте эти строки в файл main.js. В файле index.html надо добавить вызов загрузчика:

и создать слой, который будет принимать «Drag&Drop» со-общения:

Что мы сделали? В функции init() мы повесили на слой с id = target обработчики «Drag&Drop» сообщений. Теперь их надо описать. Добавляем в main.js:

Все. Как написать скрипт-обработчик на том же PHP, ду-маю, рассказывать нет смысла. Речь идет не об этом. Те-

<script type="text/javascript" ↵ src="/air/AIRIntrospector.js"></script>

var file = new air.File("app:/" + name);

var file = air.File.applicationDirectory.resolvePath(name);

var file = air.File.desktopDirectory.resolvePath(name);

function openUrlInStandartBrowser(url){ air.navigateToURL( new air.URLRequest(url) ); }

<a href="#" onclick="openUrlInStandartBrowser ↵ ('http://majorsoft.ru/')">Open link in browser</a>

var target = null;function init(){ target = document.getElementById('target'); target.addEventListener("dragover", dragOver); target.addEventListener("drop", dropHandler);}

<body onLoad="init()">

<div id="target" style="border:1px solid ↵ #ccc;height:100px">Drag & Drop</div>

function dragOver(event) { event.preventDefault(); }function onComplete(event) { target.innerHTML = ↵ "UploadComplete!"; }function dropHandler(event){ var request = new air.URLRequest ↵ ("http://majorsoft.ru/air_test_upload.php"); request.method = air.URLRequestMethod.POST; var files = event.dataTransfer.getData ↵ ("application/x-vnd.adobe.air.file-list"); for (i in files) { files[i].addEventListener ↵ (air.Event.COMPLETE, onComplete); files[i].upload(request, "uploadedFile");// Вывод сообщений в консоль для контроля работы. // В финальной версии эта строка не нужнаair.trace("File " + files[i].name + " is upload..."); }}

{ content = fp.readUTFBytes ↵ (fp.bytesAvailable); } fp.close(); return content; } else { return "File " + name + " not exists!"; }}

Page 80: 067 Системный Администратор 06 2008

78

web

перь перетащите любые файлы в «Drag&Drop» область на-шего приложения и они будут загружены на сервер.

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

Сборка приложенияПосле того как было написано и оттестировано приложе-ние, его следует упаковать в AIR-контейнер, доступный для распространения. Делается это с помощью утилиты ADT из AIR SDK. Для работы ADT необходимо установить Java runtime (http://www.java.com/ru/download/index.jsp). AIR-кон-тейнер должен быть подписан сертификатом. Таким обра-зом проверяется подлинность AIR-приложения. Сертифика-ты известных разработчиков – это гарант качества прило-жения. Для тестирования можно использовать сертификат, который можно сгенерировать самостоятельно. Для про-дажи можно купить сертификаты, которые выдают, напри-мер, VerySign или Thawte. В нашем случае, когда пользова-тель устанавливает приложение, он видит, что «издатель»

не указан. Генерация сертификата осуществляется следу-ющим образом:

Последний параметр «123» в данной строке – это ваш пароль. Он пригодится при создании AIR-архива. Пароль вы задаете сами. Мне для теста проще было написать «123».

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

Мы перечисляем все файлы, которые обязательно идут в AIR-пакет. Будет запрошен ваш пароль, который вы пи-сали при генерации сертификата. После этого на выходе получаем файл HiPeople.air весом до 40 Кб. Этот пакет мы и можем распространять и запускать на разных платфор-мах. После установки на рабочем столе появится икон-ка нашего приложения, которая и позволит его запускать (см. рис. 3).

Обзор AIR-приложенийНа официальном сайте Adobe предлагаются готовые AIR-приложения (http://www.adobe.com/cfusion/exchange/index.cfm?event=productHome&exc=24&loc=en_us).

По некоторым из них я сделаю краткий обзор, дабы вы имели более полное представление о рассматриваемой технологии.

Итак, первым в нашем импровизированном хит-пара-де идет программа WebKut (http://toki-woki.net/p/WebKut). Это простое, но от того не менее интересное AIR-прило-жение. С помощью WebKut вы сможете делать снимки веб-страниц или их частей буквально за секунду. Есть три воз-можности захвата скриншота: страница целиком, теку-щий вид или по выбору пользователя. Приложение очень удобное.

Twhirl (http://www.twhirl.org) – интересная реализация клиента для популярного сервиса Twitter. Twhirl переносит любимый сервис на ваш рабочий стол, и больше не нужно постоянно обновлять страницу с твитами – за вас это де-лает приложение (см. рис. 5).

ColorBrowser (http://code.google.com/p/colorbrowser) – удобный инструмент для работы с цветом. Есть возможность создавать шаблоны любимых цветов, а также наборы па-литр. Полезный инструмент, пригодится дизайнерам.

Клиент для музыкальной библиотеки Finetune (http://finetune.com), расширяющий возможности сервиса с помо-щью AIR. Сервис представляет собой что-то среднее меж-ду настраиваемым радио и сервисом поиска музыкального контента. Напечатав название исполнителя, вы можете не только прослушать его композиции, но и получить список треков, которые подберет вам система рекомендаций. Есть возможность создания собственных списков проигрывания. Сервис предлагает возможность находить треки из музы-

C:\AirSDK\bin\adt -package -storetype pkcs12 ↵ -keystore MyCert.pfx HiPeople.air descriptor.xml ↵ index.html js/main.js css/main.css ↵ air/AIRAliases.js LocalFile.txt icons/*.pn

Рисунок 3. Окно инсталлятора AIR-пакета

Рисунок 4. Finetune-клиент

C:\AirSDK\bin\adt -certificate -cn SelfSigned -ou Dev ↵ -o "HiPeople" -c US 2048-RSA MyCert.pfx 123

Page 81: 067 Системный Администратор 06 2008

79№6, июнь 2008

web

кальной библиотеки и на их основе создавать плей-листы (см. рис. 4).

AOL Top 100 Videos (http://music.aol.com/help/syndication/desktop-widgets) – представляет собой небольшое AIR-приложение с расширенными возмож-ностями просмотра музыкальных кли-пов и текстового контента. Расширен-ные возможности ограничиваются про-смотром видеоклипов в стандартном и полноэкранном режимах. Кроме того, можно поставить закладку понравив-шегося клипа и вернуться к его про-смотру в любой момент.

Стоит ли овчинка выделки?Что ж, пришла пора разобраться, что мы делали и стоит ли это того. Сказать, что технология от Adobe так уж но-ва, не могу. Дело в том, что в Windows что-то подобное было уже давно, толь-ко выполнялось все это не в отдельной среде исполнения и работало только на ОС Windows. Я говорю про специ-альный браузер, который обрабаты-вал файлы с расширением HTA. Этот браузер очень напоминает браузер от Adobe AIR. Правда, его не надо было дополнительно устанавливать, в от-личие от AIR. Там также описывалось приложение через XML. В качестве языка программирования использова-лась технология WSH (Windows Script Host), позволяющая работать с XML + JScript + VBScript. Ваш покорный слуга в далеком двухтысячном году даже пи-сал приложение, очень напоминающее стандартный WordPad и умеющий ре-дактировать локальные файлы поль-зователя. По внешнему виду приложе-ние также очень смахивало на натив-ное ПО. Для его распространения ис-пользовались самораспаковывающи-еся архивы SFX. Adobe AIR чем-то на-поминает вышеописанный подход к со-зданию приложений, но более в мас-штабном варианте, да к тому же с ис-пользованием более развитых техно-логий. По этой причине я и не могу ска-зать, что Adobe AIR – это действитель-но инновационная технология.

Необходима ли данная платфор-ма? Это спорный вопрос. Да, Adobe AIR действительно позволяет сти-рать грани между веб-приложениями и настольными программами. Исполь-зуя возможности, предоставляемые DHTML, CSS, SWF, JS и т. д. Веб-ин-

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

Платформа AIR действительно рас-ширяет спектр возможностей, доступ-ных веб-разработчику. Но практичес-ки единственный аргумент, подтверж-дающий полезность Adobe Air, состоит в том, что не нужно разрабатывать два приложения, для веба и для дескто-па, достаточно разработать одно. Од-нако ясно, что технологии, используе-мые в Adobe AIR, изначально не пред-назначались для проектирования де-сктопных приложений, поэтому соз-давать их будет непросто, да и по воз-можностям они будут уступать тра-диционным программам. Более того, код для клиентской настольной части и для серверной все равно будет от-личаться, так что говорить, что Adobe AIR – это панацея от написания лишне-го кода, никак нельзя. Я считаю, что ес-ли есть надобность в написании крос-сплатформенных приложений, то надо смотреть в сторону Java или С++ с ис-пользованием кроссплатформенных библиотек. А если учесть, что сейчас идет бурное развитие мобильных уст-ройств и все больше становится поль-зователей Всемирной паутины, то тог-да Adobe должен начать выпускать AIR для мобильных платформ, а это, увы, с использованием текущих инстру-ментов будет очень затруднительным. Да и скорость таких приложений будет оставлять желать лучшего. Но это мое мнение. Стоит ли осваивать эту тех-нологию – решать вам и только вам. То, что стоит хотя бы посмотреть и оп-робовать, – это бесспорно! Особенно веб-разработчикам.

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

лей», в то время как на Java или C++ это решалось бы без проблем. А вооб-ще, конечно, неплохая идея. И эта тех-нология имеет право на жизнь. Более того, может, через несколько лет про-граммирование на AIR станет такой же обыденностью, как и использова-ние AJAX в нынешних веб-сервисах. Поживем – увидим.

Уже сейчас написано достаточное количество программ для Adobe Air, позволяющее оценить технологию во всей красе (http://airapps.pbwiki.com/FrontPage). В Linux-версии среды AIR на данный момент работают не все приложения. Список поддерживаемо-го ПО в GNU/Linux можно взять здесь: http://labs.adobe.com/technologies/air/samples. Альфа-тестирование Adobe AIR для GNU/Linux должно закончить-ся 1 марта 2009 года. Выход финаль-ной версии для всех заявленных плат-форм ожидается во второй половине 2009 года.

1. Статья про создание AIR-приложе-ний в Aptana Studio – http://extjs.com/blog/2007/06/29/building-a-desktop-application-with-ext-air-aptana-and-red-bull.

2. Цикл статей о программировании на Adobe AIR + ExtJS – http://dev.aol.com/blog/bricemason/adobe-air-xdrive-picture-syncing-part-1.

3. Документация по Adobe AIR – http://www.adobe.com/devnet/air/ajax/getting_started.html.

4. Статья, демонстрирующая рабо-ту с AdobeAIR + Flex+ SQLite – http://lifeflex.shaggysmile.com/air/flex_to_air_migration.html.

Рисунок 5. Twitter-клиент на AIR

Page 82: 067 Системный Администратор 06 2008

80

web

ПредысторияPHP-GTK (http://gtk.php.net), пакет для написания на PHP настольных GUI-приложений появился на свет благода-ря Андрею Змиевски (Andrei Zmievski), одному из осно-вателей Zend inc. Андрея вдохновило появление пакетов PyGtk и GTK-Perl, и он решил попробовать сделать сред-ства для работы с GTK+ на PHP. Заручившись поддержкой создателя PyGtk (инструмента для работы с Gtk+ на язы-ке Python) Джеймса Хестриджа (James Henstridge), он на-чал работу. Чуть позже к ней присоединился программист Фрэнки Крованни (Frank'у Kromann'у). Первый релиз PHP-GTK был представлен общественности 1 марта 2003 года. Проект зажил самостоятельной жизнью с собственным сай-том и CVS-репозитарием.

Казалось бы всё было отлично – тысячи разработчиков получили в свои руки кроссплатформенный инструмент для разработки оконных приложений на PHP, но всё оказалось не так просто. Большинство программистов встретили этот продукт не с распростёртыми объятиями. Самый главный вопрос, который возникал, был «Зачем?» В самом деле, зачем нужен подобный инструментарий, когда настольные приложения можно писать на Си + Gtk или на MSVC++? Пре-имущества использования скриптового языка оценены не- были, и широкого распространения технология не получи-ла. Довольно долго о проекте мало что было слышно. Нет, редкие новости на сайте появлялись, было видно, что рабо-та ведётся, но и только. И вот теперь у нас есть PHP-GTK 2. Какие новые возможности он нам даёт? В чём его отличия от предшественника? Сложится ли судьба этой версии удач-ней? Чтобы попытаться ответить на эти вопросы, предла-гаю установить новинку и опробовать её в деле.

УстановкаПрежде всего следует обратить внимание на то, что PHP-GTK2 работает с версией PHP-интерпретатора не ниже 5.1. Впрочем это не особенно важно, так как установка в боль-шинстве случаев предполагает собственный экземпляр интерпретатора.

Пакет доступен для платформ Windows, MacOS, Linux и (как сказано в документации) может быть установлен на большинство POSIX-совместимых операционных сис-тем. Сначала попробуем установить этот пакет на опе-рационную систему Linux (был использован дистрибутив OpenSUSE 10.3).

Сразу неважные новости – никаких скомпилированных бинарных пакетов пока недоступно, и ставить пакет придёт-ся по старинке – из исходных текстов. Необходимо выбрать вариант установки – PHP-GTK2 предполагает два способа инсталляции – с использованием уже существующего PHP интерпретатора и отдельную, автономную установку с собс-твенным интерпретатором. Второй способ рекомендован для неопытных пользователей, но мне кажется, он предпочтите-лен в любом случае, так как не только снимает требования по версиям PHP и GTK+ (2.6 на всякий случай), но и поможет избежать путаницы в конфигурациях. Итак, приступим:

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

Всё получилось? Лично у меня не совсем (не угодил вер-сией flex), но это привычные неприятности, будем надеять-ся, что скоро всё будет доступно из пакетов, а пока движем-ся дальше:

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

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

PHP-GTK – вторая попыткаКирилл Сухов

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

$ cvs -d :pserver:[email protected]:/repository login$ cvs -d :pserver:[email protected]:/repository co ↵ -r PHP_5_2 php-src

$ cd php-src$ ./buildconf$ ./configure --prefix=/opt/php5_2 —disable-cgi

$ make$ su$ make install$ echo extension=php_gtk2.so >> /opt/php5_2/lib/php.ini$ /opt/php5_2/bin/php-config --extension-dir | xargs ↵ echo 'extension_dir=' >> /opt/php5_2/lib/php.ini

$ cd ..$ cvs -d :pserver:[email protected]:/repository co php-gtk$ cd php-gtk$ ./buildconf --with-phpize=/opt/php5_2/bin/phpize$ ./configure --with-php-config=/opt/php5_2/bin/php-config$ make$ make install

Page 83: 067 Системный Администратор 06 2008

81№6, июнь 2008

web

И добавить одну строчку в конфигурационный файл php.ini:

А теперь небольшая проверка:

Что и требовалось доказать – расширение php-gtk ус-тановлено.

Под Windows всё гораздо проще – нужно скачать бинар-ный пакет, расположенный на http://gtk.php.net/download.php, и распаковать zip-архив в нужную директорию. В дирек-торию php-gtk, образовавшуюся после распоковки ар-хива, следует скопировать файлы php.exe (CLI-версия) и php5ts.dll, а также dll-файлы расширений PHP, которые планируется использовать. Теперь в системную перемен-ную PATH, нужно добавить путь до php-gtk, и пакет готов к использованию.

Впрочем, есть ещё более простой путь – использовать менеджер Gnope (http://gnope.org). Всё что тут требуется – скачать, запустить инсталлятор и следовать появляющим-ся инструкциям. После нескольких кликов мышкой мы по-лучим полностью работоспособные PHP 5.1, GTK 2.6 и па-кет PEAR.

ХеллоувордимТеперь попробуем сваять небольшое демонстрационное приложение. Пока не будем отступать от канона и созда-дим окошко, используя конструкции, несильно выходящие за рамки первой версии пакета.

Сохраняем следующий код в файл test.phpw:

Теперь запускаем наше приложение командой:

Если всё прошло гладко, должен быть виден результат, аналогичный показанному на рис. 1. Теперь давайте раз-берёмся, как нам это удалось. Как видите, в первых строч-ках скрипта осуществляется проверка на существование загруженного модуля php-gtk2, далее командой:

создаётся новый объект – виджет, экземпляр класса ок-на. Пользователи первой верси php-gtk, наверное, обра-тят внимание на отсутствие амперсанда перед ключевым словом new. Всё верно – времена объектной модели PHP 4 прошли. Теперь задаём свойства окна:

Устанавливаем стильную иконку (стандартный набор представлений тулбар-иконок доступен в документации – http://gtk.php.net/manual/en/gtk.enum.stockitems.php):

Далее позаботимся о корректном закрытии окна:

В данном случае мы связываем сигнал destroy с обрат-ным (callback) вызовом статического метода Gtk::main_quit, который будет применен при закрытии/уничтожении окна.

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

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

$ ln -s /opt/php5_2/bin/php /usr/bin/php-gtk

extension=php_gtk2.so

$ ln -s /opt/php5_2/bin/php /usr/bin/php-gtk

linux-nsv7:/home/geol/Documents # /opt/php5_2/bin/php -m[PHP Modules]ctypedatedomfilterhashiconvjsonlibxmlpcrePDOpdo_sqlitephp-gtk...

<?phpif (!class_exists('gtk')) { die("Please load the php-gtk2 module in your ↵ php.ini\r\n");} $wnd = new GtkWindow();$wnd->set_title('hello php-gtk2');

$wnd->set_default_size(200,300);

$pixbuf = $wnd->render_icon( Gtk::STOCK_EXECUTE, Gtk::ICON_SIZE_DIALOG);$wnd->set_icon($pixbuf);$wnd->connect_simple('destroy', array('gtk', 'main_quit'));

$ php test.phpw

Рисунок 1. Здравствуйте, здравствуйте...

$lblHello = new GtkLabel("Yes!\r\n'Hello php-gtk2!'");$wnd->add($lblHello); $wnd->show_all();Gtk::main();?>

$wnd->set_title('php-gtk2'); //заголовок$wnd->set_default_size(200,300); //размер

$pixbuf = $wnd->render_icon( Gtk::STOCK_EXECUTE, Gtk::ICON_SIZE_DIALOG);$wnd->set_icon($pixbuf);

$wnd = new GtkWindow();

$wnd->connect_simple('destroy', array('gtk', 'main_quit'));

Page 84: 067 Системный Администратор 06 2008

82

web

n Виджет – любой компонент графического интерфей-са, будь то главное окно программы, окно диалога, по-ле ввода или кнопка.

n Контейнер – любой виджет, способный содержать в се-бе другие виджеты.

n Сигнал – сообщение, создаваемое виджетом. Если вы никогда не сталкивались с механизмом сообщений, то ближайшим, (правда, грубым) аналогом будет меха-низм событий в JavaScript (onmousemove, onclick и т. д.). Действительно, некоторые сообщения довольно схо-жи – например при щелчке левой кнопки мыши на об-ласть, занимаемую виджетом, им генерируется сигнал «clickid» и т. д. Для обработки сигналов используются функции обратного вызова.

Строчками:

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

Специально уточню, для пользователей первой версии пакета: в php-gtk2 метод show() тоже присутствует, но он сде-лает видимым только само окно приложения, без (в данном случае) ярлыка. Теперь запускаем приложение:

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

Добавляем функциональностьДля демонстрации работы сигналов отяготим наше при-ложение работой – пусть при нажатии специальной кноп-ки в окошке будут показываться дата и время.

В первую очередь добавим в окно программы ещё один виджет – эту самую кнопку:

Методы и свойства нового объекта подробно освещены в руководстве по php-gtk 2 (http://gtk.php.net/docs.php), озна-комиться труда не составляет, проблема в другом. При до-бавлении кнопки к основному окну:

скрипт даёт следующее сообщение об ошибке:

Ничего удивительного, GtkWindow не может иметь бо-

лее одного потомка (при этом, являясь виджетом верхнего уровня, сам этот объект ничьим потомком выступать не мо-жет). Несмотря на предупреждение, сценарий будет вы-полнен, но никакой кнопки в окне приложения мы не уви-дим. Выход заключается в использовании тегов контейне-ров – GtkHBox или GtkVBox (разница между ними в ориен-тации компоновки):

Командами pack_start() и/или pack_end() мы компонуем виджеты в контейнере-боксе, а его, в свою очередь, добав-ляем в основное окно программы.

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

теперь свяжем сигнал «clicked» кнопки с этой функцией уже знакомым оператором:

Как видите, третьим параметром является аргумент функции – ссылка на объект типа GtkLabel. Если бы пришлось передавать несколько аргументов, их следовало бы упако-вать в массив. Если всё сделано правильно, после запуска скрипта мы можем насладиться результатом. (см. рис. 2).

ОтличияТеперь самое время посмотреть, что же изменилось в PHP-GTK по сравнению с первой версией. Разработчики заяв-ляют, что постарались сделать продукт максимально обрат-но совместимым, но они же за-являют, что удалось это дале-ко не во всем. Логично: если бы не было такой платы за про-гресс, не было бы и прогресса.

К главному отличию в работе с новой версии пакета сам PHP-GTK имеет косвенное отноше-ние. Дело в новой объектной мо-дели, появившейся в пятой вер-сии PHP. Теперь нет необходи-мости для передачи по ссылке на объект использовать ампер-

$lblHello = new GtkLabel("Yes!\n'Hello php-gtk2!");$wnd->add($lblHello);

$wnd->show_all();

Gtk::main();

$button = new GtkButton('press me');$button->set_relief(Gtk::RELIEF_HALF);

$wnd->add($button);

Gtk-WARNING **: Attempting to add a widget with type GtkButton to a GtkWindow, but as a GtkBin subclass a GtkWindow can only contain one widget at a time; it already contains a widget of type GtkLabel

$wnd->set_icon($pixbuf);$wnd->connect_simple('destroy', array('gtk', 'main_quit'));

$box = new GtkVBox();$box->set_spacing(4);// Добавляем кнопку$button = new GtkButton('press me');$button->set_relief(Gtk::RELIEF_HALF);// Добавляем надпись$lbl = new GtkLabel(date('Y-m-d h:i:s'));// Пакуем$box->pack_start($button, false,true,10);$box->pack_start($lbl, true, true);// Помещаем бокс в окно$wnd->add($box);

function foo(GtkLabel $lbl){$lbl->set_text(date('Y-m-d h:i:s'));}

$button->connect_simple('clicked', 'foo',$ll);

Рисунок 2. Создали нечто полезное... ну почти

Page 85: 067 Системный Администратор 06 2008

83№6, июнь 2008

web

санд (&) и конструкции, которые в PHP-GTK1/PHP4 приво-дили к созданию копий, теперь нормально работают с эк-земплярами класса. В примере выше это уже было проде-монстрировано.

Вместе с PHP-GTK1 ушли в прошлое некоторые видже-ты и методы. Рассмотрим таблицу с эквивалентами уста-ревших элементов в PHP-GTK 2.

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

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

При изучении руководства по PHP-GTK 2, можно обна-ружить, что все компоненты, необходимые для создания графического пользовательского интерфейса такого при-ложения, уже присутствуют в пакете. Посему незамедли-тельно приступим.

Прежде всего создадим главное окно:

Завершение программы – запуск жизненного цикла приложения:

Строго говоря, пока метод show_all() тут не нужен, но сейчас мы обеспечим его работой. Сначала позаботим-ся о потомке окна (который, как мы помним, может быть только один):

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

Далее создаём панель с кнопками – тут понадобится ещё один контейнер – объект GtkHButtonBox():

Тут мы создали панель, задали стиль расположения кно-пок и расстояние между ними. Теперь сами кнопки:

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

Продолжаем творить GUI. Познакомимся ещё с одним контейнером GtkHPaned. Он будет группировать элементы в нижней части наружного бокса:

Теперь создадим Календарь (элемент GtkCalendar()) и разместим его в левой части панели:

С правой частью панели несколько сложнее. Следует под-готовить её содержимое заранее. Сначала создаём тексто-вый буфер – объект для хранения и редактирования текста:

Ещё один объект – GtkTextView() необходим для пока-за текстового буфера:

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

Теперь поле ввода записи. Тут подойдёт объект GtkEntry, представляющий собой однострочное поле ввода:

Устаревший виджет Замена

GtkCTree GtkTreeView/GtkTreeStore

GtkCList и GtkList GtkTreeView/GtkListStore

GtkCombo и GtkOptionMenu GtkComboBox/GtkTreeModel

GtkItemFactory GtkUIManager

GtkOldEditable GtkEditable

GtkPixmap and GtkPreview GtkImage/GdkPixbuf

GtkText GtkTextView/GtkTextBuffer

Эквиваленты устаревших элементов в PHP-GTK 2

$window = new GtkWindow();$window->set_title("GtkHBox and GtkVBox packing ↵ demonstration");$window->set_position(Gtk::WIN_POS_CENTER);$window->connect_simple("destroy", array("gtk", ↵ "main_quit"));$window->set_default_size(400,400) ;$window->show();

$window->show_all();Gtk::main();

$vbox = new GtkVBox(false, 5);$window->add($vbox);

$label = new GtkLabel();$label->set_text("My daily");$label->set_justify(Gtk::JUSTIFY_LEFT);$vbox->pack_start($label, true, true, 5);

$hbbox = new GtkHButtonBox();$hbbox->set_layout(Gtk::BUTTONBOX_SPREAD);$hbbox->set_spacing(15);

$button1 = new GtkButton('Exit');$button2 = new GtkButton('Add');$button3 = new GtkButton('Clean');

$hbbox->add($button1)$hbbox->add($button2);$hbbox->add($button3);$vbox->pack_end($hbbox);

$vpane = new GtkHPaned();$vpane->set_border_width(5);$vbox->pack_end($vpane);

$left = new GtkFrame();$day=new GtkCalendar();$left->add($day);$left->set_shadow_type(Gtk::SHADOW_IN);$vpane->add1($left);

$textBuffer = new GtkTextBuffer();$textBuffer->set_text(date('Y-m-d h:i:s'));

$text = new GtkTextView();$text->set_buffer($textBuffer);

$text->set_editable(false);

$entry= new GtkEntry();

Page 86: 067 Системный Администратор 06 2008

84

web

Чтобы всё скомпоновать в правой части панели, сдела-ем ещё один контейнер и всё соберём:

С интерфейсом всё. При запуске программы должно по-являться окно, изображённое на рис. 3.

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

В данном случае day-selected – сигнал объекта GtkCalendar, возникающий при выборе текущей даты, объ-екты $day и $textBuffer выступают в роли параметров функ-ции get_day(), которую мы сейчас и напишем:

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

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

Далее реализуем функцию добавления записи, с кото-рой свяжем сигнал clicked кнопки «Add»:

И тело функции:

Кнопка «Clean» должна при нажатии уничтожать все за-писи. Это реализовать еще легче. Связывание:

и реализация:

Всё? Нет, мы забыли про кнопку «Exit». Тут просто:

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

$r_vbox = new GtkVBox(false, 5);$r_vbox->pack_end($entry);$r_vbox->pack_end($text);

$right = new GtkFrame();$right->add($r_vbox);$right->set_shadow_type(Gtk::SHADOW_IN);

$vpane->add2($right);

Рисунок 3. Ежедневник. Пока примитивный, но уже вполне рабочий

$day->connect_simple('day-selected', 'get_day', $day, ↵ $textBuffer);

function get_day(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(file_exists('text/'.$f_name)){ $content=file_get_contents('text/'.$f_name); } else{ $content='No notes'; }$bf->set_text($content);}

function get_file_name(GtkCalendar $d){$data=$d->get_date();return join('-',$data);}

$button2->connect_simple('clicked', "add_note", ↵ $day,$entry, $textBuffer);

function add_note(GtkCalendar $d,GtkEntry ↵ $entry,GtkTextBuffer $bf){

$f_name=get_file_name($d); if(!is_file('text/'.$f_name)){ file_put_contents('text/'.$f_name, $entry->get_text()); }else{ $fd=fopen('text/'.$f_name,'a+'); fwrite($fd,"\n".$entry->get_text()); fclose($fd);

}$content=file_get_contents('text/'.$f_name);$bf->set_text($content);

}

$button3->connect_simple('clicked', "clean_note", $day, ↵ $textBuffer);

function clean_note(GtkCalendar $d,GtkTextBuffer $bf){$f_name=get_file_name($d); if(is_file('text/'.$f_name)){ unlink('text/'.$f_name) ; }

$bf->set_text('No notes');

}

$button1->connect_simple('clicked', array("gtk", ↵ "main_quit"));

<?php

// Создаём дирректорию для текстовых файловif(!is_dir("text")){mkdir("/text", 0700);}

// Снабжаем файл именем, соответствующим датеfunction get_file_name(GtkCalendar $d){$data=$d->get_date();return join('-',$data);}

Page 87: 067 Системный Администратор 06 2008

85№6, июнь 2008

web

Работа приложения показана на рис. 3.Для иллюстрации использования других, более «продви-

нутых», виджетов приведу код, ставший впоследствии ос-новой для довольно функциональной системы управления заданиями, применяемой у нас в компании. В данном слу-чае показано дерево групп задач, распределённых по раз-личным отделам IT-департамента. Пояснения даны в ком-ментариях к коду:

// Получаем запись из файла и помещаем её на текстовое полеfunction get_day(GtkCalendar $d,GtkTextBuffer $bf){$f_name=get_file_name($d); if(file_exists('text/'.$f_name)){ $content=file_get_contents('text/'.$f_name); }else{ $content='No notes'; }$bf->set_text($content);}

// Добавляем записьfunction add_note(GtkCalendar $d,GtkEntry ↵ $entry,GtkTextBuffer $bf){

$f_name=get_file_name($d); if(!is_file('text/'.$f_name)){ file_put_contents('text/'.$f_name, $entry->get_text()); }else{ $fd=fopen('text/'.$f_name,'a+'); fwrite($fd,"\n".$entry->get_text()); fclose($fd);

}$content=file_get_contents('text/'.$f_name);$bf->set_text($content);

}

// Уничтожаем записьfunction clean_note(GtkCalendar $d,GtkTextBuffer $bf){$f_name=get_file_name($d); if(is_file('text/'.$f_name)){ unlink('text/'.$f_name) ; }

$bf->set_text('No notes');

}

$window = new GtkWindow();$window->set_title("GtkHBox and GtkVBox packing demonstra-

tion");$window->set_position(Gtk::WIN_POS_CENTER);$window->connect_simple("destroy", array("gtk", ↵ "main_quit"));$window->set_default_size(400,400) ;$window->show();

$vbox = new GtkVBox(false, 5);$window->add($vbox);

$label = new GtkLabel();$label->set_text("My daily");$label->set_justify(Gtk::JUSTIFY_LEFT);$vbox->pack_start($label, true, true, 5);$label->show();

$hbbox = new GtkHButtonBox(); $hbbox->set_layout(Gtk::BUTTONBOX_SPREAD); $hbbox->set_spacing(15); $button1 = new GtkButton('Exit'); $button2 = new GtkButton('Add'); $button3 = new GtkButton('Clean'); $hbbox->add($button1); $hbbox->add($button2); $hbbox->add($button3); $vbox->pack_end($hbbox); $vpane = new GtkHPaned(); $vpane->set_border_width(5); $left = new GtkFrame(); $day=new GtkCalendar(); $left->add($day); $left->set_shadow_type(Gtk::SHADOW_IN); $vpane->add1($left);

$textBuffer = new GtkTextBuffer();$textBuffer->set_text(date('Y-m-d h:i:s'));$text = new GtkTextView();$text->set_buffer($textBuffer);

$text->set_editable(true);$entry= new GtkEntry();$right = new GtkFrame();$r_vbox = new GtkVBox(false, 5);$r_vbox->pack_end($entry);$r_vbox->pack_end($text);$right->add($r_vbox);//$right->add($text);$right->set_shadow_type(Gtk::SHADOW_IN);$vpane->add2($right);

$vbox->pack_end($vpane); $button1->connect_simple('clicked', array("gtk", ↵ "main_quit")); $button2->connect_simple('clicked', "add_note", ↵ $day,$entry, $textBuffer); $button3->connect_simple('clicked', "clean_note", ↵ $day, $textBuffer); $day->connect_simple('day-selected', 'get_day', ↵ $day, $textBuffer); $window->show_all();Gtk::main();?>

<?php

// Создаём горизонтальное меню$mbar = new GtkMenuBar();

// Добавляем пункт горизонтального меню$file = new GtkMenuItem('_File');

// Добавляем подменю$fmenu = new GtkMenu();$file->set_submenu($fmenu);$mbar->add($file);

$view = new GtkMenuItem('_View');$vmenu = new GtkMenu();$view->set_submenu($vmenu);$mbar->add($view); $edit = new GtkMenuItem('_Edit');$emenu = new GtkMenu();$edit->set_submenu($emenu);$mbar->add($edit);

$mode = new GtkMenuItem('_Status');$mmenu = new GtkMenu();$mode->set_submenu($mmenu);$mbar->add($mode);

// Теперь создаём пункты подменю для каждого пункта// в особо тяжких случаях разделяем пункты сепараторами// меню «File»$fmenu->add(new GtkImageMenuItem(Gtk::STOCK_NEW));$fmenu->add(new GtkImageMenuItem(Gtk::STOCK_OPEN)); $fmenu->add(new GtkSeparatorMenuItem()); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_SAVE));$fmenu->add(new GtkImageMenuItem(Gtk::STOCK_SAVE_AS)); $fmenu->add(new GtkSeparatorMenuItem()); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_QUIT)); // Меню вид$vmenu->add(new GtkImageMenuItem ↵ (Gtk::STOCK_SORT_ASCENDING));$vmenu->add(new GtkImageMenuItem(Gtk::STOCK_ZOOM_FIT));

Page 88: 067 Системный Администратор 06 2008

86

web

Результат – на рис. 4.Богатые графические пользовательские интерфейсы,

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

Дизайнер пользовательских интерфейсов Glade2Glade – это приложение для визуального построения гра-фических интерфейсов, на основе GTK+. Оно входит во все популярные дистрибутивы Linux, но при необходимос-ти может быть скачано с официального сайта проекта – http://glade.gnome.org. Glade позволяет проектировать гра-фический интерфейс пользователя, просто набрасывая мышкой на будущее окно приложения компоненты из пре-доставленной палитры (см. рис. 6), и сохранять получивше-еся безобразие в XML-файл в формате GladeXML для после-дующего использования Gtk+ приложениями, реализован-ными на различных языках. В PHP-GTK также есть сред-ства работы с GladeXML.

Интерфейс, показанный на рис. 5, будет сохранён в виде следующего glade-файла (листинг дан с сокращениями):

// Меню редактирования$emenu->add(new GtkImageMenuItem(Gtk::STOCK_COPY));$emenu->add(new GtkImageMenuItem(Gtk::STOCK_CUT));$emenu->add(new GtkImageMenuItem(Gtk::STOCK_PASTE));

// Меню статуса$mmenu->add(new GtkImageMenuItem(Gtk::STOCK_APPLY));$mmenu->add(new GtkImageMenuItem(Gtk::STOCK_CONVERT)); $vbox = new GtkVBox();$vbox->pack_start($mbar,false);

// Создаём окно$wnd = new GtkWindow();$wnd->connect_simple('destroy', array('gtk', 'main_quit'));$wnd->set_default_size(400,200);

// Создаём древовидную структуру$store = new GtkTreeStore(64, 32); // Создаём «ветви» первого уровня (первый параметр-// идентификатор родительского элемента. В данном случае // равен NULL)$support = $store->append(null, ↵ array('Support servise', 1));$www = $store->append(null, array('Internet', 2));$c1 = $store->append(null, array('1C', 1)); // Создаём дочерние элементы$store->append($c1, array('Stuff', 8));$store->append($www, array('Site', 2));$store->append($www, array('Ithernet', 12));$store->append($support, array('Workstantions', 4));

// Создаём отображение дерева$tview = new GtkTreeView($store);$tview->set_enable_tree_lines(enabled);$cell_renderer = new GtkCellRendererText();

// Добавляем заголовки$tview->append_column(new GtkTreeViewColumn ↵ ('Department', $cell_renderer, 'text', 0));$tview->append_column(new GtkTreeViewColumn ↵ ('Problems', $cell_renderer, 'text', 1));

// Разворачиваем дерево$tview->expand_all(); $vbox->pack_start($tview,false);

// Помещаем его в окно и делаем видимым$wnd->add($vbox);$wnd->show_all();Gtk::main();?>

<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--><!DOCTYPE glade-interface SYSTEM ↵ "http://glade.gnome.org/glade-2.0.dtd">

<glade-interface>

<widget class="GtkWindow" id="window"> <property name="visible">True</property> <property name="title" ↵ translatable="yes">Glade</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position"> ↵ GTK_WIN_POS_NONE</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> <property name="type_hint"> ↵ GDK_WINDOW_TYPE_HINT_NORMAL</property> <property name="gravity"> ↵ GDK_GRAVITY_NORTH_WEST</property> <property name="focus_on_map">True</property> <property name="urgency_hint">False</property>

<child> <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property>

<child> <widget class="GtkNotebook" id="notebook1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="show_tabs">True</property> <property name="show_border">True</property> <property name="tab_pos">GTK_POS_TOP</property> <property name="scrollable">False</property> <property name="enable_popup">False</property>

<child> <widget class="GtkLabel" id="label4"> <property name="visible">True</property> <property name="label" translatable="yes"> ↵ Hellow Glade!</property> <property name="use_underline"> ↵ False</property> <property name="use_markup">False</property> <property name="justify"> ↵ GTK_JUSTIFY_LEFT</property> <property name="wrap">False</property> <property name="selectable">False</property> <property name="xalign">0.5</property> <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> <property name="ellipsize"> ↵ PANGO_ELLIPSIZE_NONE</property> <property name="width_chars">-1</property> <property name="single_line_mode"> ↵ False</property> <property name="angle">0</property> </widget> <packing> <property name="tab_expand">False</property> <property name="tab_fill">True</property> </packing> </child>

<child> <widget class="GtkLabel" id="label1"> <property name="visible">True</property> ………………………………………….. <property name="single_line_mode"> ↵ False</property> <property name="angle">0</property> </widget> <packing> <property name="type">tab</property> </packing> </child>

Page 89: 067 Системный Администратор 06 2008

87№6, июнь 2008

web

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

Это, разумеется, самый простой случай, но и в связыва-нии сигналов объектов и событий нет ничего сложного:

Как видите, с таким инструментарием создание функци-онального настольного приложения на PHP не только воз-можно, но и до безобразия легко осуществимо!

ЗаключениеPHP_GTK 2, кроме поддержки объектной модели PHP5, Glade и GTK2+, принёс с собой много новых виджетов, объ-ектов, методов. Подробно об их работе лучше прочитать в документации проекта, которая, может, пока и недоста-точно полна, но постоянно улучшается (кстати, в этом про-цессе можно принять участие). Целью же моего опуса было привлечь внимание к новому этапу данной технологии. По-лучит-ли PHP-GTK широкое распространение? Есть ли во-обще будущее у PHP в области настольных приложений?

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

В то же время определённые продвижения в этом на-правлении вполне возможны. PHP, конечно, не потеснит на этом рынке Java или C, но PHP-GTK-приложения впол-не имеют право на жизнь. Нас ведь давно не удивляют GUI-программы написанные на Python?

1. Официальный сайт проекта PHP_GTK – http://gtk.php.net.2. Уваров А. PHP-GTK. //Системный администратор, №12,

2004 г. – С. 60-61 (http://www.samag.ru/cgi-bin/go.pl?q=articles; n=12.2004;a=13).

3. Документация на PHP-GTK 2 – http://gtk.php.net/manual/en.4. Сайт проекта Glade – http://glade.gnome.org.

Рисунок 4. Рабочее приложение

Рисунок 5. Допроектировались Рисунок 6. Проектируем графический интерфейс с glade

<child> <placeholder/> </child>

<child> <widget class="GtkLabel" id="label2"> ………………………………………………. </widget> <packing> <property name="type">tab</property> </packing> </child> </widget> <packing> <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> </packing> </child> </widget> </child></widget>

</glade-interface>

<?php$glade = new GladeXML('testglade.glade');Gtk::main();?>

<?php$glade = new GladeXML('testglade.glade');$window = $glade->get_widget('wndClose');$window->connect_simple('destroy', array('Gtk', ↵ 'main_quit')); $button = $glade->get_widget('btnClose');$button->connect_simple('clicked', 'onClickButton');

function onClickButton() { echo "button clicked!\r\n";

Gtk::main_quit();}Gtk::main();?>

Page 90: 067 Системный Администратор 06 2008

88

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

Начало века. ПредысторияЧеловека, чье имя сейчас мало кому известно, но которому мир во многом обязан технологическим бумом, звали Томас Уотсон (Thomas Watson). После школы парень прослушал курс в школе коммерции и пошел работать бухгал-тером в один из магазинов Нью-Йорка.

Томас мечтал заниматься не скучной монотонной работой, а открыть собст-венное дело, и искал все возможные способы, чтобы скопить деньги. Его приглашают в фирму National Cash Register (NCR) на позицию менедже-ра по продажам. Желание заработать денег на открытие собственного биз-неса сыграло с Томом злую шутку – он

и хозяин NCR были арестованы по де-лу о финансовых махинациях. Том Уот-сон получил год тюрьмы.

Он выходит на свободу, пытается найти работу. Среди прочих обраща-ется в Computing Tabulating Recording (CTR) Corporation, фирму, занимающу-юся в основном производством пер-фокарт и оборудования для их счи-

Долгая счастливая жизнь – история компании IBM

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

Мы называем наш век компьютерным, общество – информационным и тесно связываем будущее человечества с технологиями. Мечтательные мысли писателей-фантастов становятся будничным явлением. Это статья о компании, которая сделала все, чтобы будущее наступило быстрее. Наверное, она и была главным конструктором этого будущего. International Business Machines – IBM.

Page 91: 067 Системный Администратор 06 2008

89№6, июнь 2008

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

тывания. Это неудивительно, так как одним из основателей CTR был чело-век, создавший перфокарты как тако-вые. Также компания занималась про-изводством часов и техники для офи-сов. Тому простили грехи, и он сно-ва работает менеджером по прода-жам. Уотсону к тому времени испол-няется почти сорок лет. Новый сотруд-ник принялся за дело с таким рвением, что в 1914 году, спустя 11 месяцев пос-ле начала работы Уотсона в CTR, его избирают президентом компании. То-мас проводит ряд изменений. При нем начинается система премирования, по-ощрения особенно успешных сотруд-ников. Сделан упор на качество обслу-живания клиентов, на уровень серви-са. В самой компании начинают про-пагандировать особый корпоратив-ный дух, проводятся встречи коллег после работы, спортивные соревно-вания, вечеринки.

Девизом Томаса и всей CTR стал глагол «Думай!». Думать у них полу-чалось. Компания выходит на меж-дународный рынок, прибыль увели-чивается. Проходит переименова-ние компании, теперь она называется International Business Machines. Сокра-щенно – IBM (см. рис. 1).

Первые годы IBMК 1920 году годовой доход, главным образом от продаж счетных машин по всему миру, достиг 20 миллионов долларов. Перфокарты и связанные с ними устройства продолжают оста-ваться основной продукцией компании. В 1928 году выпускают IBM Card – пер-фокарту, на которой объем информа-ции был удвоен за счет формы и рас-положения на ней отверстий. Через несколько лет в США – «великая де-прессия». Львиная доля бизнес-струк-тур обанкротилась и прекратила свое существование. IBM продолжает ос-таваться на плаву, выплачивает сво-им сотрудникам достойную заработ-ную плату. Многомиллионные доходы прошлых лет и международные про-дажи спасают компанию. Более того, в 1933 году IBM открывает свою тех-ническую лабораторию. На тот момент одну из лучших в мире.

В тридцать пятом году компания по-лучает заказ непосредственно от пра-вительства США – государству требо-валось создание автоматического уче-

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

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

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

А в 1944 году происходит исто-рическое событие. Выпуск Mark-1 (см. рис. 2). Один из первых ЭВМ пя-ти тонн весом. Благодаря использо-ванию вакуумных ламп скорость обра-

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

Операция сложения занимала у «Марка» меньше секунды.

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

Расцвет корпорацииВ начале пятидесятых IBM активно со-трудничает с министерством оборо-ны США, поставляя свои разработки в технические центры. Система пере-хвата SAGE для комплекса ПВО стои-ла правительству тридцать миллионов долларов. Заработав себе авторитет-ное имя, инженеры IBM много работа-ют вместе с учеными Массачусетско-го технологического института. В част-ности, одной из совместных разрабо-ток стала память на магнитных сердеч-никах – маленьких ферритовых колеч-ках в несколько миллиметров диамет-ром. По этой технологии память дела-

Рисунок 1. Логотип компании

Рисунок 2. Компьютер Mark 1

Page 92: 067 Системный Администратор 06 2008

90

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

ли и спустя двадцать лет. В 1952 году IBM выпускает новый компьютер – мо-дель «701». Новый компьютер был в ра-зы мощнее «Mark-1», хранил информа-цию на магнитных лентах и использо-вался в научной среде.

Тогда же происходит смена поколе-ний в компании. Новым президентом становится Том Уотсон-младший, сын бывшего руководителя компании. Уже при нем с 1955 по 1960 годы IBM выпус-кает около ста двадцати компьютеров модели «704» с возможностью прове-дений операций с плавающей точкой и улучшенной магнитной памятью.

В 56 лет Артур Самюэль (Arthur Samuel) создает одну из первых про-грамм с искусственным интеллектом, ей стала программа шахматной иг-ры. Год спустя инженеры IBM научи-лись общаться с компьютером не толь-ко с помощью машинного кода нолей и единиц – выходит язык программи-рования Fortran. К концу пятидесятых оборот продаж IBM составляет почти миллиард долларов, девять из деся-ти компьютеров в Европе и США име-ют логотип «IBM». Компания ко всему прочему начинает производить прин-теры.

В 1960 году – активное сотрудни-чество с NASA, участие в первой про-грамме США по освоению космоса, в которой IBM занималась техничес-кой разработкой. Тогда же компания начинает поддержку Олимпийских игр. Но все основные силы сосредоточены на другом. Инженеры делают System-360. В новую разработку вложены су-масшедшие деньги, порядка 5 мил-лиардов долларов США. В итоге – се-мейство компьютеров разных мощ-ностей с единой архитектурой и сов-местимым со всеми моделями дан-ного семейства программным обес-печением.

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

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

В 1966 году Роберт Денард (Robert Denard) изобретает технологию па-

мяти DRAM, ставшую прорывом в об-ласти создания подсистем оператив-ной памяти.

Семидесятые и восьмидесятые. Премии и открытияIBM осваивает все новые сферы рынка. После принтера корпорация выпускает копировальный аппарат, после – сис-тему распознавания речи. В 1971 году IBM презентует флоппи-диск, а диске-та на долгое время становится основ-ным способом переноса информации. В этом же году на Луну отправляет-ся космический агрегат «Apollo», все компьютерное оборудование которо-го произведено в лабораториях IBM. NASA наградит компанию за вклад в освоение космоса.

В 1973 создан жесткий диск IBM 3340 с кодовым названием «Winchester». Новая технология с воз-росшей плотностью данных стала ос-новной в этой отрасли на долгие го-ды, а слово «винчестер» в обиходе до сих пор. Еще одним подтверждением успехов компании стало награждение Нобелевской премией Лео Есаки (Leo Esaki), инженера фирмы, за разработ-ки в области физики.

Осваивая все новые пространст-ва, в 1974 году у IBM появляется свое представительство в Советском Со-юзе. Компанию в нашей стране пред-ставлял сам Уотсон. Он постепенно от-ходит от руководящей должности и ус-тупает пост Франку Кэрри (Frank Carry). Начало деятельности Франка знамену-ется выпуском портативного компью-

Голубой гигантУ компании есть прозвище – «Big Blue», что буквально можно перевести как «большой синий» или голубой гигант. Точно сказать, откуда пошло это прозвище, нельзя, но су-ществует несколько версий. Одна версия гласит, что название пошло от суперком-пьютеров, разрабатываемых в конце пя-

тидесятых – они были окрашены в голу-бой цвет и отличались внушительными га-баритами. Другие считают, что «Big Blue» – это от старого дресс-кода, когда сотрудни-ки компании были обязаны носить голубые костюмы и рубашки.

А может, это просто от того, что цвет ло-готипа IBM именно светло-синий.

Рисунок 3. IBM 5150 Рисунок 4. Первые модели ноутбуков от IBM

Page 93: 067 Системный Администратор 06 2008

91№6, июнь 2008

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

тера IBM 5100. Дисплей в 5 дюймов, свой процессор, 64 килобайт памяти. А также титанический, более 20 кило-граммов, вес и цена от десяти до двад-цати тысяч долларов.

В 1981 году корпорация анонсирует новый персональный компьютер. Улуч-шенная модель – IBM 5150 (см. рис. 3). Цель – отбить рынок у конкурентов, сделать самый покупаемый компью-тер. Разработка длится год, процес-сор заказывают у Intel, операцион-ную систему – у Microsoft, которая тог-да была еще очень скромной конто-рой. Так на компьютерах IBM появил-ся DOS. Компактные размеры, воз-можность замены комплектующих и, самое главное, доступная цена, со-ставлявшая порядка полутора тысяч долларов. 5150 стал главным домаш-ним и офисным компьютером в мире, а журнал «TIME» назвал компьютер... «человеком года».

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

В 1986 и 1987 годах сотрудники лаборатории IBM в Цюрихе забирают Нобелевскую премию два года под-ряд. Сначала награждают Герда Бин-нинга (Herd Binning) и Хейнрика Рох-рера (Haynrick Rohrer) за изобретение нового способа макросъемки, позво-ляющего более точно изучить строе-ние атомов. Год спустя Нобелевский комитет объявляет лауреатами Жор-джа Беднорза (Jhoe Bednorse) и Алек-са Мюллера (Alex Muller) за их работы в области сверхпроводимости при вы-соких температурах.

IBM много занимается инвестиция-ми в науку, спонсирует работу физиков и математиков. В 1984 компания один из главных спонсоров Олимпиады.

В 1987 году продан миллион но-вых компьютеров PS/2. В дополне-ние к компьютеру корпорация созда-ет операционную систему OS/2, на ко-торую столько надежд у руководите-лей компании.

ЗаключениеIBM была главной технологической компанией почти пятьдесят лет. Опе-рационная система OS/2 канула в не-бытие, не выдержав противостояния с Microsoft. Процессоры IBM сегодня

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

Но в списке суперкомпьютеров до-минирует все же IBM. Компания про-должает оставаться одним из важней-ших партнеров для NASA. У корпора-ции представительство в 164 странах

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

По материалам:n www.ibm.com;n en.wikipedia.org;n www.bugtraq.ru.

Рисунок 5. Официальный сайт компании IBM

Хроники новейшей истории IBM1990. IBM выпускает мощнейшие для свое-го времени суперкомпьютеры RISC/600. На производство подобных разработок ком-пания затрачивает все больше средств.

1992. Выпуск серии ноутбуков ThinkPad (см. рис. 4). Ноутбуки помимо производи-тельности примечательны стильным ди-зайном.

1993. Новым президентом компании становится Лу Герстнер (Luis Gerstner). Герстнер приходит в руководство в слож-нейший период для компании. Убытки IBM за этот год составляют 5 миллиардов дол-ларов.

1994. Новый микропроцессор. PowerPC 604 обрабатывает 40 Мб информации в се-кунду.

1995. Развитие IBM Global Network. Международная правительственная сверх-скоростная компьютерная сеть, объеди-няющая порядка двух миллионов ком-пьютеров.

1997. На борту космического корабля, изучающего поверхность Марса, работает IBM RS/6000. IBM остается главной «косми-ческой» IT-компанией.

Гарри Каспаров играет матч против су-перкомпьютера IBM Deep Blue. Противосто-яние заканчивается поражением тринадца-того чемпиона мира по шахматам.

1998. Выпуск процессора с тактовой частотой в один гигагерц. Техническая и информационная поддержка компанией Олимпийских игр в Нагано.

1999. 90% серверов в крупнейших ком-паниях мира – серверы, являющиеся про-дукцией от IBM.

2000. Активное сотрудничество IBM с разработчиками Linux. В частности, фай-ловая система JFS – плод труда програм-мистов IBM. Хотя изначально разрабаты-валась она для операционной системы AIX, востребованной стала именно среди поль-зователей Linux.

Page 94: 067 Системный Администратор 06 2008

92

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

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

Во-первых, тема виртуализации в последнее время является одним из самых «модных» направлений в ин-формационных технологиях.

А во-вторых, сейчас Xen вмес-

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

те с VMware ESX 3.5 пожалуй единс-твенные гипервизоры готовые про-мышленному внедрению. Правда, скоро, с выходом Microsoft Hyper-V, их будет уже три. А чем больше выбор, тем всегда лучше конечному пользо-вателю.

Книга написана автором в тесном сотрудничестве с командой XenSource (в настоящее время Citrix), что позво-лило получить глубокий взгляд внутрь архитектуры гипервизора.

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

Книга состоит из трех частей: вир-туальная машина Xen, устройства вво-да/вывода и архитектура Xen.

Вначале рассказывается, что же такое виртуализация, зачем она нуж-на, а также какие проблемы связаны

Компиляторы. Принципы, технологии и инструментарий. Второе изданиеАльфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман

The Definitive Guide to the Xen HypervisorDavid Chisnall

«книги дракона» – учебника по теории разработки компиляторов. Неофици-альное «фэнтезийное» название кни-га получила из-за рисунка на обложке, впервые появившемся еще в 1986 году. Данный же перевод основан на втором издании, вышедшем на языке ориги-нала два года назад. Учебник положен в основу курсов, преподаваемых в не-скольких университетах, в частнос-ти Университете Колумбии, Гарварде и Стэнфорде. В первую очередь книга предназначена для студентов и препо-давателей, тем не менее материал бу-дет интересен всем, кто интересуется разработкой компиляторов.

Для работы с изданием, в котором приведено большое число примеров, необходимо знание языков програм-мирования C/C++ или Java. Книга со-стоит из двенадцати глав и двух при-ложений. В одном из приложений при-

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

с виртуализацией на платформе x86.Далее – погружение в архитектуру

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

Для работы с книгой крайне жела-тельным является опыт работы с ка-ким-либо GNU/Linux и знание языка программирования C.

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

nИздательство:

nГод издания:

nКоличество страниц:

nISBN:

nЦена:

Книга предоставлена издательством

«Вильямс».

«Вильямс»

2008

1184

978-5-8459-1349-4

≈ 1510 руб.

nИздательство:

nГод издания:

nКоличество страниц:

nISBN:

nЦена:

Prentice Hall

2008

320

978-0132349710

≈ $39,99

Page 95: 067 Системный Администратор 06 2008

93№6, июнь 2008

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

Еще одно издание, посвященное вир-туализации. На этот раз продукту, ра-ботающему внутри операционной системы, конкуренту VMware Server от компании Microsoft – Microsoft Virtual Server 2005. В книге рассматривается актуальная на данный момент версия сервера R2, правда, в описание не по-пали возможности, привнесенные пер-

Это уже третье русское издание дан-ной книги. Ее автор является профес-сиональным программистом и препо-давателем с большим опытом. Из-под его пера вышли такие книги, как «Эф-фективное программирование на awk» и «UNIX in Nutshell». Основная концеп-ция данной книги – изучение програм-мирования в операционной системе GNU/Linux на основе реального ис-ходного кода.

Linux. Программирование в примерах. Основы. Третье русское изданиеАрнольд Роббинс

В качестве примеров взят код как из проекта GNU, так и из оригинально-го UNIX V7. Для того чтобы начать ра-ботать с книгой, достаточно знать ос-новы языка C, как пишет автор, хотя бы на уровне книги Кернигана и Ричи «Программирование на языке C». Кро-ме того, необходимо владеть основны-ми концепциями UNIX/Linux и уметь ра-ботать с базовыми командами опера-ционной системы.

В конце первой части книги под названием «Файлы и пользователи» вы получите достаточно знаний, чтоб попробовать написать аналог команды ls. В этой части рассматриваются та-кие темы как: аргументы, опции и пе-ременные окружения; управление па-мятью на уровне пользователя; фай-лы и файловый ввод/вывод; каталоги и служебные данные файлов; общие

библиотечные интерфейсы; файловые системы и обход каталогов.

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

В третьей, заключительной части книги приведены сведения об отлад-ке программ в Linux.

Виртуализация и Microsoft Virtual Server 2005. Полное и исчерпывающее руководство по Virtual Server 2005Роджер Диттнер, Кен Мейджорз, Матиас тен Селдам, Туан Гротениус, Дэвид Рул мл., Джеффри Грин

вым пакетом обновлений SP1, вышед-шим в конце 2007 года.

В книге рассмотрены следующие темы: установка и настройка сервера Virtual Server и настройка веб-сайта ад-министрирования Virtual Server; опре-деление требований к ресурсам серве-ра, на который устанавливается Virtual Server; работа с виртуальными маши-нами, виртуальными сетями и диска-ми; введение в Automated Deployment Services (ADS) – службу, предназна-ченную для создания образов серве-ров и ведения общей базы инстал-ляций; создание виртуальных машин при помощи файлов сценариев; основ-ные этапы создания виртуальной сре-ды путем миграции физических сер-веров; решение проблем, возникаю-щих при работе с ADS и Virtual Server

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

Migration Toolkit, а также в процессе миграции; интеграция систем, отлич-ных от Windows с Microsoft Operations Manager 2005 при помощи Virtual Agents; разбор случаев, когда Virtual Server эффективен, а когда – нет.

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

nИздательство:

nГод издания:

nКоличество страниц:

nISBN:

nЦена:

Книга предоставлена издательством «Бином».

«Бином»

2008

432

978-5-9518-0236-1

≈ 474 руб.

nИздательство:

nГод издания:

nКоличество страниц:

nISBN:

nЦена:

Книга предоставлена издательством

«КУДИЦ-Пресс».

«КУДИЦ-Пресс»

2008

656

978-5-91136-056-6

≈ 380 руб.

Page 96: 067 Системный Администратор 06 2008

Рек

лама

Page 97: 067 Системный Администратор 06 2008

95№6, июнь 2008

подписка на 2008 год

Российская ФедерацияnПодписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать»nПодписной индекс: годовой – 88099, полугодовой – 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог»nАльтернативные подписные агентства: Агентство «Интер-Почта» (495) 500-00-60, курьерская

доставка по Москве Агентство «Вся Пресса» (495) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.runПодписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru

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

ских изданий через предприятие по распространению

печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21) nКазахстан – по каталогу «Российская Пресса» через

ОАО «Казпочта» и ЗАО «Евразия пресс»nБеларусь – по каталогу изданий стран СНГ через РГО

«Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)nУзбекистан – по каталогу «Davriy nashrlar» российс-

кие издания через агентство по распространению пе-чати «Davriy nashrlar» (7000029, г. Ташкент, пл. Муста-киллик, 5/3, офис 33)

nАрмения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Да-вида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22)

nГрузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42)

nМолдавия – по каталогу через ГП «Пошта Молдовей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)

по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17)

по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)

nПодписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220

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

20780*

81655**

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

88099*

87836**

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

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

Page 98: 067 Системный Администратор 06 2008

96

СИСТЕМНЫЙ АДМИНИСТРАТОР№6(67), Июнь, 2008 год

УЧРЕДИТЕЛИЧастные лица

РЕДАКЦИЯГенеральный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир Лукин

Главный редакторэлектронного приложения«Open Source»Дмитрий Шурупов

Внештатные редакторыАлексей БарабановКирилл СуховВалентин СиницынВиктор ГижевскийОлег ЩербаковДмитрий ШуруповАлександр МайоровАндрей БирюковАндрей Уваров

РЕКЛАМНАЯ СЛУЖБАтел./факс: (495) 628-8253Евгения Тарабрина (доб. 119)reс[email protected]

Верстка и оформление[email protected]

Дизайн обложкиДмитрий Репин

По вопросам распространенияобращайтесь по телефону:Светлана Зобова(495) 628-8253 (доб. 121)

107045, г. Москва,Ананьевский переулок, дом 4/2, стр. 1тел./факс: (495) 628-8253Сайт журнала: www.samag.ru

ИЗДАТЕЛЬООО «С 13»Отпечатано типографиейГП «Московская Типография №13»Тираж 17000 экз.

Журнал зарегистрирован в Министерстве РФ

по делам печати, телерадиовещания и средств

массовых коммуникаций (свидетельство ПИ №

77-12542 от 24 апреля 2002 г.).

За содержание статьи ответственность несет

автор. Мнение редакции может не совпадать

с мнением автора. За содержание рекламных

материалов ответственность несет рекламо-

датель. Все права на опубликованные мате-

риалы защищены.

Вышел DVD-диск с архивом номеров журнала за 2007 годЧто на диске?n Архив 12-ти номеров журнала «Системный ад-

министратор» за 2007 год.

n Архив всех выпусков электронного приложе-

ния «Open Source» за 2007 год.

n Программные продукты от партнеров журна-

ла (триальные версии):

Kerio MailServer 6.5;

Kaspersky® Internet Security 7.0;

Антивирус Касперского® 7.0;

Система контроля доступа Zlock 2.0;

Прокси-сервер UserGate 4.2;

Handy Backup 5.8;

Paragon Drive Backup 8.51 Enterprise Server

Edition;

Network Inventory 1.6.0;

FastReport Server 1.0.10 demo;

ABBYY Lingvo 12;

WinRar 3.71;

Linux-дистрибутив Mandriva One 2008;

Linbox Rescue Server 20070703.

n Серверы/сети/администрирование:

FreeBSD 7.0-RELEASE;

Apache HTTP Server 2.2.8 (+ win32);

nginx 0.6.26, 0.5.35;

lighttpd 1.4.18;

ProFTPD 1.3.1;

PureFTPd 1.0.21;

vsftpd 2.0.6;

Sendmail 8.14.2;

Postfix 2.5.1, 2.6-20080221 (experimental);

Courier Mail Server 0.58.0;

Exim 4.69;

SpamAssassin 3.2.4;

DSPAM 3.8.0;

Policy Daemon 1.82;

SquirrelMail 1.4.13;

RoundCube 0.1-rc2;

MySQL 5.0.51a (+ win32);

PostgreSQL 8.3.0 (+ win32);

Firebird 2.0.3.12981 (+ win32);

SQLite 3.5.6 (+ win32);

Perl 5.10.0;

PHP: 5.2.5 (+ win32);

Python 2.5.2 (+ win32);

Ruby 1.8.6-p111, 1.9.0-1;

Nmap 4.53 (+ win32);

Ettercap 0.7.3.tar.gz (+ win32);

Ethereal 0.99.0 (+ win32);

Snort 2.8.0.2;

MRTG 2.16.1;

NuFW 2.2.9;

tcpdump 3.9.8;

NeTAMS 3.4.1rc1;

IPStat 0.9.7.2;

Linux kernel 2.6.24.1;

BIND 9.4.2 (+ win32);

OpenSSL 0.9.8g;

OpenSSH 4.7p1;

Samba 3.0.28;

Squid Web Proxy Cache 2.6.STABLE18;

CUPS 1.3.6;

Clam AntiVirus 0.92.1 (+ Clamwin 0.92);

Webmin 1.400;

Bacula 2.2.8;

Amanda 2.5.2p1;

n Пользовательское ПО:

OpenOffice.org 2.3.1 (LinuxIntel, Win32Intel);

Mozilla Firefox 2.0.0.12 (Linux, win32);

Mozilla Thunderbird 2.0.0.12 (Linux, win32);

Mozilla Seamonkey (Linux, win32);

Mozilla Sunbird 0.7 (Linux, win32);

Pidgin 2.4.0 (+ win32);

SIM IM 0.9.4.3 (+ win32);

X-Chat 2.8.4 (+ 2.8.5e win32);

aMule 2.1.3 (+ win32);

GIMP 2.4.5 (+ 2.4.4 win32);

MPlayer 1.0rc2 (+ win32);

VLC media player 0.8.6e (+ win32);

WINE 0.9.56;

DOSBox 0.72 (+ win32);

DOSEMU 1.4.0;

Midnight Commander 4.6.1;

Vim 7.1 (+ gvim71);

7-Zip 457 (+ win32);

GnuPG 2.0.8 (+ w32cli 1.4.8).

Как получить диск в подарок?n Клиенты компании SecurIT, заказавшие Zserver

в любой комплектации или более 50 лицензий

Zlock, получат диск в подарок.

Где можно приобрести диск?n В редакции журнала «Системный адми-

нистратор» по адресу: г. Москва, Ананьев-

ский переулок 4/2, стр. 1, в офисе 13 (мет-

ро «Сухаревская»).

n В online-магазине Linuxcenter.ru.

n Для обитателей и посетителей Савеловско-

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

печатными изданиями у главного входа.

Сколько стоит?Цена – 150 рублей.