WSL이란?

  • 운영체제(OS): 컴퓨터 하드웨어를 관리하고, 앱이 돌아갈 수 있는 환경을 제공하는 소프트웨어
    • 커널: OS의 핵심. 메모리 관리, 프로세스 관리, 하드웨어와 소통 등 가장 낮은 수준의 일을 담당
      • 메모리: 프로그램이 실행되는 동안 데이터를 담아두는 공간 (RAM)
      • 프로세스: 실행 중인 프로그램 하나하나. 커널이 이들의 생성·종료·자원 배분을 관리
    • Windows: Microsoft가 만든 OS. NT(New Technology) 커널 기반
      • NT 커널: 1993년에 DOS 기반을 대체하기 위해 처음부터 새로 설계한 커널. Windows 10, 11 전부 NT 커널 (NT 10.0)
    • Linux: Linus Torvalds가 만든 오픈소스 OS 커널
      • 엄밀히 "Linux"는 커널만 가리킴
      • 커널 + 유틸리티 + 패키지 매니저 등을 묶어 배포한 게 배포판(distro) — Ubuntu, Debian, Fedora 등
      • 서버 환경의 표준
  • Windows에서 Linux를 실행하는 호환성 레이어
  • 듀얼 부팅이나 VM 없이 Windows 안에서 Linux CLI 환경 사용 가능
    • 듀얼 부팅: 하나의 컴퓨터에 OS 두 개를 설치하고, 부팅 시 선택. 단점: OS를 바꾸려면 재부팅 필요, 동시에 두 OS를 못 씀
    • VM(Virtual Machine): 소프트웨어로 가짜 컴퓨터를 만들어 그 안에 다른 OS를 설치 (VirtualBox, VMware 등). 단점: CPU·메모리를 고정으로 미리 할당해서 무겁고, 부팅도 느림
    • WSL: 재부팅 안 해도 되고, VM처럼 무겁지도 않음. 둘의 단점을 피하면서 Linux 환경을 제공
  • 호환성 레이어: Linux 프로그램과 Windows 커널 사이에서 통역해주는 번역기
    • 시스템 콜: 프로그램이 커널한테 "이거 해줘"라고 요청하는 공식적인 방법
      • 프로그램은 하드웨어(디스크, 네트워크, 메모리 등)에 직접 접근 못함 — 보안/안정성 문제
      • 커널만 하드웨어를 조작할 수 있으므로, 프로그램은 커널한테 시스템 콜로 부탁
      • 예: 파일 열기 open(), 파일 읽기 read(), 프로세스 생성 fork(), 네트워크 전송 send()
      • 비유: 서버실 열쇠는 관리자(커널)만 보유 → 개발자(프로그램)는 요청서(시스템 콜)를 제출 → 관리자가 대신 처리
    • Windows NT 커널의 시스템 콜(NtCreateFile, NtCreateProcess 등)은 Linux 시스템 콜(open, fork, exec 등)과 이름도, 동작 방식도 다름 → 요청서 양식이 다른 것
    • 호환성 레이어가 중간에서 Linux 시스템 콜 → Windows가 이해하는 형태로 변환
    • 비유: 한국어만 하는 사람(Linux 프로그램)이 영어만 하는 사람(Windows 커널)한테 요청 → 통역사(호환성 레이어)가 번역
    • 이것이 정확히 WSL1이 한 일. WSL2는 접근 자체가 다름 (아래 참고)

WSL1 vs WSL2

  • WSL1: 번역 레이어 (Linux 시스템 콜 → Windows NT 커널 콜로 변환)
  • WSL2: 경량 VM 안에서 실제 Linux 커널 실행

왜 WSL2를 만들었나?

  • WSL1의 시스템 콜 번역 방식에 한계가 있었음:
    • Linux 시스템 콜이 수백 개인데, NT 커널에 대응이 없는 것들이 존재
    • Docker가 안 돌아감 — Docker는 Linux 커널의 cgroup, namespace 같은 기능에 의존하는데, WSL1은 이걸 번역할 수 없었음
    • 파일 시스템 I/O도 번역 오버헤드로 느렸음
  • → "번역을 아무리 잘해도 한계가 있으니, 진짜 Linux 커널을 돌리자" = WSL2

트레이드오프

WSL1 유리 WSL2 유리
Linux 호환성 일부 시스템 콜 미지원 100% 호환 (진짜 커널)
Docker 불가 네이티브 지원
Linux FS 성능 느림 빠름 (ext4 네이티브)
Windows 파일 접근 빠름 (직접 접근) 느림 (9P 프로토콜)
메모리 사용 적음 VM이라 더 사용
네트워크 Windows와 동일 IP 별도 가상 네트워크 (NAT)

지금은 다 WSL2인가?

  • WSL2가 기본값. wsl --install 하면 WSL2로 설치됨
  • Microsoft 공식 문서도 WSL2 권장
  • WSL1을 일부러 쓰는 경우는 거의 없음. 남아있는 이유:
    • Windows 파일을 매우 빈번하게 접근하는 특수한 워크플로우
    • Hyper-V를 못 쓰는 환경 (일부 구형 Windows, VPN 충돌 등)
  • 실무에서는 사실상 WSL2 = WSL이라고 봐도 됨

WSL2 아키텍처

  • 하이퍼바이저: 하드웨어 위에서 여러 VM을 동시에 돌릴 수 있게 해주는 소프트웨어
    • Hyper-V: Microsoft가 Windows에 내장한 하이퍼바이저. 별도 설치 없이 Windows 기능 켜기로 활성화
  • Hyper-V 위에 경량 유틸리티 VM 실행
  • "전통적 VM"과 다른 점:
전통적 VM (VirtualBox 등) WSL2 경량 VM
부팅 수십 초~분 ~1초
메모리 고정 할당 (4GB 잡으면 4GB 점유) 동적 할당 (쓰는 만큼만, 안 쓰면 반환)
Windows 통합 분리됨 (별도 창) 파일 시스템·네트워크·클립보드 공유
느낌 "다른 컴퓨터를 켠 것" "터미널 하나 더 연 것"
flowchart TB
    subgraph Windows["Windows OS"]
        direction TB
        WinApps["Windows 앱 / 파일 시스템"]

        subgraph HyperV["Hyper-V"]
            direction TB
            subgraph VM["경량 유틸리티 VM"]
                direction TB
                Distro["Ubuntu / Debian 등"]
                Kernel["Linux 커널 (Microsoft 빌드)"]
                Distro --> Kernel
            end
        end

        WSLg["WSLg (GUI 앱 지원)"]
    end

    WinApps <-->|"9P 프로토콜 (/mnt/c)"| VM
    WinApps <-->|"localhost 포워딩"| VM
    VM --> WSLg

파일 시스템

  • Linux FS (/home/, /etc/ 등)
    • ext4 기반, WSL2에서 네이티브 성능
      • ext4 = Linux에서 가장 널리 쓰이는 파일 시스템 형식 (Windows는 NTFS, Mac은 APFS)
      • 파일 시스템 = 디스크에 파일을 어떻게 저장하고 찾을지 정하는 규칙
      • WSL2는 진짜 Linux 커널이니까 ext4를 네이티브로 씀 → 빠름
    • 프로젝트 소스 코드는 여기에 두는 게 좋음
  • Windows FS (/mnt/c/, /mnt/d/ 등)
    • 9P 프로토콜로 Windows 파일 시스템에 접근
      • 프로토콜 = 두 시스템이 데이터를 주고받을 때 지키기로 한 약속/규칙 (예: HTTP는 웹 통신 프로토콜)
      • 9P = 원래 Plan 9이라는 OS에서 만든 파일 공유 프로토콜. "원격에 있는 파일을 마치 내 파일처럼 접근"하기 위한 규칙
      • WSL2에서의 역할: Linux VM과 Windows 파일 시스템은 서로 다른 세계 → 9P가 둘 사이의 다리 역할
      • /mnt/c에 접근할 때마다 9P를 통해 Windows한테 "이 파일 줘" 요청 → 네트워크를 경유하는 것처럼 동작하므로 느림
      • 비유: Linux FS = 내 책상 위 서류(바로 집음), /mnt/c = 옆 사무실 서류(매번 메신저로 요청)
    • 성능이 떨어짐 → 빌드/git 등은 Linux FS에서 하는 게 좋음
    • 참고: WSL1에서는 반대 — Windows FS 위에서 직접 동작해서 /mnt/c는 빨랐지만, Linux FS 에뮬레이션이 느렸음
  • Windows에서 Linux 파일 접근
    • \\wsl$\Ubuntu\home\... 경로로 탐색기에서 접근 가능
    • 또는 explorer.exe . 명령으로 현재 디렉토리 열기

네트워킹

  • NAT 기반 네트워크
    • WSL2는 VM이니까 Windows와 별도의 네트워크를 가짐 (IP가 다름)
    • Windows가 공유기 역할을 해서 WSL2의 트래픽을 외부로 중계 = NAT
    • 자세한 NAT 개념은 → NAT (네트워크 주소 변환)
  • localhost 포워딩
    • 원래 IP가 다르면 WSL에서 띄운 서버에 localhost로 접근 못 함
    • Microsoft가 편의 기능을 넣어서, WSL2 안에서 열린 포트를 Windows의 localhost로 자동 연결해줌
    • 그래서 별도 설정 없이 바로 브라우저에서 확인 가능
    • 예: WSL에서 php -S 0.0.0.0:8080 → Windows 브라우저에서 localhost:8080
  • Windows hosts 파일로 커스텀 도메인 매핑
    • hosts 파일에서 도메인을 127.0.0.1로 매핑 → localhost 포워딩을 통해 WSL 서버로 연결
    • 예: 127.0.0.1 myapp.local → WSL의 웹 서버로 연결
flowchart TB
    subgraph Windows["Windows"]
        direction TB
        Browser["브라우저"]
        Hosts["hosts 파일<br/>127.0.0.1 myapp.local"]
        LF["localhost 포워딩<br/>(자동)"]
    end

    subgraph WSL2["WSL2 (별도 IP)"]
        Server["웹 서버<br/>0.0.0.0:8080"]
    end

    Browser -->|"myapp.local:8080"| Hosts
    Hosts -->|"127.0.0.1 = localhost"| LF
    LF -->|"NAT를 통해 WSL2로 전달"| Server
    Server -->|"응답"| Browser

주요 명령어

  • wsl --list --verbose — 설치된 배포판 목록 + 버전 확인
  • wsl --set-version <distro> 2 — WSL1 → WSL2 전환
  • wsl --shutdown — WSL 완전 종료 (메모리 반환)
  • wsl --update — Linux 커널 업데이트
  • wsl -d <distro> — 특정 배포판으로 진입

관련 글