WMI를 통한 Hyper-V 관리...

많은 세미나에서 제가 Windows Server 2008 Hyper-V에 대한 관리를 WMI를 통해서 가능하다라고 많이 말씀드렸습니다.

WMI는 Windows에 대한 전반적인 정보 저장소내 각종 정보, 이에 대한 클래스 및 해당 정보에 대한 작업을 가할 수 있는 메소드로 구성되어져 있습니다. Windows내 WMI 저장소 구조에 대해 가장 편리하게 알아볼 수 있는 툴이 하나 있습니다. PowerShell과 관련된 블로그에서 찾을 수 있는 툴입니다. 바로 PowerShell WMI Browser라는 툴입니다.

이를 통해 Windows내 WMI 정보를 볼 수 있습니다. 여러 정보중 오늘은 Hyper-V에 관련된 Root\Virtualiation이라는 네임스페이스를 이용해보겠습니다. 개인적인 의견은 WMI에 대한 관리는 PowerShell을 이용하시는 것이 상당히 편리합니다.

image

개별 클래스에 가시면 해당 클래스에서 사용할 수 있는 Method 정보를 확인하실 수도 있고, PowerShell의 Get-Member Cmdlet을 이용하여 확인해보실 수도 있습니다. 물론 개별 Attributes에 대한 확인도 Get-Member를 사용하시면 가능하죠

# 가상 머신의 이름을 변수에 넣습니다.
$VMName = "Windows Server 2003"

# VM 개체를 가져옵니다.
$query = "SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" + $VMName + "'"
$VM = get-wmiobject -query $query -namespace "root\virtualization" -computername "."

# VM의 상태를 변경합니다.
$Result = $VM.RequestStateChange(2)

RequestStateChange 메소드의 값에 의미는 2 = 시작, 3 = 중지, 32769 = 저장 입니다.

이해를 돕기 위해 $VM의 Get-Member 결과는?

image

Method중에 RequestStateChange가 보이시죠? 대부분의 Hyper-V 설정 및 작동은 WMI내에서 가능합니다. 2개의 예제를 더 보여드리고, 해당 포스팅을 마치겠습니다. WMI는 많이 알면 알수록, 원격지 작업 or 벌크 작업에 매우 유용한 부분이 될 수 있을 것입니다.

첫번째 예제는 VM의 이름을 변경하는 예제입니다.

# 작업할 VM과 새롭게 변경할 VM 이름을 선언
$VMName = "Windows Server 2003"
$NewVMName = "Windows Server 2003 - new"

# VMManagementService 개체를 가져옵니다.
$VMManagementService = gwmi -class "Msvm_VirtualSystemManagementService" -namespace "root\virtualization" -computername "."

# 수정할 VM 개체를 가져옵니다.
$query = "SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" + $VMName + "'"
$VM = gwmi -query $query -namespace "root\virtualization" -computername "."

# 수정할 VM의 VirtualSystemSettingsData를 가져옵니다.
$query = "Associators of {$VM} WHERE AssocClass=MSVM_SettingsDefineState"
$VMSystemSettingData = gwmi -query $query -namespace "root\virtualization" -computername "."

# ElementName 속성 변경
$VMSystemSettingData.ElementName = $NewVMName

# ModifyVirtualSystem 메소드를 이용한 업데이트
$Result = $VMManagementService.ModifyVirtualSystem($VM.__PATH,$VMSystemSettingData.psbase.GetText(1))

두번째 예제는 VHD 파일을 마운트합니다.

# 마운트할 VHD 파일 지정
$VHDName = "F:\Windows.vhd"

# MSVM_ImageManagementService에서 정보 획득
$VHDService = get-wmiobject -class "Msvm_ImageManagementService" -namespace "root\virtualization" -computername "."

# VHD 마운트
$Result = $VHDService.Mount($VHDName)