У системі Linux, чим відрізняється /dev/console
, /dev/tty
і /dev/tty0
?
Яке їх використання та як їх порівнювати?
У системі Linux, чим відрізняється /dev/console
, /dev/tty
і /dev/tty0
?
Яке їх використання та як їх порівнювати?
Відповіді:
З документації :
/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
це завжди поточна консоль.
$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
sudo -i
, а voila - коренева оболонка.
sudo anycommand
працює, то sudo -i
для запуску root також працює. Не існує такої речі, як Linux / BSD / Unix, де ви не можете запустити корінь. (Тоді це вже не буде Linux / BSD / Unix.)
/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
може бути іншим пристроєм, якщо він є, залежно від процесу, який його відкриває. Відповідь оновлено.
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
.
Вузли пристроїв Linux TTY tty1
- tty63
це віртуальні термінали. Їх також називають VT, або як віртуальні консолі. Вони імітують кілька консолей поверх драйвера пристрою фізичної консолі. Одночасно відображається та контролюється лише одна віртуальна консоль. Активний термінал можна перемикати, наприклад, за допомогою chvt
клавіш Ctrl + Alt + F1 за допомогою багатьох функціональних клавіш.
Ви також можете читати та записувати в поточний VT, використовуючи /dev/tty0
. tty0
- це звичайна консоль ядра, наприклад, якщо ви її не вибрали явно. Msgstr "" "Спочатку система шукає VGA-карту [яка саме працює VT], а потім послідовний порт". Ви також можете встановити консоль на певний VT, наприклад console=tty1
.
"Якщо у вас немає карти VGA у вашій системі, перший послідовний порт автоматично стане консоллю." "Серіальна консоль", як ttyS0
, мабуть, є найпоширенішою альтернативою tty0
. Використовувати систему ВТ поверх серійної консолі неможливо.
/dev/tty
є одним із трьох стандартних файлів пристроїв, визначених POSIX ( /dev/
є одним із трьох імен каталогів, визначених POSIX). Відкриття його еквівалентно відкриттю керуючого терміналу поточного процесу. Термінал управління встановлюється, коли процес вперше відкриває термінал, принаймні в Linux . Наприклад, в init
, це буде посилатися на /dev/console
.
Від'єднання від керуючого терміналу - один із етапів, традиційно необхідних для запуску фонового процесу, наприклад, демон системи реєстрації системи . Кроки, щоб стати фоновим процесом, страшенно складні, але конкретніше, крок, який відривається від керуючого терміналу, - це системний виклик setids . У більш сучасних системах система init, наприклад, systemd запускає послугу без керуючого терміналу в першу чергу.