Linux: різниця між / dev / console, / dev / tty та / dev / tty0


133

У системі Linux, чим відрізняється /dev/console, /dev/ttyі /dev/tty0?

Яке їх використання та як їх порівнювати?


3
Можливо, вас також зацікавить це
Кевін

Відповіді:


93

З документації :

/dev/tty        Current TTY device
/dev/console    System console
/dev/tty0       Current virtual console

У старі добрі часи /dev/consoleбула консоль системного адміністратора. І TTY були послідовними пристроями користувачів, приєднаними до сервера. Тепер /dev/consoleі /dev/tty0представляють поточний дисплей і зазвичай однакові. Ви можете змінити його, наприклад, додавши console=ttyS0в grub.conf. Після цього ваш /dev/tty0монітор і /dev/consoleє /dev/ttyS0.

Вправа показати різницю між /dev/ttyта /dev/tty0:

Перейдіть на другу консоль, натиснувши Ctrl+ Alt+ F2. Увійти як root. Тип sleep 5; echo tty0 > /dev/tty0. Натисніть Enterі перейдіть на 3-ю консоль, натиснувши Alt+ F3. Тепер поверніться до другої консолі, натиснувши Alt+ F2. Наберіть sleep 5; echo tty > /dev/tty, натисніть Enterта перейдіть на 3-ю консоль.

Ви можете бачити, що ttyце консоль, з якої починається процес, і tty0це завжди поточна консоль.


6
приємна вправа! Ubuntu блокує корінь, тому один із способів відтворення цього на Ubuntu є:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28

10
@ SFun28, я завжди використовував sudo -i, а voila - коренева оболонка.
Андре Ласло

4
одна ідіома для запису у файли, для яких потрібні кореневі приватні файли, - це відлуння | sudo tee / dev / tty0> / dev / null;
Пітер Кордес

Чорт. Коли Ī̲ писав unix.stackexchange.com/a/229598/80483 , answer не знав про цю відповідь!
Incnis Mrsi

@ SFun28: якщо sudo anycommandпрацює, то sudo -iдля запуску root також працює. Не існує такої речі, як Linux / BSD / Unix, де ви не можете запустити корінь. (Тоді це вже не буде Linux / BSD / Unix.)
Evi1M4chine

60
  • /dev/consoleце віртуальний набір пристроїв, який можна встановити як параметр під час завантаження. Він може бути переспрямований на послідовний пристрій або віртуальну консоль і за замовчуванням вказує на /dev/tty0. Коли декілька console=опцій передаються до ядра, вихід консолі перейде на більш ніж один пристрій.

  • /dev/tty0 - поточна віртуальна консоль

  • /dev/tty[1-x]- це одна з віртуальних консолей, на яку ви переходите control- alt- F1і так далі.

  • /dev/ttyє своєрідним псевдонімом консолі (фізичним, віртуальним або псевдо пристроєм, якщо такий є), пов'язаним з процесом, який його відкриває. На відміну від інших пристроїв, вам не потрібні привілеї root, щоб писати на нього. Зауважте також, що такі процеси, як запущені cronі подібні пакетні процеси, не мають корисного використання /dev/tty, оскільки вони не пов'язані ні з одним. Ці процеси мають ?в TTYстовпці ps -efвихід.


Що ви маєте на увазі, запитуючи його з цього твердження "/ dev / tty - це консоль, яка використовується процесом запиту"?
Рон Вінс

1
@RonVince Я маю на увазі /dev/ttyможе бути іншим пристроєм, якщо він є, залежно від процесу, який його відкриває. Відповідь оновлено.
jlliagre

Дякую. Чи можу я знати, що процеси насправді записують / читають в / з / dev / tty замість безпосередньо в / з файлу пристрою, пов'язаного з ними?
Рон Вінс

@RonVince Боюся, я не впевнений, про що ти питаєш. Не могли б ви перефразувати це?
jlliagre

1
@RonVince Opening / dev / tty (не /dev/tty evidence1,..,n]) - це стандарт Unix (і Linux) для процесу запису чогось у термінал користувача. Безпосереднє записування на будь-який інший пристрій не є портативним, складнішим і менш надійним. Процес не повинен знати, що таке фактичний пристрій, до якого підключений термінал, ядро ​​це вже знає.
jlliagre

20

/ dev / console

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst

В Linux консоль ядра можна налаштувати за допомогою параметра console= завантаження . Код ядра, який викликає, printk()може писати на нього повідомлення, наприклад, коли завантажується пристрій або виникає помилка. Ці повідомлення також буферуються ядром. (Див. Також dmesg). Коли консольний пристрій знайдений і запущений, він отримує всі попередньо завантажені повідомлення.

Ви можете пройти console=кілька разів, щоб налаштувати кілька консолей, і на них буде записано повідомлення. Мабуть, ви можете вибрати лише одну консоль кожного "типу": ви не можете використовувати обидві console=ttyS0і console=ttyS1.

Документація ядра визначає /dev/consoleяк символьний пристрій, пронумерований (5,1). Відкриваючи цей символьний пристрій, відкривається "головна" консоль, яка є останньою в списку консолей. Перший процес без ядра, званий initабо "PID 1", починається із /dev/consoleпідключення до стандартного виводу, стандартної помилки та стандартного вводу.

Якщо жодна з консолей не є tty, відкриття /dev/consoleповертає помилку ENODEV("Немає такого пристрою"). Ядро будедрукувійдіть у повідомлення і почніть initнезалежно. Для прикладу консолі ядра, яка не є пристроєм, див. netconsoleАбо мою улюблену консоль лінійного принтера .

Ви також можете побачити список консолей Tty, прочитавши /sys/class/tty/console/active. Документація systemd вказує, що перший показаний пристрій - це головна консоль. Список насправді знаходиться в зворотному порядку командного рядка ядра. У поточній документації на ядро неправильно зазначено, що останній показаний пристрій - це головна або "активна" консоль. Чомусь можна запитати цей файл на зміни (якщо вилучені консольні пристрої?).

Всередині systemd-nspawnконтейнера стандартний /dev/consoleфайл замінюється псевдотермінальним пристроєм (PTY). Це найкраще описати як віртуальні термінальні пристрої. Вони створюються динамічно і також використовуються для реалізації графічних емуляторів терміналів, таких як GNOME Terminal, і для віддаленого доступу ssh.

/ dev / tty0

Вузли пристроїв Linux TTY tty1- tty63це віртуальні термінали. Їх також називають VT, або як віртуальні консолі. Вони імітують кілька консолей поверх драйвера пристрою фізичної консолі. Одночасно відображається та контролюється лише одна віртуальна консоль. Активний термінал можна перемикати, наприклад, за допомогою chvtклавіш Ctrl + Alt + F1 за допомогою багатьох функціональних клавіш.

Ви також можете читати та записувати в поточний VT, використовуючи /dev/tty0. tty0- це звичайна консоль ядра, наприклад, якщо ви її не вибрали явно. Msgstr "" "Спочатку система шукає VGA-карту [яка саме працює VT], а потім послідовний порт". Ви також можете встановити консоль на певний VT, наприклад console=tty1.

"Якщо у вас немає карти VGA у вашій системі, перший послідовний порт автоматично стане консоллю." "Серіальна консоль", як ttyS0, мабуть, є найпоширенішою альтернативою tty0. Використовувати систему ВТ поверх серійної консолі неможливо.

/ dev / tty

/dev/ttyє одним із трьох стандартних файлів пристроїв, визначених POSIX ( /dev/є одним із трьох імен каталогів, визначених POSIX). Відкриття його еквівалентно відкриттю керуючого терміналу поточного процесу. Термінал управління встановлюється, коли процес вперше відкриває термінал, принаймні в Linux . Наприклад, в init, це буде посилатися на /dev/console.

Від'єднання від керуючого терміналу - один із етапів, традиційно необхідних для запуску фонового процесу, наприклад, демон системи реєстрації системи . Кроки, щоб стати фоновим процесом, страшенно складні, але конкретніше, крок, який відривається від керуючого терміналу, - це системний виклик setids . У більш сучасних системах система init, наприклад, systemd запускає послугу без керуючого терміналу в першу чергу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.