CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
  • Week 1
    • 1.운영체제와 커널: 리눅스가 하는 일
    • 2.리눅스의 탄생: 유닉스에서 리누스까지
    • 3.자유 소프트웨어와 오픈소스: 라이선스가 정하는 것
    • 4.배포판: 커널과 도구를 하나로 묶어 파는 단위
    • 5.Week 1 종합 복습: 리눅스라는 이름의 정체
  • Week 2
  • Week 3
  • Week 4
  • Week 5
  • Week 6
  • Week 7
  • Week 8
    • 1.X 윈도의 구조와 발전
    • 2.라이브러리와 툴킷 계층
    • 3.윈도 매니저 · 디스플레이 매니저 · 데스크톱 환경
    • 4.X 실행과 원격 화면
    • 5.Week 8 종합 복습: X 윈도 이름표
  • Week 9
  • Week 10
  • Week 11
리눅스마스터 1급 · 1급리눅스마스터 1급
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 2급/Week 8/Day 4

기준: 리눅스마스터 2급 출제 기준·오류 제보

리눅스마스터 2급· AssociateWeek 8 · Day 4읽기 약 11분
핵심 정리
  • 텍스트로 부팅했다면 startx 로 X를 띄운다. 그래픽으로 부팅하려면 graphical.target 을 기본으로 둔다.
  • DISPLAY 환경 변수가 "어느 화면에 그릴지"를 정한다. 형식은 호스트:디스플레이.스크린 이다.
  • 로컬 화면은 보통 :0.0 이다.
  • 접근 허가는 xhost(호스트 단위) 와 xauth(사용자 단위) 로 한다.
  • 원격 GUI의 안전한 방법은 ssh -X 다. xhost + 는 누구에게나 열어 주므로 위험하다.

Day 4 - X 실행과 원격 화면

X를 띄우는 두 방법

방법설명
디스플레이 매니저부팅하면 바로 그래픽 로그인 화면이 뜬다
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가 실제로 하는 일

   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 — 어느 화면에 그릴 것인가

   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 displayX 서버까지 네트워크로 닿지 못한다 — 주소가 틀렸거나 X 서버가 네트워크 접속을 받지 않는다
  • 요즘 배포판의 X 서버는 보안 때문에 네트워크(TCP) 접속을 아예 받지 않도록 띄우는 것이 기본이다. DISPLAY와 xhost로 직접 연결하는 방식은 원리로 알아 두고, 실제로는 아래의 ssh -X를 쓴다.

접근 제어 — xhost와 xauth

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 출력 읽기

$ 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 — 쿠키를 가진 사람만

$ 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파일로 꺼내기 · 파일에서 합치기

원격 GUI — ssh -X

ssh -X user@서버주소       # X11 forwarding
gedit                      # 서버의 프로그램인데 내 화면에 뜬다
  • SSH가 X 통신을 암호화된 터널로 대신 날라 준다. DISPLAY도 자동으로 설정된다.
  • xhost를 열 필요가 없어 훨씬 안전하다. 원격 GUI의 표준 방법이다.
  • -Y는 신뢰 모드로 제한이 더 느슨하다.
방법보안
xhost + 후 DISPLAY 지정위험
ssh -X안전 (암호화)

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 하나다.

설정 파일과 명령

xorg.conf

   /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)는 경고다.

자주 쓰는 X 명령

명령하는 일
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 : 클릭한 창의 프로그램을 강제 종료하는 명령.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

다음 중 로컬 컴퓨터의 첫 번째 디스플레이와 첫 번째 스크린을 지정하는 DISPLAY 값으로 알맞은 것은?

문제 2

다음 중 텍스트 모드에서 X 윈도 세션을 시작하는 명령으로 알맞은 것은?

문제 3

다음 중 보안상 위험해 사용을 피해야 하는 명령으로 알맞은 것은?

문제 4

다음 중 systemd 환경에서 그래픽 모드로 부팅하도록 지정하는 타깃으로 알맞은 것은?

문제 5

다음 중 응답하지 않는 창을 클릭해 강제로 종료시키는 X 명령으로 알맞은 것은?

이전윈도 매니저 · 디스플레이 매니저 · 데스크톱 환경Week 8 · Day 3다음 Week 8 종합 복습: X 윈도 이름표Week 8 · Day 5

참고 공식 자료

  • 리눅스마스터 2급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • X를 띄우는 두 방법
  • startx가 실제로 하는 일
  • 지금 바로 바꾸기와 다음 부팅부터 바꾸기
  • DISPLAY — 어느 화면에 그릴 것인가
  • 세 칸을 하나씩
  • 어느 컴퓨터에서 무엇을 치나
  • 접근 제어 — xhost와 xauth
  • xhost 출력 읽기
  • xauth — 쿠키를 가진 사람만
  • 원격 GUI — ssh -X
  • ssh -X 안에서 벌어지는 일
  • 원격 표시 세 방법 견주기
  • 설정 파일과 명령
  • xorg.conf
  • 자주 쓰는 X 명령
  • 용어
  • 연습 문제