Администрирование FreeBSD, Linux, ... Что такое PTY и TTY? Tue, November 12 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Что такое PTY и TTY? Печать
Добавил(а) microsin   

На самом низком уровне большинство операционных систем Linux взаимодействуют с пользователем через текстовый интерфейс. Существует множество механизмов, позволяющих системе предоставлять как можно больше информации посредством текстового ввода и вывода. До появления продвинутого графического интерфейса взаимодействия с пользователем (graphical user interface, GUI) с его окнами и элементами управления, в операционных системах существовал инструментарий текстовой командной строки (command-line interface, CLI).

Примечание: здесь приведен перевод материалов статьи [1]. Код тестировался на Debian 11 (Bullseye) в среде GNU Bash 5.1.4. Это должно работать на большинстве POSIX-совместимых рабочих окружениях.

Терминалом называют набор программных и аппаратных устройств, обеспечивающих текстовое взаимодействие между компьютером и человеком. Ввод команд обычно осуществляется с клавиатуры, а вывод в виде результатов выполнения команды отображается на экране монитора. Вот список базовых абстракций терминала от самого низкого до самого высокого уровня:

• Аппаратура терминала, т. е. телетайп, клавиатура, видео-монитор (video display unit, VDU) и т. п.
• Программный терминал, т. е. virtual TeleTYpe (TTY), который представляет основной интерфейс взаимодействия с операционной системой Linux.
• Программный псевдо-терминал, т. е. PseudoTeletYpe (PTY), который позволяет эмулировать TTY.
• Программный эмулятор терминала, основанный на предыдущих идеях, но расширение его через реальный или CLI-эмулированный GUI.

Примечание: CLI означает Command Line Interface, интерфейс командной строки. GUI означает Graphics User Interface, графический интерфейс пользователя.

Здесь мы опустим рассмотрение аппаратуры терминалов, поскольку в контексте работы с Linux это не очень интересно. С другой стороны, эмуляторы терминала фактически не вводят новые идеи на низком уровне, просто добавляя вместо этого функции больше для удобства. Давайте начнем обзор с нижнего уровня.

[Что такое TTY?]

TTY это акроним от teletype (телетайп) или teletypewriter (устройство вывода телетайпа, принтер). По сути TTY это устройства, которые позволяют вводить символы (type, typewriter) дистанционно (tele).

В современной операционной системе (OS) эта концепция внедрена напрямую. Linux использует файл устройства для предоставления виртуального TTY, что позволяет взаимодействовать с OS путем обработки ввода (обычно с клавиатуры) и вывода (обычно на экран монитора).

Хотя системы Linux могут иметь несколько TTY, их количество ограничено конфигурацией. В действительности мы можем изменить это модификацией /etc/init/tty*.conf, /etc/securetty, /etc/systemd/logind.conf, или других подобных конфигурационных файлов, в зависимости от дистрибутива Linux.

Фактически по умолчанию установлено 7 поддерживаемых TTY. Однако в более свежих дистрибутивов количество может быть намного больше:

$ find /dev -regex '.*/tty[0-9]+'
/dev/tty63
/dev/tty62
[...]
/dev/tty1
/dev/tty0

Здесь благодаря фильтрации find мы видим 64 штуки базовых устройств tty. Тем не менее, мы можем использовать виртуальную файловую систему /sys, чтобы получить список всех последовательных устройств:

$ find /sys/class/tty/ | sort -V/sys/class/tty/
/sys/class/tty/console
/sys/class/tty/ptmx
/sys/class/tty/tty
/sys/class/tty/tty0
/sys/class/tty/tty1
[...]
/sys/class/tty/tty63
/sys/class/tty/ttyS0
/sys/class/tty/ttyS1
/sys/class/tty/ttyS2
/sys/class/tty/ttyS3

В этом случае мы видим еще несколько других связанных с терминалом устройств:

/dev/tty
/dev/console
/dev/ttyS#
/dev/ptmx

Важно отметить, что в свежих дистрибутивах Linux демон systemd порождает службу getty@.service, которая генерирует, представляет и обслуживает устройства /dev/tty*. Таким образом, мы можем использовать следующую команду для сброса проблемного терминала:

$ systemctl restart getty@tty1.service

Кроме того, файлы устройств, такие как /dev/ttyS#, /dev/ttyUSB# и подобные могут обрабатываться через serial-getty@.service, и это предназначено для использования в качестве каналов связи с COM, USB и другими устройствами.

Последний тип устройства это /dev/ptmx, который мы рассмотрим далее. Чистые TTY позволяют выполнять коммуникацию, но они не обеспечивают большой гибкости, как минимум один конец TTY (клавиатура, мышь или другие устройства ввода). С другой стороны, PTY может быть связан с любым приложением по обе стороны канала связи.

[Что такое PTY?]

PTY это акроним для pseudo-TTY, устройство псевдотерминала. Имя PTY проистекает из того факта, это устройство ведет себя наподобие TTY, но для любых двух конечных точек. Это незначительное различие позволяет нескольким PTY сосуществовать в контексте одного и того же TTY.

Фактически обе стороны PTY имеют имена:

slave, /dev/pts, подчиненное устройство, представлено файлом в /dev/pts/#
master, ptm, главное устройство, которое существует как дескриптор файла процесса, который запрашивает PTY

Здесь появляется /dev/ptmx, псевдотерминальное мультиплексорное устройство. Фактически существует несколько шагов для создания и использования PTY:

1. Процесс открывает /dev/ptmx.
2. OS возвратит дескриптор файла master ptm.
3. OS создает соответствующее /dev/pts/# slave pseudo-device.
4. Начиная с этого момента ввод на slave поступает в master, в то время как ввод на master поступает в slave.

Чтобы определить соответствие между master и slave, мы можем вызвать функцию ptsname.

В основном PTY позволяет выполнять двунаправленный обмен наподобие того, как для этого используют каналы (pipes). В отличие от каналов, это предоставляет интерфейс терминала любому процессу, которому это требуется.

Так что же нам делать с этим функционалом?

[Эмуляторы терминала]

Одна из основных функций PTY - получить такие эмуляторы терминала, как xterm, GNOME Terminal и Konsole. По сути эмулятор терминала запрашивает у OS столько PTY, сколько ему нужно, часто представляя их в виде вкладок или окон в GUI. Давайте проследим, как это работает, и как связано с концепциями TTY и PTY.

Во-первых, Linux загружается в TTY. Мы можем убедиться в этом, и текущий backend терминала в целом с помощью команды tty:

$ tty/dev/tty1

В этом случае мы находимся на /dev/tty1, обычно первый TTY, используемый для логина и GUI. На самом деле мы обычно можем запустить X Window System с помощью startx. Теперь у нас есть GUI, работающий на /dev/tty1.

Оттуда мы можем открыть любое приложение эмулятора терминала и проверить его терминал:

$ tty/dev/pts/0

Вывод показывает, что мы находимся в первом pseudo-TTY slave. Фактически, мы можем пропустить шаг GUI, поскольку в CLI имеются эмуляторы терминалов.

[Приложения PTY]

Естественно, мы используем устройства PTY для создания большего количества терминалов внутри существующих терминалов. Зачем это делать? Одна из причин заключается в том, чтобы избежать перегрузки TTY. Другая причина - чистое удобство.

GUI в CLI. За исключением наличия GUI, использование ПО наподобие tmux или screen обычно является следующей полезной вещью. Оба этих приложения это мультиплексоры терминалов, которые так или иначе эмулируют GUI в CLI:

$ tty                                
/dev/pts/0                           
                                     
   0 bash                            
$ tty                                
/dev/pts/2                           
                                     
   2 bash                            

$ tty                                
/dev/pts/1                           
                                     
    1 bash                           
$ tty                                
/dev/pts/3                           
                                     
    3 bash                           

Конечно, оба показанных выше screen и tmux предоставляют большее количество других расширений возможностей. Например, мультиплексоры терминалов поддерживают долго работающие процессы, не полагаясь на задания в терминале, так что нам не нужно прикасаться к чему-то еще.

Зачастую такая способность вступает в игру при удаленном использовании системы.

Удаленные соединения. Коммуникационные протоколы наподобие ssh и telnet зависят от эмуляции терминала для взаимодействия с OS.

Поскольку они являются приложениями, а не аппаратными средствами, PTY обеспечивает их терминальное соединение:

$ ssh ssh.example.com$ tty/dev/pts/0

Здесь мы видим, что tty возвращает номер pseudo-terminal slave, который отвечает за обслуживание сессии SSH.

[Выводы]

В этой статье мы рассмотрели устройства TTY, PTY и различия между ними. В основном они оба являются двунаправленными каналами, однако TTY это главный терминал операционной системы (OS terminal), в то время как устройства PTY могут быть выделены по запросу.

В заключение, PTY очень похож на TTY, но дает больше гибкости, позволяя разрабатывать удобные пользовательские приложения и протоколы.

[Ссылки]

1. What do PTY and TTY Mean? site:baeldung.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page