클라우드 서버와 홈랩은 Rocky Linux를 기준으로 맞춰 두고 있습니다. 다만 일상적인 개발은 Windows PC에서 이뤄집니다. 로컬은 Windows, 서버는 RHEL 계열인 상태에서 패키지와 경로, systemd 감각이 어긋나면, 코드가 아니라 환경 때문에 막히는 일이 생깁니다.
가상 머신을 하나 더 띄우거나 듀얼 부트를 구성하는 방법도 있습니다. 다만 이 글에서 고르는 쪽은 WSL(Windows Subsystem for Linux) 입니다. Windows 위에서 리눅스 배포판을 실행하는 계층을 켜 두고, 그 안에 서버와 같은 Rocky Linux를 올리는 흐름입니다.
이번 글에서는 Windows에 WSL을 켜고, 기본값 Ubuntu 대신 Rocky Linux를 올린 뒤, 서버와 같은 계열의 로컬 환경을 만드는 데까지를 다룹니다. 배포판을 받기 전에, 왜 Ubuntu가 아니라 Rocky인지를 먼저 맞춰 두고 가겠습니다.
1. WSL을 먼저 켜야 하는 이유
WSL은 배포판이 아닙니다. Ubuntu나 Rocky를 설치하기 전에, Windows가 리눅스 환경을 호스트할 수 있게 하는 선택적 기능을 켜야 합니다. 배포판은 그 위에 올라가는 게스트에 가깝습니다.
기능을 켜지 않은 채 Microsoft Store에서 배포판만 받아도, 실행 시 WSL이 없다는 오류로 끝나는 경우가 있습니다. 순서를 기능 활성화 → 기본 버전 지정 → 배포판 설치로 두는 이유입니다.
1.1. WSL 1과 WSL 2
WSL에는 두 버전이 있습니다.
WSL 1은 Windows 커널 위에서 리눅스 시스템 콜을 번역합니다. 별도의 리눅스 커널이 없고, 파일 시스템 접근은 가벼운 편입니다. 다만 커널 호환이 필요한 도구, 예를 들어 Docker 엔진이나 일부 네트워크 스택은 여기서 막히는 경우가 있습니다.
WSL 2는 가벼운 가상 머신 안에 실제 리눅스 커널을 올립니다. Windows의 Virtual Machine Platform 기능을 사용하며, 호환성은 WSL 1보다 리눅스에 가깝습니다. 이 글과 이후 Rocky Linux 설치는 WSL 2를 기준으로 합니다.
도커 글에서 Windows 커널 위에 리눅스 이미지를 돌리려면 WSL 2 같은 계층이 필요하다고 짚었던 것과 같은 이유입니다. 컨테이너 엔진도, Rocky의 dnf와 systemd 감각을 로컬에서 맞추는 일도, 실제 커널이 있는 쪽이 전제가 됩니다.
1.2. wsl --install만 치면 Ubuntu가 따라온다
Microsoft 문서의 기본 설치 명령은 한 줄입니다.
이 명령은 WSL 기능을 켜는 동시에 기본 배포판인 Ubuntu까지 설치합니다. 이 글의 목표는 Rocky Linux이므로, 배포판은 아직 받지 않습니다. 기능만 켜는 쪽이 맞습니다.
2. WSL 기능 활성화
2.1. 준비
관리자 권한 PowerShell을 엽니다. 시작 메뉴에서 PowerShell을 검색한 뒤, 우클릭 → 관리자 권한으로 실행입니다.
CPU 가상화(Intel VT-x / AMD-V)가 BIOS/UEFI에서 켜져 있어야 WSL 2가 동작합니다. 노트북은 제조사마다 메뉴 이름이 다릅니다. 가상화 기술, SVM Mode, Intel Virtualization Technology 같은 항목을 Enabled로 둡니다.
winver로 Windows 빌드를 확인하고 BIOS를 봅니다.2.2. 배포판 없이 설치하기
최근 Windows에서는 배포판을 빼고 WSL만 설치할 수 있습니다.
이 명령은 WSL 구성 요소와 Virtual Machine Platform을 켜고, Ubuntu는 받지 않습니다. 끝나면 재시작이 필요합니다. /norestart로 미뤄 둔 기능 적용이 재부팅 때 끝납니다.
--no-distribution을 인식하지 못하면, 사용 중인 Windows/WSL이 이 옵션을 아직 지원하지 않는 경우입니다. 그때는 아래 수동 활성화로 같은 기능을 켭니다.
2.3. 수동으로 기능 켜기
wsl --install이 없던 시절의 절차이기도 하고, 위에서 옵션이 없을 때의 우회이기도 합니다. 하는 일은 같습니다. Windows 선택적 기능 두 개를 켭니다.
첫 줄은 WSL 자체이고, 둘째 줄은 WSL 2가 쓰는 가상 머신 플랫폼입니다. WSL 1만 쓸 계획이면 둘째 줄은 생략할 수 있습니다. 이 글은 WSL 2가 목표이므로 둘 다 켭니다.
두 명령을 실행한 뒤 재시작합니다. norestart는 지금 당장 재부팅하지 않겠다는 뜻이지, 재시작이 필요 없다는 뜻이 아닙니다.
재시작 후, 새로 설치할 배포판의 기본 버전을 2로 고정합니다.
배포판이 아직 없어도 이 설정은 유효합니다. 다음에 Rocky를 받을 때 WSL 1로 올라가는 일을 막아 둡니다.
2.4. 켜졌는지 확인하기
재시작 후 일반 PowerShell에서도 확인합니다. 관리자 권한이 필수는 아닙니다.
wsl --status에서 기본 버전이 2로 보이면 활성화는 끝난 상태입니다. wsl --version은 WSL 패키지와 커널 버전을 보여 줍니다. Store 패키지 형태의 WSL이면 여기서 버전이 찍힙니다.
배포판이 없으므로 wsl -l -v는 비어 있거나, 설치된 배포판이 없다는 메시지가 나오는 것이 정상입니다. 셸이 리눅스로 바뀌지 않았다고 실패한 것이 아닙니다. 아직 게스트를 올리지 않았을 뿐입니다.
wsl --install을 다시 쳤을 때 도움말이 출력되는 것도, 이미 WSL이 설치되어 있다는 신호입니다. 그때는 기능을 한 번 더 설치하는 것이 아니라, 배포판만 받으면 됩니다.
3. 배포판은 Ubuntu가 아니라 Rocky
WSL의 기본 배포판은 Ubuntu입니다. 설치 가이드와 검색되는 예제도 Ubuntu, apt, AppArmor를 전제로 하는 경우가 많습니다. 다만 제가 맞춰 둔 서버와 홈랩은 Rocky Linux입니다. 로컬만 Ubuntu면 패키지 관리자가 apt와 dnf로 갈리고, 방화벽은 ufw와 firewalld로, 보안 모듈은 AppArmor와 SELinux로 갈립니다. WSL을 켜는 이유가 Windows에 아무 리눅스나 올리는 것이 아니라, 서버와 같은 계열을 로컬에 두는 것이라면 기본값 Ubuntu를 그대로 받을 이유는 없습니다.
해외 튜토리얼과 클라우드 이미지는 Ubuntu가 기본값인 경우가 많습니다. 한국 쪽은 결이 다릅니다. 대기업, 금융, 공공·SI 현장에서 오래 쓰인 서버 OS는 RHEL과 그 호환 배포판이고, 예전의 CentOS가 그 자리를 메웠습니다. CentOS Linux가 종료된 뒤에는 Rocky Linux와 AlmaLinux가 그 빈자리를 이어 받았습니다. Rocky는 RHEL과 버그 수준까지 맞추는 것을 목표로 하는 재빌드이고, 구독 없이도 RHEL 계열의 dnf, SELinux, 패키지 수명 주기를 그대로 익힐 수 있습니다. 국내에서 마주칠 서버가 RHEL 계열인 경우가 많은 만큼, 로컬 WSL도 그 계열인 Rocky를 쓰는 쪽입니다.
Microsoft Store에는 Rocky가 없습니다. 공식 문서의 권장 경로는 .wsl 이미지를 받아 --from-file로 올리는 것입니다.
3.1. .wsl 이미지로 설치하기
문서의 Installable WSL images 절차를 따릅니다. 이 PC는 x86_64이므로 x86_64 WSL 이미지를 받습니다. ARM Windows가 아니면 aarch64를 고르지 않습니다.
파일명은 Rocky-10-WSL-Base.latest.x86_64.wsl입니다. CDN 디렉터리는 dl.rockylinux.org의 10/images/x86_64입니다. .latest는 그 시점의 최신 빌드를 가리키므로, 받는 날짜에 따라 안쪽 버전 숫자는 달라질 수 있습니다.
다운로드가 끝나면 탐색기에서 다운로드 폴더의 .wsl 파일을 우클릭하고 경로로 복사를 고릅니다. 따옴표가 포함된 전체 경로가 클립보드에 들어갑니다. 또는 Ctrl+Shift+C 단축키로 복사할 수 있습니다.
PowerShell에 붙여 넣어 설치합니다. 우클릭 또는 Shift+Insert로 붙여넣을 수 있습니다.
--from-file을 모른다고 하면 WSL이 오래된 상태입니다. wsl --update 후 다시 시도해보시길 바랍니다.
설치가 끝나면 배포판 목록에 rocky가 보입니다.
이 배포판을 기본값으로 두려면 wsl --set-default rocky를 실행합니다. 이후 PowerShell에서 wsl만 쳐도 rocky로 들어갑니다.
3.2. UNIX 사용자와 비밀번호
처음 실행하면 리눅스 쪽 사용자 이름과 비밀번호를 묻습니다. Windows 계정이 아니라, 이 배포판 안의 UNIX 계정입니다. sudo에 쓰는 비밀번호도 이 값입니다.
사용자 이름을 입력한 뒤 비밀번호를 두 번 넣습니다. 입력하는 동안 화면에 글자가 전혀 나오지 않는 것이 정상입니다. SSH 키 암호를 넣을 때와 같습니다. 커서가 멈춘 것처럼 보여도 키는 들어가고 있으니, 입력을 마치고 Enter를 누르면 됩니다.
프롬프트가 username@호스트 형태로 바뀌면 계정 생성은 끝난 상태입니다.
3.3. 기본 패키지
서버를 처음 올릴 때와 같이, 패키지를 최신으로 맞추고 자주 쓰는 도구를 넣습니다. 일반 계정에서 root 셸로 올라간 뒤 진행합니다.
util-linux-user는 chsh가 들어 있는 패키지입니다. 기본 셸을 바꿀 때 필요합니다.
Oh My Zsh를 쓸 계획이면 같은 줄에 zsh를 같이 넣습니다. 지금 zsh를 쓰지 않으면 생략해도 됩니다.
업데이트가 끝나면 WSL을 한 번 재시작합니다. 커널·glibc 계열 패키지가 바뀐 뒤에도 기존 세션이 살아 있으면, 새 바이너리와 어긋날 수 있습니다. PowerShell에서 배포판을 내린 뒤 다시 올립니다.
wsl --shutdown은 실행 중인 WSL 인스턴스를 모두 종료합니다. 다시 wsl -d rocky로 들어갔을 때 셸이 열리면, 이 PC에는 서버와 같은 계열의 Rocky가 로컬에 있는 상태입니다.
4. 정리
서두에서 말한 문제는 로컬이 Windows이고 서버가 RHEL 계열일 때, 패키지와 경로가 갈려 코드가 아니라 환경에서 막히는 일이었습니다. 가상 머신이나 듀얼 부트 대신 WSL 2를 켜고, 그 위에 Store 기본값인 Ubuntu가 아니라 Rocky를 올렸습니다. 기능 활성화와 배포판 설치를 나눈 이유는, wsl --install 한 줄이 Ubuntu까지 같이 받기 때문입니다.
지금 상태는 wsl -d rocky로 들어가 dnf를 칠 수 있는 출발점입니다. 클라우드·홈랩의 Rocky와 패키지 관리자, 방화벽, SELinux 감각을 로컬에서 같게 두는 것이 이 글의 목표였습니다. Oh My Zsh나 개발 도구는 이 배포판 위에서 이어서 맞추면 됩니다.
설정과 명령은 문서에도 있습니다. 다만 WSL은 배포판이 아니라 Windows 기능이고, 한국에서 마주칠 서버가 RHEL 계열인 경우가 많아 기본값 Ubuntu를 그대로 받지 않았다는 점만 기억해 두면, 다음에 같은 선택을 할 때 헤매는 시간이 줄어듭니다.