프리미의 공간

WSL vs. Virtual Machine 차이점 비교 본문

Dev

WSL vs. Virtual Machine 차이점 비교

프리미_ 2022. 6. 2. 17:18

Introduction

WSL과 Virtual Machine 모두 윈도우 운영체제에서 리눅스 시스템이 필요할 때 로컬에서 사용할 수 있도록 해준다. 둘은 비슷하면서도 차이점이 있는데, 차이점에 대해 실욕적인 측면에서 알아보려고 한다.

 

WSL, Windows Subsystem for Linux

Microsoft에서 공개한 WSL은 윈도우 운영체제에서 리눅스 명령어나 소프트웨어를 실행할 수 있는 환경을 제공한다. 가상머신과 달리 host machine의 리소스에 직접 접근하기에 추가적인 오버헤드가 없다.

예전 WSL 1에서는 리눅스의 system call를 윈도우 API로 치환하는 방식으로 구현하였으나, 이대로는 안되겠다 싶었는지 Microsoft가 WSL 2를 공개하며 리눅스 커널 그 자체를 구현하였다. 따라서 WSL 2에서는 거의 대부분의 리눅스 기능들을 지원한다. 추가적으로 WSL 1과 WSL 2의 차이점은 아래 링크를 참고하면 된다.

https://docs.microsoft.com/ko-kr/windows/wsl/compare-versions

이번 글에서 이후 WSL라고 한다면 WSL 2를 의미한다.

WSL 2 구조

 

Virtual Machine

가상머신은 호스트 머신에 가상 CPU, 메모리, 하드디스크, 네트워크 카드 등을 구현하여 가상 컴퓨터 장치 위에 OS를 올려 운영하는 방식이다. 호스트 머신과 완전히 분리된 환경을 구축할 수 있으며 서버 운영, 네트워크 환경 구축 등을 하는데 유리하다. 아래 그림은 vmware의 간략화된 구조를 나타낸다.

https://blogs.sap.com/2014/05/28/a-brief-intro-of-virtualization-and-vmware-esxi/

 

WSL과 VM의 차이점

두 구조 모두 윈도우에서 리눅스를 쓸 수 있게 해주지만, 세부적인 항목에서 다른 점이 있다.

1. systemd

systemd는 컴퓨터를 부팅(부트스트래핑)하고 다른 모든 프로세스를 관리하는 시스템이다. PID 1번을 차지하며 모든 프로세스의 부모 프로세스이다. systemd 시스템의 유틸리티 도구로서 systemctl 명령어가 있다.

Ubuntu의 systemd 프로세스

하지만 WSL은 systemd가 아니라 윈도우가 부팅시키기 때문에 systemd 프로세스가 존재하지 않는다. 따라서 systemctl 명령어를 사용할 수 없다. 사용하려고 하면 아래와 같은 에러메시지가 발생한다.

System has not been booted with systemd as init system (PID 1). Can't operate.

WSL에는 systemd 프로세스가 없다.

WSL에서 systemctl 명령어를 사용해야하는 경우, service와 같은 같은 기능의 다른 명령어를 사용해야한다. 예로 sudo systemctl start ssh 대신 sudo service ssh start와 같이 사용하여야 한다.

 

2. 네트워크

Virtual Box, VMware 등 가상머신 상용 소프트웨어를 이용하여 가상머신들을 구성한다면 네트워크 구조를 NAT, 브릿지, Host-only 등 필요에따라 설정할 수 있다. 하지만 WSL의 여러 배포(ubuntu, kali 등)를 동시에 실행해서 서로 통신하는 것이 불가능하다.

WSL의 여러 배포

아래는 docker-desktop과 Ubuntu 배포에서 각각 IP주소와 MAC 주소를 확인해봤을 때, 모두 동일한 값을 가지고 있었다. 즉, WSL의 배포판은 가상머신처럼 인스턴스로 실행되는 것이 아니라, NAT 네트워크 내에 구성된 하나의 NIC를 현재 실행중인 배포판들이 돌려쓰는 것으로 추측된다. 따라서 여러 장치간의 통신 환경을 위해서는 가상머신이 보다 유리하다.

docker-desktop 배포의 IP와 MAC 주소

 

Ubuntu 배포의 IP와 MAC 주소

 

번외 - 가상머신과 WSL 동시에 사용하는 법

가끔 Hyper-v 기능이 켜져있을 때 Virtual Box나 VMware 등 가상머신이 동작하지 않는 경우가 있다. 이 경우 hyper-v와 가상머신 소프트웨어가 호환되지 않기 때문으로, hyper-v 기능을 잠시 꺼두면 되는 경우가 있다. 아래 명령어를 통해 사용가능하다. 터미널을 관리자 권한으로 실행 후 명령어를 실행하면 된다.

# 상태 확인하는 법
bcdedit | find "hypervisorlaunchtype"

# VirtualBox 실행시
bcdedit /set hypervisorlaunchtype off

# docker, wsl 실행시
bcdedit /set hypervisorlaunchtype auto

 

마무리

가상머신과 WSL에 대해 깊이있게 알아본다면 리눅스 커널 구조에 대해 더 잘 알 수 있을 것이다. 특히 활발히 사용되고 있는 도커와 클라우드 등 가상화 기술에 대해서도 깊숙히 이해할 수 있을 것으로 기대된다.

단순 WSL과 가상머신의 비교에 그치지 않고 실제로 WSL이 어떻게 구현되었는지 학습해야겠다.

 

'Dev' 카테고리의 다른 글

인터넷 없는 환경에 파이썬 패키지 설치  (0) 2024.04.09
docker 자주 쓰이는 명령어 모음  (0) 2022.01.22
selenium 사용 팁  (0) 2021.12.08