WSL 자체는 윈도우에서 리눅스의 유틸리티와 같은 바이너리를 실행할 수 있다는 데 큰 의의가 있습니다. 일반적으로 CLI 바이너리로도 가치가 충분합니다 (리눅스는 기본적으로 CLI기도 하고요).
하지만 심심하던 차에 CLI가 돌아가니 당연히 GUI도 돌릴 수 있을 거라 생각해서 여러 삽질을 좀 해 봤습니다. 아래는 해당 과정입니다.
WSL은 이미 설치가 되어 있는 상태라 가정하며, WSL 1 리눅스 설치 자체에 관한 글은 [윈도우 10에 우분투 설치, 제거 및 업그레이드] 글을 먼저 참고하시기 바랍니다.
+ 기존 글은 WSL 1 기준이었는데, 후에 나온 WSL 2의 경우 기존의 WSL 와는 VcXsrv 설정 과정 등에서 소폭 차이가 있어 다른 부분을 새로 반영하였습니다. WSL 2도 아래 과정을 따르되, 도중에 ‘WSL 2’가 별도로 언급되어 있는 경우 해당 지시를 따라주시기 바랍니다.
(WSL 2 설정 정보 관련 갱신은 외부 블로그 글을 참고하였습니다)
[Windows 용 X Server 설치]
우선 그래픽 화면을 띄우려면 X Server같은 역할을 해 줄 뭔가가 필요합니다. 윈도우 내에서는 기본적으로 윈도우가 그래픽을 띄워주므로 윈도우 내에서 돌아갈 X Server가 필요한데, 대표적으로 VcXsrv 가 그 역할을 해줄 수 있습니다.
[VcXsrv 다운로드 페이지] 에서 받아서 설치해줍니다.
Display number 는 -1로 둬도 상관 없으나, 0으로 명확히 정의
위 화면에서 WSL 1 은 그대로 진행.
WSL 2 는 ‘Native opengl’ 을 체크 해제한 후,
‘Additional parameters’ 부분에 -ac 입력
Save configuration 을 클릭하여 지금까지 설정 실행파일을 저장
이 위에서 그냥 완료를 눌러버리면 시작할 때마다 이 설정을 반복해줘야 합니다.
‘Save configuration’ 을 클릭하면 별도의 파일이 저장되는데, 이 파일을 실행하면 조용히 지금까지의 설정 그대로 백그라운드에 실행됩니다.
그리고 이 Save configuration 으로 저장된 .config 파일을 부팅 때마다 실행되도록 시작프로그램 폴더 안에 넣어주시면 됩니다.
시작프로그램 폴더는 윈도우키 + R 을 눌러서 나오는 ‘실행’ 창에
shell:startup
을 입력하고 엔터를 치면 바로 나옵니다.
[환경 설정]
설치하고 바로 GUI 유틸리티를 실행할 수 있는 상태가 되었지만, WSL 내 리눅스 쪽에서는 이 윈도우용 X Server가 설치되었는지를 모르기 때문에 설정을 해 줘야 합니다. 크게 별다를 건 없고 간단한데,
쉘 설정 파일 (.bashrc, .profile 등)을 열어서 GUI에 어떤 DISPLAY 를 사용할 것인지 명시해줍니다. 아까 설치 시 입력했던 0번 디스플레이를 이용하기 위해, 위 스샷과 같이 (WSL 1 / 2 에 맞게) 아래 중 하나를 설정 파일에 추가합니다.
[WSL 1 의 경우]
# For WSL 1 only (Using localhost) export DISPLAY=:0.0
[WSL 2의 경우]
다음 버전은 /etc/resolv.conf 의 IP 를 사용하는 식으로 동작합니다:
# For WSL 2 only (Using IP from resolv.conf (vEthernet)) VETHER_IP=$(/bin/grep nameserver /etc/resolv.conf 2> /dev/null | /bin/tr -s ' ' | /bin/cut -d' ' -f2) export DISPLAY=$VETHER_IP:0.0
다음 버전은 route 의 default gateway 를 사용하여 동작합니다. /etc/resolv.conf 를 사용할 수 없는 경우 (Custom nameserver 설정 등) 아래 버전이 필요합니다.
# For WSL 2 only (Using IP from route (vEthernet)) VETHER_IP=$(/sbin/route -n | /bin/grep "^0.0.0.0" | /bin/tr -s ' ' | /bin/cut -d' ' -f2) export DISPLAY=$VETHER_IP:0.0
환경 설정 후, 터미널에 emacs를 실행하면 뜨는 GUI창
추가한 뒤 wsl을 다시 실행하면 위 환경 설정값이 적용되어, GUI 유틸리티를 실행시킬 수 있는 상태가 됩니다.
그리고 GUI를 지원하는 유틸리티들을 설치해서 실행하면 모든 게 완벽하게 다 잘 돌아갑니다!
…라면 좋겠지만, 아무래도 100% 잘 되지는 않을 수도 있습니다 (WSL 1 기준).
[트러블슈팅]
그렇게 실행해보면서 잘 실행되는 것들도 있었지만 문제가 발생하는 것들도 좀 있었는데, 이는 다음과 같이 해결했습니다. (이하는 WSL 1 기준으로, WSL 2 에서는 다를 수 있습니다)
1. 흐릿한 GUI 창
막상 창을 띄워보니 약간 GUI가 흐릿흐릿합니다 (바로 위에 있는 emacs GUI 창 스샷). 이건 디스플레이 scaling이 잘 안 된 경우인데, 흐릿한 GUI를 선명하게 보이게 하기 위해서는 추가 설정이 필요합니다.
흐릿하고 아니고는 컴퓨터 설정따라 다를 수 있으니 (기본적으로 scaling이 적용된 환경에서 나타나는 증상), 이 해결책은 각자의 판단 하에 적용하시기 바랍니다.
우선 VcXsrv를 설치한 폴더로 들어가서, 그 안에 있는 vcxsrv.exe 와 XLaunch.exe 두 파일에 대해 아래와 같이 설정을 변경합니다.
‘파일 우클릭 – 속성 – 호환성 – 고 DPI 설정 변경 – 고 DPI 스케일링 덮어쓰기’ 박스 안에 있는 체크박스에 체크한 후, 그 아래 드롭다운 선택 메뉴가 프로그램/애플리케이션으로 되어 있는지 확인합니다.
그리고 아까 그 환경 설정 파일로 돌아가서, 아래와 같은 줄을 하나 더 추가합니다.
export GDK_SCALE=(배율)
배율에 숫자를 넣으시면 됩니다. 1이 기본 scaling 배율 (100%)이고, 2면 두 배 (200%)가 되죠. 다만 1, 2, 3의 배수 scaling factor가 아닌 (1.5, 1.25 등의) fractional scaling factor은 현 시점에선 아직 적용이 안 되는 듯합니다.
변수를 설정한 다음 wsl를 다시 시작하고, VcXsrv도 다시 시작한 후 실행시켜보면 깔끔하게 잘 나옵니다. (스샷을 미리보기 상태로 보면 차이가 잘 안 보이는데, 클릭해서 원본으로 보면 크게 차이가 나는 것을 알 수 있습니다)
2. libGL error: No matching fbConfigs or visuals found, failed to load driver: swrast 에러
먼저 VcXsrv 가 실행된 후 처음 GUI 창을 띄울 때 이런 에러가 나타나는 증상이 있었습니다. 두 번째부터는 VcXsrv를 다시 종료 후 실행시키기 전까지는 안 나타나더군요.
일단 제 경우 실행했던 유틸리티가 실행되지 않았던 것은 아니었지만, 에러가 계속 뜨는 건 찝찝한 면이 있기에 해결책을 찾아봤습니다.
해결 화면 (emacs 실행 전에 VcXsrv는 재실행)
에러 메세지를 없애는 해결책으로는 /usr/lib/x86_64-linux-gnu 디렉터리 안에 있는 mesa 관련 파일들을 모두 삭제하는 것이었습니다. 다만 단순히 라이브러리 파일을 삭제하는 것인 만큼 모종의 부작용이 생길 가능성이 있다는 점은 염두에 두시기 바랍니다.
전 단순 삭제도 좋지만 만에 하나의 경우를 대비해 아래와 같이 백업을 했습니다.
sudo mv /usr/lib/x86_64-linux-gnu/*mesa* ./tmp
3. 파이어폭스 crash / 종료
테스트 삼아 설치 후 파이어폭스를 실행시켜 봤는데, 이게 실행되고 계속 프로그램 자체가 crash 되면서 종료되는 증상이 있었습니다. 지금 생각해보면 다른 프로그램 실행 시에도 나타날 수 있었겠네요.
아무튼 이 문제의 해결은 dbus-x11 패키지를 설치하는 것으로 해결했습니다.
sudo apt install dbus-x11
4. 기타 미해결
문제가 모두 해결된 상태는 아닙니다. 우선 dbus 소켓 관련 문제로 파이어폭스의 인터넷 연결 자체가 안 됩니다(…)
또한 실행 즉시 crash와 함께 종료되는 프로그램도 한둘 보였으며, 전반적으로 GUI 성능이 약간 굼뜬 편에 속했습니다 (반응이 못 써먹을 정도로 엄청 느린 편은 아니지만, 초당 프레임이 네이티브에 비해 약간 낮은 듯한 느낌).
또 윈도우에서 바로가기를 마우스 클릭으로 실행시키면 바로 WSL 내의 GUI 창이 뜰 수 있도록 이리저리 해 보고 있는데, 결론적으로 가능은 한 것으로 보이나 경로 처리 등 신경쓸 게 좀 있어서 아직 진행 중입니다.
(cmd 등에서 WSL로 안 들어가고 명령어로 직접 실행시키는 CLI 방식은 이미 몇 년 전부터 써오고 있었기에 시간 단축에 꽤 도움이 됐군요)
[여러 GUI 실행 결과]
파이어폭스 (왼쪽이 Ubuntu, 오른쪽이 Windows 프로그램)
다만 파이어폭스는 위 트러블슈팅 부분에 있듯 실제 인터넷 연결은 안 됩니다.
반투명한 본래 터미널 뒤로 흰 바탕의 gnome terminal 이 흐릿하게 보입니다.
nautilus 로 본, 조금 전 백업했던 mesa 관련 디렉터리
우분투 기본 파일 탐색기인 nautilus는 첫 실행 시 한참 반응이 없다가 오류를 막 띄우면서 실행이 되긴 하던데, 실행된 후부터는 딱히 별 문제는 없어 보였습니다.
우분투 버전 엑셀입니다.
[마치며]
생각보다 많은 유틸리티들이 실행이 됩니다. 물론 위 트러블슈팅처럼 안심하고 쓰기에는(..) 아직 갈 길이 멀긴 하지만 아무튼 이 정도 실행이라면 원하는 유틸리티 한 두개 정도는 실사용이 가능하지 않을까 싶네요.
좋은글 감사합니다. 이 글을 보고 저 또한 시도를 해 보았는데 gnome을 설치하고 나니 firefox가 정상적으로 인터넷 연결이 되었습니다. 폰트가 깨지긴 하는데 이건 폰트를 깔면 해결되겠죠
호오… 좋은 정보 감사합니다. 말씀주신 부분도 시간 날 때 시도해 봐야겠네요.
안녕하세요 글 잙읽었습니다.
혹시 파이어폭스 인터넷 연결 문제 해결하셨는지 궁금합니다 ㅎㅎ
당시에 좀 시도해 보다가 그냥 윈도우 파폭 계속 쓰고 있습니다(…) 윈도우 파폭은 100% 네이티브다 보니 아무래도 반응성 등에서 좁히기 힘든 격차가…
다만 현재 Windows Insider Slow Ring에서 베타 중인 wsl 2가 나오면 뭔가 변화가 있지 않을까 합니다. 지금 당장은 베타인 만큼 특히 네트워크 관련해서 몇몇 문제가 있는 모양이지만요.
안녕하세요.
리눅스, 윈도우 용 매트랩을 구동하기위해 WSL2 를 알아보던 중,
선생님의 글을 확인하게 되었습니다.
선생님의 .bashrc 설정법 덕분에 노트북을 재부팅해도 VETHER가 자동으로 갱신되어 GUI 환경을 마음껏 누릴 수 있게 되었습니다.
정말 감사합니다.
김규엽 드림
댓글 알림이 안 와서 확인이 조금 늦었지만… 도움이 되셨다니 다행입니다 😀