류짱:Beyond MySelf

Windows Server 2008 커널 변경 사항 본문

Microsoft/Hyper-V and PowerShell

Windows Server 2008 커널 변경 사항

リュちゃん 2010. 7. 2. 18:00

아래 내용은 Inside Windows Server 2008 Kernel Changes 의 내용중 한 챕터를 복사 한 것입니다.
http://technet.microsoft.com/en-us/magazine/2008.03.kernel.aspx

시스템 가상화

Windows Server 2008 이전에는 Virtual Server 2005를 포함한 Microsoft 가상화 제품이 그림 5와 같은 호스팅 기반 가상화를 사용하여 구현되었습니다. 호스팅 기반 환경에서 가상 컴퓨터는 호스트 운영 체제와 함께 실행되는 VMM(Virtual Machine Monitor)에 의해 구현되었으며, 이 VMM은 대개 장치 드라이버로 동작합니다. VMM은 호스트 운영 체제의 리소스 관리 및 장치 드라이버에 의존하며 호스트 운영 체제에서 실행이 예약된 경우 시분할을 통해 활성 VM(가상 컴퓨터) 간에 CPU를 제공합니다.

그림 5 호스팅 기반 컴퓨터 가상화 

이전 코드명이 "Viridian"이었던 Hyper-V는 하이퍼바이저 가상화를 사용하여 구현됩니다. 하이퍼바이저는 그림 6에서처럼 모든 하드웨어 리소스에 대한 전체 제어권을 가지며, 시스템을 부팅하고 VM을 제어하는 Windows Server 2008 운영 체제도 기본적으로 가상 컴퓨터에서 실행됩니다.

그림 6 Hyper-V 아키텍처 

하이퍼바이저는 시스템을 여러 VM으로 나누고 Windows Server 2008의 부팅 인스턴스를 마스터 또는 루트 파티션으로 취급하므로 디스크, 네트워킹 어댑터 및 그래픽 프로세서 등의 하드웨어 장치에 직접 액세스할 수 있습니다. 하이퍼바이저는 루트에서 전원 관리를 수행하고 하드웨어 플러그 앤 플레이 이벤트에 응답한다고 가정합니다. 하이퍼바이저는 자식 파티션에서 시작된 하드웨어 장치 I/O를 가로채어 루트로 라우팅하며, 루트에서는 표준 Windows Server 2008 장치 드라이버를 사용하여 하드웨어 액세스를 수행합니다. Hyper-V를 실행하는 서버는 이런 방식으로 Windows의 하드웨어 장치 지원을 완벽하게 이용할 수 있습니다.

Windows Server 2008을 Hyper-V 서버 역할로 구성하면 Windows에서 hypervisorimagelaunchtypeboot BCD(부팅 구성 데이터베이스) 설정을 auto로 설정하고 Hvboot.sys 장치 드라이버가 부팅 프로세스의 초기 단계에 시작되도록 구성합니다. 옵션을 구성하면 Hvboot.sys는 가상화에 적합하게 시스템을 준비한 다음 시스템이 AMD-V 또는 Intel VT CPU 가상화 확장 중 무엇을 구현하는지에 따라 각각 %Systemroot%\System32\Hvax64.exe 또는 %Systemroot%\System32\Hvix64.exe를 메모리로 로드합니다.

로드된 후에는 하이퍼바이저가 가상화 확장을 사용하여 자신을 Windows Server 2008 아래에 삽입합니다. 사용자 모드 응용 프로그램은 x64 프로세서의 Ring 3 권한 수준을 사용하고 커널 모드 코드는 Ring 0 권한 수준에서 실행되므로, 개념적으로 하이퍼바이저는 -1 Ring 권한 수준에서 작동하며 이를 통해 Ring 0에서 실행 중인 코드의 실행 환경을 제어할 수 있습니다.

Hyper-V 관리 콘솔을 사용하여 자식 파티션을 만들거나 시작하면, 해당 파티션은 %Systemroot%\System32\Drivers\Winhv.sys 드라이버를 사용하여 하이퍼바이저와 통신합니다. 이 드라이버는 문서화되어 공개된 Hypercall API를 사용하여 하이퍼바이저가 지정된 물리적 메모리 크기 및 실행 특성을 가지는 새 파티션을 만들도록 지시합니다. 루트 안의 VM 서비스(%Systemroot%\System32\Vmms.exe)가 각 자식 파티션에 대한 VM 작업자 프로세스(%Systemroot%\System32\Vmwp.exe)를 만들어서 자식의 상태를 관리합니다.

Windows에서 자식 VM 운영 체제의 성능을 높이는 방법 중 한 가지는, 운영 체제가 Microsoft Hypercall API를 구현하는 하이퍼바이저를 통해서 실행 중일 때에만 활성화되는 코드 시퀀스를 Windows Server 2008과 Windows Vista 모두에서 구현하여 하이퍼바이저를 인식할 수 있도록 개선(이러한 자각 기능을 enlightment라고 함)하는 것입니다. 자식 VM은 하이퍼바이저의 서비스를 직접 요청함으로써 하이퍼바이저가 자식 운영 체제의 의도를 추측해야 할 경우 발생할 수 있는 가상화 코드 오버헤드를 방지합니다.

예를 들어 저수준 다중 프로세스 동기화를 실행하는 스핀록(spinlock)을 인식하기 위한 기능을 구현하지 않은 게스트 운영 체제는 다른 가상 프로세서에 의해 스핀록이 해제될 때까지 조밀한 루프에서 대기 상태로 스핀합니다. 이러한 스핀은 하이퍼바이저가 두 번째 가상 프로세서를 예약할 때까지 하드웨어 CPU 중 하나를 묶어둘 수 있습니다. 자각 기능이 구현된 운영 체제의 경우 스핀록 코드는 스핀이 발생할 수 있을 때 Hypercall을 통해 하이퍼바이저에 통보하여 하이퍼바이저가 즉시 다른 가상 프로세서를 예약하고 불필요한 CPU 사용을 줄일 수 있도록 합니다.

Windows Server 2008에서 VM 성능을 향상시키는 다른 방법은 장치에 대한 VM 액세스를 가속화하는 것입니다. 통틀어 "VM 통합 구성 요소"라고 하는 구성 요소 모음을 자식 운영 체제에 설치하여 성능을 향상시킵니다.

통합 구성 요소를 설치하지 않고 VM을 실행하면 자식 운영 체제는 하이퍼바이저가 제시하는 에뮬레이션된 장치에 대한 하드웨어 장치 드라이버를 구성합니다. 자식 VM의 운영 체제 대신 표준 Windows 장치 드라이버를 사용하여 장치 I/O를 수행하는 루트 파티션에 알리기 위해서는 장치 드라이버가 하드웨어 리소스에 접촉하려고 할 때 하이퍼바이저가 개입해야 합니다. 디스크 읽기와 같은 단일 고수준 I/O 작업에는 많은 별도의 하드웨어 액세스가 관여할 수 있기 때문에 하이퍼바이저와 루트 파티션에 인터셉트라고 하는 전환이 여러 개 발생할 수 있습니다.

Windows Server 2008에서는 가상 컴퓨터 버스 드라이버(%Systemroot%\System32\Drivers\Vmbus.sys), 가상 서비스 클라이언트(VSC) 및 가상 서비스 공급자(VSP)의 세 구성 요소를 사용하여 인터셉트를 최소화합니다. 지원 운영 체제의 VM에 통합 구성 요소를 설치하면 VSC가 장치 드라이버의 역할을 넘겨받고 자식 VM에서 Vmbus.sys 드라이버의 서비스를 사용하여 하이퍼바이저의 Hypercall 및 메모리 공유 서비스를 통해 루트 파티션에 있는 가상 컴퓨터 버스 드라이버로 고수준 I/O 요청을 전송합니다. 루트 파티션에서는 Vmbus.sys가 요청을 해당 VSP로 전달하며 그런 다음 루트의 장치 드라이버를 통해 표준 Windows I/O 요청이 초기화됩니다.

여기서 볼 수 있듯이 Windows Server 2008에는 Hyper-V 하이퍼바이저 기반 가상화가 도입되어 Microsoft 시스템 가상화 전략에서 핵심적 역할을 합니다.