리눅스에서 가상머신 사용하기 - Qemu
들어가며: 리눅스에서 윈도우가 필요할 때
우리는 리눅스 생태계에 살면서 때때론 윈도우 pc가 필요할 때가 있다. 예를들면, (좋든 싫든) 한국인의 필수품인 한글 (hwp) 문서를 읽거나 작성해야 할 때, MS office 작업을 할 때, 공인 인증서를 꼭 써야할 때가 그에 해당한다.
이 경우에 우리에겐 세 가지 두 가지 선택지가 존재한다.
리눅스를 밀고 윈도우를 설치한다.(우리에게 이런 선택지는 없다.)- 윈도우 전용 디스크를 별도로 구입하고, 듀얼부팅 환경을 구축한다. (한 디스크에 두 개를 설치하는 건 복잡하고 위험성이 크기 때문에 개인적으로 추천하지 않는다.)
- 가상머신으로 윈도우를 구동한다.
2번 방법도 괜찮은 방법이다. 필자도 처음엔 듀얼부팅 환경으로 시작했고, 지금도 가끔 유로트럭 시뮬레이터가 생각날 때면 윈도우로 부팅하곤 한다.
그러나 2번 방법은 리눅스와 윈도우 사이에 파일을 공유할 방법이 있어야 한다는 조금 귀찮은 문제가 있다. 예를들어, 업무를 리눅스로 하다가 그 내용을 발표자료로 만들기 위해 MS powerpoint를 사용하는 경우가 그렇다. 업무 내용은 리눅스에 있는데, 윈도우로 부팅하면 리눅스 파일시스템에 접근하기가 어렵다 (가능할 지도 모르나 위험하다). 그래서 그 파일들을 USB나 외장하드 등 외부 저장 장치로 복사해가서 윈도우에서 참조해야 하는데, 그 과정에 중요한 자료를 날려먹는 일이 발생할 수 있고 미처 챙기지 못한 파일이 있다면 다시 윈도우를 종료하고 리눅스로 돌아갔다 와야하는 매우 번거로운 상황이 발생한다.
이건 클라우드 서비스를 쓰면 조금은 나아질 순 있다. 그렇지만, 필자가 아는한, 리눅스에서 native로 동작(파일시스템에 있는 폴더를 통째로 클라우드와 연결하는 방식)하는 클라우드 서비스는 없다. 그렇다고 웹을 통해 업로드 하는 방식으로 쓰기엔 너무 귀찮고 불편하다.
그래서 결국 3번을 생각하게 된다. 3번은 앞서 2번이 가지는 한계를 완전히 해결한다. 리눅스와 윈도우가 동시에 구동되고 있고, 두 OS에 있는 파일들을 교차로 확인하면서 작업할 수 있다. 그리고 리눅스 directory를 윈도우에 네트워크 폴더로 연결하여 공유할 파일들을 주고받을 수 있다. (이때 remmina를 통한 원격접속 방식이 속도 면에서 가장 좋았다.)
그럼, 지금부터 가상머신을 구동하는 환경을 구축하고 윈도우 가상머신을 올려보자.
Qemu 환경 구축하기
우리는 Qemu를 사용한 가상머신 환경을 구축한다.
윈도우의 virtual box나 vmware라고 생각하면 된다.
Qemu의 공식 소개는 이렇게 되어있다.
QEMU is a generic and open source machine emulator and virtualizer. When used as a machine emulator, QEMU can run OSes and programs made for one machine (e.g. an ARM board) on a different machine (e.g. your x86 PC). By using dynamic translation, it achieves very good performance.
다른 머신 위에서 OS들과 프로그램을 구동할 수 있게 한다는 걸 보니, 우리가 원하는 걸 제공하는 것 같다. 늘 그렇듯, Arch linux를 사용한다는 걸 전제로 설명한다. (debian은 이 사이트를 참조하자)
필요 패키지 설치하기
qemu와 그의 gui 환경, 그리고 네트워킹을 위한 패키지들을 다음의 명령어를 통해 설치해준다. qemu 설치 시 base, desktop, full 중 선택하라고 할텐데, base로 설치해주면 된다.
sudo pacman -S qemu virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat ebtables iptables libguestfs파일시스템 rw 권한 부여하기
libvirt 그룹에 파일 rw 권한을 부여하기 위해 다음의 작업들을 순차적으로 수행한다.
먼저, /etc/libvirt/libvirtd.conf를 열고 다음의 항목들을 찾아서 주석을 제거해주자.
unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"그리고 libvirt 그룹을 생성하고 현재 사용중인 user를 해당 그룹에 추가해준다.
sudo usermod -a -G libvirt $(whoami)
newgrp libvirtlibvirtd (libvirt 데몬) 실행 등록하기
systemd를 통해 pc 시작 시 자동으로 libvirt 데몬이 실행되도록 만들어주자.
sudo systemctl enable --now libvirtd
sudo systemctl start libvirtd재부팅
짜잔, 이제 필요한 작업은 다 끝났다. 이제 재부팅 후 가상머신을 설정하는 단계로 넘어가면 된다.
sudo reboot가상머신 설정하기
자, 지금까지는 Qemu에 기반한 가상머신 구동 환경을 설정했다. 지금부터는 실제 가상머신을 위한 디스크를 생성하고 OS까지 설치해보자.
설치할 OS의 ISO 파일 구하기
윈도우를 설치할 것이니 공식 사이트에서 다운받아주자. 나는 windows 11의 iso 파일을 사용하되, 아주 귀찮은 요청들(설치 요건에 근거한 설치 제한과 microsoft id 로그인 요구 등)이 제거된 microWin iso 파일을 사용했다.
공식 windows11의 이미지를 사용해도 상관은 없다. 다만, 귀찮은 요청들을 우회하는 방법은 구글링을 통해서 직접 처리하는 것을 전제로 한다.
윈도우 가상머신 생성하기
virt manager는 qemu를 사용할 수 있게 해주는 GUI다.
virt manager에서 좌측 상단의 버튼을 통해 virtual machine을 생성하자.
virtual machine 생성창에서 local install media(ISO image...)을 선택하고 forward해준다.
다음 화면에서는 설치할 os의 iso 파일을 선택해줘야 한다. browse를 눌러주자.
그러면 다음처럼 pool 목록창(?)이 뜨는데, 이미지에 보이는 + 버튼을 눌러 iso 파일들이 있는 directory를 목록에 먼저 추가해줘야 한다.
+를 누르면 다음과 같은 창이 뜨는데, 여기서 원하는 이름을 지정하고 target path를 선택해준다.
나는 /home/will/iso_images라는 directory를 사용한다.
설정했으면 Finish를 눌러주자.
그러면 아까의 목록에 iso directory가 추가된 것을 볼 수 있다.
자 그럼, 해당 iso 파일들 중 설치할 항목을 선택하고 choose volume을 눌러 다음으로 진행한다.
나는 microwin.iso를 선택하고 진행한다.
그러면 아까의 화면에 iso파일이 선택된 상태가 된다.
이 화면의 하단을 보면 Choose the operating system you are installing라는 부분이 있는데, 공식 iso 파일을 사용했다면 자동으로 window의 명칭을 찾아두었을 것이다.
그러나 나의 경우처럼 자동으로 감지하지 못할 경우 수동으로 검색하여 win11을 선택한다.
좋다. 다음처럼 os의 명칭까지 설정이 되었다면 forward를 눌러 다음으로 진행하자.
다음은 가상머신에 할당할 memory의 크기와 cpu의 코어 수를 지정하는 단계다. 할당하는 자원은 개인의 선택사항이며, 사용하는 pc의 사양에 따라 선택하면 된다. 가상머신의 전원을 끌 경우 이 자원은 다시 host pc로 돌아오기 때문에, 많이 할당해줘도 큰 문제가 없다.
잘 모르겠으면 그냥 default로 설정된 채로 넘어가도 무방하다. (버벅이면 설치가 끝난 후에 추가로 할당해줄 수 있다!)
설정을 완료하고 forward를 눌러 다음으로 넘어가자.
다음은 가상 디스크의 크기를 결정하는 단계다.
우리에겐 두 개의 옵션이 있다.
- 내 host pc와 동일한 disk(e.g. ssd)에 하나의 파일로 가상 vm을 만드는 방식
- 여분의 ssd가 연결되어 있다면 해당 ssd 전체를 vm이 사용하도록 할당하는 방식. (passthrough라고 불린다.)
일반적으론 1번 방법을 사용하면 되나, 2번 방식이 I/O를 처리하는 속도 면에서 월등히 뛰어나니 여분의 ssd가 있다면 2번 방식을 추천한다. (필자는 실제 업무용으론 2번 방식을 쓰고 있다.)
여기선 1번으로 진행한다.
원하는 디스크 크기를 지정해주자.
엄청나게 클 필요는 없을 것 같아서 나는 64GB 정도로 수정하였다.
그리고 forward를 눌러 다음으로 진행하자.
다음은 최종 검토 작업이다. 여기선 그림의 1과 같이 이 머신의 이름을 지어주고, 설정을 검토한다. 끝났으면 Finish를 눌러 다음으로 진행하자.
Finish를 누르면 자동으로 가상머신이 실행되고, 선택한 iso 파일에 의해 설치 화면이 나타난다.
윈도우 설치 과정에 설치한 디스크를 선택하는 화면을 보면, 그림의 1과 같이 우리가 설정했던 크기(여기선 64GB)의 빈 디스크가 있는 걸 확인할 수 있다. 이걸 선택하고 설치를 진행한다.
이후부터는 전형적인 윈도우 설치 화면이니 쭉 윈도우를 설치해준다. (앞서 언급한대로 설치 요건 우회 방법은 구글링을 통해 알아서 해결하자.)
설치가 쭉 완료되면, 짠, 윈도우가 구동된다. 이제 원하는 프로그램들 (i.e. 카톡, MS office, hwp)을 설치하고 사용하면 된다.
추가로 진행하면 좋을 작업
rdp를 통한 원격접속 (feat. tailscale)
지금 상태로도 충분히 윈도우 가상머신을 활용할 수 있다.
그러나 개인적으로는 virt manager를 통해 윈도우를 사용하는 대신 rdp 프로토콜을 사용하여 원격 접속하는 방식을 더 선호한다. 왜냐면, 기본적으로 virt manager는 vnc 기반의 원격 접속 방식을 사용하는 것 같은데, 이게 약간의 버벅임이 있어서 기분이 좋지않다.
그러나 rdp 프로토콜로 가상머신에 원격접속하면 버벅임이 없다. 아마 프로토콜의 차이 때문이겠지. remmina를 통해 네트워크 디렉토리를 연결할 수 있단 것은 덤이다.
이때 약간의 네트워크 문제가 있는데, 가상머신은 내 host os에 NAT으로 연결되어서 직접 ip를 통한 통신이 바로는 안된다. (그러니까, vm에서 인터넷은 쓸 수 있지만 vm이 받은 가상 ip를 기반으로 ssh 등 통신은 안된다.) iptable을 건드리는 등 복잡한 네트워크 처리를 하면 될 것도 같은데, 귀찮다.
나는 그냥 tailscale로 개인 vpn에 연결하고 vpn ip에 기반하여 rdp를 사용하고 있다. 그러면 외부에서도 사용할 수 있고 오히려 좋다. (다음에 기회가 된다면 tailscale도 한번 다뤄야겠다.)
마치며
오늘은 리눅스에서 윈도우를 써야할 때를 대비하여 가상머신으로 os를 구동하기 위한 환경을 설정하고 설치까지 해보았다. 생각보다(?) 간단하여 다들 따라할 수 있을 것이라 생각된다.
reddit의 리눅스 덕후들은 GPU passthrough를 통해 윈도우 가상머신에 GPU를 전용하게 하여 게임까지 하던데, 나는 아직 시도는 안해봤다. 혹시 이 글을 보는 사람들 중 이걸 성공한 사람이 있다면 공유해주면 좋을 것 같다.