Изучаем возможности Microsoft Windows Server 2003 Resource Kit Tools
Крис Касперски)
В штатный комплект поставки *nix-систем традиционно входит огромное количество утилит на все случаи жизни, и юниксоидам, в отличие от Windows-администраторов, не приходится рыскать по Сети в поисках решений от сторонних разработчиков (как правило, платных). Microsoft же, долгое время стремившаяся превратить WinNT в тостер, управляемый посредством мыши, постепенно осознает порочность такого подхода и начинает перенимать лучшие черты UNIX. Большое количество полезных утилит можно найти в папке Support Tools на дистрибутивном диске и еще больше их содержится в Resource Kit’е, который можно бесплатно скачать с сайта компании. Нужны ли они администратору? И если да, то зачем?
Содержание:
- Введение
- Философия Resource Kit
- Подсчет жестких ссылок с помощью HLScan
- Коза + баян == Resource Kit
- В дебрях Занзибара
- Заключение
- Боковые выносы
Набор Microsoft Resource Kit 2003 (выпущенный 28 апреля 2003 года) несет на своем борту порядка двухсот утилит, скрипты и документацию. Несмотря на свой скоромный размер (~12 Мб), это невероятно мощный инструмент управления и настройки ОС, полное описание которого потребовало бы отдельной книги. Просто перечислять, что есть в нем – скучно и неинтересно. Проще скачать эти несчастные 12 Мб и заглянуть в хелп. Поэтому мыщъх решил изменить тактику, сместив центр смысловой тяжести в сторону философских концепций, продемонстрировав их на нескольких вполне конкретных примерах.
Resource Kit можно взять с прилагаемого к журналу диска, либо свободно скачать с сервера Microsoft, причем, проверка подлинности при этом не требуется.
Пусть название Kit’а не вводит тебя в заблуждение. Он работает не только на Win2k3 (хотя, главным образом, конечно, заточен под него), но также и под WinXP, Win2k, а некоторые (впрочем, довольно немногочисленные) утилиты функционируют даже под Win9x/Me, но вот для самой установки требуется как минимум WinXP, на Win2k комплект Resource Kit 2003 ставиться в упор не желает. Хотя если под рукой есть Win2k3, то можно инсталлировать его туда, а на Win2k/9x/Me перенести простым копированием папки Microsoft Resource Kit 2003 (имя которой, естественно, может быть любым). При этом нужно не забыть скопировать файл помощи, закинутый установщиком в C:\WINDOWS\help\rktools.xml (правда, настоящие администраторы справок не читают, предпочитая действовать методом тыка).
Подавляющее большинство программ, входящих в состав Resource Kit, – это утилиты командной строки. Зачем они нужны в век графических интерфейсов и быстрых каналов, позволяющих управлять сервером удаленно с помощью мыши без всяких тормозов? Управлять, конечно, можно, но вот если подсчитать — сколько щелчков мыши каждый раз приходится совершать, чтобы выполнить один и тот же набор типовых задач… А сколько времени приходится проводить в ожидании завершения операции A, после которой следует запустить операцию B? И, наконец, кто не матерился, вручную переписывая отчеты, сгенерированные в графических окнах без возможности выделения текста и копирования его в буфер обмена?!
Командная строка — это не просто черный средневековый экран с мерцающим курсором — средством инквизиции. Это, прежде всего, командный язык. Не то, чтобы сильно развитый (с UNIX не сравнить), но поддерживающий базовые конструкции: условия, циклы, переменные. Только вместо операторов у нас набор исполняемых файлов, подавляющее большинство из которых может принимать данные с любого источника: с клавиатуры (именуемой стандартным вводом), дискового файла или из результатов деятельности другой программы.
Автоматизация управленческой деятельности — великая вещь! Командные файлы позволяют выполнять сложные операции нажатием всего лишь одной клавиши или запускаться через системный планировщик по расписанию, работая автономно без всякого вмешательства администратора. Графические же программы страдают хронической тупостью и задают кучу потрясающих вопросов в стиле: а вы уверены в том, что не уверены? Шутки шутками, но графический проводник Windows не поддерживает и 10% функций, поддерживаемых ядром NT, что создает огромные проблемы. Нужен конкретный пример? Пожалуйста!
Подсчет жестких ссылок с помощью HLScan
Файловая система NTFS выгодно отличается от FAT тем, что поддерживает жесткие ссылки (hard link’и), кстати говоря, поддерживаемые всеми никсовыми ФС. Иерархическая организация директорий хорошо работает только в теории, а на практике… Вот, допустим, у нас имеются каталоги: Books/Coding (книги по программированию) и Books/Unix (книги по никсам). В какой каталог мы должны кинуть книгу "Linux-programming", отвечающую обоим критериям сразу?!
Или вот, создание файлов-синонимов. Допустим, у нас есть куча командных файлов, вызывающих некоторую программу program_name.exe, которая в новой версии внезапно превращается в program_name6.exe или вообще меняет свое имя.
В подобных случаях начинающие администраторы прибегают к дублированию файлов, что не только транжирит дисковое пространство, но и создает проблемы синхронизации. Как быть, если два пользователя USER_A и USER_B хотят видеть один и тот же файл file_name.doc в своих собственных домашних директориях, причем так, чтобы изменения, внесенные одним из них, тут же отражались у другого? Простое дублирование в этом случае отдыхает, и приходится задействовать жесткие ссылки, которые легко создать, например, с помощью FAR’а по
Просто создаем средствами сервера виртуальную папку /old, куда и "копируем" посредством жестких ссылок все прежние файлы, уже растасованные по новым папкам. В результате перерасхода дискового пространства не возникает.
То есть еще как возникает! Удаление файлов происходит лишь тогда, когда счетчик ссылок обращается в ноль, и если у файла есть несколько астральных двойников, то после удаления одного из них место на диске не освободится. Возникает резонный вопрос: как найти все жесткие ссылки?!
Вот тут-то нам и пригодится утилита HLScan (Hard Link Display), выводящая список файлов, имеющих более одной жесткой ссылки с полными путями к ним, демонстрационный пример использования которой показан ниже:
D:\BIN\Windows Resource Kits\Tools> hlscan.exe
Hard Links Found in D:\ (recursive search):
ID: 0x2000000000922 - Hard Links Count: 2 - Missing: 0
Creation Time: 03/04/2008 01:17:19
Last Access Time: 03/04/2008 01:22:32
D:\BIN\666.sys
D:\BIN\KPNC\hack\km_anti_debug_base.sys
Summary:
Files scanned: 1969
Physical files with more than one name: 1
Hard links: 2
Далеко не все утилиты, входящие в состав Кита, полезны, а многие откровенно избыточны. Такое впечатление, что их писали программисты, не читавшие даже штатную справку к операционной системе. Определенно не читали!
Ярчайший пример — утилита now.exe, позволяющая выводить текущее время на стандартный поток вывода (консоль), файл или "скармливать" его другой программе. Обратная операция – установка текущего времени — выполняется аналогичным образом, стоит только развернуть принцип на 180 градусов.
В справке написано, что это очень удобно в командных файлах. Действительно, при выполнении определенных действий (архивация, копирование файлов, прожиг на диск) полезно отметить в log-файле время начала и конца операции, что можно сделать следующим образом:
D:\BIN\Windows Resource Kits\Tools> now.exe Sat Mar 08 05:17:26 2008
Красиво, конечно, и весьма практично. Вот только еще начиная с ранних версий NT, текущая дата хранится в системной переменной DATE (а время, соответственно, в переменной TIME), содержимое которых может быть выведено через ECHO или любым другим путем, причем это будет намного быстрее, чем загрузка целого EXE-файла. Установка даты/времени еще со времен MS-DOS осуществляется встроенным оператором командного интерпретатора "DATE".
C:\sys> echo %date% %time% Сб 08.03.2008 5:29:32,54
Главный и, пожалуй, единственный недостаток переменных DATA/TIME — формат вывода жестко фиксирован и привязан к региональным настройкам. То есть, если мы, например, написали простейший командный файл, архивирующий некоторые файлы и автоматически присваивающий имени архива дату его создания (чтобы было удобнее ориентироваться при поднятии с бэкапа), мы не сможем сформировать имя согласно своим собственным предпочтениям, более того это имя будет меняться в зависимости от региональных настроек системы, что не очень-то приятно.
В *nix-системах имеется утилита /bin/date, аналогичная now.exe, но позволяющая специфицировать формат вывода вручную, чего now.exe делать не умеет, и потому ее назначение совершенно непонятно. Скорее всего, она просто была кинута до кучи и написана впопыхах, причем, никто из Microsoft ей не пользовался. И это не единственный пример, подобных утилит много!
"Не дайте себя обмануть в другом месте, покупайте только у нас!" говорилось в одной рекламе. Примерно таким же образом составлена и документация на Resource Kit 2003. Без глубокого знания системы в ней не то, чтобы совсем нельзя разобраться, но очень легко впасть в грубые ошибки и вместо обещанного увеличения производительности нарваться на жестокую деградацию.
Рассмотрим это на примере двух утилит, предназначенных для подчистки памяти — Clear Memory (реализованной в файле Clearmem.exe) и Free Working Set Tool (Empty.exe). Согласно своему названию, Clean Memory очищает память, что действительно подтверждается показаниями "Диспетчера Задач", и производительность вроде бы и вправду увеличивается (иногда — значительно).
Интересно, за счет чего это достигается? Справка дает честный, но совершенно непонятный большинству непрограммистов ответ, достойный того, чтобы быть процитированным здесь: "Clean Memory представляет собой утилиту командой строки, которая определяет размер физической памяти компьютера, выделяет достаточное количество данных для ее заполнения и читает выделенный регион памяти на максимальной скорости. Clear Memory также обращается к файлам для очистки дискового кэша. Это до минимума сокращает память, доступную другим процессам. Затем Clean Memory освобождает выделенную память для восстановления нормального функционирования системы".
Ну?! Кто-нибудь понял, чем реально занимается Clear Memory, и что происходит с памятью?! Мыщъх понял, но только потому, что писал аналогичную утилиту еще во времена Win95, когда физической памяти катастрофически не хватало. Тогда она еще имела смысл, да и то лишь при просмотре фильмов. Сейчас же это просто средство ухудшить производительность.
Попробую объяснить ситуацию своими словами. Как известно, оперативная память имеет страничную организацию, при которой каждая страница адресного пространства может находиться либо в физической памяти, либо в файле подкачки. При выделении блока памяти операционная система по умолчанию не предоставляет приложению память вплоть до первого обращения к принадлежащим ему страницам, после чего просматривается список свободных физических страниц, и происходит реальное выделение. Если же физическая память исчерпана, операционная система предпринимает попытку найти наименее нужную (с ее точки зрения) страницу памяти и предоставить ее в распоряжение процесса. Если страница была модифицирована с момента своей загрузки, она попадает в файл подкачки, если же нет, просто аннулируется и передается новому процессу. Все исполняемые файлы и динамические библиотеки на самом деле проецируются в память, то есть сегмент кода никогда не вытесняется в файл подкачки (за исключением случаев, когда мы имеем дело с самомодифицирующимся кодом).
Эта схема имеет всего лишь один существенный недостаток — когда физическая память исчерпана, а вновь запущенное приложение потребляет ее блоками небольшого размера, то практически каждый акт выделения связан с обращением к файлу подкачки, в результате чего приложение некоторое время работает медленно (во всяком случае, до тех пор, пока ему не выделится достаточное количество памяти).
Приложения реального времени (видеоплееры, программы захвата видео) при этом захлебываются сразу. Изображение начинает дергаться, а захватываемые кадры — теряются. Но если предварительно запустить Clear Memory, то все будет ОК, поскольку она вытеснит на диск память всех процессов (в том числе и те блоки, к которым процесс больше никогда не обратится), и мы получим в свое распоряжение максимум физической памяти. Как следствие, приложения реального времени будут исполняться нормально и без тормозов, но вот при обращении ко всем остальным приложениям — жесткий диск тут же взвоет, ведь принадлежащая ему память вытеснена на диск (или просто аннулирована) и теперь должна быть считана оттуда обратно.
На рабочих станциях это еще куда ни шло. Но вот на серверах… Да, на какое-то время мы получаем значительный выигрыш в производительности, и вновь подключающиеся клиенты обрабатываются с крейсерской скоростью, но вот все остальные процессы при первом же обращении к ним вызовут жуткие тормоза, пока память не будет скачена с диска обратно.
Самое забавное, что Clear Memory можно написать всего за пять минут, уложившись в десяток строк кода, а если программировать лень — просто запустить несколько монструозных приложений и тут же закрыть их, освободив принадлежащую им память. Радует лишь тот факт, что Clear Memory запускается и функционирует на всей MS-линейке операционных систем: от Win95 до новоиспеченного Win2k8.
Утилита Free Working Set Tool работает аналогичным образом, но позволяет указать PID процесса, чей Working Set необходимо скинуть на диск. Working Set представляет собой фрагмент адресного пространства, используемого процессом, куда попадают и системные библиотеки (разделяющие одну и ту же область физической памяти), и его собственные данные (они же приватные). В принципе, если у нас имеется процесс (несколько процессов), выделивший данные, но уже давно к ним не обращающийся, то при недостатке физической памяти операционная система вытеснит их на диск и сама. Зачем это делать вручную?! Разве что нам необходимо получить большой кусок физической памяти для запуска приложения реального времени, тогда мы, действительно, можем скинуть память ненужных процессов на диск, чтобы она нам не мешалась.
В некоторых статьях утверждается, что утилиты Clear Memory/Free Working Set Tool позволяют справиться с утечками памяти, но это не так. Проблема утечек действительно имеет место быть и происходит всякий раз, когда сервер циклически выделяет блоки памяти, но не освобождает их, что ведет к росту файла подкачки и неуклонному исчерпанию адресного пространства (которого, в зависимости от конфигурации сервера, имеется от двух до трех Гб, независимо от объема физической памяти).
Clear Memory/Free Working Set Tool, конечно, могут вытеснить выделенную, но неиспользуемую память в файл подкачки, однако лучше от этого никому не станет, ведь проблема в исчерпании адресного пространства (объема виртуальной памяти), а не физической. Освободить же неиспользуемую память не может ни Clear Memory, ни Free Working Set Tool, ни какая-либо другая утилита, поскольку не существует способа, позволяющего отличать полезную память от бесполезной.
Критический разбор Кита не значит, что это плохая штука. Мыщъх ничего подобного не говорил! В его состав входит множество полезных утилит, правда, бесполезных — еще больше, что запутывает администраторов, заставляя их отделять зерна от плевел, хотя по идее эту работу должны были выполнить сотрудники Microsoft, предоставив народу тот набор инструментальных средств, который ему реально нужен, а не валить все в кучу. Впрочем, это мое личное субъективное мнение, отнюдь не претендующее на глобальную истину в первой инстанции. Чтобы составить свое мнение, достаточно скачать Кита и немного поиграться с ним. Вреда это не принесет, а вот польза будет немалая и весьма ощутимая.
INFO
-
Инструментарий Win2k3 Resource Kit представляет собой полезный набор из примерно двухсот служебных программ, которые помогают упростить и автоматизировать выполнение административных задач.
-
ClusPrep — утилита, которую следует запускать перед формированием кластера для того, чтобы удостовериться, что узлы кластера и хранилище были сконфигурированы правильно. Пакет ресурсов ClusDiag содержит средства диагностики, позволяющие сопоставлять и сравнивать журналы кластера и журналы событий со всех узлов кластера. ClusterRecovery позволяет восстановить ресурс диска и состояние кластера в случае сбоя.
-
Утилита pfmon (Page Fault Monitor) способна контролировать количество мягких и критических ошибок памяти во время работы приложений. Может быть полезна при поиске источника затора памяти.
-
NTimer (Windows Program Timer) сообщит общее время исполнения приложения, время в пользовательском режиме и время в режиме ядра.
-
С помощью VaDump (Virtual Address Dump) можно просматривать размер и состояние каждого сегмента виртуальной памяти.
Статья опубликована в апрельском номере журнала «Xakep» за 2008 год.





