방법 설명 디스플레이 매니저 부팅하면 바로 그래픽 로그인 화면 이 뜬다 startx텍스트로 로그인한 뒤 직접 X를 실행한다
startx # X 세션 시작
systemd 타깃 예전 런레벨 뜻 multi-user.target3 텍스트 모드 graphical.target5 그래픽 모드
systemctl get-default # 현재 기본 모드
systemctl set-default graphical.target # 그래픽으로 부팅
systemctl set-default multi-user.target # 텍스트로 부팅
런레벨 3이 텍스트, 5가 그래픽 이라는 짝은 지금도 그대로 출제된다.
서버는 자원을 아끼려고 텍스트 모드로 운영 하는 경우가 많다.
startx ──► xinit ──► X 서버 실행 + ~/.xinitrc 실행
(없으면 /etc/X11/xinit/xinitrc)
# ~/.xinitrc 의 예
xterm & 터미널 하나를 백그라운드로 띄우고
exec twm 마지막에 윈도 매니저를 실행한다
startx는 xinit을 편하게 부르는 스크립트 다. 실제로 X 서버와 첫 클라이언트를 띄우는 것은 xinit이다.
~/.xinitrc 에는 X가 뜬 뒤 실행할 프로그램을 적는다. 사용자 파일이 없으면 시스템 파일(/etc/X11/xinit/xinitrc)을 쓴다.
맨 마지막 프로그램이 끝나면 X도 끝난다. 그래서 마지막 줄에는 윈도 매니저나 데스크톱 환경을 두고, 앞의 것들은 &로 백그라운드에 보낸다.
디스플레이 매니저로 로그인할 때는 .xinitrc가 아니라 디스플레이 매니저가 세션을 시작한다. .xinitrc는 startx의 짝 이다.
하고 싶은 일 systemd 예전 방식(SysV init) 부팅 기본값 확인systemctl get-default/etc/inittab의 initdefault 줄지금의 런레벨 확인runlevel (systemd에서도 동작한다)runlevel지금 바로 그래픽으로systemctl isolate graphical.targetinit 5 · telinit 5지금 바로 텍스트로systemctl isolate multi-user.targetinit 3다음 부팅부터 그래픽으로systemctl set-default graphical.target/etc/inittab의 id:5:initdefault:
set-default는 다음 부팅의 기본값 을 바꿀 뿐 지금 화면은 그대로다. 지금 넘어가려면 isolate를 쓴다.
레드햇 계열의 런레벨 일곱 개는 0 종료 · 1 단일 사용자 · 3 텍스트 · 5 그래픽 · 6 재부팅 을 축으로 외운다. X와 관련된 것은 3과 5뿐이다.
그래픽 화면에서도 Ctrl+Alt+F3 같은 조합으로 텍스트 콘솔로 넘어갈 수 있다(어느 번호가 텍스트 콘솔인지는 배포판마다 다르다). X가 멈췄을 때 이쪽에서 로그인해 정리한다.
DISPLAY = 호스트이름 : 디스플레이번호 . 스크린번호
192.168.0.10 : 0 . 0
│ │ │
│ │ └── 스크린 번호 (모니터가 여러 대일 때)
│ └────── 디스플레이 번호 (X 서버 번호)
└──────────────── X 서버가 있는 호스트 (생략하면 로컬)
값 뜻 :0.0로컬 컴퓨터의 첫 번째 화면 :0스크린 번호 생략 — :0.0과 같다 192.168.0.10:0.0그 주소의 컴퓨터 화면 :1.0두 번째로 실행된 X 서버
echo $DISPLAY # :0
export DISPLAY = 192.168.0.10:0.0 # 저 컴퓨터 화면에 띄우겠다
xclock & # 시계가 저쪽 화면에 뜬다
호스트를 생략하면 로컬 이다. 그래서 평소에는 :0만 보인다.
원격 화면에 띄우려면 클라이언트 쪽에서 DISPLAY를 지정 하고, 서버 쪽에서 접근을 허가 해야 한다. 둘 다 필요하다.
칸 뜻 생략하면 호스트 X 서버가 도는 컴퓨터 로컬 . 네트워크가 아니라 컴퓨터 안의 통로로 연결한다디스플레이 번호 그 컴퓨터에서 몇 번째 X 서버 인가. 0부터 센다 생략할 수 없다 스크린 번호 그 X 서버에 달린 몇 번째 화면 인가. 0부터 센다 0
콜론(:)은 빠질 수 없고, 점(.) 뒤는 빠져도 된다. 그래서 :0은 맞는 값이고 0.0이나 0:0은 틀린 값이다.
디스플레이 번호는 포트 번호와 이어진다. X 서버는 네트워크 접속을 TCP 6000 + 디스플레이 번호 에서 받는다. :0은 6000번, :1은 6001번이다.
환경 변수 대신 -display 옵션 으로 한 번만 지정할 수도 있다 — xclock -display 192.168.0.10:0.0.
원격 표시에서 헷갈리기 쉬운 것이 명령을 치는 자리 다. 화면이 있는 내 PC를 192.168.0.10, 프로그램이 도는 원격 서버를 192.168.0.20이라 가정한다.
자리 역할 치는 명령 내 PC (192.168.0.10)X 서버 — 화면을 빌려준다xhost +192.168.0.20원격 서버 (192.168.0.20)X 클라이언트 — 프로그램을 실행한다export DISPLAY=192.168.0.10:0.0 그리고 xclock &
xhost에는 "들어오게 해 줄 상대"의 주소 를, DISPLAY에는 "화면이 있는 곳"의 주소 를 적는다. 두 주소는 서로 반대편을 가리킨다.
DISPLAY는 프로그램을 실행하는 쪽 에서 정한다. 화면이 있는 쪽에서 정하는 것이 아니다.
화면에 나온 말 원인 Error: Can't open display: (뒤가 비어 있음)DISPLAY가 설정되지 않았다 — 텍스트 콘솔이나 -X 없는 SSH 접속에서 흔하다No protocol specified 뒤에 Can't open display: 192.168.0.10:0.0주소는 맞지만 X 서버가 접근을 거부 했다 — xhost·xauth 허가가 없다 한참 기다리다 Can't open display X 서버까지 네트워크로 닿지 못한다 — 주소가 틀렸거나 X 서버가 네트워크 접속을 받지 않는다
요즘 배포판의 X 서버는 보안 때문에 네트워크(TCP) 접속을 아예 받지 않도록 띄우는 것이 기본이다. DISPLAY와 xhost로 직접 연결하는 방식은 원리로 알아 두고, 실제로는 아래의 ssh -X를 쓴다.
X 서버는 아무나 자기 화면에 창을 띄우게 두지 않는다.
구분 xhostxauth단위 호스트(IP) 단위 사용자 단위 방식 주소를 허용 목록에 추가 매직 쿠키 를 가진 사람만보안 약하다 강하다 저장 — ~/.Xauthority
xhost # 현재 허용 목록
xhost +192.168.0.20 # 그 주소만 허용
xhost -192.168.0.20 # 그 주소 차단
xhost + # 전부 허용 ← 위험!
xhost - # 전부 차단
xauth list # 매직 쿠키 목록
⚠️ xhost + 는 모든 컴퓨터에 화면을 열어 준다. 남이 내 화면을 훔쳐보거나 가짜 창을 띄울 수 있다. 테스트 목적 외에는 쓰지 않는다. 시험에서도 "보안상 위험한 명령"으로 나온다.
xauth가 쓰는 인증 방식이 MIT-MAGIC-COOKIE-1 이다. ~/.Xauthority 파일에 저장된 쿠키가 일치해야 접속된다.
$ xhost
access control enabled, only authorized clients can connect
$ xhost +192.168.0.20
192.168.0.20 being added to access control list
$ xhost
access control enabled, only authorized clients can connect
INET:192.168.0.20
$ xhost +
access control disabled, clients can connect from any host
명령 접근 제어 결과 xhost— 현재 상태와 허용 목록을 보기만 xhost +주소켜진 채 그 주소를 목록에 추가 xhost -주소켜진 채 그 주소를 목록에서 제거 xhost +꺼짐 (disabled) 누구나 접속xhost -켜짐 (enabled) 목록에 있는 곳만 접속
+가 "열기", -가 "닫기" 다. xhost +의 결과가 access control disabled라서 헷갈리는데, "접근 제어를 끈다 = 다 열린다" 는 뜻이다.
xhost가 여는 것은 그 컴퓨터 전체 다. 192.168.0.20을 허용하면 그 서버에 로그인한 모든 사용자 가 내 화면에 접근할 수 있다. "호스트 단위라 보안이 약하다"는 말의 실제 내용이다.
xhost 설정은 X 서버가 켜져 있는 동안만 유지된다. 로그아웃하면 사라진다.
$ xauth list
mypc/unix:0 MIT-MAGIC-COOKIE-1 5e3c1a9f0b7d4c2e8a6f1d3b9c0e7a42
칸 뜻 mypc/unix:0어느 디스플레이의 쿠키인가 MIT-MAGIC-COOKIE-1인증 방식 32자리 16진수 쿠키 값 — 이것을 아는 클라이언트만 받아 준다
X 서버는 시작할 때 쿠키를 하나 정해 두고, 같은 값을 내미는 클라이언트만 받는다. 쿠키는 ~/.Xauthority에 들어 있고 이 파일은 소유자만 읽을 수 있어 다른 사용자는 값을 알 수 없다. 그래서 사용자 단위 의 제어가 된다.
다른 컴퓨터에서 쓰려면 쿠키를 그쪽 ~/.Xauthority로 옮겨 줘야 한다. xauth extract로 꺼내고 xauth merge로 넣거나, xauth add로 직접 적는다.
쓸 파일을 바꾸려면 XAUTHORITY 환경 변수로 지정한다.
xauth 하위 명령하는 일 list쿠키 목록 보기 add쿠키 추가 remove쿠키 삭제 extract · merge파일로 꺼내기 · 파일에서 합치기
ssh -X user@서버주소 # X11 forwarding
gedit # 서버의 프로그램인데 내 화면에 뜬다
SSH가 X 통신을 암호화된 터널로 대신 날라 준다. DISPLAY도 자동으로 설정된다.
xhost를 열 필요가 없어 훨씬 안전하다. 원격 GUI의 표준 방법이다.
-Y는 신뢰 모드로 제한이 더 느슨하다.
방법 보안 xhost + 후 DISPLAY 지정위험 ssh -X안전 (암호화)
$ ssh -X alice@192.168.0.20
$ echo $DISPLAY
localhost:10.0
$ xclock &
내 PC (X 서버, :0) 원격 서버 192.168.0.20
▲ xclock
│ │ DISPLAY=localhost:10.0
│ ▼
ssh 클라이언트 ◄═══ 암호화된 SSH 연결 ═══► sshd 가 만든 가짜 디스플레이 :10
원격 서버의 DISPLAY가 내 PC 주소가 아니라 localhost:10.0 으로 잡힌다. sshd가 원격 서버 자기 안에 가짜 디스플레이 10번 을 만들어 두고, 거기로 들어온 X 통신을 SSH 연결에 실어 내 PC의 진짜 X 서버로 넘겨주기 때문이다.
X 통신이 이미 열려 있는 SSH 연결 하나를 타고 가므로, 내 PC의 X 서버를 네트워크에 열 필요도 xhost를 쓸 필요도 없다. 쿠키도 SSH가 알아서 마련한다.
DISPLAY를 손으로 다시 지정하면 안 된다. ssh -X로 들어간 뒤 export DISPLAY=192.168.0.10:0.0을 하면 암호화된 길을 버리고 직접 연결을 시도하게 된다.
조건 내용 원격 서버 쪽 /etc/ssh/sshd_config에 X11Forwarding yes원격 서버 쪽 xauth 프로그램이 설치되어 있을 것내 PC 쪽 X 서버가 돌고 있을 것 — 텍스트 콘솔에서 ssh -X를 해 봐야 띄울 화면이 없다
옵션 뜻 -XX11 forwarding 사용 (대문자) -Y신뢰 모드의 X11 forwarding — 제한이 더 느슨하다 -xX11 forwarding 끄기 (소문자)
구분 DISPLAY + xhostDISPLAY + xauthssh -X허가 단위 호스트 사용자(쿠키) SSH 로그인한 사용자 통신 암호화 안 된다 안 된다 된다 DISPLAY 설정손으로 손으로 자동 X 서버의 TCP 접속 허용 필요 필요 불필요
xauth는 "누가 접속하는가"만 가려 줄 뿐 통신 내용을 숨기지는 않는다. 암호화까지 되는 것은 ssh -X 하나다.
/etc/X11/xorg.conf X 서버 설정 파일
Section "Files" 글꼴·모듈 경로
Section "Module" 불러올 모듈
Section "InputDevice" 키보드 · 마우스
Section "Monitor" 모니터 주파수
Section "Device" 그래픽 카드
Section "Screen" Monitor + Device 조합, 해상도
Section "ServerLayout" 전체 배치
요즘은 자동 인식이 잘 되어 이 파일이 아예 없는 경우도 많다. 필요할 때만 만든다.
Xorg -configure 로 초안을 만들 수 있다.
Section "Screen"
Identifier "Screen0"
Device "Card0" ← Section "Device" 의 이름을 가리킨다
Monitor "Monitor0" ← Section "Monitor" 의 이름을 가리킨다
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1920x1080"
EndSubSection
EndSection
모든 구역은 Section "이름" 으로 열고 EndSection 으로 닫는다. 구역마다 Identifier로 이름을 붙이고, 다른 구역이 그 이름을 가리켜 엮는다.
고치려는 것 볼 구역 해상도 · 색 깊이 Screen (그 안의 Display 하위 구역)그래픽 카드 드라이버 Device모니터의 수평·수직 주파수 Monitor키보드 · 마우스 InputDevice글꼴 경로 Files화면과 입력 장치를 한데 묶기 ServerLayout
Device는 "장치 전반"이 아니라 그래픽 카드 다. 키보드·마우스는 InputDevice로 따로 있다. 이름만 보고 고르면 틀린다.
Screen은 Device 하나와 Monitor 하나를 짝지은 것 이다. 그래서 해상도가 그래픽 카드 구역이 아니라 Screen에 적힌다.
파일 무엇 /etc/X11/xorg.confX.org 서버의 설정 파일 /etc/X11/xorg.conf.d/설정을 조각 파일로 나눠 두는 디렉터리 /etc/X11/XF86ConfigXFree86 시절 의 설정 파일 이름/var/log/Xorg.0.logX 서버의 로그 — 가운데 0은 디스플레이 번호 (배포판에 따라 사용자 홈 아래에 남기도 한다)
그래픽 화면이 뜨지 않을 때는 Xorg.0.log에서 (EE)로 시작하는 줄 을 찾는다. 오류(Error) 표시다. (WW)는 경고다.
명령 하는 일 xdpyinfoX 서버 정보 (해상도·색상 수) xwininfo창 정보 — 클릭한 창의 크기와 위치 xkill응답 없는 창을 클릭해서 강제 종료 xrandr해상도·모니터 배치 변경 xclock, xterm, xeyes동작 확인용 기본 X 클라이언트
xkill은 실행 후 커서가 X자로 바뀌고, 클릭한 창을 죽인다. 멈춘 프로그램을 정리할 때 쓴다.
명령 하는 일 xset키보드 반복 속도·화면 보호기·절전 같은 사용자 환경 설정 xsetroot바탕(루트 창)의 색·무늬 바꾸기 xlsclients지금 X 서버에 붙어 있는 클라이언트 목록 xprop클릭한 창의 속성 보기 xmodmap키보드 키 배치 바꾸기
알고 싶은 것 · 하고 싶은 일 명령 화면 전체의 해상도·색상 수 xdpyinfo — 대상이 X 서버 창 하나의 크기·위치 xwininfo — 대상이 창 해상도를 바꾸기 , 모니터 배치 xrandr멈춘 창 닫기 xkill누가 내 화면에 접속할 수 있나 xhost · xauth list
xdpyinfo와 xwininfo는 이름의 가운데 글자로 가른다 — dpy는 display(화면 전체), win은 window(창 하나)다.
보는 것은 xdpyinfo, 바꾸는 것은 xrandr 다. 해상도라는 말이 양쪽에 다 나오므로 "확인"인지 "변경"인지를 본다.
xkill은 창을 가진 클라이언트와의 연결을 X 서버가 끊어 버리는 것이다. Week 6에서 배운 kill이 PID로 시그널을 보내는 것과 달리 PID를 몰라도 창만 찍으면 된다.
내일은 이번 주의 X 윈도를 한 장으로 묶어 정리한다.
startx : 텍스트 모드에서 X 세션을 시작하는 명령.
DISPLAY : 출력할 화면을 지정하는 환경 변수. 형식은 호스트:디스플레이.스크린이다.
xhost : 호스트(IP) 단위로 X 서버 접근을 허용·차단하는 명령.
xauth : 매직 쿠키를 이용해 사용자 단위로 접근을 제어하는 명령.
MIT-MAGIC-COOKIE-1 : xauth가 사용하는 인증 방식. 쿠키는 ~/.Xauthority에 저장된다.
X11 forwarding : SSH 터널로 X 통신을 안전하게 전달하는 기능. ssh -X로 사용한다.
xorg.conf : X 서버의 설정 파일. /etc/X11/에 위치한다.
xkill : 클릭한 창의 프로그램을 강제 종료하는 명령.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 로컬 컴퓨터의 첫 번째 디스플레이와 첫 번째 스크린을 지정하는 DISPLAY 값으로 알맞은 것은?
A :0.0 B 0:0 C localhost.0 D 0.0.1 다음 중 텍스트 모드에서 X 윈도 세션을 시작하는 명령으로 알맞은 것은?
A xinit -d B xhost C xdpyinfo D startx 다음 중 보안상 위험해 사용을 피해야 하는 명령으로 알맞은 것은?
A xhost - B xhost + C xauth list D ssh -X 다음 중 systemd 환경에서 그래픽 모드로 부팅하도록 지정하는 타깃으로 알맞은 것은?
A multi-user.target B rescue.target C graphical.target D emergency.target 다음 중 응답하지 않는 창을 클릭해 강제로 종료시키는 X 명령으로 알맞은 것은?
A xwininfo B xrandr C xdpyinfo D xkill