어떤 tty를 사용하고 있나요?

어떤 tty를 사용하고 있나요?

지난 며칠 동안 TTY 장치 드라이버가 Linux 시스템에서 어떻게 작동하는지 이해하려고 노력했지만 여전히 아이디어를 이해할 수 없습니다.

SSH를 통해 서버에 연결하기 위해 터미널을 열 때 터미널에서 TTY처럼 작동하고 들어오는 명령을 처리하는 의사 tty를 사용할 가능성이 높다는 것을 알고 있습니다.

의사 유형의 tty를 사용하므로 콘솔에 명령을 보내기 위해 여전히 뒤에서 tty 기술을 사용합니까?

평신도의 관점에서 사용되는 터미널에 관계없이 TTY는 항상 콘솔에 명령을 보내는 데 사용됩니까? 그것이 모든 것을 종말로 이끄는 주된 원동력인가?

나는 입력과 출력을 처리하는 tty 문자 장치와 마스터/슬레이브 장치에 신호를 보내는 많은 것들을 이해합니다. 나는 또한 과거에 tty가 사용되었다는 것을 알고 있습니다. 요즘 단말기를 열 때 사용하는 운영체제/프로그램과 관련해 아직도 사용하고 있나요?

내 지식은 어디에나 있습니다. Linux에 대한 나의 지식은 매우 제한적입니다. 오늘날의 Linux 배포판에서 TTY가 어떻게 작동하는지에 대한 일반인의 설명을 듣고 싶습니다.

답변1

어떤 tty를 사용하고 있나요?

tty- 표준입력에 연결된 터미널의 파일명을 출력

--man tty

예를 들어:

$ tty
/dev/pts/0

무엇유형그거 tty야? 어느장치 드라이버무엇으로 구현되나요?

장치 드라이버의 개념은 운영 체제에 따라 다릅니다. 구체적으로 Linux에 관해 질문하셨는데, 질문에 답하려고 했더니 여전히 특별한 경우가 많이 발견되었습니다. 그래서 구체적인 사례를 찾아보면 더 빨리 답을 얻을 수 있습니다.

/dev/pts/0

pts/0첫 번째 의사 터미널 장치 또는 "pty"입니다. pts의사 터미널 슬레이브를 나타냅니다.

이것노예의사 터미널은 에뮬레이트된 tty 장치처럼 동작합니다. 터미널 에뮬레이터는 gnome-terminal컨트롤을 통해 작업하는 것을 좋아합니다.주인의사 터미널의 끝입니다. 예를 들어, 창 내에서 Enter 키를 누르면 gnome-terminal기본 장치에 "개행" 문자가 기록됩니다. 그러면 슬레이브 장치에서 "개행" 문자가 수신됩니다.

pty의 끝은 완전히 대칭이 아닙니다. Control-C 문자를 마스터 장치에 쓰고 SIGINT 신호를 보내 슬레이브 장치를 사용하는 프로세스를 중단할 수 있습니다. 그 반대는 사실이 아닙니다. 터미널 내부의 프로그램이 어떤 문자를 작성하더라도 인터럽트 신호가 전송되지 않습니다 gnome-terminal. 마스터 장치는 실제 tty와 다르게 동작합니다.

/dev/ttyS0

ttyS0첫 번째입니다직렬 포트컴퓨터의 장치. 누구든지 늙었다면물리적 터미널, 연결할 수 있는 포트 유형입니다. 여기에는 교활한 은유가 없습니다! 여전히 역사적인 Unix의 TTY 장치와 동일하게 작동합니다. 주의 깊게 살펴보면 직렬 포트가 있는 컴퓨터를 구입할 수 있습니다 :). [1]

위의 Control-C 예는 직렬 터미널에도 적용됩니다. 터미널에서 Ctrl-C를 누르면 직렬 포트가 이 문자를 수신하고 직렬 장치를 사용하는 프로세스가 SIGINT를 수신하여 중단될 수 있습니다. 이는 tty로 사용되는 모든 장치의 공통 요소입니다.

꽤 큰 컬렉션이 있습니다일반적인 TTY 동작, 이는 Linux가 구현할 다양한 유형의 TTY 장치에 동일하게 적용되어야 합니다. 두 개의 최종 장치가 많은 양의 코드를 복제하면 유지 관리가 매우 어려워지고 귀중한 RAM이 낭비됩니다.

Linux를 포함한 일부 Unix/Unix 계열 시스템에서는 유사한 동작이 "와이어 규칙"으로 구현된다고 합니다. 이 동작은 의사 터미널 슬레이브에서와 동일한 "라인 규칙"을 사용하여 직렬 포트에서 구현됩니다. Linux는 이 동작을 구현하는 라인 규칙을 호출합니다 TTY. 그러나 정확한 용어에 너무 집착하지 마십시오. 요점은 이것이 공유 코드의 큰 덩어리라는 것입니다.

/*
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

/*
 * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
 * or rs-channels. It also implements echoing, cooked mode etc.

--https://elixir.bootlin.com/linux/v4.17/source/drivers/tty/tty_io.c[3000줄]

 * n_tty.c --- implements the N_TTY line discipline.
 *
 * This code used to be in tty_io.c, but things are getting hairy
 * enough that it made sense to split things off.  (The N_TTY
 * processing has changed so much that it's hardly recognizable,
 * anyway...)
 *
 * Note that the open routine for N_TTY is guaranteed never to return
 * an error.  This is because Linux will fall back to setting a line
 * to N_TTY if it can not switch to any other line discipline.
 *
 * Written by Theodore Ts'o, Copyright 1994.

--https://elixir.bootlin.com/linux/v4.17/source/drivers/tty/n_tty.c[2500줄]

[1] 즉, 직렬 포트의 실제 사용에는 더 이상 물리적 터미널이 포함되지 않는 경우가 많습니다. 사용 예는 그래픽 하드웨어 없이 간단한 장치에서 콘솔에 액세스하는 것입니다. 직렬 포트와 터미널 에뮬레이션 프로그램을 사용하여 장치를 PC에 연결할 수 있습니다. 이를 수행하는 방법에 대한 지침을 찾을 수 있습니다여기.

PC의 직렬 포트를 여는 프로그램은아니요Control-C -> 인터럽트 신호와 같은 tty 장치 동작의 영향을 받고 싶습니다. 프로그램은 pty 슬레이브가 아닌 pty 마스터처럼 작동할 것으로 예상합니다. 이러한 프로그램은 동등한 명령을 사용하여 일반적인 tty 동작을 효과적으로 비활성화합니다 stty raw -echo.

을 살펴보면 ttyS0PC에 외부 직렬 포트는 없지만 완전한 기능을 갖춘 직렬 하드웨어가 있음을 알 수 있습니다. 일부 데스크탑 보드에는 별도로 구매하고 리본 케이블을 사용하여 연결할 수 있는 직렬 포트 핀이 포함되어 있습니다. 일부 비즈니스 노트북은 직렬 포트가 있는 도킹 스테이션을 지원합니다.

일부 드라이버는 동일하게 동작하지만 이름이 다른 직렬 포트를 제공할 수 있습니다. ttyUSB0USB 장치용 Linux에서 일반적으로 사용되며 내장 직렬 포트가 없는 PC에 직렬 포트를 제공합니다.

/dev/tty1

tty1PC 최초의 가상 터미널입니다. 첫 번째 tty는 시작 시 메시지를 표시하는 텍스트 콘솔입니다. 그래픽을 사용하여 부팅하는 경우 plymouthEsc 키를 누르면 VT가 텍스트 모드로 다시 전환되어 시작 메시지를 볼 수 있습니다.

대부분의 Linux PC에서는 최소 6개 또는 7개의 tty 간에 전환할 수 있습니다. 그래픽 인터페이스를 사용하는 경우 특정 tty에서 실행됩니다. 다른 tty로 전환하면 텍스트 기반 로그인 프롬프트가 표시될 수 있습니다.

이 번호 지정이 다른 유형의 tty와 일치하지 않는다는 것을 알 수 있습니다 :-). tty0현재 활성 VT를 참조하기 위해 예약되어 있으며 tty1첫 번째 VT로 예약되어 있습니다.

순수 텍스트 기반 설치에서 VT 간에 전환하려면 예를 들어 alt+f2를 사용하여 VT2로 전환하십시오. 그래픽 인터페이스는 이러한 키 조합을 완전히 무시합니다. 예를 들어 alt+f4는 일반적으로 창을 닫는 데 예약되어 있습니다. 대신 그래픽 인터페이스에서는 ctrl+alt+f2가 VT2 등으로 전환되는 규칙을 개발했습니다. 이 키 조합은 텍스트 콘솔에서 전환할 때도 작동합니다.

어떤 장치 드라이버가 사용되는지 확인하는 방법

$ ls -l /dev/ttyS0
crw-rw----. 1 root dialout 4, 64 Jun  9 13:17 /dev/ttyS0

^ c = character device     ^ 4, 64 is the major, minor
                             number of the device

$ ls -l /sys/dev/char/4:64
lrwxrwxrwx. 1 root root 0 Jun  9 14:17 /sys/dev/char/4:64 ->
 ../../devices/platform/serial8250/tty/ttyS0

이것은 심볼릭 링크 파일입니다. /sys장치의 표준 경로가 무엇인지 보여줍니다 /sys/devices/platform/serial8250/tty/ttyS0. 이 클래스의 장치 tty이며 의 하위 장치입니다 /sys/devices/platform/serial8250/. 상위 장치의 드라이버 이름을 찾을 수 있습니다.

$ ls -l /sys/devices/platform/serial8250/driver
lrwxrwxrwx. 1 root root 0 Jun  9 13:17 /sys/devices/platform/serial8250/driver ->
 ../../../bus/platform/drivers/serial8250

직렬 드라이버는 로드 가능한 커널 모듈에 속한다고 보고하지 않는 것 같습니다. 드라이버가 내 기본 커널에 내장되어 있기 때문입니다.

$ ls -l /sys/bus/platform/drivers/serial8250/module
ls: cannot access '/sys/bus/platform/drivers/serial8250/module': No such file or directory

$ grep 8250 /boot/config-`uname -r`
CONFIG_SERIAL_8250=y
...

$ ls -l /dev/tty1
crw--w----. 1 gdm tty 4, 1 Jun  9 13:18 /dev/tty1

$ ls -l /sys/dev/char/4:1
lrwxrwxrwx. 1 root root 0 Jun  9 15:57 /sys/dev/char/4:1 ->
 ../../devices/virtual/tty/tty1

가상 터미널 장치는 가상이므로 하드웨어 장치의 하위 장치로 등록되지 않습니다. 하드웨어 장치에 어떤 드라이버가 바인딩되어 있는지 물어볼 수 없습니다. :-).


$ ls -l /dev/pts/0
crw--w----. 1 alan tty 136, 0 Jun  9 15:52 /dev/pts/0

$ ls -l /sys/dev/char/136:0
ls: cannot access '/sys/dev/char/136:0': No such file or directory

Linux 장치는 일반적으로 여기에 나열됩니다 /sys. 비가상 장치의 경우 이를 통해 해당 장치 드라이버를 찾을 수 있습니다. 그러나 ptys는 가상이므로 하드웨어 장치의 하위 장치가 아닙니다. 즉, 어떤 드라이버가 하드웨어 장치에 바인딩되어 있는지 물어볼 수 없습니다.

/sys하지만 pty 슬레이브가 애초에 거기에 나열되어 있지 않기 때문에 이것을 일반적인 방법으로 확인할 수는 없습니다 . 이것은 Linux에서 매우 특별한 경우입니다. 최신 Linux 시스템에서 pty를 제공하는 pty 장치 노드 devpts에 파일 시스템 유형이 설치되어 있습니다 . 최근에는 컨테이너에서 다른 Linux 운영 체제를 실행하는 등 /dev/pts/여러 개의 독립적인 설치가 가능합니다 .devptssystemd-nspawn. 장치는 일반적으로 숫자로 식별되며 메이저 번호와 마이너 번호로 구분됩니다. 하지만 동일한 장치 번호가완전히 독립적인 pty 장치devpts, 열리는 파일 시스템 에 따라 다릅니다 . 이 특별한 경우2016년에는 몇 가지 문제가 발생했습니다..

답변2

sshTTY는 모든 경우에 할당되지 않습니다. 다음 명령으로 호출하면 없음:

ssh user@host tty
    not a tty

stdin일반적으로 명령에는 , stdout및 만 필요하므로 이는 괜찮습니다 stderr.

tty 할당은 -t또는 으로 시행 할 수 있습니다 -tt.

관련 정보