- Что такое TTY в Linux?
- Телепринтеры из 1800-х годов
- ASCII и Telex
- Аппаратно-эмулированные телетайпы
- Программно-эмулированные телетайпы
- Команда tty
- Тихий режим
- Команда who
- Доступ к TTY
- Заключение
- Linux terminals, tty, pty and shell
- What’s a terminal?
- What’s a shell?
- What’s a terminal emulator?
- What’s a pseudo terminal (PTY)?
- How does it work? (High level)
- Let’s see what happens when.
- Let’s what happens when.
Что такое TTY в Linux?
Обновл. 9 Сен 2021 |
Команда tty (сокр. от англ. «teletypewriter») выводит имя используемого вами терминала в Linux. Но какая предыстория стоит за названием этой команды и чем она может быть нам полезна? Сейчас разберемся.
Телепринтеры из 1800-х годов
В 1830-х и 1840-х годах были разработаны машины, известные как телепринтеры. Телепринтер позволял отправителю с помощью специального устройства, напоминающего клавиатуру, набирать сообщения и отправлять их «по проводам» в отдаленные места. По приему, полученный текст распечатывали на бумаге. Это было эволюционным шагом в телеграфии, которая до сих пор использовала только азбуку Морзе и подобные коды.
Перед отправкой сообщение кодировалось, затем передавалось получателю, на месте получения оно декодировалось и распечатывалось. Для кодирования и декодирования сообщений использовалось несколько методов. Самым известным и популярным являлся метод, запатентованный в 1874 году Эмилем Бодо, в честь которого была названа единица измерения символьной скорости передачи данных (бод). К слову сказать, его схема кодирования символов на 89 лет опередила появление стандарта ASCII.
Кодировка Бодо в конечном итоге стала наиболее близкой к стандарту кодирования телепринтеров, в связи с чем, она была принята большинством производителей. Оригинальная конструкция оборудования Бодо состояла всего лишь из пяти клавиш, похожих на клавиши пианино. Оператор должен был выучить определенную комбинацию для каждой буквы. Со временем, система кодирования Бодо была объединена с традиционной раскладкой клавиатуры.
В ознаменование этого прогресса машины были названы «телетайпными пишущими машинами» или просто «телетайпами» (англ. «teletypes», сокр. от «teletypewriters»). В дальнейшем название урезали до TTY. Вот откуда появилась аббревиатура TTY. Но какое отношение телеграф имеет к вычислительной технике?
Телетайп времен Второй мировой войны
ASCII и Telex
1963 год ознаменовался выходом стандарта ASCII, который был принят производителями телетайпов. Несмотря на изобретение и широкое использование телефона, популярность телетайпов все еще была высока.
Телекс (англ. «Telex», сокр. от «telegraph exchange») — это всемирная сеть телетайпов, которая позволяла отправлять письменные сообщения по всему миру. Они были основным средством передачи письменных сообщений в период после Второй мировой войны вплоть до бума факсимильной связи (факсов) в 1980-х годах.
Советский факсимильный аппарат «ФТА-П», 1960 год
В тоже время развивались и компьютеры. Они становились способными взаимодействовать с пользователями в режиме реального времени и поддерживать работу сразу с несколькими из них. При этом старый пакетный метод работы с устаревшими аппаратами все сильнее обнажал свои недостатки. Люди не хотели тратить целые сутки (а то и больше) на ожидание результатов выполнения вводимых ими программ. Делать стопки перфокарт и ждать результатов всю ночь было уже неприемлемо: требовалось устройство, которое позволяло бы вводить инструкции и сразу получать результат. Нужна была эффективность. И телетайп стал идеальным кандидатом для использования в качестве устройства ввода-вывода.
Аппаратно-эмулированные телетайпы
Телетайпы стали стандартным средством взаимодействия с мини-компьютерами и большими мейнфреймами той эпохи.
С течением времени телетайпы были заменены на электронные устройства, которые имитировали электромеханическое строение телетайпов. Но при этом, в этих устройствах вместо рулонов бумаги использовались электронно-лучевые трубки (ЭЛТ), они не тряслись при доставке ответов с компьютера и допускали доселе невозможные функции, такие как: перемещение курсора по экрану, очистка экрана, выделение текста жирным шрифтом и так далее.
Видеотерминал DEC VT05 был ранним примером виртуального телетайпа и предком знаменитого DEC VT100. Продажи DEC VT100 исчислялись миллионами штук.
Программно-эмулированные телетайпы
В Linux и других UNIX-подобных операционных системах (например, macOS), окно терминала и приложения по типу x-term и Konsole являются примерами виртуальных телетайпов, работа которых полностью эмулируется при помощи программного обеспечения. Из-за этой особенности терминалы получили название псевдо-телетайп (сокр. «PTS», от англ. «pseudo-teletypes»).
Команда tty
В Linux существует мультиплексор псевдо-телетайпов, который обрабатывает соединения со всех терминалов псевдо-телетайпов (PTS). Мультиплексор является ведущим устройством, а PTS — подчиненными. Мультиплексор общается с ядром через файл устройства, расположенный в /dev/ptmx.
Команда tty выводит имя специального файла устройства, который ваш ведомый псевдо-телетайп использует для взаимодействия с ведущим устройством. И это, по сути, номер вашего окна терминала.
Давайте посмотрим, какую информацию выведет команда tty для нашего окна терминала:
Как видите, мы подключены к специальному файлу устройства /dev/pts/1.
Наше окно терминала, представляющее собой программную эмуляцию телетайпа (TTY), подключено к мультиплексору псевдо-телетайпа как псевдо-телетайп (PTS) под номером 1.
Тихий режим
Опция -s (silent) приводит к тому, что команда tty перестает генерировать выходные данные:
Некоторые служебные значения, возвращаемые командой tty:
0 — если стандартный ввод поступает с устройства TTY (эмулированного или физического).
1 — если стандартный ввод не поступает с устройства TTY.
2 — синтаксическая ошибка, использовались неправильные параметры командной строки.
3 — произошла ошибка записи.
Данные значения будут наиболее полезны при написании bash-скриптов. Но даже в командной строке мы можем продемонстрировать, как выполнить команду при условии, что вы работаете в окне терминала (сеанс TTY или PTS).
tty -s && echo «In a tty»
Примечание: Оператор && является логическим оператором И. Если в командной строке находится command1 && command2 , то command2 выполняется только в том случае, если статус выхода из команды command1 равен 0 , что говорит об успешном её завершении.
Поскольку мы работаем в сеансе TTY, наш код выхода равен 0 (успех), и выполняется вторая команда.
Команда who
Также есть и другие команды, которые могут отобразить ваш номер TTY. Команда who выведет информацию обо всех вошедших в систему пользователей, включая вас.
На следующем скриншоте видно, что к компьютеру с Linux подключен пользователь diego. Часть :0 представляет собой экран и клавиатуру, физически подключенные к компьютеру. Несмотря на то, что экран и клавиатура являются аппаратными устройствами, они все равно соединены с мультиплексором через файл устройства /dev/pts/1.
Доступ к TTY
Вы можете получить доступ к полноэкранному сеансу TTY, удерживая нажатыми сочетание клавиш Ctrl+Alt и нажимая одну из функциональных клавиш.
Нажатие сочетания клавиш Ctrl+Alt+F3 вызовет приглашение для входа в систему tty3.
Если вы войдете в систему и выполните команду tty , то увидите, что подключены к /dev/tty3.
Это не псевдо-телетайп (эмулируемый программным обеспечением); это виртуальный телетайп (эмулируемый аппаратным обеспечением). Он использует экран и клавиатуру, подключенные к вашему компьютеру, для эмуляции виртуального телетайпа, как это делал DEC VT100.
Вы можете использовать сочетание клавиш Ctrl+Alt с функциональными клавишами F3-F6 для открытия соответствующих сеансов TTY. Например, вы можете войти в tty3 и нажать Ctrl+Alt+F6, чтобы перейти в tty6.
Чтобы вернуться в графическую среду рабочего стола, нажмите Ctrl+Alt+F2. Нажатие Ctrl+Alt+F1 вернет вас на экран входа в сеанс графического рабочего стола.
Следующие сочетания клавиш были протестированы на текущих версиях дистрибутивов Debian, Manjaro, Ubuntu и Fedora:
Ctrl+Alt+F1 — возвращает вас на экран входа в графическую среду рабочего стола.
Ctrl+Alt+F2 — возвращает вас в графическую среду рабочего стола.
Ctrl+Alt+F3 — открывает tty3.
Ctrl+Alt+F4 — открывает tty4.
Ctrl+Alt+F5 — открывает tty5.
Ctrl+Alt+F6 — открывает tty6.
Наличие доступа к этим полноэкранным консолям позволяет людям, использующим минимальную установку Linux (а многие серверы Linux настроены именно таким образом), иметь несколько доступных консолей.
Случались ли у вас ситуации, когда во время работы в Linux что-то заставило ваш сеанс зависнуть? Теперь вы можете перейти к одному из сеансов консоли TTY, чтобы попытаться исправить ситуацию. Вы можете задействовать команды top и ps , чтобы попытаться идентифицировать вышедшее из строя приложение, затем ввести команду kill , чтобы завершить процесс, или просто использовать shutdown , чтобы попытаться корректно завершить работу системы.
Заключение
Команда tty, получившая свое название от устройства конца 1800-х годов, появилась в UNIX в 1971 году. С дальнейшим развитием вычислительных машин телетайпы, а затем и видеотерминалы отошли в прошлое. Однако подсистемы для работы с ними хоть и претерпели существенные изменения, остались в ядрах операционных систем.
Источник
Linux terminals, tty, pty and shell
This is the first of two articles about Linux terminals. By the end of the two articles, we should be able to:
- describe the main components in the terminal subsystem
- know the difference between TTY, PTY and Shell
- answer what happens when we press a key in a Terminal (like Xterm, etc.)
- build a simple remote terminal application using golang
Or at least I hope so 🙂
What’s a terminal?
Generally speaking a terminal is a relatively dumb electromechanical device with an input interface (like a keyboard) and an output interface (like a display or sheet of paper).
It is connected to another device (like a computer) via two logical channels, and all it does is:
- send the keystrokes down the first line
- read from the second line and print them on a sheet of paper
The commercial name for this type of device is teletypewriter, Teletype or TTY (remember this word as it will come up
again later). The machines would provide a user interface to early mainframe computers and minicomputers, sending typed data to the computer and printing the response.
By ArnoldReinhold — Own work , CC BY-SA 3.0, Link
To understand how a modern Terminal works we need to dwell just a bit on how teletypes used to work.
Each machine is connected via two cables: one to send instructions to the computer and one to receive output from the computer.
These cables are connected to the computer through a serial cable plugged into a Universal Asynchronous Receiver and Transmitter (UART).
The computer has an UART driver to read for the hardware device.
The sequence of characters is passed to TTY driver which applies the line discipline. The line discipline is in charge of converting special characters (like end of line, backspaces), and echoing what has been received back to the teletype, so that the user can see what it has been typed (line disciplines will be discussed in the next post of the series).
It is also responsible to buffer the characters.
When enter is pressed, the buffered data is passed to the foreground process for the session associated with the TTY. As a user, you can execute several processes in parallel, but only interact with one at a time, letting the others working (or waiting) in the background.
The whole stack as defined above is called a TTY device.
The foreground process is a computer program called Shell.
Gotcha: The words terminal and TTY device are basically interchangeable as they mean the same thing
What’s a shell?
Shells are user space applications that use the kernel API in just the same way as it is used by other application programs. A shell manages the user–system interaction by prompting users for input, interpreting their input, and then handling an output from the underlying operating system (much like a read–eval–print loop, REPL).
For example, if the input is ‘cat file | grep hello’, bash will interpret that and figure it needs to run the program cat passing ‘file’ as parameter and pipe the output to grep.
It also controls programs execution (feature called job control): kills them (CTRL + C), suspends them (CTRL + Z), sets them to run in the foreground (fg) or in the background (bg).
They can also run in non interactive mode, via script which contains a sequence of commands.
Bash, Zsh, Fish and sh are all different flavors of shells.
What’s a terminal emulator?
Let’s move to more recent times. Computers started becoming smaller and smaller, with everything packed in one single box.
For the first time the terminal was not a physical device connected via UART to the computer. The terminal became a computer program in the kernel which would send characters directly to the TTY driver, read from it and print to the screen.
That is, the kernel program would emulate the physical terminal device, thus the name terminal emulator.
Note that, although emulated they were and are still called Teletypes.
Don’t get fooled by the word emulator. A terminal emulator is as dumb as the physical terminals used to be, it listens for events coming from the keyboard and sends it down to the driver. The difference is that there is no physical device or cable which is connected to the TTY driver.
How do I see a terminal emulated TTY?
If you run a Linux OS on your machine press Ctrl+Alt+F1. You’ll get a TTY emulated by the kernel! You can get other TTYs by pressing Ctrl+Alt with the function keys from (F2 to F6). By pressing Ctrl+Alt+F7 you’ll get back to the GUI (X session).
Let’s recap the main concepts so far:
- Terminal and TTY can be used interchangeably
- Teletypes (TTY) is physical electromechanical originally designed for telegraphy, then adapted to send input and get output from mainframes
- A Teletype can be emulated by a computer program running as a module in the kernel
What’s a pseudo terminal (PTY)?
It’s Teletype emulated by a computer program running in the user land.
Compare that with a TTY: the difference is where the program runs; it’s not a kernel program but one that runs in the user land.
I won’t (and probably couldn’t) give a complete description of kernel vs user land, I am just going to say that stuff which runs in the kernel have access to a privileged mode. That allows the kernel to access the hardware of the machine.
Programs in user land instead interact only with the kernel, not directly with the hardware.
If something goes wrong with a kernel module, all the system might be compromised, whereas if something goes wrong with a program in user land, only that program is impacted; in the worst case a reboot will bring the system back to normal.
This is definitively a good argument to move terminal emulation in user land. It is easier for developers to build one.
I guess the main reason why PTY exists is to facilitate moving the terminal emulation into user land, while still keeping the TTY subsystem (session management and line discipline) intact.
How does it work? (High level)
Terminal emulator (or any other program) can ask the kernel for a pair of characters files (called PTY master and PTY slave).
On the master side you have the terminal emulator, while on the slave side you have a Shell.
Between master and slave sits the TTY driver (line discipline, session management, etc.) which copies stuff from/to PTY master and slave.
Let’s see what happens when.
you type something in a terminal emulator in the user land like XTerm or any any other application you use to get a terminal.
Usually we say we open ‘the terminal’ or we open ‘a bash’, but what it actually happens is:
- a GUI which emulates the terminal starts (like the Terminal or Xterm UI application).
- it draws the UI to the video and requests a pty from the OS.
- launches bash as subprocess
- The std input, output and error of the bash will be set to be the pty slave.
- XTerm listens for keyboard events and sends the characters to the pty master
- The line discipline gets the character and buffers them. It copies them to the slave only when you press enter. It also writes back its input to the master (echoing back). Remember the terminal is dumb, it will only show stuff on the screen if it comes from the pty master. Thus, the line discipline echoes back the character so that the terminal can draw it on the video, allowing you to see what you just typed.
- When you press enter, the TTY driver (it’s ‘just’ a kernel module) takes care of copying the buffered data to the pty slave
- bash (which was waiting for input on standard input) finally reads the characters (for example ‘ls -la’). Again, remember that bash standard input is set to be the PTY slave.
- At this points bash interprets the character and figures it needs to run ‘ls’
- It forks the process and runs ‘ls’ in it. The forked process will have the same stdin, stdout and stderr used by bash, which is the PTY slave.
- ls runs and prints to standard output (once again, this is the pty slave)
- the tty driver copies the characters to the master(no, the line discipline does not intervene on the way back)
- XTerm reads in a loop the bytes from the pty master and redraws the UI
I think we made it! That’s roughly what happens when we run a command in a terminal emulator. The drawing should help consolidate the workflow:
As an experiment, run the ‘ps’ command in new instance of a terminal.
If you did not run any process yet, you will see that the only two programs associated with the terminal are ‘ps’ and ‘bash’.
‘ps’ is the program we just started and ‘bash’ was started by the terminal. ‘pts/0’ which you see in the results is the PTY slave we talked about.
Exit fullscreen mode
Let’s what happens when.
you start a program that reads from the standard input from a terminal emulator. The program can be as simple as reading from standard input and writing it to the standard output, like the following.
Источник