"Что такое /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
активному, он переключается на фиктивный. (VT GUI кажутся незатронутыми, но текстовые VT перестают работать). Письмо 1
для фиктивного не активирует его. Любой метод работает, чтобы вернуться к реальному. Если я правильно прочитал код, дело в том, что echo 1 > bind
он должен работать только для драйверов консоли, которые построены как модуль (?!).
В частности, для консолей с кадровым буфером есть дополнительная информация о привязке различных устройств кадрового буфера ( /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
, например, запустив, 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 файл at /dev/console
может быть создан как нечто иное, а не символьный номер устройства 5:1
. Вместо этого он может быть создан как файл устройства PTS. Тогда имеет смысл войти через этот /dev/console
файл. systemd
внутри контейнера позволит войти на таком устройстве; см man systemd-getty-generator
.
Этот механизм используется при запуске контейнера с помощью systemd-nspawn
команды. (Я думаю, только когда вы работаете systemd-nspawn
на TTY, хотя я не могу судить по поиску на странице man).
systemd-nspawn
создает контейнер /dev/console
как связывающее устройство устройства PTS с хоста. Это означает, что это устройство PTS не видно внутри /dev/pts/
контейнера.
Устройства PTS являются локальными для определенного devpts
монтирования. Устройства PTS являются исключением из обычного правила: устройства идентифицируются по номеру устройства. Устройства PTS идентифицируются по комбинации номера устройства и их devpts
подключения.
Вы можете писать срочные сообщения в console
/ tty0
, чтобы записать в текущую виртуальную консоль пользователя. Это может быть полезно для срочных сообщений об ошибках в пользовательском пространстве, аналогично срочным сообщениям ядра, которые выводятся на консоль (см. man dmesg
). Однако это не распространено, по крайней мере, после завершения загрузки системы.
rsyslog имеет один пример на этой странице , который печатает сообщения ядра /dev/console
; в Linux это бессмысленно, потому что ядро уже сделает это по умолчанию. Один пример, который я не могу найти снова, говорит о том, что не стоит использовать это для сообщений, не относящихся к ядру, потому что слишком много сообщений системного журнала, вы заполняете консоль, и она слишком сильно мешает.
systemd-journald также имеет опции для пересылки всех журналов на консоль. В принципе это может быть полезно для отладки в виртуальной среде. Хотя для отладки мы обычно ждем /dev/kmsg
вместо этого. Это сохраняет их в буфере журнала ядра, чтобы вы могли читать их с помощью dmesg
. Как и сообщения, сгенерированные самим ядром, эти сообщения могут выводиться на консоль в зависимости от текущей конфигурации ядра.