У системі 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 запускає послугу без керуючого терміналу в першу чергу.