Hyper-V 확장 가능한 스위치 정책 개요
Hyper-V 플랫폼 및 확장 가능한 스위치 인터페이스는 확장 가능한 스위치에 대한 스위치 및 포트 정책을 관리하는 인프라를 제공합니다. 이러한 정책은 PowerShell cmdlet 및 WMI 기반 애플리케이션 프로그램을 통해 관리됩니다. 또한 이 인프라는 정책의 스토리지 및 마이그레이션을 지원합니다.
ISV(독립 소프트웨어 공급업체)는 이 인프라를 사용하여 자체 사용자 지정 정책을 등록할 수 있습니다. 등록한 후에는 기본 제공 Hyper-V 정책 인터페이스를 통해 이러한 정책을 검색하고 관리할 수 있습니다. 정책의 속성은 포트별 수준 또는 스위치별 수준에서 구성할 수 있습니다.
사용자 지정 정책 속성 외에도 Hyper-V 확장 가능한 스위치 인터페이스는 포트별 또는 스위치별로 사용자 지정 정책 속성에 대한 상태 정보를 가져오는 인프라를 제공합니다. 이 상태 정보는 기능 상태 정보라고 합니다.
확장 가능한 스위치 사용자 지정 정책 데이터는 MOF(관리 개체 형식) 클래스 정의를 사용하여 WMI 관리 계층에 등록됩니다. 다음은 사용자 지정 포트 정책 속성에 대한 MOF 클래스의 예를 보여줍니다.
#pragma namespace("\\\\.\\root\\virtualization\\v2")
[ Dynamic,
UUID("F2F73F23-2B8E-457a-96C4-F541201C9150"),
ExtensionId("5CBF81BE-5055-47CD-9055-A76B2B4E369E"),
Provider("VmmsWmiInstanceAndMethodProvider"),
Locale(0x409),
InterfaceVersion("1"),
InterfaceRevision("0"),
DisplayName("VendorName Port Settings Friendly Name") : Amended,
Description("VendorName Port Settings detailed description.") : Amended]
class Vendor_SampleFeatureSettingData: Msvm_EthernetSwitchPortFeatureSettingDataMsvm
{
[WmiDataId(1),
InterfaceVersion("1"),
InterfaceRevision("0")]
uint8 IntValue8 = 0;
[WmiDataId(2),
InterfaceVersion("1"),
InterfaceRevision("0")]
uint16 IntValue16 = 0;
[WmiDataId(3),
InterfaceVersion("1"),
InterfaceRevision("0")]
uint32 IntValue32 = 0;
[WmiDataId(4),
InterfaceVersion("1"),
InterfaceRevision("0")]
uint64 IntValue64 = 0;
[WmiDataId(5),
InterfaceVersion("1"),
InterfaceRevision("0"),
MaxLen(255)]
string FixedLengthString = "";
[WmiDataId(6),
InterfaceVersion("1"),
InterfaceRevision("0")]
string VariableLengthString = "";
[WmiDataId(7),
InterfaceVersion("1"),
InterfaceRevision("0"),
Max(8)]
uint32 FixedLengthArray[] = {};
[WmiDataId(8),
InterfaceVersion("1"),
InterfaceRevision("0")]
uint32 VariableLengthArray[] = {};
};
WMI 관리 계층은 기본 확장 가능한 스위치 확장으로 전송될 때 MOF 데이터를 직렬화합니다. MOF 클래스는 Hyper-V 확장 가능 스위치 확장에서 처리할 수 있는 해당 C 구조로 직렬화됩니다. 다음은 이전 예제에서 MOF 클래스에 대해 serialize된 C 구조체의 예를 보여 주는 예제입니다.
#pragma pack(8)
typedef struct _VARIABLE_LENGTH_ARRAY
{
UINT32 Buffer[1];
} VARIABLE_LENGTH_ARRAY;
typedef struct _SAMPLE_FEATURE_SETTINGS
{
UINT8 IntValue8;
UINT32 IntValue16;
UINT32 IntValue32;
UINT64 IntValue64;
UINT16 FixedLengthStringByteCount;
WCHAR FixedLengthString[256];
UINT32 VariableLengthStringOffset; // offset to VARIABLE_LENGTH_STRING structure
UINT32 FixedLengthArrayElementCount;
UINT32 FixedLengthArray[8];
UINT32 VariableLengthArrayElementCount;
UINT32 VariableLengthArrayOffset; // offset to VARIABLE_LENGTH_ARRAY
} SAMPLE_FEATURE_SETTINGS;
typedef struct _VARIABLE_LENGTH_STRING
{
USHORT StringLength;
WCHAR StringBuffer[1];
} VARIABLE_LENGTH_STRING;
이 예제에서는 MOF 클래스가 확장 가능한 스위치 정책 속성에 대해 해당 C 구조로 직렬화될 때 발생하는 다음 사항을 강조 표시합니다.
MOF 파일의 버전 정의는 USHORT 값으로 변환됩니다. 여기서 상위 비트에는 주 버전이 포함되고 하위 비트에는 부 버전이 포함됩니다. 버전은 다음 코드를 사용하여 직렬화됩니다.
(((MajorVersion) << 8) + (MinorVersion))
예를 들어 위의 Version("1")은 를 통해
(((1) << 8) + (0))
0x0100 값으로 직렬화됩니다. 버전("1.1")은 를 통해(((1) << 8) + (1))
0x0101 값으로 직렬화됩니다.사용자 지정 정책 속성이 기본 확장에 발급되면 정책 속성을 정의하는 구조체의 PropertyVersion 멤버에 직렬화된 버전 값이 포함됩니다.
예를 들어 확장 가능한 스위치 인터페이스가 OID_SWITCH_PORT_PROPERTY_ADD OID(개체 식별자) 요청을 발급하면 OID는 NDIS_SWITCH_PORT_PROPERTY_PARAMETERS 구조와 연결됩니다. 해당 구조체의 PropertyVersion 멤버에는 직렬화된 버전 값이 포함됩니다.
모든 가변 길이 문자열은 직렬화된 C 구조를 포함하는 버퍼 내의 오프셋으로 직렬화됩니다. 각 가변 길이 문자열은 이 버퍼 오프셋 내에서 VARIABLE_LENGTH_STRING 구조체로 형식이 지정됩니다.