TL;DR

  • WSLC는 Windows에서 Linux 컨테이너를 실행하는 플랫폼으로, 사용자별 세션 프로세스와 다양한 저장소 옵션, Consommé 네트워킹 모델을 제공함.
  • 권한이 높은 wslservice.exe가 가상 머신을 직접 관리하는 대신 사용자 권한으로 실행되는 wslcsession.exe를 생성해 세션 작업을 처리함.
  • 세션마다 자체 가상 하드 디스크(VHD)를 사용하며, 컨테이너 볼륨은 Windows 경로 공유 또는 VHD 기반 저장소로 구성됨.
  • Windows 경로를 공유하는 볼륨은 가상 머신 안에서 virtiofs를 통해 마운트되며, virtiofs는 Plan 9보다 약 2배 빠름.
  • Consommé는 이더넷 프레임을 가상 머신에서 Windows 사용자 프로세스로 전달해 DNS, UDP·TCP 라우팅, 포트 매핑을 제공하고 VPN·방화벽 호환성을 지원함.

세션 모델

  • WSL과 마찬가지로 클라이언트 프로세스는 권한이 높은 Windows 서비스인 wslservice.exe를 호출하며, 이 서비스는 HCS를 통해 가상 머신을 만들고 Linux 워크플로를 실행할 수 있음.
  • WSL 아키텍처와 달리 wslservice.exe는 가상 머신을 직접 소유하지 않고, 호출한 사용자를 대신해 실행되는 자식 프로세스 wslcsession.exe를 생성함.
  • wslcsession.exe는 컨테이너 생성, 디렉터리 마운트, 네트워크 포트 바인딩 등 세션 작업을 사용자 대신 수행함.
  • 세션마다 별도 프로세스를 사용해 세션 간 강한 격리를 제공하고, 권한이 더 낮은 프로세스에서 세션 작업을 실행해 보안 경계를 강화함.

저장소

  • WSLC 세션 내부 또는 Windows 저장소 스택에 데이터를 저장하는 여러 기본 기능을 제공함.

세션 가상 하드 디스크

  • 각 WSLC 세션은 사용 가능한 이미지, 컨테이너, 네트워크, 볼륨 등의 세션 상태를 저장하는 자체 가상 하드 디스크(VHD)를 사용함.
  • wslc.exe를 사용할 때 VHD는 %AppData%\Local\wslc\sessions에 저장됨.

컨테이너 볼륨

  • 컨테이너 볼륨은 컨테이너가 스크래치 공간 외부에 데이터를 저장하도록 하며, 컨테이너를 삭제해도 해당 데이터는 폐기되지 않음.
  • Windows 경로를 컨테이너와 공유하는 간단한 사용 방식은 wslc container run -v C:\Windows\System32\drivers\etc:/volume -it debian:latest ls /volume임.
  • 이 명령은 컨테이너의 /volume에서 hosts, hosts.ics, lmhosts.sam, networks, protocol, services 파일을 확인함.
  • 이러한 볼륨은 Linux 가상 머신 내부에 virtiofs 공유를 마운트한 뒤 컨테이너에 제공하는 방식으로 구현됨.
  • 가상 머신 내부 마운트 지점은 /mnt 아래에 생성되고, 이후 바인드 마운트로 컨테이너에 연결됨.
  • Windows 측에서는 하이퍼바이저와 가상 머신 간 상호 운용을 위해 설계된 고성능 파일 시스템인 virtiofs를 통해 마운트 지점에 접근함.
  • virtiofs의 속도는 Plan 9보다 약 2배 빠름.

VHD 볼륨

  • VHD 볼륨은 Windows 경로 대신 VHD를 기반으로 하는 특수한 컨테이너 볼륨임.
  • 컨테이너에 기본 Linux 파일 시스템이 필요하거나 볼륨 크기 제한을 적용하려는 경우에 유용함.
  • wslc volume create --driver vhd -o SizeBytes=200000000 my-volume my-volume 명령으로 200,000,000바이트 크기의 VHD 볼륨을 생성함.
  • 생성한 볼륨은 이름으로 지정해 하나 이상의 컨테이너에 마운트할 수 있으며, 예를 들어 wslc container run -v my-volume:/volume -it debian:latest findmnt /volume 명령은 /volume이 /dev/sdf의 ext4 파일 시스템으로 마운트됐음을 표시함.

네트워킹

  • WSLC는 Consommé라는 새로운 네트워킹 모델을 통해 연결을 제공함.
  • Consommé는 포트 매핑과 호스트 루프백 같은 고급 시나리오에 필요한 Linux 가상 머신 네트워크 동작을 세밀하게 제어하면서 Windows 네트워킹 스택과 통합함.
  • Linux 가상 머신의 모든 트래픽은 이더넷 프레임으로 virtio 큐에 전달되며, 사용자 대신 실행되는 Windows 프로세스가 이를 읽음.
  • 해당 프로세스가 가상 머신에 제공하는 네트워크 서비스는 다음과 같음.
  • DNS 쿼리 응답
  • UDP 및 TCP 트래픽 라우팅
  • 포트 매핑
  • 가상 머신에서 외부로 라우팅되는 트래픽은 WSLC 세션 소유자를 대신해 전송되므로 일반 Windows 프로세스가 생성한 트래픽처럼 흐르며, VPN 및 방화벽과 폭넓게 호환됨.
  • 컨테이너에서 Nginx를 실행하고 호스트의 8000번 포트를 컨테이너의 80번 포트에 매핑하는 흐름을 예시로 제시함.

자세히 알아보기

  • WSLC는 오픈 소스이며, microsoft/WSL에서 코드를 확인하고 직접 빌드하거나 기여할 수 있음.