TTY의 유래
TTY(TeleTYpewriter)는 초기 컴퓨터에 사용한 입력 기기입니다. 기존 컴퓨터는 천공 카드를 이용해 입력을 받았는데요. 그러던 중 이러한 전신타자기(TTY)가 등장하고, 이 TTY로 컴퓨터에 접근하기 시작했습니다. 그 용어는 지금까지 사용되어 지금까지도 Linux에서 터미널을 지정하는 용어입니다.
TTY
TTY는 콘솔 또는 터미널 디바이스를 의미합니다. 보통 콘솔은 컴퓨터에 직접적으로 연결된 입출력장치로 CLI를 통해 명령어를 전달할 수 있는 인터페이스를 말합니다. 보통 1~6번까지 존재하며, ctrl + alt 1~6으로 전환할 수 있습니다.
X-Windows 환경은 컴퓨터를 부팅시키면서 직접 접속되기 때문에 콘솔이라고 생각할 수 있지만, 사실 서버-클라이언트 구조를 가지고 있는 애플리케이션이기 때문에 가상 터미널 디바이스가 사용됩니다. 이해를 위해 약간의 예시를 들어보자면
가령, public cloud에서 동작하고 있는 인스턴스에 사용자가 SSH로 접근하려 하면 다음과 같은 일이 일어납니다.
1. sshd daemon에서 클라이언트와 통신하기 위해 PTY를 할당해 입력을 받을 수 있게 합니다.
2. sshd deamon에서 login process를 돌려 로그인을 확인하고, PTY를 할당 후 login shell을 exec 시킵니다.
sshd aemon이나 프로토콜 등은 훨씬 더 많은 과정이 들어가지만 여기선 생략하겠습니다.
또는 콘솔로 직접 사용자가 접근하려 한다면 다음과 같습니다. ( 부팅된 상황을 가정함 )
1. init process가 할당됩니다.
2. getty process가 실행되고, 여기서 PTY가 할당되어 콘솔에 접근할 수 있게 됩니다. (Controlling terminal)
3. getty process가 초기 설정을 마치고, login process를 불러옵니다.
4. login process가 PTY를 통해 username, password를 검증하고 나면 exec으로 default shell을 실행시킵니다.
이는 보통 session reader가 됩니다. (프로세스 그룹의 첫 번째 프로세스)
✨ process를 전환하는 것을 exec(), 자식 프로세스를 생성하는 것을 fork()라고 합니다.
이렇듯 TTY는 결국 터미널을 다루기 위한 인터페이스인데요. 이 TTY는 TTY Driver를 통해 커널과 통신합니다.
process에 보내는 SIGNAL도 이 TTY Driver가 처리합니다.
TTY가 입/출력을 처리할 때는 두 개의 큐를 이용합니다. 하나는 입력 큐고, 하나는 출력 큐입니다.
이런 구현은 STDOUT, STDERR, STDIN 등의 동작에서 재밌는 일들을 일으키는데.. 이는 다른 글에서 설명해 보겠습니다.
PTY는 사용자에게 인터페이스로써 입/출력을 TTY Queue와 상호작용하여 커널에 access 할 수 있게 만들어주는 것입니다. 시스템이 참 재밌게 돼있죠?
ETC
제가 그린 턱스(리눅스 마스코트)로 마무리하겠습니다. 환절기에 감기 조심하세용.