본문 바로가기
기술 단어장/Network

[X Server] NoSuchDisplayException 해결을 위한 X Server 설정

by MFDO 2025. 1. 17.

 

오늘도 평화롭게 환경 설정을 마치고 코드를 돌리니,

기대도 하지 않았지만 오류가 발생하였다. 

pyglet.display.xlib.NoSuchDisplayException: Cannot connect to "None"
# python main.py
creating the FLAME Decoder
torch.Size([8, 5023, 3]) torch.Size([8, 68, 3])
Traceback (most recent call last):
  File "main.py", line 89, in <module>
    pyrender.Viewer(scene, use_raymond_lighting=True)
  File "/home/azureuser/anaconda3/envs/FLAME_PyTorch/lib/python3.8/site-packages/pyrender-0.1.39-py3.8.egg/pyrender/viewer.py", line 347, in __init__
    self._init_and_start_app()
  File "/home/azureuser/anaconda3/envs/FLAME_PyTorch/lib/python3.8/site-packages/pyrender-0.1.39-py3.8.egg/pyrender/viewer.py", line 995, in _init_and_start_app
    super(Viewer, self).__init__(config=conf, resizable=True,
  File "/home/azureuser/anaconda3/envs/FLAME_PyTorch/lib/python3.8/site-packages/pyglet/window/xlib/__init__.py", line 167, in __init__
    super().__init__(*args, **kwargs)
  File "/home/azureuser/anaconda3/envs/FLAME_PyTorch/lib/python3.8/site-packages/pyglet/window/__init__.py", line 507, in __init__
    display = pyglet.display.get_display()
  File "/home/azureuser/anaconda3/envs/FLAME_PyTorch/lib/python3.8/site-packages/pyglet/display/__init__.py", line 77, in get_display
    return Display()
  File "/home/azureuser/anaconda3/envs/FLAME_PyTorch/lib/python3.8/site-packages/pyglet/display/xlib.py", line 93, in __init__
    raise NoSuchDisplayException(f'Cannot connect to "{name}"')
pyglet.display.xlib.NoSuchDisplayException: Cannot connect to "None"


그렇다.

나는 지금 AWS 가상환경에 연결해 코드를 구동중이고,

이곳에는 연결된 Display가 당연히 존재하지 않는다.

 

단순히 생각한다면, X Server 설정을 통해 내 로컬 Windows10에서

Ubuntu22.04 서버의 화면을 받아오자! 라고 생각했지만

!!!!! Azure 가상환경에서 cli 환경으로 동작하는 Ubuntu에게 먹힐리 없다 !!!!!

 

그렇기에, 대안으로 Xvfb(X Virtual Framebuffer)를 통해 가상 디스플레이를 생성한다.

fvfb-run을 통해서는 결과를 화면에 표시하지 않기에 추가과정이 필요하당.

서버에서 Xvfb를 실행하여 가상의 X 서버를 생성하고,

그 위에 실행되는 3D 애플리케이션의 출력 화면을 x11vnc가 캡쳐한다.

이 이후에나 로컬 PC의 VNC Viewer로 확인할 수 있도록 구성한다.

 

머리도 정리할 겸 살짝 그려봤다.

나는 그냥 결과가 보고 싶었을 뿐인데

여차하면 짱짱한 Winodws에서도 한 번 돌려봐야겠따.

 

 


 

 

 

1) xvfb x11vnc 설치

sudo apt-get install xvfb x11vnc

 

 

 

 

 

 

2) Xvfb를 통한 가상 디스플레이 생성

Xvfb :99 -screen 0 1024x768x24 &

 - :99 : 디스플레이 번호 지정
 - -screen 0 : 스크린 ID를 설정 (기본적으로 첫 번째 스크린은 0)
 - 1024x768x24 : 해상도(1024*768), 색상 깊이(24 bit)
 - & : 백그라운드 실행

 

 

 

 

 

 

3) x11vnc를 통한 가상 디스플레이 공유

x11vnc -display :99 -forever -nopw -listen 0.0.0.0 &

 - -display :99: Xvfb가 생성한 디스플레이 번호 지정
 - -forever : 접속이 끊어져도 계속 실행
 - -nopw : 비밀번호 없이 접속 
 - -listen 0.0.0.0 : 모든 네트워크 인터페이스에서 접근 허용 

 

실행 결과 중 일부

 

 

 

 

 

4) 환경 변수 지정 및 테스트

export DISPLAY=:99
# python main.py

 - 이제 pyrender.Viewer가 Xvfb가 제공한 가상 디스플레이에 접근하게 된다!

 - 실제 코드를 실행하면 기존의 NoSuchDisplayException 문제가 발생되지 않는다! >< 🎉🎉🎉🎊✨🎇🎈

 - 실제 물리적 화면은 없지만, 가상 환경에서 렌더링 결과가 처리되는 것

 

 

 

 

 

 

5) 연결 인바운드 규칙 추가하기 (Optional)

: Azure Clould 같이 서비스 쓰고 있는 선생님들은 인바운드 보안 규칙을 잊지말아주자

 

 

 

 

6) VNC 클라이언트를 통한 가상 디스플레이 훔쳐보기 (Windows

 - 여러 프로그램들이 있을텐데 나는 RealVNC를 썼다. TigerVNC 도 호환, 색상 표현에서 좋은데 이게 깔끔하고 예쁘다.

 

Download RealVNC® Connect

Download RealVNC® Connect, the most secure remote access and remote desktop solution to securely connect to your devices. Get started today.

www.realvnc.com

 

멋있게 IP 주소와 포트를 기입하자

 

 

멋있게 뜬다! 이제 이게 뭘 의미하는지 이해해보려고 하자....

 

 

 

💥💥💥💥  아무튼 성공 💥💥💥💥

🎊🎉✨얏호 >< ✨ 🎉🎊

댓글