На самом низком уровне большинство операционных систем 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. |