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> — 특정 배포판으로 진입
관련 글