[XenServer] Xentools 설치 전 & 후 장치 관리자 비교 Virtualization2011. 1. 19. 14:25
XenServer(5.6)에서 Windows XP(SP3)에 Xentools 설치 전과 후의 장치 관리자 비교.
일단 눈에 보이는 점은 SCSI 컨트롤러가 잡혔고, 에뮬레이터 형태의 드라이버들이 PV 드라이버로 잡힌 것을 확인할 수 있다. Hyper-V와 비교하자면 VMBus 드라이버라고 할 수 있겠다.
XenServer(5.6)에서 Windows XP(SP3)에 Xentools 설치 전과 후의 장치 관리자 비교.
일단 눈에 보이는 점은 SCSI 컨트롤러가 잡혔고, 에뮬레이터 형태의 드라이버들이 PV 드라이버로 잡힌 것을 확인할 수 있다. Hyper-V와 비교하자면 VMBus 드라이버라고 할 수 있겠다.
Windows Server 2008 R2에 SCCM 2007 설치
엄밀히 얘기하자면 사전 요구 사항 설치
1. AD 준비
1-1. AD 스키마 확장
> Schema Admins 그룹 구성원으로 로그온
> \SMSSETUP\BIN\I386\EXTADSCH.exe 실행
> C:\ExtADSch.log 확인
1-2. Systems Management 컨테이너 구성
> DC에 로그온
> adsiedit.msc 실행 후 DC에 연결
> CN=System 우클릭 -> 새로 만들기 -> 개체 -> container
> 값: 'System Management'
> ADCU 실행(dsa.msc) -> 보기 -> 고급 기능
> System -> System Management 우클릭 -> 속성 -> 보안
> 추가 -> SCCM 관리자 계정, SCCM 서버 컴퓨터 계정
> 읽기, 쓰기, 모든 자식 개체 만들기, 모든 자식 개체 삭제
> 고급 -> SCCM 관리자 계정, SCCM 서버 컴퓨터 계정
> 편집 -> 적용 대상 -> 이 개체 및 모든 하위 개체
> 이 컨테이너에 있는 개체 및/또는 컨테이너에... 체크
> 적용 및 확인
2. SCCM 서버 준비
[윈도우 구성 요소 설치(CMD)]
ServerManagerCmd.exe -i NET-Framework-Core Web-Server Web-DAV-Publishing Web-Asp-Net Web-ASP Web-Windows-Auth Web-Metabase Web-WMI BITS RDC Web-Dyn-Compression Web-Scripting-Tools Web-Mgmt-Service Web-Lgcy-Scripting
[윈도우 구성 요소 설치(PowerShell)]
Import-Module ServerManager
Add-WindowsFeature NET-Framework-Core,Web-Server,Web-DAV-Publishing,Web-Asp-Net,Web-ASP,Web-Windows-Auth,Web-Metabase,Web-WMI,BITS,RDC,Web-Dyn-Compression,Web-Scripting-Tools,Web-Mgmt-Service,Web-Lgcy-Scripting
[WebDAV 구성]
%WINDIR%\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /enabled:true /commit:apphost
%WINDIR%\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoringRules /"+[users='*',path='*',access='Read']" /commit:apphost
%WINDIR%\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /fileSystem.allowHiddenFiles:true /commit:apphost
%WINDIR%\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /properties.allowAnonymousPropfind:true /commit:apphost
%WINDIR%\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /properties.allowCustomProperties:false /commit:apphost
%WINDIR%\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /properties.allowInfinitePropfindDepth:true /commit:apphost
%WINDIR%\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /fileSystem.allowHiddenFiles:true /commit:apphost
%WINDIR%\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:windowsAuthentication /enabled:true /commit:apphost
3. SCCM 2007 R3를 설치하기 위한 사전 요구 사항(Hotfix)
KB977384를 다음 서버에 설치해야 한다.- Independent Management Architecture (IMA) 서비스가 없어졌다.
- 데이터베이스는 SQL만 지원한다.(Oracle 또는 Access 지원 안함.)
- 초기 설치 화면
> Quick deploy: 모든 구성 요소(License Server, DDC, DB(SQL Express))를 한 대의 서버에 설치
> Join existing deployment: 기존 사이트에 XenDesktop Controller 추가
> Desktop deployment: 대규모 배포를 위한 Provisioning Services 포함하는 고급 설치 옵션
- 더 이상 Windows Server 2003을 지원하지 않는다.(2008 및 2008 R2 지원)
- DDC 시스템 요구 사항
> Windows Server 2008 SP2
> Windows Server 2008 R2 및 R2 SP1
> .NET Framework 3.5 SP1
> IIS, ASP.NET 2.0
> IIS는 Web Interface, License Server, Desktop Director 설치 시만 필요
- 데이터베이스 요구 사항
> SQL Server 2008 R2 (STD/ENT)
> SQL Server 2008 R2 Express
> SQL Server 2008 SP2 (STD/ENT)
> SQL Server 2008 Express SP1
> SQL Server 2005 SP3
- 새로운 관리 콘솔: Citrix Desktop Studio와 Citrix Desktop Director
VBS VB Script SCOM System Center Operations Manager
' 파라미터로 경고 임계값과 오류 임계값
' 오류 상태 정의: Property[@Name='State'] 같음 Critical
' 경고 상태 정의: Property[@Name='State'] 같음 Warning
' 정상 상태 정의: Property[@Name='State'] 같음 Good
' 경고 설명: $Data/Context/Property[@Name='Message']$
Dim oAPI, oBag
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oBag = oAPI.CreatePropertyBag()
Set oArgs = WScript.Arguments
If oArgs.Count <> 2 Then
WScrpit.Quit
End If
If cDbl(oArgs(1)) < cDbl(oArgs(0)) Then
WarningValue = cDbl(oArgs(0))
CriticalValue = cDbl(oArgs(1))
Else WarningValue = cDbl(oArgs(1))
CriticalValue = cDbl(oArgs(0))
End If
State = "Good"
Message = ""
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk Where DriveType = '3'")
For Each Item in colItems
FreeSpaceMB = RoundDown(Item.FreeSpace / 1048576)
If cDbl(FreeSpaceMB) > WarningValue Then
Call oBag.AddValue("Free Space(MB) on " & Item.DeviceID, FreeSpaceMB & " (OK)")
Else If cDbl(FreeSpaceMB) < CriticalValue Then
State = "Critical"
Call oBag.AddValue("Free Space(MB) on " & Item.DeviceID, FreeSpaceMB & " (Critical)")
Message = Message & "Free Space(MB) on " & Item.DeviceID & " " & FreeSpaceMB & " (Critical) | "
Else Call oBag.AddValue("Free Space(MB) on " & Item.DeviceID, FreeSpaceMB & " (Warning)")
Message = Message & "Free Space(MB) on " & Item.DeviceID & " " & FreeSpaceMB & " (Warning) | "
If State = "Critical" Then
Else State = "Warning"
End If
End If
End If
Next
If Message = "" Then
Message = "Message = "All Logical Free Disk Space is Good"
Else Message = LEFT(Message, LEN(Message)-3)
End If
Function RoundDown(Value)
If InStr(Value, ".") Then
RoundDown = Left(Value, InStr(Value, ".") + 2)
Else
RoundDown = Value
End If
End Function
Call oBag.AddValue("State", State)
Call oBag.AddValue("Message", Message)
Call oAPI.Return(oBag)
VBS VB Script System Center Operations Manager SCOM
' 파라미터로 서비스 이름(한 개 이상)
' 비정상 상태 정의: Property[@Name='State'] 같음 Bad
' 정상 상태 정의: Property[@Name='State'] 같음 Good
' 경고 설명: $Data/Context/Property[@Name='Message']$
Dim oAPI, oBag
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oBag = oAPI.CreatePropertyBag()
Set oArgs = WScript.Arguments
If oArgs.Count = 0 Then
WScript.Quit
End If
Count = oArgs.Count - 1
Result = "Good"
Message = ""
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
For i = 0 to Count
Set colItems = objWMIService.ExecQuery ("Select * from Win32_Service Where Name = '" & oArgs(i) & "'")
If colItems.Count = 0 Then
Call oBag.AddValue(oArgs(i), "Not installed")
Message = Message & oArgs(i) & " Service: Not installed | "
Result = "Bad"
Else
For Each Item in colItems
If Item.State <> "Running" Then
Result = "Bad"
Call oBag.AddValue(Item.Caption, Item.State)
Message = Message & Item.Caption & "(" & oArgs(i) & ") Service: " & Item.State & " | "
Else Call oBag.AddValue(Item.Caption, Item.State)
End If
Next
End If
Next
If Message = "" Then
Message = "All services are running"
Else Message = LEFT(Message, LEN(Message)-3)
End If
Call oBag.AddValue("State", Result)
Call oBag.AddValue("Message", Message)
Call oAPI.Return(oBag)
Notepad.exe APP1
Notepad.exe APP2
셈플은 DB 테이블에서 | (파이프)로 구분된 APP1|APP2를 분리해 검색
와 같은 형태로 실행되는 응용 프로그램의 실행 상태를 파라미터(APP1, APP2) 기준으로 상태를 표시
VBS VBScript
sHostProcess = "notepad.exe"
Set dbcon = CreateObject("Adodb.connection")
sCon = "Provider=sqloledb;Data Source = 10.10.10.10;User ID=sa;Password=P@ssw0rd;Initial Catalog=DBName"
dbcon.open sCon
sSQL = "select * from table1"
Set Result = dbcon.execute(sSQL)
Do While not Result.eof
sApplication = sApplication & Trim(Result(0)) & "|"
Result.movenext
Loop
Set Result = Nothing
dbcon.close
sApplication = LEFT(sApplication, LEN(sApplication) - 1)
arrApplication = Split(sApplication,"|")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colHostProcess = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = '" & sHostProcess & "'")
If colHostProcess.Count = 0 Then
WScript.Echo "Host rocess is not running."
Set objWMIService = Nothing
WScript.Quit
End If
sStatus = "Good"
sMessage = ""
WScript.Echo "Host process " & sHostProcess
For Each App in arrApplication
intState = GetAppState(App)
If intState = 1 Then
WScript.Echo App & " Running"
Else WScript.Echo App & " Not running"
sMessage = sMessage & App & " is not running" & " | "
sStatus = "Bad"
End If
Next
sMessage = LEFT(sMessage, LEN(sMessage) - 3)
WScript.Echo "Status is " & sStatus
WScript.Echo "Message is " & sMessage
Set objWMIService = Nothing
WScript.Quit
Function GetAppState(sAppName)
For Each Item in colHostProcess
arrCommandLine = Split(Item.CommandLine," ")
For Each arrItem in arrCommandLine
If Instr(UCASE(arrItem), UCASE(sAppName)) Then
GetAppState = 1
End If
Next
Next
End Function
특정 프로세스의 CPU 사용률 수집 규칙 - SCOM
Win32_PerfRawData_PerfProc_Process 클래스를 쿼리해 논리적인 CPU 수로 나눠 계산한다.
SCOM VBS VBScript System Center Operations Manager
' 프로세스 CPU 사용률 수집 규칙
' 규칙 -> 수집 규칙 -> 프로브 기반 -> 스크립트(성능)
' 프로세스가 하나 이상일 경우 #1, #2와 같은 형태로 수집
' 개체: Process
' 카운터: % Processor Time
' 인스턴스: $Data/Property[@Name='ProcessName']$
' 값: $Data/Property[@Name='PerfValue']$
' 대상 프로세스 이름
strProcess = "notepad.exe"
Dim oAPI, oBag
Set oAPI = CreateObject("MOM.ScriptAPI")
If UCASE(RIGHT(strProcess,3)) = "EXE" Then
strProcess = LEFT(strProcess,LEN(strProcess) - 4)
End If
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colPerf = objWMIService.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process Where Name = '" & strProcess & "'")
If colPerf.Count = 0 Then
WScript.Quit
End If
ProcessorCount = GetNumProcessors
i = 0
For Each strProcessPerf in colPerf
PerfValue = 0.0
PerfValue = GetCPUPerf(strProcessPerf.IDProcess)
If i > 0 Then
ProcessName = strProcessPerf.Name & "#" & i
Else ProcessName = strProcessPerf.Name
End If
Set propertyBag = oAPI.CreatePropertyBag()
propertyBag.AddValue "ProcessName",ProcessName
propertyBag.AddValue "PerfValue",PerfValue
oAPI.AddItem(propertyBag)
Call oAPI.Return(propertyBag)
i = i + 1
Next
Set colPerf = Nothing
Function GetCPUPerf(PID)
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process Where IDProcess = '" & PID & "'" )
For Each CPUPerfQ in colItems
N1 = CPUPerfQ.PercentProcessorTime
D1 = CPUPerfQ.TimeStamp_Sys100NS
Next
WScript.Sleep(1000)
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process Where IDProcess = '" & PID & "'" )
For Each CPUPerfQ in colItems
N2 = CPUPerfQ.PercentProcessorTime
D2 = CPUPerfQ.TimeStamp_Sys100NS
Next
If ( 0 = (D2-D1) ) then
GetCPUPerf = 0
Else
PercentProcessorTime = ((N2 - N1) / (D2 - D1)) * 100
GetCPUPerf = PercentProcessorTime / ProcessorCount
End If
Set WMI_Service = Nothing
End Function
Function RoundDown(Value)
If InStr(Value, ".") Then
RoundDown = Left(Value, InStr(Value, ".") + 3)
Else
RoundDown = Value
End If
End Function
Function GetNumProcessors
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objItem In colItems
On Error Resume Next
GetNumProcessors = objItem.NumberOfLogicalProcessors
If Err.number <> 0 Then
GetNumProcessors = objItem.NumberOfProcessors
End If
On Error GoTo 0
Next
End Function
Windows의 성능 카운터 상에서 보여지는 프로세스의 CPU 사용률은 각 코어에 대한 사용률의 합이 된다. 예를들어, 4-코어인 경우 최대 400%까지 CPU 사용률이 나올 수 있어 GUI로 구현하게 되면 오탐이 발생하게 된다.
VBS VBScript SCOM System Center Operations Manager
' 프로세스 CPU 사용률(%) 모니터(두 가지 상태)
' 수집 간격(분) x 수집 횟수 시간 동안 스크립트 실행됨(실행 주기 및 제한 시간 설정 시 유의)
' 수집 시간동안 임계값을 연속해서 초과하는 경우 상태는 Bad
' 비정상 상태 정의: Property[@Name='Status'] 같음 Good
' 정상 상태 정의: Property[@Name='Status'] 같음 Bad
' 경고 설명: $Data/Context/Property[@Name='Message']$
' 모니터링 설정
Interval = 1 ' 수집 간격(분)
Sampling = 1 ' 수집 횟수
strProcess = "notepad" ' 대상 프로세스
PerfValue = 30 ' 임계값(%)
If UCASE(RIGHT(strProcess,3)) = "EXE" Then
strProcess = LEFT(strProcess,LEN(strProcess) - 4)
End If
ProcessorCount = GetNumProcessors
Dim oAPI, oBag
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oBag = oAPI.CreatePropertyBag()
i = 0
Summary = 0
Do While ( i < Sampling )
i = i + 1
ResultValue = GetCPUPerf(strProcess)
If ResultValue >= PerfValue Then
Summary = Summary + 1
End If
If Sampling = 1 Then
Exit Do
End If
WScript.Sleep Interval*60000
Loop
If cInt(Summary) = cInt(Sampling) Then
Status = "Bad"
Message = "프로세스 " & strProcess & "의 CPU 사용률이 설정된 임계값(" & PerfValue & "%)을 초과하였습니다. 프로세스 " & strProcess & "의 CPU 사용률은 " & RoundDown(ResultValue) & "%입니다."
Else
Status = "Good"
Message = "프로세스 " & strProcess & "의 CPU 사용률이 설정된 임계값(" & PerfValue & "%) 이하입니다. 프로세스 " & strProcess & "의 CPU 사용률은 " & RoundDown(ResultValue) & "%입니다."
End If
Call oBag.AddValue("Message",Message)
Call oBag.AddValue("Status",Status)
Call oBag.AddValue("CPU Usage",RoundDown(ResultValue) & "%")
Call oAPI.Return(oBag)
Function GetCPUPerf(ProcessName)
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
sObjectPath = "Win32_PerfRawData_PerfProc_Process.Name=" & chr(34) & ProcessName & chr(34)
Set perf_instance1 = WMI_Service.Get( sObjectPath )
N1 = perf_instance1.PercentProcessorTime
D1 = perf_instance1.TimeStamp_Sys100NS
WScript.Sleep(1000)
Set perf_instance2 = WMI_Service.get( sObjectPath )
N2 = perf_instance2.PercentProcessorTime
D2 = perf_instance2.TimeStamp_Sys100NS
If ( 0 = (D2-D1) ) then
GetCPUPerf = 0
Else
PercentProcessorTime = ((N2 - N1) / (D2 - D1)) * 100
GetCPUPerf = PercentProcessorTime / ProcessorCount
End If
Set WMI_Service = Nothing
End Function
Function RoundDown(Value)
If InStr(Value, ".") Then
RoundDown = Left(Value, InStr(Value, ".") + 3)
Else
RoundDown = Value
End If
End Function
Function GetNumProcessors
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objItem In colItems
On Error Resume Next
GetNumProcessors = objItem.NumberOfLogicalProcessors
If Err.number <> 0 Then
GetNumProcessors = objItem.NumberOfProcessors
End If
On Error GoTo 0
Next
End Function
SCOM의 작업을 이용해 파라미터를 받아 레지스트리 입력 또는 업데이트
VBS VBScript SCOM System Center Operations Manager
Set oArgs = WScript.Arguments
' 파라미터 Validation Check
If UCASE(oArgs(0)) <> "ABC" AND UCASE(oArgs(0)) <> "DEF" AND UCASE(oArgs(0)) Then
Guide()
End If
If UCASE(oArgs(1)) <> "ABC" AND UCASE(oArgs(1)) <> "DEF" AND UCASE(oArgs(1)) Then
Guide()
End If
const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\SAMPLE"
oReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath
oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,"Parameter1",UCASE(oArgs(0))
oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,"Parameter2",UCASE(oArgs(1))
WScript.Echo ""
WScript.Echo "레지스트리 업데이트 완료."
WScript.Echo " - 파라미터 1: " & UCASE(oArgs(0))
WScript.Echo " - 파라미터 2: " & UCASE(oArgs(1))
WScript.Quit
Sub Guide()
WScript.Echo ""
WScript.Echo "매개변수 입력 가이드"
WScript.Quit
End Sub