Linux

X window 시스템

영바이트 2020. 8. 28. 15:04

X 윈도우 시스템(X window system)은 GUI를 위한 시스템 수준 구조와 데이터 전송 규약이다. 말이 좀 어렵게 들리지만 하나씩 들여다보자.

 

X 윈도우 시스템에서 '시스템'은 ①입출력 장치, ②X 윈도우 응용 프로그램, ③X 윈도우 서버로 구성된다. 그리고 이들 시스템 사이의 통신을 위해 TCP/IP 규약을 사용한다.

 

이는 일반적으로 우리가 사용하는 PC 개념을 네트워크로 확장한 것이라고 볼 수 있다. PC 시스템과 X 윈도우 시스템을 한번 비교해보자. PC의 입출력 장치는 USB(또는 PS2)와 HDMI, DP 등의 신호 규약을 통해 PC와 정보를 주고 받는다.

 

<PC의 입출력장치>

 

X 윈도우 시스템은 원거리 서버에서 실행되는 영상 데이터를 가져와서 터미널(보통 PC의 응용프로그램 창)에 표시하고 터미널에서 입력을 받아 다시 원거리에 있는 서버에 전달한다. 터미널의 입출력 장치가 터미널 PC와 USB, HDMI 등으로 연결되어 있지만 원격지의 서버 입장에서는 (터미널 PC의 중계를 통해) 이들 입출력 장치들과 TCP/IP로 연결되어 있다고 생각한다.

 

<TCP/IP로 연결되어 있는 X윈도우>

 

결국 X윈도우 시스템은 그래픽 출력과 사용자 입력을 TCP/IP를 통해 주고 받는 것이다. 요즘은 X11 X 윈도우 시스템을 많이 사용하고 있는데 11번째 X 버전이라는 뜻이다. 참고로 X의 첫 버전은 1987년까지 거슬러 올라간다.

 


 

X윈도우 시스템을 사용하는 방법에 대해 알아보자. 원격지 서버는 Linux이고 PC는 윈도우 시스템을 가정하였다.

 

① X 윈도우 서버를 다운로드 하고 PC에 설치한다.

필자는 vcxsrv(https://sourceforge.net/projects/vcxsrv/)를 사용하였다. 소스 포지에서 다운로드 할 수 있는데, 만약 링크가 동작하지 않는다면 구글 등에서 vcxsrv 검색한다. X 윈도우 시스템에서는 X윈도우 서버가 내 PC에 설치되고 X 윈도우 클라이언트가 원격지 Linux 서버에서 내 PC에 설치되어 있는 X 윈도우 서버로 접속하게된다.

 

② X 윈도우 서버를 가동(launch) 한다.

 

<Multiple window로 사용하였다>

윈도우 PC에서는 multiple window가 가장 일반적인 모드다.

 

<X 윈도우 클라이언트의 접속을 기다린다>

 

'Start no client' 옵션을 선택하면 X 윈도우 서버는 원격지의 X 윈도우 클라이언트 접속을 기다린다.

 

<클립보드 공유 등 설정>

 

기타 설정에서는 opengl 가속을 선택할 수 있다. 만약 이 항목이 기본으로 체크되어 있다면 그대로 두면 된다.

 

③ 터미널 프로그램을 통해서 원격지 Linux 서버에 접속한다.

보안 관계로 요즘 telnet은 거의 쓰이지 않는다.  SSH(Secure Shell, 암호로 주고받는 데이터를 보호한다)을 주로 사용한다. 필자는 Putty를 사용했다. 접속할 Linux 서버의 IP등을 설정하고 'Connection - SSH - X11 - Enable X11 forwarding'을 활성화(체크)한다. 그리고 X display location에 'localhost:0.0'을 입력한다.

 

<Putty X11 설정>

참고로 X의 디스플레이 장치를 지정하기 위한 DISPLAY 변수 설정은 'hostname:X.Y'의 형식으로 이루어지는데 각 필드의 의미는 아래와 같다.
- hostname: X서버에 접근하기 위한 IP, host name등
- : TCP/IP를 이용한다는 의미다. DECnet의 방법도 있는데 잘 사용되지 않는다. 
- X: 디스플레이 장치의 순번이다. 0, 1, 2... 등으로 구분된다. 일반적으로 0은 주(primary) 모니터를 지칭한다.
- Y: 디스플레이 장치에서 스크린의 순번이다. 초기에 디스플레이 장치를 하나밖에 open할 수 없는 경우에 창을 여러개 띄울 수 있도록 하기 위해 사용했었다.

④ Linux 서버의 ssh 설정(/etc/ssh/sshd_config, /etc/ssh/ssh_config) 에서 'X11 forwarding' 항목을 찾아 주석(#)을 해제하고 값을 yes로 바꾼다. 예를 들면 'X11forwarding yes'와 같다.

 

<Linux 서버 sshd_config X 윈도우 설정>

⑤ Linux 서버의 ssh daemon을 재가동 한다.

예) $> sudo /etc/init.d/ssh restart 또는 $> sudo service ssh restart 등

 

⑥ Linux 서버에 ssh 터미널로 접속하고 Linux 서버에서 xclock, xeyes등 테스트 프로그램을 실행하고 내 컴퓨터(글을 쓰는 필자는 로컬 윈도우 PC)에 GUI 윈도우가 나타나는지 확인한다.

 

$> xclock

<xclock>

 

$> xeyes

<xeyes>

 

때로 원격지 서버(Linux 서버)의 사용자 쉘 환경 설정파일(.bashrc 등)에 DISPLAY 변수가 설정되어 있는 경우가 있다. X 윈도우 시스템을 사용할 경우 이 설정은 주석으로 처리하는 방법등으로 비활성화시킨다. 왜냐하면 SSH의 X11 forwarding 기능을 사용하면 원격지 서버(예, Linux 서버)의 디스플레이와 입력 장치 신호가 SSH 채널을 통해 X 윈도우 서버(로컬 윈도우 PC)로 포워딩되는데, 원격지 서버가 DISPLAY를 설정하면 X11 forwarding 기능과 충돌하여 정상적으로 신호가 전달되지 않는 경우가 있다.

 

 ■