이제 막 개발환경 구성을 마친 WSL 2에 설치된 리눅스에서 QEMU를 실행하면 아래와 같은 오류 메시지가 출력되고 QEMU가 실행되지도 않을 것입니다. 이 글에서는 이 문제의 원인을 알아보고 어떻게 해결할 수 있는지 설명합니다.
Unable to init server: Could not connect: Connection refused
...(생략)...
왜 이런 오류가 발생할까?
이런 오류는 WSL 2에서 GUI 프로그램을 실행 할 때 나타날 수 있습니다. WSL 2는 GUI를 기본으로 지원하지 않습니다. 따라서 GUI 프로그램을 실행할 수 있도록 무언가 작업이 이뤄져야 하지요. QEMU도 역시 GUI 방식으로 실행되는 프로그램입니다. WSL 2에서 GUI 프로그램을 실행하려면 '디스플레이 서버'라는 별도의 도구가 필요합니다. 자료 검색을 해보면 몇 가지 디스플레이 서버가 있지만 제가 선택한 것은 "VcXsrv Windows X Server"(이하 VcXsrv)입니다.
VcXsrv 설치하고 실행하기
여기를 클릭해서 VcXsrv를 다운로드 한 뒤 설치합니다. 설치는 어렵지 않고 시간도 얼마 걸리지 않습니다. 설치를 완료하였다면 VcXsrv를 실행하는데, 이때 실행 파일명은 'XLaunch' 입니다.
실행하면 디스플레이 설정부터 하게 됩니다. 창을 어떤 방식으로 열리게 할 것인지 선택할 수 있네요. 저는 기본값(Multiple windows)을 사용하겠습니다.
디스플레이 서버를 실행할 때 클라이언트 프로그램도 함께 실행할지를 설정할 수 있습니다. 역시 기본값(Start no client)으로 설정하고 지나가겠습니다.
추가 설정 창에서는 한 가지를 변경해야 합니다. 3개의 체크 박스 중 마지막에 있는 'Disable access control'을 반드시 체크해야 합니다. 인터넷을 찾아보면 맨 아래 입력 칸에 '-ac' 옵션을 추가하는 방법으로 설명하는 글도 찾아볼 수 있습니다. 이 둘은 같은 결과를 내기 때문에 원하는 방식을 사용하면 되겠습니다. '-ac' 옵션에 대한 자세한 설명을 원한다면 Xserver man page를 참고하세요.
모든 설정을 마쳤습니다. '마침' 버튼을 클릭하면 디스플레이 서버가 실행됩니다. 화면에는 아무것도 나타나지 않아 당황하실 수도 있는데, 제대로 실행되었는지는 작업표시줄의 '숨겨진 아이콘 표시'를 클릭해보시면 실행 여부를 확인할 수 있습니다.
이것으로 끝난게 아니다. - 디스플레이 서버와 통신 설정 하기
VcXsrv를 설치했다면 디스플레이 서버는 준비가 되었지만, 아직 클라이언트 측에서는 서버와 통신하기 위한 준비가 되지 않았습니다. 해야 할 일은 아래와 같습니다.
1. WSL 2에 설치된 리눅스의 DNS 서버 주소를 알아내기
아래의 명령으로 현재 리눅스의 DNS 서버 IP 주소를 확인합니다.
$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.29.207.1
출력된 결과에서 필요한 값은 nameserver 다음의 '172.29.207.1' 값입니다. 물론 이 DNS 주소는 사용하는 PC마다 다를 수 있습니다.
2. 디스플레이 환경 변수 설정하기
~/.bashrc
파일에 DISPLAY 환경변수 값을 추가합니다. IP 주소를 입력한 뒤 끝에 ':0'을 붙여서 입력합니다.
export DISPLAY=172.29.207.1:0
만약 bash 이외의 shell을 사용하고 있다면 그 환경에 맞는 설정 파일을 수정해야 합니다. 저의 경우 zsh를 사용하고 있어 환경변수 값을
~/.zshrc
파일에 추가하였습니다.
3. 환경변수 값 적용하기
방금 저장한 환경변수 값을 시스템에 적용해야 합니다. 방법은 두 가지입니다. 첫 번째는 사용하고 있는 셸을 완전히 닫았다 다시 여는 방법입니다. 두 번째는 아래의 명령을 실행합니다. 이 명령으로 셸의 환경변수를 즉시 적용할 수 있습니다.
$ source ~/.bashrc
위에서 이야기한 것처럼 저는 zsh를 사용하고 있어 실제로는
.zshrc
라고 입력했습니다.
이제 QEMU를 실행해보자
모든 설정을 마치고 VcXsrv도 실행되어 있다면 QEMU를 실행해봅니다. 개발환경에 따라 입력되는 값이 다르지만, 저의 경우 아래와 같이 입력하고 결과가 출력되었습니다. ALSA는 리눅스 시스템에서 사운드와 관련한 것입니다. 당장은 필요 없어서 무시해도 되지만 에러 메시지의 양이 꽤 되기 때문에 혹시 뭔가 잘못된 게 아닐까 하고 걱정되실 수도 있을 것 같아요. 그러나 큰 문제는 없으니 지금은 무시하도록 하겠습니다.
$ qemu-system-arm -M realview-pb-a8 -kernel build/moduOS.axf -S -gdb tcp::1234,ipv4
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
... (생략)...
alsa: Reason: No such file or directory
audio: Failed to create voice `lm4549.out'
실행 결과 QEMU 아래와 같은 창이 열리면 문제없이 동작한 것입니다.
'연구 노트 > Embedded' 카테고리의 다른 글
ABI, EABI 그 의미를 이해하고 툴 체인 이름까지 해석하기 (0) | 2021.01.29 |
---|---|
QEMU 사용시 쉘 종류에 따라서 옵션 값이 달라지는 문제 (0) | 2021.01.20 |
Windows 10에서 RTOS 개발환경 구축하기 2 - 개발 도구 설치하기 (1) | 2021.01.17 |
Windows 10에서 RTOS 개발환경 구축하기 1 - WSL 2를 활성화하자 (0) | 2021.01.12 |
어셈블리 파일 확장자 .s와 .S는 다르다. (2) | 2020.12.25 |