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

№11(24) ноябрь 2004

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


www.samag.ru

Утилита nLite:
формируем свой дистрибутив
Windows XP/2000/2003
Мониторинг UNIX-серверов
c помощью Nagios и SNMP
Использование бездисковых
Linux-станций с загрузкой по сети
Пакетный фильтр OpenBSD
Танцуем самбу
Linare – настольный дистрибутив Linux
Иммунная система для компьютера
Пассивный перехват трафика
№11(24) ноябрь 2004

Запись дисков CD-R/RW в Linux


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

АДМИНИСТРИРОВАНИЕ СЕТИ
Мониторинг UNIX-серверов Пассивный перехват трафика
c помощью Nagios и SNMP
Павел Закляков
Андрей Бешков amdk7@mail.ru 52
tigrisha@sysadmins.ru 4
HARDWARE
Использование бездисковых
Linux-станций с загрузкой по сети Запись дисков CD-R/RW в Linux
Часть 1
Андрей Маркелов
andrew@markelov.net 12 Владимир Мешков
ubob@mail.ru 56
Пакетный фильтр OpenBSD
ПРОГРАММИРОВАНИЕ
Денис Назаров
pheonix@sysattack.com 16 Создаем кроссплатформенное
приложение на основе FLTK
Виртуальные войны
Сравнительное тестирование VMWare Workstation Антон Борисов
и Cooperative Linux. a.borisov@tesv.tmb.ru 64
Михаил Платов ОБРАЗОВАНИЕ
platov@cs.vsu.ru 21
Class Server 3.0. – новое решение
Обзор эмулятора mips64emul Microsoft в области образования
Александр Байрак Андрей Филиппович
x01mer@pisem.net 26 fil@ics.bmstu.ru 71
Лейся песня, Файловая система NTFS извне и изнутри
или Сервер потокового аудио Часть 1
своими руками
Крис Касперски
Сергей Яремчук kk@sendmail.ru 72
grinder@ua.fm 28
Разработка сценария регистрации
Танцуем самбу пользователей в сети
Часть 1
Роман Гребенников
grv@cs.vsu.ru 32 Иван Коробко
ikorobko@prosv.ru 78
Заметки о Linare
Создание и настройка сервера
Валентин Синицын терминалов
val@linuxcenter.ru 39
Роман Марков
Использование программы nLite stepan-razin@newmail.ru 90
Максим Костышин
Maxim_kostyshin@mail.ru 42 BUGTRAQ 63

БЕЗОПАСНОСТЬ
Иммунная система для компьютера
Сергей Яремчук
grinder@ua.fm 48
№11(24), ноябрь 2004 1
администрирование

МОНИТОРИНГ UNIX-СЕРВЕРОВ
C ПОМОЩЬЮ NAGIOS И SNMP
АНДРЕЙ БЕШКОВ
В предыдущей статье этого цикла [1] мы говорили о том, что программа работает на 90% при условии компиляции с
как научить Nagios следить за Windows-серверами, пользу- помощью Visual C++ и cygwin32.
ясь сведениями, предоставляемыми SNMP. Теперь пришла Отсюда можно сделать вывод, что, приложив некото-
пора рассказать, как можно собирать данные о жизнедея- рые усилия, мы смогли бы мониторить любую из этих опе-
тельности серверов, работающих под управлением разных рационных систем, благо процедуры установки и настрой-
диалектов UNIX. Для этого мы будем снова использовать ки net-snmp для каждой из них почти не отличаются друг от
SNMP. Если вас мучают вопросы, что такое этот преслову- друга.
тый SNMP, как он работает и для чего предназначен, то, Первым делом на сервере мониторинга, работающем
наверное, стоит ознакомиться с RFC 1156, 1157, 1213, 1146, под FreeBSD, устанавливаем самую новую версию пакетов
2571, 2574 и заодно прочитать предыдущую статью [1]. Пе- net-snmp и nagios-plugins.
ред началом повествования следует сказать, что система
мониторинга, на которой будут выполняться все действия, # cd /usr/ports/net-mgmt/net-snmp
# make install clean
описанные ниже, у меня работает под управлением
FreeBSD. За время, прошедшее с момента публикации пре- # cd /usr/ports/net-mgmt/nagios-plugins
# make install clean
дыдущей статьи, Nagios дорос до версии 1.2, также изме-
нилась с 4.7 на 4.10 версия системы FreeBSD, используе- Пакет net-snmp4, все еще присутствующий в дереве пор-
мой на моем сервере. Теперь уже нет необходимости ком- тов, устанавливать не стоит из-за сильной устарелости.
пилировать Nagios из исходников, все прекрасно ставится На подопытных серверах также необходимо проинстал-
из портов. Впрочем, стоит, как всегда, сделать традицион- лировать net-snmp. Для FreeBSD это делается вышеуказан-
ную оговорку: все, что я рассказывал в предыдущих стать- ным способом, но nagios-plugins ставить не следует. Для
ях о Nagios и о чем буду говорить впредь, вполне надежно ALT Linux 2.3 требуется выполнить следующие команды.
работает и под управлением других UNIX-подобных опера-
ционных систем. # apt-get update
# apt-get install net-snmp net-snmp-utils
Вдобавок необходимо заметить, что пакет usd-snmp, ис-
пользовавшийся нами для работы с SNMP прежде, теперь На этом процедуру инсталляции можно считать завер-
превратился в net-snmp версии 5.1.1. шенной. Для того чтобы система могла отвечать на SNMP-
Перейдем к задаче на сегодня. Необходимо настроить запросы, внутри нее должен работать демон snmpd. Ему,
мониторинг серверов, работающих под управлением как и всем порядочным программам, для успешного функ-
FreeBSD 4.10 и ALT Linux 2.3. Соответственно, для приме- ционирования необходимо иметь конфигурационный файл.
ра им даны имена reddaemon и penguin. Впрочем, стоит В качестве такового обычно выступает snmpd.conf. При ра-
заметить, что net-snmp успешно работает и на многих дру- боте с Linux он, как правило, располагается в /etc/snmp/, а
гих UNIX-подобных системах: для FreeBSD соответственно актуальна директория /usr/
! HP-UX (9.0, 10.20, 11.0); local/etc/.
! Ultrix (от 4.2 до 4.5); Файл конфигурации одинаков для всех систем, поэто-
! OSF (3.2, 4.0); му мы изучим его на примере, используемом для Linux.
! Solaris (SPARC/ULTRA от 2.3 до 2.8) (Intel 2.9) SunOS
(4.1.4 и выше); # Ìåñòîíàõîæäåíèå ñèñòåìû â ðåàëüíîì ìèðå
syslocation Rostov-on-Don Kranoarmejskaya str. ↵
! NetBSD (от 1.0 до 1.5 alpha); Building 1 testlab 407
! FreeBSD (от 2.2 и выше); # Êîíòàêòû àäìèíèñòðàòîðà
! Linux (ядра от 1.3 и выше); syscontact Andrew Beshkov admin@example.com tel. 390-34-89
! BSDI (от 2.1 до 4.0.1); # Ñåðâèñû, ïðåäîñòàâëÿåìûå ñèñòåìîé
! AIX (3.2.5, 4.1.5); sysservices = 79
! OpenBSD (2.6, 2.8);
! OS X (10.1.1, 10.1.2); Думаю, что есть необходимость подробно объяснить
! Irix (от 5.1 до 6.5); процедуру, с помощью которой рассчитывается содержи-
! QNX 6.2.1A; мое переменной sysservices. Нужно выбрать из списка уро-
! Dynix/PTX 4.4. вень и подставить его номер вместо L в формулу 2L-1.
! 1 – physical (концентраторы);
На данный момент идут работы по портированию net- ! 2 – datalink/subnetwork (мосты);
snmp на Windows. В результате уже сейчас можно сказать, ! 3 – internet (IP-шлюзы);

4
администрирование
! 4 – end-to-end (IP-хост); # /usr/local/etc/rc.d/snmpd.s
! 5 – OSI (протоколы OSI);
! 6 – OSI (протоколы OSI); Стоит отметить тот факт, что, кроме snmpd, в комплект
! 7 – applications (SMTP, POP3 и прочие сервисы). net-snmp входит демон snmptrapd, отвечающий за обработку
SNMP-ловушек. По умолчанию он выключен, стоит помнить,
К примеру, для маршрутизатора расчет будет выглядеть что в системе не должно работать ненужного программно-
так: 23-1=4. А для обычного хоста 24-1 + 27-1 = 72. Если вы го обеспечения, поэтому без особой надобности не будем
хотите мониторить все уровни, то лучше всего использо- его включать. Говорить о том, как можно использовать эти
вать цифру 79. самые ловушки, мы будем в следующей статье.
Можно создать файлы конфигурации с помощью про- Теперь можно проверить, что за сведения предоставля-
граммы snmpconf, но я предпочитаю делать все самостоя- ют наши сервера. Сделать это можно как минимум двумя
тельно. По крайней мере, так достигается глубинное пони- способами. C помощью утилит командной строки snmpget
мание механизмов работы используемого программного или snmpwalk.
обеспечения.
Следующим интересным моментом является безопас- # snmpwalk –m ALL -c InK12345 -v1 penguin ↵
.iso.org.dod.internet.mgmt.mib-2.system
ность. В традиционном SNMP для версий протокола 1 и 2с
SNMPv2-MIB::sysDescr.0 = STRING: Linux altlinux.unreal.net 2.4.27-std-up-alt1
за нее отвечают строки сообществ (community strings). Их #1 Sun Oct 17 22:42:45 MSD 2004 i686
стоит воспринимать как своеобразные аналоги паролей. Со- SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (1751738) 4:51:57.38
общества бывают двух видов – private и public. Отличаются SNMPv2-MIB::sysContact.0 = STRING: Andrew Beshkov <admin@example.com>
SNMPv2-MIB::sysName.0 = STRING: penguin.example.com
они друг от друга лишь тем, что первое позволяет изме- SNMPv2-MIB::sysLocation.0 = STRING: Rostov-on-Don Kranoarmejskaya str.
нять данные внутри наблюдаемого устройства, а второе Building 1 testlab 407
SNMPv2-MIB::sysServices.0 = INTEGER: 0
дает возможность только просматривать их. Самым про- SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
стым способом определить эти сообщества является вне- SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
сение в конфигурационный файл следующих строк: SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB
rocommunity InK12345 SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
rwcommunity 12r341289j SNMPv2-MIB::sysORID.7 = OID:
SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance
Как вы уже могли догадаться, rocommunity дает право SNMPv2-MIB::sysORID.9 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
читать данные, а rwcommunity предоставляет полный дос- SNMPv2-MIB::sysORDescr.1 = STRING:
The MIB module to describe generic objects for network interface sub-layers
туп. Впрочем rwcommunity тоже можно удалить, если вы не SNMPv2-MIB::sysORDescr.2 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.3 = STRING:
собираетесь изменять данные внутри устройства с помо- The MIB module for managing TCP implementations
щью snmp. Вышеприведенные опции составляют минималь- SNMPv2-MIB::sysORDescr.4 = STRING:
The MIB module for managing IP and ICMP implementations
ный рабочий файл конфигурации. Но квалифицированные SNMPv2-MIB::sysORDescr.5 = STRING:
The MIB module for managing UDP implementations
системные администраторы обычно так не делают, потому SNMPv2-MIB::sysORDescr.6 = STRING: View-based Access Control Model for SNMP.
что иначе будет трудно различать это устройство среди ог- SNMPv2-MIB::sysORDescr.7 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.8 = STRING:
ромного множества других SNMP-приборов. The MIB for Message Processing and Dispatching.
Итак, давайте посмотрим, что за сведения могут предо- SNMPv2-MIB::sysORDescr.9 = STRING:
The management information definitions for the SNMP User-based Security Model.
ставить нам подопытные устройства. Для этого запускаем
на них демон snmpd. Чтобы это сделать, кладем на Linux- Опция –m ALL указывает, что нужно показать все дере-
машине файл snmpd.conf в /etc/snmp и затем выполняем во ниже выбранного OID, после -с располагается комьюни-
следующую команду: ти string, затем идут версия snmp-протокола, имя машины
и OID запрашиваемой ветви. Стоит отметить, что OID мож-
# service snmpd start но записывать разными способами. В большинстве случа-
ев префикс iso.org.dod.internet.mgmt.mib-2. можно не писать,
Если есть желание, чтобы демон стартовал автоматичес- так как он предполагается по умолчанию, соответственно
ки при запуске машины, выполняем еще и такую команду: мы получим тот же самый результат, если напишем просто
system. Для указания OID вместо длинных названий можно
# chkconfig snmpd on использовать цифровые идентификаторы. К примеру, этот
же куст дерева можно адресовать следующей комбинаци-
И обязательно убеждаемся в успешности выполнения ей цифр .1.3.6.1.2.1.1. Если есть желание увидеть все MIB-
предыдущей команды с помощью: дерево, то можно выполнить вышеуказанную команду, вов-
се не указывая OID. Думаю, вы будете впечатлены разме-
# chkconfig snmpd --list рами листингов, которые система выведет вам. Использо-
вать командный интерфейс полезно, но, к сожалению, это
Для FreeBSD файл с настройками должен находиться в не всегда помогает получить правильное представление о
/usr/local/etc/snmp/. Кроме этого, нужно включить запуск де- строении MIB-дерева.
мона в скрипте /usr/local/etc/rc.d/snmpd.sh. Чтобы это сделать, В этом нам помогут утилиты, называемые MIB-браузе-
ищем внутри него строку snmpd_enable= «NO» и вписыва- рами. Для Linux и FreeBSD лучше всего подойдет програм-
ем в нее слово «YES». Затем вручную запускаем демон. ма mbrowse. Обычно она по умолчанию входит во многие

№11(24), ноябрь 2004 5


администрирование
дистрибутивы. В действии эта программа выглядит следу- репили за ним право передавать SNMP-команды только с
ющим образом. помощью версии протокола 2с. Следующей строкой созда-
ли вид на определенную область SNMP-дерева. В данном
случае с помощью запросов можно просматривать все, что
лежит ниже .1 или .iso. Пользуясь этой опцией, можно ог-
раничить дерево, доступное запросу до одной ветки или
даже до единственного OID. И заключительной строкой ука-
зываем настройки безопасности для нашей группы
MyROGroup. После этого не забываем перезапустить де-
мон SNMP и проверить, как все работает.

# snmpwalk –m ALL -c InK12345 -v2ñ penguin ↵


.iso.org.dod.internet.mgmt.mib-2.system

Обратите внимание на опцию –v2c. Если все прошло


нормально, выполняем ту же команду с –v1 и убеждаемся,
что она не возвращает никаких сведений. Как вы, навер-
ное, уже догадались, мы полностью отключили возможность
Для систем Windows существует достаточно много по- вносить извне изменения в данные, находящиеся внутри
добных утилит. О том, какую из них и почему стоит выб- наблюдаемого объекта. Выполняем проверку того, как ра-
рать, я подробно рассказывал в предыдущей статье [1]. ботает модуль check_snmp, установленный на сервере
Конечно, обилие доступных данных поражает, но все Nagios. К примеру, неплохо было бы посмотреть Uptime
же хотелось бы точно знать, как это использовать с наи- системы:
большей выгодой. Давайте вновь вернемся к предмету на-
шего разговора. Кроме стандартных ветвей, net-snmp со- # /usr/local/nagios/libexec/check_snmp -H penguin ↵
-o .1.3.6.1.2.1.1.3.0 -C InK12345 -P 2c
здает свою собственную ветвь .iso.org.dod.internet.private.
Invalid SNMP version 2c
enterprises.ucdavis, которая содержит в себе все необходи-
мые данные. В цифровом формате адрес этой ветви выг- По каким-то странным причинам автор забыл включить
лядит так: .1.3.6.1.4.1.2021. Стоит отметить, что в некото- в него возможность работы с протоколом версии 2с. Ошиб-
рых snmp-браузерах данная ветка может быть недоступна ка, говорящая, что эта версия не поддерживается, – не со-
через свое символьное обозначение, но в то же время зап- всем то, что мы ожидали получить, поэтому давайте возьмем
росы, выполняемые с помощью цифровых OID, будут впол- в руки большой напильник и самостоятельно поправим мо-
не работоспособны. Думаю, вы со мной согласитесь, что дуль check_snmp. Для этого нужно отредактировать файл
это немного неудобно, поэтому, чтобы включить распозна- /usr/ports/net-mgmt/nagios-plugins/work/nagios-plugins-1.3.1/
вание символьных имен, нам нужно будет скопировать MIB- plugins/check_snmp.c. Ищем в нем следующую строку:
базы из /usr/share/snmp/mibs/ в рабочую директорию исполь-
зуемого браузера. -P, --protocol=[1|3]\n\
Как показывают тесты, все работает достаточно непло-
хо, но, к сожалению, наша система сейчас отвечает на и заменяем ее на:
SNMP-запросы, приходящие с любого IP-адреса. К тому же,
по умолчанию используется первая версия протокола SNMP, -P, --protocol=[1|2c|3]\n\
которая передает все данные в открытом виде. Необходи-
мо это исправить и заодно поднять уровень безопасности. Затем, найдя условие такого вида:
Для этого вносим в файл snmpd.conf следующие строки
вместо rocommunity и rwcommunity: if (proto == NULL || (strcmp(proto,DEFAULT_PROTOCOL) == ↵
0) ) { /* default protocol version */
asprintf(&proto, DEFAULT_PROTOCOL);
com2sec nagios 10.10.21.55/32 InK12345 asprintf(&authpriv, "%s%s", "-c ", community);
group MyROGroup v2c nagios }
view all included .1 80
access MyROGroup "" any noauth exact all ↵ Вставляем после него вот такие строки:
none none

Стоит отметить, что опции rocommunity и rwcommunity – else if ( strcmp (proto, "2c") == 0 ) { ↵
/* snmpv2c args */
всего лишь оболочки вокруг более мощного набора команд asprintf(&proto, "%s", "2c");
VACM (Version-based Access Control Module), которым мы asprintf(&authpriv, "%s%s", "-c ", community);
}
воспользовались ранее.
Таким образом, мы сказали, что система, подвергаемая Проводим перекомпиляцию, а затем и замену старого
мониторингу, может принимать SNMP-запросы лишь от ма- модуля новым.
шины с адресом 10.10.21.55, которая является сервером
мониторинга, и привязали этот адрес к внутреннему имени # make install
системы безопасности «nagios». Затем разрешили этому
имени символизировать группу MyROGroup, а заодно зак- После этого команда с ключом -P 2c должна отработать

6
администрирование
нормально. Вписываем в файл checkcommands.cfg описа- normal_check_interval 1
ние команды check_snmp_oid, с помощью которой будем retry_check_interval 1
contact_groups onix-admins
проводить мониторинг и вызывать модуль check_snmp. register 0
}
define command{ Данный сервис показывает время работы системы с мо-
command_name check_snmp_oid
command_line $USER1$/check_snmp -H $HOSTADDRESS$ ↵ мента последней перезагрузки. Для этого используется OID
-o $ARG1$ -C $ARG2$ -w $ARG3$ -c $ARG4$ ↵ .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.0. Почти
-u $ARG5$ -l "" -P $ARG6$
} такого же эффекта можно добиться с помощью .iso.org.dod
.internet.mgmt.mib-2.host.hrSystem.hrSystemUptime.0. Хотя
Затем в файле hosts.cfg рассказываем о наших серве- тут стоит сделать маленькое примечание: второй OID по-
рах. казывает не время, прошедшее с последнего перезапуска
системы, а момент последней инициализации SNMP.
# Îïèñûâàåì øàáëîí õîñòà
define host{ define service{
name generic-host use generic-service
notifications_enabled 1
event_handler_enabled 1 host_name Linux
service_description System Uptime
flap_detection_enabled 1 is_volatile 0
process_perf_data 1
retain_status_information 1 check_period 24x7
check_command check_snmp_oid ↵
retain_nonstatus_information 1 !.1.3.6.1.2.1.1.3.0!InK12345! ""! ""! ""!2c
max_check_attempts 10
notification_interval 120 }
notification_period 24x7
notification_options d,u,r Следующим интересным для нас моментом будет сово-
register 0
} купность сервисов, отображающих количество занятых бло-
ков разделов /, home, и совокупный процент использован-
define host{
use generic-host ных блоков физической и своп-памяти. Для того чтобы по-
host_name Linux нять, где находятся необходимые сведения, посмотрите вет-
alias Standard Linux Server
address penguin ку .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorage
check_command check-host-alive Table. Принцип анализа ветви довольно прост. В hrStorage
}
Index содержится список уникальных идентификаторов, опи-
define host{ сывающих каждое устройство. А hrStorageType в свою оче-
use generic-host
host_name FreeBSD редь хранит типы устройств. hrStorageDesc заполнен тек-
alias Standart FreeBSD Server стовыми описаниями объектов. Для моей системы это выг-
address reddaemon
check_command check-host-alive лядит так:
}
hrStorageDescr.2 = STRING: Real Memory
hrStorageDescr.3 = STRING: Swap Space
И, конечно же, не забываем причислить их к группе хо- hrStorageDescr.4 = STRING: /
стов onix-servers, внеся следующие строки в файл host hrStorageDescr.5 = STRING: /home
hrStorageDescr.6 = STRING: /proc/bus/usb
groups.cfg
В hrStorageAllocationUnits указан размер блока для каж-
define hostgroup{ дого из устройств:
hostgroup_name onix-servers
alias Onix Servers
contact_groups onix-admins hrStorageAllocationUnits.2 = INTEGER: 1024 Bytes
members Linux, FreeBSD hrStorageAllocationUnits.3 = INTEGER: 1024 Bytes
} hrStorageAllocationUnits.4 = INTEGER: 4096 Bytes
hrStorageAllocationUnits.5 = INTEGER: 4096 Bytes
hrStorageAllocationUnits.6 = INTEGER: 1024 Bytes
Настройку оповещений и контактов пропускаем, так как
эта тема обсуждалась ранее неоднократно. Самое время за- Ну а hrStorageSize указывает, сколько блоков в каждом
няться описанием сервисов, за которыми мы будем следить. устройстве.

# Îïèñûâàåì øàáëîí ñåðâèñà hrStorageSize.2 = INTEGER: 54156


define service{ hrStorageSize.3 = INTEGER: 216836
name generic-service hrStorageSize.4 = INTEGER: 273087
active_checks_enabled 1 hrStorageSize.5 = INTEGER: 196780
passive_checks_enabled 1 hrStorageSize.6 = INTEGER: 0
parallelize_check 1
obsess_over_service 1 И наконец, самое интересное. Как вы уже, наверное,
check_freshness 0
notifications_enabled 1 догадались, hrStorageUsed содержит данные о том, сколь-
event_handler_enabled 1 ко блоков занято на каждом из устройств.
flap_detection_enabled 1
process_perf_data 1
retain_status_information 1 hrStorageUsed.2 = INTEGER: 52564
retain_nonstatus_information 1 hrStorageUsed.3 = INTEGER: 11220
notification_interval 120 hrStorageUsed.4 = INTEGER: 235014
notification_period 24x7 hrStorageUsed.5 = INTEGER: 8755
notification_options w,u,c,r hrStorageUsed.6 = INTEGER: 0
max_check_attempts 3

№11(24), ноябрь 2004 7


администрирование
Теперь дело за малым: высчитать, сколько блоков со- Но это не очень удобно, так как в этом случае у систе-
ответствуют заполнению устройств на 80% и 90%. И затем мы есть лишь два состояния – «нормальное» и «критичес-
создать на основе этих данных правила проверки. кое». Соответственно, нет промежуточного перехода в виде
В качестве примера приведем описание сервиса, пока- состояния «предупреждение». Разобравшись с теорией,
зывающего, как обстоят дела с заполнением корневого давайте создадим сервис, который будет контролировать
раздела. состояние раздела / новым способом.

define service{ define service{


use generic-service use generic-service
host_name Linux host_name Linux
service_description Space on / service_description Space on / check 2
is_volatile 0 is_volatile 0
check_period 24x7 check_period 24x7
check_command check_snmp_oid ↵ check_command check_snmp_oid ↵
!.1.3.6.1.2.1.25.2.3.1.6.4! ↵ !.1.3.6.1.4.1.2021.9.1.9.1!InK12345!80!90!%
InK12345!218470!245778!blocks!2c }
}
Думаю, создать сервисы, выполняющие проверку ос-
Надеюсь, что на основе приведенного примера вы смо- тальных разделов, вы сможете сами. Идем дальше. Если
жете создать описание всех необходимых сервисов. В мире мы хотим следить за загрузкой процессора, добавляем в
UNIX-систем большинство задач можно решить разными snmpd.conf вот это:
способами. Сейчас вы в этом убедитесь. Давайте в оче-
редной раз расширим функциональность демона snmpd, load 12 20 30
внеся в snmpd.conf следующие строчки.
Этой строкой мы говорим демону, что желаем видеть
disk / 180000 статистику нагрузки на процессор за последнюю минуту,
disk /home 760000
за пять и пятнадцать минут. К сожалению, интервалы жес-
Таким образом, мы указываем, что хотим следить за тко закодированы, и изменить их невозможно. И, как обыч-
свободным местом на разделах / и home еще одним спосо- но, указываем необязательные пороговые ограничения в
бом. Вышеуказанные строки говорят демону snmp, что мы 12%, 20% и 30%, при превышении которых snmpd будет
хотим установить флаг ошибки в случае, если на разделе / устанавливать флаг ошибки. Смотрим ветку .iso.org.dod.
занято 180 Мб, а /home заполнен на 760 Мб. Впрочем, ни- internet.private.enterprises.ucdavis.laTable.laEntry и понима-
чего страшного не случится, если ограничения не устанав- ем, что нам наиболее интересны подветви laLoad, laLoadInt,
ливать вовсе. Кстати, стоит отметить, что ограничение мож- laLoadFloat.
но описывать не только в килобайтах, но и в процентах. В этих подветках содержатся одни и те же данные, но с
Теперь интересующие нас данные находятся внутри ветви разным округлением. Соответственно сервис для провер-
.iso.org.dod.internet.private.enterprises.ucdavis.dskTable.dskEntry. ки загрузки процессора за последнюю минуту будет выгля-
Принцип построения таблицы стандартен. Идентификатор деть вот так:
dskPath содержит данные об именах разделов.
define service{
dskPath.1 = STRING: / use generic-service
dskPath.2 = STRING: /home host_name Linux
service_description CPU Load 1 min
is_volatile 0
dskDevice устанавливает соответствие между раздела- check_period 24x7
ми и физическими устройствами диска. check_command check_snmp_oid ↵
!.1.3.6.1.4.1.2021.10.1.5.1!InK12345!60!90!%
}
dskDevice.1 = STRING: /dev/sda1
dskDevice.2 = STRING: /dev/sda6
Следующей интересной для нас особенностью являет-
В dskMinimum dskMinPercent содержатся пороговые зна- ся возможность запускать сторонние скрипты при получе-
чения для поднятия флага ошибки. Соответственно, dskTotal, нии того или иного SNMP-запроса. И опять добавляем в
dskAvail, dskUsed отображают общее, доступное и задей- snmpd.conf новые строки:
ствованное пространство дисков. Следующая ветвь, назы-
ваемая dskPercent, для нас наиболее интересна, так как exec users /bin/sh /usr/bin/count_users.sh
exec mailqueue /bin/sh /usr/bin/count_mail.sh
содержит величину заполнения дисков в процентах.
Затем создаем файлы count_users.sh count_mail.sh:, с
dskPercent.1 = INTEGER: 86 их помощью мы будем считать количество пользователей,
dskPercent.2 = INTEGER: 4
работающих на данный момент в системе, и размер почто-
Именно ее мы и будем контролировать. Конечно, можно вой очереди postfix.
контролировать состояние ветвей dskErrorFlag и dskErrorMsg. Содержимое файла count_users.sh:

dskErrorFlag.1 = INTEGER: 1 who | wc -l


dskErrorFlag.2 = INTEGER: 0 exit 0
dskErrorMsg.1 = STRING: /: less than 80% free (= 86%)
dskErrorMsg.2 = STRING: Содержимое файла count_mail.sh:

8
администрирование
mailq | tail -n 1 | cut -f5 -d " " echo "first line"
exit 0 echo "second line"
exit 5
Теперь смотрим, что у нас находится внутри ветки
.iso.org.dod.internet.private.enterprises.ucdavis.extTable.extEntry. В результате осмотра ветви .1.3.6.1.4.1.2021.50 можно
увидеть следующие данные:
extNames.1 = STRING: users
extNames.2 = STRING: mailqueue .1.3.6.1.4.1.2021.50.1.1 = INTEGER: 1
extCommand.1 = STRING: /bin/sh /usr/bin /count_users.sh .1.3.6.1.4.1.2021.50.2.1 = STRING: "multi_line_test"
extCommand.2 = STRING: /bin/sh / usr/bin/count_mail.sh
extResult.1 = INTEGER: 0 .1.3.6.1.4.1.2021.50.3.1 = STRING: "/bin/sh /tmp/mytest.sh"
.1.3.6.1.4.1.2021.50.100.1 = INTEGER: 5
extResult.2 = INTEGER: 0 .1.3.6.1.4.1.2021.50.101.1 = STRING: "first line"
extOutput.1 = STRING: 1
extOutput.2 = STRING: 2 .1.3.6.1.4.1.2021.50.101.2 = STRING: "second line"
.1.3.6.1.4.1.2021.50.102.1 = INTEGER: 0
extErrFix.1 = INTEGER: 0 .1.3.6.1.4.1.2021.50.103.1 = ""
extErrFix.2 = INTEGER: 0
extErrFixCmd.1 = STRING:
extErrFixCmd.2 = STRING: Как видите, и такой функционал нам вполне доступен.
Следующая возможность, на которую хотелось бы обратить
Нас интересует extOutput, в которой находится первая ваше внимание, – функция проверки размера файла. Итак,
строка из того, что скрипт выводит на экран, и extResult с добавляем в snmpd.conf вот такую надпись:
кодом возврата скрипта, переданным командой exit. Судя
по приведенному выше списку значений, у нас в системе file /tmp/tinka.txt 12
находится один пользователь, а в почтовой очереди есть
два письма. Сервисы для проверки результатов работы тем самым указывая, что файл не должен быть более 12 Кб.
обоих скриптов будут выглядеть так: Затем смотрим, что хранит в себе ветка .iso.org.dod.internet
.private.enterprises.ucdavis.fileTable.fileEntry:
define service{
use generic-service fileIndex.1 = INTEGER: 1
host_name Linux fileName.1 = STRING: /tmp/tinka.txt
service_description Users
is_volatile 0 fileSize.1 = INTEGER: 15 kB
fileMax.1 = INTEGER: 12 kB
check_period 24x7 fileErrorFlag.1 = INTEGER: true(1)
check_command check_snmp_oid ↵
!.1.3.6.1.4.1.2021.8.1.101.1!InK12345!20!30!users fileErrorMsg.1 = STRING: /tmp/tinka.txt: ↵
size exceeds 12kb (= 15kb)
}
define service{
use generic-service Написать соответствующий сервис, в общем-то, неслож-
host_name Linux но, если мы хотим самостоятельно проверять размер фай-
service_description Mail queue
is_volatile 0 ла.
check_period 24x7
check_command check_snmp_oid ↵ define service{
!.1.3.6.1.4.1.2021.8.1.101.2!InK12345!40!80!messages use generic-service
}
host_name Linux
service_description size of /tmp/tinka.txt
is_volatile 0
Конечно, в реальном мире скрипты-проверки могут быть check_period 24x7
гораздо сложнее и возвращать с помощью команды exit check_command check_snmp_oid ↵
!.1.3.6.1.4.1.2021.15.1.3.1!InK12345!12!20!kbytes
коды, указывающие на те или иные проблемы в сети. В этом }
случае есть возможность с помощью добавочной опции
execfix указывать на программу, запускаемую snmpd и от- Но есть и другой путь: можно опереться на появление
вечающую за попытки автоматического исправления оши- кода и сообщения об ошибке в fileErrorFlag и fileErrorMsg. И
бок, обнаруженных проверочным скриптом. К примеру, та- все же мне кажется, что это не очень удобно.
ким образом можно описать программу исправления ава- Напоследок хотелось бы рассказать о возможности сле-
рийного положения с почтовой очередью. жения за количеством процессов того или иного приложе-
ния, работающих в системе.
execfix mailqueue /bin/sh /usr/bin/repair_mailqueue.sh
proc httpd 3 6
proc automount 1 1
Конечно, эта возможность опциональна, но упомянуть proc csserver 2
о ней все же стоило. Любопытный читатель может спро-
сить, а что делать, если мой скрипт выводит несколько строк Этими строками мы указываем snmpd, что в системе дол-
полезной информации, и мне нужно считать их все до еди- жно быть от двух до четырех процессов httpd и только один
ной. Я отвечу, что это не проблема. Нужно всего лишь до- automount. В то же время программа csserver вообще может
бавить в snmpd.conf вот такую строку: быть не запущена, но если она все же работает, то процес-
сов не должно быть более двух. Если же минимальный и
exec .1.3.6.1.4.1.2021.50 multi_line_test /bin/sh ↵ максимальный пороги не указаны, то процессов может быть
/tmp/mytest.sh
сколько угодно. Давайте посмотрим, что snmpd нам скажет
И создать скрипт /tmp/mytest.sh следующего содержа- в ответ на такие приказания. Для этого открываем ветвь
ния. .iso.org.dod.internet.private.enterprises.ucdavis.prTable.prEntry.

№11(24), ноябрь 2004 9


администрирование
prIndex.1 = INTEGER: 1 is_volatile 0
prIndex.2 = INTEGER: 2 check_period 24x7
prIndex.3 = INTEGER: 3 check_command check_snmp_oid ↵
prNames.1 = STRING: httpd !.1.3.6.1.4.1.2021.4.6.0!InK12345!""!""!kbytes!2c
prNames.2 = STRING: automount }
prNames.3 = STRING: csserver
prMin.1 = INTEGER: 3 И соответственно мониторинг заполнения свопа можно
prMin.2 = INTEGER: 1 реализовать так же. Но это решение, на мой взгляд, не очень
prMin.3 = INTEGER: 0
prMax.1 = INTEGER: 6 изящно. Можно сделать гораздо лучше. Давайте будем сле-
prMax.2 = INTEGER: 1 дить за показателем memTotalFree, который показывает об-
prMax.3 = INTEGER: 3
prCount.1 = INTEGER: 1 щее количество свободной памяти системы. Это весьма удоб-
prCount.2 = INTEGER: 1 но, так как он равен сумме memAvailReal и memAvailSwap.
prCount.3 = INTEGER: 0
prErrorFlag.1 = INTEGER: 1 Тут возникает некоторая проблема с нетривиальностью про-
prErrorFlag.2 = INTEGER: 0 верки. Обычно ситуация обстоит так, что чем больше про-
prErrorFlag.3 = INTEGER: 0
prErrMessage.1 = STRING: Too few httpd running (# = 1) веряемая величина, тем ближе мы к критическому порогу,
prErrMessage.2 = STRING: но сейчас все наоборот. Необходимо сказать модулю, что,
prErrMessage.3 = STRING:
prErrFix.1 = INTEGER: 0 чем больше памяти нам доступно, тем лучше. Поэтому сер-
prErrFix.2 = INTEGER: 0 вис будет выглядеть так:
prErrFix.3 = INTEGER: 0
prErrFixCmd.1 = STRING:
prErrFixCmd.2 = STRING: define service{
prErrFixCmd.3 = STRING: use generic-service
host_name Linux
Надеюсь, смысл приведенных данных всем ясен. Тут, service_description Total memory Free
is_volatile 0
как всегда, возможно два пути для слежения: самим конт- check_period 24x7
ролировать значения из подветви prCount, либо опираться check_command check_snmp_oid ↵
!.1.3.6.1.4.1.2021.4.11.0!InK12345!20000:10000 ↵
на код ошибки prErrorFlag и сообщение в prErrMessage. По !9999:0!kbytes!2c
аналогии с execfix можно использовать ключевое слово }
procfix для описания программы, запускаемой в случае, если
с тем или иным процессом стряслось что-то неладное. Я Таким образом, сигнал «предупреждение» будет отправ-
думаю, что на основе примеров, приведенных выше, вы ляться, если свободной памяти останется от двадцати до
сможете легко самостоятельно написать определения нуж- десяти тысяч байт, а критические оповещения появятся, как
ных сервисов. Следующей интересной для нас веткой яв- только планка опустится еще ниже.
ляется .iso.org.dod.internet.private.enterprises.ucdavis.memory. Также неплохо было бы следить за сетевыми интерфей-
В ней хранятся подробные данные о состоянии оператив- сами с помощью ветки .iso.org.dod.internet.mgmt.mib-2.
ной памяти. Для моей машины эта ветвь выглядит так: interfaces.ifTable.ifEntry. Думаю, что примеров, приведенных
в статье, достаточно, чтобы сделать это самостоятельно.
memIndex.0 = INTEGER: 0 Разобравшись с проверками сервисов, работающих че-
memErrorName.0 = STRING: swap
memTotalSwap.0 = INTEGER: 216836 рез snmp 2c, давайте посмотрим, как выполнить все то же
memAvailSwap.0 = INTEGER: 209784 самое с помощью третьей версии протокола. Зачем нам это
memTotalReal.0 = INTEGER: 54156
memAvailReal.0 = INTEGER: 9320 нужно? Все очень просто: с точки зрения безопасности snmp
memTotalFree.0 = INTEGER: 219104 2с существенно лучше, чем версия 1, но, несмотря на это,
memMinimumSwap.0 = INTEGER: 16000
memShared.0 = INTEGER: 0 в ней все же есть недостатки. Дело в том, что при ее ис-
memBuffer.0 = INTEGER: 5728 пользовании строки сообществ передаются по сети в от-
memCached.0 = INTEGER: 13832
memSwapError.0 = INTEGER: 0 крытом виде. Думаю, это не то, что нам хотелось бы полу-
memSwapErrorMsg.0 = STRING: чить. Изумленный читатель может сказать: «Давайте со-
всем откажемся от использования 2с». К сожалению, та-
Наибольший интерес вызывают OID memTotalSwap mem кой идеалистический подход не всегда возможно воплотить
AvailSwap, означающие общий размер свопа и его свобод- в жизнь. Иногда приходится использовать именно 2с, пото-
ную часть. Затем стоит обратить внимание на memTotalReal му что не во всем имеющемся оборудовании есть поддер-
и memAvailReal, указывающие на размер физической па- жка третьей версии. К тому же, настройка snmpd для рабо-
мяти. Перспективнее всего следить за memAvailReal и ты с третьей версией snmp – дело весьма нетривиальное.
memAvailSwap. Но тут есть определенные проблемы. Дело Ниже я расскажу как этого добиться «малой кровью».
в том, что исчерпание физической памяти еще не означает Итак, приступим. В основе идеологии безопасности для
для системы каких-то ужасных последствий, все ненужное третьей версии лежит понятие модуля безопасности пользо-
в данный момент будет складироваться в своп. Поэтому вы- вателей USM (User-based Security Module). Он отвечает за
водить предупреждения по поводу того, что физическая па- хранение списка пользователей и их атрибутов. Соответ-
мять закончилась, не стоит. Сервис, следящей за этим ком- ственно каждый пользователь обозначается уникальным
понентом системы, должен выглядеть так: именем в терминах snmp, оно называется securityName. К
нему привязываются протокол аутентификации и ключ аутен-
define service{ тификации, соответственно, authProtocol и authKey. Вдоба-
use generic-service
host_name Linux вок к этому существует протокол шифрования privProtocol
service_description Physical memory Free и ключ шифрования privKey. Стоит отметить, что authKey и

10
администрирование
privKey генерируются на основе пароля, переданного поль- Затем удаляем из snmpd.conf все упоминания о пользо-
зователем. Пароль должен содержать не менее восьми сим- вателей initial, а также все строки с MyRWGroup и rwuser.
волов. Тем самым мы лишили пользователя initial всех прав и ото-
Стандарт snmp версии 3 описывает три вида пакетов. брали у пользователя nagios возможность внесения изме-
Первый не подписывается и не шифруется. Второй: отправ- нений в данные snmp. Не забываем перезапустить демона
ляющая сторона подписывает пакет ключем authKey с по- snmpd, чтобы новые настройки вступили в силу. На серве-
мощью протокола authProtocol. В качестве протокола гене- ре мониторинга для проверки выполняем команду:
рации подписи на данный момент могут выступать алго-
ритмы MD5 или SHA. Третий: подписывает и плюс к этому $ snmpget -v3 -u nagios -n "" -a MD5 -A R18nm12KDM ↵
-x DES 10.10.21.75 sysUpTime.0
данные пакета могут шифроваться с помощью протокола
system.sysUpTime.0 = Timeticks: (71318) 0:11:53.18
privProtocol и ключа privKey. В качестве протокола шифро-
вания пока можно использовать только DES. Из полученного ответа можно сделать вывод, что пере-
Ознакомиться подробнее с идеями, лежащими в осно- дача и обработка шифрованных и подписанных snmp паке-
ве USM, можно в RFC 2574. тов работает как следует. Теперь давайте протестируем как
Одной из самых странных идей, с которой приходится модуль check_snmp умеет выполнять запросы с помощью
сталкиваться, является способ управлением пользователя- третьей версии snmp.
ми, применяемый для третьей версии протокола. Для этого
существует утилита snmpusm, но создать с ее помощью $ /usr/local/nagios/libexec/check_snmp -H 10.10.21.75 ↵
-o sysUpTime.0 -L authPriv -U nagios_user1 -a MD5 ↵
пользователя с нуля невозможно. Она позволяет лишь кло- -A R18nm12KDM -X R18nm12KDM -P 3
нировать настройки существующего пользователя в атри- system.sysUpTime.0 = Timeticks: (71352) 0:11:54.10
буты вновь создаваемого. Налицо проблема курицы и яйца.
Нужно создать первого пользователя, но утилита для уп- Теперь осталось создать описание своей команды
равления пользователями делать это не умеет. check_snmp_oid_v3 в файле checkcommands.cfg. С помо-
Несколько раз перечитав man snmpusm, понимаем, что щью нее мы будем проводить мониторинг и вызывать мо-
созданием легендарного первопользователя должен зани- дуль check_snmp.
маться демон snmpd. Ничего не скажешь, весьма сильный
ход и главное – какой нечеловеческой логикой это продик- define command{
command_name check_snmp_oid_v3
товано. command_line $USER1$/check_snmp -H $HOSTADDRESS$ ↵
Итак, нам нужно внести в snmp такие строки: -o $ARG1$ -w $ARG2$ -c $ARG3$ -L $ARG4$ ↵
-U $ARG5$ -a $ARG6$ -A $ARG7$ -X $ARG8$ ↵
-u $ARG9$ -l "" -P $ARG10$
rwuser initial }
rwuser nagios
rouser nagios
createUser initial MD5 t2inKES10er DES Теперь давайте создадим сервис Total Memory Free v3
для демонстрации того, как нужно использовать команду
Или их аналог с расширенным описанием VACM: check_snmp_oid_v3. Записываем в services.cfg следующие
строки:
group MyRWGroup usm nagios
group MyROGroup usm nagios define service{
group MyRWGroup usm initial use generic-service
access MyRWGroup "" any noauth exact all all none
createUser initial MD5 t2inKES10er DES host_name Linux
service_description Total memory Free v3
is_volatile 0
Затем перезапускаем snmpd. Пользователь initial будет check_period 24x7
создан автоматически. В качестве пароля ему указано check_command check_snmp_oid_v3! ↵
.1.3.6.1.4.1.2021.4.11.0!20000:10000!9000:0! ↵
t2inKES10er, алгоритмом подписи пакетов назначаем MD5, authPriv!nagios!MD5!R18nm12KDM!R18nm12KDM!kbytes!3
а для шифрования данных используется DES. Создав пер- }
вого пользователя, мы могли бы на этом остановиться. Но
делать этого все же не стоит из соображений безопаснос- Теперь данные будут доставляться к нам в шифрован-
ти. Поэтому с помощью клонирования создаем нового ном виде. Напоследок стоит сказать, что все описания сер-
пользователя по имени nagios. висов, предназначенные для сервера Linux, можно скопи-
ровать и, изменив имя машины, следить за FreeBSD.
# snmpusm -v3 -u initial -n "" -l authNoPriv -a MD5 ↵ На этой радостной ноте хотелось бы попрощаться, а
-A t2inKES10er localhost create nagios initial
заодно пообещать, что в следующей статье мы будем изу-
User successfully created.
чать настройку системы мониторинга для слежения за обо-
Так как он унаследовал все настройки от initial, сразу рудованием знаменитой фирмы CISCO.
же меняем ему пароль на что-нибудь труднозапоминаемое
вроде R18nm12KDM. Литература:
1. Бешков А. Мониторинг Windows-серверов с помощью
# snmpusm -v3 -u nagios_user -n "" -l authNoPriv -a MD5 ↵ Nagios. Часть 2. – Журнал «Системный администратор»,
-A t2inKES10er localhost passwd t2inKES10er R18nm12KDM
№8, август 2003 г. или http://onix.opennet.ru/monitoring/
SNMPv3 Key(s) successfully changed. nagios_win_2.html

№11(24), ноябрь 2004 11


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

ИСПОЛЬЗОВАНИЕ
БЕЗДИСКОВЫХ LINUX-СТАНЦИЙ
С ЗАГРУЗКОЙ ПО СЕТИ

АНДРЕЙ МАРКЕЛОВ
Постановка задачи
Работа сотрудника отдела автоматизации – это постоянная Когда с серверной частью все определилось, встал воп-
борьба с проблемами и решение задач, которые поперемен- рос по клиентской составляющей системы. В первую оче-
но подкидывают пользователи, разработчики эксплуатируе- редь хотелось бы снизить необходимость в администриро-
мого программного обеспечения и руководство организации. вании пользовательских машин, так как постоянное присут-
И если два первых направления работы – это просто «борь- ствие системного администратора на удаленных площадках
ба за живучесть корабля», то последнее, как правило, – по- не планировалось. Кроме того, желательным представлялось
ступательное движение вперед. Как раз в ходе решения од- уменьшить стоимость решения, которая возросла из-за необ-
ной из таких задач и появилась на свет данная статья. ходимости покупки терминальных лицензий. Также необхо-
Итак, перед отделом автоматизации была поставлена димо было учесть намерение разместить в офисах устарев-
задача в короткие сроки ввести в строй два новых удален- шие компьютеры класса Celeron-400 с ОЗУ от 32 до 64 Мб.
ных офиса, каждый численностью в пять-десять человек. Оба Идеальным со всех точек зрения оказалось использо-
офиса и «голову» связали посредством технологий VPN в вание в качестве рабочих мест бездисковых станций с заг-
одну сеть. Минимальная ширина канала между тремя точка- рузкой по сети. При этом единственным компьютером, тре-
ми составила 256 Кбит, что вполне удовлетворило наши по- бующим внимания администратора, становится дополни-
требности. В каждом из офисов был развернут дополнитель- тельный контроллер домена в каждом офисе, управляемый
ный контроллер домена Windows 2000, а для минимизации по VNC. Само собой, что в рамках данной статьи я остав-
трафика домен разделили на несколько сайтов. Все выше- ляю за пределами внимания оборудование и ПО, обеспе-
описанное является стандартным решением, и здесь я не чивающее шифрование трафика, доступ в Интернет и т. д.
ожидал никаких сюрпризов. Главным вопросом для нас было, В роли ОС, которая будет по сети загружаться на рабо-
как поведет себя основной инструмент работы сотрудников чие станции, я выбрал Linux – что обеспечивает лицензи-
организации – комплексная система автоматизации, при онную чистоту решения (по крайней мере на сегодняшний
работе с которой и в пределах одной площадки хватало про- момент). Доступ к рабочему столу Windows 2003 должен
блем. Изначально ориентированная на Novell/BTRIVE 6.15 был осуществляться при помощи разработки проекта
после миграции сети на Windows, она работала под Windows/ www.rdesktop.org, который стал стандартом для решения
Pervasive.SQL 7. данной задачи. В качестве же необходимых для такой заг-
После недели тестирования этого основного бизнес-при- рузки серверов DHCP и TFTP логично было бы использо-
ложения организации, оказалось, что разработчик и вовсе вать уже имеющиеся в каждом сайте дополнительные кон-
не оставил нам выбора, так как использование встроенного троллеры домена Windows 2000. Благо существуют как бес-
терминального режима автоматизированной системы по платные реализации DHCP/TFTP под эту операционную
ряду причин нас не устроило. Опять же, из-за особенностей систему, так и встроенные сервера. При этом TFTP нали-
функционирования в качестве терминального сервера была чествует в рамках службы Remote Installation Services (RIS).
выбрана платформа Microsoft Windows Server. Тестирование Сетевые карты клиентских машин, естественно, долж-
же решений компании Citrix мы не проводили, так как рабо- ны поддерживать возможность загрузки по Etherboot/PXE.
та с «родными» терминальными службами Windows нас впол- В отдельных случаях из-за несовместимости оборудования
не удовлетворила, а использование надстроек только уве- я допускал использование загрузчика, расположенного на
личивает стоимость всей системы. дискете.

12
администрирование
Выбор реализации Linux Итак, первым делом запускаем самораспаковывающий-
При выборе варианта ОС Linux с возможностью загрузки по ся архив thinstation.nbi (autoextract).exe, содержащий один-
сети в первую очередь я обратил внимание на уже готовые единственный файл thinstation.nbi, архив сделан для того,
дистрибутивы подобной направленности со встроенным па- чтобы у вас была возможность ознакомиться с «CITRIX(R)
кетом rdesktop. Наиболее известный из них – NetStation LICENSE AGREEMENT».
(netstation.sourceforge.net), который застыл в виде бета-вер- Теперь копируем TFtp и TftpdRoot на Windows-сервер в
сии с конца 2002 года, и его наследники: PXES (pxes.source нашем сегменте сети. В качестве такого сервера при ис-
forge.net), Thinstation (thinstation.sourceforge.net), и DIET-PC пользовании Tftpd32 может выступать любая Windows-ма-
(diet-pc.sourceforge.net). При этом DIET-PC предназначен для шина со статическим IP-адресом.
пользователей, хорошо знакомых с ОС Linux, что сразу ис- Допустим, мы скопировали обе директории на диск C:\.
ключает его из области рассмотрения. Поскольку процеду- Запускаем на исполнение C:\TFtp\Tftpd32.exe. Внешний вид
ра его настройки весьма кропотлива, и в DIET-PC присут- окна программы представлен на рис. 1. Необходимо задать
ствует достаточно много настроек, которые простому смер- параметры сервера. Нажимаем кнопку «Settings» и пропи-
тному, не Linux-гуру, никогда не пригодятся. PXES является сываем в качестве «Base directory» значение «C:\TftpdRoot».
наиболее «продвинутым» с большим числом дополнитель- Далее идем на вкладку «DHCP server». Там необходимо ука-
ных возможностей, включая собственную графическую сре- зать начальный IP-адрес, выделяемый DHCP-сервером («IP
ду, что также лишнее в моем случае. В моей конфигурации pool starting address»), размер пула адресов («Size of pool»),
клиент, минуя промежуточные меню, должен был сразу заг- маск у подсети («Mask»), имя файла с Etherboot-
ружать удаленный рабочий стол и выходить на окно ввода загрузчиком(«Boot file»), в нашем случае это thinstation.
пароля Windows 2003 Server. Таким образом, я обратил вни- nbi.zpxe. Нажимаем кнопку «Save» для сохранения настро-
мание на оставшийся дистрибутив – Thinstation. ек и сворачиваем приложение.
Кратко рассмотрим его возможности:
! поддержка протоколов X, RDP, VNC, SSH, Telnet, ICA и
Tarantella;
! возможность использовать браузер Firefox;
! загрузка по сети при помощи Etherboot, PXE (при помо-
щи Etherboot-загрузчика или PXELinux), HDD, CD или
floppy-диска. К сожалению, отсутствует поддержка USB-
flash;
! работа на ПК класса x86-100 МГц c ОЗУ 16 Мб;
! наличие pre-build образа, и возможность самостоятель-
ной сборки через веб-интерфейс;
! поддержка локальных дисков, USB- и LPT-принтеров.

Из всех вариантов загрузки наиболее простой – это PXE


при помощи Etherboot-загрузчика. В рамках этой статьи мы Ðèñóíîê 1. TFTP/DHCP-ñåðâåð Tftpd32, êîòîðûé óäîáåí ïðè
пойдем по самому простому пути будем использовать за- ïåðâîíà÷àëüíîé íàñòðîéêå
ранее скомпилированный образ. Все готово для работы. Вы можете попробовать вклю-
чить одну из машин с сетевой картой, поддерживающей
Установка и первоначальная настройка загрузку по протоколу PXE, не забыв выставить порядок
Начнем с того, что скачаем со странички http://struktur. загрузки в BIOS станции. При включении машина должна
kemi.dtu.dk/thinstation/download, доступной по ссылке с офи- получить IP-адрес из выделенного диапазона и загрузить
циального сайта, последний из архивов, в моем случае – это по протоколу TFTP файл thinstation.nbi.zpxe. Он содержит
был Thinstation-2.0.2-prebuilt-NetBoot.zip. Архив содержит в загрузчик, эмулирующий работу сетевой карты с поддерж-
себе все, что необходимо, включая TFTP/DHCP-сервер кой Etherboot. Затем управление передается загрузчику,
Tftpd32, который удобен при первоначальной настройке и который в свою очередь еще раз запрашивает по DHCP
конфигурировании. Если вы будете его использовать, то я адрес, и загружает файл с именем, совпадающим с назва-
бы порекомендовал сразу же обновить его с домашней стра- нием файла самого загрузчика минус расширение zpxe, то
нички, где имеется более свежая версия. Кстати, Tftpd32 есть thinstation.nbi. Данный файл и есть образ Thinstation.
(http://tftpd32.jounin.net) – сама по себе отличная програм- Когда образ загружен, Thinstation пытается загрузить из
ма. Причем настолько, что даже рекомендуется Cisco для корневой директории TFTP-сервера конфигурационный
некоторых потребностей клиентов компании. файл thinstation.conf-<MAC-адрес клиента>, затем thin
Развернув архив, мы получаем пять директорий: station.conf-<IP-адрес клиента>. Если такие файлы найде-
! BootDisk – образ дискеты с Etherboot-загрузчиком, для ны, то Thinstation объединяет их содержимое с общим кон-
ПК, с неподдерживаемыми сетевыми картами; фигурационным файлом thinstation.conf.network, который в
! BootPXE – загрузчик через PXE для эмуляции Etherboot; отличие от двух вышеперечисленных обязан присутство-
! BuildFiles – примеры конфигурационных файлов; вать на TFTP-сервере.
! TFtp – сервер Tftpd32; Постарайтесь избежать конфликтов между главным
! TftpdRoot – корневая директория TFTP-сервера. файлом настроек и специфическим к группе или конкрет-

№11(24), ноябрь 2004 13


администрирование
ной станции. Кроме того, можно объединять одним конфи- (16 bit color depth)"
гурационным файлом целые группы IP- и MAC-адресов. Это SESSION_0_TYPE=rdesktop
SESSION_0_RDESKTOP_SERVER=192.168.0.1
делается при помощи файла thinstation.hosts, имеющего SESSION_0_RDESKTOP_OPTIONS="-u Administrator ↵
следующий формат: -p password -a 16"

SESSION_1_TITLE="VNC server"
# HOST MAC GROUPS COMMENTS SESSION_1_TYPE=vncviewer
ws-oper1 0002B3655065 hi_res # Îïåðàöèîíèñò ¹1 SESSION_1_VNCVIEWER_SERVER=192.168.0.2
ws-oper2 0002B3651075 hi_res # Îïåðàöèîíèñò ¹2
ws-oper3 0002B365A021 hi_res ssh_en # Îïåðàöèîíèñò ¹3 SESSION_2_TITLE="Telnet server"
SESSION_2_TYPE=telnet
SESSION_2_TELNET_SERVER=192.168.0.3
В данном примере предполагается, что имеются два SESSION_3_TITLE="SSH server"
файла thinstation.conf.group-hi_res и thinstation.conf.group- SESSION_3_TYPE=ssh
ssh_en. SESSION_3_SSH_SERVER=192.168.0.4
Настройки, прописанные в первом файле, применяют- # Îáùèå îïöèè
ся ко всем трем станциям, а настройки из второго – только #
# Ðàñêëàäêà êëàâèàòóðû.  ñëó÷àå ðàáîòû ñ rdesktop îíà
к компьютеру ws-oper3. # ðîëè íå èãðàåò
То, как отображаются сессии терминальных клиентов в KEYBOARD_MAP=en_us
оснастке диспетчера терминальных служб, вы можете уви- # Îïöèè XServer
деть на рис. 2. #
SCREEN_RESOLUTION="1024x768"
SCREEN_COLOR_DEPTH="16"
SCREEN_HORIZSYNC="30-64"
SCREEN_VERTREFRESH="56-87"
MOUSE_RESOLUTION=100
# Îïöèè ïå÷àòè
#
PRINTER_0_NAME=usb
PRINTER_0_DEVICE=/dev/usb/lp0
PRINTER_2_TYPE=U

В заключение статьи, хочу сказать, что после отладки


работы с терминальными клиентами, лучше всего передать
функции TFTP- и DHCP-серверов программному обеспече-
Ðèñóíîê 2. Ñåññèè òîíêèõ êëèåíòîâ â îñíàñòêå äèñïåò÷åðà нию, способному работать в режиме службы на Windows
òåðìèíàëüíûõ ñëóæá NT/2000/2003/XP, например, как я уже говорил, «родным»
Клиенты с именами вида ts_<MAC-адрес> – это как раз службам Windows, либо воспользоваться соответствующи-
клиентские терминалы, работающие под управлением ми сервисами любой другой операционной системы.
Thinstation. Клиенты с именами вида P<IP-адрес> работа- Кроме того, на сайте проекта thinstation.sourceforge.net
ют под управлением дистрибутива PXES, рассмотрение при помощи веб-интерфейса вы можете самостоятельно
которого выходит за рамки данной статьи. перекомпилировать образ Thinstation без загрузки исход-
ных кодов, включив какие-либо отсутствующие в prebuild
образе функции, например браузер, или исключив ненуж-
ные модули.

Ðèñóíîê 3. Ìåíþ Thincstation


Далее я приведу простой, но вполне работоспособный
вариант конфигурационного файла с комментариями.

# Îïöèè ñåññèé
#
# Ïåðâàÿ ñåññèÿ äîëæíà îáÿçàòåëüíî íà÷èíàòüñÿ ñ íîìåðà 0.
# Ïðè îòñóòñòâèè íåîáõîäèìîñòè âûáîðà ñåññèè, íàïðèìåð,
# êîãäà âû èñïîëüçóåòå òîëüêî rdesktop, ìîæíî ñíÿòü
# êîììåíòàðèé ñî ñëåäóþùåãî ïàðàìåòðà, è èñêëþ÷èòü ìåíþ
# âûáîðà ñåññèé.
#AUTOSTART=On
Ðèñóíîê 4. Ñàìîñòîÿòåëüíîå ïîñòðîåíèå îáðàçà ÷åðåç âåá-
SESSION_0_TITLE="Windows 2003 terminal server ↵ èíòåðôåéñ TS-O-Matic

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

ПАКЕТНЫЙ ФИЛЬТР OpenBSD

ДЕНИС НАЗАРОВ
Позвольте мне поведать вам вновь об уникальных возмож- резервированные слова (pass, block, in, out и т. д.). Привы-
ностях операционной системы OpenBSD1. На сей раз мой кайте сразу использовать макросы, это хороший стиль.
рассказ будет о пакетном фильтре, входящем в стандарт- Следование ему в дальнейшем позволит избежать многих
ный дистрибутив данной системы, начиная с версии 3.0. проблем с пониманием работы и настройки фильтра.
Зачем вообще нужны пакетные фильтры? Любой из вас,
наверное, знает о неприятностях, существующих в просто- Таблицы
рах сети, и не раз сталкивался с ними. Читая «Hacking Именные структуры, хранящие адреса хостов и сетей. Ис-
Exposed 3th edition», я наткнулся на фразу: «2.13 AM, Do пользование таблиц предпочтительнее использования мак-
you know who is on your network?». Да, именно так, ведь вы, росов в тех случаях, когда необходимо описать огромное
будучи администратором сети, не можете постоянно сле- количество адресов. Для обработки правил, использующих
дить за тем, как и что проходит через вашу сеть. Однако вы таблицы, требуется меньше ресурсов, чем для обычных пра-
можете контролировать данный процесс, используя пакет- вил, решающих ту же задачу.
ные фильтры. Итак, прошу любить и жаловать – OpenBSD’s Таблицы также могут использоваться совместно с scrub
Packet Filter (PF). (нормализация трафика), rdr (перенаправление пакетов), nat
Конфигурация находится в файле /etc/pf.conf. Однако (трансляция адресов). И могут быть определены следую-
фильтр отключен по умолчанию в только что установлен- щими способами:
ном дистрибутиве, и существует 2 способа включить его: ! Вручную. Постоянные таблицы могут быть созданы ко-
! Отредактировать файл /etc/rc.conf, изменив значение мандой add или replace утилиты pfctl до или после заг-
pf=NO на pf=YES, также стоит сразу проверить путь к рузки набора правил.
конфигурационному файлу в директиве pf_rules=/etc/ ! pf.conf – для описания таблиц в файле используется ди-
pf.conf и перезагрузить систему. ректива table. Таблица, инициализированная с пустым
! Дать команду pfctl –e, которая заставит ядро включить листом { }, будет очищена при загрузке.
фильтр с пустыми настройками и без перезагрузки сис-
темы. Таблицы бывают двух видов:
! persist – этот флаг заставляет ядро хранить содержа-
Приступаем к конфигурации фильтра. Что же он уме- ние таблицы, даже если она не используется никакими
ет? Практически все. PF является очень серьезной альтер- правилами. Если таблица не помечена таким флагом,
нативой таким монстрам, как Checkpoint Firewall и Sun то ядро уничтожит ее после того, как последнее прави-
Screen, однако полностью бесплатен. ло, ссылающееся на нее, будет удалено.
Итак, PF имеет следующие возможности. ! const – этот флаг запрещает изменять содержание таб-
лицы после того, как она была создана.
Макросы
Макрос – очень удобная вещь, которая может сократить и Например:
оптимизировать ваш конфигурационный файл и избавит
вас от проблем с частым использованием обьемных и час- table <localz> const “{ 192.168.0.0/24, 192.186.13.0/24 }”
table <badhosts> persist
то повторяющихся директив. Я практически не представ-
ляю себе написание конфигурационных файлов для PF без block in quick log on $ext_if from <badhosts> to any
pass in on $int_if from <localz> to $internal_addr keep state
использования макросов.
Например, определение макросов: Данный фрагмент конфигурационного файла создаст
2 таблицы. В первой, <localz>, будут содержаться адреса
ext_if = “fxp0” наших внутренних сетей, а <badhosts> будет пустой. Таб-
external_addr = “{ 192.168.0.13/32, 192.168.0.113/32 }”
лица <localz> не может быть изменена или дополнена, т.к
И их использование: при создании использовался флаг const.
Правила фильтрации отбрасывают любые пакеты, при-
pass in on $ext_if from any to $external_addr keep state ходящие на внешний интерфейс ($ext_if) от хостов из таб-
pass out on $ext_if from $external_addr to any port 1337 ↵
keep state лицы <badhosts>, и пропускающие любые пакеты на внут-
реннем интерфейсе ($int_if), приходящие от хостов из таб-
В качестве имени макроса не могут использоваться за- лицы <localz>.

1
Предыдущие статьи автора: «Введение в OpenBSD», №6, 2003 г., «OpenBSD. Первые шаги», №8, 2003 г.

16
администрирование
# pfctl –t badhosts –T add 81.146.13.16 Это основные понятия о Statetul Inspection.
Теперь давайте рассмотрим дополнительные настрой-
Теперь добавим в таблицу <badhosts> хост с адресом ки, которые мы можем использовать совместно с возмож-
81.146.13.16, и все пакеты от данного хоста будут отверг- ностью Stateful Inspection. Дело в том, что при стандартных
нуты. Таблицу <badhosts> лучше иметь всегда, т.к. в слу- установках фильтр будет работать, однако часто бывает,
чае чего – это очень быстрый способ отвергнуть то, что что для идеального функционирования сети данные пара-
может причинить боль вашей сети. метры следует основательно подправить.
Таблицы могут заполняться списком адресов из како- set timeout <option>, где <option>:
го-либо файла. Синтаксис команды, выполняющей это дей- ! interval – интервал перед удалением истекших (expired)
ствие, таков: state и фрагментов.
! frag – секунды перед тем, как неассемблированный па-
table <spam> persts file “/etc/pf/spam” file “/etc/pf/openrelays” кет будет помечен как истекший.
block from <spam> to any port 25
! sc.track – время, в течение которого адрес отправителя
Файлы /etc/pf/spam и /etc/pf/openrelay содержат список будет продолжать отслеживаться, даже после того как
IP-адресов в формате: последнее «состояние» для этого адреса будет оконче-
но.
/etc/pf/spam
204.168.0.13
! tcp.first – «состояние» после первого пакета.
213.145.168.2 ! tcp.opening – «состояние» перед тем, как удаленный хост
пошлет первый пакет.
/etc/openrelay
213.146.16.0/24 ! tcp.estabished – «состояние» для TCP Three Way Hand
166.15.13.5/28 shake (установленного соединения).
! tcp.finwait – «состояние» после того, как оба хоста об-
Допускается использование FQDN вместо IP-адреса. Пе- менялись пакетами с установлеными FIN-флагами и
ред занесением в таблицу имя будет переведено в IP-ад- соединение считается закрытым.
рес с помощью функции gethostbyname(). ! tcp.closed – «состояние» после того, как один из хостов
посылает пакет с флагом RST.
Stateful Inspection
Прошу внимательно прочитать данный параграф, в нем я Протоколы ICMP и UDP настраиваются так же, как и TCP,
попытаюсь дать базовые понятия о Stateful Inspection – за- только с гораздо меньшим набором states.
чем это надо и почему полезно. ! udp.first – «состояние» после первого пришедшего па-
State – «состояние, положение» в переводе с английс- кета.
кого. PF Stateful – пакетный фильтр, а это означает, что он ! udp.single – «состояние», если удаленный хост послал
отслеживает состояние соединения. Вместо того чтобы про- больше чем один пакет, а хост назначения не послал в
пускать весь трафик, например, на порт 25 через все ин- ответ ни одного.
станции (читай фильтрацию) легче пропустить первый па- ! udp.multiple – «состояние» после того, как оба хоста по-
кет и затем просто следить за соединением. Фильтр не сор- слали пакеты.
тирует трафик – он уже предупрежден об этом соединении ! icmp.first – «состояние» после первого пришедшего па-
и значит, просто следит за его состоянием. кета.
Если пакет попадает под pass … keep state, фильтр со- ! icmp.error – state на любое сообщение об ошибке, воз-
здает state для этого соединения и автоматически пропус- вращенное ICMP-прокотолом.
кает весь трафик, принадлежащий данному соединению.
Перед тем как правила будут применены к данному па- Любые другие протоколы могут настраиваться так же,
кету, фильтр проверяет наличие state для данного пакета, но используя:
и если находит – пакет будет пропущен без проверки пра- ! other.first;
вилами. State удаляются сразу же по закрытии соединения ! other.sigle;
или же по истечении тайм-аута. ! other.multiple.
Это дает некоторые преимущества. Сравнение пакета
с таблицей states подразумевает проверку его sequence но- Время timeout может изменяться в зависимости от коли-
мера. Если номер вне диапазона ограниченного окна – па- чества state в той или иной группе, а также от нагрузки на
кет будет отброшен. Это позволяет избежать атак с подме- сеть, за это отвечают параметры adaptive.start и adaptive.end.
ной адреса (spoofed attacks). ! adaptive.start – когда количество «состояний» достига-
Также поиск среди states гораздо быстрее, чем полная ет данного порога, все timeout начинают изменять свои
фильтрация пакета по правилам. значения по формуле:
Использовать Stateful Inspection, еще раз напомню, по-
зволяет директива keep state. (adaptive.end – number of states) /
(adaptive.end – adaprive.start)
Например:
! adaptive.end – когда количество «состояний» достигает
block all данного порога, все timeout-значения обнуляются и уда-
pass out proto tcp from any to any flags S/SA keep state
pass in proto tcp from any to any port 25 flags S/SA keep state ляют за собой все «состояния».

№11(24), ноябрь 2004 17


администрирование
Все вышеперечисленные значения могут быть опреде- число IP-адресов, для которых будут создаваться «состоя-
лены как глобально, так и для каждого правила в отдель- ния». Используется опять же для тонкой настройки фильт-
ности, это затронет и «состояния», созданные такими пра- ра, генерируется sticky-address и source-track опциями в
вилами. правилах.
Например: Наконец, все это можно обьединить в одну строчку:

set timeout tcp.first 120 set limit { states 20000, frags 20000, src-nodes 2000 }
set timeout tcp.established 86400
set timeout { adaptive.start 6000, adaptive.end 12000 }
set limit states 10000 set optimization – опция, которая позволяет оптимизиро-
вать работу вашего фильтра для сетей следующего типа:
Как только таблица будет содержать 9000 state, значе- ! normal – обычная сеть, подходит для большинства се-
ния timeout снизятся до 50% (tcp.first 60, tcp.established тей.
43200). ! high-latency – соединение с большими обьемами трафи-
Манипуляция данными значениями позволяет очень тон- ка (например, спутниковое).
ко настроить работу вашего фильтра в тех или иных ситуа- ! satellite – синоним для high-latency.
циях. Это полезно для больших сетей или сетей, через ко- ! aggressive – аргессивный режим, позволяет очень силь-
торые проходят огромные обьемы трафика. но уменьшить использование памяти, однако ценой
set loginterface – опция, которая позволяет указать, для сбрасывания соединений, находящихся в состоянии idle,
какого интерфейса вы будете получать статистику по ко- работает быстрее, чем обычная.
манде. ! conservative – обратное от aggressive. Соотвественно
Например, у меня статистика выглядит так: грузим больше – живем дольше.
# pfctl -s i
Status: Enabled for 0 days 04:16:28 Debug: Urgent Я предпочитаю использовать на всех довольно загру-
женных серверах (порядка 150 Гб трафика в день на каж-
Hostid: 0xd5f48ad7
дом) режим aggressive, в то время как в обычных сетях, ко-
Interface Stats for em1 IPv4 IPv6 нечно же, я использую normal.
Bytes In 219620287 72
Вы спросите, а зачем это надо? Зачем нужны те лими-
Bytes Out 62229416 352
Packets In ты и тайм-ауты, которые я описывал выше? Ответ очеви-
Passed 759343 0 ден, PF может быть настроен так тонко, как не каждый па-
Blocked 1273 1
Packets Out кетный фильтр, существующий ныне. Порой стандартных
Passed 807867 2 уровней оптимизации либо «слишком мало», либо «очень
Blocked 3 3 много», вот и приходится играть с тайм-аутами и лимита-
State Table Total Rate ми, чтобы достичь идеальной производительности и мак-
current entries 344 симальной отдачи.
searches 3286659 213.6/s
inserts 37555 2.4/s set block-policy – определить, каким же будет ответ филь-
removals 37211 2.4/s тра для действия block в правилах.
Counters
match 182069 11.8/s
! drop – пакет просто отбрасывается.
bad-offset 0 0.0/s ! return – фильтр ответит пакетом с флагом RST для TCP
fragment 0 0.0/s или же пакетом ICMP UNREACHEBLE для UDP, и все
short 0 0.0/s
normalize 0 0.0/s
остальные пакеты будут просто отброшены.
memory 0 0.0/s
bad-timestamp 0 0.0/s set require-order – определить порядок обслуживания.
Идем дальше: По умолчанию фильтр пропускает пакет по следующей це-
set limit – позволяет установить жесткое ограничение на почке: Options → Normalization → Queueing → Translation →
количество областей в памяти с фиксированным размером, Filtering. То есть сначала применяются настройки для филь-
используемых пакетным фильтром. Например: тра, потом нормализация трафика, затем распределение
по очередям, дальше трансляция адреса и, наконец, сама
set limit states 20000 фильтрация.
Данная цепочка является идеальной с точки зрения раз-
устанавливает максимальное значение для количества эле- работчиков фильтра, но они оставляют вам возможность
ментов, используемых для «состояний». исправить ее на ваше усмотрение.
set fingerprints – указать системе, где находится файл с
set limit frags 20000 определениями отпечатков (fingerprints) для различных опе-
рационных систем. Ну где вы еще видели пакетный фильтр,
устанавливает максимальное значение для количества эле- который умеет пропускать наружу или внутрь пакеты, при-
ментов, используемых для «fragment reassembly», генери- ходящие от Linux, а от Windows 2003 отбрасывать? Мелочь,
руется при помощи scrub. а очень приятно. Например:

set limit scr-nodes 2000 set fingerprints "/etc/pf.os.devel"

18
администрирование
set debug – уровень дебага для фильтра. ! binat – полную двухстороннюю замену между внутрен-
Опции: ним и внешним IP-блоком;
! none – никаких сообщений; ! nat – обычную трансляцию;
! urgent – сообщения только для серьезных ошибок; ! rdr – пакет перенаправляется на любой порт и любой
! misc – для различных ошибок; хост. Маленькое дополнение: если пакет перенаправля-
! loud – для всего подряд. ется во внутренную сеть, то помимо rdr надо сделать и
nat для хоста, который будет отвечать во внешний мир
Нормализация трафика на данные перенаправленные пакеты.
Не секрет, что нестандартными пакетами (например, раз-
мер или набор флагов) можно заставить некоторые серви- Пример:
сы перестать работать и еще много каких гадостей натво-
рить в сети. rdr on em1 inet proto tcp to port 80 -> $web_server port 80
scrub – директива, отвечающая за нормализацию тра-
фика.
Дополнительные параметры: Фильтрация пакетов
! no-df – убирает флаг «Don’t fragment» из заголовка па- Фильтрация протекает стандартно – создаются правила.
кета. Позволяет избавить вашу сеть от проблем со спе- Правила могут иметь 2 результата:
циально засланными пакетами огромного размера. ! block – пакет будет отброшен, используя следующие спо-
! min-ttl <number> – меняет минимальное значение TTL собы:
для IP-пакета. ! drop – пакет просто удаляется и никаких данных в
! max-mss <number> – меняет максимальное значение ответ не посылается.
MSS для TCP-пакета. ! return-rst – только для TCP-пакетов, отсылается пакет
! random-id – меняет IP identification-поле в заголовке па- с флагом RST, который прекращает соединение не-
кета для защиты TCP-соединения от вторжения мето- медленно.
дом подбора значения, передаваемого в данном поле, ! return-icmp (return-icmp6) – возвращается сообщение
применяется только к исходящим соединениям. ICMP UNREACHABLE, однако данное значение мож-
! fragment reassemble – позволяет держать в памяти фраг- но переопределить любым кодом ошибки ICMP-про-
менты пакетов до того момента, пока пакет не будет пол- токола.
ностью составлен. Гарантирует вам отсутствие лишне- ! return – автоматически TCP RST будет возвращен для
го трафика и нагрузки на сеть. TCP-пакетов и ICMP UNREACHABLE для UDP- и дру-
! fragment crop – стандартный метод, фрагменты пакетов гих протоколов.
пропускаются в сеть, где уже сами хосты пытаются со- ! pass – пакет будет пропущен фильтром.
брать их в целый пакет. Данный метод неэффективен с
точки зрения нагрузки на сеть. Если ни одно правило не подходит, то пакет будет про-
! fragment drop-ovl – то же самое, что и предыдущее, раз- пущен.
ница лишь в том, что одинаковые фрагменты, пришед- Итак, параметры фильтрации:
ние по какой-либо ошибке, будут отброшены фильтром. ! in или out – пакет идет к нам или от нас соотвественно.
! reassemble tcp – нормализация TCP-соединений. Допол- Если не определено, то считается, что направление двух-
нительные возможности – ttl, timeout modulation, extended стороннее.
PAWS checks. Данные темы я рассмотрю в следующих ! log – записывать информацию о пакетах, однако будут
статьях, т.к это относится непосредственно к протоко- записаны только пакеты, которые попадают в «состоя-
лу, а не к пакетному фильтру. ния».
! log-all – записывать информацию о всех приходящих па-
Например: кетах, независимо от того, попал он в state или нет.
! quick – если пакет попадает под это правило, то даль-
scrub in all нейшие правила не применяются. Полезно, например,
использовать с таблицей <badhosts>.
и все, фильтр сам подберет оптимальные параметры и раз- ! on <interface> – правила применяются только в случае,
берется со всеми потенциально опасными пакетами. если пакет идет с указанного интерфейса.
! proto <protocol> – правила применяются только к паке-
Распределение по очередям там данного протокола. Например, ICMP, TCP, UDP. Пол-
В этой статье я не буду описывать возможности PF при ра- ный список протоколов находится в /etc/protocols.
боте с контролем полосы пропускания, об этом в следую-
щих статьях. Скажу только, что в фильтр встроен ALTQ и from <source> port <sourceport> to <dest> port <destport>
механизмы cbq, priq, hfsc.
NAT – Network Address Translation – трансляция адре- Примерно понятно? Откуда, с какого порта, куда, на
сов. Определяет, как адреса будут транслироваться или какой порт.
перенаправляться относительно других адресов. Опции следующие:
Фильтр позволяет осуществить: ! any – любой адрес.

№11(24), ноябрь 2004 19


администрирование
! no route – адреса, которые вне таблицы роутинга. ! show – показать хосты в таблице;
! <table> – адреса из таблицы «table». ! test – проверить, попадает ли данный адрес в таблицу;
! zero – обнулить статистику таблицы;
Порты могут указываться с использованием стандарт- ! load – загрузить таблицы только из файла конфигу-
ных операторов (=, !=, <, <=, >, >=, :, ><, <>). рации. Обычно используется так:

! flags <a>/<b> | <b> – данные правила применяются толь- # pfctl –T load –f /etc/pf.conf
ко для пакетов с установленными флагами <a> перед
флагами <b>. Флаги F(IN), S(YN), R(ST), P(USH), A(CK), ! -t указывает имя таблицы, в которой обрабатываются
(U)RG, E(CE), C(W)R. команды для -T.

Комбинировать флаги можно по-разному, однако опыт Вот, в общем, основные команды для pfctl. Думаю, с этой
показывает, что оптимальным является сочетание flags S/ утилитой вы разберетесь очень быстро.
SA. Это значит, что перед тем как отправлять пакеты с фла-
гами SYN+ACK (соединение установлено), хост обязан от- Заключение
править пакет с флагом SYN. Данный набор идеален для В следующей статье я обязательно расскажу вам обо всех
обычных TCP/IP-сетей, где не проводят никаких сетевых эк- вещах, не затронутых в этой статье, таких как контроль
спериментов, а просто потихонечку выкачивают весь Ин- полосы пропускания, роутинг и т. д. И с удовольствием от-
тернет к себе на жесткие диски. вечу на все ваши вопросы относительно пакетного фильт-
ра OpenBSD.
Утилита управления Напоследок привожу пример конфигурационного фай-
пакетным фильтром pfctl ла, в котором использованы все те возможности, о кото-
Pfctl – довольно мощное средство, предоставляемое вам рых я писал.
для управления фильтром. И, кстати, единственное.
Используется для выполнения следующих операций: ext_if="{ rl0 }"
external_addr="{ 192.168.0.13/32, 192.168.0.113/32 }"
! -e – включить фильтр.
! -d – выключить фильтр (статистика по pfctl –s i обнуля- allowed_tcps = "{ 22, 25, 80 }"
allowed_udps="53"
ется).
! -F modifier – обнулить значения для: insecure_tcps="{ 21, 53, 110 }"
#insecure_udps=
! nat – таблицы трансляций;
! queue – очередей; insecure_tcp_hosts = "{ 192.168.9.13/32, 192.168.13.13/32 }"
#insecure_udp_hosts
! rules – правил фильтрации;
! state – «состояний»; set timeout { interval 30, frag 10 }
set timeout { tcp.first 120, tcp.opening 30, ↵
! Sources – таблицы отслеживания адресов отправи- tcp.established 86400 }
телей; set timeout { tcp.closing 900, tcp.finwait 45, ↵
tcp.closed 90 }
! info – статистики; set timeout { udp.first 60, udp.single 30, udp.multiple 60 }
! Tables – таблиц; set timeout { icmp.first 20, icmp.error 10 }
set timeout { other.first 60, other.single 30, ↵
! osfp – отпечатков операционных систем; other.multiple 60 }
! all – очистить все вышеперечисленное. set limit { states 10000, frags 5000 }
set loginterface rl0
! -f file – путь к конфигурационному файлу. set optimization normal
! -i interface – правила будут применены только к указан- set block-policy drop
set require-order yes
ному интерфейсу.
! -o – включить «оптимизатор» для правил. Новая воз- scrub in all
можность фильтра позволяет: table <spamd> persist
! удалить повторяющиеся правила; table <spamd-white> persist
rdr pass inet proto tcp from <spamd> to ↵
! удалить правила, которые являются частью другого any port smtp -> 127.0.0.1 port 8025
правила; rdr pass inet proto tcp from !<spamd-white> to ↵
any port smtp -> 127.0.0.1 port 8025
! скомбинировать разные правила в таблицу с общи-
ми частями; block in log all
pass out proto { tcp, udp, icmp } all keep state
! переопределить порядок правил для улучшения
фильтрации. pass in on lo0 all
pass out on lo0 all
! -s modifier – то же самое, что и -F, только не обнуляет, а
показывает информацию, modifiers – все то же. pass in inet proto icmp all icmp-type echoreq keep state
pass in on $ext_if proto tcp from any to ↵
! -T command – используется для управления таблица- $ext_if port $allowed_tcps flags S/SA keep state
ми: pass in on $ext_if proto udp from any to ↵
$ext_if port $allowed_udps keep state
! kill – удалить таблицу; pass in on $ext_if proto tcp from $insecure_tcp_hosts to ↵
! flush – очистить таблицу; $ext_if port $insecure_tcps flags S/SA keep state
! add – добавить один или несколько хостов в таблицу; pass in on $ext_if proto tcp from any to ↵
! replace – заменить адрес; any port > 49151 keep state

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

ВИРТУАЛЬНЫЕ ВОЙНЫ
Сравнительное тестирование
VMWare Workstation и Cooperative Linux There are three kinds of lies:
lies, damned lies and benchmarks1

МИХАИЛ ПЛАТОВ
В рассмотрении работы любых систем, в том числе и вир- туальных машин, было принято решение использовать уже
туальных машин, значительную роль играет производитель- существующие и «проверенные» тестовые пакеты. В каче-
ность. Ведь для любой системы, работающей в реальных стве основы для методики проведения тестов использова-
условиях, важна не только ее функциональность, но и об- лись Linux Benchmarking Toolkit (LBT) и Scalable Test Platform
щая скорость работы, в том числе и в сравнении с другими (STP), которые по необходимости дополнялись специфич-
решениями, присутствующими на рынке. Для оценки про- ными тестами.
изводительности, как правило, используются пакеты, со- В итоге тестируемые системы были изучены при помо-
стоящие из различных тестов, измеряющих производитель- щи следующих тестовых пакетов:
ность всех основных компонентов системы. Тесты могут из- ! Компиляция ядра Linux 2.4.27 (стандартная конфигура-
мерять как абсолютную производительность того или ино- ция).
го компонента (синтетические тесты), так и скорость рабо- ! lm_bench 3.0_alpha3.
ты определенной программы (тесты-приложения). Тесты ! nbench 2.2.1.
первой категории позволяют измерить пиковую произво- ! ttcp 1.12.
дительность системы, которая, скорее всего, никогда не бу- ! tiobench-0.3.3-r1.
дет достигнута при работе реальных программ. Тесты-при- ! bonnie++ 1.93c.
ложения, напротив, показывают, насколько полно та или
иная программа использует потенциал рассматриваемой Этот набор включает как синтетические тесты, измеря-
системы. ющие производительность основных подсистем (целочис-
В данной статье эти и другие «азы тестирования» будут ленная и плавающая арифметика, производительность под-
применены на практике. Речь пойдет о сравнительном тес- системы памяти и жесткого диска, операции ввода-вывода
тировании VMWare и Cooperative Linux. Кроме того, их ре- и т. д.), так и тесты приложений (компиляция ядра). Более
зультаты будут также соотнесены с производительностью подробно с методикой тестирования в рамках LBT можно
обычного Linux, работающего в монопольном режиме. ознакомиться на странице http://www.tldp.org/HOWTO/
Benchmarking-HOWTO-3.html.
Методика тестирования Тесты выполнялись на компьютере следующей конфи-
Идея тестирования, в том числе и Linux, не нова. За все гурации:
время своего существования Linux обзавелся огромным ! Процессор – AMD Duron XP 1800 МГц.
количеством тестов, измеряющих производительность не ! Материнская плата – ECS K7S6A (SIS 745).
только различных компонентов системы, но и работающих ! ОЗУ – DDR SDRAM 512 Мб.
в нем приложений. Некоторые из этих тестов уже де-факто ! Память, выделяемая гостевой ОС – 128 Мб.
стали стандартами тестирования, в то время как другие ! Жесткий диск Samsung SP0802Т (для основной ОС).
лишь завоевывают себе место под солнцем. ! Жесткий диск Samsung SV0411N (для тестируемых си-
Поэтому для того, чтобы в n-й раз не изобретать вело- стем).
сипед, разрабатывая пакеты тестов, специфичные для вир- ! Сетевая плата Intel PRO 100VE.
1
«В компьютерном мире есть три вида лжи: ложь, наглая ложь и тесты производительности». (c) Бенжамин Дизраэли, Марк Твен и
компьютерное сообщество.

№11(24), ноябрь 2004 21


администрирование
Следует отметить, что ввиду архитектурных особенно- С точки зрения производительности остальных компо-
стей при тестах coLinux использовалось ядро Linux, моди- нентов ситуация неоднозначна. С одной стороны, VMWare –
фицированное патчами coLinux (описание архитектуры типичная виртуальная машина (к тому же работающая на
coLinux можно найти в статье [1]). Для VMWare и «чистой» большом количестве платформ), поэтому ей должны быть
системы использовалось ядро 2.4.27, собранное в конфи- присущи некоторые накладные расходы, вызванные необ-
гурации по умолчанию. ходимостью эмуляции «слоя виртуализации», обеспечива-
При проведении тестов основной акцент делался не на ющего интерфейс «известного» оборудования.
измерении производительности систем в абстрактных «по- Ситуация с coLinux несколько иная. Компьютер эмули-
пугаях», а на определении того, какая из них выполняет руется не полностью (в отличие от VMWare). Ядро содер-
тот или иной тест наиболее эффективно. жит минимум функциональности для работы с оборудова-
нием, поэтому скорость работы системы во многом зави-
Теоретическое отступление сит от эффективности используемых драйверов и скорос-
Прежде чем приступить к рассмотрению реальных тестов ти работы самой ОС Windows. В случае VMWare произво-
и их результатов посмотрим более подробно на сегодняш- дительность, конечно, тоже зависит от производительнос-
них претендентов. ти Windows, однако она также во многом зависит и от ско-
Итак: рости работы самого ядра «гостевой» системы. Поэтому
! VMWare Workstation – коммерческий продукт представ- для достижения наибольшей производительности в VMWare,
ляет собой типичную виртуальную машину. Для «госте- необходимо скомпилировать ядро с поддержкой «виртуаль-
вой» ОС VMWare предоставляет «известный» аппарат- ного» оборудования. Теоретически подход, используемый
ный интерфейс (chipset – Intel 440BX, LAN – AMD PCnet32 coLinux, может обеспечить большую производительность (за
и т. д.). Это позволяет запускать в виртуальной машине счет отсутствия слоя виртуализации). Так это или нет, про-
практически все известные ОС, работающие на эмули- верим на тестах.
руемом оборудовании. (DOS, Windows, Linux, Solaris,
FreeBSD, NetWare). Производительность процессора
! Cooperative Linux – Open Source продукт, распространя- Многие пользователи Linux-систем для определения про-
емый по лицензии GPL. В его состав входит патч Linux- изводительности процессора используют BogoMIPS – внут-
ядра, позволяющий запустить ядро ОС Linux из Windows. реннюю переменную ядра, косвенно отражающую скорость
В качестве гостевой ОС может выступать только Linux, работы процессора. Сами разработчики ядра утверждают,
причем ядро должно быть соответствующим образом что BogoMIPS не является показателем производительно-
«пропатчено». Так, используемое в coLinux ядро не ра- сти процессора и относиться к нему как тесту сколь-нибудь
ботает с оборудованием в привычном для нас понима- серьезно нельзя. Тесты рассматриваемых сегодня систем
нии: оно не поддерживает Plug&Play, ACPI, PCI, видео и это только подтверждают: на всех виртуальных машинах
звуковые карты, жесткие диски, USB и т. д. Работа со число BogoMIPS абсолютно одинаково – 3696. Ну что же,
всем жизненно важным оборудованием производится давайте посмотрим, что скажут тестовые пакеты.
через специальные драйверы (Cooperative PIC, CoLinux nbench – данный пакет измеряет, во сколько раз пока-
Block Device, WinPCAP, TAP), работающие с оборудова- затели производительности данной системы превосходят
нием через драйверы Windows. эталонную (Pentium-90 и K6-233). Результатом его работы
является набор индексов производительности подсистемы
У каждого из этих подходов есть свои «за» и «против». памяти, целочисленных операций и операций с плавающей
Так, для того чтобы запустить ОС в VMWare, не требуется точкой. Тест запускался с параметрами по умолчанию.
прикладывать практически никаких усилий. С другой сто- В целях экономии места приведены данные относитель-
роны, для запуска существующего Linux из coLinux, при про- но эталона K6-233 (для Pentium-90 ситуация выглядит ана-
чих равных, придется как минимум пересобрать ядро с пат- логично) (см. рис. 1).
чами coLinux. Кроме того, coLinux не поддерживает таких Что же, процессор, он и есть процессор. Все три рас-
вещей, как «прямая работа с USB-устройствами», видео- сматриваемые системы идут практически вровень.
карты и оборудование вообще. И если с USB-устройства-
ми все-таки можно работать (через интерфейс блочных
устройств), то о запуске X-сервера непосредственно на
coLinux можно забыть. Конечно, в качестве X-cервера мож-
но использовать какой-нибудь Cygwin/X, XWin-PRO, Mi-X
или HumningBird Exceed, установленный на Windows. Од-
нако мой опыт работы с Windows X-серверами показал, что
такое решение на данный момент слабо пригодно для ежед-
невного использования – уж очень низка производитель-
ность X-приложений. Справедливости ради нужно сказать,
что субъективная скорость работы X-сервера в VMWare
тоже далека от совершенства. Однако, безусловно, этот
вопрос требует дальнейшего изучения, которое выходит за
рамки данной статьи. Ðèñóíîê 1

22
администрирование
Подсистема памяти а именно эмуляцией контроллера IDE чипсета Intel i440BX.
Для измерения производительности подсистемы памяти ис- С coLinux же ситуация обстоит несколько иначе: он не ра-
пользовался низкоуровневый пакет синтетических тестов ботает с устройствами напрямую (ядро собирается без под-
lm_bench. В состав данного пакета входит несколько ути- держки шины PCI и соответственно без контроллера IDE).
лит, измеряющих производительность базовых операций Диск эмулируется специальным драйвером блочных уст-
(чтение, запись, копирование, произвольное чтение и т. д.) ройств, работающих с Windows-демоном coLinux. По этой
применительно к различным компонентам ОС (подсистема причине было принято решение в пользу измерения произ-
памяти, tcp, pipes, sockets и т. д.). водительности диска не низкоуровневыми утилитами (на-
пример, hdparm), а измерением скорости работы с файло-
вой системой. Однако для того, чтобы уменьшить влияние
файловой системы на результаты тестов, использовалась
нежурналируемая (и соответственно более быстрая) фай-
ловая система ext2fs.
При построении «виртуальной» системы можно исполь-
зовать два основных подхода:
! создать образ root-файловой системы в файле на су-
ществующем ntfs- или fat-разделе;
! создать (или использовать уже существующий) ext2-
раздел и работать с ним напрямую.

Ðèñóíîê 2 В первом случае на производительность дисковых опе-


Для тестирования подсистемы памяти использовалась раций в Linux накладывается дополнительное влияние фай-
утилита bw_mem. При запуске ей передавались следующие ловой системы (скорость доступа, фрагментация и т. д.) и
параметры: ее драйвера. Второй случай этих проблем лишен, поэтому
производительность «виртуальных» систем на отдельном
# bw_mem -P 1 -W 1 1024K rd|wr|cp разделе должна быть выше. Итак, перейдем к первому те-
сту – последовательное чтение блока данных. В данном те-
Для каждой машины измерялась скорость чтения (rd), сте с диска последовательно считывается файл размером
записи (wr) и копирования (cp). Для тестирования в услови- 256 Мб (блоками по 4 Кб). Для имитирования ситуации мно-
ях многопоточности тест на каждой машине запускался для гозадачности тест проводится для 1, 2, 4 и 8 потоков.
трех параметров P – 1, 10 и 50. (Так как расхождение резуль-
татов для 1 и 50 потоков составило менее 1%, на диаграмме
приводится усредненное значение всех трех экспериментов).
Итак, все рассматриваемые «виртуальные» машины
одинаково эффективно работают с памятью. При чтении
coLinux оказался несколько быстрее VMWare, однако вы-
игрыш является настолько несущественным, что вполне мо-
жет быть списан на погрешности измерения.

Дисковая подсистема
Для тестирования дисковой подсистемы использовался вто-
рой жесткий диск, разбитый на два раздела. Первый раз-
дел был отформатирован в файловую систему ext2 (3 Гб),
на которую был записан Gentoo-Linux из образа, взятого с
сайта coLinux. Этот раздел использовался при тестирова-
нии Linux, VMWare и coLinux (в тестах обозначена как Ðèñóíîê 3
«*_part»). Второй раздел был отформатирован в ntfs (10 Гб) Быстрее всех с диском работает «чистый» Linux, затем
и использовался для измерения производительности дис- идут VMWare и coLinux, работающие с выделенным разде-
ковой подсистемы coLinux и VMWare в случае, если образ лом. В случае одного потока производительность vmware
файловой системы хранится в виде файла. При проведе- выше coLinux, однако с увеличением количества потоков
нии тестов в Linux добавлялась поддержка чипсета SIS5513, coLinux несколько вырывается вперед. Медленнее всего ра-
в VMWare – чипсета PIIX. В обоих случаях при тестирова- ботают VMWare и coLinux, использующие образ root-фай-
нии были включены режим DMA и 32-битный режим рабо- ловой системы на существующем разделе, хотя VMWare
ты с диском. Виртуальный диск в файл-образе в тесте с все же показывает чуть более высокую производительность
VMWare подключался к интерфейсу IDE. (см. рис .4).
В организации дисковых подсистем наших подопытных При произвольном чтении ситуация несколько меняет-
есть некоторые отличия. Как было отмечено выше, VMWare – ся. Явно лидирует «чистый» Linux, все виртуальные маши-
типичный представитель виртуальных машин, и дисковая ны показывают примерно одинаковую и достаточно низкую
подсистема в ней реализована соответствующим образом, скорость.

№11(24), ноябрь 2004 23


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

Ðèñóíîê 4
В следующем тесте измеряется скорость последова- Ðèñóíîê 7
тельной записи на диск.
Производительность TCP/IP
Как VMWare, так и coLinux поддерживают различные типы
организации взаимодействия между реальной и виртуаль-
ной машинами. Основными являются bridged и NAT (более
подробное описание можно найти в статье [1]). Для получе-
ния более полного представления об обоих исследуемых
виртуальных системах тестирование каждой их них прово-
дилось как в режиме bridged, так и NAT.
Отличительной особенностью «сетевых» тестов являет-
ся то, что для измерения производительности всегда тре-
буется «вторая сторона», выступающая при передаче в ка-
честве партнера.
Причем крайне желательно, чтобы такой партнер был
Ðèñóíîê 5 заведомо быстрее, при этом он не будет являться узким
«Чистый» Linux, как всегда, впереди. За ним идут coLinux местом и его производительность не окажет существенно-
и VMWare в различных конфигурациях дисковой подсисте- го влияния на производительность измеряемой системы. В
мы. С увеличением количества потоков производительность роли такого партнера в данном тесте использовался заве-
всех систем сравнивается. домо более быстрый компьютер – Pentium-4 – 2.4 ГГц (се-
Тест произвольной записи: тевой интерфейс Intel PRO 100), также работающий под уп-
равлением Linux (дистрибутив Gentoo).
В тестах использовался пакет ttcp, измеряющий произ-
водительность TCP- и UDP-передач. Тест запускался 5 раз,
в качестве результата приводится среднее значение.

Ðèñóíîê 6
А вот и первая неожиданность: скорость записи у coLinux
и VMWare оказалась больше, чем у «чистого» Linux. Причи-
ной этому, скорее всего, является кэширование обращений Ðèñóíîê 8
к диску, производимое ОС Windows. Для проверки этой ги- Первыми в данном тесте пришли Linux и VMWare в ре-
потезы проведем тест с помощью другой утилиты – bonnie++ жиме bridged. Их скорость (91 Мбит/с) оказалась близка к
(sequential output, per block, size 300 Мб) (см. рис. 7). максимальной теоретически достижимой. На третьем мес-
Ситуация в целом такая же, хотя и имеются некие рас- те оказался coLinux в режиме NAT (скорость составила око-
хождения, причина которых, скорее всего, кроется в высо- ло 42 Мбит/с). Самыми медленными оказались coLinux в
коуровневой природе тестов. режиме bridged и VMWare в режиме NAT.

24
администрирование
Производительность каналов (pipes) Быстрее всех с задачей справился «чистый» Linux – 6
Канал (Pipe) – способ межпроцессного взаимодействия, минут и 5 секунд. Вторым финишировал coLinux – 6 минут
реализованный во всех популярных системах (Windows, 32 секунды. На последнем месте (с достаточно большим от-
Linux и др.), активно используемый многими приложения- рывом) оказалась VMWare Workstation– 9 минут 13 секунд.
ми. Для тестирования производительности каналов исполь-
зовался тест bw_pipe, входящий в пакет lmbench. Данный Выводы
тест создавал канал между двумя процессами и блоками Итак, несколько слов о результатах. В тестах процессора и
64 Кб передавал по нему 32 Мб данных: подсистемы памяти все тестируемые сегодня системы пока-
зали практически равные результаты, так что если главной
# bw_pipe -P 1 -W1 -M 32768K для вас задачей, решаемой Linux, является задача вычисли-
тельная, то можете смело использовать любую из систем. В
Результаты теста отражены в таблице: качестве дисковой подсистемы для виртуальной машины
можно использовать как выделенный Linux-раздел, так и
файл-образ на уже существующем fat или ntfs-разделе (хотя
первый вариант все-таки выглядит более привлекательно).
Ethernet. Если же вам необходим полноценный 100 Мбит
сетевой интерфейс в виртуальном Linux, то следует обра-
тить внимание на VMWare Workstation. Разработчики bridged-
драйвера VMWare действительно поработали на славу, обес-
печив производительность, практически не уступающую «чи-
стой» Linux-системе. Производительность сетевой подсис-
темы coLinux можно назвать приемлемой только в режиме
NAT. В режимах coLinux-bridged и VMWare-NAT «серьезно»
использовать сеть, скорее всего, не получится – уж больно
Ðèñóíîê 9 низка производительность.
Linux, как ему и положено, держится впереди. coLinux в И напоследок позвольте сказать еще несколько слов.
данном тесте опережает VMWare более чем в 2 раза. Решение о том, использовать ту или иную систему или нет,
всегда должно приниматься с учетом условий и реалий ре-
Компиляция ядра шаемой задачи, главное при этом не забывать, что «There
Для оценки общей производительности системы выполня- are three kinds of lies: lies, damned lies and benchmarks».
лась привычная многим операция – компиляция ядра Linux.
Этот тест ценен не только достаточно показательным прак- Литература, ссылки:
тическим результатом (в процессе компиляции активно ис- 1. Платов М. Знакомство с Cooperative Linux. – Журнал
пользуются процессор, память и дисковая подсистема), но «Системный администратор», №10, октябрь 2004 г.
и тем, что практически все люди, активно работающие с 2. LBT: http://www.tldp.org/HOWTO/Benchmarking-HOWTO-
Linux, время от времени пересобирают ядро. В качестве «по- 3.html.
допытного» использовалось ядро версии 2.4.27 со стандар- 3. STP: http://www.osdl.org/lab_activities/kernel_testing/stp.
тными опциями конфигурации ядра (make oldconfig). 4. VMWare Worksatation: http://www.vmware.com/products/
При тестировании в VMWare и coLinux root-файловая си- desktop/ws_features.html.
стема находилась на ext2-разделе второго жесткого диска. 5. Cooperative Linux: http://www.colinux.org.
Время компиляции ядра измерялось с помощью утилиты 6. lmbench: http://www.bitmover.com/lmbench.
time (время выполнения make dep не учитывалось): 7. ttcp: http://www.pcausa.com/Utilities/pcattcp.htm.
8. netperf: http://www.netperf.org/netperf/NetperfPage.html.
# time make vmlinux 9. tiobench: http://sourceforge.net/projects/tiobench.
10. bonnie++, http://www.coker.com.au/bonnie++.
Тест в каждой системе выполнялся 3 раза, на диаграм-
ме приводится усредненное время компиляции (чем мень-
ше, тем лучше): Уважаемые читатели!
Теперь вы можете приобретать новые и старые
номера журнала через интернет-магазин

Стоимость 1 экземпляра – 140 рублей

Доставка почтой БЕСПЛАТНО в любую точку России


Ðèñóíîê 10

№11(24), ноябрь 2004 25


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

ОБЗОР ЭМУЛЯТОРА mips64emul

АЛЕКСАНДР
АЛЕКСАНДР БАЙРАК
БАЙРАК
В этой статье я хотел бы вам рассказать об одном очень граммы. Я использовал версию 0.2. Процесс установки
интересном эмуляторе – mips64emul. В последнее время mips64emul очень прост и каких-либо затруднений не выз-
меня заинтересовала тема эмуляции во всех ее проявле- вал:
ниях. Начиная от эмулирования системных вызовов какой-
либо ОС, заканчивая полноценными виртуальными маши- ./configure – help
нами. В конечном итоге виртуальная машина – это тот же
самый эмулятор, отличие лишь в том, что эмулируется весь Внимательно читаем, может быть, вам понадобится для
компьютер целиком. Самые известные представители ряда своих нужд добавить какие-либо опции.
виртуальных машин – VMWare, Bochs, Virtual PC. И вот тут
мы подходим к самому интересному, все вышеперечислен- ./configure
gmake
ные программы эмулируют архитектуру x86. Соответствен- gmake install
но под ними у нас есть возможность запустить ОС, создан-
ные для этой архитектуры. Но ведь есть и другие архитек- mips64emul поддерживает эмуляция достаточно боль-
туры – PPC, m68k, SPARC, MIPS, и т. д. Потратив некото- шого количества компьютеров с mips-процессорами:
рое время на поиски программ, способных эмулировать ! DEC Station: PMAX(3100), 3MAX(5000), 3MIN(5000),
процессоры, отличные от x86, я нашел много чего интерес- 3MAX+(5000,5900), 5800, 5400, MAXINE(5000), 5500,
ного. Изыскания относительно одной из находок перед 5100(MIPSMATE).
вами. ! ARC: NEC-RD94, PICA-61, NEC-R94, Deskstation Tyne.
Официальный сайт проекта mips64emul – www.mdstud. ! Sony Playstation 2 (CPU R5900).
chalmers.se/~md1gavan/mips64emul. Как ясно из названия, ! Cobalt (CPU RM5200).
он эмулирует процессоры MIPS. Данная программа способ- ! Различные машины от SGI (IPxx ).
на эмулировать как 64-, так и 32-битные процессоры MIPS. ! Некоторые карманные компьютеры с MIPS-процессора-
MIPS в настоящее время используются достаточно широ- ми.
ко: 90% всех компьютеров от Silicon Graphics используют
эти процессоры, также они используются в игровой пристав- Поддерживаемые типы процессоров:
ке Sony Play Station 2 и во многих других устройствах. ! R2000, R2000A, R3000, R3000A, R4000.
Перейдем от теории к практике. Все свои эксперимен- ! R4300, R4400, R4600, R4700, R5000.
ты я проводил на P3-550 МГц/320 Мб RAM под управлени- ! RM5200, R5900, VR5432, R6000, RM 7000.
ем ОС FreeBSD 4.10. Также ее можно использовать под уп- ! R8000, R10000, R12000, R14000, 5K.
равлением другой BSD-системы или Linux.
Берем с сайта разработчика последнюю версию про- Далее, для каждого компьютера нужна ОС. На сайте раз-

26
администрирование
работчика я прочитал, что на данный момент под эмулято- После чего запустить mips64emul:
ром можно свободно запустить следующие ОС:
! NetBSD/pmax; mips64emul –X –D2 –d disk.img netbsd-INSTALL
! OpenBSD/pmax;
! Ultrix/RISC; Так же в случае процесса установки по сети придется
! Sprite. настроить сеть. Сетевой интерфейс будет называться le0.
Настройка сети каких-либо проблем не вызывает, вам нуж-
С последними двумя я, к сожалению, не работал, и, как но лишь указать имя хоста, IP-адрес, маску сети, адрес шлю-
следствие, дистрибутивов этих ОС у меня нет. Если при- за и IP DNS-сервера.
нять во внимание, что это коммерческие ОС, уже офици- Процесс инсталляции ОС занимает достаточно продол-
ально не поддерживаемые производителем, я не стал тра- жительное время, так на моей системе он занял чуть боль-
тить время на поиск дистрибутивов и для дальнейших экс- ше четырех часов. Да, к сожалению, уже на этом этапе мож-
периментов выбрал NetBSD. Во-первых, с ней я рабо- но заметить, что работает все медленнее, чем хотелось бы.
таю чаще, нежели с OpenBSD, во-вторых, поддержка архи- После того как процесс установки завершен, можно посмот-
тектуры pmax в OpenBSD была закончена в версии 2.9 (она реть, что у нас получилось:
вышла 1 июня 2001 года). А последняя версия NetBSD (на
момент написания – 1.6.2) отлично поддерживает pmax и mips64emul –X –M64 –D2 –d disk.img
по сей день.
Не буду подробно останавливаться на процессе уста- Все опции запуска нам уже знакомы, за исключением –
новки NetBSD, потому как есть замечательная статья Анд- M. Это опция служит для задания количества оперативной
рея Бешкова [1]. памяти, т.е. в данном случае я указал, что на эмулируемом
Для начала нам нужно создать виртуальный жесткий компьютере установлено 64 Мб памяти.
диск, на который мы будем устанавливать ОС. Система загружается порядка 5 минут. Я никогда не
работал на настоящей DEC Station 5000/200, но думаю, что
dd if=/dev/zero of=/disk.img bs=1 count=512 seek=1100000000 на ней загрузка системы ничуть не быстрее, потому как
тактовая частота процессора всего 25 МГц. После запуска,
После выполнения команды у нас получится файл раз- без дополнительной настройки мы можем запустить X-
мером 1050 Мб. Естественно, размер диска вы можете windows, выполнив команду startx. В качестве window
уменьшить или увеличить в зависимости от своих потреб- manager используется стандартный twm. Более подробно о
ностей. настройке NetBSD вы можете прочитать в моей статье [2].
Далее нам нужно определиться с методом установки: Исходя из документации к mips64emul, помимо вышеука-
NetBSD можно поставить непосредственно с boot CD-дис- занных ОС, можно запустить другие системы, созданные для
ка либо по сети, перед этим загрузившись с помощью ус- процессоров MIPS. Например, NetBSD/sgimips, NetBSD/arc,
тановочной дискеты. Я выбрал первый вариант. Берем с NetBSD/cobalt, NetBSD/playstation2 (www.netbsd.org), Linux/
ftp://ftp.netbsd.org/pub/NetBSD/iso/1.6.2/pmaxcd.iso. SGI (http://www.linux-mips.org). И некоторые другие малоиз-
Его размер около 75 Мб. Далее запускаем наш эмуля- вестные реализации Linux для MIPS-процессоров. Ради
тор, указав ему грузиться с диска: справедливости нужно заметить, что поддержка всего вы-
шеперечисленного пока находится в экспериментальном ре-
mips64emul –X –D2 –d disk.img –d bc:pmaxcd.iso –j netbsd.pmax жиме. Но судя по тому, как динамично развивается проект
(а ему меньше двух лет), можно предположить, что все эти
Давайте разберемся с опциями, которые мы указыва- ОС в скором времени можно будет запускать абсолютно
ем: спокойно.
! -X – использовать X11. А какая практическая польза от использования этого
! -D2 – эмулировать DEC Station 5000/200. эмулятора, спросите вы. Я лично использую его исключи-
! -d disk.img – указываем файл, который является нашим тельно из «спортивного» интереса. Но он окажется очень
виртуальным диском. полезным для программистов, пишущих приложения, на-
! -d bc:pmaxcd.iso – указываем загрузочный диск. целенные на MIPS-процессоры, но по какой-либо причине
! b – boot; не имеющие его под рукой. Также это отличный полигон
! c – CD-ROM. для изучения данной архитектуры в академических целях.
! -j – указываем имя ядра. Буду рад услышать описания ваших экспериментов, свя-
занных с этим эмулятором. Пишите!
Для тех, кто решил устанавливать систему по сети, со-
общаю порядок действий. Литература:
Сначала нужно списать образ загрузочной дискеты c 1. Бешков А. NetBSD: установка и настройка. – Журнал
ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-1.6.2/pmax/binary/ «Системный администратор», №9, август 2003г., также
kernel/netbsd-INSTALL.gz. Далее нужно распаковать полу- доступна электронная версия – http://onix.opennet.ru/
ченный архив: netbsd/netbsd.html.
2. Байрак А. Первые шаги в NetBSD. Часть 1. – Журнал
gunzip netbsd-INSTALL.gz «Системный администратор», №6, июнь 2004 г.

№11(24), ноябрь 2004 27


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

ЛЕЙСЯ ПЕСНЯ,
ИЛИ
СЕРВЕР ПОТОКОВОГО АУДИО
СВОИМИ РУКАМИ
СЕРГЕЙ ЯРЕМЧУК
Чтобы покончить с бардаком, нужно возглавить его само- ределимся с терминами. Любой сервер аудиопотоков, будь
му. Если пользователи по утрам, вместо того чтобы рабо- то Icecast или SHOUTcast, предназначен только для транс-
тать, выходят в Интернет в поисках новостей, что подчас ляции и работы с клиентами, которые подсоединяются, что-
съедает большую долю трафика, то почему бы не органи- бы послушать музыку. Сервер не занимается поиском ин-
зовать свою ленту новостей на корпоративном сайте, по- формации на жестком диске, кодированием и прочим, как
немногу пользователи привыкнут, и нагрузка на внешний это происходит с серверами, занимающимися трансляци-
канал уменьшится. Но новости и прочая текстовая инфор- ей видео. Необходимую информацию ему нужно сначала
мация еще ничего по сравнению с гигабайтами музыки, ви- переслать. Причем есть два варианта. Первый – использо-
део и прочего материала, который хотят протащить в сеть вать аналогичный сервер (впрочем, не все серверы на 100%
через узкий канал. Можно организовать фильтрацию, ус- совместимы между собой) в качестве источника информа-
тановить лимиты, все это иногда помогает, но гигабайты ции. Такой сервер называется master relay. Можно забрать
информации, при этом часто одинаковой, все равно соби- весь поток с сервера и перетранслировать его полностью
раются на жестких дисках компьютера, затрудняя архива- или забрать только часть точек монтирования. Последний
цию. вариант также может понадобиться при неполной совмес-
Сегодня разберемся как создать сервер, который будет тимости серверов. Например, если в качестве мастер-сер-
транслировать аудиопотоки. вера для icecast будет выступать SHOUTcast, то весь поток
В настоящее время существует достаточно большое ко- забрать не получится, необходимо указывать отдельные
личество приложений, позволяющих организовать такую точки монтирования. Да, что такое точка монтирования?
трансляцию. Написаны они на разных языках программи- Точка монтирования – это ресурс на сервере, который пред-
рования, работающих под управлением разных операци- ставляет один поток трансляции. Например, клиент хочет
онных систем, отличающихся лицензией, поддерживаемы- послушать музыку, запустив XMMS, нажимает <Ctrl + L>,
ми форматами и прочими характеристиками. Самый боль- вводит http://cal.icecast.net:8630/prog1.ogg (ссылка рабочая)
шой список, который мне удалось найти, размещен на стра- и слушает себе музыку. Параметр cal.icecast.net указывает
нице http://sound.condorow.net/netaudio.html. Наиболее из- на сервер, 8630 – на порт, используемый для трансляции
вестным решением является использование веб-сервера (по умолчанию на большинстве серверов – 8000), а
Apache, модуль и необходимую информацию о настройках prog1.ogg на источник информации, это и есть точка мон-
которого можно найти по адресам: http://www.tangent.org/ тирования. Причем если для mp3-потока указывать расши-
mod_mp3 и http://sander.vanzoest.com/apachecon/2001. Дру- рение не обязательно, то для ogg это требуется. Конечно
гим не менее популярным решением является SHOUTcast же и наш сервер также может быть источником информа-
от компании Nullsoft, подарившей миру WinAMP. Есть тяже- ции для других slave relay серверов. Такая схема принята
ловес jetCast Server (http://jetaudio.com/download/jetcast.html), по нескольким причинам, чтобы равномерно распределить
поддерживающий большое количество форматов, или про- клиентов, избежать дублирования информации на жестких
стой в настройке и совместимый практически со всеми по- дисках, не перегружать каналы, ведь проще забрать поток
добными серверами – AnaloxX SimpleServer:Shout (http:// и перетранслировать его самому, чем позволить всем
analox.com). Как видите, выбор есть. пользователям тащить это в одиночку. Другим источником
В статье мы познакомимся с наиболее популярным Open информации для сервера могут быть так называемые source
Source-решением – Icecast (http://www.icecast.org). На дан- client или broadcasting tools. Но о них позже.
ный момент Icecast поддерживает форматы Ogg Vorbis и
MP3, при особой необходимости любой другой формат мо- Установка Icecast
жет быть добавлен без проблем, работает под управлени- Для установки понадобятся: libxml2 (http://xmlsoft.org/
ем как Windows, так и UNIX-подобных систем, гибок и ле- downloads.html), libxslt (http://xmlsoft.org/XSLT/downloads.html),
гок в настройке, имеет толковую документацию, распрост- опционально curl (http://curl.haxx.se/download.html) и для ра-
раняется в исходных кодах. боты с OggVorbis библиотеки с http://www.vorbis.com. Но не
спешите скачивать, скорее всего, это уже есть в дистрибу-
Кто есть кто тиве. После скачиваем архив с icecast (670 Кб), распаковы-
Механизм трансляции аудиопотоков имеет свои особенно- ваем: ./configure, make, make install. После чего в каталоге
сти, поэтому сначала разберемся, как это работает, и оп- /usr/local/bin/ появится исполняемый файл icecast, конфи-

28
администрирование
гурационный файл icecast.xml в /usr/local/etc/, докумен- вера, трогать их не стоит, но проверьте наличие всех ката-
тация и файлы для администрирования будут положены логов на пути к файлам. Единственно интересным пара-
в /usr/local/share/icecast/. метром является «alias source», позволяющий создать не-
сколько разных точек монтирования из одной. И в security
Конфигурируем Icecast устанавливаются параметры, позволяющие повысить защи-
Единственный конфигурационный файл icecast.xml имеет щенность системы, так, chroot позволит выполняться Icecast
одинаковую структуру как для Linux, так и для Windows. Со- в ограниченной среде и в случае взлома злоумышленник
стоит из нескольких секций, в которых сгруппированы па- дальше указанного каталога не пойдет, а в changeowner
раметры, схожие по назначению. Значения всех парамет- нужно указать имя пользователя и группу, от имени кото-
ров описывать вряд ли целесообразно, т.к. название гово- рых будет работать процесс сервера.
рит само за себя, остановлюсь лишь на краткой характери-
стике и тех параметрах, на которые следует обратить вни- Настраиваем источник информации
мание. Первая секция файла называется limits, в ней опи- В принципе можно присоединиться к любому серверу транс-
сываются параметры подключения клиентов, таких как ляций, прописав параметры в секции relay, и больше ни о
максимальное их число, тайм-аут, после которого клиент чем не беспокоиться. Но будем разбираться, как организо-
отключается, если связь с ним прервалась, размер очере- вать трансляцию самому.
ди, и пр. Изменять их стоит только при большом количе- Список (далеко не полный) совместимых клиентов и про-
стве пользователей и плохих каналах (в перегруженных игрывателей для прослушивания потоков можно найти на
сетях). Следующая секция authentication содержит пароли странице http://www.icecast.org/3rdparty.php.
и пользователей, имеющих доступ к серверу для тех или Родным source-клиентом для Icecast является IceS (http:/
иных целей. В поле source-password прописывается неза- /www.icecast.org/ices.php), недавно появилась версия 2.0,
шифрованный пароль для source client, имя пользователя, работает только под UNIX (точнее, под Linux, FreeBSD,
используемое источниками «source», поле relay-password OpenBSD, Solaris) системами. Среди других, с которыми уда-
на данный момент не используется, поля admin-user и admin- лось немного поэкспериментировать, понравился Darkice
password содержат имя пользователя и пароль для адми- (http://darkice.sourceforge.net), работающий также только под
нистрирования сервера. UNIX, но умеющий поставлять информацию для Iceсast вер-
Далее описываются параметры подключения источни- сий 1 и 2 и SHOUTcast или iceplay (http://icecast.linuxpower.org),
ков информации (source client). Так, если на компьютере одна работающий только с mp2-файлами. Для пользователей
сетевая плата, то для работы достаточно в параметре Windows пригодится SAM2 (http://www.spacialaudio.com) или
hostname указать имя компьютера (или localhost, если ис- ezstream (http://www.icecast.org/ezstream.php), который рабо-
точник находится на том же компьютере), в ином случае тает также и в UNIX-системах. Есть утилита, написанная и
директивой bind-address указываем на сетевой интерфейс, для Mac OSX – Nicecast (http://www.rogueamoeba.com/nicecast).
параметр port при этом укажет на IP-порт (по умолчанию Как видите, выбирать есть из чего.
8000), который будет открыт для подключения источников. Кстати, источник информации не обязательно должен
Обратите внимание, что возможно задание нескольких пор- находиться на одном и том же компьютере. Для примера
тов директивой listen-socket. Директивами master-server, займемся настройкой IceS. На данный момент имеются две
master-server-port, master-update-interval и master-password версии IceS. Версия 0.3, развитие которой приостановле-
устанавливаются параметры master relay сервера, с кото- но, предназначена для создания mp3-потоков, и версия 2.0,
рого будет получаться весь аудиопоток, транслируемый сер- умеющая транслировать только OggVorbis, по причине ма-
вером, если нет такого сервера, то оставляем как есть, т.е. лого спроса поддержка mp3 была убрана. Если есть необ-
закомментированными. Если нет необходимости в получе- ходимость работы как с mp3, так и OggVorbis, то возможно
нии всего аудиопотока с мастер-сервера для использова- использование этих двух программ параллельно.
ния отдельных точек монтирования, используется секция Другой вариант, взять ezstream, поддерживающий два
relay, в которой параметры server и port указывают на мас- формата (как понимаете, один источник – одна точка мон-
тер-сервер, mount и local-mount указывают соответственно тирования) и к тому же очень простой в настройках. Для
на экспортируемую и локальную точку монтирования. При установки, помимо вышеперечисленных библиотек, пона-
работе с сервером SHOUTcast, для того чтобы передавать и добится libshout 2.0, ссылку на которую найдете на сайте
метаданные в опции relay-shoutcast-metadata установите 1. IceCast. Далее устанавливаем библиотеку и IceS обычным
В секциях mount, устанавливаются специфические парамет- образом, никаких особенностей здесь нет. Источником дан-
ры для точки монтирования, указанной в mount-name. Эти- ных для IceS может служить компакт-диск, файлы на жест-
ми параметрами могут быть имя пользователя и пароль ком диске и любое устройство, с которого можно снять ин-
(username и password), которым позволено соединяться, формацию.
максимальное количество пользователей (max-listeners), Здесь стоит отметить, что почти все source clients по-
необязательный параметр dump-file устанавливает файл, зволяют взять информацию со своего стандартного входа,
куда будет записываться поток, а в случае если с точкой обработать и выдать на стримсервер. Для настройки пара-
монтирования что-то произойдет, то клиенты могут быть метров IceS используется файл в формате XML, образцы
автоматически переброшены на другую точку, указанную которого после установки вы найдете в /usr/local/share/ices.
в параметре fallback-mount. В секциях paths и logging ука- Здесь их два: ices-live.xml содержит базовые настройки для
зываются файлы и каталоги, необходимые для работы сер- Live-трансляции (микрофон, СD-ROM и пр.), а в ices-

№11(24), ноябрь 2004 29


администрирование
playlist.xml вы найдете шаблон, используемый при транс- <param name="rate">44100</param>
ляции из файлов, записанных в плейлист. Отличаются они <param name="channels">2</param>
<param name="device">/dev/dsp</param>
только разделом input, в котором описывается источник ин- <param name="metadata">1</param>
формации. Все описывать тоже не буду, остановлюсь лишь <param name="metadatafilename">test</param>
</input>
на параметрах, требующих пояснения.
Для запуска в качестве демона устанавливаем back Далее следует большая секция instance, описывающая
ground в 1. подключение к стримсерверу. При этом возможно задание
нескольких параметров, что позволит отсылать информа-
<background>1</background> цию нескольким таким серверам или создавать несколько
точек монтирования с разными параметрами на одном сер-
Далее описываются параметры вывода логов, при пер- вере.
воначальной отладке установите consolelog в 1, при этом
все ошибки будут выводиться на консоль. <instance>

<consolelog>1</consolelog> Ниже определяем имя узла, порт и пароль, последний


должен совпадать со значением в секциях source-password
Секция stream описывает передаваемый поток. файла icecast.xml.

<stream> <hostname> Çäåñü ïèøåì àäðåñ èëè èìÿ, êóäà îòïðàâëÿåì


<metadata> ïîòîê </hostname>
<name> Çäåñü âïèøèòå íàçâàíèå ïîòîêà, îíî áóäåò <port>8000</port>
âèäíî â ïðîèãðûâàòåëå </name> <password>passwd</password>
<genre> Æàíð ìåëîäèé </genre> <mount>/example.ogg</mount>
<description> Êðàòêîå îïèñàíèå ïîòîêà </description>
</metadata> А здесь точка монтирования, которая будет видна
пользователям, желающим послушать музыку.
Модуль input задает параметры, откуда брать инфор- Ниже параметры повторной попытки, если не удается
мацию. сразу подключиться к серверу.
Ниже пример для плейлиста, обратите внимание: режим
задается тегом module – playlist. <reconnectdelay>2</reconnectdelay>
<reconnectattempts>5</reconnectattempts>
<input> Параметр буферизации потока (лучше не трогать).
<module>playlist</module>
<param name="type">basic</param>
<maxqueuelength>80</maxqueuelength>
Тип плейлиста может быть basic (простой текстовый
ASCII-файл, содержащий список Ogg Vorbis) или script, при Параметры перекодирования, которые могут понадо-
этом указанная программа генерирует его динамически. биться, например, для уменьшения нагрузки на сеть, долж-
ны соответствовать принятым значениям, входным данным
<param name="file">playlist.txt</param> и частотам дискретизации, иначе можно попортить каче-
ство материала.
Это для статического плейлиста, при динамической ге-
нерации списка песен используется конструкция: <encode>
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<param name='program'></param> <channels>2</channels>
</encode>
</instance>
Далее следуют параметры random (перемешивание
списка), restart-after-reread (перезапускает программу для Вот и все. Теперь собираем файлы в плейлист.
пересчитывания списка) и once (при 1 проигрывает список
только один раз, и работа заканчивается). #find /home/sound -name *.ogg > ↵
/usr/local/share/ices/playlist.txt
</input> В результате файл должен состоять из списка вида:

Для считывания входящей информации, например, с /home/sound/Song.ogg


микрофона, или других устройств применяется другая кон-
струкция. Теперь запускаем IceCast.
# /usr/local/bin/icecast -b -c /usr/local/etc/icecast.xml
<input> Changed groupid to 65534.
<module>oss</module>
Changed userid to 65534.

module может быть также alsa (device обычно plughw:0,0), И подаем информацию.
stdinpcm (при считывании со стандартного входа, секции
device не надо) и sun при работе Sun Solaris DSP. # ices /usr/share/ices/ices-playlist.xml

30
администрирование
Теперь, набрав в строке любимого проигрывателя: то может выясниться, что такого каталога не существует,
создайте его командой:
http://èìÿ_óçëà:8000/example.ogg
mkdir /var/log/ices
должны услышать музыку. На эту роль подходят как XMMS
и WinAMP, так и консольные ogg123 и mpg123. Если все равно ничего не получается, то загляните в
И пару слов об ошибках, с которыми удалось столкнуть- лог-файлы, в них выводится достаточно информации, что-
ся. Например, при запуске IceCast из-под root программа бы разобраться с проблемой. Например, в одном из доку-
выдала такую информацию. ментов я нашел информацию о том, что вторая версия
# /usr/local/bin/icecast -c /usr/local/etc/icecast.xml
IceCast все-таки работает с mp3-файлами. Не работает. А
WARNING: You should not run icecast2 as root в логах это выглядело так.
Use the changeowner directive in the config file
[2004-06-21 14:48:19] INFO playlist-builtin/playlist_read
Все просто: в целях безопасности под root сервер не Currently playing "/usr/share/ices/music/alisa/lodka.ìð3"
запускается, а директива changeowner в конфигурацион- [2004-06-21 14:48:19] WARN playlist-builtin/playlist_read
Corrupt or missing data in file (usr/share/ices/music/alisa/lodka.ìð3)
ном файле по умолчанию закомментирована. Исправьте,
только проследите, чтобы такой пользователь и группа в А при загрузке OggVorbis-файла все нормально.
системе были.
[2004-06-21 14:49:11] INFO playlist-builtin/playlist_read
Далее возможны ошибки из-за невнимательности, свя- Currently playing "/usr/share/ices/rammstein/Sonne.ogg"
занные с отсутствием каталогов, прописанных в конфигу- [2004-06-21 14:49:11] INFO stream/ices_instance_stream
рационных файлах, например, процесс может создать лог- Connected to server: 127.0.0.1:8000/example.ogg
[2004-06-21 14:49:12] DBUG reencode/reencode_page
файл, но попутных каталогов создать не может. Например, Reinitialising reencoder for new logical stream
при запуске IceS выскочила такая ошибка: [2004-06-21 14:49:12] INFO encode/encode_initialise
Encoder initialising in VBR mode: 2 channels, 44100 Hz, nominal 64000
unable to open log /var/log/ices/ices.log
Вот и все. Как видите, создать свой сервер трансляции
Если проверить командой: аудиопотоков не так уже и сложно. При внимательности на
все про все у вас уйдет от силы час-два.
ls /var/log/ices/ Успехов.

№11(24), ноябрь 2004 31


администрирование конкурсная статья

ТАНЦУЕМ САМБУ

РОМАН ГРЕБЕННИКОВ
Любая операционная система имеет сильные и слабые сто- Но не окнами едиными жив этот мир. Существует боль-
роны. В чем-то она получается удачнее других, в чем-то – шое количество задач, работу которых по тем или иным
нет, поэтому никогда нельзя однозначно расставить раз- причинам не доверяют этим операционным системам. По-
ные ОС по рангам. На таком «пьедестале почета» участни- рой просто нет необходимости или возможности заводить
ки могут казаться идеальным решением для одной сферы какой-нибудь www- или ftp-сервер на мощном в плане же-
применения, но в других областях на них вряд ли можно леза компьютере, так как последние версии Windows весь-
смотреть серьезно. ма требовательно относятся к аппаратной конфигурации
Среди людей, вращающихся в IT-сфере, уже много лет своего места жительства. Появление сервера на базе лю-
идет религиозная война между сторонниками UNIX-подоб- бой UNIX-подобной операционной системы в сети с доме-
ных и Windows-систем. Это является неотъемлемой чертой ном может пошатнуть всю идею самой централизации, ведь
человеческой натуры, которая выражается в бесконечном UNIX – это другой мир, в котором все работает иначе, и к
поиске идеала. Если же этот идеал вдруг находится, то зак- любой проблеме уже неприменимы те решения, которые
рываются глаза на все его отрицательные качества – ведь существовали раньше.
совершенству не положено их иметь. В случае, если с появившейся в сети «белой вороной»
Несомненно, рациональнее всего беспристрастно смот- общается только системный администратор и информация,
реть на вещи и не бросаться в гущу сражений на вечную с которой работают сервисы на этой машине, не требует
тему. Ведь если есть возможность использовать преиму- синхронизации с данными, находящимися в домене, то осо-
щества разных операционных систем в рамках одной сети, бенно изощренная настройка серверу не нужна. Здесь ра-
к чему нужны все эти религиозные предрассудки? ботает правило, гласящее, что чем проще система, тем
Главным и основным качеством любого системного ад- меньше вероятность выхода ее из строя.
министратора по всеобщему признанию является чувство Но если вдруг неожиданно потребуется открыть доступ
лени – стоит один раз правильно настроить систему, а даль- на данный сервер доменным пользователям, то сразу же
ше останется только пить чай, наблюдая за тем, как все возникнет масса проблем, которые быстро решить не уда-
работает без постороннего вмешательства. Шутка шуткой, ется:
но удобство работы очень часто влияет на результат в луч- ! Заводить для каждого нового пользователя отдельную
шую сторону. Как показывает практика, в первую очередь учетную запись неудобно.
оно зависит от размера подконтрольной сети, причем чем ! Среднестатистический пользователь не в состоянии за-
больше компьютерная сеть, тем грамотнее следует проду- помнить больше одного пароля.
мывать ее внутреннее устройство в плане удобства после- ! У сервисов на UNIX-машине могут возникать проблемы
дующего администрирования. В случае маленькой комна- с доступом к данным, находящимся под управлением
ты с дюжиной компьютеров при возникновении какой-ни- доменных политик.
будь проблемы вполне реально подойти и лично с ней ра- ! И еще какая-нибудь проблема, возникшая именно на ва-
зобраться или поменять требуемую настройку вручную на шей системе, причем, скорее всего, не одна.
каждой машине, если есть такая необходимость. Но если
компьютеров в сети далеко за сотню, а пользователей и Выход из сложившейся ситуации один – необходимо
того больше, то всех четырех рук системного администра- интегрировать UNIX-сервер в Windows-домен, чтобы он был
тора не хватит, с какой бы скоростью он не размахивал ими. способен проводить аутентификацию пользователей на кон-
В этом случае необходима мощная централизованная сис- троллере домена. При должной настройке сразу исчезнут
тема управления и контроля за работой сети. все проблемы, возникавшие раньше с синхронизацией ин-
Стандартным решением в случае большого количества формации о пользователях, – теперь данные о них будут
пользователей и рабочих станций является объединение едины и для Windows-систем, и для UNIX.
всех их в единый домен. В данной статье я старался не привязываться к какой-
Для этого, если верить статистике, чаще всего исполь- то конкретной реализации UNIX и попытался дать доста-
зуются программные решения компании Microsoft. Понятие точно обобщенные советы в плане настроек. Дело в том,
«домен» в последнее время стало неразрывно связано с что все перечисленные программные пакеты не являются
сетями под управлением Windows. большой редкостью, официально поддерживаются на боль-

32
администрирование
шом количестве *nix-систем и конфигурируются одинаково
на разных платформах.
Однако, как бы я ни старался сделать статью универсаль-
ной, хочу сразу заметить, что существовала базовая плат-
форма, на которой проводилось все тестирование перед
пересадкой на боевую конфигурацию: Gentoo Linux 2004.2, ! KDC расшифровывает этот блок известным ему клю-
и вся статья основана именно на ней. чом клиента и сравнивает время, извлеченное из аутен-
Чтобы убедиться в том, что на вашей системе предло- тификатора, с локальным. Если разница между ними
женное решение будет работать, требуется удостовериться, составляет менее двух минут, то он может быть уверен
что она поддерживает работу со следующими пакетами: в том, что клиент знает секретный ключ.
! Samba 3; ! KDC отправляет клиенту точно такой же ответ с зашиф-
! Kerberos 5; рованным блоком – своим именем и временем из пер-
! Библиотеки PAM. вого запроса. Первое поле здесь необходимо для того,
чтобы избежать возможности простого копирования зло-
Если эти программные пакеты работают, то с большой умышленником аутентификатора из запроса клиента.
вероятностью можно сказать, что и предложенная связка ! Клиент дешифрует полученный ответ, и если время из
заработает, все зависит только от вас. него совпадает с отправленным, то и клиент, и KDC мо-
гут быть уверены в личности друг друга.
Алгоритм Kerberos
Информация, которую UNIX-машина получает от контрол- Далее, если клиент хочет обратиться к серверу:
лера домена, не должна ходить по сети в открытом виде, ! Клиент отправляет запрос на подключение к серверу.
так как она представляет большую ценность как для полу-
чателя, так и для возможных злоумышленников, поэтому
для поддержания должного уровня безопасности системы
в любом случае нужно использовать какую-либо криптог-
рафическую схему. В среде Windows ею является Kerberos5.
В реальной жизни два человека могут быть уверены в ! KDC отправляет ему в ответ сеансовый ключ (ключ, ко-
личности друг друга при наличии паспортов у обоих. В дан- торый будет использоваться в дальнейшем для иденти-
ной ситуации человек доверяет не собеседнику, а паспорт- фикации клиента) и блок данных под названием сеан-
ному столу, выдавшему документ. Это позволяет ему удос- совый мандат (session ticket), в составе которого есть
товериться в том, что он говорит именно с тем, кем являет- тот же сеансовый ключ для сервера и информация о
ся собеседник на самом деле. В Kerberos используется та- клиенте. Мандат шифруется секретным ключом серве-
кая же схема: между сервером и клиентом есть посредник ра, а все сообщение – секретным ключом клиента.
под названием Центр распределения ключей (KDC, Key ! Клиент извлекает из ответа сеансовый мандат и свою
Distribution Center), которому доверяют оба компьютера. копию сеансового ключа. При обращении к серверу он
KDC также известны их секретные ключи. Криптографичес- отправляет ему сеансовый мандат, по-прежнему зашиф-
кий алгоритм, в котором они используются, является сим- рованный секретным ключом сервера, и свой аутенти-
метричным, т.е. один и тот же ключ может быть использо- фикатор, зашифрованный сеансовым ключом.
ван как для кодирования, так и для декодирования сооб- ! Сервер, получив сообщение клиента, извлекает из ман-
щения. дата сеансовый ключ, которым расшифровывает аутен-
Для начала KDC и клиент должны удостовериться в лич- тификатор клиента. Если время, извлеченное из него,
ности друг друга: соответствует текущему, то сервер может быть уверен
! Клиент шлет KDC сообщение, в котором указывает свое в личности клиента.
имя открытым текстом и зашифрованный секретным
ключом блок данных (аутентификатор) с двумя полями: Для того чтобы клиент постоянно не использовал свой
именем и текущим временем. секретный ключ для связи с Центром распределения клю-

№11(24), ноябрь 2004 33


администрирование
чей, KDC выдает ему мандат на выдачу мандатов (ticket Тогда в переменной окружения HOSTNAME UNIX-маши-
granting ticket, TGT): ны должна находиться строчка «nix». В моем случае это
! Клиент посылает запрос KDC. потребовало исправления файла /etc/hostname.
! KDC отвечает специальным мандатом на самого себя, Не забудьте проверить, видят ли машины DNS-имена
в составе которого, как и в случае обычного сеансового друг друга и нет ли проблем с firewall.
мандата, находятся две копии сеансового ключа, одна Теперь можно приступить к созданию конфигурацион-
из них зашифрована секретным ключом клиента, вто- ного файла для библиотек kerberos, находящегося по ад-
рая – KDC. ресу /etc/krb5.conf. Сам файл состоит из пяти секций, каж-
! Клиент расшифровывает сеансовый ключ, после чего дая из которых может включать в себя либо имена и значе-
для связи между ним и KDC используется именно он, а ния отдельных переменных, например:
секретный ключ клиента удаляется из памяти.
[section]
key = value
Теперь система связи между клиентом и сервером выг- boolean1 = true
лядит так: boolean2 = false
! Клиент извлекает из TGT сеансовый ключ для связи с
KDC и отправляет запрос на сеансовый мандат для свя- либо информацию, объединенную в структуру с определен-
зи с сервером и зашифрованные им TGT с собствен- ным именем:
ным аутентификатором.
! Сервер в случае успеха отвечает требуемым сеансовым [section]
struct = {
мандатом, сеансовый ключ из которого будет впослед- key1 = value1
ствии использован клиентом для связи с сервером. key2 = value2
...
}
Как видите, для нормальной работы этой системы аутен-
тификации обязательно требуется синхронизация време-
ни на всех ее элементах. В журнале «Системный админис-
тратор» №4 за 2004 год была подробная статья Михаила
Платова о настройке сервера времени «NTP – атомные часы
на каждом столе».

Настройка Kerberos
Для UNIX-систем существует две реализации kerberos5,
совместимых со стандартом: Heimdal и MIT. В настройке
они отличаются не очень сильно, но второй гораздо более
популярен, поэтому будем рассматривать именно его. Уч-
тите, что на старых версиях MIT Kerberos (меньших или рав-
ных 1.3.1) возникали проблемы с Windows Kerberos Service
на Win2003, поэтому рекомендую использовать последнюю
доступную на данный момент версию. Пример файла:
В качестве открыто указанного имени клиента в описы-
ваемой связке Kerberos+Samba+AD используется доменное [logging]
default = FILE:/var/log/krb5libs.log
имя машины. Но зачастую бывает так, что ее реальное DNS- kdc = FILE:/var/log/krb5kdc.log
имя не соответствует тому, кем она себя считает. Предпо- admin_server = FILE:/var/log/kadmind.log
ложим, что nslookup говорит нам следующее: [libdefaults]
default_realm = DOMAIN.RU
C:\>nslookup 192.168.1.14 dns_lookup_kdc = false
Server: dns.domain.ru dns_lookup_realm = false
Address: 192.168.1.10
[realms]
Name: nix.domain.ru DOMAIN.RU = {
Address: 192.168.1.14 kdc = controller.domain.ru

34
администрирование
admin_server = controller.domain.ru где:
default_domain = domain.ru
} ! host/NIX$@DOMAIN.RU – строка, обозначающая имя ма-
шины в терминологии kerberos. Знак доллара является
[domain_realm]
.domain.ru = DOMAIN.RU признаком машинного аккаунта в Active Directory, и его
domain.ru = DOMAIN.RU забывать не следует. DOMAIN.RU – домен, на контрол-
domain = DOMAIN.RU
DOMAIN = DOMAIN.RU лере которого вы сейчас работаете;
! unixuser – имя создаваемой учетной записи;
Следующим шагом создадим пользователя в Active ! SuperPass667 – соответственно его пароль;
Directory, имя которого UNIX-машина будет использовать ! nix.keytab – имя файла, в который производится экспорт.
для Kerberos-аутентификации себя. Для этого на контрол-
лере домена в меню «Пуск» откройте «Administrative Tools → Теперь требуется переместить полученный файл на
Active directory Users and Computers», выберите нужный кон- UNIX-машину любым возможным способом. Это можно сде-
тейнер и создайте там пользователя. В качестве парамет- лать через ftp/sftp или забросить через веб-сервер, как вам
ров можно запретить ему менять пароль (галочка «User больше нравится. В консоли UNIX запустите программу ktutil
cannot change password») и убрать необходимость его ме- и в ее командной строке импортируйте keytab-файл:
нять со временем (галочка «Password never expires»). До-
# ktutil
пустим, что вы создали пользователя с именем unixuser и > rkt /root/nix.keytab
паролем SuperPass667. > list
slot KVNO Principal
---- ---- -------------------------------------
1 3 host/NIX$@DOMAIN.RU
> wkt /etc/krb5.keytab
> quit

где /root/nix.keytab – путь к импортируемому файлу, а /etc/


krb5.keytab – файл со всеми секретными ключами для дан-
ного клиента.
После всех этих длительных манипуляций можно про-
верить работу клиентской части kerberos, выполнив следу-
ющую команду:

# kinit DomainUser

где DomainUser – имя любого доменного пользователя. Если


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

Настройка samba
При установке этого программного продукта проблем воз-
никнуть не должно, поэтому конкретных указаний по уста-
новке здесь дано не будет, и вы можете руководствоваться
своими собственными вкусами: собирать из исходников
вручную, использовать готовые бинарные пакеты или за-
пускать специализированные программы обновления ваше-
го дистрибутива.
После установки следует создать конфигурационный
файл для самбы по адресу /etc/samba/smb.conf. Его струк-
тура содержит два блока:
! описание глобальных настроек сервера;
! параметры для отдельных shares.

Далее создаем файл, в который экспортируем секрет- Сами настройки рассмотрим на примере:
ный ключ: для этого в консоли cmd.exe на контроллере до-
мена требуется выполнить команду: # Èìÿ äîìåíà, ñ êîòîðûì òðåáóåòñÿ ðàáîòàòü
workgroup = DOMAIN
C:\>ktpass -princ host/NIX$@DOMAIN.RU -mapuser unixuser ↵ # Äîìåííîå èìÿ ìàøèíû, êîòîðîå äîëæíî ñîâïàäàòü ñ dns-èìåíåì
-pass SuperPass667 -out nix.keytab # è ïåðåìåííîé ñðåäû HOSTNAME
netbios name = NIX

№11(24), ноябрь 2004 35


администрирование
# Îïèñàíèå ñåðâåðà, âèäèìîå â «Ñåòåâîì îêðóæåíèè» # Âëàäåëåö ôàéëà ïðè çàïèñè â ïàïêó
server string = Unix Server force user = root
# Ãðóïïà, íàçíà÷àåìàÿ ôàéëó ïðè çàïèñè
# Ðàçäåëèòåëü íàçâàíèÿ äîìåíà è ó÷åòíîé çàïèñè.  Windows force group = apache
# ýòî çíàê «\», íî â ýòîì ñëó÷àå îí ìîæåò âûçâàòü ïðîáëåìû
# êàê ñèìâîë íà÷àëà escape-ïîñëåäîâàòåëüíîñòè, ïîýòîìó # Ìîæíî ëè çàéòè íà ïàïêó áåç ïàðîëÿ
# åãî ïîòðåáóåòñÿ çàìåíèòü. Ïî óìîë÷àíèþ èäåò çíàê «+», public = no
# íî «/» ïðèâû÷íåå
winbind separator = / # Ìîæíî ëè â íåå ïèñàòü
writable = yes
# Èñïîëüçîâàòü äîìåí ïî óìîë÷àíèþ. Âíåøíå áóäåò ïðîÿâëÿòüñÿ
# îòñóòñòâèåì äîìåííîãî ïðåôèêñà ïåðåä ó÷åòíîé çàïèñüþ # ßâëÿåòñÿ ëè ïàïêà ïðèíòåðîì
winbind use default domain = yes printable = no
# Îáëàñòü èäåíòèôèêàòîðîâ ïîëüçîâàòåëåé, íà êîòîðóþ áóäóò # Ìàñêà ñîçäàâàåìûõ ôàéëîâ
# îòîáðàæàòüñÿ äîìåííûå àêêàóíòû create mask = 0640
idmap uid = 7000-10000
# Ïîëüçîâàòåëè, èìåþùèå ïîëíûé êîíòðîëü íàä ïàïêîé
# Îáëàñòü èäåíòèôèêàòîðîâ ãðóïï, íà êîòîðóþ áóäóò admin users = @"DOMAIN/Domain Admins"
# îòîáðàæàòüñÿ äîìåííûå ãðóïïû
idmap gid = 7000-10000
На следующем шаге потребуется проверить, не оста-
# Àâòîìàòè÷åñêè íóìåðîâàòü ïîëüçîâàòåëåé è ãðóïïû лось ли в Active Directory записей для подопытной машины.
winbind enum users = yes
winbind enum groups = yes Для этого просмотрите ветку Computers.
# Øàáëîí äîìàøíåãî êàòàëîãà äëÿ äîìåííûõ ïîëüçîâàòåëåé.
После этого включаем UNIX-машину в домен, исполнив
# Âïîñëåäñòâèè áóäåò ñîçäàâàòüñÿ àâòîìàòè÷åñêè на ней команду:
template homedir = /home/DOMAIN/%U

# Øàáëîí êîìàíäíîãî èíòåðïðåòàòîðà äëÿ äîìåííûõ ïîëüçîâàòåëåé # net ads join -U DomainAdministrator
template shell = /bin/bash

# Ðåæèì áåçîïàñíîñòè. Â ðåæèìå ads äëÿ àóòåíòèôèêàöèè Если в результате исполнения этой команды вы увиди-
# samba èñïîëüçóåò èñêëþ÷èòåëüíî Active Directory, те строчку «Joined domain DOMAIN.», то появился повод
# íå îáðàùàÿ âíèìàíèÿ íà ëîêàëüíûå àêêàóíòû
security = ads открывать шампанское. Но в большинстве случаев на этом
# Øèôðîâàòü ëè ïàðîëè. Ïî óìîë÷àíèþ êîíòðîëëåð äîìåíà
шаге всплывают все ошибки, допущенные на предыдущих
# íå ðàáîòàåò ñ îòêðûòûìè ïàðîëÿìè. этапах.
encrypt passwords = yes Вот несколько советов:
# Ðåàëì Kerberos, èñïîëüçóåìûé äëÿ àóòåíòèôèêàöèè ! Проверьте, нет ли сильного расхождения во времени у
realm = DOMAIN.RU UNIX-машины и контроллера домена.
# Ïàðàìåòð, âêëþ÷àþùèé ïîääåðæêó âûáîðà àëãîðèòìîâ øèôðàöèè ! Правильно ли был создан keytab-файл (тот ли пароль,
# â ïðîöåññå ðàáîòû. Íåîáõîäèìîñòü èñïîëüçîâàíèÿ çàâèñèò совпадает ли имя машины, нет ли различий между зна-
# îò íàñòðîåê êîíòðîëëåðà äîìåíà. Íà Win2003 âêëþ÷åí
# ïî óìîë÷àíèþ чением переменной HOSTNAME и доменным именем).
client use spnego = yes ! Нет ли в Active Directory уже существующего машинно-
# Àäðåñ êîíòðîëëåðà äîìåíà го аккаунта для подопытной UNIX-машины.
password server = controller.domain.ru ! Что остается в файлах протоколов самбы и системных
# Øàáëîí èìåí ôàéëîâ ëîãîâ, ãäå %m – èìÿ ìàøèíû логах контроллера домена.
log file = /var/log/samba3/%m.log
# Óðîâåíü ïîäðîáíîñòè ëîãîâ. Íà ïåðâûõ ïîðàõ æåëàòåëüíî
# ïîäíÿòü ýòî çíà÷åíèå äî 4, ÷òî ïîçâîëèò äîñòàòî÷íî òî÷íî
# äèàãíîñòèðîâàòü ïðîáëåìó.
log level = 2

# Ìàêñèìàëüíûé ðàçìåð ëîã-ôàéëîâ. 0 – íåîãðàíè÷åíî.


max log size = 0

# Ñïèñîê ñåòåâûõ èíòåðôåéñîâ, ñ êîòîðûìè áóäåò ðàáîòàòü


# äåìîí
interfaces = 192.168.1.14
# Íå òðîãàòü îñòàëüíûå ñåòåâûå èíòåðôåéñû
bind interfaces only = yes
# Ïðèìåð ïàïêè
# Íàçâàíèå
[html]
# Ñïèñîê ïîëüçîâàòåëåé, ó êîòîðûõ åñòü ïðàâî èñïîëüçîâàòü
# ýòó ïàïêó.  äàííîì ñëó÷àå ýòî âñå äîìåííûå ïîëüçîâàòåëè.
# Çíàê @ îáîçíà÷àåò ãðóïïó.
valid users = @"DOMAIN/Domain Users"
# Ïóòü, íà êîòîðûé ññûëàåòñÿ ñàìà ïàïêà
path = /var/www/htdocs

# ×óâñòâèòåëüíà ëè ïàïêà ê ðåãèñòðó áóêâ


case sensitive = no

# Áóäåò ëè âèäíà ïàïêà â «Ñåòåâîì îêðóæåíèè»


Если все прошло успешно, то самое время осуществить
browseable = yes первый запуск самбы. Как показывает практика, лучше для

36
администрирование
этого использовать стартовые скрипты системы в /etc/init.d, работы с доменными аккаунтами, следует привести этот
чтобы не изобретать велосипед при загрузке. файл к следующему виду:
Для корректной работы всей системы должны старто-
вать следующие демоны: passwd: files winbind
group: files winbind
! smbd shadow: files
! nmbd
! winbindd Теперь пора проверить работоспособность всей настра-
иваемой системы – умеет ли подопытная машина полно-
Настройка запуска именно трех демонов вместо обыч- ценно работать с доменными аккаунтами (перед выполне-
ных двух (smbd и nmbd) зависит от дистрибутива, в Gentoo нием следующей команды не помешает на всякий случай
для этого следует отредактировать файл /etc/conf.d/samba, перезапустить samba):
руководствуясь находящимися в нем комментариями. Так-
же можно включить режим отладки, добавив в опции за- # getent passwd
пуска всех трех демонов ключ -D с параметром, который
определяет количество отладочной информации, записы- Если на экране консоли, как в «Матрице», замелькала
ваемой в логи. Больше 4 его делать не стоит, так как в разная информация, по структуре своей напоминающая
противном случае логи станут очень быстро разрастать- файл /etc/passwd, причем среди записей попадаются до-
ся. В случае, если что-то не запустилось, то читаем лог менные аккаунты, то проверка прошла успешно, с этих пор
снова, исправляем выявленные ошибки, и запускаем – компьютер не знает различий между доменными и локаль-
этот цикл придется повторять до тех пор, пока все не прой- ными пользователями. Но есть одно небольшое но.
дет успешно. Дело в том, что на многих UNIX-системах для аутенти-
Теперь можно проверить, нормально ли работают рас- фикации пользователей и назначения им идентификаторов
шаренные папки, зайдя по адресу file://nix.domain.ru с лю- используется библиотека PAM (Pluggable Authentication
бой Windows-машины, являющейся членом домена. Modules). По умолчанию она настроена так, что проходить
аутентификацию имеют право только локальные пользова-
Аутентификация в системе тели, да и то не все и не везде. Как видно из названия,
На данный момент с аутентификацией в Active Directory библиотека построена по модульному принципу, причем за
полноценно работает только самба, остальные сервисы на каждым сервисом, требующим аутентификации, можно зак-
подопытной UNIX-машине о ней не ведают. реплять свой список используемых модулей.
Проблема управления большим количеством аккаунтов Настройка PAM специфична для каждого дистрибутива
возникла значительно раньше появления AD, да и, пожа- Linux, не говоря уже о BSD и прочих реализациях UNIX, так
луй, появления Windows-систем в целом. Во времена рас- что предлагать готовое решение для чего-то одного было
света UNIX возникла идея централизованного хранения бы несправедливо. По этой причине рассмотрим основы
информации о пользователях, чтобы избежать ее дубли- конфигурации, а конкретное их применение каждый най-
рования на разных компьютерах. Как решение возникшей дет для себя сам.
проблемы была создана система NIS/NIS+ – Network PAM – центр всей безопасности системы. Неграмотная
Information Service, позволявшая компьютеру-клиенту про- его настройка может привести к достаточно разнообраз-
водить аутентификацию пользователей, с помощью инфор- ным последствиям: как к тому, что в систему сможет войти
мации, хранящейся на центральном сервере. В Linux сама кто угодно, так и к тому, что в нее больше никто никогда не
реализация NIS/NIS+ уходит глубоко в системные библио- войдет, даже администратор. Для последнего случая стоит
теки glibc, поэтому для приложений, работающих на клиен- постоянно держать несколько открытых незадействованных
те, нет никакой разницы, с каким пользователем они име- терминалов, при помощи которых в любой момент можно
ют дело: локальным или удаленным. К тому же реализация будет исправить допущенную фатальную ошибку. Вероят-
была сделана по модульному принципу, что много лет спу- ность этого невелика, но все же такая предосторожность
стя и было использовано разработчиками samba. не помешает.
В дистрибутиве самбы есть модуль libnss_winbind.so, Все параметры системы PAM указаны в нескольких
при помощи которого подопытная машина научится пре- файлах, находящихся в каталоге /etc/pam.d, так что перед
образовывать абстрактные идентификаторы пользовате- внесением каких-либо изменений в конфигурацию стоит
лей, раздаваемые сервером winbindd, в привычные имена. сделать ее резервную копию. Название файла – это имя
Подключить этот модуль можно в файле /etc/nsswitch.conf. программы, к которой следует применять находящиеся в
Интересующий нас фрагмент выглядит следующим обра- нем настройки.
зом: Конфигурация PAM организована в виде стека, то есть
модули работают цепочкой, и если один из модулей, имею-
passwd: files щий влияние на весь ход процесса аутентификации, решил
group: files
shadow: files закрыть или предоставить доступ в систему, то модули,
следующие за ним, останутся незадействованными. Для
Каждая строчка файла отвечает за элемент системы упрощения настройки существует способ заполнять стек
аутентификации – разрешение числовых идентификаторов модулей из соседних файлов конфигурации. Обычно это
в привычные имена. Для того чтобы добавить возможность используется для указания глобальных параметров аутен-

№11(24), ноябрь 2004 37


администрирование
тификации, единых для всех сервисов, а отдельные файлы auth sufficient /lib/security/pam_unix.so ↵
лишь по необходимости дополняют существующие глобаль- likeauth nullok
ные настройки. # Åñëè àóòåíòèôèêàöèÿ â AD ñðàáîòàëà, òî ðàçðåøàåì äîñòóï
Если ваша система PAM изначально была настроена с # (ýòî óñëîâèå äîñòàòî÷íî äëÿ âõîäà â ñèñòåìó)
auth sufficient /lib/security/pam_winbind.so ↵
использованием одного общего файла конфигурации use_first_pass
system-auth и ссылками на него из соседних, то стоит пра- # Åñëè ïðåäûäóùèé ïóíêò íå ñðàáîòàë, òî çàïðåòèòü âõîä
вить только его, чтобы доменные пользователи смогли вхо- # (ìîäóëü âñåãäà âîçâðàùàåò îòðèöàòåëüíûé ðåçóëüòàò)
дить в систему наряду с локальными. В противном случае auth required /lib/security/pam_deny.so
придется редактировать все файлы конфигурации для не- Параметр use_first_pass требуется для того, чтобы
обходимых сервисов. pam_winbind.so не переспрашивал у пользователя пароль,
Структура самого файла состоит из построчного спис- а использовал тот, который был введен для pam_unix.so.
ка модулей. Формат строки каждого модуля следующий: Настало время проверить работоспособность системы
PAM: попробуйте в соседней консоли зайти в систему под
[òèï] [âëèÿíèå] [íàçâàíèå ìîäóëÿ] [ïàðàìåòðû] любым доменным пользователем. В случае неудачи нужно
попробовать войти под локальным пользователем, и если
где: это тоже не сработает, то в настройках определенно допу-
щена ошибка. О причинах возможных неполадок много
информации можно почерпнуть из системных логов.
Последним шагом является наведение порядка в плане
безопасности, так как неразумно пускать на UNIX-машину
всех пользователей домена. Для решения этой проблемы
существует модуль pam_require.so, который, основываясь
на членстве пользователя в определенной группе, решает,
пустить ли его. Нужно лишь создать группу в AD, добавить
в нее пользователей и подключить сам модуль:

account required /lib/security/pam_require.so ↵


root @unixoids

Не переусердствуйте с длиной названия группы, так как


glibc иногда не очень адекватно реагирует на длинные имена
(более 8 символов).

Рассмотрим следующий пример:

# ñðàçó çàãðóæàåì âñå ïîëüçîâàòåëüñêèå ïåðåìåííûå îêðóæåíèÿ


# (ìîäóëü âñåãäà âîçâðàùàåò ïîëîæèòåëüíûé ðåçóëüòàò)
auth required /lib/security/pam_env.so
# Åñëè ïîëüçîâàòåëü åñòü â ëîêàëüíîé áàçå, òî ïóñêàåì åãî
# (ýòî óñëîâèå äîñòàòî÷íî äëÿ âõîäà â ñèñòåìó)
auth sufficient /lib/security/pam_unix.so ↵
likeauth nullok
Пользователи из домена изначально не имеют домаш-
# Åñëè ïðåäûäóùèé ïóíêò íå ñðàáîòàë, òî çàïðåòèòü âõîä него каталога. О нем есть лишь небольшое упоминание в
# (ìîäóëü âñåãäà âîçâðàùàåò îòðèöàòåëüíûé ðåçóëüòàò)
auth required /lib/security/pam_deny.so его атрибутах, и для того чтобы доменные пользователи не
чувствовали себя обделенными, нужно автоматизирован-
В дистрибутиве самбы есть PAM-модуль pam_winbind.so, но создавать эти каталоги. Для этого существует модуль
который нам потребуется для дальнейшей работы. Стоит pam_mkhomedir.so, который берет шаблон домашнего ка-
проверить, был ли он скопирован при установке в каталог талога (по умолчанию /etc/skel), копирует его в надлежа-
/lib/security, и если его там нет, то поместить его туда рука- щее для него место и выставляет необходимые права:
ми.
Основываясь на предыдущем примере, фрагмент кон- session required /lib/security/pam_mkhomedir.so ↵
umask=0077
фигурации, позволяющий проводить аутентификацию при
помощи samba, будет выглядеть следующим образом: Цель достигнута. UNIX-машина теперь может полноцен-
но взаимодействовать с доменом и доменными пользова-
auth required /lib/security/pam_env.so телями. Остается только не забыть добавить самбу в спи-
# Åñëè ïîëüçîâàòåëü åñòü â ëîêàëüíîé áàçå, òî ïóñêàåì åãî сок запускаемых при загрузке сервисов и с чувством вы-
# (ýòî óñëîâèå äîñòàòî÷íî äëÿ âõîäà â ñèñòåìó) полненного долга начать ею пользоваться.

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

ЗАМЕТКИ О LINARE

ВАЛЕНТИН СИНИЦЫН
«Заметки о Linare» открывают цикл статей, посвященных люди, использующие компьютер не ради удовольствия, а
настольным дистрибутивам Linux. Вопрос об использова- как инструмент для эффективного решения возникающих
нии Linux на клиентских местах обсуждается сейчас очень перед ними проблем. Немаловажным является также на-
широко – создается такое впечатление, что каждое уважа- личие прочных контактов с OEM-поставщиками, посколь-
ющее себя аналитическое агентство считает своим долгом ку, во-первых, внимание сторонней организации является
подготовить исследование, дающее исчерпывающий ответ лишним подтверждением качества программного продук-
на вопрос, когда Windows окончательно сдаст свои пози- та (ни один производитель не станет продавать компьюте-
ции, сколько это будет стоить и случится ли вообще. Не ры, о которых покупатели скажут: «Куда мышкой ни щелк-
отстают и гиганты индустрии: «тяжеловесы» вроде Novell и ни – ничего не работает»), а во-вторых, несмотря на после-
Sun Microsystems выпускают собственные разработки с дние исследования в данной области, кое-кто из пользова-
обязательной приставкой «Desktop». Мы же в свою очередь телей предпочтет оставить на компьютере ту систему, ко-
попробуем рассмотреть этот феномен с позиций конечно- торая была на нем в момент приобретения. И наоборот,
го пользователя. Чем настольный Linux отличается от сво- многие побоятся менять уже имеющуюся ОС на другую,
их «ненастольных» аналогов? Как ведет себя в работе тот пусть даже самую распрекрасную.
или иной дистрибутив, можно ли использовать его для ре- На современном Linux-рынке систем, удовлетворяющих
шения определенного круга задач? Вот те вопросы, на ко- этим требованиям, насчитывается четыре штуки: это Linare
торые мы попытаемся дать ответ. Linux (http://www.linare.com), Linspire (http://www.linspire.com),
Начнем с банального. Настольный Linux позициониру- ранее известная как LindowsOS, Lycoris Desktop/LX (http://
ется его создателем для использования на ПК. Как прави- www.lycoris.com) и Xandros Desktop OS (http://www.xand-
ло, под этим подразумевается, что входящие в дистрибу- ros.com). К ним вплотную примыкают SUSE Linux (http://
тив приложения тесно интегрированы друг с другом, а все www.suse.com) от компании Novell, Mandrakelinux (http://
(или почти все) параметры системы настраиваются при www.linuxmandrake.com) от фирмы Mandrakesoft и ряд дру-
помощи интерактивных графических мастеров, так что гих разработок. Несколько особняком стоят корпоративные
пользователю необязательно знать, что происходит «за решения типа Java Desktop System от Sun Microsystems и
кулисами». Последнее требование является весьма важ- находящийся в стадии бета-тестирования Novell Linux
ным, поскольку целевая аудитория подобных продуктов – Desktop. Эти продукты предназначены в первую очередь

№11(24), ноябрь 2004 39


администрирование
для использования на предприятиях и допускают тесную ся словами: «Press OK to reboot». Излишне говорить, что
интеграцию с серверными решениями соответствующих никаких других кнопок, кроме «OK», в этом диалоге не было.
поставщиков. Запустив повторную инсталляцию, я осуществил разбие-
ние диска вручную. На этот раз все прошло гладко, если не
Знакомьтесь: Linare считать того, что Linare предложил мне на выбор всего три
Корпорация Linare Corporation (http://www.linare.com), заре- файловые системы: ext2, ext3 и vfat. На фоне обилия раз-
гистрированная в США, штат Вашингтон, впервые заявила личных решений для организации данных, поддерживае-
о себе в сентябре прошлого года. Именно тогда был анон- мых ядром Linux напрямую (это и ReiserFS, и XFS компа-
сирован выход дистрибутива Linare Linux. Месяц спустя нии Silicon Graphics, и JFS корпорации IBM), этот перечень
Linare открыла портал Linux.net, не так давно переимено- смотрится несколько бледно.
ванный в LinuxTimes.net. Последняя версия системы, Linare После указания часового пояса (здесь было достаточ-
Linux 2.0 Professional Edition, базируется на Fedora Core и но просто щелкнуть мышью в нужной точке на карте мира)
была выпущена в минувшем августе. мне предложили ввести пароль для root. Желая проверить
Политика компании в отношении распространения Linare «интеллектуальные способности» инсталлятора, я набрал:
Linux вызывает некоторую растерянность. Его первая вер- «123456». К моему изумлению, этот канонически слабый
сия продавалась как отдельно (по цене приблизительно 20 пароль был принят системой безоговорочно. Это тем бо-
долларов за копию), так и в составе бюджетных PC в ряде лее странно, поскольку, в отличие от других дистрибути-
крупных интернет-магазинов. После выхода Linare Linux 2.0 вов, Linare не предлагает создать непривилегированную
была объявлена рекламная акция – коробку (DVD-бокс) с учетную запись для повседневной работы, вынуждая
дистрибутивом можно было заказать по почте, оплатив пользователя, не слишком хорошо знакомого с Linux (а та-
только стоимость доставки. Вскоре после ее окончания ких среди потенциальных клиентов Linare подавляющее
Linare, не сказав никому ни слова, опубликовала ISO-об- большинство), всегда регистрироваться в системе как root,
раз диска на сайте Ibiblio (ftp://ftp.ibiblio.org), и в настоящий что весьма негативно сказывается на безопасности.
момент его может загрузить любой желающий. Создается Сразу же после ввода пароля инсталлятор переходит
впечатление, что компания до сих пор не определилась, что непосредственно к копированию пакетов на жесткий диск.
будет ее основным источником дохода – прямые продажи Никаких специальных мер по их отбору не предусмотрено,
или OEM-контракты. однако это можно считать скорее плюсом, чем минусом: в
Перейдем собственно к продукту. Как и все настольные состав Linare Linux входит вполне удачный комплект при-
дистрибутивы, Linare Linux распространяется на одном ком- ложений для типичной SOHO-конфигурации, а все необхо-
пакт-диске, загрузившись с которого можно приступить не- димое можно добавить в процессе использования системы
посредственно к установке системы. Некоторые произво- с помощью утилиты Synaptic. Финальной фазой инсталля-
дители считают удобным поместить на инсталляционный ции является установка загрузчика (GRUB). К сожалению,
диск небольшую программу автозапуска (autorun) для инсталлятор не только не спросил меня, где я хотел бы его
Microsoft Windows, которая попросит пользователя сохра- разместить (возможно, это было сделано для того, чтобы
нить все важные данные и перезагрузить компьютер для не травмировать неспециалиста терминами вроде MBR), но
начала установки новой системы. На диске с Linare Linux и переписал существующую загрузочную запись Mandrake-
Professional я ничего подобного не обнаружил. Видимо, про- linux, не добавив эту ОС в свое меню. Подобная ситуация,
изводитель полагает, что пользователь, отважившийся на на мой взгляд, является совершенно недопустимой для по-
перестановку системы, должен сам неплохо представлять, тенциальных пользователей Linare, многие из которых мо-
как это делается. гут захотеть установить его рядом с Windows. С другой сто-
В качестве программы-инсталлятора Linare Linux исполь- роны, такое поведение не вызывает проблем при установ-
зует Anaconda, что совсем неудивительно, особенно если ке Linare Linux на «чистый» компьютер, например, на стен-
принять во внимание его «наследственность». Установщик де OEM-производителя.
предельно прост в использовании и задает минимум воп- В заключение отметим забавную особенность. Инстал-
росов, однако перевести его в экспертный режим (т.е. ока- лятор Linare Linux не предлагает пользователю ознакомить-
зать сколько-нибудь существенное влияние на процесс) нет ся с лицензионным соглашением и «подписать» его, щелк-
никакой возможности. Исключение составляет процедура нув на соответствующую кнопку. По мнению автора, это
разбиения жесткого диска, которую пользователь может следует рассматривать скорее как «реверанс» в сторону
доверить компьютеру или провести самостоятельно с по- все тех же OEM-поставщиков, поскольку юридические от-
мощью графической утилиты Disk Druid. ношения с ними, как правило, закреплены на бумаге.
Автоматически подготовить разделы на моей системе,
к сожалению, не получилось: инсталлятор отказался исполь- Впечатления от работы
зовать пустое пространство, оставшееся после установки Кодовое имя Linare Linux 2.0 Professional Edition – Shrek.
Mandrakelinux 10.0. Несколько более досадным оказался тот Видимо, в честь всемирно известного огра интерфейс сис-
факт, что после неудачной попытки определения будущей темы выдержан в зеленых тонах (см. рис. 1). Linare Linux
структуры разделов (отмечу, речь идет именно об их пла- 2.0 построен на базе ядра 2.6.5 и включает в себя: рабочий
нировании, а не о записи таблицы на жесткий диск) про- стол KDE 3.2.2, офисный пакет OpenOffice.org 1.1.0, персо-
грамма не предложила мне пересмотреть свой выбор, а про- нальный органайзер Ximian Evolution 1.4.6, пакет Mozilla 1.6,
демонстрировала диалог с сообщением, заканчивающим- графический редактор GIMP 2, проигрыватели XMMS и

40
администрирование
MPlayer, а также ряд несвободных приложений, например Neighborhood, входящий в состав дистрибутива, позволяет
среду выполнения Java, RealPlayer 8 и Macromedia Flash. В просматривать разделяемые ресурсы Windows, а стандар-
отличие от других настольных дистрибутивов для просмот- тные средства KDE облегчают установку сетевого принте-
ра документов в формате PDF Linare Linux предлагает не ра. Однако ни WINE, ни CrossOver Office в Linare Linux нет,
Adobe Acrobat Reader, использующий библиотеку Motif, а что делает запуск Windows-приложений невозможным.
посему имеющий достаточно специфический интерфейс, Опять же, WINE можно попробовать доустановить с помо-
характерный для старых UNIX-приложений, а достаточно щью Synaptic, однако отсутствие средств совместимости с
свежую разработку KPDF, являющуюся частью KDE. Рабо- Windows выглядит для настольного дистрибутива несколь-
чий стол создает ощущение монолитности – дизайнеры ко странно. Помимо этого, в Linare Linux не входит GCC, а
корпорации Linare постарались на славу. значит, добавлять в систему можно только бинарные паке-
Приложения Qt и GTK выглядят практически одинако- ты. К счастью, насколько можно судить, Linare Linux 2.0 со-
во. Из общей картины выбиваются лишь Mozilla, использу- храняет совместимость с Fedora Core 2.
ющая синюю тему «Modern», и OpenOffice.org, поддержи- А теперь – главный минус для русскоязычных пользо-
вающий собственную библиотеку GUI (справедливости ради вателей. Linare Linux не поддерживает никакие языки, кро-
надо отметить, что уже существуют версии OpenOffice.org, ме американского английского. Набрать что-либо кирилли-
элементы управления которых имитируют внешний вид вид- цей не представляется возможным ввиду отсутствия фай-
жетов KDE и GNOME. «KDE-фицированный» OpenOffice.org лов локализации KDE. Подобные действия производителя
входит, например, в SUSE Linux и Yoper). В качестве front- можно объяснить только его желанием освободить место
end к MPlayer также используется GMPlayer (gtk+), хотя ряд на компакт-диске и его ориентированностью на англогово-
других поставщиков Linux уже включил в свои дистрибути- рящие страны. Возможно, в будущем эта ситуация изме-
вы KPlayer, базирующийся на Qt/KDE. Иными словами, сте- нится к лучшему.
пень интегрированности рабочего стола в Linare Linux весь- Подведем итог. Linare Linux 2.0 Professional Edition пред-
ма высокая, но не идеальная. ставляет собой достаточно простой дистрибутив, по-види-
мому, ориентированный на OEM-поставки в англоязычные
страны. В техническом смысле он ненамного дружествен-
нее пользователю, чем оригинальная Fedora Core, если не
считать более «молчаливого» инсталлятора. Linare не пре-
доставляет собственных средств настройки, за исключени-
ем стандартного набора апплетов Red Hat. При всем этом
пакеты, общий объем которых в распакованном состоянии
составляет всего 2 Гб (не так уж много, по современным
меркам), подобраны весьма удачно, видна работа дизай-
неров и специалистов в области удобства использования
(usability). Думается, что после включения хотя бы мини-
мальной поддержки русского и других языков Linare Linux
займет достойное место в ряду дружественных пользова-
телю операционных систем.
В следующем номере мы рассмотрим самый старый и,
Ðèñóíîê 1. Öâåòîâàÿ ãàììà ðàáî÷åãî ñòîëà – æåëòî-çåëåíàÿ,
пожалуй, самый известный широкой публике настольный
à èêîíêè è íàçâàíèÿ ïðèëîæåíèé ïîäîáðàíû òàê, ÷òîáû ìàêñè- дистрибутив – Linspire/LindowsOS.
ìàëüíî ñîîòâåòñòâîâàòü Windows XP
Система меню «Пуск» (в Linare оно называется «Explore»)
и пиктограммы по возможности повторяют Windows XP.
Приложения Linux, такие как KEdit, KPaint и LinNeighborhood,
получили привычные пользователям Windows названия –
Notepad, Paint и Network Neighborhood. То же самое можно
сказать и о иконках рабочего стола. Здесь можно встре-
тить «My Linare PC» и «Connect to Internet», навевающие
мысли о «Моем компьютере» и «Мастере подключения к
Интернету». Однако не стоит обольщаться – первая пик-
тограмма является просто ссылкой на домашний каталог
пользователя, который будет открыт в Konqueror, а щелчок
по второй запустит утилиту KPPP, которая окажет неоце-
нимую помощь в настройке dial-up соединения, но будет бес-
полезна, если вам необходимо создать подключение по ло-
кальной или беспроводной сети.
Немаловажной частью настольной системы является Ðèñóíîê 2. Ñîáñòâåííûõ ñðåäñòâ íàñòðîéêè â Linare Linux
также совместимость с Windows-машинами и приложения- íåò, îäíàêî óòèëèòû Red Hat è Öåíòð óïðàâëåíèÿ KDE ïîçâî-
ëÿþò äîáèòüñÿ ìíîãîãî (íà ýêðàíå – ìàñòåð óñòàíîâêè íîâîãî
ми. Здесь у Linare имеются определенные проблемы. Lin- ïðèíòåðà)

№11(24), ноябрь 2004 41


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

ИСПОЛЬЗОВАНИЕ ПРОГРАММЫ nLite

МАКСИМ КОСТЫШИН
Желание Microsoft сделать свои программные продукты уни- продуктом и может быть скачана по адресу: http://
версальными приводит к тому, что инсталляционные паке- www.taekwondo-knin.hr/files/nlite-0.98.7b2i.exe, сайт произво-
ты содержат порой изрядный процент ненужных для конеч- дителя – http://nuhi.msfn.org). Дополнительно для работы
ного пользователя возможностей, а также большое коли- небходимо, чтобы в системе было установлено приложе-
чество файлов для поддержки многообразного HardWare. ние Microsoft .Net Framework (http://download.microsoft.com/
Описание одного из способов, который поможет сформи- download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/
ровать небольшой пользовательский дистрибутив опера- dotnetfx.exe).
ционной системы семейства Windows 2000, приводится в Инсталляция nLite имеет общепринятые интуитивно оче-
данной статье. Это решение позволит сэкономить возмож- видные подходы, поэтому выполнить установку не соста-
ности аппаратных ресурсов вашего компьютера, а значит, вит труда даже новичку, и описание процедуры в данной
повысить эффективность решения действительно важных статье не приводится.
пользовательских задач, обеспечить повышенный уровень Для самостоятельных проб рекомендуется учесть то, что
безопасности. в процессе создания дистрибутива с использованием ути-
Утилита nLite предназначена для формирования поль- литы данные инсталляции будут безвозвратно модифици-
зовательских дистрибутивов операционных систем Microsoft рованы, и вы можете потерять эталонную версию устано-
Windows версий 2000, XP, 2003 и решает следующие зада- вочного пакета операционной системы.
чи: Так как одной из задач, которые решались с использо-
! Оптимизация временных затрат при установке опера- ванием nLite, было создание оптимальной инсталляцион-
ционной системы на пользовательских компьютерах за ной версии операционной системы W2K, сохраняющей
счет: свои основные характеристики, имеющей минимальные
! уменьшения размера дистрибутива и количества ус- размеры дистрибутива и ограниченные требования к ап-
танавливаемых компонентов; паратным ресурсам компьютера, на котором должна про-
! определения значений стандартных настроек, кото- изводиться установка, то для тестирования была выбра-
рые запрашиваются в процессе установки. на Microsoft Windows 2000 Professional сборки 5.00.2195 с
! Снижение загрузки оперативной памяти компьютеров интегрированным Service Pack 4. При этом объем занима-
путем исключения из инсталляционного пакета компо- емого на диске места после установки с применением ми-
нентов и возможностей, которые не будут востребова- нимально возможной пользовательской инсталляции со-
ны пользователем в процессе работы. ставил – 257 Мб (в стандартной установке – около 600 Мб,
! Повышение уровня безопасности устанавливаемой си- в расчет не брался размер файла подкачки – pagefile.sys),
стемы при помощи интеграции в инсталляцию после- объем выделенной оперативной памяти – 32 Мб (в стан-
днего Service Pack, а также исключение из дистрибути- дартной установке – 46 Мб). Сам дистрибутив занимает
ва и, таким образом, уменьшения количества приложе- 178 Мб (в стандартной установке – 330 Мб).
ний Microsoft, которые могут потенциально содержать
критические ошибки (например, Outlook Express, игры) Начало работы с программой
и не понадобятся для работы конечному пользователю. Работу с программой nLite разработчики организовали в
виде последовательного набора экранов, в которых пользо-
Дополнительно программа предоставляет возможность вателю предлагается произвести необходимый выбор ре-
избавиться от установки на пользовательские компьютеры жимов работы, определить размещения данных и т.п.
Internet Explorer (с определенными оговорками, так как раз- При запуске утилиты на экран выводится ознакомитель-
работчики Windows настолько интегрировали IE в опера- ное окно, в котором приводится перечень основных функ-
ционную систему и ее часть – Проводник, что полное из- ций программы и поддерживаемых операционных систем
бавление от всех следов IE, к сожалению, невозможно). Microsoft Windows. В следующем экране (Prepare installation)
При подготовке статьи была использована программа необходимо выбрать каталог, содержащий установочный
nLite версии 0.98 beta 2 (утилита является некоммерческим пакет Windows, который будет модифицироваться для по-

42
администрирование
лучения в выбранном месте итоговой версии инсталляции трибутива с интегрированным SP и без использования nLite
(нельзя выбрать каталог, размещенный на CD-ROM). (что бывает весьма выгодно администраторам, для кото-
рых уменьшение времени, потраченного на переустановку
системы, – весьма актуальная задача). Для этого достаточ-
но выполнить три последовательных шага:
! Скопировать на жесткий диск каталог «I386» из исход-
ного инсталляционного пакета Windows;
! Распаковать обновление в подходящий каталог, исполь-
зуя команду в указанном ниже формате:

W2KSP4_rus.exe /u /x:íàçâàíèå_âðåìåííîãî_êàòàëîãà

! Из подкаталога Update обновления выполнить програм-


му:

update.exe /s:èìÿ_êàòàëîãà_äèñòðèáóòèâà

Перечень возможных ключей для выполнения обновле-


Ðèñóíîê 1 ния приведен на рисунке.
При этом автоматически детектируется наличие в выб-
ранном каталоге подкаталога с названием «I386». Пользо-
вателю дополнительно предоставляется информация о том,
установка какой операционной системы выбрана, номер
внедренного Service Pack (SP) и размер инсталляционного
пакета.
В случае если у пользователя имеется версия более све-
жего SP, то следующий экран (Slipstream Service Pack) по-
зволяет выполнить интеграцию в инсталляцию необходи-
мого пакета обновления. Для этого следует после нажатия
кнопки «Browse» выбрать файл, содержащий установку тре- Ðèñóíîê 3
буемого SP. После завершения процедуры в каталоге с ин- Опытные специалисты, которые умеют работать с ISO-
сталляцией, выбранном на втором шаге работы с програм- образами дисков, обладающие знанием и практическими
мой, будет размещаться установочный пакет с интегриро- навыками, могут сформировать загрузочный диск на осно-
ванным SP. ве исходного инсталляционного диска W2K с использова-
нием таких широко распространенных программных про-
дуктов как Nero, UltraISO, CDRWin и т. п. Вообще говоря,
тема создания указанного типа дисков достаточно обшир-
на и может быть рассмотрена в рамках отдельной статьи.
К сожалению, разработчики Windows не утруждали себя
внедрением подобных механизмов в обновления, которые
достаточно часто публикуются Microsoft и еще не включе-
ны в отдельный Service Pack, их выполнение предусматри-
вается только после того, как операционная система будет
установлена на компьютер.
Для полноты изложения вопроса создания загрузочно-
го диска Windows 2000 Professional в рамках основной темы
статьи отметим, что в корне установочного пакета должны
присутствовать следующие файлы:
! BOOTFONT.BIN (локализация русской версии);
! cdromsp4.tst (указывает на то, что используется версия
Ðèñóíîê 2 с Service Pack 4);
Кнопка «Make ISO» позволяет сформировать образ заг- ! cdrom_ip.5 (указывает на то, что используется версия
рузочного диска без удаления каких-либо компонентов из Windows 2000 Professional);
инсталляционного пакета. ! cdrom_nt.5 (для всех версий W2K).

Об интеграции Service Pack Причем само содержимое всех файлов, кроме первого,
в инсталляционный пакет не имеет никакого значения. Файл BOOTFONT.BIN может
Отметим, что при желании обладатель инсталляции W2K и быть найден в каталоге «I386» установки операционной си-
последнего Service Pack может сформировать версию дис- стемы.

№11(24), ноябрь 2004 43


администрирование
Выбор компонентов ! Custom (Пользовательский);
инсталляционного пакета ! Last Session (Последняя сессия – данные о последних
После определения каталога дистрибутива и, возможно, выбранных пользователем для удаления компонентах
интеграции в него последней версии SP, программа nLite запоминаются в каталоге установки nLite в разделе
предоставляет возможность просмотреть компоненты, ко- Components файла settings.ini при успешном формиро-
торые присутствуют в пакете инсталляции и выбрать те, от вании дистрибутива);
которых следует отказаться. ! Safe (Безопасный);
! Lite (Маленький);
! Select All (Выбрать все);
! Clear (Очистить).

Фиксация отметки Experimental позволяет расширить


список, из которого выбираются удаляемые компоненты,
одноименным разделом (включает компоненты – Application
compatibility path, Com+, Extra Fonts, Managеment Instrumen-
tation, MDAC, Modem Support, Windows Picture and Fax Viewer).
Заметим, что в программе имеются проблемы с орга-
низацией сохранения настроек параметров раздела
Experimental. В связи с чем компоненты данного раздела
необходимо при очередном сеансе работы с nLite повторно
корректировать.
Из раздела компонентов драйверов (Drivers) предлага-
ется выбирать только те устройства, которые вам явно не
Ðèñóíîê 4 понадобятся при использовании создаваемого пакета дис-
Основную часть окна (Components Removal) занимает трибутива. В разделе поддержки языков (Language Support)
перечень разделов с компонентами дистрибутива. Приве- рекомендуем оставить только поддержку русского языка и
дем полный список разделов с указанием некоторых вклю- многоязычности, а в разделе Operation System Options –
чающихся в состав компонентов: Printer Support.
! Application (Игры, WordPad, Калькулятор, ...); В следующем окне пользователю предоставляется воз-
! Drivers (Display Adapter, Ethernet (LAN), Modems, Printers, можность добавить файлы, содержащиеся в инсталляции,
Sound Controllers, ...); для удаления либо исключить из категорий удаляемых.
! Internet Utilities (Communication tools, Internet Explorer,
Java Virtual Machine, Outlook Express, Network Monitor,
Netmeeting, ...);
! Language Support (Cyrillic, Multilanguage Support (LANG
dir), ...);
! Multimedia (Pant, Windows Media Player, Mouse Cursors,
Windows Sounds, ...);
! Operating System Options (DR Watson, Disk Cleanup, Help,
Task Scheduler, Web View, ...);
! Service (Fax Service, Telnet Service, Autoupdate, Messen
ger, ...);
! Directories (в раздел вносится перечень каталогов, ко-
торые содержатся в каталоге дистрибутива, за исклю-
чением I386).

Работа с элементами окна организована авторами про-


граммы таким образом, что при попадании курсора мыши Ðèñóíîê 5
на имя конкретного компонента справа отображается крат- Здесь можно добавить в перечень удаляемых файлов
кое пояснение о назначении и рекомендации разработчи- такие категории редко используемых неспециалистами
ков nLite о том, следует ли оставить выбранный компонент файлов как:
в составе формируемого дистрибутива. ! утилиты работы с командной строкой – append.exe,
В нижней части окна расположено всплывающее меню, attrib.exe, xcopy.exe, fc.exe, find.exe, findstr.exe, edlin.exe
которое позволяет выбрать и зафиксировать набор удаля- и т. п.;
емых компонентов и операций, выполняемых над списком ! средства диагностики и отладки:
элементов, входящих в состав инсталляционного пакета ! dxdiag.exe – средство диагностики DirectX;
операционной системы. Названия и некоторые пояснения ! perfmon.exe – средство оценки производительности;
автора статьи помогут получить общие представления о ! wbemtest.exe – тестер инструментария управления
группах исключаемых из дистрибутива компонентов: Windows;

44
администрирование
! winver.exe – вывод информации об установленной ! DefaultHide – предоставляет возможность при установ-
версии Windows; ке провести операции с разделами, задать диск, на ко-
! ipsecmon.exe – монитор IP-безопасности; торый будет производиться установка, а также опреде-
! discover.exe – программа, предназначенная для зна- лить параметры в окне «Язык и стандарты» (рекомен-
комства с Windows; дуется автором статьи для проведения максимально
! файлы данных; быстрого процесса инсталляции);
! %WinDir%\security\templates\*.inf – шаблоны конфигура- ! GuiAttended – не использует никаких предварительных
ции безопасности для Security Configuration Editor; настроек;
! %WinDir%\*.bmp – образцы рисунков для рабочего сто- ! ProvideDefault – обычный вариант установки с предус-
ла. тановленными значениями.

К слову сказать, после установки операционной сис- С помощью последней закладки (Personal) определяются:
темы с применением минимального возможного вариан- ! временная зона (часовой пояс);
та пользовательского дистрибутива в системном катало- ! значение пароля администратора;
ге и System32 размещалось свыше 300 исполняемых фай- ! язык;
лов, не говоря уже о dll-файлах. Вряд ли большинство из ! имя компьютера;
них будут востребованы пользователем и системой для ! полное имя;
работы. ! название организации;
Информация о выбранных пользователем для удаления ! имя рабочей группы для настройки работы в сети.
компонентах, исключаемых и оставляемых в инсталляции
файлах, параметрах формирования ISO-образа пользова-
тельской установки сохраняется в settings.ini, размещаю-
щемся в каталоге установки nLite.

Настройки параметров инсталляции


Следующее окно настроек (Unattended setup) позволяет вам
заранее определить значения по умолчанию для некоторых
параметров инсталляции.
Первая закладка (Info) предоставляет пояснения и воз-
можность использовать или отказаться от представленно-
го расширенного перечня настроек.
Внося информацию в параметры второй закладки
(General) можно определить данные, которые предлагают-
ся для выбора в процессе установки, такие как:
! регистрационный номер для инсталляции;
! название каталога для установки; Ðèñóíîê 7
! выбор процесса сопровождения процесса установки Заметим, что вся информация с настройками парамет-
(UnAttended Mode); ров инсталляции сохраняется в файле unattended.ini, раз-
! возможность определения автоматической регистрации мещающемся в каталоге установки программы nLite.
администратора при входе в Windows.
Завершающий этап
Последнее окно определения параметров дистрибутива (Set
up options) в закладках Options и Tweaks позволяет допол-
нительно задать некоторые завершающие настройки:
! отключить возможность использования системы защи-
ты системных файлов (SFC) при работе операционной
системы, которая предполагает резервное хранение кэша
защищаемых файлов и автоматическое сканирование це-
лостности системных файлов при перезапуске системы;
! удалить раскладки клавиатуры для исключенных из ин-
сталляции поддержки иностранных языков, которые не
будут использованы при работе;
! определить максимальное сжатие драйверов при фор-
мировании инсталляции;
! исключить возможность загрузки с формируемого об-
раза;
Ðèñóíîê 6 ! определить минимально разрешенный размер опера-
Выбор UnAttended Mode может быть сделан из пяти пре- тивной памяти, при котором процедура инсталляции
допределенных режимов. Поясню некоторые из них: будет разрешена.

№11(24), ноябрь 2004 45


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

Ðèñóíîê 10
В связи с тем, что при формировании пользовательского
дистрибутива ссылки на удаляемые файлы исключаются,
Ðèñóíîê 8 порой не во всех конфигурационных файлах вам, возмож-
Нажатие кнопки в окне (Set up options) позволяет на- но, придется повторно отказаться от установки файлов, не
чать процесс формирования пользовательского инсталля- обнаруженных в процессе выполнения инсталляции.
ционного пакета и внесения изменений в исходный каталог После установки системы некоторые ссылки на про-
с файлами дистрибутива. Последовательность и ход про- граммы или возможности могут остаться в пунктах меню
цесса можно наблюдать в очередном окне (Processing). При «Пуск» – «Программы», «Панель управления», однако за-
завершении формирования инсталляции с заданными па- пуск не будет возможен ввиду отсутствия самих объектов,
раметрами внизу окна программы в статусной строке вы- на которые предполагалось сделать отсылки.
водится информация о размере сформированного дистри- В состав прочих команд пакетного файла nLite.cmd, за-
бутива, данные о том, насколько он был уменьшен по срав- пускающегося при первой загрузке Windows, входит ути-
нению с исходным. лита Registry Console Tool For Windows 2000 (Reg.exe), ко-
торая присутствует, например, в Microsoft Windows 2000
Support Tools (входит в состав Windows 2000 Server) и
Windows XP, однако отсутствует в стандартной поставке
Windows 2000 Professional.
Применение nLite не позволяет полностью удалить
Internet Explorer (для эксперимента можно попробовать вы-
полнить в урезанном варианте «Пуск» – «Найти» – «В Ин-
тернете…»).

Некоторые тонкости использования nLite


Как уже указывалось, авторы программы предусмотрели,
что при использовании дистрибутива, изготовленного с ис-
пользованием утилиты, после завершения инсталляции вы-
полняется запуск командного файла nLite.cmd (необходи-
мая информация для этого вносится в файл HIVEDEF.INF).
Формирование командного файла напрямую зависит от на-
Ðèñóíîê 9 строек заданных пользователем в процессе определения
Предпоследнее окно nLite (Make bootable image) предо- параметров установки в nLite. В связи с этим разработчики
ставляет возможность дополнительно сформировать ISO- внедрили информацию, на основе которой корректируется
образ дистрибутива для тестирования или записи на CD- содержание файла nLite.cmd в код самой программы. Ин-
ROM. Перед этим можно произвести необходимые опера- формация дописывается в cmd-файл в процессе формиро-
ции с итоговым дистрибутивом, которые не были предус- вания дистрибутива.
мотрены в ходе работы с программой nLite (добавить фай- Ниже для примера приводится минимальный вариант
лы, скорректировать содержимое), а также внести правки содержимого файла nLite.cmd.
для устранения неточностей, выявленных в процессе рабо-
ты с программой (рис. 10). @ECHO OFF
TITLE nLite post cleanup - Please Wait...
reg delete HKEY_USERS\.DEFAULT\Software\Microsoft\ ↵
Ложка дегтя в бочке меда Windows\CurrentVersion\RunOnce /v nlite /f
del /f /q %SystemRoot%\inf\nlite.cmd
Несмотря на то что программа nLite оставляет приятное
впечатление при использовании, имеется ряд моментов, ко- С использованием коррекции содержимого командного
торые подтверждают тот факт, что идеальных программ- файла nLite.cmd можно решить некоторые дополнительные
ных решений не бывает. Ниже приведены некоторые изъя- вопросы оптимизации процесса инсталляции Windows.

46
администрирование
Следующие строки, включенные в nLite.cmd, позволяют держимого файла UnAttend.txt, размещаемого в каталоге
скорректировать используемые по умолчанию параметры «I386»). В связи с этим грамотное использование содержи-
раскладки клавиатуры при регистрации в системе и при ра- мого файла WinNT.sif может позволить определить при ус-
боте в Windows (Английская (США) – основная, Русская – тановке максимально быстрый (UnattendMode = DefaultHide)
дополнительная, переключение Ctrl+Shift). режим инсталляции, предполагающий до 3 (в стандартном
режиме – свыше 10) диалоговых экранов, требующих вме-
rem Êîððåêöèÿ ÿçûêà ïî óìîë÷àíèþ è ïåðåêëþ÷åíèÿ êëàâèàòóðû шательства оператора для продолжения процесса (эта осо-
reg add "HKEY_CURRENT_USER\Keyboard Layout\Preload" ↵
/v "1" /t REG_SZ /d "00000409" /f бенность может быть использована в стандартных дистри-
reg add "HKEY_CURRENT_USER\Keyboard Layout\Preload" ↵ бутивах Microsoft Windows 2000 и XP).
/v "2" /t REG_SZ /d "00000419" /f
reg add "HKEY_CURRENT_USER\Keyboard Layout\Toggle" ↵
/v "Hotkey" /t REG_SZ /d "2" /f
reg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Preload" ↵
Продолжение следует?
/v "1" /t REG_SZ /d "00000409" /f В статье был рассмотрен один из вариантов, позволяющий
reg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Preload" ↵ формировать на компьютере пользователя операционную
/v "2" /t REG_SZ /d "00000419" /f
reg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Toggle" ↵ систему Windows 2000, занимающую минимальные разме-
/v "Hotkey" /t REG_SZ /d "2" /f ры как на жестком диске, так и при запуске – в оператив-
ной памяти. Следует отметить, что для решения поставлен-
Для того чтобы воспользоваться заложенной в nLite.cmd ной задачи могут быть использованы различные подходы,
возможностью применения утилиты Registry Console Tool так, если в программе nLite используется вариант подго-
For Windows 2000 (Reg.exe), для Windows 2000 Professional товки пользовательской инсталляции минимального вари-
необходимо: анта, то утилита 2000Lite Professional (коммерческий про-
! найти и дополнить выбранный каталог «I386» для поль- дукт LitePC Technologies Pty Ltd, сайт компании – http://
зовательской инсталляции файлом Reg.exe; www.litepc.com) позволяет удалить лишние компоненты из
! внести в файл TXTSETUP.SIF в раздел [SourceDisksFiles] уже установленной системы. C использованием 2000Lite
строку следующего содержания: Professional можно уменьшить размер занимаемого диско-
вого пространства до 200 Мб (nLite – 257 Мб), размер ис-
reg.exe = 2,,,,,,_x,Ø,0,0 пользуемой оперативной памяти может быть уменьшен до
42 Мб (nLite – 32 Мб).
где Ш – номер каталога, назначение которого приведе-
но в размещенном выше разделе [WinntDirectories] (на-
пример, цифра 2 означает размещение файла в ката-
логе %WinDir%\system32).

Используя в своих интересах нюансы механизмов ра-


боты инсталляции Microsoft Windows, можно, варьируя со-
держимое файлов, изменять значение переменных среды
пользователя (например, TEMP и TMP), определять запуск
при первом входе в Windows дополнительных программ, на-
значенных при подготовке дистрибутива, и т. п.
Ниже приводятся отдельные фрагменты содержимого
файла HIVEDEF.INF после формирования пользовательс-
кого дистрибутива с использованием nLite, которые могут
быть взяты в качестве образца для решения указанных Ðèñóíîê 11
выше задач: Возможность создания оптимизированной инсталляции
существует и для других программных продуктов Microsoft,
… таких, например, как Microsoft Office. Для этого могут быть
[AddReg]
HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", ↵ применены стандартные средства Microsoft, к примеру Office
"nLite",0x00020000,"%%systemroot%%\inf\nlite.cmd" 2000 Resource Kit, Office XP Resource Kit.

HKCU,"Environment","TEMP",0x00020000,"%TEMP_DIR%" К моменту верстки статьи в Интернете появилась ин-
HKCU,"Environment","TMP",0x00020000,"%TEMP_DIR%" формация о выходе новой версии nLite – 0.99 beta, в кото-

[Strings] рой возможности программы существенно расширены:
TEMP_DIR="%USERPROFILE%\Local Settings\Temp"

! добавлена поддержка интеграции hotfixes;
! включения в дистрибутив драйверов поддержки допол-
Значения параметров, указываемых пользователем в нительных устройств;
процессе инсталляции, которые определяются во время ра- ! увеличен перечень возможных для исключения из па-
боты с программой nLite, сохраняются в файле WinNT.sif. кета компонентов (NWLink IPX/SPX/NetBIOS Protocol,
Использование sif-файла заложено Microsoft в механизм Client for Netware Networks, SNMP Service, Command-Line
проведения стандартной установки операционной системы tools (experimental), Event Log Service (experimental) и пр.);
Windows для получения параметров проведения инсталля- ! внедрены механизмы, позволяющие провести русифи-
ции (дополнительную информацию можно получить из со- кацию интерфейса работы с программой и пр.

№11(24), ноябрь 2004 47


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

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

СЕРГЕЙ ЯРЕМЧУК
Появление компьютеров послужило импульсом к развитию конец, наиболее сложная из них, иммунная система челове-
многих наук, но сразу стало понятно, что созданные искус- ка. Иммунологи описывают проблему определения заразы
ственные алгоритмы не всегда в состоянии рационально внутри организма как сравнение неких шаблонов с попада-
решить задачу. Там, где человек сразу видит решение, ком- ющими внутрь организма телами (или антигенами) и выяв-
пьютер лишь может перебирать варианты ответа. Между тем ления между ними различий. В роли шаблонов выступают
природа терпеливо оттачивает свои алгоритмы уже не один лимфоциты, которые вырабатываются В- и Т-клетками спин-
миллион лет, человечеству не сравниться с такими срока- ного мозга и тимуса. Причем генные библиотеки эволюцио-
ми. Именно поэтому в последнее время наметился большой нируют постоянно, поэтому изменяется и содержащаяся в
интерес к «натуральным» алгоритмам. Нейронные сети и них информация. В этом процессе имеется несколько инте-
генетические алгоритмы уже нашли свое применение во ресных моментов. Так, лимфоциты обнаруживают только не-
многих сферах, в том числе применяют их и в деле защиты которое ограниченное подмножество патологий, и поэтому
информации. для гарантированного обнаружения всех возможных вари-
Если посмотреть на сегодняшние решения по защите антов во всем организме их должно быть достаточное коли-
компьютерных систем, их можно сравнить с превентивными чество (не говоря уже о том, что около 100 миллионов заме-
мерами по недопущению заболевания, вроде правил общей щаются каждые 2-3 дня в процессе, называемом apoptosis).
гигиены, либо с лекарствами, помогающими укрепить орга- Иммунная система обладает двумя типами реакции:
низм, как правило, только от определенной болезни. Но при- первичная и вторичная. Первичная реакция происходит,
рода дала человеку более совершенное средство, помогаю- когда иммунная система сталкивается с антигеном впер-
щее справиться с неизвестными болезнями – иммунитет. вые, при этом он изучается, и на основании составленного
Именно это свойство пытаются сейчас выработать у компь- шаблона вырабатываются антитела, уничтожающие анти-
ютерных систем специалисты. Такие системы, заимствую- ген. Это длительный процесс, занимающий около 3 недель.
щие у природы принцип иммунитета, называют искусствен- Но так как выработать одинаковые антитела довольно
ными иммунными системами (AIS – Artificial Immune System). тяжело (телесная гипермутация), некоторые из них не впол-
Для понимания общего принципа работы такой системы не соответствуют антигену. Для устранения таких не соот-
необходимо вкратце напомнить, как работает естественная ветствующих шаблону антител запускается механизм кло-
иммунная система, предохраняющая человека от опасных нальной селекции, позволяющий отобрать максимально со-
инородных тел. Их роль в организме аналогична таковой в ответствующие антигену антитела. Учитывая короткий срок
компьютерных системах. Хотя имеется достаточно много жизни, и во избежание повторения всей процедуры с самого
различий между живыми организмами и компьютерными начала, информация запоминается. Процесс запоминания –
системами, но цель – обозначить подобия, переносимые в тема больших дебатов, хотя многие сходятся в том, что не-
компьютерную защиту. Защита организма многослойна, которые B-ячейки выступают как ячейки памяти, но для на-
здесь и кожа, второй барьер – pH, температура, делающая шего случая это, впрочем, и не важно. Теперь при повтор-
невозможной существование инородных организмов и, на- ном заражении запускается механизм вторичной реакции,

48
безопасность
быстро реагирующий на вторжение. И еще один интересный возможна разная реакция. Например, проблемная машина
(но редкий) процесс происходит в организме, называется или сервис может быть просто изолирован (перестройкой
clonal deletion и напоминает тестирование систем обнаруже- firewall, маршрутизатора, перезагрузкой, остановкой и пр.),
ния атак. На стадии выработки лимфоцитов некоторые из или IDS пытается перестроиться на параметры атакующего.
них мутируют до такой степени, что начинают нападать на Сетевые реализации AIS имеют еще один компонент, назы-
сам организм. Естественно, такие лимфоциты убиваются, но ваемый коммуникатором, оперирующий таким параметром,
в результате в организме заранее создаются шаблоны, со- как уровень риска. При обнаружении аномалий коммуника-
ответствие с которыми сразу же выдает чужеродность. тор поднимает свой уровень риска и отсылает значение на
Итак, иммунная система человека обладает некоторы- другие системы, которые также поднимают свой уровень. По-
ми свойствами: этому при появлении аномалий сразу на нескольких систе-
! индивидуальный подход к уникальным событиям; мах общий уровень быстро растет, и администратор будет
! система является распределенной; оповещен об опасности.
! без централизованного контроля; Создание случайного набора антител
! самообучаемая, обладающая памятью, ошибкоустойчи- 10001000111010….1000100111

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

пьютерные системы, моделирующие T-ячейки, используют-


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

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


зуется, как правило, один тип, совмещающий в себе сразу Без изменений
несколько функций. AIS строится, как правило, только на двух
центральных положениях: антиген – антитело. Исходя из осо-
Отмирание
бенностей сервиса или протокола, выбираются исходные
данные для формирования генной библиотеки, которая за- Ðèñóíîê 1
тем пополняется в процессе обнаружения аномальной ак- После прочтения всего вышеизложенного у многих мо-
тивности (т.е. эволюции генной библиотеки). Кроме того, жет возникнуть вопрос, в чем же отличие и преимущество
механизмы негативной селекции оперируют вероятностны- искусственных иммунных систем от искусственных нейрон-
ми характеристиками и вместо полного соответствия пара- ных сетей. Работы по изучению искусственных нейронных
метров довольствуются частичным. Изменение коэффици- сетей (Artificial Neural Networks – ANN) ведутся сравнительно
ента соответствия изменяет количество ложных срабатыва- давно и отнюдь небезуспешно, основной пик работ прихо-
ний системы. В качестве замены белку антигенов выступа- дится где-то на семидесятые-восьмидесятые. В результате
ют системные вызовы или сетевые пакеты. Для уменьшения разработано множество теорий и алгоритмов, теория Дар-
количества антител детекторы конкурируют между собой, винизма привела к появлению эволюционных алгоритмов
подобно тому, как лимфоциты конкурируют при связывании (evolutionary algorithms – EA). Обе эти сети способны обучать-
инородного антигена, и такая система оставляет соответству- ся, ведя наблюдение за изменением параметров системы, и
ющие только наиболее часто проявляющимся явлениям. как результат достигать максимально возможной эффектив-
Кроме того, такая система имитирует механизм негативной ности, имеют ассоциативную память, но в любом случае не-
селекции, в результате которой генерируются ранее неизве- обходима первоначальная настройка и подгонка параметров.
стные сигнатуры, которые в свою очередь сравниваются с Однако отличие нервной и иммунной систем человека на-
нормальным профилем. В итоге всего такая система созда- кладывает и свои отпечатки на алгоритмы работы. Для AIS
ет минимально возможный набор детекторов, способных характерны самоорганизация и эволюция, для ANN поведе-
обнаруживать максимальное число аномалий. Один из ком- ние во многом зависит от алгоритма. Количество ячеек AIS
пьютеров может играть роль тимуса, и при наличии вторич- не является строго фиксированным, их положение изменя-
ных IDS весь набор рассылается и на остальные узлы. Хотя ется динамически, происходит постоянное производство и
в принципе такая централизация необязательна и лимфо- отмирание ячеек, нейроны же имеют конкретное местопо-
циты при обнаружении аномалии могут самостоятельно ко- ложение, и количество их фиксировано. Более того, для пер-
пироваться на остальные узлы. При обнаружении проблем вой не характерно длительное взаимодействие между эле-

№11(24), ноябрь 2004 49


безопасность
ментами, концентрация и характер их динамически изменя- ния сетевых аномалий контролирует проходящие TCP SYN-
ется, для второй оно постоянно и задается при подключе- пакеты. В случае обнаружения необычных TCP-связей, про-
нии. Далее, для AIS, как правило, нехарактерно централизо- грамма посылает предупреждение по e-mail. Далее реше-
ванное управление и даже более того, оно противоречит са- ние принимает администратор. Если администратор ничего
мой природе вопроса, в ANN всем заправляет мозг, настра- не предпринимает, то детектор, пометивший подключение
ивающий веса. Одна из проблем для изучающих ANN состо- как аномальное, исчезнет и не будет больше беспокоить.
ит в том, что иногда трудно выделить, что именно сеть сей- Если аномалия подтверждена, то детектор станет частью
час «знает». набора и будет предупреждать пользователя всякий раз при
Более подробно этот вопрос освещен в документах обнаружении подобного подключения. Состоит Lisys из рас-
«Immune and Neural Network Models: пределенных детекторов размером 49 байт, контролирую-
! Theoretical and Empirical Comparisons»: ftp://ftp.dca.fee. щих «data-path triple», т.е. IP-адресов источника и назначе-
unicamp.br/pub/docs/vonzuben/lnunes/ijcia.pdf. ния, а также порт. Сначала детекторы генерируются случай-
! «Comparing Immune and Neural Networks»: ftp://ftp.dca.fee. но и в процессе работы соответствующие нормальному тра-
unicamp.br/pub/docs/vonzuben/lnunes/sbrn2002.pdf. фику постепенно убираются, кроме того, детекторы имеют
время жизни, и в итоге весь набор, кроме записанных в па-
Первые разработки по иммунным системам были изве- мять, через некоторое время регенерируется. При таком под-
стны еще в середине 70-х, но все же масштабные исследо- ходе возможно появление незаполненных мест в наборе,
вания начались совсем недавно, в конце 90-х годов. Поэто- которое устраняется использованием масок перестановки,
му стоит отметить, что практических реализаций в боль- позволяющих повторно отобразить «data-path triple», заме-
ших количествах ждать пока не приходится. Но алгоритмы ченное различными детекторами. Для уменьшения количе-
AIS уже находят применение при распознавании образов, ства ложных тревог используется порог активации, превы-
в некоторых оптимизационных задачах, поиске и устране- шение которого приводит к срабатыванию датчика. Этот
нии неисправностей, в том числе и аппаратных (http:// порог активации, как говорилось выше, общий на всю сеть.
www.osp.ru/cw/2001/47/000_35.htm), обнаружении вирусов, Process Homeostasis (pH) (рис. 2) представляет собой
биоинформатике и многих других задачах. Поиск инфор- расширение к ядру Linux, позволяющее обнаруживать и при
мации о применении AIS в системах защиты при помощи необходимости замедлять необычное поведение програм-
поисковиков несколько затруднен, так как по запросам вы- мы. Для обнаружения необычного поведения вначале ав-
водится большое количество ссылок, не всегда соответству- томатически создаются профили системных вызовов, сде-
ющих искомому. Большая часть проектов сегодня предос- ланных различными программами. На создание такого про-
тавляет только теоретическую информацию, которая будет филя уходит некоторое время, после чего программа мо-
интересна в первую очередь математикам и программис- жет действовать самостоятельно, вначале включая экспо-
там. В любом случае свои исследования стоит начинать с ненциальную задержку по времени для аномальных вызо-
сайта проекта ARTIST – ARTificial Immune SysTems (http:// вов, а затем и вовсе уничтожая процесс. Так как контроли-
www.artificial-immune-systems.org), где вы найдете ссылки ровать все вызовы накладно и нерационально, то система
на проводимые конференции, новости и некоторую другую работает только с системными вызовами, имеющими пол-
информацию. Задачей проекта ISYS (http://www.aber.ac.uk/ ный доступ к ресурсам компьютера.
~dcswww/ISYS) является разработка теории AIS, исследо-
вание возможности ее применения в конкретных областях
и предоставление инструмента, позволяющего самому со-
брать и испытать такую систему. Самая большая коллек-
ция ссылок по теме AIS расположена по адресу: http://
www.dca.fee.unicamp.br/~lnunes/immune.html, плюс здесь вы
найдете руководство, и несколько алгоритмов, демонстри-
рующих работу AIS в Matlab.
Единственным русскоязычным материалом по защите
компьютеров при помощи AIS, является статья Алексея
Гвозденко «Искусственные иммунные системы как средство
сетевой самозащиты» (http://itc.ua/article.phtml?ID=4270).
Computer Immune Systems (http://www.cs.unm.edu/
~immsec) – единственный найденный проект по примене-
нию AIS для защиты компьютеров. Интересен он еще и по-
тому, что предоставляет не только теоретические наработ- Ðèñóíîê 2
ки, но и код. STIDE (Sequence Time-Delay Embedding) – также был
Идеи от иммунологии применительно к сегодняшним призван помочь в обнаружении внедрений, распознавая
проблемам компьютерной безопасности нашли здесь реа- необычные эпизоды системных вызовов. В процессе обу-
лизацию в четырех методах детектирования, которые не чения stide формирует базу данных из всех уникальных,
только способны обнаружить аномалии, запоминают их и непрерывных системных вызовов и затем делит их на час-
позволяют автоматически среагировать на вторжение. ти предопределенной фиксированной длины. Во время ра-
Сетевая система обнаружения атак Lisys для обнаруже- боты stide сравнивает эпизоды, полученные при новых трас-

50
безопасность
сировках с уже имеющимися в базе данных, и сообщает о вольно проблематично, то для реализации этой идеи исполь-
критерии аномалии, указывающем, сколько новых вызовов зуется x86 эмулятор Valgrind (http://valgrind.kde.org), перво-
отличаются от нормы. начально предназначенный для отладки памяти. На нынеш-
RISE (Randomized Instruction Set Emulation Building) – эта нем этапе RISE представляет собой скорее концепцию, так
разработка, основанная на документе «Diverse Computer как Valgrind сильно замедляет процесс, и для нормальной
Systems» (http://www.cs.unm.edu/~immsec/publications/hotos- работы эмулятору требуется большая оптимизация. Работа-
97.pdf) являет собой попытку решения еще одной из про- ет RISE (как и остальные утилиты, кроме lisys ) пока только с
блем – однородности компьютерных систем. Как и в приро- ядрами 2.2 и 2.4, поэтому при попытке собрать с ядром се-
де, если какой-то вид становится доминирующим, то он ста- рии 2.6, скорее всего, получите такое сообщение.
новится подвержен болезням, заражению и пр. В компью-
checking for the kernel version... unsupported (2.6.4-52-default)
терном мире ситуация аналогична. Сегодня стараются де- configure: error: Valgrind works on kernels 2.2 and 2.4
лать компьютерные системы более совместимыми и более
легкими для использования, и как результат, сейчас можно Еще один проект Computational Immunology for Fraud
встретить в одной сети несколько сотен компьютеров прак- Detection (CIFD) (http://www.icsa.ac.uk/CIFD) занимается раз-
тически одинаковой конфигурации, и когда уязвимость най- работкой системы защиты на базе технологии AIS, кото-
дена, получается весьма благодатная почва для размноже- рую затем планируется использовать в почтовой службе
ния компьютерных вирусов и для вторжения. Эффекта ран- Англии, но на момент написания статьи проект предостав-
домизации можно достигнуть, изменяя исходные коды про- лял только общую информацию о разработках.
граммы, при трансляции, в момент загрузки, комбинируя эти AIS – относительно новая область исследований. Изучая
и другие способы. Все они имеют как положительные, так и и подражая механизмам естественной иммунной системы,
отрицательные стороны. В RISE рандомизируются некото- можно получить довольно эффективные решения. Так, но-
рые инструкции исполняемого двоичного файла в момент вый подход к обнаружению атак, примененный в компонен-
загрузки, для этого они складываются XOR с неким случай- тах Computer Immune Systems, позволяет выявить и остано-
ным числом. Этот способ имеет ряд преимуществ, так, не вить широкое разнообразие атак, при этом такие системы
надо хранить измененные программы, возможно использо- не требуют модификаций и минимальной администрации, так
вание нового ключа при каждом исполнении, не требуется как способны самостоятельно адаптироваться к новым уг-
исходный код, не требуется настройка. Такой компьютер с розам, при этом потребляют незначительное количество си-
«индивидуализированной» системой команд будет иметь стемных ресурсов. Остается надеяться, что подобные раз-
большую устойчивость к уязвимостям, вроде переполнения работки в скором времени выберутся из концептуального
буфера. Так как изменить системы команд процессора до- состояния и станут доступны для широкого использования.

№11(24), ноябрь 2004 51


сети

ПАССИВНЫЙ ПЕРЕХВАТ ТРАФИКА

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

ПАВЕЛ ЗАКЛЯКОВ
Перехват сетевого трафика может использоваться по раз- 2. Использование отдельного компьютера для перехвата
ным причинам, но цель у него одна – отслеживать всё про- трафика совместно с коммутаторами, имеющими порт
исходящее на определённом участке в сети. Это может быть для мониторинга или концентраторами [4]. В разрыв ис-
как мониторинг сети с целью выявления тех или иных ню- следуемого участка сети ставится коммутатор или кон-
ансов в штатном режиме работы, так и обнаружение сете- центратор, а уже к нему подключается отдельный ком-
вых атак или выявление нежелательного трафика. Я думаю, пьютер, занимающийся анализом прошедшего трафи-
читатель cталкивался не с одной задачей, где без перехва- ка. Данный способ не зависит от других компьютеров в
та трафика не обойтись. Реализация перехвата может быть сети и используемого ими программного обеспечения.
осуществлена несколькими способами:
1. Программная реализация на одном из штатно исполь-
зуемых узлов. Например, можно запустить tcpdump,
windump или подобные программы на исследуемых уз-
лах и далее наблюдать за выводимой ими информаци-
ей. Этот способ хорош отсутствием дополнительных зат-
рат, но плох тем, что, во-первых, потребляются ресурсы
процессора, во-вторых, прослушивание трафика можно
отследить и обойти. В-третьих, он платформо-зависи- Ðèñóíîê 2. Ïåðåõâàò òðàôèêà íà áàçå êîììóòàòîðà ñ ïîðòîì
мый, т.е. на разных платформах используются разные ìîíèòîðèíãà
программы, порой несовместимые между собой даже 3. Использование отдельного компьютера в мостовом
по формату. По данной схеме, например, может быть включении на исследуемом участке. Этот способ не-
организовано прослушивание трафика на базе шлюза. сколько лучше предыдущего тем, что при желании мож-
но организовать не только пассивный просмотр трафи-
ка, но и фильтрацию и подмену, т.е. влиять на проходя-
щий трафик. Отличие от первого способа состоит в том,
что работа с трафиком ведётся на более низком уровне
(на канальном, против сетевого в случае шлюза). Как
следствие, стандартными средствами вроде traceroute
удалённо обнаружить факт подключения (прослушива-
Ðèñóíîê 1. Ïåðåõâàò òðàôèêà íà áàçå øëþçà ïîä óïðàâëåíèåì
ÎÑ Linux ния и фильтрации) невозможно.

52
сети
рудования. Оборудование «посередине» может зависнуть.
В случае использования разных по скорости сетевых карт
или разных режимов работы может оказаться, что одна кар-
та работает в режиме 100 Мбит/c в полном дуплексе, а со-
ставляющая ей пару на другом конце провода умудряется
работать со скоростью 10 Мбит/c без дуплекса. Отключив
кабель с одной стороны, можно долго удивляться тому, как
на другой стороне индикатор «link» почему-то светится и не
Ðèñóíîê 3. Ïåðåõâàò òðàôèêà íà áàçå ìîñòà ïîä óïðàâëåíèåì гаснет, и наоборот. Подозрение сразу перейдёт на кабель, а
ÎÑ Linux
простое подёргивание его с любой стороны от загадочного
4. Использование пассивного подключения к кабелю без места внутри стены рано или поздно приведёт к «секретной
его разрыва на физическом уровне. Используется со- комнате» и перехват будет обнаружен. Если всё же исклю-
вместно с компьютером для обработки перехваченных чить ситуации, описанные выше, а вероятность зависания
данных. Так как физический уровень самый низкий из оборудования «посередине» сделать очень низкой, исполь-
всех, то обнаружить такое подключение на канальном зовав различные схемы контроля и перезапуска, то от за-
уровне и выше практически невозможно. Правильнее держек при передаче пакетов избавиться не получится. Лю-
будет сказать, что программно такое подключение об- бое активное оборудование вносит задержки в распростра-
наружить нельзя. нение пакетов [1, стр. 320], задержки малы, но их можно из-
мерить и также заподозрить неладное.
Четвёртый способ пассивного перехвата при правиль-
ной реализации обнаружить довольно сложно, если не ска-
зать что невозможно при здравом уме и ограниченных фи-
нансах. Именно подобным образом я и предлагаю физи-
чески скрыть подключение1.

Ðèñóíîê 4. Ïåðåõâàò òðàôèêà íà áàçå ôèçè÷åñêîãî ïîäêëþ÷åíèÿ


Оценим эти способы с точки зрения осуществления
скрытного перехвата. Первый способ однозначно не под-
ходит, так как программу, осуществляющую просмотр тра-
фика можно обнаружить и отключить. Даже если она хоро-
шо спрятана и обнаружить её не получается, можно исполь-
зовать «проверенный дедовский способ» – отформатиро- Ðèñóíîê 5. Ñîêðûòèå ìåñòà ïîäêëþ÷åíèÿ â ñòåíå
вать винчестер и установить систему заново. Причём не Далее предлагаю на этом пункте не останавливаться, а
важно, сервер это или клиентский компьютер – в любом перейти к технической реализации задуманного.
случае работает одинаково хорошо. Для наглядности выполним подключение на макете,
Второй способ, как и третий, легко обнаружить физичес- использовав небольшой кусочек кабеля. Для всей опера-
ки. Лишний бесхозный концентратор и/или компьютер быст- ции нам понадобятся:
ро найдутся и привлекут к себе внимание, если их не спря- ! кабель, к которому мы будем подключаться;
тать в отдельной комнате. Возможно, подозрений не возник- ! кросскорд (для патчкорда придётся самостоятельно по-
ло бы, если не «активная составляющая» используемого обо- менять пары местами);

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

№11(24), ноябрь 2004 53


сети
! кусачки;
! паяльник;
! изолирующие материалы.

Вначале аккуратно счищаем изоляцию с подключаемо-


го кабеля.

Ðèñóíîê 9. Ïîäïàÿííûå îòâîäû(ìåñòî ïàéêè óâåëè÷åíî)


Ðèñóíîê 6. Êóñîê êàáåëÿ ñî ñíÿòîé îáùåé èçîëÿöèåé
Далее зачищаем места для подпайки отводов на бело- Далее изолируем место пайки. На стенде это сделано с
зелёной и бело-оранжевой парах и облуживаем их. помощью изоленты, но если есть возможность сделать это
более основательно (заранее), то можно использовать тер-
моусаживающиеся кембрики. А вместо отвода использо-
вать одну витую пару, сделав её расчленение на два разъё-
ма уже на конце, затем, чтобы место подключения по воз-
можности сильно не утолщалось.

Ðèñóíîê 7. Çà÷èùåííûå è îáëóæåííûå ìåñòà äëÿ ïîäïàéêè


Далее разрезаем кросскорд. Зачищаем у него соответ-
ствующие по цвету провода и подпаиваемся к основному ка-
белю так, чтобы цвета совпали и оранжевая пара пошла на
разводку EIA/TIA T568A, а зелёная – на T568B. В результате
подпаиваемые концы в обоих случаях должны приходить на
3-й и 6-й контакты разъёмов.

Ðèñóíîê 10.Çàèçîëèðîâàííîå ìåñòî ïîäêëþ÷åíèÿ


Если подключение не надо никуда прятать, то его мож-
но сделать стационарным и обойтись без пайки, использо-
вав для этих целей соответственно разведённую патч-па-
нель с розетками. Схему разводки представить довольно
несложно (см. рис. 11).
Но если всё же непонятно, то наглядно и подробно это
описано в [2].
Система готова к подключению и испытаниям. Но преж-
де чем это сделать, давайте рассмотрим, как это должно
работать в теории.
Если взять техническую спецификацию организации
сети, то можно узнать, что для передачи данных использу-
ются только две пары, к которым мы подключились, при
этом назначение части контактов на разъёмах сетевых карт
Ðèñóíîê 8. Ïîäïàÿííûå îòâîäû äëÿ ñíÿòèÿ ñèãíàëà следующее.

54
сети
! 1 – передача + поэтому влиять на передаваемый сигнал они никак не мо-
! 2 – передача - гут.
! 3 – приём + Если, например, запустить tcpdump для прослушива-
! 6 – приём - ния на одном интерфейсе, то он будет перехватывать толь-
ко данные, передаваемые в одну сторону, если же на дру-
гом – в другую. Если запустить две копии tcpdump с разны-
ми конфигурациями, то потом создание одного лог-файла
из двух потребует усилий. При этом невозможно использо-
вать другие средства, работающие в реальном времени и
отслеживающие трафик в обоих направлениях.
Для объединения трафика «из двух в один» я предла-
гаю использовать технологию Linux bonding, описанную
мной в [3]. После чего нет ничего проще запустить tcpdump,
snort или любую другую программу стандартным способом:
на интерфейсе bond0 и наслаждаться их работой.
Замечание. В принципе, если не прибегать к Linux bonding,
можно попытаться объединить снятые данные с помощью
всё того же коммутатора с функцией мониторинга портов.
Тогда он будет объединять данные с двух портов. Всё бы
хорошо, но для данной реализации придётся поменять раз-
водку А и B местами, так как в коммутаторах она обратная
(контакты 1 и 2 работают на приём). Надо найти коммута-
тор с описанной выше функцией. Обычный не факт, что
захочет работать. А самое главное, следует понимать, что
сплошной поток в 200 Мбит передать в 100 Мбит никак не
получится, поэтому при достаточной нагрузке это дело ра-
ботать не будет, а использование концентраторов вообще
невозможно по причине большой вероятности коллизий.
Что и греха таить, больше половины хороших программи-
стов вообще далеки от понимания сути происходящих про-
цессов на физическом уровне. А каждая вторая книжка
по безопасности, взять ту же [4], предлагает подключать
сенсоры систем обнаружения атак, как показано на рис. 2.
Естественно, при возрастании загрузки в сети за 50%
часть атак уже принципиально не может быть обнаруже-
на, даже если для всех атак будут записи в сигнатурной
базе данных. Данные ведь передаются по обоим парам
одновременно, а собирать их пытаются каналом вдвое мень-
шим. Только недавно стали широко доступны коммутато-
Ðèñóíîê 11. Ñõåìà ðàçâîäêè äëÿ ÷åòûð¸õ ðîçåòîê è ôîòî ры с портами на 1 Гбит. Да, по такому порту можно снимать
îäíîé ðîçåòêè данные со 100-мегабитной сети без потерь, но где гаран-
То есть по четырём проводам (две пары) идут данные в тия что сеть тоже не будет работать на такой же скорости и
прямом и обратном направлениях. К этим проводам можно тогда ситуация повторится. Половины пропускной способ-
подсоединить отводы. Один отвод будет снимать сигналы, ности в нужный момент не хватит. Вот и получается, что с
идущие в одном направлении, другой – в обратном. Пере- финансовой точки зрения проще установить вторую про-
вести обратно в «электронную форму» грубо снятый физи- стенькую сетевую карту и настроить Linux bonding. Дёше-
ческий сигнал можно с помощью тех же сетевых плат, ис- во и сердито.
пользовав только схему их приёмной части, подключив к
ней отводы. При этом если сетевые карты перевести в ре- Литература, ссылки:
жим прослушивания (promiscuous mode), то можно будет 1. Олифер В.Г., Олифер Н.А. Компьютерные сети. Прин-
перехватывать проходящий сетевой трафик. Так как входы ципы, технологии, протоколы. – СПб: Питер, 2001 г.
сетевых карт высокоомные, то подключение на передачу 2. Construction and Use of a Passive Ethernet Tap: http://
данных влиять не должно. Предполагаю, что если подклю- www.snort.org/docs/tap.
чение сделать аккуратно, то волновых эффектов вроде от- 3. Закляков П. На пути повышения надёжности и скорос-
ражённых и стоячих волн (что частенько встречались в ко- ти: Linux bonding. – Журнал «Системный администра-
аксиальном Ethernet без терминаторов) можно избежать. тор», №10, октябрь 2004 г. – 54-58 c.
На длинных (около 100 м) кусках кабеля подключаться я не 4. Лукацкий А.В. Обнаружение атак. – СПб: БХВ-Петер-
пробовал. Выходы (сетевых карт, осуществляющих прослу- бург, 2001 г., 432-437 c.
шивание), работающие на передачу, «висят в воздухе»,

№11(24), ноябрь 2004 55


hardware

ЗАПИСЬ ДИСКОВ CD-R/RW В LINUX


ЧАСТЬ 1

ВЛАДИМИР МЕШКОВ
В данной статье рассматриваются примеры использования ных субканала размечен на битовые позиции, и, таким об-
мультимедийных команд стандарта SCSI (SCSI Multimedia разом, субканал делится еще на 8 субканалов.
Commands–4, MMC-4) для записи на лазерные диски CD-R/
RW различной информации – музыкальных треков и данных.
В первой части статьи рассматриваются вопросы орга- Ðèñóíîê 2. Ôîðìàò áàéòà äàííûõ ñóáêàíàëà
низации хранения данных на компакт-диске, порядок ис- В одном кадре для каждого из этих субканалов содер-
пользования SCSI Generic-драйвера для доступа к устрой- жится по 96 бит (12 байт) информации.
ству чтения/записи компакт-дисков, определения парамет- Из всех имеющихся в наличии субканалов основную
ров конфигурации устройства и управления режимами ра- информационную нагрузку несет Q-субканал. В нем содер-
боты устройства жится адресная информация кадра, информация о логичес-
Работоспособность всех примеров программ была про- кой структуре компакт-диска, идентификационная инфор-
верена для ОС Linux, ядро 2.4.27. Модель привода для чте- мация диска или музыкального трека. Рассмотрим формат
ния и записи компакт-дисков – TEAC CD-W524E Rev 1.0E. данных Q-субканала. Q-субканал содержит:
Привод подключен как Secondary Master, в ядре включены ! 2 бита синхронизации (S0, S1);
поддержка SCSI Generic-драйвера и режим SCSI-эмуляции ! 4 бита поля управления (Control Field);
для ATAPI-устройств (SCSI host adapter emulation for IDE ! 4 бита идентификатора режима данных Q-субканала
ATAPI devices). (ADR);
! 72 бита (9 байт) данных (DATA-Q);
Физический формат данных ! 16 контрольной суммы полей управления, режима дан-
на компакт-диске ных и поля данных (CRC).
Данные, записанные на компакт-диск, представляют собой
последовательность малых кадров, small frame. Поле Control Field определяет тип информации, которая
находится в основном канале кадра. Это поле может при-
нимать следующие значения:
! 00x0b – 2 аудиоканала без предыскажения;
Ðèñóíîê 1. Ôîðìàò ìàëîãî êàäðà ! 00x1b – 2 аудиоканала, предыскажения 50/15 мкс;
Малый кадр содержит: ! 10x0b – 4 аудиоканала без предыскажений;
! 3 байта кода синхронизации; ! 10x1b – 4 аудиоканала, предыскажения 50/15 мкс;
! 1 байт данных субканала; ! 01x0b – трек данных, непрерывный режим записи (Disk-
! 24 байта данных основного канала (две группы по 12 at-once, DAO);
байт); ! 01x1b – трек данных, инкрементный режим записи
! 8 байт помехоустойчивого корректирующего кода CIRC, (Track-at-once (TAO), Session-at-once (SAO));
Cross Interleaved Read-Solomon Code (две группы по 4 ! 11xxb – зарезервировано.
байта).
Поле режима данных Q-субканала ADR определяет
Общая длина данных малого кадра составляет 36 байт. формат данных Q-субканала. Подробное описание форма-
При записи на компакт-диск данные субканала, основ- тов данных Q-субканала находится в спецификации SCSI
ного канала и CIRC кодируются 14-разрядными EFM-кодом MMC-4 ([1]), п. 4.2.4.4 «Q Sub-channel».
(Eight to Fourteen Modulation). Дополнительно к каждому Блок данных основного канала предназначен для хра-
полю добавляются три связывающих бита. Итоговый раз- нения информации – аудио или данных. У компакт-дисков,
мер малого кадра, записанного на компакт-диск, равен 588 используемых для хранения аудио-информации, все 2352
бит (рис.1). 98 последовательно расположенных малых кад- байт блока основного канала заняты аудиоданными. Для
ров образуют кадр (Frame), или сектор, минимально адре- хранения данных используется 6 основных форматов бло-
суемую единицу данных на компакт-диске. Один кадр со- ка основного канала. Наиболее широкое применение полу-
держит 24 x 98 = 2352 байт данных основного канала и 98 чили три формата:
байт субканала. Эти 98 байт в свою очередь делятся на 2 ! режим данных 1, Yellow Book Mode 1;
байта синхронизации и 96 байт данных. Каждый байт дан- ! форма 1 режима данных 2, CD-ROM XA Mode 2 Form 1;

56
hardware
! форма 2 режима данных 2, CD-ROM XA Mode 2 Form 2.

Блок основного канала, содержащий данные, начина-


ется с поля синхронизации Data Block Sync Pattern длиной
12 байт (рис. 3). За полем синхронизации находится заго-
ловок блока Header данных длиной 4 байт. Заголовок бло-
ка содержит координаты блока данных в формате MSF
(Minute/Second/Frame) и байт формата записи данных Data
Mode. Значение формата блока содержат биты 0-1 байта Ðèñóíîê 5. Îáùàÿ ñòðóêòóðà ìíîãîñåññèîííîãî êîìïàêò-äèñêà
Data Mode. Lead-In-область первой сессии является Lead-In-облас-
тью всего диска. Lead-Out-область последней сессии явля-
ется Lead-Out-областью диска. В User Data-области любой
Ðèñóíîê 3. Ñòðóêòóðà ïîëÿ ñèíõðîíèçàöèè Data Block Sync Pattern сессии находятся треки с данными.
Формат данных Mode 1 представлен в таблице 1, форма- Диски CD-R и CD-RW содержат две дополнительные
ты данных Mode 2 Form 1 и Mode 2 Form 2 – в таблицах 2 и 3. области перед первой Lead-In-областью компакт-диска –
Òàáëèöà 1. Mode 1 data format Power Calibration Area (PCA) и Program Memory Area (PMA).

Òàáëèöà 2. Mode 2 Form 1 data format

Ðèñóíîê 6. Ñòðóêòóðà CD-R è CD-RW äèñêà


The Power Calibration Area, PCA – область калибровки
мощности пишущего лазера. Область присутствует только
на CD-R и CD-RW дисках. В свою очередь, PCA делится на
две области – тестовую область (test area) и область счет-
Òàáëèöà 3. Mode 2 Form 2 data format чика (count area).
Тестовая область содержит 100 калибровочных участ-
ков. Область счетчика используется для учета количества
использованных калибровочных участков. Для калибровки
мощности пишущего лазера используется последователь-
ность команд READ DISK INFORMATION/SEND OPC
INFORMATION (см. [1]).
Пространство CD-ROM делится на три области (рис. 4): The Program Memory Area, PMA – область памяти про-
! Lead-In Area, входная область диска. грамм. Область присутствует только на CD-R и CD-RW дис-
! User Data Area, область данных пользователя, или об- ках и предназначена для учета использования User Data-
ласть программ. области носителя. Q-субканал области PMA используется
! Lead-Out Area, выходная область диска. в качестве временной TOC при записи треков в инкремен-
тном режиме – Track-at-once (TAO), Session-at-once (SAO).
Ðèñóíîê 4. Îáùàÿ ñòðóêòóðà CD-ROM При записи диска в режиме Disk-at-once (DAO) данные в
Lead-In-область предназначена для хранения информа- PMA не записываются.
ции об организации данных на компакт-диске. Q-субканал
Lead-In-области содержит таблицу содержания диска, Table SCSI Generic-драйвер. Общие сведения
Of Contents (TOC). В TOC хранится информация о сессиях SCSI Generic-драйвер (далее sg-драйвер) входит в состав
и стартовых адресах треков. Пример чтения и описания фор- ядра Linux и позволяет приложению пользователя посылать
мата Q-субканала Lead-In-области (TOC) приведен в [5]. SCSI-команды устройству при условии, что устройство эти
В User Data Area находятся треки с данными пользова- команды понимает. Доступ к sg-драйверу выполняется че-
теля. Минимальное число треков, которое может быть запи- рез специальные файлы устройства, которые находятся в
сано на компакт-диск, равно 1. Максимальное число треков каталоге /dev. Список некоторых файлов можно получить
на диске равно 99. Треки нумеруются начиная с единицы. при помощи команды:
Совокупность всех трех областей – Lead-In, User Data, # ls -l /dev/sg[01]
Lead-Out – называется сессией. Любой CD-ROM, содержа- crw------- 1 root root 21, 0 Apr 13 /dev/sg0
щий информацию, имеет минимум одну сессию. Максималь- crw------- 1 root root 21, 1 Apr 13 /dev/sg1

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

№11(24), ноябрь 2004 57


hardware
Обращение к SCSI-устройству через sg-драйвер выпол- ! iovec_count – если это поле равно 0, то буфер для дан-
няется при помощи системного вызова ioctl следующим ных представляет собой простой линейный массив байт,
образом: и поле dxferp – указатель на этот массив. В противном
случае dxferp указывает на массив структур типа:
ioctl(sg_fd, SG_IO, struct sg_io_hdr *)
typedef struct sg_iovec {
void * iov_base; /* starting address */
Первый параметр sg_fd – это дескриптор файла sg-уст- size_t iov_len; /* length in bytes */
ройства /dev/sg*, открытого при помощи системного вызо- } sg_iovec_t,
ва open( ). Третий параметр – структура следующего типа:
а поле iovec_count – число структур в этом массиве.
typedef struct sg_io_hdr
{
int interface_id; /*'S' for SCSI generic (required) */ Подробная информация о sg-драйвере приведена в
int dxfer_direction; /* data transfer direction */ SCSI-Generic-HOWTO [4].
unsigned char cmd_len; /* SCSI command length ↵
( <= 16 bytes) */ Рассмотрим порядок использования sg-драйвера на
unsigned char mx_sb_len; /* max length to write to sbp */ примере чтения PMA (Program Memory Area) CD-R/RW дис-
unsigned short iovec_count; /* 0 implies no scatter ↵
gather */ ка. Для чтения PMA устройству необходимо послать коман-
unsigned int dxfer_len; /* byte count of data transfer */ ду READ TOC/PMA/ATIP. Формат этой команды описан в
void * dxferp; /* points to data transfer memory ↵
or scatter gather list */ [1], пример использования был рассмотрен в [5]. Для чте-
unsigned char * cmdp; /* points to command to perform */ ния PMA поле Format должно содержать значение 0011b. В
unsigned char * sbp; /* points to sense_buffer memory */
unsigned int timeout; /* MAX_UINT->no timeout ↵ ответ на команду READ TOC/PMA/ATIP устройство вернет
(unit: millisec) */ блок данных следующего формата:
unsigned int flags; /* 0 -> default, see SG_FLAG... */
int pack_id; /* unused internally (normally) */
void * usr_ptr; /* unused internally */
unsigned char status; /* scsi status */
unsigned char masked_status; /* shifted, masked scsi ↵
status */
unsigned char msg_status; /* messaging level data ↵
(optional) */
unsigned char sb_len_wr; /* byte count actually ↵
written to sbp */
unsigned short host_status; /* errors from host adapter */
unsigned short driver_status; /* errors from ↵
software driver */
int resid; /* dxfer_len - actual_transferred */
unsigned int duration; /* time taken by cmd ↵
(unit: millisec) */
unsigned int info; /* auxiliary information */
} sg_io_hdr_t; /* 64 bytes long (on i386) */

Данная структура определена в файле <scsi/sg.h>. На-


значение основных полей структуры:
! interface_id – это поле должно содержать литеру «S»; Ðèñóíîê 7. Ôîðìàò äàííûõ PMA, Format Field = 0011b
! dxfer_direction – направление передачи данных. Поле мо- Поле PMA Data Length содержит размер данных PMA,
жет принимать следующие значения (см. <scsi/sg.h>): при этом длина самого поля (2 байта) не учитывается. На-
! #define SG_DXFER_NONE (-1) – нет обмена данны- значение каждого байта дескриптора PMA определяется
ми; значением поля ADR:
! #define SG_DXFER_TO_DEV (-2) – передача данных Òàáëèöà 4
устройству;
! #define SG_DXFER_FROM_DEV (-3) – прием данных
от устройства.
! cmdp – указатель на командный пакет, посылаемый ус-
тройству;
! cmd_len – размер командного пакета. Если для ATAPI-
устройств размер командного пакета фиксирован и ра-
вен 12 байт, то для SCSI-устройств размер пакета мо-
жет принимать значения 6, 10, 12 и 16 байт;
! sbp – указатель на буфер SENSE DATA (данные о со-
стоянии устройства после выполнения команды, [1, 5]); Заголовочные файлы:
! mx_sb_len – максимальный размер буфера SENSE DATA;
! sb_len_wr – реальный размер данных, сохраненных в бу- #include
#include
<stdio.h>
<fcntl.h>
фере SENSE DATA; #include <errno.h>
! dxferp – указатель на буфер для данных, принимаемых #include
#include
<scsi/scsi.h>
<scsi/sg.h>
от устройства или передаваемых устройству; #include <linux/types.h>
! dxfer_len – размер передаваемых/принимаемых данных; #include <linux/byteorder/swab.h>

58
hardware
#define SG_DEV "/dev/sg0" // èìÿ ôàéëà óñòðîéñòâà if(io_hdr.host_status)
// Ìàêðîñ äëÿ ïåðåñ÷åòà êîîðäèíàò ñåêòîðà èç MSF ôîðìàòà â LBA printf("Host_status=0x%x\n", ↵
#define MSF2LBA(Min, Sec, Frame) (((Min * 60 + Sec) * ↵ io_hdr.host_status);
75 + Frame) - 150) if(io_hdr.driver_status)
int sg_fd; // ôàéëîâûé äåñêðèïòîð printf("Driver_status=0x%x\n", ↵
io_hdr.driver_status);
Следующая структура описывает формат данных PMA, return -1;
представленный на рис. 7: }
return 0;
}
typedef struct {
__u8 rez; // reserved
__u8 ctrl :4; // Control Проверку готовности устройства к приему команды вы-
__u8 adr :4; // ADR полняет функция test_unit_ready():
__u8 tno; // TNO (always 0)
__u8 point; // POINT
__u8 min; // AMIN int test_unit_ready()
__u8 sec; // ASEC {
__u8 frame; // AFRAME __u8 testCmdBlk[6];
__u8 zero; // 0 /* Prepare TEST UNIT command */
__u8 pmin; // PMIN memset(testCmdBlk, 0, 6);
__u8 psec; // PSEC if(send_cmd(testCmdBlk, 6, SG_DXFER_NONE, NULL, ↵
__u8 pframe; // PFRAME 0, 20000) < 0) {
} __attribute__ ((packed)) pma_t; printf("Unit not ready\n");
return -1;
Обмен данными с sg-драйвером выполняет функция }
return 0;
send_cmd(). Параметры функции: }
! cmd – указатель на командный пакет;
! cmdlen – длина командного пакета; Чтение PMA выполняет функция read_pma():
! direction – направление передачи данных;
! data – указатель на блок памяти для данных, передава- int read_pma()
{
емых устройству или принимаемых от устройства. Если int i, k;
обмен данными не предусмотрен, этот параметр содер- __u8 read_pma_cmd[10];
__u8 *pma_data_buff; // çäåñü áóäóò ñîõðàíåíû ↵
жит значение NULL; ðåçóëüòàòû ÷òåíèÿ PMA
! datalen – размер блока данных, на который указывает __u16 buff_size = 0xFFFF; // ðàçìåð áëîêà ïàìÿòè ↵
äëÿ õðàíåíèÿ ñ÷èòûâàåìûõ äàííûõ
data. Если data == NULL, то datalen == 0 __u16 pma_data_length = 0; // ðåàëüíàÿ äëèíà çàïèñåé PMA
! timeout – значения time-out. __u32 lba;
int pma_entries = 0; // ÷èñëî çàïèñåé PMA
pma_t *pma;
int send_cmd(__u8 *cmd, __u8 cmdlen, unsigned int direction, ↵ /* Ïðîâåðÿåì ãîòîâíîñòü óñòðîéñòâà ê ïðèåìó êîìàíäû */
__u8 *data, __u32 datalen, unsigned int timeout) if(test_unit_ready() < 0) exit(-1);
{ pma_data_buff = (__u8 *)malloc(buff_size);
int k = 0; memset(pma_data_buff, 0, buff_size);
sg_io_hdr_t io_hdr; /* Ôîðìèðóåì êîìàíäíûé ïàêåò */
/* Â sense_buffer áóäåò ñîõðàíåíà èíôîðìàöèÿ î ñîñòîÿíèè memset(read_pma_cmd, 0, 10);
* óñòðîéñòâà ïîñëå âûïîëíåíèÿ êîìàíäû read_pma_cmd[0] = 0x43; // êîä êîìàíäû READ_TOC/PMA/ATIP
*/ read_pma_cmd[2] = 3; // ïîëå Format Field = 011b, ↵
__u8 sense_buffer[32]; ÷èòàåì PMA
/* Ôîðìèðóåì çàïðîñ ê sg-äðàéâåðó – çàïîëíÿåì ïîëÿ read_pma_cmd[7] = 0xFF;
* ñòðóêòóðû sg_io_hdr_t íåîáõîäèìûìè çíà÷åíèÿìè read_pma_cmd[8] = 0xFF;
*/ /* Ïîñûëàåì óñòðîéñòâó êîìàíäó */
memset(&io_hdr, 0, sizeof(sg_io_hdr_t)); if(send_cmd(read_pma_cmd, 10, SG_DXFER_FROM_DEV, ↵
io_hdr.interface_id = 'S'; pma_data_buff, buff_size, 20000) < 0) return -1;
io_hdr.cmd_len = cmdlen; // äëèíà êîìàíäû /* Ñ÷èòûâàåì äëèíó çàïèñåé PMA. Ðàçìåð ïîëÿ PMA Data Length
io_hdr.mx_sb_len = sizeof(sense_buffer); * (2 áàéòà) íå ó÷èòûâàåòñÿ
io_hdr.dxfer_direction = direction; // íàïðàâëåíèå ↵ */
ïåðåäà÷è äàííûõ memcpy(&pma_data_length, pma_data_buff, 2);
io_hdr.dxfer_len = datalen; // ðàçìåð äàííûõ pma_data_length = __swab16(pma_data_length);
io_hdr.dxferp = data; // óêàçàòåëü íà áëîê äàííûõ printf("PMA data length - %d\n", pma_data_length);
io_hdr.cmdp = cmd; // óêàçàòåëü íà êîìàíäíûé ïàêåò /* Îïðåäåëÿåì ÷èñëî çàïèñåé PMA */
io_hdr.sbp = sense_buffer; pma_entries = (pma_data_length - 2)/11;
io_hdr.timeout = timeout; printf("PMA entries - %d\n", pma_entries);
/* Ïîñûëàåì óñòðîéñòâó êîìàíäó */ /* Ðàçìåð äàííûõ PMA òî÷íî èçâåñòåí è ðàâåí pma_data_length.
if(ioctl(sg_fd, SG_IO, &io_hdr) < 0) { * Âûäåëÿåì áëîê ïàìÿòè äëÿ äàííûõ PMA è êîïèðóåì èõ òóäà
perror("SG_IO ioctl"); * èç pma_data_buff. Ïîñëå ýòîãî ìîæíî îñâîáîäèòü áëîê
return -1; * ïàìÿòè, íà êîòîðûé óêàçûâàåò pma_data_buff
} */
/* Îòîáðàçèì ñîäåðæèìîå sense_buffer, åñëè ïðè âûïîëíåíèè pma = (pma_t *)malloc(pma_data_length);
* êîìàíäû ïðîèçîøëà îøèáêà. Ýòî ïîçâîëèò óñòàíîâèòü memset((void *)pma, 0, pma_data_length);
* ïðè÷èíó îøèáêè memcpy((void *)pma, pma_data_buff + 4, pma_data_length);
*/ free(pma_data_buff);
if((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) { /* Îòîáðàæàåì äàííûå PMA */
if (io_hdr.sb_len_wr > 0) { printf("Entry\tADR\tCTRL\tPoint\tZero\tMin\tSec\ ↵
printf("Sense data: "); tFrame\tPMin\tPsec\tPFrame\tLBA\n");
for (k = 0; k < io_hdr.sb_len_wr; ++k) { for(i = 0; i < pma_entries; i++) {
if ((k > 0) && (0 == (k % 10))) printf("\n "); printf("%d\t", i);
printf("0x%02x ", sense_buffer[k]); printf("%X\t", (pma + i)->adr);
} printf("%X\t", (pma + i)->ctrl);
printf("\n"); printf("%X\t", (pma + i)->point);
} printf("%d\t", (pma + i)->zero);
if(io_hdr.masked_status) printf("%d\t", (pma + i)->min);
printf("SCSI status=0x%x\n", io_hdr.status); printf("%d\t", (pma + i)->sec);

№11(24), ноябрь 2004 59


hardware
printf("%d\t", (pma + i)->frame); Одно устройство может поддерживать несколько свойств.
printf("%d\t", (pma + i)->pmin); Базовый набор свойств устройства называется профилем
printf("%d\t", (pma + i)->psec);
printf("%d\t", (pma + i)->pframe); (Profile). Перечень всех существующих свойств и профилей
lba = MSF2LBA((pma + i)->pmin, (pma + i)->psec, ↵ приведен в спецификации SCSI MMC-4, п. 5 «Features and
(pma + i)->pframe);
if((pma + i)->adr != 1) printf("---\n"); Profiles for Multi-Media Device».
else printf("%u\n", lba); Для того чтобы выяснить, обладает ли устройство тем
}
free(pma); или иным свойством, ему необходимо послать команду GET
return 0; CONFIGURATION. Данная команда определена в специфи-
}
кации [1] и позволяет получить полный список свойств, под-
Вызов функции read_pma() для чтения данных PMA вы- держиваемых устройством и текущий профиль устройства.
полняется из главной функции: Текущий профиль определяет, какие именно свойства дос-
Открываем файл устройства. Обратите внимание на ре- тупны на данный момент. По команде GET CONFIGURATION
жим открытия – чтение/запись. Если устройство открыто в устройство вернет блок данных, состоящий из заголовка
режиме «Только чтение» (O_RDONLY), то оно воспринима- свойства (Feature Header) и списка дескрипторов свойств
ет команды (см. [4]): (Feature Descriptors):
! INQUIRY
! TEST UNIT READY
! REQUEST SENSE
! READ CAPACITY
Ðèñóíîê 8. Ôîðìàò áëîêà äàííûõ, âîçâðàùàåìîãî ïî êîìàíäå
! READ BUFFER GET CONFIGURATION
! READ(6) (10) and (12)
! MODE SENSE(6) and (10)
int main()
{
if((sg_fd = open(SG_DEV, O_RDWR)) < 0) {
perror("open");
return -1;
}
/* Ñ÷èòûâàåì PMA */
if(read_pma() < 0) printf("Cannot read PMA\n"); Ðèñóíîê 9. Ôîðìàò çàãîëîâêà ñâîéñòâà
close(sg_fd);
return 0; Поле Data Length содержит размер считанных данных,
}
следующих за эти полем, в поле Current Profile находится
Полный текст данной программы находится в файле SG/ значение текущего профиля устройства. Если свойство не
read_pma.c. поддерживается устройством, то команда GET CONFIGU-
Устанавливаем в устройство диск CD-RW, на котором RATION вернет только заголовок свойства, и поле Data
записано 3 аудиотрека, и запускаем программу на выпол- Length будет содержать значение 4 (2 поля Reserved по од-
нение. Результаты работы программы: ному байту каждое + 2 байта поля Current Profile).
PMA data length - 46
PMA entries - 4
Entry ADR CTRL Point Zero Min Sec Frame PMin Psec PFrame LBA
0 2 0 0 0 54 88 82 0 0 0 ---
1 1 0 1 0 5 3 16 0 2 0 0
2 1 0 2 0 8 28 58 5 5 16 22741
3 1 0 3 0 12 30 21 8 30 58 38158

Для анализа полученных результатов воспользуемся


таблицей 4. Ðèñóíîê 10. Îáùèé ôîðìàò äåñêðèïòîðà ñâîéñòâà
Назначение полей дескриптора свойства:
! Feature Code – код свойства. Каждое свойство имеет
свой уникальный код. Список всех кодов приведен в спе-
цификации [1], п. 5.3 «Feature Definitions».
! Persistent – если этот бит установлен в 0, то данное свой-
ство может менять текущий статус. Если бит равен 1,
то свойство всегда активно.
Свойства, профили и страницы ! Current – если бит установлен в 1, то данное свойство
режимов устройства активно, т.е. устройство поддерживает набор команд,
определенный этим свойством.
Свойства и профили устройства ! Feature Dependent Data – данные, специфичные для ука-
Прежде чем послать устройству какую-либо команду, надо занного свойства.
убедиться в том, что устройство способно эту команду вы-
полнить. Для этого необходимо установить, какие именно Назначение полей командного пакета:
команды поддерживает устройство. Набор команд, поддер- ! RT – определяет тип данных, возвращаемых устрой-
живаемых устройством, называется свойством (Features). ством. Поле может принимать следующие значения:

60
hardware
! 00b – устройство возвращает заголовок свойства и /* Ïîñûëàåì óñòðîéñòâó êîìàíäó */
if(send_cmd(get_conf_cmd, 10, SG_DXFER_FROM_DEV, ↵
дескрипторы всех свойств, поддерживаемых устрой- data_buff, 16, 20000) < 0) return -1;
ством, даже если свойство не является активным. /* Îïðåäåëÿåì äëèíó ñ÷èòàííûõ äàííûõ */
memcpy((void *)&data_length, data_buff, 4);
! 01b – устройство возвращает заголовок свойства и data_length = __swab32(data_length);
дескрипторы активных свойств устройства (у кото- printf("\nFeature data length - %u\n", data_length);
/* Åñëè äëèíà ñ÷èòàííûõ äàííûõ ðàâíà 4, òî çàïðàøèâàåìîå
рых бит Current установлен в единицу). * ñâîéñòâî íå ïîääåðæèâàåòñÿ
! 10b – устройство возвращает заголовок и дескрип- */
if(data_length == 4) return -1;
тор свойства, номер которого задан в поле Starting /* Îïðåäåëÿåì çíà÷åíèå òåêóùåãî ïðîôèëÿ */
Feature Number. Если запрашиваемое свойство не memcpy((void *)&current_prof, data_buff + 6, 2);
current_prof = __swab16(current_prof);
поддерживается устройством, возвращается только printf("Current profile - 0x%.4X\n", current_prof);
заголовок свойства Feature Header (рис. 9). /* Êîä ñâîéñòâà, çíà÷åíèå äîëæíî ñîâïàäàòü
* ñ ïàðàìåòðîì f_num
! 11b – зарезервировано. */
! Allocation Length – размер памяти, выделенной для дан- memcpy((void *)&f_code, (data_buff + 8), 2);
f_code = __swab16(f_code);
ных. printf("Feature Code - 0x%.4X\n", f_code);
printf("Byte 4: 0x%X\n", data_buff[12]);
/* Ïðîâåðÿåì çíà÷åíèå áèòà CD-RW. Åñëè áèò óñòàíîâëåí
* â åäèíèöó – çàïðàøèâàåìîå ñâîéñòâî óñòðîéñòâîì
* ïîääåðæèâàåòñÿ
*/
if(data_buff[12] & 0x02) ↵
printf("Feature CD TAO support\n\n");
else return -1;
return 0;
}
Устанавливаем в привод CD-RW диск и запускаем про-
грамму на выполнение. Результаты работы:
Ðèñóíîê 11. Ôîðìàò êîìàíäû GET CONFIGURATION Feature data length - 12
Рассмотрим пример. Необходимо выяснить, может ли Current profile - 0x000A
Feature Code - 0x002D
устройство выполнить запись треков на компакт-диск в ре- Byte 4: 0x6
жиме TAO. Для этого надо установить, обладает ли устрой- Feature CD TAO support

ство свойством «СD Track at Once». Код этого свойства Текущий профиль устройства – CD-RW, см. п. 5.4.10
равен 0x002D (см. [1]). «Profile 000Ah: CD-RW» спецификации SCSI MMC-4 ([1]).
Список свойств, соответствующих данному профилю, при-
веден в этом же пункте, в таблице 192 «Mandatory Feature
for CD-RW». Свойство «CD Track at Once» входит в их число.
Теперь установим в привод диск CD-ROM и опять запу-
стим программу на выполнение. Результаты работы про-
граммы:
Feature data length - 12
Current profile - 0x0008
Feature Code - 0x002D
Byte 4: 0x6
Ðèñóíîê 12. Ôîðìàò äåñêðèïòîðà ñâîéñòâà «ÑD Track at Once» Feature CD TAO support

Устройство способно выполнить запись трека на ком- Свойство «CD Track at Once» приводом поддерживается,
пакт-диск в режиме TAO в том случае, если бит CD-RW ус- но текущий профиль – 0x0008, CD-ROM – не позволяет это
тановлен в единицу. свойство применять. Список свойств, соответствующих про-
Рассмотрим функцию, выполняющую проверку наличия филю «CD-ROM», приведен в таблице 188 «Mandatory Feature
у устройства свойства «СD Track at Once» и значение бита for CD-ROM», п. 5.4.8 спецификации SCSI MMC-4 ([1]).
CD-RW. Функция принимает один параметр – код свойства.
Полный текст программы приведен в файле SG/get_conf.c. Страницы режимов
Для установки или определения параметров работы устрой-
int get_conf(__u16 f_num) ства используются страницы режимов (Mode Page). Каждая
{
__u8 get_conf_cmd[10]; страница режима характеризуется кодовым номером, дли-
__u8 data_buff[16]; // ðåçóëüòàòû ÷òåíèÿ ной и набором параметров. В таблице 5 приведен список
__u32 data_length = 0; // ðåàëüíàÿ äëèíà äàííûõ
__u16 current_prof = 0; // çíà÷åíèå òåêóùåãî ïðîôèëÿ кодов некоторых страниц режимов. Полный перечень нахо-
__u16 f_code = 0; // êîä ñâîéñòâà дится в спецификации SCSI MMC-4, п. 7.1.3 «Mode Pages».
/* Æäåì ãîòîâíîñòü óñòðîéñòâà */
if(test_unit_ready() < 0) exit(-1); Òàáëèöà 5
/* Ôîðìèðóåì êîìàíäíûé ïàêåò */
memset(data_buff, 0, 16);
memset(get_conf_cmd, 0, 10);
get_conf_cmd[0] = 0x46; // êîä êîìàíäû GET CONFIGURATION
get_conf_cmd[1] = 2; // RT= 10b
get_conf_cmd[8] = 16;
/* Â ïîëå Starting Feature Number çàíîñèì êîä ñâîéñòâà */
f_num = __swab16(f_num);
memcpy((get_conf_cmd + 2), (void *)&f_num, 2);

№11(24), ноябрь 2004 61


hardware
Прием и передача страниц осуществляется при помощи ! Page Length – размер страницы в байтах.
списка параметров режима Mode Parameter List. Список стра- ! Write Type – используемый режим записи:
ниц начинается с заголовка (Mode Parameter Header), за ко- ! 01 – Track-at-once (TAO);
торым могут следовать одна или несколько страниц режи- ! 02 – Session-at-once (SAO);
мов (рис. 13). ! 03 – RAW.
! Test Write – режим имитации записи данных на носи-
тель. Бит имеет значение только для режимов TAO и
SAO.
! Track Mode – содержит значение поля управления Control
Ðèñóíîê 13. Ôîðìàò ñïèñêà Mode Parameter List Field Q-субканала при ADR = 1 (см. «Физический фор-
мат данных на компакт-диске»). В данной статье будет
использовано только два значения этого поля:
! 0 – аудио-трек;
! 4 – трек данных.
! Multi-session – показывает, как закрытие текущей сес-
сии влияет на открытие следующей:
! 00b – указатель B0 отсутствует в TOC, открытие но-
вой сессии запрещено ([3, 5]);
Ðèñóíîê 14. Ôîðìàò çàãîëîâêà ñïèñêà ñòðàíèö (Mode Parameter ! 01b – указатель B0 содержит значение FF:FF:FF, от-
Header) крытие новой сессии запрещено;
Поле Mode Data Length содержит размер блока данных, ! 11b – открытие новой сессии разрешено. Указатель
следующего сразу за этим полем, т.е. 6 оставшихся байт B0 содержит координаты начала следующей облас-
заголовка плюс длину запрашиваемой страницы. Если стра- ти программ.
ница передается устройству, то значение поля Mode Data ! Data Block Type – определяет тип блока данных и его
Length не используется (зарезервировано). размер. Перечень всех значений этого поля находится
в таблице 619 «Data Block Type Codes» спецификации
Страница параметров режима записи MMC-4. В данной статье будет использовано только два
Рассмотрим подробнее, что из себя представляет страни- значения:
ца режима, на примере страницы параметров режима за- ! 0 – блок «сырых» данных размером 2352 байт (блок
писи, Write Parameters Mode Page. аудиоданных);
! 8 – блок данных размером 2048 байт, формат блока
данных Mode 1.
! Session Format – формат сессии. Это значение записы-
вается в поле PSEC указателя A0 таблицы содержания
диска TOC. Поле может принимать следующие значе-
ния:
! 00h – диск CD-DA или CD-ROM
! 01h – диск CD-I
! 20h – диск CD-ROM XA

В поле Sub-Header устройству передается информация


для заполнения подзаголовка сектора при записи на диск
данных в формате Mode 2 Form 1/2 (см. табл. 2 и 3).
Во второй части статьи будут рассмотрены примеры
программ, выполняющих запись на компакт-диск CD-R/RW
различной информации, музыкальных треков и данных.

Литература, ссылки:
1. Спецификация SCSI Multimedia Commands-4 (SCSI
MMC-4), http://www.t10.org/ftp/t10/drafts/mmc4/mmc4r03d.pdf
2. Спецификация SCSI-3 Multimedia Commands, http://
www.t10.org/ftp/t10/drafts/mmc/mmc-r10a.pdf
3. Specification for ATAPI DVD Devices, ftp.seagate.com/sff/
INF-8090.pdf
4. SCSI-Generic-HOWTO, http://www.linux.org/docs/ldp/
howto/SCSI-Generic-HOWTO/index.html
Ðèñóíîê 15. Ôîðìàò ñòðàíèöû ïàðàìåòðîâ ðåæèìà çàïèñè 5. Мешков В. Пакетные команды интерфейса ATAPI. – Жур-
Назначение полей: нал «Системный администратор», № 9(22), сентябрь
! Page Code – код страницы, содержит значение 0x05. 2004 г. – 70-84 с.

62
bugtraq

Отказ в обслуживании ройство будет прекращать прием всех пакетов из данной


в Sun Java System Application Server сети. Для переполнения очереди достаточно просто пере-
Программа: Sun Java System Application Server 7 Standard дать множество некорректно сформированных пакетов, ко-
Edition Update 4 и более ранние версии, 7 Platform Edition торые будут сохраняться в очереди по причине невозмож-
Update 4 и более ранние версии, 7 2004Q2. ности их доставки.
Опасность: Высокая. Как было отмечено выше, сервис DHCP по умолчанию
Описание: Удаленный атакующий может аварийно завер- включен в IOS. Для запрета DHCP требуется явное вклю-
шить работу службы. Уязвимость существует при обработ- чение команды no service dhcp в конфигурационный файл
ке сертификатов в Sun Java System Application Server. Уда- устройства. Отсутствие в конфигурационном файле устрой-
ленный атакующий может специальным образом создать ства команды service dhcp не означает, что сервис не под-
сертификат, который при проверке уязвимым сервером держивается устройством, его нужно явно отключить с по-
приведет к отказу в обслуживании. Также сообщается о мощью приведенной выше команды. Таким образом, уяз-
множественных ошибках при обработке ASN.1. вимость устройств сохраняется независимо от того, исполь-
URL производителя: www.sun.com. зуются ли они в качестве серверов или трансляторов DHCP.
Решение: Установите обновление. Передавая специально сформированные пакеты DHCP
атакуемому устройству, злоумышленник может полностью
Отказ в обслуживании блокировать обработку этим устройством входящего тра-
в Kerio Personal Firewall фика и для восстановления работоспособности устройства
Программа: Kerio Personal Firewall версии до 4.1.2. потребуется его перезагрузка.
Опасность: Высокая. URL производителя: www.cisco.com.
Описание: Удаленный атакующий может вызвать отказ в Решение: Обновление версии IOS.
обслуживании системы. Уязвимость существует при обра-
ботке определенных пакетов. Удаленный атакующий может DoS-атака в Apache
послать специально сформированный пакет и заставить Программа: Apache 2.0.52 и более ранние версии 2.0.x.
службу потреблять все доступные ресурсы на системе. Опасность: Высокая.
URL производителя: www.kerio.com/kpf_home.html Описание: Удаленный атакующий может заставить служ-
Решение: Установите обновление: http://www.kerio.com/ бу потребить все доступные ресурсы на системе.
kpf_download.html. Уязвимость существует при обработке пробелов в HTTP
GET-запросе. Удаленный атакующий может создать боль-
Уязвимость протокола DHCP шое количество запросов, содержащих большое количество
в оборудовании Cisco пробелов в заголовках запроса.
Программа: 12.2(18)EW, 12.2(18)EWA, 12.2(18)S, 12.2(18)SE, Пример:
12.2(18)SV, 12.2(18)SW,12.2(14)SZ. GET / HTTP/1.0\n
Опасность: Высокая. [space] x 8000\n
[space] x 8000\n
Описание: 11 ноября 2004 опубликован бюллетень CERT, [space] x 8000\n
сообщающий о наличии уязвимости в различных версиях 8000 ðàç
Cisco IOS, используемых в маршрутизаторах, коммутато- URL производителя: httpd.apache.org.
рах и линейных интерфейсах. Решение: Установите последнюю версию.
Проблема связана со способом обработки пакетов
DHCP в системах Cisco IOS. Используя уязвимость реали- Неавторизованный доступ
зации протокола, можно организовать атаку на службы к сетевым ресурсам в Cisco ACS
(DoS). Обработка пакетов DHCP по умолчанию включена, Программа: Cisco Secure ACS for Windows и Cisco Secure
что повышает уровень опасности. ACS Solution Engine версии 3.3.1.
Реализация протокола DHCP в операционной системе Опасность: Высокая.
Cisco IOS содержит ошибки, позволяющие использовать па- Описание: Уязвимость существует при обработке серти-
кеты DHCP некорректного формата для организации атаки фикатов в Cisco Secure Access Control Server при использо-
на службы, которая может привести к полной остановке об- вании EAP-TLS (Extensible Authentication Protocol-Transport
работки устройством входящего трафика. Layer Security) для авторизации пользователей. Удаленный
Маршрутизаторы, коммутаторы и линейные интерфей- атакующий может создать криптографически корректный
сы Cisco поддерживают обработку пакетов DHCP по умол- сертификат (сертификат соответствующего формата с ва-
чанию. Устройства Cisco также могут работать как серве- лидными полями, не зависимо от его срока жизни и от того,
ры DHCP, обеспечивая выделение адресов и установку выдан ли он доверенным CA) и пройти авторизацию на Cisco
конфигурационных параметров хостов. Кроме того, устрой- ACS.
ства могут пересылать пакеты DHCP и BootP, работая в URL производителя: www.cisco.com.
этом случае как трансляторы. При получении пакета DHCP Решение: Установите обновление: http://www.cisco.com/
он помещается во входную очередь для последующей об- pcgi-bin/tablebuild.pl/cs-acs-win.
работки. Пакеты DHCP, которые не удалось доставить, мо-
гут сохраняться в очереди. При заполнении очереди уст- Составил Александр Антипов

№11(24), ноябрь 2004 63


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

СОЗДАЕМ КРОССПЛАТФОРМЕННОЕ ПРИЛОЖЕНИЕ


НА ОСНОВЕ FLTK

АНТОН БОРИСОВ
Четкого типажа IT-специалиста не существует, ему часто ятии. Замечу, что ситуации, когда необходимо обработать
приходится вторгаться в области деятельности, смежные с информацию и сформировать из нее новые данные, не яв-
его основным профилем. Например, программистам при- ляются единичными как для системных инженеров, адми-
ходится иногда производить конфигурацию системы и вы- нистраторов, так и для программистов. Сооружать некий
ступать в роли администратора. В свою очередь, админис- айсберг ради кратковременной и нетребовательной зада-
траторы в рамках своих полномочий не всегда занимаются чи я считаю нерациональным решением. Использовать го-
лишь администрированием – они умеют составлять про- товые шаблоны также не всегда удобно (затрачивается вре-
граммы для своих подзадач. Однако не стоит смешивать мя на изучение требований к этим шаблонам и т. п.). Кро-
административную работу и работу программиста, хотя за- ме того, полученный код хотелось бы использовать на не-
частую на многих предприятиях на сегодняшний день ха- скольких ОС. Поэтому я остановил свой выбор на продук-
рактерна ситуация, когда администратор и швец, и жнец и те, предназначенном для создания кроссплатформенных
на дуде игрец. приложений FLTK (Fast Light ToolKit). Почему он называет-
Однако не буду концентрировать ваше внимание на не- ся именно так, и чем интересен, вы узнаете, ознакомив-
правильном подходе к организации IT-работы на предпри- шись с данным материалом.

64
программирование
Краткая предыстория волические ссылки на файлы CDT, и вот что получилось в
Изначально пакет разрабатывал Bill Spitzak как удобную и директории features:
быструю альтернативу существовавшим тогда монстрам. drwxr-xr-x org.eclipse.cdt_1.2.1
Во время работы в Sun Microsystems и Digital Domain кон- lrwxrwxrwx org.eclipse.cdt_2.1.3 -> org.eclipse.cdt_1.2.1
drwxr-xr-x org.eclipse.cdt.linux.gtk_1.2.1
цепция FLTK неоднократно перерабатывалась и дополня- lrwxrwxrwx org.eclipse.cdt.linux.gtk_2.1.3 -> org.eclipse.cdt.linux.gtk_1.2.1
drwxr-xr-x org.eclipse.cdt.linux.motif_1.2.1
лась. Некоторые идеи были заимствованы из NeXT, NeWS, lrwxrwxrwx org.eclipse.cdt.linux.motif_2.1.3 -> org.eclipse.cdt.linux.motif_1.2.1
drwxr-xr-x org.eclipse.cdt.make_1.2.1
Forms. Само название несколько раз трансформировалось, lrwxrwxrwx org.eclipse.cdt.make_2.1.3 -> org.eclipse.cdt.make_1.2.1
была даже попытка назвать продукт как FL, но из-за того, drwxr-xr-x org.eclipse.cdt.managedbuilder_1.2.1
lrwxrwxrwx org.eclipse.cdt.managedbuilder_2.1.3 -> org.eclipse.cdt.managedbuilder_1.2.1
что в поисковых машинах слово FL в первую очередь ин- drwxr-xr-x org.eclipse.cdt.qnx.photon_1.2.1
lrwxrwxrwx org.eclipse.cdt.qnx.photon_2.1.3 -> org.eclipse.cdt.qnx.photon_1.2.1
терпретировалось как обозначение штата Флорида (FL), drwxr-xr-x org.eclipse.cdt.solaris.motif_1.2.1
было решено придумать другое название. В итоге получи- lrwxrwxrwx org.eclipse.cdt.solaris.motif_2.1.3 -> org.eclipse.cdt.solaris.motif_1.2.1
drwxr-xr-x org.eclipse.cdt.source_1.2.1
лось то, что известно под акронимом FLTK (Full-Tick). lrwxrwxrwx org.eclipse.cdt.source_2.1.3 -> org.eclipse.cdt.source_1.2.1
drwxr-xr-x org.eclipse.cdt.win32_1.2.1
Для сегодняшнего обзора необходимо вооружиться сле- lrwxrwxrwx org.eclipse.cdt.win32_2.1.3 -> org.eclipse.cdt.win32_1.2.1
drwxrwxr-x org.eclipse.jdt_2.1.3
дующим инструментарием – самим пакетом FLTK, компи- drwxrwxr-x org.eclipse.jdt.source_2.1.3
лятором gcc, интегрированной средой разработки Eclipse, drwxrwxr-x org.eclipse.pde_2.1.3
drwxrwxr-x org.eclipse.platform_2.1.3
продуктом для Win32 платформы Microsoft Visual Studio 6.0 drwxrwxr-x org.eclipse.platform.linux.gtk_2.1.3
drwxrwxr-x org.eclipse.platform.linux.gtk.source_2.1.3
и симпатичной кроссплатформенной библиотекой для ра- drwxrwxr-x org.eclipse.platform.source_2.1.3
боты с PNG-графикой – pngwriter. Будем использовать вер- drwxrwxr-x org.eclipse.sdk.linux.gtk_2.1.3

сию 1.1.5 (последняя стабильная ветка) [1]. Аналогичным образом следует поступить и для дирек-
Что касается компилятора, то надеюсь, что инструмен- тории plugins. При таком варианте уже возможно создание
тарий разработчика вы уже поставили. Если нет, то следу- проекта на C/C++.
ет поставить пакеты gcc и g++. А также пригодится make. Что касается графики, то я решил выбрать pngwriter по
Следует сказать огромное спасибо фирме IBM за ин- следующим причинам: отсутствует проблема с лицензиро-
тегрированную среду разработки Eclipse. Мало того, что ванием, формат PNG на сегодняшний день широко распро-
компания предоставляет исходники продукта на всеобщее странен, и понравились функции для работы с графикой в
обозрение, так он еще и предназначен для работы на не- данном пакете.
скольких аппаратных и программных платформах. Среди Документация, идущая с pngwriter [2], достаточно ши-
них: Windows 98/ME/2000/XP, Linux (x86/Motif, GTK 2), Linux роко освещает аспекты сборки как под Linux, так и под
(AMD 64/GTK 2), Solaris 8 (SPARC/Motif), AIX (PPC/Motif), HP- Win32. С другими ОС проблем не будет, если в системе есть
UX (HP9000/Motif), Mac OSX (Mac/Carbon). компилятор: http://heanet.dl.sourceforge.net/sourceforge/
Данное ПО основано на Java, поэтому убедитесь, что в pngwriter/pngwriter-0.5.0.tgz (640 Кб).
вашей системе установлена версия JRE не ниже 1.4. Сре- Также, надеюсь, у вас не возникнет проблем с Microsoft
ди недостатков решений, основанных на Java, стоит отме- Visual Studio 6.0.
тить жадность к ресурсам и не блещущее быстродействие. Теперь главный герой сегодняшнего эпоса – FLTK.
Я использовал при работе Eclipse версии 2.1.3. На мо-
мент написания статьи выпущена версия 3.0.1, но для на- tar xzvf fltk-1.1.5-source.tar.bz2
cd fltk-1.1.5
ших ознакомительных целей вполне подойдет и вторая вер- ./configure --prefix=/usr/local/fltk-1.1.5 --enable-xft ↵
сия. Информация о том, с каких сайтов можно загрузить дан- --enable-threads
ное ПО, есть по адресу: http://download.eclipse.org/downloads,
ht tp://download.eclipse.org/downloads/drops/R-2.1.3- Если мультипоточность в FLTK не нужна, то можно не
200403101828/eclipse-SDK-2.1.3-linux-gtk.zip (65 Мб). использовать опцию «--enable-threads». То же самое каса-
Это только основное ядро. Теперь заберем дополнитель- ется и улучшенной поддержки шрифтов (антиалиасинг) –
ный пакет для C/C++ разработки. Он называется CDT (C/C++ опция «--enable-xft».
Development Tool): http://www.eclipse.org/tools/downloads.html,
http://download.eclipse.org/tools/cdt/updates/release/dist/cdt- make && make install
full-1.2-linux-gtk.zip (3 Мб).
Также для второй версии Eclipse существует пакет ру- В итоге получились следующие библиотеки в директо-
сификации. Насколько хорошо он переведен, не берусь рии /usr/local/fltk-1.1.5/lib:
судить, т.к. причин опробовать его пока не возникало. По
-rw-r--r-- libfltk.a
умолчанию в Eclipse не используется CDT. Его нужно ус- -rw-r--r-- libfltk_forms.a
танавливать дополнительно. То есть распаковать архив lrwxrwxrwx libfltk_forms.so -> libfltk_forms.so.1.1
cdt-full-1.2-linux-gtk.zip и положить содержимое из катало- -rwxr-xr-x libfltk_forms.so.1.1
-rw-r--r-- libfltk_gl.a
гов «plugins» и «features» в установленную директорию с lrwxrwxrwx libfltk_gl.so -> libfltk_gl.so.1.1
Eclipse. В главной директории Eclipse уже существуют та- -rwxr-xr-x libfltk_gl.so.1.1
-rw-r--r-- libfltk_images.a
кие каталоги – в них и нужно положить распакованные lrwxrwxrwx libfltk_images.so -> libfltk_images.so.1.1
файлы. -rwxr-xr-x libfltk_images.so.1.1
Однако вышел вот какой казус – Eclipse не распознал lrwxrwxrwx libfltk.so -> libfltk.so.1.1
-rwxr-xr-x libfltk.so.1.1
добавленных расширений по неизвестной для меня причи-
не. Поэтому я поступил следующим образом. Создал сим- Сборка pngwriter еще проще.

№11(24), ноябрь 2004 65


программирование
tar xzvf pngwriter-0.5.0.tgz { "E&xit", FL_CTRL + 'q', (Fl_Callback *)quit_cb, 0 },
cd pngwriter { 0 },
make && make install
{ "&Help", 0, 0, 0, FL_SUBMENU },
Пакет устанавливается в /usr/local/lib/ и в /usr/local/ { "&About", FL_CTRL + 'a' , 0 },
{ 0 },
include. Для более подробной информации обращайтесь к { 0 }
файлу README из этого пакета. };
Теперь немного забежим вперед и создадим наше пер- int main(int argc, char **argv) {
вое приложение на FLTK. В первую очередь следует обра- Fl_Window *window = new Fl_Window(300, 300, "Sample");
щаться к демо-программам, которые скомпилировались window->color(FL_WHITE);
вместе с самим пакетом FLTK. Их можно найти в директо- m = new Fl_Menu_Bar(0, 0, 640, 25);
рии fltk-1.1.5/test. Написано доступно и просто. Тем, кто стал- m->copy(MenuEng);
кивался с программированием на MFC или на QT/GTK, бу- m->box(FL_UP_BOX);
дет понятна идеология callback (т.е. реакция на события). В m->textcolor(FL_BLUE);
частности, в QT используется аналог системы callback – m->textfont(FL_TIMES);
m->textsize(FONT_SIZE);
пара сигнал/слот. Фактически это более гибкое решение
(нежели реальные callback-функции), которое позволяет fc = new Fl_File_Chooser(".", "*.{txt,cpp}", ↵
Fl_File_Chooser::SINGLE, "File_Chooser_Dialog");
любому объекту присвоить свойство реагировать на сиг-
нал. В GTK также используется система callback, так назы- window->show();
window->callback( (Fl_Callback *)quit_cb, window );
ваемая пара signal/callback. Более полную информацию
можно почерпнуть из [7-10]. return Fl::run();
Если нужен справочник классов и методов, то fltk-1.1.5/ }
documentation – хороший источник получения информации.
В принципе на самом сайте FLTK можно забрать справоч- Кто есть кто в данном примере? Подключаются только
ник в PDF-формате. необходимые файлы из комплекта FLTK. В нашем случае –
Рассмотрим самый простой файл на FLTK. это Fl.H, Fl_Window.H, Fl_Menu_Bar, Fl_File_Chooser.H. Пер-
вый файл необходимо включать при создании любого при-
My_CPP_Test.cpp ложения на FLTK, второй отвечает за создание объекта
// HEADERS Fl_Window *window. Понятно, что для создания объекта
#include <FL/Fl.H> Fl_Menu_Bar *m мы подключили FL_Menu_Bar. Идеология
#include <FL/Fl_Window.H>
#include <FL/Fl_Menu_Bar.H> достаточно понятна на данном этапе.
#include <FL/Fl_File_Chooser.H> Далее мы объявляем глобальные переменные m, fc –
// GLOBALS доступ к классам этих объектов будет производиться не
Fl_Menu_Bar *m; только из функции main().
Fl_File_Chooser *fc;
Следующим шагом идет объявление callback-функций.
#define FONT_SIZE 14 Они отвечают за реакцию на события. В нашем примере
void fc_callback(Fl_File_Chooser *fc, void *data) fc_callback(), open_cb() участвуют в процессе открытия фай-
{ лового диалога, а функция quit_cb() отвечает за заверше-
if(fc->value())
{ ние всего приложения.
printf( "Chosen file: \"%s\"\n", fc->value() ); Далее мы заполняем структуру меню.
}
return; {"&File", 0, 0, 0, FL_SUBMENU },
} { "&Open", FL_CTRL + 'o', (Fl_Callback *)open_cb },
{ "&Save", FL_CTRL + 's', 0 },
void open_cb(Fl_Widget*, void*) { "E&xit", FL_CTRL + 'q', (Fl_Callback *)quit_cb, 0 },
{ { 0 },
fc->callback(fc_callback);
fc->show(); В частности данный элемент означает следующее – со-
while(fc->shown()) здается пункт в меню под названием «File». При этом быс-
Fl::wait(); трый вызов осуществляется по клавише <Alt+F> (на что ука-
if( fc->count() == 1 ) зывает знак амперсанда – «&File»). В состав пункта «File»
{ входят следующие подпункты – «Open», «Save», «Exit».
printf("File was selected\n");
} Горячая клавиша указывается в шаблоне вида FL_CTRL +
«X», где «X» – название клавиши.
}
В данном случае при нажатии на клавишу <Ctrl+O> бу-
void quit_cb(Fl_Widget*, void*) дет вызвана callback-фунция open_cb(). Если на месте
{
exit(0); callback-функции «0», то никакая функция не привязана к
} данному событию.
Fl_Menu_Item MenuEng[] = { Переходим к функции main(). В её теле мы создаем объект
окна Fl_Window *window. Инициализируем его с парамет-
{ "&File", 0, 0, 0, FL_SUBMENU },
{ "&Open", FL_CTRL + 'o', (Fl_Callback *)open_cb }, рами (300, 300, «Sample») – соответственно ширина, высо-
{ "&Save", FL_CTRL + 's', 0 }, та, заголовок окна. Также создается и инициализируется

66
программирование
объект типа меню. В этом объекте изменяются тип шрифта Как видите, некоторые символы дистрибутива того вре-
и его размер. Инициализируем объект Fl_File_Chooser. мени (4 года назад) не были определены, поэтому я вижу 2
Показываем созданное творение – window → show(). варианта решения проблемы: собирать программу полнос-
Привязываем callback-фунцию quit_cb() на закрытие при- тью со статическими библиотеками либо собирать FLTK на
ложения. И наконец вызываем обработчик событий для основе старого дистрибутива и там же компилировать. На-
всего созданного приложения – return Fl::run(). сколько это удобно в каждом конкретном случае, решать
Если некоторые параметры остались для вас непонят- всё-таки разработчику.
ными – обращайтесь к документации. Вполне возможно, Итак, мы знаем, как написать программу, но по мере на-
что в версии, которую вы будете использовать, будут изме- копления дополнительных свойств она разрастается, и встает
нены некоторые параметры (это характерно для следую- вопрос удобства и функциональности дальнейшей разра-
щей версии FLTK 2.0). ботки. В этой связи удобнее будет использовать IDE Eclipse.
Оформим данный файл как My_CPP_Test.cpp. И созда-
дим make-файл для компиляции программы.

Makefile

FLTK=/usr/local/fltk/bin/fltk-config
OPTIONS=--compile

My_CPP_Test:
$(FLTK) $(OPTIONS) My_CPP_Test.cpp
clean:
rm My_CPP_Test
rebuild:
make clean; make My_CPP_Test

Теперь, запустив команду make, вы скомпилируете это


тестовое приложение. У меня оно получилось размером при-
мерно в 400 Кб. Посмотрим на него чуточку внимательнее.
bash-2.05b$ file My_CPP_Test
My_CPP_Test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), not stripped Ðèñóíîê 1. Îáùèé âèä Eclipse
Уберем лишнюю отладочную информацию и посмотрим, Для создания проекта на C или C++ следует поступить
от каких библиотек зависит наше новое приложение. следующим образом – выбрать меню «Window → Open
Perspective → C/C++ Development».
bash-2.05b$ strip My_CPP_Test Тем самым мы настраиваем в Eclipse подсветку синтак-
сиса, характерную для языковых конструкций С/С++.
В итоге приложение теперь «похудело» до 240 Кб. Создадим пробный проект. «File → New → Project».
bash-2.05b$ ldd My_CPP_Test
libm.so.6 => /lib/libm.so.6 (0x40025000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40049000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40057000)
libc.so.6 => /lib/libc.so.6 (0x4011e000)
libdl.so.2 => /lib/libdl.so.2 (0x40254000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Достаточно симпатично, на мой взгляд. Вполне вероят-


но, что удастся запустить даже на дистрибутивах Linux, ос-
нованных на ядре 2.0.X, не говоря про современные.
Что и было протестировано на дистрибутиве SUSE Linux
с ядром версии 2.2.18 и сопутствующими библиотеками
(libc-2.1.3, ld-2.1.3). Радужные ожидания растаяли при за-
пуске программы ldd:
bash-2.05b$ ldd -vr My_CPP_Test
libm.so.6 => /lib/libm.so.6 (0x40016000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40033000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4003f000)
Ðèñóíîê 2
libc.so.6 => /lib/libc.so.6 (0x400e0000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Выбираем создание проекта на C++ категории Managed
My_CPP_Test: /lib/libc.so.6: version `GLIBC_2.2.4' not found
(required by My_CPP_Test) Make C++ Project (см. рис. 3).
My_CPP_Test: /lib/libc.so.6: version `GLIBC_2.3' not found Выбираем имя для проекта «My_Test» (см. рис. 4).
(required by My_CPP_Test)
А затем придумываем имя для главного файла проекта
symbol __ctype_tolower_loc, version GLIBC_2.3 not defined in file
libc.so.6 with link time reference (My_CPP_Test) (см. рис. 5).
symbol dl_iterate_phdr, version GLIBC_2.2.4 not defined in file Проект сконструирован, файл My_CPP_Test.cpp создан,
libc.so.6 with link time reference (My_CPP_Test)
symbol __ctype_b_loc, version GLIBC_2.3 not defined in file но он пуст и находится в следующей директории ~/eclipse/
libc.so.6 with link time reference (My_CPP_Test) workspace.

№11(24), ноябрь 2004 67


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

Ðèñóíîê 3

Ðèñóíîê 6

Ðèñóíîê 4

Ðèñóíîê 7
Спрашивается, откуда автор знает, какие именно биб-
лиотеки следует использовать. Очень просто. Необходимо
запустить программу из комплекта FLTK под названием
fltk-config со следующими флагами: «--cflags», «--ldflags»
(«--ldstaticflags»). В итоге при сборке проекта («Project →
Rebuild All») вы должны увидеть показанное на рис. 8.
Для того чтобы запустить новое приложение из интег-
рированной среды, необходимо настроить пункт в меню
Ðèñóíîê 5 «Run» (см. рис. 9). В поле «C/C++ Application» указать ис-
Файл My_CPP_Test.cpp создался пустым, поэтому либо полняемый файл (см. рис. 10).
скопируем в буфер содержимое нашего примера и вста- Так как сборка производится не со статической библио-
вим из буфера в этот файл. Либо перенесем файл приме- текой, а с динамической, то надо указать путь к библиоте-
ра в директорию нашего проекта. Eclipse высветит предуп- ке libfltk.so (см. рис. 11). В итоге сборка и дальнейшая раз-
реждение о том, что содержимое файла изменилось. работка вашего продукта приобретает более удобные очер-
Отлично, теперь в настройках проекта нам следует ука- тания.
зать, где искать заголовочные файлы (в частности, где рас- Теперь добавим поддержку для pngwriter.
положены заголовочные файлы для FLTK). Добавим в My_CPP_Test.cpp следующие строки:
Заходим «Project → Properties». Заполняем поля, ука-
занные на рис. 6 и 7. #include <pngwriter.h>

68
программирование
void save_cb(Fl_Widget*, void*)
{

pngwriter iris(300,300,0,"iris.png");
for(int a = 1; a < 301; a++)
for(int b = 1; b < 301; b++)
iris.plotHSV( a, b, double(a)/500.0, double(b)/500.0, 1.0);

iris.setgamma(0.7);
iris.close();

Ðèñóíîê 11
Потребуется для объявления функций библиотеки
pngwriter. Файл фактически находится в /usr/local/include/,
поэтому в Makefile надо будет добавить следующую конст-
рукцию:

-I/usr/local/include -L/usr/local/lib

Ðèñóíîê 8 Добавляем новую процедуру сохранения файла PNG-


формата. И меняем структуру меню.

{ "&Save", FL_CTRL + 's', (Fl_Callback *)save_cb },

Теперь осталось изменить Makefile, т.к. pngwriter исполь-


зует C++ синтаксис. Новый Makefile выглядит следующим
образом.

FLTK=/usr/local/fltk/bin/fltk-config

INCLUDE=`$(FLTK) –cflags`
INCLUDE2=-I/usr/local/include -L/usr/local/lib
LIBS=`$(FLTK) --ldstaticflags`
LIBS2=-lm -lXext -lX11 -lsupc++ -lpng -lpngwriter -lz ↵
–lfreetype
FLAGS=-O3 -Wall -Wno-deprecated
FLAGS2=-lsupc++
CC=g++

My_CPP_Test:
$(CC) $(INCLUDE) $(INCLUDE2) ↵
Ðèñóíîê 9 -o My_CPP_Test My_CPP_Test.cpp $(LIBS) $(LIBS2)
clean:#
rm My_CPP_Test

rebuild:
make clean; make My_CPP_Test

Библиотека freetype потребовалась из-за того, что сам


FLTK собрался с данной поддержкой. На вашей машине
может быть по-другому.
Предлагаю переключить внимание на Windows и собрать
пакет FLTK с использованием компилятора от Microsoft. Смыс-
ла компилировать с помощью Microsoft Visual Studio .NET я не
увидел и решил воспользоваться предыдущей версией 6.0.
Приступим. С помощью WinRAR распакуем архив. За-
пускаем файл проектов fltk.dsw (он находится в каталоге
fltk-1.1.5/visualc) в Microsoft Visual Studio. Выбираем для
Ðèñóíîê 10 сборки нужный проект fltk (см. рис. 12).

№11(24), ноябрь 2004 69


программирование
Полученные библиотеки необходимо положить в
Program Files\Microsoft Visual Studio\VC98\Lib, а заголовоч-
ные файлы от FLTK следует положить в Program Files\
Microsoft Visual Studio\VC98\Include (предварительно создав
там директорию FL).
В общем-то, среда готова для написания программ.
Как именно вы организуете представление графичес-
кой информации – дело вашего вкуса.
Импорт графических файлов с помощью FLTK возмо-
жен для файлов JPEG, PNG, BMP, XPM. Экспортировать в
формате PNG можно в том случае, если вы подключите
библиотеку libpngwriter.
На основе FLTK развилось несколько проектов. Это и
расширение FLTK – проект EFLTK, который умеет работать
с базами данных MySQL. Это и SPTK, разрабатываемый,
Ðèñóíîê 12 кстати сказать, нашим соотечественником Алексеем Пар-
Если мы хотим создать DLL-библиотеку, то следует выб- шиным [5]. С помощью SPTK вы получаете доступ к дан-
рать проект fltkdll. В этом случае программа после компи- ным как в Excel-, Access-форме, так и к MySQL-данным.
ляции будет меньше, но при этом потребуется внешняя DLL- FLU, обладающий некоторыми расширенными опциями для
библиотека fltkdll.dll. Можно поступить другим образом – построения виджетов [6].
собрать LIB-библиотеку. При этом необходимый код будет Среди достоинств FLTK хочу подчеркнуть особенность
включен в вашу программу при компиляции. И соответ- ясного и понятного построения кода программ. За счет про-
ственно программа будет состоять фактически из одного стоты достигаются скорость составления каркаса програм-
EXE-файла. Следующим шагом нужно определить, какой мы и дальнейшая скорость её выполнения. В некоторой
тип библиотеки необходим – с отладочными символами степени программы на основе FLTK являются «мобильны-
(«Debug») или без отладочных символов («Release»). До- ми», т.к. вы четко представляете, от каких системных биб-
пустим, мы хотим собрать без отладочных символов, по- лиотек зависит FLTK. Поэтому разобраться, что требуется
этому выбираем тип библиотеки «Release»: для запуска программы в новых условиях, получается на-
много быстрее, нежели, например, на основе QT.
Характерный минус разработки на основе FLTK заклю-
чается в его же простоте – некоторых конструкций, кото-
рые есть в других средствах разработки, просто нет. Или
же они находятся на такой стадии разработки, когда про-
дукт называется unstable (в частности, поддержка UTF8 всё
еще находится на стадии разработки).
В целом FLTK можно предлагать как продукт для получе-
ния начального опыта программирования GUI-приложений.
В частности, примеры, расположенные по адресам [11], [12],
[13], помогут разобраться в составлении программ на FLTK.
Ðèñóíîê 13 Надеюсь, данный опыт покажет вам дальнейшие пути
Запускаем процесс сборки. Конечный результат в виде для поиска необходимого инструментария.
файла fltk.lib смотрите в каталоге fltk-1.1.5/lib:
Ссылки:
1. http://www.fltk.org/software.php?SOFTWARE=v1_1
2. http://pngwriter.sourceforge.net
3. http://pngwriter.sourceforge.net/howto_msvc.php
4. http://yaroslav-v.chat.ru
5. http://sptk.tts-sf.com/index.php
6. http://www.osc.edu/~jbryan/FLU/
7. http://www.cs.wisc.edu/~cs559-1/tutorials/tutorial4.html
8. http://ib.cnea.gov.ar/~poo/gtkmm-devel-1.2.10/docs/tutorial/
gtkmm-tut-html/tutorial-2.html
9. http://inti.sourceforge.net/tutorial/libinti/advanced eventand
signalhandling.html
10. http://www.jtz.org.pl/Inne/QT-Tutorial/signalsandslots.html
Ðèñóíîê 14 11. http://www.cs.virginia.edu/~gfx/Courses/2004/Intro.
Компилировать библиотеку следует как статическую Spring.04/ProgrammingAssignments/Exercise1
(расширение файла – .LIB). Полученный итог – файлы 12. http://www.soe.ucsc.edu/classes/cmps160/Spring04
pngwriter.lib, zlib.lib, png.lib. 13. http://www.cs.wisc.edu/~cs559-1

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

CLASS SERVER 3.0 – НОВОЕ РЕШЕНИЕ MICROSOFT


В ОБЛАСТИ ОБРАЗОВАНИЯ

АНДРЕЙ ФИЛИППОВИЧ
28 октября 2004 г. на презентации в офисе Microsoft было заведением (АСУ вуз, АСУ колледж, АСУ школа и т. д.) или
объявлено о выходе русскоязычной версии нового продук- считать перспективной платформой для их построения, од-
та Class Server 3.0. Microsoft позиционирует продукт как нако новый продукт Microsoft сочетает в себе черты систем
новую активно развивающуюся платформу для управления дистанционного образования, электронного обучения (e-
учебным процессом, которая направлена на организацию learning) и построения портальных решений.
управления учебными материалами и планами (включая их Системы дистанционного и электронного обучения до-
хранение и распространение), проведение тестирования статочно широко представлены на российском рынке про-
учащихся, сбор данных об успеваемости и взаимодействие граммных продуктов и по возможностям сильно превосхо-
всех участников учебного процесса через Интернет. дят решение Microsoft. Однако ни одно из них не может вы-
Несмотря на то что доклад Дмитрия Старостина (кон- ступать в качестве платформы, интегрированной с множе-
сультанта Microsoft Consulting Services) был практически ством средств разработки. Class Server входит в состав
полностью построен на иллюстрации возможностей исполь- платформы Microsoft.Net и предоставляет все ее возможно-
зования продукта в рамках школьного обучения, Роман Куз- сти, имеет широкий набор XML веб-сервисов и совместим с
нецов (менеджер по работе с образовательными и прави- такими международными стандартами, как SIF (Schools
тельственными организациями) особо подчеркнул возмож- Interoperability Framework), SCORM (Sharable Content Object
ность использования Class Server в высшем образовании, Reference Model), IMS (Instructional Management Standards).
в корпорациях и органах управления образованием. Другим важным преимуществом Class Server является
Надо отметить, что понимание учебного процесса в рам- его непосредственная связь с Microsoft Learning Gateway –
ках системы очень узко – оно подразумевает только четы- порталом, выступающим в качестве базовой структуры для
ре абстрактные роли пользователей (администрация, учи- объединения через Интернет разнообразных решений в об-
теля, учащиеся и родители) и простейшую схему взаимо- ласти образования в единую, полностью управляемую сре-
действия, представленную на рисунке. ду, содержащую до 1 млн. пользователей.
Портал построен на основе платформ Microsoft Office
SharePoint Portal Server 2003 и SharePoint Services, предос-
тавляет необходимые сведения и услуги в соответствии с
настроенными пользовательскими ролями. Для организа-
ции обмена сообщениями электронной почты, управления
личной информацией, включая календарь и список задач,
а также предоставления других услуг в области обмена
данными используется Microsoft Exchange Server 2003.
Microsoft Live Communications Server обеспечивает взаимо-
действие в режиме реального времени с помощью немед-
ленных сообщений.
В заключение следует отметить, что, на мой взгляд, но-
вая разработка Microsoft прежде всего ориентирована на
использование в рамках учебного процесса школы и мало
адаптирована для применения в высших учебных заведе-
ниях. Это вызвано наличием в вузах большого количества
сложных бизнес-процессов, включающих множество учас-
Под учебным планом подразумевается программа (со- тников, схем оценивания, средств мониторинга и методик
держание) курса или дисциплины, которая не содержит ни управления.
разбиения на виды учебной нагрузки, ни привязки к часам Возможность эффективного использования Class Server
или кредитам. Последний факт особенно удивителен, т.к. у корпоративных заказчиков пока маловероятна, так как
по утверждению специалистов Microsoft продукт активно вопрос взаимодействия с ERP- и CRM-системами предпри-
внедряется на Западе, где повсеместно используется кре- ятий в рамках интеграции с отдельными модулями еще не
дитно-модульная система образования. решен.
Class Server на данный момент времени нельзя отнести Более подробную информацию о продукте можно узнать
к классу автоматизированных систем управления учебным по адресу: http://www.microsoft.com/rus/education/ClassServer.

№11(24), ноябрь 2004 71


образование

ФАЙЛОВАЯ СИСТЕМА NTFS ИЗВНЕ И ИЗНУТРИ


Покажи мне свои структуры данных, и я скажу, кто ты!

Народная программистская мудрость

В этой статье мы рассмотрим основные структуры данных файловой системы NTFS, определяющие
ее суть – главную файловую запись MFT, файловые записи FILE Record и последовательности
обновления (update sequence или fix-ups), без знания которых осмысленная работа с редактором
диска и ручное/полуавтоматическое восстановление данных просто невозможны!

КРИС КАСПЕРСКИ
Файловую систему NTFS принято описывать как сложную тье [1, 2]. NTFS поддерживает тома, состоящие из несколь-
реляционную базу данных, обескураживающую грандиоз- ких разделов. Подробнее схему отображения томов на раз-
ностью своего архитектурного замысла не одно поколение делы мы обсудим в следующей статье этого цикла, а пока
начинающих исследователей. NTFS похожа на огромный, же будем для простоты считать, что том представляет со-
окутанный мраком лабиринт, в котором очень легко заблу- бой отформатированный раздел (т.е. раздел, содержащий
диться. Хакеры давно разобрались с основными структу- служебные структуры файловой системы).
рами данных, осветив магистральные коридоры лабирин-
та светом множества факелов. Боковые ответвления раз-
веданы намного хуже и все еще находятся по власти тьмы,
хранящей множество смертоносных ловушек, ждущих сво-
их исследователей. В общем, если NTFS-«читалку» можно
запрограммировать буквально за один вечер (с отладкой!),
писать на NTFS-тома еще никто не рисковал.
К счастью, никто не требует от нас написания полно-
ценного NTFS-драйвера! Наша задача значительно скром-
нее – вернуть разрушенный том в состояние, пригодное для
восприятия операционной системой (задача-максимум) или
извлечь из него все ценные файлы (задача-минимум). Вни-
кать в структуру журналов транзакций, дескрипторов бе-
зопасности, двоичных деревьев индексаций для этого со-
вершенно необязательно! Реально нам потребуется ра-
зобраться лишь с устройством главной файловой записи – Ðèñóíîê 1. Îáû÷íûé (ñëåâà) è ðàçðÿæåííûé (ñïðàâà) òîìà
MFT и нескольких дочерних подструктур. Большинство файловых систем трактуют том как сово-
купность файлов, свободного дискового пространства и слу-
Обзор NTFS с высоты птичьего полета жебных структур файловой системы, но в NTFS все служеб-
Основным структурным элементом всякой файловой сис- ные структуры представлены файлами, которые (как это и
темы является том (volume), в случае с FAT совпадающий с положено файлу) могут находиться в любом месте тома, при
разделом (partition), о котором мы говорили в прошлой ста- необходимости фрагментируя себя на несколько частей.

72
образование
Самым главным служебным файлом является $MFT – ловно обозначаемом $STANDARD_INFORMATION. Ранние
Master File Table (главная файловая таблица) – своеобраз- версии Windows NT позволяли обращаться к атрибутам по
ная база данных, хранящая информацию обо всех файлах их условным обозначениям, однако Windows 2000 и
тома – их именах, атрибутах, способе и порядке размеще- Windows XP лишены этой возможности. Полное имя фай-
ния на диске (каталог также является файлом особого типа, ла (не путать с путем!) хранится в атрибуте типа 30h
со списком принадлежащих ему файлов и подкаталогов ($FILE_NAME). Если у файла есть одно или более альтер-
внутри). Важно подчеркнуть, что в MFT присутствуют все нативных имен (например, MS-DOS-имя), таких атрибутов
файлы, находящиеся во всех подкаталогах тома, поэтому может быть несколько. Здесь же хранится ссылка (file
для восстановления диска наличия $MTF-файла будет впол- reference) на материнский каталог, позволяющая разобрать-
не достаточно. ся, к какому каталогу данный файл/подкаталог принадле-
Остальные служебные файлы (кстати говоря, называе- жит. Данные файла по умолчанию хранятся в безымянном
мые метафайлами или метаданными – metafile/metadata атрибуте типа 80h ($DATA), однако при желании приклад-
соответственно и всегда предваряются знаком доллара «$») ные приложения могут создавать дополнительные потоки
носят сугубо вспомогательный характер, интересный толь- данных, отделяя имя атрибута от имени файла знаком дво-
ко самой файловой системе. К ним в первую очередь отно- еточия, например:
сятся: $LogFile – файл транзакций, $Bitmap – карта свобод-
ного/занятого пространства, $BadClust – перечень плохих ECHO xxx > file:attr1; ECHO yyy > file:attr2; ↵
more < file:attr1; more < file:attr2
кластеров и т. д. (Подробнее о назначении каждого из фай-
лов будет рассказано в следующей статье). Текущие вер- Изначально в NTFS была заложена способность индек-
сии Windows блокируют доступ к служебным файлам с при- сации любых атрибутов, значительно сокращающая время
кладного уровня (даже с правами администратора!), и вся- поиска файла по заданному списку критериев (например,
кая попытка открытия/создания такого файла в корневом времени последнего доступа). Внутренние индексы хранят-
каталоге обречена на неуспех. ся в виде двоичных деревьев, поэтому среднее время вы-
Классическое определение, данное в учебниках инфор- полнения запроса оценивается как O(lg n). Однако в теку-
матики, отождествляет файл с именованной записью на щих NTFS-драйверах реализована индексация лишь по
диске. Большинство файловых систем добавляет к этому одному атрибуту – имени файла. Как уже говорилось выше,
понятие атрибута (attribute) – некоторой вспомогательной каталог представляет собой особенный файл – файл ин-
характеристики, описывающей время создания, права до- дексов (INDEX). В отличие от FAT, где файл каталога пред-
ступа и т. д. В NTFS имя файла, данные файла и его атри- ставляет единственный источник данных об организации
буты полностью уравнены в правах. Можно сказать, что файлов, в NTFS он используется лишь для ускорения дос-
всякий NTFS-файл представляет собой совокупность ат- тупа к содержимому директории и не является обязатель-
рибутов, каждый из которых хранится как отдельный по- ным, поскольку ссылка на материнский каталог всякого
ток (streams) байтов, поэтому во избежание путаницы ат- файла в обязательном порядке присутствует в атрибуте его
рибуты, хранящие данные файла, часто называют пото- имени ($FILE_NAME).
ками. Каждый атрибут может быть зашифрован, разряжен или
Каждый атрибут состоит из тела (body) и заголовка сжат. Однако техника работы с такими атрибутами выхо-
(header). Атрибуты делятся на резидентные (resident) и не- дит далеко за рамки первичного знакомства с организаци-
резидентные (non-resident). Резидентные атрибуты хранят- ей файловой системы и будет рассмотрена позднее. А пока
ся непосредственно в $MTF, что существенно уменьшает же мы углубимся в изучение фундамента файловой систе-
грануляцию дискового пространства и сокращает время мы – структуры $MFT.
доступа. Нерезидентные – хранят в $MTF лишь свой заго-
ловок, описывающий порядок размещения атрибута на Главная файловая запись
диске. (master file table)
Назначение атрибута определяется его типом (type) – В процессе форматирования логического раздела, в его
четырехбайтовым шестнадцатеричным значением. При начале создается так называемая MTF-зона (MFT-zone), по
желании атрибуту можно дать еще и имя (name), состоя- умолчанию занимающая 12,5% от емкости тома (а вовсе
щее из символов, входящих в соответствующее простран- не 12%, как утверждается во многих публикациях), хотя в
ство имен. Подавляющее большинство файлов имеет по зависимости от значения параметра NtfsMftZoneReservation
меньшей мере три атрибута: стандартная информация о она может составлять 25%, 37% или 50%.
файле (время создания, модификации последнего досту- В этой области расположен $MFT-файл, изначально
па, права доступа и т. д.) хранится в атрибуте типа 10h, ус- занимающий порядка 64 секторов и растущий от начала

Версии NTFS
Служебные структуры файловой системы NTFS не остают- измененных структурах и разрушить вполне здоровый том.
ся постоянными, а слегка меняются от одной версии Òàáëèöà 1. Îïðåäåëåíèå âåðñèè NTFS ïî îïåðàöèîííîé ñèñòåìå
Windows NT к другой (см. таблицу 1). Этот факт следует
принять во внимание при использовании автоматизирован-
ных «докторов». Попав на более свежую версию NTFS,
«доктор», не оснащенный мощным AI, может запутаться в

№11(24), ноябрь 2004 73


образование
MFT-зоны к ее концу по мере создания новых пользова- Record, хотя теоретически этих записей может потребовать-
тельских файлов/подкаталогов. Таким образом, чем боль- ся и несколько.
ше файлов содержится на дисковом томе, тем больше раз- Для ссылки на одну файловую запись из другой исполь-
мер MFT. Приблизительный размер $MFT-файла можно зуется ее порядковый номер (он же индекс) в $MFT-файле,
оценить по следующей формуле: sizeof(FILE Record) N Files, отсчитываемый от нуля. Файловая ссылка (file reference) со-
где sizeof(FILE Record) обычно равен 1 Кб, а N Files – пол- стоит из двух частей (см. таблицу 2) – 48-битного индекса и
ное количество файлов/подканалов раздела, включая не- 16-битного номера последовательности (sequence number).
давно удаленные. При удалении файла/каталога соответствующая ему
Для предотвращения фрагментации $MFT-файла MFT- файловая последовательность помечается как неисполь-
зона удержится зарезервированной вплоть до полного ис- зуемая. При создании новых файлов записи, помеченные
черпания свободного пространства тома, затем незадей- как неиспользуемые, могут задействоваться вновь, при
ствованный «хвост» MFT-зоны усекается в два раза, осво- этом счетчик номера последовательности, хранящийся
бождая место для пользовательских файлов. Этот процесс внутри файловой записи, увеличивается на единицу. Этот
может повторяться многократно, вплоть до полной отдачи механизм позволяет отслеживать «мертвые» ссылки на уже
всего зарезервированного пространства. Решение краси- удаленные файлы – очевидно, sequence number внутри file
вое, хотя и не новое. Многие из файловых систем восьми- reference будет отличаться от номера последовательности
десятых позволяли резервировать заданное дисковое про- соответствующей файловой записи (этой проверкой зани-
странство в хвосте активных файлов, тем самым сокращая мается утилита chkdsk и автоматически, насколько мне из-
их фрагментацию (причем любых файлов, а не только слу- вестно, она не выполняется).
жебных). В частности, такая способность была у DOS 3.0, Òàáëèöà 2. Ñòðóêòóðà ôàéëîâîé ññûëêè (file reference)
разработанной для персональных компьютеров типа Агат.
Может, кто помнит такую машину?
Когда $MFT-файл достигает границ MFT-зоны, в ходе
своего последующего роста он неизбежно фрагментирует-
ся, вызывая обвальное падение производительности фай- Первые 12 записей в MFT всегда занимают служебные
ловой системы, причем подавляющее большинство деф- метафайлы: $MFT (собственно, сам $MFT), $MFTMirr (зер-
рагментаторов $MFT-файл не обрабатывают! А ведь API кало $MFT), $LogFile (файл транзакций), $Volume (сведе-
дефрагментации, встроенное в штатный NTFS-драйвер, это ния о дисковом томе), $AttrDef (определенные атрибуты),
в принципе позволяет! Подробности (вместе с самой ути- «.» (корневой каталог), $Bitmap (карта свободного простран-
литой дефрагментации) можно найти на сайте Марка Рус- ства), $Boot (системный загрузчик), $BadClus (перечень
синовича. Но, как бы то ни было, заполнять дисковый том плохих кластеров) и т. д.
более чем на 88% его емкости категорически не рекомен- Первые четыре записи настолько важны, что продубли-
дуется! рованы в специальном $MFTMirr-файле, находящемся при-
При необходимости $MFT-файл может быть перемещен близительно посередине диска (точное расположение хра-
в любую часть диска, и тогда в начале тома его уже не ока- нится в boot-секторе по смещению 38h байт от его начала).
жется. Стартовый адрес $MFT-файла хранится в Boot-сек- Вопреки своему названию, $MFTMirr – это отнюдь не зер-
торе по смещению 30h байт от его начала (см. «boot-сек- кало всего $MFT-файла, это всего лишь копия первых че-
тор», описанный в предыдущей статье данного цикла) и в тырех элементов.
подавляющем большинстве случаев этот адрес ссылается Записи с 12 по 15 помечены как используемые, но в
на 4-й кластер. действительности же они пусты (как нетрудно догадаться,
это задел на будущее). Записи с 16 по 23 не задействова-
ны и честно помечены как неиспользуемые.
Начиная с 24-й записи располагаются пользовательс-
кие файлы и каталоги. Четыре метафайла, появившихся в
W2K – $ObjId, $Quota, $Reparse и $UsnJrnl, могут распола-
гаться в любой записи, номер которой равен 24 или боль-
ше (как мы помним, номера файловых записей отсчитыва-
Ðèñóíîê 2. Ñòðóêòóðà äèñêîâîãî òîìà ïîä NTFS ются начиная с нуля).
$MFT-файл представляет собой массив записей типа Для знакомства с MFT запустим DiskExplorer от Runtime
FILE Record (или в терминологии UNIX – inodes), каждая из Software, не забывая о том, что он требует прав админист-
которых описывает соответствующий ей файл или подка- ратора, в меню «File» найдем пункт «Drive» и в открывшем-
талог (подробнее см. раздел «Файловые записи»). ся диалоговом окне выберем логический диск, который мы
В подавляющем большинстве случаев файл/подкаталог хотим редактировать. Затем в меню «Goto» выберем пункт
полностью описывается одной-единственной записью FILE «Mft», заставляя DiskExplorer перейти к MFT, автоматичес-

Полезный совет
Как быстро узнать тип текущего раздела – FAT или NTFS? Да очень просто – достаточно попробовать создать в его
корневом каталоге файл $mft – если он будет создан успешно, то это FAT и соответственно наоборот. Если файл $Extend
будет создан успешно, то версия файловой системы 3.0 или выше.

74
образование
ки меняя режим отображения на наиболее естественный писи из MFT. Лучше всего это делать на диске, содержа-
(см. рис. 3). щем небольшое количество файлов/каталогов. Чтобы не
Как вариант можно нажать <F6> (View as File Entry) и про- форматировать логический диск, создайте виртуальный
мотать несколько первых секторов клавишей <Page Down>. (благо количество оперативной памяти современных ком-
Для каждого из файлов DiskExplorer сообщает: пьютеров это позволяет).
! номер сектора, к которому данная файловая запись при-
надлежит (обратите внимание, что номера секторов
монотонно увеличиваются на 2, подтверждая тот факт,
что размер одной файловой записи равен 1 Кбайту,
однако вы можете столкнуться и с другими значения-
ми). Для удобства информация отображается сразу в
двух системах исчисления – шестнадцатеричной и де-
сятичной;
! основное имя файла/каталога (т.е. имя файла из заго-
ловка файловой записи, некоторые файлы имеют не-
сколько альтернативных имен). Если имя файла/ката-
лога зачеркнуто, значит, он был удален, но соответству-
ющая ему файловая запись все еще цела. Чтобы из-
влечь файл с диска (не важно, удаленный или нет) под-
ведите к нему курсор и нажмите <Ctrl-T> для просмотра
его содержимого в шестнадцатеричном виде или <Ctrl-
S> для сохранения файла на диск. То же самое можно Ðèñóíîê 3. DiskExplorer îòîáðàæàåò ãëàâíóþ ôàéëîâóþ çàïèñü
сделать и через контекстное меню (раздел «recovery»). â åñòåñòâåííîì âèäå
При нажатии на <Ctrl-C> в буфер обмена копируется
последовательность кластеров, занятых файлом (напри- Файловые записи (FILE Record)
мер, «DISKEXPL:K:1034240-1034240»). Благодаря наличию Disk Explorer от Runtime Software с фай-
! тип файловой записи – файл это или каталог? ловыми записями практически никогда не приходится ра-
! атрибуты файла/каталога – a = архивный файл, r = толь- ботать вручную, тем не менее знание их структуры нам не
ко на чтение, h = скрытый, s = системный, l = метка тома, помешает.
d = каталог, c = сжатый файл; Структурно файловая запись состоит из заголовка
! размер файла в байтах в десятичной системе исчисле- (header) и одного или нескольких атрибутов (attribute) про-
ния (не для каталогов!); извольной длины, завершаемых маркером конца (end
! дату и время модификации файла/каталога; marker) – четырехбайтовым шестнадцатеричным значени-
! номер первого кластера файла/каталога (или «resident» ем FFFFFFFFh (см. листинг 1). Несмотря на то что количе-
для полностью резидентных файлов/каталогов); ство и длина атрибутов меняется от одной файловой запи-
! перечень типов NTFS-атрибутов, имеющихся у файла/ си к другой, размер самой структуры FILE Record строго
каталога, записанных в шестнадцатеричной нотации фиксирован и в большинстве случаев равен 1 Кбайту (это
(обычно эта строка имеет вид 10 30 80 – атрибут стан- значение хранится в $boot-файле, не путать с boot-секто-
дартной информации, атрибут имени и атрибут данных ром!). Причем первый байт файловой записи всегда совпа-
файла); дает с началом сектора.
! индекс файловой записи в MFT, выраженный в шест- Если реальная длина атрибутов меньше размеров фай-
надцатеричной и десятичной системах исчисления и сле- ловой записи, ее хвост просто не используется. Если же
дующий за словом «No:» (сокращение от Number – но- атрибуты не вмещаются в отведенное им пространство,
мер); создается дополнительная файловая запись (extra FILE
! индекс файловой записи материнского каталога, выра- Record), ссылающаяся на свою предшественницу.
женный в шестнадцатеричной и десятичной системах
исчисления (5h – если файл принадлежит к корневому Ëèñòèíã 1. Ñòðóêòóðà ôàéëîâîé çàïèñè
каталогу). Для быстрого перемещения по файловым за- FILE Record
писям выберите в меню «Goto» пункт «Mft no» и введи- Header ; çàãîëîâîê
Attribute 1 ; àòðèáóò 1
те требуемый индекс в шестнадцатеричной или деся- Attribute 2 ; àòðèáóò 2
тичной форме; ... ; …
Attribute N ; àòðèáóò N
! для нерезидентных файлов/каталогов – перечень клас- End Marker (FFFFFFFFh) ; ìàðêåð êîíöà
теров, занятых файлов в недекодированном виде (а
зря – могли бы и декодировать!). Схема кодирования Первые четыре байта заголовка оккупированы маги-
кластеров будет описана в следующей статье. ческой последовательностью «FILE», сигнализирующей о
том, что мы имеем дело с файловой записью типа
Прежде чем продолжать чтение статьи, попробуйте по- FILE Record. При восстановлении сильно фрагментирован-
экспериментировать с $MFT-файлами (особенно фрагмен- ного $MFT-файла это обстоятельство играет решающую
тированными). Посмотрите, как создаются и удаляются за- роль, поскольку позволяет отличить сектора, принадлежа-

№11(24), ноябрь 2004 75


образование
щие MFT, от всех остальных. Следом за сигнатурой идет Остальные поля заголовка файловой записи не столь
16-разрядный указатель, содержащий смещение последо- важны и поэтому здесь не рассматриваются. При необхо-
вательности обновления (update sequence, см. раздел димости обращайтесь к документации «Linux-NTFS Project».
«Последовательности обновления»). Под «указателем» Òàáëèöà 3. Ñòðóêòóðà çàãîëîâêà ôàéëîâîé çàïèñè (FILE Record)
здесь и до конца раздела подразумевается смещение от
начала сектора, отсчитываемое от нуля и выраженное в
байтах. В NT и W2K это поле всегда равно 002Ah, поэтому
для поиска файловых записей можно использовать сиг-
натуру «FILE*\x00», что уменьшает вероятность ложных
срабатываний. Правда, в XP и более старших системах
последовательность обновления хранится по смещению
002Dh, и поэтому сигнатура приобретает следующий вид
«FILE-\x00».
Размер заголовка (кстати сказать, варьирующийся от
одной операционной системы к другой) в явном виде нигде
не хранится, вместо этого в заголовке присутствует указа-
тель на первый атрибут, содержащий его смещение в бай-
тах относительно начала FILE Record, расположенный по
смещению 14h байт от начала сектора. Смещения после-
дующих атрибутов (если они есть) определяются путем сло-
жения размеров всех предыдущих атрибутов (размер каж-
дого из атрибутов содержится в его заголовке) со смеще-
нием первого атрибута. За концом последнего атрибута
находится маркер конца – FFFFFFFFh.
В добавок к этому длина файловой записи хранится в
двух полях – 32-разрядное поле реального размера (real
size), находящееся по смещению 18h байт от начала секто-
ра, содержит совокупный размер заголовка, всех его атри-
бутов и маркера конца, округленный по 8-байтной границе.
32-разрядное поле выделенного размера (allocated size),
находящееся по смещению 1Сh байт от начала сектора, Последовательности обновления
содержит действительный размер файловой записи в бай- (update sequence)
тах, округленный по размеру сектора. Документация Linux- Будучи очень важными компонентами файловой системы,
NTFS Project (версия 0.4) утверждает, что allocated size дол- $MFT, INDEX и $LogFile нуждаются в механизме контроля
жен быть кратен размеру кластера, однако в действитель- целостности своего содержимого. Традиционно для этого
ности это не так. В частности, на моей машине allocated используются ECC/EDC-коды, однако во времена проекти-
size равен четвертинке кластера. рования NTFS процессоры были не настолько быстрыми,
16-разрядное поле флагов, находящееся по смещению как теперь, и расчет корректирующих кодов занимал зна-
16h байт от начала сектора, в подавляющем большинстве чительное время, существенно снижающее производитель-
случаев принимает одно из трех следующих значений: 00h – ность файловой системы. Поэтому от них пришлось отка-
данная файловая запись не используется или ассоцииро- заться. Вместо этого разработчики NTFS применили так
ванный с ней файл/каталог удален, 01h – файловая запись называемые последовательности обновления (update
используется и описывает файл, 02h – файловая запись sequence), так же называемые fix-up.
используется и описывает каталог. В конец каждого из секторов, слагающих файловую
64-разрядное поле, находящееся по смещению 20h байт запись (INDEX Record, RCRD Record или RSTR Record) за-
от начала сектора, содержит индекс базовой файловой за- писывается специальный 16-байтовый номер последова-
писи. Для первой файловой записи это поле всегда равно тельности обновления (update sequence number), дублиру-
нулю, а для всех последующих, расширенных (extra) запи- емый в заголовке файловой записи. При каждой операции
сей – индексу первой файловой записи. Расширенные фай- чтения два последних байта сектора сверяется с соответ-
ловые записи могут находиться в любых частях MFT, не ствующим полем заголовка, и если NTFS-драйвер обнару-
обязательно рядом с основной записью. А раз так, необхо- живает расхождение, данная файловая запись считается
дим какой-то механизм, обеспечивающий быстрый поиск недействительной.
расширенных файловых записей, принадлежащих данно- Основное назначение последовательностей обновле-
му файлу (просматривать весь MFT целиком не предлагать). ния – защита от «обрыва записи». Если в процессе записи
И этот механизм основан на ведении списков атрибутов сектора на диск исчезнет питающее напряжение, может
$ATTRIBUTE_LIST. случиться так, что половина файловой записи будет успеш-
Список атрибутов представляет собой специальный ат- но записана, а другая половина – сохранит прежнее содер-
рибут, добавляемый к первой файловой записи и содержа- жимое (файловая запись, как мы помним, обычно состоит
щий индексы расширенных записей. из двух секторов). После восстановления питания драйвер

76
образование
файловой системы не может уверенно сказать – была ли Ëèñòèíã 2. Îðèãèíàëüíàÿ ôàéëîâàÿ çàïèñü äî âîññòàíîâëåíèÿ
файловая запись записана целиком или нет. Вот тут-то пос-
ледовательности обновления и выручают! При каждой пе-
резаписи сектора update sequence увеличивается на еди-
ницу, и потому, если произошел обрыв записи, значение
последовательности обновления находящейся в заголовке
файловой записи, не будет совпадать с последовательнос-
тью обновления, расположенной в конце сектора. Сигнатура «FILE» указывает на начало файловой запи-
Оригинальное содержимое, расположенное «под» пос- си. А раз так, по смещению 04h байт будет расположен 16-
ледовательностью обновления, хранится в специальном мас- разрядный указатель на номер последовательности обнов-
сиве обновления (update sequence array), находящимися в ления. В данном случае он равен 002Ah. ОК! Переходим по
заголовке файловой записи непосредственно за концом смещению 002Ah и видим, что здесь лежит слово 0006h.
update sequence number. Для восстановления файловой за- Перемещаемся в конец сектора и сверяем его с последни-
писи в исходный вид мы должны извлечь из заголовка ука- ми двумя байтами. Как и предполагалось, они совпадают.
затель на update sequence number (он хранится по смеще- Повторяем ту же самую операцию со следующим сектором.
нию 04h байт от начала заголовка) и сверить лежащее по Собственно говоря, количество секторов может и не рав-
этому адресу 16-байтное значение с последним словом каж- няться двум. Чтобы не гадать на кофейной гуще, необходи-
дого из секторов, слагающих файловую запись (INDEX мо извлечь 16-разрядное значение, расположенное по сме-
Record, RCRD Record или RSTR Record). Если они не совпа- щению 06h от начала файловой записи (в данном случае
дут, значит соответствующая структура данных повреждена оно равно 0003h) и вычесть из него единицу. Действитель-
и использовать ее следует с очень большой осторожностью но, получается два (сектора).
(а на первых порах лучше не использовать вообще). Теперь нам необходимо найти массив последователь-
По смещению 006h от начала сектора находится 16- ности обновления, хранящий оригинальное значение пос-
разрядное поле, хранящее совокупный размер номера леднего слова каждого из секторов. Смещение массива
последовательности обновления вместе с массивом пос- обновления рассчитывается по следующей формуле: offset
ледовательности обновления: of (update sequense number) + 2, т.е. в данном случае
002Ah + 02h == 002Ch. Извлекаем первое слово (в данном
(sizeof(update sequence number) + sizeif(update sequence array)) случае равное 00h 00h) и записываем его в конец первого
сектора, затем делаем то же самое со вторым.
выраженный в словах (не в байтах!). Поскольку размер но- В результате чего восстановленный сектор будет выг-
мера последовательности обновления всегда равен одно- лядеть так:
му слову, то размер массива последовательности обнов-
ления, выраженный в байтах, равен: Ëèñòèíã 3. Âîññòàíîâëåííàÿ ôàéëîâàÿ çàïèñü

(update sequence number & update sequence array - 1)*2

Соответственно смещение массива оригинального со-


держимого равно:

(offset to update sequence number) + 2


Заключение
В NT и W2K update sequence number всегда располага- Вооруженные джентльменским набором знаний об устрой-
ется по смещению 2Ah от начала FILE Record Header/ стве файловой записи, в следующей статье этого цикла мы
INDEX Header, а update sequence array – по смещению 2Сh. сможем погрузиться внутрь атрибутов, рассмотрев, как хра-
В XP же и более старших системах – по смещениям 2Dh и нятся резидентные и нерезидентные потоки данных на же-
2Fh соответственно. стком диске.
Первое слово массива последовательности обновления
соответствует последнему слову первого сектора Литература:
FILE Record/INDEX. Второе – последнему слову второго 1. Касперски К. Востановление данных на NTFS-разделах. –
сектора и т. д. Для восстановления сектора в исходный вид Журнал «Системный администратор», №9, сентябрь
мы должны вернуть все элементы массива последователь- 2004г.
ности обновления на их законные места (естественно, мо- 2. Касперски К. Востановление данных на NTFS-разделах.
дифицируется не сам сектор, а его копия в памяти). Часть 2. – Журнал «Системный администратор», №10,
Продемонстрируем это на следующем примере: октябрь 2004г.

Внимание!
FILE Record, INDEX Record, RCRD Record или RSTR Record искажены последовательностями обновления и в обязатель-
ном порядке должны быть восстановлены перед их использованием, в противном случае вместо актуальных данных вы
получите мусор!

№11(24), ноябрь 2004 77


образование конкурсная статья

РАЗРАБОТКА СЦЕНАРИЯ РЕГИСТРАЦИИ


ПОЛЬЗОВАТЕЛЕЙ В СЕТИ
ЧАСТЬ1
ИВАН КОРОБКО
На протяжении года в своих статьях я рассказывал о том, ! вывод информации в виде диалоговых сообщений;
как автоматизировать различные процессы в сети, упрос- ! подключение сетевых ресурсов;
тить администрирование. Решение поставленной задачи ! чтение информации из входного потока;
нетривиально и состоит из нескольких частей. Одной из ! расширенная поддержка редактирования реестра (ра-
них является сценарий регистрации пользователей в сети. бота с локальным и удаленным реестром, поддержка
Этот вопрос был частично рассмотрен в одной из преды- операций с кустами (hives));
дущих статей [1]. Она носила концептуальный характер, ! поддержка INI-файлов;
однако на форуме читатели дали понять, что концепция – ! расширенная поддержка операций со строками и мас-
это хорошо, но необходимо привести конкретный пример – сивами (поддержка статических и динамических, мно-
скрипт. Пришла пора сложить недостающие кусочки мо- гомерных массивов);
заики в одно целое и подробно рассказать о теоретичес- ! сбор информации о пользователе и рабочей станции;
ких и практических аспектах его создания, особенностях ! поддержка OLE-объектов;
внедрения. ! операции с файлами и каталогами;
Назовем основные из них: ! создание ярлыков Windows.
! Инвентаризация. Включает в себя сбор информации о
регистрирующемся в сети пользователе, рабочей стан- Решение задачи инвентаризации
ции и формирование файла отчета.
! Автоматическое подключение сетевых ресурсов: прин- Введение
теров и дисков. Решение этой задачи состоит из нескольких частей – сбора,
! Автоматическое конфигурирование рабочих станций. записи на носитель в определенном формате и обработки
! Обеспечение интерактивности работы скрипта. В ходе информации. Две первые подзадачи можно реализовать с
выполнения скрипта на экране отображается соответ- помощью сценария загрузки, третья реализуется с помощью
ствующая информация. После его выполнения пользо- дополнительного программного обеспечения. Собираемая
ватель может ознакомиться с подключенными ресурса- информация касается программного и аппаратного обеспе-
ми, информацией о рабочей станции и т. д. чения, характеристик учетной записи пользователя, регист-
рирующегося в сети. Собираемые данные можно условно
Прежде чем приступить к созданию скрипта, необходи- разделить на две части. К первой части относится информа-
мо сказать несколько слов о языке программирования, с ция об аппаратном и программном обеспечении. Данные об
помощью которого он будет создан. аппаратном обеспечении черпаются из WMI, а о программ-
ном – из реестра либо с помощью WMI, либо с помощью
KIXTart KIXTart1. Вторая часть – информация, характеризующая по-
Для создания сценариев регистрации пользователей суще- ложение рабочей станции в сети. К ней также относятся свой-
ствует множество языков, однако остановим свой выбор ства учетной записи текущего пользователя. Эта половина
на языке KIXTart. Он является стандартным языком програм- реализуется с помощью макросов, встроенных в KIXTart, и
мирования сценариев компании Microsoft. Его дистрибутив чтения полей Active Directory. Для решения задачи инвента-
можно найти в Microsoft Resource Kit или бесплатно загру- ризации нам необходимо осветить следующие темы.
зить последнюю версию из сети Интернет (http://kixtart.org). ! чтение разделов WMI;
Замечание. Сценарии, созданные вами ранее на VBScript, ! управление реестром с помощью KIXTart;
Jscript могут быть легко переписаны под KIXtart. Все при- ! использование макросов KIXTart;
меры в этой статье написаны на языке KIXTart. ! чтение полей из Active Directory;
Думаю, что нет необходимости описывать преимуще- ! формирование файла отчета.
ства этого языка перед VBScript или каким-нибудь другим
языком. Стоит лишь отметить, что KIXtart разрабатывался Вопреки ожиданиям читателя я начну описывать реше-
исключительно для создания сценариев, с помощью кото- ние задачи инвентаризации с конца, т.е. с формирования
рых пользователи регистрировались бы в сети. KIXTart вер- файла отчета. Это позволит избежать лишних вопросов и
сии 4.21 поддерживает около 100 функций, столько же мак- недопонимания излагаемого материала при иллюстриро-
росов-функций и обладает следующими возможностями: вании теории наглядными примерами.

1
Рекомендуется использовать встроенные функции KIXTart, поскольку нет смысла искусственно усложнять и увеличивать листинг скрипта.

78
образование
Формирование файла отчета. Теория Формирование файла отчета. Практика
Отчеты о работе сценария регистрации пользователей в Процесс формирования отчета состоит из двух частей: на-
сети рекомендуется формировать в формате XML. Основ- копления данных в переменную и запись значения пере-
ная причина, по которой стоит обратить внимание на XML, менной в XML-файл.
заключается в том, что он используется как базами дан-
ных, так и интернет-приложениями при работе с браузером. Накопление данных в переменной
При использовании XML на рабочую станцию пользовате- Как отмечалось в теоретической части, XML-файл должен
ля отдельно передаются данные и отдельно правила интер- иметь заголовок, в котором описана версия используемого
претации этих данных для отображения с помощью, напри- языка и указана кодировка. Если не указывать кодировку,
мер, Jscript или VBScript. В нашем случае XML-файл будет то при наличии, например, русских символов созданный
содержать только данные. файл не будет открываться и обрабатываться ни одним
Как и HTML, XML является независимым от платформы браузером. Данные рекомендуется накапливать в любую
стандартом. С полным вариантом спецификации XML мож- переменную строкового типа.
но ознакомиться на http://www.w3c.org/xml. Внешне XML-до- Замечание. Чтобы при просмотре записанного в любом
кумент очень похож на HTML-документ, т.к. XML-элементы из тестовых редакторов (например, NOTEPAD.EXE) файла
также описываются с помощью ключевых слов – тегов. Од- данные были поделены на строки, добавьте в конце строки
нако, в отличие от HTML, в XML пользователь может созда- следующий код:
вать собственные элементы. Теги XML определяют структу-
рированную информацию. Синтаксис элементов (тегов), со- "chr(13)+chr(10)"
ставляющих структуру XML-файла, в общем виде можно
представить следующим образом: В теоретической части была приведена структура XML-
файла. Приведем листинг, позволяющий сформировать
<Element> файл в формате XML (пример смотрите далее по тексту).
[attr1=”val1” [attr2=”val2”…]]
</Element> Напомню, что в названии файла и главного тега должно
быть использовано имя рабочей станции, а не учетной за-
Приведем несколько основных правил, которыми необ- писи пользователя. Это связано с тем, что с одной рабочей
ходимо руководствоваться при создании XML-документов: станции в сети может зарегистрироваться только один
! Документ состоит из элементов разметки (markup) и не- пользователь, в то время как один и тот же пользователь с
посредственно данных (content). помощью своей учетной записи может зарегистрироваться
! Все элементы описываются с помощью тегов. на нескольких рабочих станциях. Таким образом, чтобы си-
! В заголовке документа должны быть идентификацион- стемный администратор получил исчерпывающую инфор-
ные данные: используемый язык разметки, его версия, мацию о каждой из рабочих станций, зарегистрированных
кодировка страницы и т. д. Заголовок описывается с по- в сети, о свойствах учетных записей пользователей и др., в
мощью тега <%..... %>. имени файла и главного тега рекомендуется использовать
! В XML учитывается регистр символов. имя рабочей станции, которое возвращает макрос @wksta.
! Все значения атрибутов должны быть заключены в ка- В синтаксисе XML-файла есть одно ограничение – тег не
вычки. может начинаться с цифр, поэтому, если в вашей сети ра-
бочие станции имеют цифровые имена, например, 1130pc,
Любой файл в формате XML, как уже говорилось, име- 2310nb (pc – Personal Computer, nb - Notebook), то главный
ет обязательный заголовок и заглавный тег, в котором рас- тег рекомендуется предварять каким-нибудь символом,
положены все остальные теги. Приведем структуру XML- например символом подчеркивания – «_». Необходимо на-
файла в общем виде: помнить еще об одном важном правиле: в названии тегов
необходимо учитывать регистр.
<?xml version=”1.0” encoding=”windows-1251” ?> Теперь, когда рассмотрены все теоретические аспекты,
<main_element>
приведем пример:
<Element1>
[attr1=”val1” [attr2=”val2”…]] $en=chr(13)+chr(10) ‘ ïåðåõîä íà íîâóþ ñòðîêó
</Element1>
<Element2> ; íàêîïëåíèå ïåðåìåííîé
[attr1=”val1” [attr2=”val2”…]] $t=”<?xml version=””1.0”” encoding=””windows-1251”” ?>”
</Element2>
…………………………. $t=$t+"<_@wksta>"+$en
$t=$t+"”<Parameter1> @ProductType </ Parameter1>"+$en
</main_element> $t=$t+"< Parameter2> “+var1+ “</ Parameter2>"+$en

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


$t=$t+"</_@wksta>"
шаблону, смотрите на http://www.samag.ru/source.
Замечание. Этот шаблон включает в себя только инфор- ; ôîðìèðîâàíèå XML-ôàéëà
мацию, необходимую для успешной обработки файла отче- $filename=@wksta+".xml"
та. Он не содержит упоминания о стилях, о возможности $fso = CreateObject("Scripting.FileSystemObject")
$MyFile = $fso.CreateTextFile($filename, True, TRUE)
вставки в XML-файл программного кода. Полную версию $MyFile.WriteLine($t)
шаблону можете найти на сайте http://www.w3c.org/xml. $MyFile.Close

№11(24), ноябрь 2004 79


образование
WMI. Теория $strNameSpace=””
$strClass=””
$objWMIService = GetObject("winmgmts: ↵
Основы WMI {ImpersonationLevel=Impersonate }!// " & $strComputer ↵
Чтение информации об аппаратной конфигурации рабочей & ”/ ” & $strNameSpace)
$colItems = objWMIService.ExecQuery(“SELECT ïîëå_1, ↵
станции рекомендуется обеспечивать стандартными сред- ïîëå_2, …, ïîëå_n FROM” & $strClass )
ствами Microsoft Windows. Одним из таких средств являет- For Each $Element in$colItems
$Temp=$Element.Value
ся Microsoft Windows Management Instrument (WMI). Next
WMI, разработанный в 1998 году, предоставляет разра-
ботчикам программного обеспечения и администраторам В приведенных примерах значением переменной $str
сети стандартизированные способы наблюдения и управ- Computer является имя удаленного компьютера. Если ком-
ления как локальными, так и удаленными ресурсами сети. пьютер локальный, то вместо имени указывается символ
Исполняемым файлом, обеспечивающим функциониро- «.» (точка):
вание WMI, является файл winmgmt.exe, находящийся в
каталоге c:\WINNT\system32\wbem\ Microsoft Windows 200x. $strComputer=”.”
Механизм работы WMI следующий:
! На первом этапе происходит подключение к службе WMI Переменная $strNameSpace содержит пространство
локального или удаленного компьютера: при обраще- имен. $strClass – переменная, включающая в себя назва-
нии приложения к WMI запросы приложения пересыла- ние класса. Например, для Win32 Provider одним из клас-
ются диспетчеру CIMOM (Common Information Model сов является Win32_BIOS, соответственно переменная
Object Manager), который обеспечивает первоначальное $strName Space принимает значение Root\Cimv2. Инструк-
создание объектов и однообразный способ доступа к ция {ImpersonationLevel=Impersonate}! заставляет выполнить
управляемым объектам. Наиболее простым способом сценарий с привилегиями пользователя, вызывающего сце-
подключения к удаленному компьютеру является вызов нарий, а не с привилегиями пользователя, который в на-
функции языка VBScript GetObject(). Подключение к уда- стоящий момент зарегистрирован на рабочей станции. Та-
ленному компьютеру происходит с помощью протокола ким образом, осуществляется подстановка, которая полез-
winmgmts. на при выполнении сценариев удаленного доступа на та-
! На втором этапе происходит проверка хранилища объек- ких ОС, как Microsoft Windows 200x, где эта инструкция яв-
тов. Затем запрос передается поставщику объекта. ляется выражением подстановки по умолчанию, поэтому
Поставщик (provider) – это интерфейс между управляе- для этого семейства ее можно опустить.
мым устройством и диспетчером CIMOM. Поставщик Варианты доступа A и Б к объектной модели WMI отли-
собирает информацию об устройствах и делает ее дос- чаются лишь формой записи. В варианте B обращение к
тупной для диспетчера. классу строится с помощью SQL-запроса, что позволяет
! На третьем этапе, после окончания обработки запроса, экономить трафик. В общем случае запрос SQL выглядит
поставщик пересылает результаты исходному сценарию следующим образом:
или приложению.
SELECT ïîëå_1, ïîëå_2, …, ïîëå_n FROM strClass
Способы доступа к объектам WMI
На практике доступ к объектам WMI получают одним из В поле SELECT указываются поля, по которым идет
способов, проиллюстрированных в следующих шаблонах: выборка. Поля перечисляются через запятую, «пробелы»
после запятой обязательны. Если выборка должна идти по
A) всем полям, то вместо названий полей указывается сим-
$strComputer=”” вол «*». В поле FROM указывается один из ранее перечис-
$strNameSpace=”” ленных поставщиков: SELECT * FROM $strClass.
$strClass=””
$objElements = GetObject( "winmgmts: ↵ В зависимости от способа доступа к хранилищу размер
{ImpersonationLevel=Impersonate}!//" & $strComputer ↵ пересылаемых данных разный.
& ”/ ” &$strNameSpace & ”: ” & $strClass)
For each $Element in $objElements Òàáëèöà 1
$Temp=$Element.Value
Next
Á)

$strComputer=””
$strNameSpace=”” Вывод: видно, что на практике лучше всего использо-
$strClass=””
$objWMIService = GetObject( "winmgmts: ↵ вать вариант В. Несмотря на то что код получится несколь-
{ImpersonationLevel=Impersonate}!//" & $strComputer ↵ ко громоздким, уменьшится сетевой трафик, сократится
& ”/ ” & $strNameSpace)
$colItems = $objWMIService.InstancesOf($strClass ) время работы сценария.
For Each $Element in $colItems
$Temp=$Element.Value
Next WMI. Практика
Для сбора информации различного характера необходимо
Â)
использовать Win32 Provider, которому соответствует про-
$strComputer=”” странство имен Root\Cimv2. Win32 Provider соответствует

80
образование
массив, состоящий из двух частей: идентификатора и на- $PC = @WKSTA
звания ресурса, которые разделены знаком подчеркивания. $en=chr(10)
Идентификатором всегда является «WIN32». $objWMIService = GetObject( "winmgmts://" + $pc+"/Root/Cimv2")
С объектной моделью WMI можно ознакомиться с по- $colItems = $objWMIService.ExecQuery( "Select * ↵
from Win32_BIOS")
мощью утилиты WMI Object Browser (см. рис. 2), входящей
в пакет WMI Tools. Набор утилит WMI Tools можно найти на For Each $objItem in $colItems
сайте компании Microsoft: http://msdn.microsoft.com/developer/ ? " BIOS Name : " + $objItem.Name
sdk/wmisdk/default.asp. ? " Version : " + $objItem.Version
? " Manufacturer : " + $objItem.Manufacturer
На практике для доступа к WMI-объектам рекомендует- ? " SMBIOS Version : " + $objItem.SMBIOSBIOSVersion
ся использовать нечто среднее между шаблонами, приве- Next
денными в теоретической части: Необходимо отметить, что все переменные, которые
использованы в данном примере, – строковые (см. рис. 2).
$strComputer=”” Если переменная является числом, то ее необходимо пре-
$strNameSpace=” Root\Cimv2”
$strClass=”Win32_Value” образовать в строковую переменную с помощью функции
$objWMIService = GetObject( " winmgmts: // " ↵ Сstr(). Если переменная представляет собой массив, то не-
& $strComputer & ”/ ” & $strNameSpace)
$colItems = objWMIService.ExecQuery(“SELECT ïîëå_1, ↵ обходимо прочитать элементы массива и преобразовать их
ïîëå_2, …, ïîëå_n FROM” & $strClass ) в строки в том случае, если элементы массива не являются
For Each $Element in $colItems
$Temp=$Element.Value строковыми переменными. Результатом выполнения дан-
Next ной программы будет сообщение вида:

Приведем пример чтения информации BIOS материнс-


кой платы с помощью WMI на Kixtart на основе обобщенно-
го варианта 3 рабочей станции ComputerName. Массив дан-
ных, в котором содержится информация о материнской пла-
те, называется WIN32_BIOS: Ðèñóíîê 1

Ðèñóíîê 2

№11(24), ноябрь 2004 81


образование
Поскольку вышеприведенный механизм используется SYSTEM.INI и WIN.INI. Однако размер INI-файлов не мог пре-
многократно, то рекомендуется оптимизировать программ- вышать 64 Кб, поэтому, чтобы обойти это ограничение, для
ный код, сформировав из имен классов массив: каждой программы создавался свой INI-файл. Со време-
нем из-за большого количества конфигурационных файлов
$wmi_array="Win32_BIOS","Win32_Processor",……" производительность операционной системы значительно
$æ=…
for $a=0 to $æ понизилась. В 1993 году была создана операционная сис-
$objWMIService = GetObject( "winmgmts://@wksta/root/cimv2" ) тема Microsoft Windows NT, в которой множество INI-фай-
$colItems = $objWMIService.ExecQuery( "Select * from ↵
"+ $wmi_array[$æ]) лов было заменено единой базой данных – реестром.
С точки зрения файловой системы реестр представляет
For Each $objItem in $colItems
собой файл с расширением DAT. Для Windows NT/200x ре-
select естр хранится в файле NTUSER.DAT, который находится в
case $a=0
каталоге %Windir%\Profiles3. В Windows 9x реестр состоит из
$mb1=$objItem.Name двух файлов: USER.DAT и SYSTEM.DAT, которые хранятся в
$mb2=$objItem.Manufacturer
$mb3=$objItem.SMBIOSBIOSVersion каталоге %Windir%. USER.DAT содержит настройки индиви-
$mb4=$objItem.Version дуального пользователя, а SYSTEM.DAT – настройки компь-
$lx1="<mb> <bios> $mb1 </bios>" ютера. Реестры Windows 9x, NT, 2000 несовместимы друг с
$lx2="<manufacture> $mb2 </manufacture>" другом, однако идея построения реестров едина.
$lx3="<version> $mb3 </version> "
$lx4="<data_release> $mb4 </data_release> </mb> "
$t="$t $lx220 $en $lx222 $en $lx224 $en $lx226 $en"
Ветви реестра
Реестр состоит из разделов верхнего уровня, называемых
case $a=1 кустами (или ульями, в оригинале hives):
$cpu_arhitect="x86","MIPS","ALPHA", "Power PC" ! HKEY_CLASSES_ROOT (HKCR);
$cpu_socket="","Other","Unknown","Daughter Board", ↵ ! HKEY_CURRENT_USER (HKCU);
"ZIF Socket","Replacement/Piggy Back","None", ↵
"LIF Socket","Slot 1", "Slot 2", "370 Pin Socket", ↵ ! HKEY_LOCAL_MACHINE (HKLM);
"Slot A", "Slot M","","","Socket 478" ! HKEY_USER (HKU);
$i=$objItem.Architecture ! HKEY_CURRENT_CONFIG (HKCC).
$ii=$cpu_arhitect[$i]
$cpu1=$objItem.Name + ", " + $objItem.MaxClockSpeed + " Mhz"
$cpu2=$objItem.Version + ", Level " + $objItem.Level Структура реестра такова: в каждом из разделов нахо-
дятся ключи, в которых содержатся параметры, имеющие
$i=$objItem.UpgradeMethod
$ii=$cpu_socket[$i] определенные значения. Рассмотрим подробнее назначе-
ние каждого из разделов реестра.
$cp1=$objItem.ExtClock+"Mhz"
$cp2=$objItem.L2CacheSize+"Kb" В разделе HKLM находится информация об аппаратном,
$lx5="<cpu> <processor> $cpu1 </processor>" программном обеспечении, а также сведения о системе бе-
$lx6="<version> $cpu2 </version> "
$lx7="<socket> $ii </socket>" зопасности. Раздел HKCR представляет собой виртуальную
$lx8="<external_clock> $cp1 </external_clock>" ссылку на раздел HKLM\Software\Classes и является одним
$lx9="<l2_cache> $cp2 </l2_cache> </cpu> "
из самых больших разделов реестра. В нем находится ин-
$t="$t $lx230 $en $lx232 $en $lx234 $en $lx236 $en $lx238 $en" формация обо всех расширениях файлов, определениях ти-
case $a=2 пов, ярлыках, привязке, классах идентификаторов и т. д.
………………………… Раздел HKU содержит настройки пользователя по умол-
End Select
Next чанию, в которые входят описания переменных среды, цве-
товых схем, шрифтов, сетевых настроек и т. д. Во время
регистрации нового пользователя на рабочей станции на
Реестр. Теория2 жестком диске для него создается новый профиль. Настрой-
ки, содержащиеся в профиле, копируются из раздела HKU.
Истоки реестра Изменения в разделах HKU и HKLM можно сделать с по-
Реестр – это иерархическая база данных, содержащая на- мощью утилиты REGEDT32.EXE в том случае, если у вас ОС
стройки аппаратного и программного обеспечения компь- Windows 2000, и REGEDIT.EXE – если Windows XP. Пользо-
ютера. Для обеспечения высокой скорости доступа к запи- ватель, от имени которого запускаются эти утилиты, должен
сям реестра информация в нем хранится в двоичном фор- обладать правами администратора.
мате, а сам реестр состоит из нескольких файлов. Раздел HKCU содержит сведения о текущем пользова-
В Microsoft Windows 3.x все настройки программного обес- теле и имеет название, соответствующее значению иден-
печения располагались в конфигурационных файлах, имею- тификатора безопасности (SID) данного пользователя. Каж-
щих расширение INI. Настройки программного обеспечения дый раз при перезагрузке компьютера этот раздел созда-
и операционной системы располагались в двух файлах: ется заново.

2
Информация, приведенная в этом разделе, также является теоретической частью для разделов, в которых описываются автоматизиро-
ванное подключение сетевых принтеров и процесс автоматизации конфигурирования рабочих станций.
3
В Microsoft Windows принято использовать переменные среды. %WinDir% содержит полный путь к каталогу, в котором установлена ОС,
например, C:\Windows.

82
образование
Раздел HKCC является ссылкой на текущий профиль Результат работы примера приведен на рис. 5.
оборудования, хранящейся в HKLM. С помощью профиля Зная имена папок, для каждой из них можно считать
оборудования определяют список устройств, драйвера ко- значения параметра «DisplayName».
торых будут подгружены в данном сеансе работы пользо- Следует отметить, что не все установленные приложе-
вателя. Профили изначально предназначены для перенос- ния содержат этот параметр в соответствующей папке, по-
ных компьютеров. этому в «Control Panel» отображаются не все установлен-
Раздел HKDD (HKEY_DYN_DATA) не хранится в реест- ные программы.
ре, а динамически создается при загрузке операционной Для обеспечения полноты предоставляемой информа-
системы. В нем содержатся сведения о самонастраиваю- ции в том случае, если запись «DisplayName» отсутствует,
щихся устройствах (Plug-and-Play). будет считываться название папки. В приведенном приме-
Как и любая база данных, реестр поддерживает несколь- ре в переменную t будут записываться данные, предназна-
ко типов данных, которые перечислены в таблице: ченные для XML-файла:
Òàáëèöà 2
$en=chr(10)+chr(13)

$t=$t+" <Installed_Programs> "


$i=1
$path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ ↵
CurrentVersion\Uninstall"
do
$loop = ENUMKEY($path, $Index)
$name=readvalue($path+" \"+$loop,"DisplayName")
if $name<>""
$t=$t+" <Program"+$I +"> " +$name+ " </Program"+$I +"> "$en
? " <Program"+$i +"> " +$name+ " </Program"+$I +"> "
Else
if $loop<>""
$t=$t+" <Program"+$I +"> " +$loop + " </Program"+$I +"> "$en
Реестр. Практика ? " <Program"+$I +"> " +$loop + " </Program"+$I +"> "
Отображаемый в «Add and Remove Programs» cписок уста- endif
endif
новленных программ на рабочей станции формируется на
основе информации из ветви реестра HKEY_LOCAL_ $Index = $Index + 1
$i=$Index+1
MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ until $loop=""
Uninstall. Рассмотрим подробнее структуру, содержащую-
$t=$t+" </Installed_Programs> "
ся в папке Uninstall. При установке любой программы на MessageBox($t, "",0,0)
жесткий диск компьютера в Windows 2000 или Windows XP
в ней создается подпапка. Ее имя совпадает либо с GUID4,
либо с названием программы. Внутри этой папки создает- Active Directory.Теория
ся ряд записей, содержащих информацию об установлен-
ном продукте (см. рис. 4). Active Directory
Необходимо отметить, что в подразделе «Add and Remove Active Directory (AD) – это служба каталогов, которая явля-
Programs» панели «Control Panel» список установленного ется иерархической базой данных, обеспечивающей цент-
программного обеспечения формируется на основе значе- рализованное управление сетью. Active Directory хранит в
ний, содержащихся в переменной «DisplayName» для каж- себе информацию об объектах сети и обеспечивает доступ
дого приложения. При выборе кнопки «Remove» операци- к этой информации пользователям, компьютерам и прило-
онная система выполняет команду, являющуюся значени- жениям.
ем переменной «UninstallString». В том случае, если значе- Active Directory обладает следующими особенностями:
ние этого параметра неверно, вы никогда не сможете уда- ! Масштабируемость. В отличие от большинства других
лить это приложение через «Control Panel». баз данных (БД), которые являются реляционными,
Однако вернемся к папкам. Для того чтобы считать из Active Directory является иерархической базой. В БД вза-
реестра названия установленных программ, сначала необ- имосвязи между записями определяются при помощи
ходимо получить доступ к подпапкам – узнать их названия, ключей, которые хранятся совместно с данными. В
которые содержатся в папке «Uninstall». Для этого следует иерархической базе данных взаимосвязи между запи-
использовать функцию EnumKey(): сями имеют характер «родитель-потомок»: каждая за-
пись, за исключением корневой, имеет родительскую
$path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ ↵ запись (родителя). У каждой родительской записи мо-
CurrentVersion\Uninstall"
жет быть один или несколько потомков. Иерархическая
do база данных позволяет хранить большое количество
$loop = ENUMKEY($path, $Index)
? $loop объектов, при этом быстро получать доступ к необходи-
until $loop="" мым объектам.

4
GUID (globally unique identificator, глобальный уникальный идентификатор) – 128-разрядный номер, служащий идентификатором. Присва-
ивается объекту в момент его создания и не может быть изменен.

№11(24), ноябрь 2004 83


образование
! Active Directory объединяет в себе концепцию простран- ратами обозначены классы, а кружками подклассы. Мето-
ства имен Интернета со службой каталогов Windows NT, ды доступа к каждому из перечисленных протоколов отли-
что позволяет объединить и управлять различными про- чаются, однако можно привести пример, который наглядно
странствами имен в разноразрядных аппаратных и про- иллюстрирует приведенную схему:
граммных средах. Для управления пространством имен
Active Directory используется библиотека интерфейса $obj=GetObject("Protocol://ClassName")
For each $SubClass in $ClassName
службы активного каталога (Active Directory Service ? $SubClass.Property
Interface – ADSI). Next
! Поддержка стандартных форматов имен. Active Directory
поддерживает несколько общих форматов имен. Этот
факт позволяет приложениям и пользователям получать
доступ к каталогу, применяя наиболее удобный для них
формат: UPN (RFC 882), LDAP URL (RFC 1779, 2247),
UNC(RFC 1123).

Объектная модель ADSI


Наглядная схема объектной модели ADSI приведена на
рис. 3.
Схема условно поделена на три части. Используя кли-
ента – язык программирования, скрипт получает доступ к Ðèñóíîê 3
COM-объектам. Объекты могут быть двух видов – класса-
ми и подклассами. Обращение к подклассам осуществля- Провайдеры ADSI
ется через классы, однако на схеме этого не показано, что- Интерфейс ADSI поддерживает следующие провайдеры, с
бы не загромождать рисунок. С помощью COM-объекта че- помощью которых осуществляется программное админис-
рез протокол LDAP или WinNT сценарий загрузки получает трирование (см. таблицу 4).
доступ к выбранному элементу объектной модели. Про- Для определения всех доступных в сети провайдеров
странство имен условно обозначено треугольником; квад- необходимо использовать службу ADS:

Ðèñóíîê 4

84
образование
$obj=GetObject("ADs:") боты с принтерами. Причина проста: в отличие от провай-
For Each $provider IN $obj дера LDAP, провайдер WinNT рассматривает принтер не как
$t=$t + $provider.name + chr(13)
Next сетевое, а как локальное устройство. Только с помощью
MessageBox($t, "",0,0) провайдера WinNT можно управлять состоянием и очере-
дями принтеров. Совместное использование обоих провай-
деров позволит осуществлять мониторинг и управление
сетевыми принтерами домена [2]. Порядок построения зап-
Òàáëèöà 3 роса для провайдера WinNT в формате UNC следующий:

WinNT:[//DomainName[/ComputerName[/ObjectName[,className]]]]

Объектная модель провайдера LDAP


Для программного управления Active Directory с помощью
провайдера LDAP необходимо использовать его объектную
Из всех перечисленных провайдеров будут рассмотре- модель. Объектная модель представляет собой совокупность
ны только: LDAP и WINNT. объектов, которые взаимосвязаны друг с другом и образу-
Провайдер ADSI LDAP выполняется на клиенте ADSI и ют между собой иерархическую структуру. Каждый из этих
обеспечивает доступ к Active Directory. Кроме служб ката- объектов имеет набор свойств, характерный исключитель-
логов Active Directory Windows 2000, LDAP-провайдер обес- но для объектов данного типа. Существует несколько ви-
печивает доступ к: дов (идентификаторов) объектов: CN, DС, OU. Расшифров-
! Netscape Directory Server; ка и назначение каждого объекта смотрите в таблице.
! Microsoft Exchange Server 5.x и выше; Òàáëèöà 4
! Microsoft Commercial Internet System (MCIS) Address Book
Server.

Для реализации программного управления Active Directory


часто используется именно этот провайдер. Запрос провай- Имена LDAP URL (см. RFC 1779, RFC 2247) построены на
деру LDAP составляется в формате LDAP URL (см. RFC основе протокола X.500 и используются для связывания с
1779, RFC 2247): объектами.
Идентификаторы объектов DC, OU, CN образуют полное
LDAP://HostName[:PortNumber][/DistinguishedName] составное имя (Distinguished Name, DN), а имя самого объек-
та – относительное составное имя (Relative Distinguished
Провайдер WinNT ADSI поддерживает доступ к катало- Name, RDN).
гам Microsoft Window 4.0/3.x, обеспечивает связь с PDC и Полное составное имя объекта включает в себя имя
BDC. Провайдер WinNT в основном используется для ра- объекта и всех его родителей, начиная с корня домена.

Ðèñóíîê 5

№11(24), ноябрь 2004 85


образование
Active Directory Viewer (Microsoft) и LDAP Browser 2.5.3
(Softerra).
Active Directory Viewer (ADV) является графической ути-
литой, позволяющей выполнять операции чтения, моди-
фицирования, осуществлять поиск в любых совместимых
каталогах, таких как Active Directory, Exchange Server,
Netscape Directory, Netware Directory. Active Directory Viewer
входит в состав SDK для Active Directory Services Interface,
который можно бесплатно загрузить с сайта Microsoft: http://
www.microsoft.com/ntserver/nts/downloads/other/adsi25.
После установки SDK for ADSI утилита Active Directory
Viewer (AdsVw.exe) будет находиться в c:\Program Files\
Ðèñóíîê 6 Microsoft\ADSI Resource Kit, Samples and Utilities\ADsVw.
Существует две формы доступа к ADSI: развернутая и Программа работает в двух режимах: ObjectViewer и
сокращенная. Рассмотрим принципы построения путей к Query.
ресурсу обоими способами на примере домена domain.com
(см. рис. 3).
! Развернутая форма. При использовании этого вида
формы строка связывания начинается с описания верх-
него элемента структуры. Затем происходит переход
вниз по иерархии. Необходимо помнить, что при напи-
сании пути к объекту необходимо исключать пробелы.
В качестве шаблона может служить выражение вида: Ðèñóíîê 7
Для просмотра объектной модели провайдера необхо-
$obj = GetObject ("LDAP://DC=Domain_name1 ↵ димо использовать режим ObjectViewer. Режим Query ис-
/DC=Domain_name2/DC=Domain_name3/ ↵
OU=OU_Name_Level1/OU=OU_Name_Level2…/ ↵ пользуется для осуществления поиска объектов в выбран-
OU=OU_Name_Level/CN=CN_Name") ной объектной модели. В данной статье режим Query рас-
сматриваться не будет. Просмотр и редактирование объек-
где DC=Domain_name1/DC=Domain_name2/DC=Domain_ тной модели программой ADV в режиме ObjectViewer. Пос-
name3 образуют полное имя контроллера домена, эле- ле выбора режима ObjectViewer появится диалоговое окно.
менты OU=OU_Name_Level1/OU=OU_Name_Level2…/
OU=OU_ Name_Level представляют собой вложенные
друг в друга элементы. В развернутой форме доступа
объект CN является «дном колодца» в иерархии.
Пример: запрос к объекту CN=User3 выглядит следую-
щим образом (см. рис. 3):

$obj = GetObject ("LDAP://DC=RU/DC=Domain1/ ↵


OU=Group1/OU=Group4/CN=User3")

! Сокращенная форма. Характеризуется тем, что строка


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

$obj=GetObject("LDAP://CN=CN_Name,OU=OU_Name_Level…, ↵
OU=OU_Name_Level2 ,OU=OU_Name_Level1/DC=…")
Ðèñóíîê 8
Соответственно запрос к объекту CN=User3 с помощью Для получения доступа к каталогу необходимо указать
сокращенной формы доступа выглядит следующим об- путь и параметры учетной записи, обладающей правами
разом: администратора (имя и пароль). Путь к каталогу должен
быть построен в соответствии со следующим шаблоном:
$obj=GetObject("LDAP://CN=User3,OU=Group4,OU=Group3, ↵
DC=Domain1, dc=RU") <Provider_Name:>//<Server_Name>/<Full_Domain_Name>

Active Directory. Практика Обратите внимание на две особенности шаблона, в нем


не должно быть пробелов, «слэши» должны быть прямы-
Объектная модель AD ми – «/». Невыполнение хотя бы одного из перечисленных
Управление объектами Active Directory невозможно без зна- условий приведет к ошибке в соединении с каталогом. Для
ния объектной модели. Существует несколько программ, доступа к серверу server домена domain.ru с помощью про-
предназначенных для нее. Рассмотрим лишь две из них: токола LDAP используется следующий запрос:

86
образование
LDAP://server/DC=domain,DC=ru Запрос строится по следующему шаблону:

После соединения с каталогом на экране будет отобра- SELECT ïîëå 11,ïîëå 21...ïîëå n1 FROM ïóòü ↵
WHERE objectClass="òèï_îáúåêòà"
жена его иерархическая структура.
где «путь» – путь к интересующему объекту AD в формате
LDAP URL.
На практике поиск объектов осуществляется следую-
щим образом:

$DomainName=”Domain”
$objConnection = CreateObject("ADODB.Connection")
$objCommand = CreateObject("ADODB.Command")
$objConnection.Provider = "ADsDSOObject"
$objConnection.Open "Active Directory Provider"
$objCommand.ActiveConnection = $objConnection
$objCommand.CommandText = "SELECT printerName, serverName ↵
FROM " _ & " 'LDAP://"& $DomainName & "' ↵
WHERE objectClass='printQueue'"
$objCommand.Properties("Cache Results") = False
$objRecordSet = $objCommand.Execute
$objRecordSet.MoveFirst
Do Until $objRecordSet.EOF
$temp=$temp & "Printer Name: " ↵
Ðèñóíîê 9 & $objRecordSet.Fields("printerName").Value & " ↵
Server Name: " & $objRecordSet.Fields ↵
В левой части экрана отображается иерархическая ("serverName").Value & chr(13)
структура каталога. В правой части – характеристики объек- $objRecordSet.MoveNext
Loop
та, на котором установлен курсор. Список свойств объекта
и соответствующих им значений приведен в «Properties» и Messagebox($tem,””,0,0)
«Property Value».
LDAP Browser 2.5.3 является бесплатной программой В приведенном примере осуществляется поиск всех
(http://www.ldapadministrator.com). зарегистрированных в AD принтеров. У найденных принте-
По своим возможностям программа превосходит Active ров происходит чтение двух полей: название принтера и сер-
Directory Viewer. В процессе создания соединения с ката- вера печати.
логом могут быть заданы фильтры, параметры админист- Поиск объектов с помощью провайдера LDAP осуще-
ративной учетной записи, порт TCP, по которому осуще- ствляется по следующему шаблону:
ствляется соединение, и другие параметры. Общий вид про- ! устанавливается соединение с Active Directory Provider
граммы приведен на рис. 10. через ADODB;
! составляется запрос;
Причины использования провайдера LDAP ! осуществляется поиск по заданным критериям.
! Провайдер LDAP (Lightweight Directory Access Protocol)
рассматривает принтер как сетевое устройство5, в то В том случае если искомые объекты найдены, происхо-
время как провайдер WinNT рассматривает принтер ис- дит чтение указанных в запросе полей. Результат выводит-
ключительно как локальное устройство. ся на экран. Объектами могут быть строки и массивы.
! Вторым принципиальным отличием провайдеров являют- Следует отметить, что вместо названия свойства, кото-
ся расширенные возможности поиска провайдера LDAP. рое необходимо прочитать, можно указать порядковый но-
Используя провайдер WinNT, можно было осуществлять мер поля, под которым оно обозначено в запросе. Нумера-
поиск, применяя различные фильтры, которые позволя- ция полей начинается с 0. Таким образом, основываясь на
ют осуществлять поиск всех объектов, принадлежащих к приведенном примере, вместо $objRecordSet.Fields(«server
одному из классов – computer, user, service и др. С помо- Name»).Value можно записать $objRecordSet.Fields(1).Value.
щью LDAP можно найти конкретный объект, например В файле отчета, по мнению автора статьи, следует раз-
пользователя, и прочитать его свойства. мещать следующую информацию о пользователе: имя, от-
чество, подразделение, должность и телефон. Набор этих
Поиск объектов осуществляется с помощью OLE параметров может меняться в зависимости от специфики
Distributed Query (DB) интерфейса, который вызывается пря- фирмы, в которой функционирует скрипт. Приведем при-
мо из службы активного каталога (Active Directory Service мер, выполняющий чтение этих полей:
Interface – ADSI). Он осуществляется на основании запроса
и его параметров. В качестве его параметров могут быть: $objRoot = GetObject("LDAP://RootDSE")
$strDefaultDomainNC = $objRoot.Get("DefaultNamingContext")
уровень поиска, диапазон поиска, ограничение по разме- $strGetArg=@userid ; îïðåäåëåíèå èìåíè ïîëüçîâàòåëÿ.
ру, сортировка и т. д. Форма запроса (Distributed Query) за- $strADSQuery = "SELECT department, ↵
physicaldeliveryofficename, telephonenumber, ↵
имствована из Microsoft SQL Server. title FROM 'LDAP:// " + $strDefaultDomainNC + "' ↵

5
В одном скрипте желательно использовать один провайдер, чтобы не загромождать листинг. Управление принтерами может быть реали-
зовано только с помощью провайдера LDAP.

№11(24), ноябрь 2004 87


образование
WHERE samAccountName = '" + $strGetArg + "'" Таким образом, осуществляется смена кодировки, в ко-
$objADOConn = createObject("ADODB.Connection") торой записывается информация:
$objADOConn.Provider = "ADsDSOObject"
$objADoConn.Open ("Active Directory Provider")
$objADOCommand = CreateObject("ADODB.Command") $ini_file="@wksta.ini"
$objADOCommand.ActiveConnection = $objADOConn $user_name="user"
$objADOCommand.CommandText = $strADSQuery $user1=writeprofilestring("$ini_file", ↵
$objQueryResultSet = $objADOCommand.Execute $user_name,"department",$objRoot_m1)
$objRoot_m1=$objQueryResultSet.Fields("department") $user2=writeprofilestring("$ini_file", ↵
$objRoot_m2=$objQueryResultSet.Fields("physicaldeliveryofficename") $user_name,"location",$objRoot_m2)
$objRoot_m3=$objQueryResultSet.Fields("telephonenumber") $user3=writeprofilestring("$ini_file", ↵
$objRoot_m4=$objQueryResultSet.Fields("title") $user_name,"telephone",$objRoot_m3)
$user4=writeprofilestring("$ini_file", ↵
Как видно из примера, имя пользователя определяется $user_name,"title",$objRoot_m4)
$user5=writeprofilestring("$ini_file", ↵
с помощью встроенного в KIXTart макроса @userid. Опре- $user_name,"User ID","@userID")
деление значения необходимых полей осуществляется с $user6=writeprofilestring("$ini_file", ↵
$user_name,"Full Name","@fullname")
помощью процедуры поиска объекта, в данном случае учет-
ной записи, и чтения необходимых свойств. $objRoot1=readprofilestring("$ini_file", ↵
$user_name,"department")
Стоит отметить, что этой проблемы быть не должно, по- $objRoot2=readprofilestring("$ini_file", ↵
скольку Windows по умолчанию использует кодировку $user_name,"location")
$objRoot3=readprofilestring("$ini_file", ↵
cp1251. Однако при взаимодействии KIXTart с Windows ко- $user_name,"telephone")
дировка «съезжает». С решением этой проблемы, пусть не $objRoot4=readprofilestring("$ini_file", ↵
$user_name,"title")
самым изящным, но эффективным, читатель только что оз-
накомился. $t=$t+"<department> $objRoot1 </department>"
$t=$t+"<Locations> $objRoot2 </Locations>"
Обратите внимание, несмотря на то что значения, про- $t=$t+"<Telephone> $objRoot3 </Telephone>"
читанные из AD, имеют тип данных либо «строка», либо $t=$t+"<Title> $objRoot4 </Title> </information>"
……
«массив», при попытке записать их в файл отчета выдает- del "$ini_file"
ся ошибка несоответствия типа. По непонятным причинам
функции преобразования типов данных не дают желаемо- В следующей статье будут рассмотрены вопросы асто-
го результата. Предлагается следующее решение возник- матического подключения сетевых ресурсов, визуализации
шей задачи, которое состоит их двух этапов. скрипта, внедрение его в эксплуатацию.
На первом этапе данные из AD записываются в INI-фай-
лы с помощью функции WriteProfileString(). Затем осуще- Литература:
ствляется считывание этих данных из INI-файлов и их за- 1. Коробко И. Автоматизация процессов в сети. – Журнал
пись в накапливаемую переменную, содержание которой «Системный администратор», N8, август 2004 г.
представляет собой записываемую информацию в XML- 2. Коробко И. Управление сетевыми принтерами. – Жур-
файл. нал «Системный администратор», №10, октябрь 2003 г.

Ðèñóíîê 10

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

СОЗДАНИЕ И НАСТРОЙКА
СЕРВЕРА ТЕРМИНАЛОВ

РОМАН МАРКОВ
В предыдущем номере журнала [1] была опубликована де- ! В уже открытом окне запроса лицензий на вопрос «Ус-
тальная инструкция по установке и настройке Windows 2000 тановить маркеры лицензий в данное время?» отвеча-
Server и повышении его роли до контроллера домена. В этой ем «Да». Выбираем программу лицензирования «Дру-
статье мы продолжим развитие темы и подробно опишем гое соглашение». Остальные поля будут заполнены ав-
установку и настройку на нашем сервере сервера терми- томатически из предыдущей формы, если продолжаем
налов с расширением до Citrix Metaframe Presentation Server начатую активацию.
XP. Если в процессе установки Windows 2000 Server мы
добавили в устанавливаемые компоненты «Лицензирова- Если мы активируем только клиентские лицензии, то
ние служб терминалов» и «Службы терминалов», то про- входим на https://activate.microsoft.com и выбираем русский
пускаем этот шаг и переходим к п. 2. Иначе: язык, ставим галочку «Установка маркеров лицензий CAL»
! Заходим в «Панель управления → Установка и удале- и нажимаем «Далее». Вручную заполняем наши данные.
ние программ → Добавление и удаление компонентов Поля «Фамилия», «Имя», «Организация» и «Страна» дол-
Windows» и устанавливаем эти компоненты. Описание жны быть заполнены в точности, как при активации серве-
настройки режима работы описано в 1 части статьи [1]. ра лицензий.
Перезагружаемся. Если вы добавили их только сейчас Нажимаем «Далее». Выбираем «Тип продукта». Обра-
– рекомендуется переустановить Service Pack и пакеты тите внимание на указанный здесь тип. Нам необходим
критических обновлений. Опять перезагружаемся. «Windows 2000 Server Terminal Services Client Access License
! «Пуск → Программы → Администрирование → Лицен- (TS CAL) (на устройство)» в случае, если мы используем
зирование служб терминалов». Выделяем наш сервер. Windows 2000, или «Windows Server 2003 Terminal Server
Правой клавишей – «Активировать сервер». Жмем «Да- Per Device Client Access License» для Windows Server 2003.
лее». Выбираем метод подключения «Веб». Далее сле- Затем вводим количество приобретенных нами лицензий и
дуем инструкции на экране. Идем на сайт https://activate. номер соглашения.
microsoft.com, выбираем русский язык. Далее отмеча- Нажимаем «Далее» и проверяем корректность введен-
ем пункт «Активация сервера лицензий» и жмем «Да- ных данных. Опять нажимаем «Далее». Если все сделано
лее». Вводим выданный нам в окне активации код про- правильно, то мы получим очередной код активации, кото-
дукта. Заполняем обязательные (отмеченные звездоч- рый распечатываем (записываем) и вводим в мастер акти-
кой) поля – «Фамилия», «Имя», «Организация», «Стра- вации клиентских лицензий. При корректной настройке бу-
на». Остальные заполнять необязательно. Жмем «Да- дет выдано сообщение об успешном добавлении пакета
лее». Внимательно запоминаем, как мы заполнили эти клиентских лицензий. Закрываем окно «Лицензирование
поля, так как это еще может понадобиться (лучше всего служб терминалов».
страницу подтверждения распечатать). Проверяем кор-
ректность данных и опять жмем «Далее». Нам выдают Установка и настройка
код активации сервера. Распечатываем страницу (или Citrix Metaframe XP
внимательно записываем). Оставляем веб-страницу зап- Наша система готова к установке пакета Citrix Metaframe XP.
роса кодов открытой. Переходим к мастеру активации. Проверьте, установлен ли у вас Windows 2000 Service Pack
Вводим полученный код в нашем окне активации и жмем не ниже 3-го (в него входит необходимый для установки Citrix
«Далее». Если все ввели правильно, сервер лицензий MF XP пакет Windows Installer 2.0 и другие важные обнов-
сообщит об успешной активации. Этот процесс абсо- ления системы).
лютно бесплатен. Затем будет предложено активировать Сам Citrix Metaframe Presentation Server XP поставляет-
клиентские лицензии (галочка «Установить лицензии ся либо на дистрибутивных дисках, либо скачивается с
сейчас»). Выставляем ее и жмем «Далее». Для актива- официального FTP-ресурса ftp.citrix.com
ции этих лицензий вам необходимо приобрести пакет Прямые ссылки на продукты:
лицензий «Windows Terminal Svr CAL». Скорее всего, вы ! ftp://ftp.citrix.com/metaXP/W2K/SP3/FR3CD_MFXP10_
приобрели пакет лицензий типа OLP или специальный W2K.exe – для Windows 2000 Server.
пакет лицензий в виде номера соглашения о покупке. ! ftp://ftp.citrix.com/metaXP/W2K3/FR3CD_MFXP10_
Рассмотрим второй вариант. WS2K3.exe – для Windows Server 2003.

90
образование
Это самораспаковывающиеся архивы оригинальных Приступим к лицензированию Citrix MF XP. После уста-
дистрибутивов. Распаковываем их в нужное место. новки у нас появилась панель «ICA Administration Toolbar».
Помните, что в режиме терминального сервера все при- Если этого не произошло, то можно вручную вставить ее в
ложения должны устанавливаться только через меню «Уста- автозагрузку из меню «Пуск → Программы → Citrix →
новка и удаление программ → Установка новой программы». Metaframe XP». Хотя это необязательно. Все действия по
Для справки: есть возможность переключать режим и из ко- администрированию Citrix MF производятся из консоли
мандной строки. Переключение между режимами установ- Management Console. Если ICA Administration Toolbar при-
ки и выполнения программ осуществляется командами сутствует на экране, то это самая нижняя кнопочка в ней.
change user /install и change user /execute соответственно. Иначе – через меню «Пуск → Citrix → Management Console».
Итак, переходим в указанное меню. Выбираем «CD или Запускаем. Нам предложат сквозную (Pass Through) аутен-
дискеты». Нажимаем «Далее». При помощи кнопки «Обзор» тификацию. Ставим галочку на «Enable Pass Through
меняем тип файлов на «Программы» и выбираем файл authentication» и «Connect to this server». Жмем «ОК». От-
Autorun.exe. Нажимаем «Далее». Ждем запуска программы. кроется консоль администрирования Citrix. Переходим на
Ни в коем случае не трогаем появившееся окно «После ус- закладку Licenses и начинаем добавлять необходимые ли-
тановки нажмите кнопку Далее» – ее необходимо нажимать, цензии. Все лицензии добавляются путем щелчка правой
когда установка полностью завершена. В появившемся меню клавишей мыши по закладке Licenses и выбора «Add
выбираем «Install or Update Metaframe XP Server», затем license». Программа запрашивает серийный номер лицен-
«Metaframe XP Feature Release 3». Нажимаем «Next», прини- зии. Для полной функциональности нам необходимо при-
маем лицензионное соглашение. Затем выбираем ту конфи- обрести следующие лицензии (напоминаю, мы установили
гурацию, которую хотим установить – Metaframe XPa, версию XPs с Feature Release 3):
Metaframe XPe или Metaframe XPs. Для обычных задач дос- ! MetaFrame XPs 1.0 for Windows – базовая лицензия.
таточно версии XPs. Она включает в себя сам сервер Citrix ! MetaFrame XPs 1.0 Connection Pack – лицензия на под-
Metaframe XP и веб-интерфейс к нему. Версия XPa имеет ключения.
средства для балансировки нагрузки при создании систем ! Citrix User License Pack – лицензия на подключения.
из нескольких серверов Citrix MF. Версия XPe также включа- ! MetaFrame XP 1.0 for Windows, Feature Release 3 – ли-
ет дополнительные средства управления и установки. цензия на сам Feature Release.
Мы рассмотрим вариант установки версии XPs. ! MetaFrame XP 1.0, Feature Release 3 Connection Pack –
Итак, выбираем Metaframe XPs и нажимаем Next. Вер- лицензия на подключения к Feature Release.
сию оставляем Retail. В окне компонентов по умолчанию
выбраны Web-interface, Management Console и Program Некоторые лицензии требуют активации. Тогда при до-
Neighborhood. Оставляем как есть. Тут же можно задать бавлении лицензии вам предложат ее активировать, введя
путь для установки, можно оставить по умолчанию. Жмем код активации. Активация лицензий доступна, например, на
«Next», на вопрос о сквозной аутентификации (Pass- веб-ресурсе www.citrix.com/activate. Добавляя лицензии, не
Through) отвечаем «Yes». Дальше «Create a New Farm → обращайте внимания на возможные сообщения о том, что
Next → Farm Name» – вводим понятное нам имя, например, набор лицензий неполный, даже после добавления и акти-
Firma, оставляем галку «Use a local database on this server», вации последней. Процесс регистрации лицензий может за-
Use default Zone Name (там будет наш диапазон адресов нимать некоторое время. Добавив и активировав все опи-
типа 192.168.0.0) и жмем «Next». Проверяем, входит ли санные лицензии, закройте Management Console и подожди-
предложенное имя пользователя в группу Domain Admins те 5 минут. Затем заново откройте Management Console,
(скорее всего да, так как автоматически будет подставле- перейдите на закладку Licenses и нажмите <F5> (обновить).
на ваша учетная запись), и жмем «Next». Оставляем галку Если сообщение о недостаточности лицензий снова появ-
«Allow shadowing session on this server». Расположенные ляется, попробуйте перезагрузить компьютер. Если оно бу-
ниже галочки не устанавливаем! Порт для TCP/IP-соедине- дет появляться и после перезагрузки – какая-то из лицен-
ний с сервером IIS оставляем по умолчанию (Default). зий добавлена некорректно или не активирована. Проверьте
«Next». Соглашаемся сделать стартовую страницу веб-сер- еще раз. Если не получается – удалите все лицензии в зак-
вера такой, как предлагает мастер. ладке Licenses – License Numbers и попробуйте установить
После этого начнется установка, по окончании которой заново. При написании этой статьи автор для проверки про-
будет предложено перезагрузить компьютер. Перезагружа- делал все описанные действия – все работало.
емся. Не обращаем внимания на предупреждение системы Теперь приступим к опубликованию приложений. Для
об отсутствии лицензирования Citrix – мы введем лицен- примера возьмем самый часто используемый вариант при-
зии позже. менения сервера терминалов в России: программы семей-
Скачиваем все последние хотфиксы и скрипт для их ства 1С:Предприятие 7.7.
автоматической установки отсюда: http://www.citrix4ge.de/ Итак, устанавливаем 1С:Предприятие в режиме «Ло-
tipps/fr3fix.htm. кальная установка». Помните, что когда сервер находит-
В правой части страницы выложены ссылки на все хот- ся в режиме сервера приложений, установка программ
фиксы, включая кумулятивные (т.е. полный набор с авто- производится только через меню «Установка и удаление
матической установкой). Запускаем cmd-файл и ждем, пока программ → Установка новой программы». Затем уста-
все обновления установятся. Затем перезагружаем сервер, навливаем менеджер лицензий ключа защиты (сервер за-
если скрипт не сделал это автоматически. щиты).

№11(24), ноябрь 2004 91


образование
Внимание! Менеджер лицензий необходимо устанавли- рование данных (используется, например, при реализации
вать в режиме системной службы. Входящий в состав по- предоставления доступа к основной базе для филиалов
ставки «Сервер защиты» не имеет режима работы в каче- через интернет (будет описано далее). Если мы включаем
стве «системной службы», поэтому в «Автозагрузке» он шифрование, скорее всего, понадобится дополнительная
бесполезен. Необходимый нам дистрибутив можно скачать лицензия для Citrix – Citrix Secure ICA Services. Устанавли-
с официального сайта производителя ключей HASP – ваем галку «Printing» – Start this application without waiting
www.alladin.ru. Нам необходим файл LMSetup.exe. При ус- for printers to be created». Нажимаем «Next». Определяем
тановке соглашаемся со всеми его предложениями и (это серверы для поставленных задач. В нашем случае сервер
важно!) выбираем режим установки «Service». В конце пе- только один, поэтому выделяем его в левом поле и нажи-
резагружаем компьютер. Если вы не установите менеджер маем «Add». Нажимаем «Next». Распределяем права
лицензий как описано выше, то при попытке запустить опуб- пользователей на доступ к опубликованному приложению.
ликованное приложение «1С:Предприятие» на клиенте вы Снимаем галку «Allow anonymous Connections» и добавля-
получите сообщение «Не обнаружен ключ защиты». ем нужные нам группы, например, «Администраторы до-
Все, мы готовы к опубликованию приложения. Копиру- мена» и «Пользователи домена». Если терминальный дос-
ем необходимую нам базу на локальный диск сервера. туп необходимо предоставлять избранным пользователям,
Внимание! Если вы используете файл-серверную вер- то удобнее всего создать в нашем домене (рабочей группе)
сию программы, то максимальные преимущества терми- дополнительную группу и помещать туда нужных пользо-
нального решения достигаются только при расположении вателей. Нажимаем «Finish».
базы данных на локальном дисковом массиве этого же сер- Мы создали опубликованное приложение. Если наш сер-
вера. Это происходит из-за того, что система Windows от- вер приложений является контроллером домена (при нали-
ключает кэширование дисковых операций при подключе- чии возможности их разделить – не стоит объединять роли
нии к сетевому ресурсу более чем 1 пользователя. При рас- контроллера домена и сервера приложений), то нам необ-
положении базы на локальном диске сервера никакого об- ходимо отредактировать политику безопасности, предос-
ращения по сети к ней не происходит, и скорость работы тавив доступ к самому серверу группе пользователей, ко-
становится максимальной. Не предоставляйте общего се- торой мы разрешили доступ к опубликованному приложе-
тевого доступа к папке с базами данных, так как совмест- нию.
ное использование ее по сети значительно замедлит рабо- Для этого открываем консоль редактирования полити-
ту. То есть с одной и той же базой все должны работать в ки безопасности контроллера домена: «Пуск → Програм-
терминальном режиме, независимо от ресурсов клиентс- мы → Администрирование → Политика безопасности кон-
кой рабочей станции. троллера домена».
Итак, открываем Management Console и выделяем оп- В консоли «Политика безопасности контроллера доме-
цию «Applications». Щелкаем по ней правой клавишей и на» раскрываем «Параметры безопасности → Локальные
выбираем «Publish Application». Открывается мастер пуб- политики → Назначение прав пользователя» и изменяем
ликации. Задаем имя нашего приложения (произвольно), политику «Локальный вход в систему». Добавляем туда
например, 1C-Terminal (чтобы не путать в дальнейшем с группу, которой мы предоставили доступ к нашему опубли-
локальной установкой у клиента). Поле «Description» мож- кованному приложению.
но оставить пустым или добавить комментарий к этому при- Теперь добавим администраторов Citrix. В Management
ложению. Полезно, если у нас будет много однотипных опуб- Console выделяем Citrix Administrators, правой клавишей
ликованных приложений. Нажимаем «Next». Ставим галку «Add Citrix Administrator». В нашем домене находим группу
«Application» и в поле «Command line» нажимаем «Browse». «Администраторы домена» и добавляем ее. Ставим галку
Выбираем наш сервер и указываем путь к запускаемому «Add local administrators». Нажимаем «Next», и выбираем
файлу (в нашем случае это 1cv7.exe или 1cv7s.exe). Путь «Full Administration». Нажимаем «Finish».
«Working Directory» оставляем по умолчанию. Нажимаем Начиная с Citrix Feature Release 2, права администрато-
«Next». На следующем экране имеется возможность создать ров Citrix можно настраивать очень гибко, делегируя своим
подпапку для окружения «Program Neighborhood». Исполь- заместителям выполнение только необходимых задач. Это
зуем эту возможность, если нам необходимо разделить мно- очень полезно для предоставления ответственным за ра-
жество публикуемых приложений. Иначе – оставляем поле боту Citrix сотрудникам таких возможностей, как принуди-
пустым. Если мы хотим автоматически добавлять ярлыки тельное завершение сеансов пользователей во время ва-
запуска на рабочий стол и в меню «Пуск» наших клиентов шего отсутствия. Более подробную информацию вы смо-
(что очень удобно), то выставляем галки «Add to the client’s жете получить, посетив интернет-ресурс, ссылка на кото-
Start Menu» и «Add shortcut to the client’s Desktop». Галку рый приведена в конце статьи.
«Place under Programs Folder…» не устанавливаем. Нажи- Все! Далее нам необходимо настроить клиентов.
маем «Next». Выбираем размер окна и цветовую гамму Итак, рассмотрим два варианта: клиенты локальной сети
приложения. Для запуска приложения во весь экран (па- и удаленные клиенты.
нель задач при этом остается!) выбираем Session window
size «Full Screen» и Colors «High Color (16 bit)». Галку «Hide Настройка клиентов локальной сети
Application title bar» снимаем, а «Maximize application at Citrix Metaframe имеет специальное средство – ICA Client
startup» – устанавливаем. Нажимаем «Next». Снимаем гал- Creator. Его описание можно найти по приведенной в конце
ку «Enable audio». При необходимости устанавливаем шиф- статьи ссылке.

92
образование
Мы рассмотрим тривиальный способ – установка кли- Выбираем ее и жмем «Далее». Следующее окно ос-
ентов из дистрибутива и последующая настройка для со- тавляем без изменений (Colors → Use server Default,
единения. Еще раз акцентирую внимание на том, что дан- Windows Size → Seamless Window). «Далее» → «Готово».
ная статья не описывает максимальную автоматизацию по- Найденная ферма появится в нашем окне Citrix Program
добного внедрения, а предназначена для получения опыта Neighborhood.
начального уровня. Дистрибутив клиента берем либо с ди- Правой клавишей кликаем по ней и выбираем «Set as
стрибутивных дисков Citrix, либо скачиваем последнюю default». Затем снова правой клавишей – «Application
версию с сайта производителя: www.citrix.com. Замечу Settings → Logon Information». Проверяем, чтобы были ус-
лишь, что при обновлении клиента до версии 8.0.xx они тановлены галки Local User и Pass-Through Autentification.
почему-то потеряли возможность пользоваться в терми- Жмем «ОК» и дважды кликаем по нашей ферме. Если мы
нальных сессиях колесиком мышки. Сам автор использует все сделали правильно, то в списке приложений появится
версию клиента 6.30.1051 как наиболее стабильную (тес- наше опубликованное (1C-Terminal), а его ярлык будет ав-
тировалось исключительно по личному опыту и касается томатически добавлен на рабочий стол пользователя и в
только версии Citrix XP for Windows 2000). Итак, заходим на меню «Пуск → Citrix Program Neighborhood». Если вместо
клиентский компьютер с правами администратора и запус- этого появилось окно запроса имени пользователя и па-
каем ica32.exe. В процессе выполняем стандартные дей- роля – закрываем все окна и перезагружаем компьютер.
ствия по принятию лицензионного соглашения, указания Если все нормально – закрываем окно Citrix Program
пути и программной группы. Сравниваем, корректно ли ус- Neighborhood и запускаем с рабочего стола или из меню
тановщик определил имя клиента, и разрешаем использо- «Пуск» наше опубликованное приложение.
вать локальные имя и пароль клиента для аутентификации Внимание! Приложения в терминальном режиме могут
(отвечаем «Yes»). После установки – не соглашаемся пе- запускаться гораздо дольше обычного, зато работают по-
резагрузить компьютер – сделаем это чуть позже. Вместо том намного быстрее. Поэтому, запустив приложение один
этого открываем редактор реестра командой regedt32.exe раз, дождитесь его загрузки. Объясните это пользователям,
(regedit.exe – не годится!) и находим ветку HKEY_LOCAL_ так как на опыте проверено, что жать они будут на ярлык
MACHINE\SOFTWARE\Microsoft\MSLicensing. Выделяем ее до посинения, запуская все новые и новые сессии. В итоге
и выбираем меню «Безопасность → Разрешения». Прохо- все подвиснет. После запуска приложения в системном трее
димся по всем перечисленным там пользователям и груп- появляется значок подключения к серверу Citrix. Он и сиг-
пам, выставляя всем галочку «Полный доступ». Жмем «ОК» нализирует, что приложение уже запущено. Если же запус-
и выходим из программы редактирования реестра. Пере- ка не произошло в течение продолжительного времени (бо-
загружаем клиента. Подразумевается, что в домене уже лее минуты), то стоит проверить права на ветку реестра
заведены учетные записи пользователей и клиентские HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ MSLicensing.
компьютеры введены в домен. Заходим в систему с учет- Об этом мы говорили в самом начале этой главы.
ной записью пользователя, работающего на этом компь- Итак, наше приложение 1C-Terminal запустилось, и мы
ютере. Запускаем с рабочего стола или из меню «Пуск» готовы к добавлению пользователю рабочих баз данных.
Citrix Program Neighborhood. На предложение ввести имя Тут все почти стандартно. Единственное замечание – при
и пароль жмем Cancel и соглашаемся, что хотим прервать попытке прописать базу через «Обзор» система выдаст
подключение. Меню «Tools → ICA-Settings». Устанавлива- сообщение «ICA Client File Security». Ответим «Full Access»
ем две нижние галочки – Pass-Through authentication и Use и «Never ask me again for any application». Данный вопрос
Local Credentials for log on и жмем OK. Завершаем сеанс задается, если пользователь является локальным админи-
пользователя (Logoff) и вновь входим с его учетной запи- стратором на своей рабочей станции или данный пользо-
сью. Снова открываем Citrix Program Neighborhood. Если ватель имеет право на подключение к общим системным
наш значок «1C-Terminal» не появился автоматически, то ресурсам <DriveLetter>$, так как по умолчанию в Citrix MF
следуем дальнейшим инструкциям. Выбираем «Find New XP включен режим присоединения клиентских дисков. Пос-
Application Set». Если ярлыка «Find New Application Set» ле этого можно спокойно прописывать все необходимые
не видно, тогда нажимаем кнопку «UP» и затем «Find New базы. Если базы у всех пользователей одинаковы и неиз-
Application Set». менны, можно импортировать каждому пользователю вет-
Выбираем «Local Area Network», «Далее», кликаем по ку реестра при входе, что позволит каждому новому пользо-
галочке справа на поле «Click below to locate the Application вателю автоматически получать список баз. Например, для
Set to add». Там должно отобразиться имя созданной нами системы 1С:Предприятие 7.7 список баз хранится в ветке
фермы приложений. реестра: HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\
Если этого не произошло (такое бывает, когда у нас в Titles. Сохраните ее, например, в файле Titles.reg и пропи-
сети несколько серверов Citrix или по причине отсутствия шите в Logon-script строку:
мультиадресной рассылки информации о серверах) и мы
получили сообщение о невозможности найти что-либо, то regedit -s Titles.reg
выполняем следующие действия: Кнопка «Server Location»,
Network Protocol → TCP/IP, Address List → Add… Вводим Однако подобные вопросы автоматизации выходят за
IP-адрес нашего сервера и нажимаем «ОК», затем снова рамки данной статьи.
«ОК». Опять кликаем по галочке справа на поле «Click Итак, помните, что самый главный смысл терминально-
below to locate the Application Set to add». го решения, если вы ждете от него ускорения работы при-

№11(24), ноябрь 2004 93


образование
ложений, работающих, например, с dbf-базами, – это ло- К сожалению, стандартными средствами Firewall, встро-
кальное расположение рабочих данных! енного в Windows, проброс портов внутрь сети выполнить
Все, можно работать. невозможно, поэтому необходимо воспользоваться одним
из дополнительных средств.
Настройка удаленных клиентов Теперь настроим удаленных клиентов. Их конфигури-
Теперь реализуем подключение удаленных клиентов через рование практически аналогично клиентам локальной сети,
Интернет к нашему серверу приложений. Для начала рас- за исключением описанных ниже моментов.
смотрим методику настройки подключения к самому сер- На этапе выбора адреса для подключения выбираем
веру, а затем настроим клиентов. Подразумевается, что «Wide Area Network», жмем «Далее», кнопка «Server
сеть с настроенным нами сервером приложений имеет ин- Location», «Network Protocol → TCP/IP, Address List →
тернет-подключение с выделенным внешним IP-адресом. Add…». Вводим внешний IP-адрес нашего подключения в
О его наличии необходимо проконсультироваться у провай- основном офисе, затем опцию «Firewalls» и устанавлива-
дера. ем галку «Use Alternate address for firewall connection».
На сервере нам необходимо указать так называемый Нажимаем дважды «ОК». Кликаем по галочке справа на
«альтернативный адрес», с которым будут работать удален- поле «Click below to locate the Application Set to add». Если
ные клиенты. Это тот самый внешний IP-адрес. Открываем мы корректно настроили межсетевой экран, то должно вы-
командную строку и вводим команду: валиться имя созданной нами фермы приложений. Далее
все так же, как и при настройке клиентов локальной сети.
Altaddr /SET <IP-address> Рекомендуется после добавления нашей фермы приложе-
ний кликнуть по ней правой клавишей мыши, перейти на
где <IP-address> – наш внешний IP-адрес. Например: закладку Default Option и установить четыре самых верх-
них галки (Use data compression, Use cache for bitmap,
Altaddr /SET 195.131.101.xxx Queue mouse movement and keystrokes, Turn off desktop
integration for this application set), а также выставить пара-
Затем необходимо разрешить прохождение нужных нам метр Speed Screen Latency Reduction в положение «ON» и
пакетов на межсетевом экране (Firewall), а также предос- установить справа две галки: «Mouse click feedback» и
тавить нашему серверу выход наружу по технологии NAT, «Local Text Echo».
либо напрямую. Порты, которые мы должны открыть: Настройки глубины цвета выбираем, исходя из ширины
Входящие соединения: нашего канала и необходимости экономии трафика. Для
! Источник: IP-удаленных клиентов (или Any, если мы его минимализации объемов передаваемых данных и обеспе-
не знаем или он динамический). чения максимально возможной скорости на тонких кана-
! Порты источника: >1024. лах связи выбираем 16 или 256 цветов. Наиболее комфор-
! Получатель: наш внешний IP. тный вид обеспечивается при глубине цвета не менее 16
! Порты получателя: UPD-1604, TCP-1494. бит. На работе самой программы это никак не отразится –
будет лишь изменена отображаемая цветовая гамма.
Исходящие соединения: Помним, что клиенты удаленного офиса должны также
! Источник: внутренний IP нашего сервера (если он на- иметь либо прямое подключение к Интернету, либо исполь-
прямую не подключен к Интернету). зовать технологию NAT, а на межсетевом экране должно
! Порты источника: UPD-1604, TCP-1494. быть разрешено подключение этих клиентов на порты UDP-
! Получатель: IP-удаленных клиентов (или Any, если мы 1604 и TCP-1494 для внешнего IP-адреса основной сети,
его не знаем или он динамический). где расположен сервер терминалов. В данном случае име-
! Порты получателя: > 1024. ется в виду Firewall, стоящий в клиентской сети.
В завершение хотелось бы привести полезную ссылку.
Если наш сервер подключен к Интернету с использова- Несмотря на то, что во время написания статьи автор не
нием технологии NAT, то необходимо организовать пере- пользовался приведенным ниже ресурсом, а основывался
направление пакетов по указанным портам с внешнего ин- на личном опыте, все равно крайне рекомендуется его изу-
терфейса Firewall на внутренний интерфейс сервера. То есть чить, так как данная статья является средством Step-by-
необходимо указать, что сигналы, приходящие на порт 1604 Step, а информация по приведенной ниже ссылке – наибо-
по протоколу UPD и на порт 1494 по протоколу TCP, – необ- лее полным руководством по продуктам Citrix в России. Все
ходимо перенаправлять на те же порты внутреннего IP-адре- мы так или иначе ее использовали при изучении данной
са сервера. Применяйте для этого средства, при помощи технологии: http://citrix.1th.ru/admin3/index.html.
которых вы организовали реализацию технологии NAT – Автор выражает признательность всем коллегам, кото-
почти наверняка они там присутствуют. Ранее автором была рые помогали в редактировании этой статьи на этапе ее
написана статья по реализации этого решения – техноло- тестирования.
гии общего доступа в Интернет, защиты при помощи меж-
сетевого экрана и организации доступа внутрь сети извне Литература:
при помощи продукта WinRoute Pro 4.2. On-line редакция 1. Марков Р. Установка и настройка W2K Server. – Жур-
статьи находится здесь: http://www.kuban.ru/forum_new/ нал «Системный администратор», №10, октябрь 2004 г. –
forum10/modpage/FAQ/wr/index.shtml . 88-94 с.

94
подписка на I полугодие 2005
Российская Федерация ! Казахстан – по каталогу «Российская Пресса» через
! Подписной индекс: 81655 ОАО «Казпочта» и ЗАО «Евразия пресс»
Каталог агентства «Роспечать» ! Беларусь – по каталогу изданий стран СНГ через РГО
! Подписной индекс: 87836 «Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)
Объединенный каталог «Пресса России» ! Узбекистан – по каталогу «Davriy nashrlar» российские
Адресный каталог «Подписка за рабочим столом» издания через агентство по распространению печати
Адресный каталог «Библиотечный каталог» «Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,
! Альтернативные подписные агентства: 5/3, офис 33)
Агентство «Интер-Почта» (095) 500-00-60, курьерская ! Армения – по списку номенклатуры «АРЗИ» через ГЗАО
доставка по Москве «Армпечать» (375005, г.Ереван, пл.Сасунци Давида, д.2)
Агентство «Вся Пресса» (095) 787-34-47 и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул.Сарья-
Агентство «Курьер-Прессервис» на, 22)
Агентство «ООО Урал-Пресс» (343) 375-62-74 ! Грузия – по списку номенклатуры «АРЗИ» через АО
! Подписка On-line «Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская, 29)
http://www.arzy.ru и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахурдия, 42)
http://www.gazety.ru ! Молдавия – по каталогу через ГП «Пошта Молдавей»
http://www.presscafe.ru (МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)
по списку через ГУП «Почта Приднестровья» (МD-3300,
СНГ г.Тирасполь, ул.Ленина, 17)
В странах СНГ подписка принимается в почтовых отделе- по прайслисту через ООО Агентство «Editil Periodice»
ниях по национальным каталогам или по списку номенкла- (2012, г.Кишинев, бул. Штефан чел Маре, 134)
туры АРЗИ: ! Подписка для Украины:
! Азербайджан – по объединенному каталогу российских Киевский главпочтамп
изданий через предприятие по распространению печа- Подписное агентство «KSS»
ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21) Телефон/факс (044)464-0220

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

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

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

№11(24), ноябрь 2004 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№11(24), Ноябрь, 2004 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редактор Защита сетевых сервисов Developers Edition, датированной янва-
Андрей Бешков с помощью stunnel рем 2004 года. С тех пор было выпуще-
Как защитить от прослушивания и вме- но несколько исправлений, однако ба-
РЕКЛАМНАЯ СЛУЖБА шательства извне данные, передавае- зовая функциональность системы не
тел./факс: (095) 928-8253 мые сервисами POP3, IMAP, MySQL, претерпела существенных изменений.
Константин Меделян syslog? Предлагаем решить эту задачу
reсlama@samag.ru с помощью SSL и stunnel – для этого вам Единая учетная запись
не придется прилагать больших усилий. для Windows и Linux/UNIX
Верстка и оформление в Active Directory
imposer@samag.ru Linspire одним глазком В данной статье пойдет речь о том, как
maker_up@samag.ru Фирма Linspire – ветеран движения за управлять единой учетной записью
Дизайн обложки популяризацию Linux, хотя самой тор- пользователя посредством MS Active
Николай Петрочук говой марке едва насчитывается пять Directory и Services For Unix, независи-
месяцев. Между тем, компания была мо от того, на какой платформе рабо-
103045, г. Москва, основана в далеком 2001 году. С тех пор тает пользователь, будь то Windows
Ананьевский переулок, дом 4/2 стр. 1 и по сей день ее бессменным управля- или Linux/UNIX.
тел./факс: (095) 928-8253 ющим является всемирно известный
Е-mail: info@samag.ru авантюрист-инноватор Майкл Роберт- Идеальный карманный
Internet: www.samag.ru сон, создатель портала MP3.com. Пер- компьютер для системного
воначально компания называлась администратора
РУКОВОДИТЕЛЬ ПРОЕКТА Lindows, а ее основное детище и герой Часть 2
Петр Положевец сегодняшней статьи, настольный дист- Продолжаем знакомить читателей с
рибутив Linux – LindowsOS. Такое явное карманным компьютером, работающим
УЧРЕДИТЕЛИ созвучие с «окнами» не могло понра- под управлением операционной систе-
Владимир Положевец виться корпорации Microsoft и очень мы Linux от компании Sharp. Из заклю-
Александр Михалев быстро стало предметом многочислен- чительной части статьи вы узнаете об
ных судебных разбирательств, как на особенностях установки и сборки про-
ИЗДАТЕЛЬ территории США, так и за их предела- грамм для КПК, а также о возможнос-
ЗАО «Издательский дом ми… В данном обзоре мы рассмотрим тях, которые он предоставляет систем-
«Учительская газета» основные возможности Linspire 4.5.189 ному и сетевому администратору.

Отпечатано типографией
ГП «Московская Типография №13» Вы можете приобретать журналы в магазинах
Тираж 7000 экз. и торговых точках г. Москвы по адресам:
Журнал зарегистрирован ! Магазин «Компьютерная и деловая книга» (Ленинский проспект, строение 38).
в Министерстве РФ по делам печати, ! Выставочный компьютерный центр «Савеловский» (Киоск у главного входа).
телерадиовещания и средств мас- ! Выставочный компьютерный центр «Буденовский».
совых коммуникаций (свидетельство ! Книжная ярмарка «Центральная». Mагазин «Деловая и учебная литерату-
ПИ № 77-12542 от 24 апреля 2002г.) ра» (м. Тульская, Варшавское шоссе, д.9. эт. 5, павильон 515-09).
! ТЦ «Электроника на Пресне». Mагазин «Техкнига» (павильон 8-9).
За содержание статьи ответствен- ! Редакция «Учительская газета» (Ананьевский переулок, д. 4/2, стр. 1).
ность несет автор. За содержание рек-
ламного обьявления ответственность On-line магазины:
несет рекламодатель. Все права на Уважаемые читатели!
опубликованные материалы защище- ! www.allsoft.ru
ны. Редакция оставляет за собой пра- ! www.linuxcenter.ru НЕ ПРОПУСТИТЕ ПОДПИСКУ
во изменять содержание следующих ! www.linuxshop.ru на первое полугодие 2005 года
номеров. ! www.bolero.ru
подробная информация на стр. 95

96