TTY
/dev/tty*
, /dev/pts/*
는 파일들이 I/O에 관여하는 디바이스 파일, 외부 터미널 장치를 연결할 때, 리눅스 가상 콘솔, xterm, gnome-terminal 같은 터미널 에뮬레이터, ssh 등에 사용됨
linux 가상 콘솔
- 현재 리눅스에서
Ctrl + Alt + F1 ~ F6
로 session을 변경하는데, 여기서 사용하는 것이 가상 콘솔
- 커널이 터미널을 에뮬레이터에서 사용할 수 있게 해줌: linux 가상 콘솔
/dev/tty*
사용
PTY
- PTY: Pseudo TTY(xterm, gnome-terminal, ssh ..)
- 위에서 리눅스 가상 콘솔이 커널에서 터미널을 에뮬레이트 했다면, TTY driver가 제공하는 세션 관리기능, line discipline을 그대로 사용하면서, 사용자 프로그램에서 터미널을 에뮬레이션 하는 것이 PTY(Pseudo TTY)이다.
- PTY는 master/slave pair로 이루어져 있다.
- pseudo terminal master (PTM):
/dev/ptmx
(pseudo-terminal master multiplexer)파일을 open하면, pseudo terminal master(PTM)에 해당하는 file descriptor가 반환된다.
- pseudo terminal slave (PTS): 위에서 반환된 PTM-fd가 반환되면, PTS에 해당되는 device가
/dev/pts/
디렉토리에 생성된다.
- PTM과 PTS가 open되면,
/dev/pts/*
는 실제 터미널과 같은 인터페이스를 제공한다.
- x-term, gnome-terminal을 예로 들면, xterm이 ptm에 연결되고, 애플리케이션 프로세스(e.g., bash)가 pts에 연결되는 구조이다.
- xterm에서 입력 -> ptm -> 커널의 line disciplline -> pts를 거쳐 bash 프로세스에 전달되고, 명령 결과는 다시 pts-> line discipline -> ptm을 거쳐 xterm에 전달된다.
- telnet의 stdin, stdout, stderr은 모두 터미널에 연결되어 있어, 터미널에서
ls
명령을 실행하면, telnet 명령의 입력으로 들어가고, 네트워크를 거쳐 telnetd
에 전달되면 PTM, PTS를 거쳐 bash 프로세스에 전달된다. (터미널 프로그램을 실행하거나, 외부에서 ssh, telnet client로 접속해보면 /dev/pts
디렉토리에 디바이스 파일이 만들어 진 것을 확인 할 수 있다.)
tmux의 예
- tmux로 만든 pane마다
/dev/pts/*
생성된다.
- tmux pane(
/dev/pts/6
에 할당된) 터미널에 문자를 입력해본다.
cat /dev/pts/6
를 해보면 그대로 읽힌다.
세션
- session
- login
리눅스의 디스플레이 모드
리눅스는 두 개의 디스플레이 모드를 사용한다.
1. Text Mode: text mode
2. Graphic mode: X Window System
2.1. Graphic mode 특징
- 초기 설정에서 가상 콘솔을 할당 받는 것이 아니다.
- X-server는 특정 가상 콘솔을 사용하도록 지시를 받는 경우가 아니라면, 실행되고 있지 않는 가상 콘솔을 가져오게 된다.
- e.g: tty1, tty2에서 getty 프로세스가 실행 중이라면, 새로운 X-server는 tty3을 받는다.
+) 프로세스간 통신 서비스: D-Bus
X Window System
- X Window(
MS의 Windows와 혼동하지 말자) System, X11은 유닉스 계열 OS에서 사용되는 윈도 시스템 및 X 윈도우 GUI환경
- 특징: 네트워크 프로토콜(X 프로토콜)을 기반한 서버<->클라이언트 윈도 시스템
- X 서버: Window 표현, IO, 디스플레이 구성
1.1. client는 네트워크로 X서버에 접속해 X서버에게 명령 서비스를 요청하면, X서버는 명령을 요청 받아 화면을 포여준다.
- X Window System은 사용자 인터페이스에 관여하지 않는다.
2.1. KDE, gnome, Xfce등 데스크톱환경은 X윈도 기반이지만 다 다른 표현을 보여준다.
X server
- 위치:
/usr/bin/X
- 이 바이너리는 console user만이 실행할 수 있음
- X 서버는 Port 6000에서 TCP listening
- 현재 내 GUI에서 사용하는
X
$ pgrep X -a
- vt2: /dev/tty7 에서 실행되도록 지시 받았다는 뜻이다. (다시 말하지만, X 서버는 가상 터미널이다.)
$DISPLAY
$DISPLAY=:0
- 디스플레이는 사용되는 키보드 및 마우스와 연결하는 하나 혹은 그 이상의 모니터를 나타내는 식별자.
- 보통 디스플레이는 컴퓨터에 연결하는 한 대의 모니터와 일치한다. (더 같이 쓸수도 있음)
- X session을 사용할 때
DISPLAY
환경변수는 디스플레이 식별자로 설정된다.
XDG_SESSION_TYPE=x11
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DISPLAY=:0
Display Manager
- X 서버만 구동 한다면, 빈 화면만 보게된다.
- 디스플레이 매니저
- gdm (gnome 매니저)
- kdm (KDE 매니저)
세션 변경
-
그래픽 모드에서 세션 변경 키
- 명령
$ sudo chvt [ttynumber]
Text mode
SDG_SESSION_TYPE=tty
XDG_SESSION_ID=번호
# 각 세션마다 Session ID가 다르다. ex) tty3 XDG SESSION ID = 241, tty4 XDG SESSION ID = 242
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
- Text mode 특징
- 로그인 프롬프트: getty 프로세스가 사용한다.
$ chvt [ttynum]
- 만약 입력 매커니즘이나 다른환경의 오작동으로 인해 콘솔 전환이 문제가 생기면
chvt
명령으로 시스템이 콘솔을 변경하도록 시도할 수 있다. 예를들어 tty1로 전환하려면 루트로서 다음과 같이 실행한다.