engineering

WSL2 - Windows에서 linux를 돌리는 가장 효율적인 방법

제이훈 : 세상 모든 지식의 탐구자 2025. 6. 3. 15:04

WSL이란?

  • WSL(Windows Subsystem for Linux)는 Windows에서 리눅스 환경을 실행할 수 있게 하는 하위 시스템
  • 특히 WSL2는 리눅스 커널을 직접 포함하며, WSL1과 구조적으로 완전히 다름

🔰 WSL 개요

  • WSL1 (2016~): Windows의 NT 커널 위에서 리눅스 시스템 콜을 호환 계층(LXSS)으로 번역해 실행
  • WSL2 (2020~): 리눅스 커널을 포함한 경량 VM을 실행하여 실제 리눅스 환경을 구동

→ WSL1: 시스템 콜 에뮬레이션
→ WSL2: 실제 가상 머신

⚙️ WSL2 vs WSL1 아키텍처 비교

항목 WSL1 WSL2
커널 NT 커널 기반 (리눅스 API를 NT에서 처리) 리눅스 커널 자체를 Hyper-V VM으로 실행
실행 방식 시스템 콜을 Windows에서 번역 처리 Hyper-V 경량 VM에서 실제 리눅스 커널 실행
파일 시스템 NTFS 기반, /mnt/c 등 ext4 기반 VHDX + Windows 디렉토리 접근 가능
성능 빠른 파일 접근 (NTFS) 느린 NTFS 접근, 리눅스 파일은 매우 빠름
호환성 일부 시스템 콜 미지원 100% 리눅스 커널 API 호환

🖥️ 경량 VM 구조 (Hyper-V Integration)

  • WSL2는 Hyper-V 기반의 경량 VM을 사용
  • WSL2는 Hyper-V의 Virtual Machine Platform 기능을 활용하여 리눅스 커널을 경량 VM으로 부팅
  • 이 VM은 VirtualBox/VMware보다 훨씬 가볍고 빠르며, 부팅 시간이 매우 짧음
  • 메모리와 CPU는 동적으로 할당되며, VMBus 및 9P 프로토콜을 통해 Windows와 통신

✅ wsl2-vhdx는 내부적으로 Hyper-V가 관리하는 자동화된 headless VM입니다.
사용자가 직접 VM 설정을 건드릴 필요는 없습니다.

🧱 구성 파일 설명 (init, initrd, vmlinuz, ext4.vhdx)

  1. vmlinuz
    - 리눅스 커널 바이너리
    - Microsoft 기본 커널 또는 사용자 지정 커널
    경로 예: C:\Users\<사용자>\AppData\Local\Packages\<배포판>\LocalState\kernel
  2. init
    - 커널 부팅 이후 가장 먼저 실행되는 프로세스 (PID 1)
    - 리눅스 사용자 공간 초기화 시작
    - 기본적으로 systemd 비활성 (최근에는 지원 가능)
  3. initrd
    - 부트 초기화 RAM 디스크 (WSL2에서는 거의 사용되지 않음)
  4. ext4.vhdx
    - 리눅스 루트 파일 시스템을 담고 있는 가상 디스크 이미지
    경로 예: C:\Users\<사용자>\AppData\Local\Packages\<배포판>\LocalState\ext4.vhdx
    - 리눅스 파일은 여기에 저장, /mnt/c는 별도 마운트된 NTFS 경로

🔄 리눅스 커널의 업데이트와 로딩

  • WSL 설치 시 커널도 함께 제공되며, Windows가 주기적으로 업데이트
  • 커널 위치: C:\Windows\System32\lxss\tools\kernel
  • wsl.conf 또는 .wslconfig를 통해 사용자 지정 커널 사용 가능
[wsl2]
kernel = C:\\path\\to\\custom\\kernel

커널은 Hyper-V VM 부팅 시 자동으로 로딩되며, Windows가 부트로더 역할 수행

🧠 시스템 콜 처리 흐름 : WSL1 vs WSL2

▶️ WSL1

Linux 앱 → WSL 호환 계층(LXSS) → Windows NT 커널 API → 실행
  • 리눅스 시스템 콜을 Windows API로 번역
  • 속도는 빠르나 호환성에 제약

▶️ WSL2

Linux 앱 → 리눅스 커널(syscall) → 직접 실행 → WSL 통신 → Windows 서비스/API
  • WSL2는 실제 커널을 사용하여 완벽한 시스템 콜 지원
  • fork, ptrace, inotify 등도 지원
  • Windows와의 통신은 VMBus, 9P, WSLg, wslhost.exe 등을 통해 간접 처리

📌 요약

  • 핵심 차이: WSL1은 NT API 에뮬레이션, WSL2는 리눅스 커널 자체 실행
  • 동작 방식: WSL2는 Hyper-V 기반 경량 VM으로 부팅
  • 구성 요소: vmlinuz, init, ext4.vhdx 등 리눅스 부팅 구조 유지
  • 커널 업데이트: Windows 자동 업데이트 or 사용자 지정
  • 시스템 콜: WSL1은 변환 방식, WSL2는 리눅스 커널 직접 처리