우분투 AMD CPU에 KVM으로 Windows 8 설치

27 Jan

KVM이란

KVM 공식 홈페이지에 보면 KVM을 다음과 같이 정의하고 있다.

KVM (for Kernel-based Virtual Machine) is a full virtualization solution for Linux on x86 hardware containing virtualization extensions (Intel VT or AMD-V).

KVM은 가상화 기술(Intel VT나 AMT-V)이 있는 하드웨어용 전 가상화 솔루션(하이퍼바이저)이다. VMWare, VirtualBox 같은 다른 하이퍼바이저들과의 다른 점은 KVM이 운영체제 위에서 작동하는 것이 아니라 커널 모듈로 존재한다. 즉, KVM은 리눅스 커널을 하이퍼바이저로 만들어 준다.

가상화 기술

KVM의 특성상 Intel VT (Virtualization Technology)나 AMD-V (Virtualization) 같은 가상화 기술이 CPU에 적용이 되어야 한다. 설치할 컴퓨터의 CPU는 AMD A6-3500. 구글에서 찾아보니 AMD-V가 된다고 써있다.

구글로 검색할 수도 있지만, 간단하게 /proc/cpuinfo 파일을 열어봐도 된다. CPU에서 가상화가 지원이 된다면 /proc/cpuinfo 파일의 flags 줄에 vmx(Intel)나 svm(AMD)이 들어 있어야 한다. cat과 grep으로 간단하게 가상화 적용 여부를 확인할 수 있다.


cat /proc/cpuinfo | grep svm

바이오스 설정

바이오스에 가상화 기술을 사용할지 여부를 설정하는 부분이 있다. 가상화 기술이 해제된 상태에서 게스트 운영체제를 설치하면 설치가 중간에 멈춘다. 바이오스를 살펴보니 아니나 다를까 가상화가 꺼져있었다.

가상화가 꺼져있음

가상화를 켠다.

가상화 실행

 

KVM 설치

KVM 커널 모듈은 이미 리눅스 커널에 포함되어 있으므로 Qemu와 libvirt만 설치하면 된다. Qemu는 오픈소스 가상머신 에뮬레이터이고 libvirt는 가상화 API 모음이다. 우분투를 기준으로 설치는 아래와 같이 하면 된다.


$ sudo apt-get install qemu-kvm libvirt-bin

KVM 설치  확인

설치가 끝나면 재로그인을 한 후 아래와 같은 명령어를 수행해 본다.

$ virsh -c qemu:///system list

그러면 아래처럼 제목만 있는 표가 나타난다.

 Id Name                 State
----------------------------------

게스트 운영체제 설치

게스트 운영체제 설치는 virt-manager라는 GUI 툴을 이용해서 간편하게 설치가 가능하다. 하지만 지금 사용하는 우분투 머신은 서버 버전이라 GUI가 지원되지 않는다. 텍스트 기반에서 가상 머신을 설치하려면  virtinst가 필요하다. virtinst는 다음과 같이 설치한다.

$ sudo apt-get install virtinst

KVM으로 설치할 수 있는 운영체제 목록은 다음 명령어로 알아볼 수 있다.

$ virt-install --os-variant list

게스트 운영체제로 Windows 8.1을 설치할 예정이므로 Windows 관련해서 추려보려면 grep을 이용하면 된다.

$ virt-install --os-variant list | grep Windows
win7                 : Microsoft Windows 7
vista                : Microsoft Windows Vista
winxp64              : Microsoft Windows XP (x86_64)
winxp                : Microsoft Windows XP
win2k                : Microsoft Windows 2000
win2k8               : Microsoft Windows Server 2008
win2k3               : Microsoft Windows Server 2003

KVM이 지원하는 운영체제 목록에는 Windows 7만 있고 Windows 8.1은 없다. 하지만 그냥 Windows 7이라고 정해주고 설치해도 무방하다.

KVM에서 사용할 네트웍 어댑터 설정은 다음 명령어로 확인 가능하다.

$ virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

default라는 이름의 네트웍 설정이 있으므로 그걸 사용하기로 한다.

게스트 운영체제를 설치하기 위한 씨디는 iso 파일로 미리 저장해 두었다.

자 이제 윈도우 8.1을 설치하면 된다.

$ sudo virt-install \
--connect qemu:///system \
--name Windows-8.1 \
--os-type=windows \
--os-variant=win7 \
--network network=default \
--vcpus=2 \
--hvm \
--graphics vnc \
--ram 4096 \
-f /var/lib/libvirt/images/windows-8.img \
-s 40 \
--cdrom /var/lib/libvirt/images/windows-8.1.iso

각 옵션의 기능은 다음과 같다.

  • –connect qemu:///system
    • qemu 에뮬레이터로 시스템 접속
  • –name Windows-8.1
    • Windows-8.1 이라는 이름으로 게스트 운영체제 생성
  • –os-type=windows
    • 게스트 운영체제는 Windows 계열
  • –os-variant=win7
    • Windows 계열 중에서도 Windows 7류
  • –network network=default
    • default 네트웍을 이용
  • –vcpus=2
    • 가상 머신에 cpu를 얼마나 할당할 것인가
  • –hvm
    • 전 가상화(Full Virtualization) 사용
  • –graphics vnc
    • vnc를 이용하여 접속 (다른 옵션들도 있지만 vnc를 이용하기로 한다)
  • –ram 4096
    • 램은 4기가 할당
  • -f /var/lib/libvirt/images/windows-8.1.img
    • 가상 머신 이미지를 저장할 파일 위치. 기본적으로 /var/lib/libvirt/images 폴더 밑에 생성된다. 원하는 특정 위치를 정할 수도 있지만 권한 문제를 나중에 설정해 줘야 한다.
  • –size 40
    • 가상  머신 이미지는 40기가
  • –cdrom /var/lib/libvirt/images/windows-8.1.iso
    • 설치 씨디 위치

위의 명령을 실행하면 아래처럼 나온다.

Starting install...
Creating storage file windows-8.1.img                        |  40 GB     00:00
Creating domain...                                           |    0 B     00:00
Domain installation still in progress. Waiting for installation to complete.

VNC 접속

게스트 운영체제는 아직 설치가 끝나지 않았다. GUI기반의 virt-manager로 설치를 시작했다면 게스트 운영체제의 설치 화면을 바로 보여준다. 하지만 텍스트 기반의 virtinstall을 가지고 설치했기 때문에 VNC를 통해서만 게스트 운영체제에 접근이 가능하다. 게스트 운영체제에는 아직 VNC Server가 설치되어 있지 않았지만 이를 위해 KVM이 VNC를 미리 설치해뒀다.

게스트 운영체제가 설치될 때마다 KVM은 5900번 포트부터 숫자를 하나씩 늘여가며 VNC Server를 제공한다. 즉, 첫 번째 게스트 운영체제는 5900번을 할 당, 두 번째 게스트 운영체제는 5901번을 할당, n 번째 게스트 운영체제는 5900 + (n-1)번을 할당하는 식이다.

또한 KVM은 게스트 운영체제를 만들 때 사설 네트웍을 하나 생성하고 그 사설 네트웍에 게스트 운영체제를 넣어둔다. 게스트 운영체제는 호스트 운영체제를 통해 외부로 자유롭게 나갈 수 있지만, 외부에서 게스트 운영체제를 접근할 수는 없다. 따라서 외부에서 VNC로 직접 게스트 운영체제를 접근할 수는 없고 터널링을 통해서만 가능하다.

위의 두 개를 종합하면 터널링을 통해서 5900 + (n-1) 포트를 연결하면 VNC로 게스트 운영체제의 설치를 완료할 수 있다.

SSH Tunneling

위의 그림은 위키피디아의 Tunneling Protocol에서 가져온 그림이다. 그림 윗부분에 보면 ssh -L 123:localhost:456 sshserver라고 되어있고 2개의 큰 사각형이 있다.

옅은 노란색의 sshserver는 리눅스가 설치된 호스트 머신이라고 보면 된다. 주황색 localhost는 Windows 8.1이 설치된 가상 머신으로 보면 된다. 파란색 SSH client는 외부에서 접속하는 내 랩탑이 된다.

ssh -L 123:localhost:456 sshserver 명령은 다음과 같이 2가지 일을 수행한다.

  1. 내 랩탑(SSH client)에서 우분투(sshserver)에 SSH 연결을 한다.
  2. 연결 후 내 랩탑의 123번 포트와 우분투의 456번 포트를 연결하는 터널을 하나 만든다

ssh 터널이 생성된 후, 내 랩탑의 VNC로 내 컴퓨터의 123번 포트(127.0.0.1:123)로 접속을 시도하면, ssh는 VNC를 게스트 운영체제의 456번 포트로 포워딩해준다.

KVM을 위한 ssh 터널은 다음과 같이 만든다.

$ssh id@remote-server-url-L5900:127.0.0.1:5900

id와 remote-server-url은 연결하려는 호스트 머신의 정보를 넣으면 된다. 그리고 다음과 같이 VNC를 띄워서 연결하면 Windows 8.1 설치화면이 기다리고 있다.

VNC Viewer

게스트 운영체제 설치 화면