Что такое 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) и т. п. Примечание: 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 Важно отметить, что в свежих дистрибутивах 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/# Здесь появляется /dev/ptmx, псевдотерминальное мультиплексорное устройство. Фактически существует несколько шагов для создания и использования PTY: 1. Процесс открывает /dev/ptmx. Чтобы определить соответствие между 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:
Конечно, оба показанных выше 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. |