qt.qpa.xcb: could not connect to display 에러
발생 시점
라즈베리파이 IP를 변경하고 원격 실행을 했을 때 아래와 같은 에러가 발생했다.
에러 문구
10:43:58: Starting /usr/local/bin/appPLC_Touch on RPI...
qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: vnc, offscreen, xcb, linuxfb, minimal, minimalegl, eglfs.
10:43:58: The process crashed.
Qt 애플리케이션이 xcb 플랫폼 플러그인을 사용하여 디스플레이 서버에 연결하려고 시도했지만 실패했다는 것을 의미한다. 특히 DISPLAY 환경 변수가 제대로 설정되지 않았거나 변경된 IP 주소로 인해 디스플레이 서버에 접근할 수 없을 때 발생할 수 있다.
원인 분석
1. DISPLAY 환경 변수 문제
원격 실행 시 DISPLAY 환경 변수는 애플리케이션이 어느 디스플레이 서버에 연결할지를 지정한다. 일반적으로 SSH를 통해 X11 포워딩을 사용하는 경우 DISPLAY는 자동으로 설정된다.
하지만 IP 주소가 변경되면 기존의 DISPLAY 설정이 유효하지 않게 되어 Qt 애플리케이션이 올바른 디스플레이 서버를 찾지 못하게 된다.
2. X11 포워딩 설정 문제
SSH를 통한 X11 포워딩이 제대로 설정되지 않거나 IP 변경으로 인해 SSH 연결이 재설정되지 않은 경우 디스플레이 서버에 접근할 수 없다.
해결 방법
1. DISPLAY 환경 변수 확인 및 재설정
라즈베리파이에서 터미널을 열고 현재 DISPLAY 변수가 어떻게 설정되어 있는지 확인한다.
echo $DISPLAY
출력 결과
:0
정상적으로 설정되어있는 것을 확인하였다.
2. SSH X11 포워딩 재설정
라즈베리파이에서 SSH 설정 파일 확인
sudo nano /etc/ssh/sshd_config
X11 포워딩 활성화 확인
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
- X11Forwarding yes: X11 포워딩 활성화
- X11DisplayOffset 10: 디스플레이 번호 오프셋 설정. 기본값 10
- X11UseLocalhost yes: 보안 강화를 위해 로컬호스트만 사용하도록 설정
변경 사항 저장 후 SSH 서비스 재시작
sudo systemctl restart ssh
우분투에서 X11 포워딩 활성화 확인
ssh -X pi@192.168.0.155
아래와 같은 경고가 나왔다.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256: ~~~~
Please contact your system administrator.
Add correct host key in /home/son/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/son/.ssh/known_hosts:5
remove with:
ssh-keygen -f "/home/son/.ssh/known_hosts" -R "192.168.0.155"
Host key for 192.168.0.155 has changed and you have requested strict checking.
Host key verification failed.
이 메시지는 192.168.0.155 IP 주소에 연결하려고 할 때 해당 IP에 저장된 호스트 키가 이전에 저장된 키와 다르다는 것을 의미한다.
주로 아래와 같을 때 발생한다.
- IP 주소 변경: 라즈베리파이의 IP가 변경되었을 때, 새로운 IP에 대해 SSH는 새로운 호스트 키를 기대하게 된다.
- 새로운 장치: 동일한 IP에 다른 장치가 할당되었을 때
- 보안 위협: 누군가가 중간자 공격(MITM)을 시도할 때
=> 공유기 설정에 접속해 IP 주소가 맞게 변경되었음을 확인하였다.
=> 그리고 기존 호스트 키를 제거하여야 한다.
known_hosts 파일에서 기존 호스트 키 제거
known_hosts 파일에서 이전 호스트 키를 제거하고 새로운 호스트 키를 저장할 수 있다.
우분투 터미널에 아래 명령어를 입력하여 known_hosts 파일에서 192.168.0.155와 관련된 기존 호스트 키를 제거한다.
ssh-keygen -f "/home/son/.ssh/known_hosts" -R "192.168.0.155"
SSH를 통해 다시 접속 시도
ssh -X pi@192.168.0.155
아래의 문구가 나왔다.
The authenticity of host '192.168.0.155 (192.168.0.155)' can't be established.
ED25519 key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes를 입력하여 새로운 호스트 키를 known_hosts 파일에 저장하였다.
그 후 성공적으로 SSH접속을 하였고 Qt Creator에서 에러 없이 원격 실행이 잘 동작했다.
느낀 점
- X11 포워딩은 SSH를 통해 원격 서버의 그래픽 애플리케이션을 로컬 머신에서 실행할 수 있게 해 주므로 IP 주소가 바뀌게 되면 SSH 연결을 재설정해야 한다는 것을 알게 되었다.