당신이 유닉스/리눅스를 사용해 봤다면 아마 tty라는 용어를 들어봤을 것이고, 어쩌면 몇 번인가 이미 'tty에 접근'해 보았을지도 모릅니다.
tty라는 용어는 유닉스/리눅스 사용자들에게 자주 익숙합니다. 하지만 정확히 tty라는 것은 무엇일까요? 그리고 /dev/pts는 tty와 무슨 관계일까요?
당시 세상에는 모스 부호라는 것이 있었습니다. 하지만 일찍이 개발되었던 모스 부호는 실제로 사용하기 위해선 훈련을 필요로 했습니다.
이러한 문제를 해결하기 위해, 모스 부호보다 쉽게 사용할 수 있도록 고안된 것이 teletypewriter, 전신타자기였습니다. 전신타자기는 와이어를 통한 통신을 위해 고안되었습니다.
전신타자기는 입력한 내용에 따라 천공 카드에 구멍을 뚫고, 와이어에 전기 신호를 흘렸습니다.
그리고 초기의 컴퓨터는 천공 카드를 사용했습니다. 당시엔 키보드 같은 것이 없었고, 입출력 장치로서 teletypewriter가 사용되었습니다.
시간이 흐르면서 teletypewriter는 운영체제에 통합되었습니다. TeleTYpewriter, TTY라는 이름으로 말이죠.
그렇다면 현대의 컴퓨터는 어떤 구조로 되어있는 걸까요? 그 답은 다음과 같습니다.
하드웨어 -> UART 드라이버(커널) -> Line discipline(커널) -> TTY driver(커널) -> User space...
네, tty는 커널의 일부로 통합되었습니다. 더 이상 tty는 물리적으로 존재하는 것이 아닙니다. 이제는 전신타자기라는 본래의 형태도 잃어버렸지만, 과거에 사용되었다는 이유로 아직까지 tty라는 이름을 간직하고 있습니다.
그럼 pts, 혹은 pty는 무엇일까요?
우선 아까 말씀드렸다시피 tty는 Kernel space에 있습니다. 네, User space가 아니죠. 그래서는 사용하는데에 한계가 존재합니다.
때문에 우리는 실제 tty의 Wrapper를 필요로 합니다. 유저 공간에 있는 tty를 추상화하는 무언가.
그게 바로 저희가 가상 터미널, 혹은 pty(pseudo terminal)이라고 부르는 것입니다. /dev/tty의 정체이기도 하고요.
현대의 프로그램들, 특히 터미널 에뮬레이터 같은 것들이 실행될 때 이 프로그램들은 커널에 요청합니다. 그리고 커널은 그에 맞춰, tty 쌍 pty master와 pty slave를 만들어냅니다.
터미널 에뮬레이터에 주어지는 것은 pty master입니다. 터미널 에뮬레이터는 pty master에 입출력하고, 커널의 tty driver는 해당 내용을 pty slave와 중계해줍니다. 그리고 pty slave는 Shell과 대화하죠. 나열해보면 다음과 같습니다.
Terminal emulator <-> pty master <-> TTY driver <-> pty slave <-> Shell
그리고 pts는 pty slave만을 의미합니다.
그렇다면 tty에 직접 접근할 수는 없는 걸까요?
아닙니다. 무척 간단하죠. 심지어 적잖은 리눅스/유닉스 사용자 분들께서는 이미 사용해 보셨을 겁니다.
Ctrl+Alt+F2(2~6)을 눌러보세요. 그때 나오는, GUI가 없는 화면이 TTY 화면입니다.