WSL1과 WSL2는 구조적으로 차이가 많다.

 

WSL 활성화 구조

  • WSL이 활성화되면 윈도우 부팅시 Lxss.sys(스텁 드라이버) 로딩, 이후  WSL 드라이버인 LxCore.sys 로딩됨
  • 리눅스 앱은 피코 프로세스(pico process)에서 실행되는데, 피코 프로세스는 윈도우 사용자 공간에 생성되는 경량  가상 공간. LxCode.sys가 피코 프로바이더 동작하면서 리눅스인 척 시뮬레이션을 수행. WSL1에서는 시스템 호출을 번역하는 역할을 수행.
  • LxssManager: LxCore.sys 를 서비스하는 윈도우 서비스. 

 

WSL1

  • 리눅스 바이너리 번역 계층을 통해 윈도우에서 리눅스 환경 제공
  • 리눅스 앱이 호출하는 리눅스 커널 시스템 호출을 항상 LxCore.sys가 NT 시스템 호출로 변환. NT시스템 호출로 매핑할 수 없으면 리눅스 시스템 호출을 NT의 유사 시스템 호출로 바꿔 호출해야 하는데, LxCore가 이 변환 호출 작업을 수행.  유사 시스템 호출조차 불가능할 경우  LxCore가 처리해 주어야야 함. 결국 모든 시스템 호출을 처리해 줄 수 없다보니 WSL1에서는 리눅스 앱 실행이 90% 호환율을 보임.

WSL2

  • 윈도우 호스트 컴퓨터 서비스(하이퍼V 기반 API)를 사용.
  • HyperV에 기반한 경량 가상화 플랫폼을 사용하여 리눅스 환경 제공
  • 리눅스 커널과 경량 하이퍼V 컨테이너를 이용하여 시스템 호출 비호환을 근본적으로 제거함. 하이퍼V는 네이티브 가상화 기술인데, 1형과 2형이 있음. 1형은 NT 커널레벨에서 실행되며, 2형은 커널 레벨 드라이버를 적재하지만 대부분 사용자 공간을 구현. 2형에 속하는 솔루션이 3사 하이퍼바이저(버추얼박스, VMWare 등)이다. 그래서 VirtualBox와 WSL2를 한 머신에서 실행할 수 없다.
  • 도커나 microk8s등을 사용한다면 WSL2를 선택하는게 조금 더 복잡한 설정 작업이 있더라도 낫다.
  • 윈도 10 2019 5월 업데이트 이후(1903)부터 사용 가능.

WSL 2 아키텍쳐

 

  • 예를 들어 파일 열기나 네트워크 포트 열기 작업을 수행하면  WSL1에서는 NT커널에서 직접 처리된 반면, WSL2에서는 가상 HyperV 기기와 동작하는 리눅스 커널에서 처리. WSL2는 가상 기기(디스크 이미지)에 쓰는 작업을 바로 수행하므로 직접 IDE나 SATA등을 흉내내주기 위한 오버헤드를 줄일 수 있다.
  • 성능 최적화를 위해 MS가 직접 하이퍼V 기반의 리눅스 커널을 관리하고 있다.(https://github.com/microsoft/WSL2-Linux-Kernel. )

 

 

  • 2020년 이후 GPU 관련 개선 작업이 진행되어 DirectX, Direct3D, DirectML 작업이 가속화되고, OpenGL, OpenCl,불칸을 지원한다.
  • GPU 병렬처리를 이용하려면 새로운 커널 드라이버인 /dev/dxgkrnl을 사용하면 WDDM(윈도우 디스플레이 드라이버 모델)을 통해 NT커널에서 제공하는 GPU 기능을 이용할 수 있다.  패스-쓰루 드라이버인 셈. 현재는 GPU연산과 오프스크린 렌더링만 지원되고 있음. 

 

  • D3D도 WDDM 확장 버전으로 제공. GUI 지원은 추후.
  • DirectML은 저수준 기계학습 API인데, NVidia GPU가 필요한 CUDA와 달리, DirectML은 인텔과 AMD GPU에서 동작한다. 텐서플로를 돌릴때 유용. MS가 적극 협조하고 있다. CUDA는 nVidia와 협력중이다.
  • 빌드 2020부터 WSL내에서 GUI 공식 지원. 
  • GUI를 WSL에서 동작하는 것은 관심이 없으므로 우선 패스.

+ Recent posts