Skip to content

Latest commit

 

History

History
197 lines (150 loc) · 12.9 KB

[리눅스시스템의_이해와_활용]4장.md

File metadata and controls

197 lines (150 loc) · 12.9 KB

1 > X Window System의 구성

1. X Window System이란?

GUI 프레임워크이며, 이미지 처리가 가능한 개발 환경이다.

클라이언트 / 서버

일반적으로 서비스를 요구하는 쪽은 클라이언트, 제공하는 쪽이 서버라 정의하지만 X는 조금 다르다. X에서의 서버는 출력장치와 입력장치의 입출력을 담당하는 소프트웨어를 지칭하며 클라이언트란 화면에 표시되는 창을 의미한다.

2. X 프로토콜

X서버와 X클라이언트 간의 커맨드 프로토콜을 가리켜 X프로토콜이라고 한다. X의 애플리케이션은 X서버인 터미널에 X프로토콜로 정해진 시퀀스를 보낸다. 시퀀스에는 선, 원, 폰트 등을 그리는 커맨드가 포함되어 있으며, X서버가 해석해 디스플레이에 띄운다. 하드웨어의 입출력도 해당된다.

3. XFree86과 X.org

X.org는 XFree86에서 빠져나와 개발하게 된 것으로 현재는 대부분의 배포판이 X.org를 채택하고 있다. 현행 X.org의 소스 아카이브가 약 70개 가까이 분할되어 있고, 배포판의 패키지도 나누어져 있으므로 필요한 패키지만 설치할 수 있다.

4. X유틸리티

이 도구에는 X서버를 구동하는 커맨드X, 디스플레이 매니저인 xdm, 단말기 에뮬레이터인 xterm등이 포함되어 있다. 이 도구들을 구동하기 위해서는 접속할 서버를 지정해주어야 한다.

클라이언트인 X유틸리티는 자신이 표시할 서버의 커맨드라인 인수가 되어 X 서버에 접속한다.

xterm -display 192.168.11.2:0.0

192.168.11.2로 서버가 구동되는 호스트를 지정하며, 0.0의 앞쪽 0은 표시할 디스플레이 번호를 나타내며 뒤쪽 0은 표시하려는 루트윈도우의 번호다.

5. X세션

X에서는 서버의 구동부터 종료까지 흐름을 관리하는 세션이 존재한다. 세션을 통해서 같은 X서버상에 표시된 애플리케이션 간의 데이터 복사, 붙여넣기, 끌어다 놓기 등을 수행할 수 있다. 또한 세션의 상태를 저장하거나 동작을 지정함으로서 서버 구동시 시작 프로그램을 지정하거나 설정을 수행하도록 한다.

n번째 X세션을 여는 방법은 다음과 같다.

Xnest :n-1 &

Xnest(1)는 X서버 프로그램중 하나로, 출력을 하나의 창에 표시할 수 있다. 이것은 X서버의 테스트나 디버그, X 상에서만 이용할 수 있는 도구를 원격 호스트로 실행하는 경우에 편하게 사용 가능하다.

단말기 에뮬레이터(터미널)인 xterm 실행 예시는 다음과 같다.

$ export DISPLAY=localhost:1.0
$ xterm &
$ gnome-terminal &

이와같이 설정하면 xterm(1)은 자동으로 디스플레이 1.0의 X서버에 접속한다.

<?> 윈도우 매니저? Xnest를 사용해 X 세션을 추가해 창을 열었을 때 해당 창에는 아무것도 표시되어 있지 않다. X 구동 후에는 윈도우 매니저를 이용해 애플리케이션을 구동하기 위한 런쳐를 사용할 수 있다. X.org에서는 twm이라는 윈도우 매니저를 이용할 수 있다.

6. 세션 매니저

GNOME, KDE, Xfce등의 데스크톱 환경에서는 각각 세션 매니저가 있으며 데스크톱 상태를 유지하는 기능을 담당한다. 때문에 재 로그인 해도 이전에 로그아웃했을 당시의 데스크톱 환경을 불러올 수 있다.

세션 매니저는 X 구동 스크립트나 X 디스플레이 매니저 경유로 실행된다. Gnome 환경에서는 ~/.config/gnome-session/sessions에 저장된 세션 파일을 읽어온다. 파일이 없는 경우엔 /usr/share/gnome-session/sessions/gnome.session를 기본 포맷 파일로 읽어온다. 세션을 저장할 때에는 ~/.config/gnome-session/saved-session에 실행중인 애플리케이션 정보가 기록되어 있는 것이 세션 파일로 저장된다.

~/.config/autostart/아래에 세션 파일을 저장하면 시작 프로그램 지정이 가능하며 gnome-session-properties(1)명령을 이용해 저장하면 세션 파일이 저장된다.

2 > X 액세스 제어

X는 클라이언트/서버 아키텍처를 채택하고 있어 원격 호스트에서 구동하는 X애플리케이션을 로컬 X서버에 표시할 수 있다. 이때 액세스 제어가 필요하다.

1. xhost

X는 기본적으로 X서버와 같은 단말기에서 동작하는 X애플리케이션 표시만을 허가한다. 때문에 다른 단말기에서의 접속을 허가하려면 다음과 같이 xhost(1)을 이용해야한다.

$ xhost +허가할호스트

xeyes(1) : 제대로 동작하는지 알아보기위한 간단한 애플리케이션중 하나

X서버를 지정하는 형식은 다음과 같다.

-display X 서버명: 디스플레이 번호. 스크린 번호

X서버명은 IP 주소나 이름분석이 가능한 호스트 이름이며, 디스플레이 번호는 X 세션의 번호다. 스크린 번호는 X 서버가 이용하는 디스플레이 확인을 위한 것이며 생략할 경우 기본값은 0이된다.

현재 액세스 제어 상태를 확인하고 싶으면 옵션없이 xhost(1)을 실행하면 된다.

2. xauth

xhost(1)는 네트워크상의 호스트 이름 등을 이용해 액세스를 제어하지만, 더욱 엄격히 액세스를 제어하고 싶으면 xauth(1)를 사용한다. xauth(1)에서는 매직쿠키라 하는 인증용 문자열을 사용하며, 이것은 X서버의 쿠키를 X애플리케이션을 실행하는 단말기에 설정해 액세스를 제어하는 키 역할을 한다.

다음과 같이 X서버의 매직 쿠키를 표시한다.

$ xauth list

매직 쿠기 전송 예시는 다음과 같다.

$ xauth extract - $DISPLAY | ssh -l 사용자명 실행단말기 xauth merge -

3 > X 설정

X 서버 설정은 이용할 디스플레이나 키보드, 마우스 등의 디바이스를 지정하고 어떻게 움직일 것인가를 지시하는 것이다. X.org의 설정 파일명은 xorg.conf 또는 지정된 디렉터리 내의 .conf확장자를 가진 텍스트 파일이 된다.

설정 파일은 다음과 같은 검색 순서로 탐색 된다.

  1. /etc/X11
  2. /usr/share/X11
  3. /etc/X11/xorg.conf
  4. /usr/etc/X11/xorg.conf n. /usr/share/X11/xorg.conf.d/

별도로 설정할 항목이 있으면 xorg.conf를 만들거나 /usr/share/X11/xorg.conf.d/(하드웨어등의 고유 설정) 혹은 /etc/X11/xorg.conf.d/에 추가 작성한다.

1. xorg.conf 생성

리눅스에서는 설치 시에 자동으로 설정 파일을 생성하지만, 만약 생성되지 않으면 사용자가 직접 만들어 주어야 한다. X.org에는 xorg.conf를 자동 생성하는 옵션이 있다.(root 실행)

# Xorg -configure

2. xorg.conf의 내용

기본포맷

기본 포맷은 다음과 같다.

Section "섹션명"
	설정항목[설정값]
EndSection

xorg.conf에는 디바이스 갯수별로 섹션이 존재한다.

키보드와 마우스 설정

키보드, 마우스는 적어도 하나 이상 설정되어야 하지만 자동 검색될 경우엔 없어도 상관없다. 자동 검색이면 Driver 섹션에 kbdmouse와 기술 내용이 달라도 기본으로 evdev 드라이버가 이용된다. 키보드는 XkbModelXkbLayout과 같이 지정된다.

비디오 카드 설정

비디오 카드 설정에는 비디오 카드 드라이버를 지정한다. **VESA(Video Electronics Standards Association)**로 거의 모든 비디오 카드의 기본적 인 표시가 가능하다.

디스플레이 설정

Moniter 섹션에서는 출력할 디스플레이를 설정한다.VenderName, ModelName으로 이용자가 구별하기 쉬운 이름을 지정하고 DisplaySize에 화면 영역을 지정한다.

Screen 섹션은 Device와 Monitor섹션으로 이루어져 있다. DefaultDepth에서는 색 심도의 기본값을 비트단위로 지정한다.

3. xorg.conf.d

키보드와 마우스 이외의 입출력 장치는 /usr/share/X11/xorg.conf.d또는 /etc/X11/xorg.conf.d아래에서 설정한다.

4 > X 구동

1. 구동 흐름

X 구동에는 일반적으로 xinit, startx, XDM을 이용한다.

  1. X프로그램(/usr/bin/X)이 실행되거나 백그라운드에서 동작하고 있다. X는 설정 파일(/etc/X11/xorg.conf)을 찾아 설정을 읽어들이고 초기화한다.
  2. 표시 명령어 등의 요구 사항이 들어가는 TCP포트의 소켓을 대기 가능 상태로 오픈한다.
  3. 애플리케이션을 실행한다. 모든 X애플리케이션은 표시할 X서버의 IP주소를 지시하여 표시할 단말기를 지정한다.
  4. 애플리케이션은 네트워크 경유로 X서버의 대기 소켓을 연다. 접속이 안 된다면 X 서버가 실행되지 않았거나 원격 단말기가 허가되지 않은 호스트에 속해있을 수 있다.
  5. 애플리케이션은 X 프로토콜을 주고받고 디스플레이에 결과를 표시한다.

2. xinit과 startx

xinit(1)은 수동으로 X를 구동하는 명령어이고 startx(1)는 xinit(1)실행 후에 환경 변수를 설정하고 프로그램을 실행하는 셸 스크립트이다.

> startx(1)의 실행(Ubuntu)
  1. startx(1)실행
  2. ~/.xinitrc, ~/.xserverrc를 탐색
  3. /etc/X11/xinit/xinitrc/etc/X11/xinit/xserverrc를 탐색
  4. xserverrc를 참조하여 X서버를 구동한다.
  5. xinitrc는 /Xresources를 읽어들이고 X클라이언트로 윈도우 매니저를 구동한다. /etc/X11/xinit/xinitrc/etc/X11/Xsession을 읽어들인다.
  6. /etc/X11/Xsession.d아래의 파일을 차례로 읽어들인다.

/etc/X11/Xsession.d아래의 스크립트는 파일명 기준 오름차순 실행된다.

> startx(1)의 실행(CentOS)
  1. startx(1)실행
  2. ~/.xinitrc, ~/.xserverrc를 탐색
  3. /etc/X11/xinit/xinitrc/etc/X11/xinit/xserverrc를 탐색
  4. xinitrc에서 /etc/X11/xinit/xinitrc-common을 실행한다.
  5. xinitrc-common에서 /etc/profile.d/lang.sh를 실행, 언어 환경변수를 지정한다.
  6. xinitrc-common에서 리소스파일(~/X.resources/etc/X11/Xresources)를 읽어들인다.
  7. xinitrc-common에서 키보드 설정 파일(~/.Xmodmap, ~/.Xkbmap, /etc/X11/Xmodmap, /etc/X11/Xkbmap)을 읽어들인다.
  8. xinitrc-common에서 /etc/X11/xinit/xinit.d아래의 스크립트를 차례로 실행한다.
  9. xinitrc에서 ~/.Xclients혹은 /etc/X11/xinit/Xclients의 파일 유무를 확인해 실행한다.
  10. Xclient에서 /etc/X11/xinit/Xclients.d아래의 스크립트를 차례로 실행한다. 기본값이 비어있으니 구동하려는 애플리케이션을 기술해야한다.

5> X디스플레이 매니저

1. X디스플레이 매니저란?

CUI에서 구동하면, init(8)은 mgetty(8)을 실행해 터미널에 'login:'을 표시한다. GUI로그인인 경우엔 login(1)대신 디스플레이 매니저가 실행된다.

CUI에서 로그인을 할 때 아이디, 비밀번호를 입력해 인증을 한 후 startx(1)를 통해 X서버/X클라이언트를 실행해 하나의 X 세션을 연다. 데스크톱 매니저에서는 아이디와 비밀번호 인증 후 X 세션을 자동으로 열고 로그아웃할 때 X를 다시 시작한다.

2. XDMCP

XDMCP(X Display Manager Control Protocol)는 X서버가 실행하는 호스트와 X클라이언트가 XDM과 통신하기 위해 X 단말기에서 이용하는 프로토콜을 말한다.

xdm(1)은 원격 또는 로컬 X 클라이언트의 요청을 받아 로그인 화면을 반환하고 세션을 시작한다.

원격에서 실행되는 X디스플레이 매니저를 로컬 X 환경에 표시하는 경우엔 Xephyr(1)이 사용된다. 우선 원격 호스트에서 gdm 설정을 변경하고, CentOS에서는 /etc/gdm/custom.conf의 [xdmcp]섹션에 Enable=true를 추가한다. (기본값으로 무효화 되어있기 때문)

만약 iptables(8)에서 포트를 막아놓았으면 열어준다.

$ netstat -uan | grep 177

X프로토콜을 보내기 위해 gdm을 표시하는 쪽은 6001/tcp~6005/tcp등을 열어두어야 한다. 여기까지 완료되면 xdm을 로컬에 표시할 수 있다.

6 > X 서버 로그

1. 로그 보는 법

X.org의 로그는 /var/log/Xorg.<X세션번호>.log에 기록되어 있다. 만약 복수의 X세션이 실행되면 각 세션의 번호가 로그파일명에 들어간다. 또한 로컬에서 X 서버와 X클라이언트를 모두 실행하면 /var/log/Xorg.0.log에 기록된다. 보통 (EE)나 (WW)로 시작하는 행이 있는 경우 이것이 문제 발생의 원인인 경우가 대부분이다.

기호 영문표기 의미
(--) probed 하드웨어 인식
(**) from config file 설정 파일 읽기
(==) default setting 기본 설정 읽기
(++) from command file 커맨드 라인 읽기
(!!) notice 주의
(WW) warning 경고
(EE) error 오류
(NI) not implemented 구현되어 있지 않음
(??) unknown 확인되지 않음