"Що таке /dev/console
?" відповідає в попередній відповіді . Можливо, ця відповідь є більш зрозумілою, коли ви знаєте відповіді на два інші питання.
Q1. "Який файл пристрою представляє сам фізичний термінал?"
Такого файлу пристрою немає.
Q2. "Для чого /dev/console
використовується?"
У Linux /dev/console
використовується для показу повідомлень під час запуску (та відключення). Він також використовується для "режиму єдиного користувача", на що вказувалося у відповіді Стівена Кітта. Є не багато іншого, для чого це має сенс використовувати.
"У старі добрі часи" Unix /dev/console
був спеціалізованим фізичним пристроєм. Але це не так у Linux.
Супутні докази
1. "Який файл пристрою представляє сам фізичний термінал?"
Дозвольте спробувати зрозуміти так. /dev/tty{1..63}
і /dev/pts/n
є файлами пристроїв, що представляють самі пристрої (хоча вони є емуляціями), а не стосовно процесу чи ядра. /dev/tty0
репрезентує той, у /dev/tty{1..63}
якому зараз використовується щось (можливо, ядро)або оболонки?). /dev/tty
являє собою керуючий термінал, який в даний час використовується сеансом процесу. /dev/console
являє собою термінал, який зараз використовується ядром?
Що таке файл пристрою, що представляє сам фізичний термінал, а не стосовно ядра чи процесу?
Основні пристрої (и) для /dev/tty{1..63}
є struct con_driver
. Щоб побачити всі можливі драйвери, перегляньте https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console
Немає файлу пристрою для цих базових пристроїв!
Для управління ними існує лише мінімальний інтерфейс простору користувача.
$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device
==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device
Якщо ви дійсно хочете знати більше, позначає модуль . Тобто пристрій фіктивного консолі не забезпечується завантажуваним модулем ядра; це частина початкового зображення ядра (він же "вбудований").(M)
По-друге, з'являється bind
файл у кожному підкаталозі /sys/class/vtconsole
вказує, який пристрій vtconsole активний. Якщо я напишу 0
на активний, він, схоже, переходить на манекен. (Графічні інтерфейси графічного інтерфейсу, здається, не зачіпаються, але текстові графіки перестають працювати) Писати 1
для манекена це не активує. Будь-який метод працює для повернення до реального. Якщо я читаю код правильно, хитрість полягає в тому, що echo 1 > bind
він повинен працювати лише для драйверів консолі, які побудовані як модуль (?!).
Що стосується конкретних консолей framebuffer , тут є додаткова інформація про прив'язку різних пристроїв Framebuffer ( /dev/fb0
...) до певних віртуальних консолей https://kernel.org/doc/Documentation/fb/fbcon.txt . Це включає в себе параметр ядра fbcon:map=
або команду під назвою con2fbmap
.
Звичайно, деталі можуть змінюватись у різних версіях ядра, архітектурі, прошивках, пристроях, драйверах і т. Д. Мені ніколи не довелося використовувати жоден з вищевказаних інтерфейсів. Ядро просто дозволяє i915
/ inteldrmfb
/ все, що ви хочете викликати, переймати його під час завантаження, замінюючи, наприклад vgacon
.
Схоже, моєї машини EFI ніколи не було vgacon
. Отже, по-перше, він використовує фіктивну консоль, а по-друге через 1,2 секунди перемикається на fbcon
, працює на вершині efifb
. Але поки що мені не було байдуже, які деталі є; це просто працює.
$ dmesg | grep -C2 [Cc]onsole
[ 0.230822] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[ 0.233164] NR_IRQS: 65792, nr_irqs: 728, preallocated irqs: 16
[ 0.233346] Console: colour dummy device 80x25
[ 0.233571] console [tty0] enabled
[ 0.233585] ACPI: Core revision 20180810
[ 0.233838] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484882848 ns
--
[ 1.228393] efifb: scrolling: redraw
[ 1.228396] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
[ 1.230393] Console: switching to colour frame buffer device 170x48
[ 1.232090] fb0: EFI VGA frame buffer device
[ 1.232110] intel_idle: MWAIT substates: 0x11142120
--
[ 3.595838] checking generic (e0000000 408000) vs hw (e0000000 10000000)
[ 3.595839] fb: switching to inteldrmfb from EFI VGA
[ 3.596577] Console: switching to colour dummy device 80x25
[ 3.596681] [drm] Replacing VGA console driver
[ 3.597159] [drm] ACPI BIOS requests an excessive sleep of 20000 ms, using 1500 ms instead
[ 3.599830] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
--
[ 3.657050] e1000e 0000:00:19.0 eth0: MAC: 11, PHY: 12, PBA No: FFFFFF-0FF
[ 3.657869] e1000e 0000:00:19.0 eno1: renamed from eth0
[ 4.711453] Console: switching to colour frame buffer device 170x48
[ 4.734356] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
[ 4.778813] Loading iSCSI transport class v2.0-870.
2. "Для чого /dev/console
використовується?"
Ви можете використовувати / dev / console як пристрій TTY. Наприклад, записавши його, він запише на певний базовий пристрій, який також матиме власний номер пристрою символів.
Часто / dev / console прив’язується до / dev / tty0, але іноді він може бути прив'язаний до іншого пристрою.
Так що в цьому випадку запис у / dev / console буде писати в / dev / tty0. А в свою чергу, запис на / dev / tty0 еквівалентний запису на той, хто / dev / ttyN пристрій зараз активний.
Але це викликає цікаве питання. Доступ tty0
матиме доступ до різних віртуальних консолей, залежно від того, яка зараз активна. Для чого насправді користуються люди tty0
, а також те, що console
використовується для Linux?
Технічно ви можете читати і писати з console
/ tty0
, наприклад, запускаючи a, getty
щоб дозволити входити в систему tty0
. Але це корисно лише як швидкий злом. Тому що це означає, що ви не можете скористатися декількома віртуальними консолями Linux.
systemd
шукає sysfs
атрибут, пов'язаний з пристроєм / dev / console, для виявлення базового пристрою TTY. Це дозволяє systemd
автоматично нерестувати a getty
і дозволяти входити, наприклад, на послідовну консоль, коли користувач налаштовує консоль ядра, завантажуючись із console=ttyS0
. Це зручно; це дозволяє уникнути необхідності налаштування цієї консолі у двох різних місцях. Знову див man systemd-getty-generator
. Однак systemd
насправді /dev/console
для цього не відкрито .
Під час завантаження системи у вас, можливо, ще не встановлено sysfs. Але ви хочете якнайшвидше показати повідомлення про помилки та прогрес! Тож обводимо навколо точки 1). Ядро запускає PID 1 із підключеним stdin / stdout / stderr /dev/console
. Дуже приємно, щоб цей простий механізм був налаштований з самого початку.
Всередині контейнера Linux файл у файлі /dev/console
може бути створений як щось інше - не номер символьного пристрою 5:1
. Натомість він може бути створений як файл пристрою PTS. Тоді було б сенс увійти через цей /dev/console
файл. systemd
всередині контейнера дозволять увійти на такий пристрій; див man systemd-getty-generator
.
Цей механізм використовується при запуску контейнера з systemd-nspawn
командою. (Я думаю, що тільки коли ти працюєш systemd-nspawn
на TTY, хоча я не можу сказати з пошуку сторінки людини).
systemd-nspawn
створює контейнер /dev/console
як зв'язувальне кріплення пристрою PTS з хостом. Це означає, що цей пристрій PTS не видно всередині /dev/pts/
контейнера.
Пристрої PTS локально визначені devpts
. Пристрої PTS є винятком із звичайного правила, яке визначається за їх номером. Пристрої PTS ідентифікуються за комбінацією їх номера пристрою та їх devpts
монтажу.
Ви можете писати термінові повідомлення в console
/ tty0
, записувати на поточну віртуальну консоль користувача. Це може бути корисно для термінових повідомлень про помилки в просторі користувачів, подібних до термінових повідомлень ядра, які надруковані на консоль (див. man dmesg
). Однак це не звичайно робити, принаймні після того, як система закінчить завантаження.
rsyslog має на цій сторінці один приклад , який друкує повідомлення ядра /dev/console
; для Linux це безглуздо, оскільки ядро вже буде робити це за замовчуванням. Один із прикладів, які я не можу знову знайти, говорить про те, що використовувати це для повідомлень, що не містять ядро, не дуже добре, оскільки в системі занадто багато повідомлень syslog, ви заливаєте консоль, і це стає занадто сильним.
У systemd-journald аналогічно є варіанти для пересилання всіх журналів на консоль. В принципі це може бути корисно для налагодження у віртуальному середовищі. Хоча, для налагодження ми зазвичай переадресовуємо /dev/kmsg
натомість. Це зберігає їх у буфері журналу ядра, щоб ви могли їх читати dmesg
. Як і повідомлення, згенеровані самим ядром, ці повідомлення можуть перегукуватися на консолі залежно від поточної конфігурації ядра.