Windows Server Longhorn — новая серверная операционная система
Часть 2
Транзакционная файловая система
В первой части нашего обзора мы рассмотрели основные понятия, связанные с серверной операционной системой; роли, которые может выполнять Windows Server Longhorn; сервисы, а также дополнительные функции, доступные в этой ОС. Мы также начали рассказывать о Server Core — варианте установки Windows Server с минимальным набором функциональности.
Напомним основные ограничения при разработке приложений, которые должны функционировать под управлением Server Core: поддерживается интерфейс только на уровне командной строки (отсутствует Windows Shell); не поддерживаются приложения на управляемом коде — они должны использовать только Windows API; поддержка MSI осуществляется лишь в режиме unattend mode. В целом Server Core предполагает выполнение приложений, обеспечивающих функционирование сетевых и файловых сервисов, средств управления сервером и соответствующих утилит. При его установке разработчикам становятся доступны только те программные интерфейсы, которые реализованы на уровне входящих в состав операционной системы программных компонентов. Данные компоненты и их назначение приведены в таблице.
Программные компоненты Server Core, доступные разработчикам
Технология |
Установленные DLL |
Назначение |
Active Directory
|
activeds.dll |
Интерфейсы Active Directory Service (ADSI) |
ntdsapi.dll
|
Управление контроллером домена и репликацией |
|
Application Installation |
cabinet.dll |
Функции управления CAB-файлами |
imagehlp.dll |
Функции работы с файлами в формате Portable Executable (PE) |
|
msi.dll |
Функции установки приложений |
|
setupapi.dll |
Функции установки приложений |
|
sxs.dll |
Функции поддержки режима side-by-side |
|
Authentication Security |
advapi32.dll |
Управление аутентификацией через HTTP и по учетным записями |
credui.dll |
Управление учетными записями |
|
crypt32.dll |
Набор программных интерфейсов для поддержки криптографии |
|
cryptdll.dll |
Функции поддержки Cryptography Manager |
|
cryptnet.dll |
Поддержка защищенных каналов (сертификаты X.509) |
|
cryptui.dll |
Управление учетными записями |
|
netapi32.dll |
Библиотека функций Microsoft Net API |
|
schannel.dll |
Поддержка защищенных каналов (сертификаты X.509) |
|
secur32.dll |
Библиотека функций Microsoft Security Services |
|
wintrust.dll |
Функции каталога |
|
DHCP |
dhcpsvc.dll |
Библиотека поддержки сервисов DHCP (Dynamic Host Configuration Protocol) |
DNS |
dnsapi.dll |
Библиотека функций поддержки DNS |
General Networking
|
authz.dll |
Поддержка защищенных RPC-вызовов |
iphlpapi.dll |
Набор функций Internet Protocol Helper (IP Helper) |
|
mgmtapi.dll |
Управление SNMP |
|
mpr.dll |
Набор функций поддержки Windows Networking (WNet) |
|
mprapi.dll |
Функции поддержки RAS и администрирования роутера |
|
mswsock.dll |
Функции поддержки Winsock |
|
netsh.exe |
Функции поддержки NetShell |
|
rpcrt4.dll |
Ядро RPC NDR |
|
rtutils.dll |
Функции трассировки Remote RAS |
|
security.dll |
Функции безопасности для Remote RAS |
|
snmpapi.dll |
Поддержка SNMP |
|
traffic.dll |
Контроль трафика |
|
httpapi.dll |
Функции поддержки HTTP |
|
winhttp.dll |
Функции поддержки HTTP |
|
Server Clustering |
clusapi.dll |
Функции поддержки механизмов кластеризации |
resutils.dll |
Дополнительные функции поддержки кластеризации |
|
User Interface |
mlang.dll |
Поддержка нескольких языков интерфейса |
msctf.dll |
Функции для Text Services Framework (TSF) |
|
shell32.dll |
Поддержка оболочки операционной системы |
|
shlwapi.dll |
Библиотека поддержки UNC и URL, реестра и т.п. |
|
Windows System Services
|
clfsw32.dll |
Поддержка протоколирования |
dbghelp.dll |
Поддержка отладчика |
|
dciman32.dll |
Поддержка графики |
|
fltlib.dll |
Функции управления драйверами мини-фильтров |
|
fltmgr.sys |
Функции управления драйверами мини-фильтров |
|
gdi32.dll |
Часть ядра операционной системы, отвечающая за графические функции |
|
kernel32.dll |
Ядро операционной системы Windows |
|
mstask.dll |
Планировщик задач |
|
ntdll.dll |
Внутренние функции ядра операционной системы Windows |
|
ole32.dll |
Функции управления объектами |
|
oleaut32.dll |
Функции управления объектами |
|
pdh.dll |
Функции мониторинга производительности |
|
powrprof.dll |
Функции управления источниками питания |
|
psapi.dll |
Функции мониторинга производительности |
|
pstorec.dll |
Интерфейсы к системе защиты хранилищ данных |
|
sfc.dll |
Функции поддержки подсистемы Windows File Protection |
|
srclient.dll |
Функции восстановления системы |
|
user32.dll |
Часть ядра операционной системы, отвечающая за взаимодействие с пользователями |
|
userenv.dll |
Поддержка пользовательских профилей |
|
verifier.dll |
Функции мониторинга производительности |
|
version.dll |
Функции поддержки версионности |
|
vssapi.dll |
Поддержка Volume Shadow Copy |
|
winsta.dll |
Внутренние функции ядра операционной системы Windows |
Дополнительную информацию по функциям, поддерживаемым в Server Core, можно найти на сайте MSDN Library по адресу: http://msdn2.microsoft.com/en-us/library/ms723894.aspx (Server Core Functions by DLL).
Для того чтобы определить, запущено приложение под Server Core или под какой-то другой конфигурацией, следует использовать функцию GetProductInfo из Kernel32.dll, которая доступна только в Windows Vista и Windows Server Longhorn. Если приложение запущено под Server Core, то переменная pdwReturnedProductType, в зависимости от варианта поставки Windows Server Longhorn, будет иметь одно из следующих значений:
- PRODUCT_STANDARD_SERVER_CORE (0x0000000D);
- PRODUCT_ENTERPRISE_SERVER_CORE (0x0000000E);
- PRODUCT_DATACENTER_SERVER_CORE (0x0000000C).
Второй вариант — применить WMI-класс Win32_OperatingSystem и его свойство OperatingSystemSKU, которое в нашем случае должно иметь одно из следующих значений:
- 12 для Datacenter Server Core Edition;
- 13 для Standard Server Core Edition;
- 14 для Enterprise Server Core Edition.
Для доступа к WMI можно воспользоваться скриптинговой средой PowerShell, о которой мы подробно расскажем в одном из следующих выпусков данного цикла.
И наконец, еще один способ проверить, что работа осуществляется под управлением Server Core, — это проверить наличие в локальной системе такого компонента, как Explorer.exe: если он отсутствует — работа выполняется под управлением Server Core. Для этого можно использовать следующий скрипт:
Dim bServerCore, bExplorer
Const strExplorer = “\explorer.exe”
strRoot = WshEnv(“SYSTEMROOT”)
strExpPath = strRoot + strExplorer
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
If objFSO.FileExists(strExpPath) Then
‘Explorer.exe найден — работаем не под Server Core
WScript.Quit (0)
bServerCore = False
bExplorer = True
Else
bServerCore = True
bExplorer = False
End If
Рассмотрим некоторые вопросы, связанные с миграцией существующих приложений под Server Core, а также с созданием приложений, работающих под управлением Server Core.
Для миграции существующих утилит под Server Core необходимо заменить весь управляемый код на так называемый native code, удалить все вызовы функций, которые не поддерживаются в Server Core (см. приведенную выше ссылку на MSDN Library), все зависимости от графического интерфейса (утилиты должны работать только в режиме командной строки) и все интерактивные компоненты. Для удаленного управления системой следует использовать протоколы, поддерживаемые Server Core, например RPC.
При разработке новых утилит для Server Core следует помнить о том, что это не платформа для создания приложений, а конфигурация сервера, поддерживающая выполнение управляющих утилит, агентов, антивирусов и т.п. Такие утилиты могут выполняться локально (в командной строке), под управлением служб Terminal Services, а для удаленного выполнения команд можно применять Web Services for Management (WS-Management). Обеспечивается поддержка Windows Management Instrumentation (WMI), выполнение заданий по расписанию (Task Scheduler), протоколирование событий и их перенаправление (event forwarding). Кроме того, на уровне Server Core обеспечена поддержка удаленной MMC-консоли через RPC и DCOM и протокола SNMP.
При создании скриптовых утилит в качестве основы можно применять скрипты для управления Server Core, которые расположены в каталоге \Windows\System32\Sfscripts.
Чтобы пройти сертификацию на получение логотипа «Certified for Windows Server Lonhgorn», приложения должны соответствовать следующим требованиям:
- отсутствие зависимостей от компонента Common Dialog Box;
- отсутствие зависимостей от Shell и Shell API;
- отсутствие компонентов на управляемом коде;
- при установке приложения должны поддерживать опции командной строки;
- приложения не могут быть независимыми от мультимедийных компонентов;
- приложения не должны использовать беспроводные сети.
Отметим, что требования к приложениям, претендующим на получение логотипа «Certified for Windows Server Longhorn», еще находятся в стадии разработки. При появлении финальной версии мы обсудим их более подробно — подобно тому, как мы рассматривали требования к Windows XP, Windows Server 2003 и Windows Vista (см. «Уроки чистописания. Создание приложений, корректно работающих под Windows XP, Windows Server 2003 и Windows Vista» в № 2’2006 и «Уроки чистописания. Часть 2. На пути к Windows Vista Logo» в № 5’2006).
Продолжим наше знакомство с Windows Server Longhorn. Далее мы расскажем о нескольких новшествах, появившихся в этой версии операционной системы на уровне ядра. К ним, в частности, относятся транзакционная файловая система (доступная также в ограниченном виде в Windows XP и в полноценном в Windows Vista), транзакционный реестр, удаленное сжатие (Remote Differential Compression, RDC), новинки в Task Scheduler API, Windows Remote Management и Boot Configuration Data (BCD). А кроме того, напомним о технологиях Windows Error Reporting, Windows Restart Manager и Application Recovery and Restart.
Транзакционная файловая система
Транзакционная файловая система (TxF) — это расширение файловой системы NTFS, позволяющее выполнять файловые операции над томом файловой системы NTFS в рамках транзакций. Это стало возможным благодаря новой транзакционной инфраструктуре, реализованной на уровне ядра операционной системы и позволяющей сервисам операционной системы участвовать в транзакциях, используя новый компонент — менеджер транзакций Kernel Transaction Manager (KTM). Помимо этого в обеспечении функционирования транзакционной файловой системы задействована подсистема протоколирования Common Log File System (CLFS), впервые реализованная в Microsoft Windows Server 2003 R2. Взаимодействие этих компонентов показано на рисунке.
Применение транзакционной файловой системы делает возможным выполнение следующих типовых сценариев. Благодаря тому что TxF способна полноценно взаимодействовать с MS Distributed Transaction Coordinator (DTC), она может участвовать в транзакциях, использующих не только менеджеры ресурсов, предоставляемые Kernel Transaction Manager, но и другие менеджеры ресурсов, поддерживаемые на уровне DTC. Например, система документооборота может воспользоваться этой возможностью для работы как с файловой системой, так и с базой данных — и все в рамках одной транзакции.
Другой пример применения транзакционной файловой системы — обновление файлов на группе компьютеров. А за счет расширений в протоколе совместного доступа к файлам и папкам — SMB 2.0 — появилась возможность использования в транзакциях распределенных файловых операций, например при работе с клиентами под управлением Windows Vista.
Отметим, что TxF не поддерживает операции над зашифрованной файловой системой (Encrypted File System, EFS), за исключением операций чтения (например, ReadEncryptedFileRaw).
Транзакционная файловая система предоставляет разработчикам новые функции, в том числе:
- CopyFileTransacted;
- CreateDirectoryTransacted;
- CreateFileTransacted;
- CreateHardLinkTransacted;
- CreateSymbolicLinkTransacted;
- DeleteFileTransacted;
- FindFirstFileNameTransactedW;
- FindFirstFileTransacted;
- FindFirstStreamTransactedW;
- GetCompressedFileSizeTransacted;
- GetFileAttributesTransacted;
- GetFullPathNameTransacted;
- GetLongPathNameTransacted;
- MoveFileTransacted;
- RemoveDirectoryTransacted;
- SetFileAttributesTransacted.
В качестве одного из параметров при вызове перечисленных функций указывается ссылка на транзакцию, в рамках которой выполняется данная операция. Транзакция может быть создана путем вызова функции CreateTransaction при применении Kernel Transaction Manager или функции GetKTMHandle — при использовании DTC.
Появление транзакционной файловой системы привело к внесению ряда изменений в работу следующих функций: CloseHandle, CreateFileMapping, FindNextFile, GetFileInformationByHandle, GetFileInformationByHandleEx, GetFileSize, GetFileSizeEx, GetVolumeInformation, MapViewOfFile, MapViewOfFileEx, ReadDirectoryChangesW, ReadFile, ReadFileEx, ReadFileScatter, SetEndOfFile, WriteFile, WriteFileEx и WriteFileGather. В MSDN Library в разделе FileIO Functions and Transactional NTFS подробно описаны изменения, внесенные в эти функции транзакционной файловой системой.
Компоненты транзакционной файловой системы
Последовательность действий при транзакционной работе с файловой системой может быть следующей:
- Создание транзакции на уровне ядра:
IntPtr tx = CreateTransaction(IntPtr.Zero,
IntPtr.Zero, 0, 0, 0, 0, null);
- Транзакционное удаление файла:
if (!DeleteFileTransactedW(file1, tx))
- Завершение транзакции при успешном выполнении п. 2:
CommitTransaction(tx);
- Откат транзакции при ошибке:
RollbackTransaction(tx);
- Закрытие ссылки на транзакцию:
CloseHandle(tx);
Транзакционный реестр
По аналогии с файловой системой операции над реестром тоже могут выполняться в рамках транзакций. Это стало возможным благодаря механизму, расширяющему набор функций Registry API — Transactional Registry (TxR) и применяющему вышеупомянутый менеджер транзакций на уровне ядра — Kernel Transaction Manager. Как и в случае с транзакционной файловой системой, TxR может использовать и менеджер ресурсов, предоставляемый DTC. Возможный сценарий применения данной функциональности — транзакционная работа с базами данных, файловой системой и операциями с реестром. К функциям для работы с реестром, поддерживающим транзакции, относятся: RegCreateKeyTransacted, RegDeleteKeyTransacted и RegOpenKeyTransacted. Как и в случае с функциями, поддерживающими транзакционную файловую систему, требуется указать ссылку на транзакцию, созданную либо средствами KTM, либо DTC. Последовательность действий при транзакционных операциях с реестром может быть следующей (на примере удаления ключа реестра):
- Создание транзакции на уровне ядра:
IntPtr tx = CreateTransaction(IntPtr.Zero, IntPtr.Zero,
0, 0, 0, 0, null);
- Транзакционное удаление ключа реестра:
if (RegDeleteKeyTransacted(HKEY_CURRENT_USER,
key1, RegSam.KEY_WOW64_32KEY, 0, tx, IntPtr.Zero)
!= 0)
- Завершение транзакции при успешном выполнении п. 2:
CommitTransaction(tx);
- Откат транзакции при ошибке:
RollbackTransaction(tx);
- Закрытие ссылки на транзакцию:
CloseHandle(tx).
В приведенных примерах транзакционных операций с файловой системой и реестром использовалась функция CreateTransaction, предоставленная Kernel Transaction Manager (Ktmw32.dll). Как мы уже отмечали, можно также применять транзакции на уровне DTC. Первое, что необходимо сделать в этом случае, — получить ссылку на KTM-транзакцию средствами DTC. Для этого следует использовать новый интерфейс — IKernelTransaction, который служит связующим звеном между DTC и KTM при выполнении транзакционных операций. Для получения ссылки на транзакцию нужно реализовать метод GetHandle. Вот как это можно сделать на управляемом коде:
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid(“79427A2B-F895-40e0-BE79-B57DC82ED231”)]
internal interface IKernelTransaction
{
void GetHandle([Out] out IntPtr handle);
}
Для получения ссылки на транзакцию применяется следующий код:
// Используем пространство имен System.Transactions
IKernelTransaction tx = (IKernelTransaction)
TransactionInterop.GetDtcTransaction(Transaction.Current);
IntPtr txh;
tx.GetHandle(out txh);
После этого нужно использовать полученную ссылку в транзакционных операциях и завершить работу вызовом функции CloseHandle(txh).
В следующем номере мы продолжим знакомство с новинками, появившимися в Windows Server Longhorn на уровне ядра.