Для чего используется `/ dev / console`?

13

Из этого ответа для 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/consoleвыглядит как файл устройства текстового физического терминала, так же как /dev/tty{1..63}файлы устройств для виртуальных консолей.

По словам « /dev/consoleи /dev/tty0представляют текущий дисплей и обычно одинаковы», /dev/consoleмне кажется, что это также может быть файл устройства виртуальной консоли. /dev/consoleпохоже больше, /dev/tty0чем нравится /dev/tty{1..63}( /dev/tty0в настоящее время активная виртуальная консоль, и может быть любой из /dev/tty{1..63}).

Что такое /dev/console? Для чего его используют?

Играет ли /dev/consoleядро Linux ту же роль, что /dev/ttyи процесс? ( /dev/ttyявляется управляющим терминалом сеанса процесса и может быть pts, /dev/ttynгде nот 1 до 63 или больше?)

В другом ответе упоминается:

В документации ядра указано /dev/consoleсимвольное устройство с номером 5: 1. При открытии этого символьного устройства открывается «главная» консоль, которая является последним tty в списке консолей.

Есть ли «список консолей» означает все console=«S в варианте загрузки ?

« /dev/consoleКак символьное устройство с номером 5: 1» означает ли это, что /dev/consoleэто файл устройства физического текстового терминала, то есть системной консоли? (Но, опять же, первый ответ, который я цитировал выше, говорит, что это /dev/consoleможет быть /dev/tty0не физический текстовый терминал, а виртуальная консоль)

Благодарю.

Тим
источник
Я создал некоторые замены для тех страниц справочника, которые пропали несколько лет назад: jdebp.eu./Proposals/linux-kvt-manual-pages.html
JdeBP

Ответы:

18

/dev/consoleсуществует главным образом для предоставления консоли ядра пользовательскому пространству. Документация ядра Linux на устройствах теперь говорит

Консольное устройство /dev/console- это устройство, на которое следует отправлять системные сообщения и на котором следует разрешать вход в систему в однопользовательском режиме. Начиная с Linux 2.1.71, /dev/consoleуправляется ядром; для предыдущих версий это должна быть символическая ссылка либо /dev/tty0на конкретную виртуальную консоль, например /dev/tty1, либо на основное (но tty*не cu*) устройство последовательного порта , в зависимости от конфигурации системы.

/dev/consoleузел устройства со старшим 5 и второстепенным 1 обеспечивает доступ ко всему, что ядро ​​считает своими основными средствами взаимодействия с системным администратором; это может быть физическая консоль, подключенная к системе (с абстракцией виртуальной консоли сверху, так что она может использовать tty0или любую, ttyNгде N находится между 1 и 63), или последовательная консоль, или консоль гипервизора, или даже устройство Брайля. Обратите внимание, что само ядро ​​не использует /dev/console: узлы устройств предназначены для пространства пользователя, а не для ядра; он, однако, проверяет, что /dev/consoleсуществует и может использоваться, и настраивается initсо стандартным вводом, выводом и ошибкой, указывающими на /dev/console.

Как описано здесь, /dev/consoleэто символьное устройство с фиксированным основным и второстепенным, потому что это отдельное устройство (например, средство доступа к ядру; не физическое устройство), не эквивалентное /dev/tty0или любое другое устройство. Это несколько похоже на ситуацию, в/dev/tty которой находится его собственное устройство (5: 0), поскольку оно предоставляет немного отличающиеся функции, чем другие виртуальные консоли или терминальные устройства.

«Список консолей» - это действительно список консолей, определяемых console=параметрами загрузки (или консоль по умолчанию, если таковых нет). Вы можете увидеть консоли, определенные таким образом, посмотрев на /proc/consoles. /dev/consoleдействительно предоставляет доступ к последнему из них :

Вы можете указать несколько параметров console = в командной строке ядра. Вывод появится на всех них. Последнее устройство будет использоваться при открытии /dev/console.

Стивен Китт
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Тердон
6

"Что такое /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?

  1. Технически вы можете читать и писать из console/ tty0, например, запустив, gettyчтобы разрешить вход в систему tty0. Но это полезно только как быстрый взлом. Потому что это означает, что вы не можете использовать преимущества нескольких виртуальных консолей Linux.

  2. systemdищет sysfsатрибут, связанный с устройством / dev / console, чтобы обнаружить базовое устройство TTY. Это позволяет systemdавтоматически порождать a gettyи разрешать вход в систему, например, на последовательной консоли, когда пользователь настраивает консоль ядра путем загрузки с console=ttyS0. Это удобно; это избавляет от необходимости настраивать эту консоль в двух разных местах. Снова смотри man systemd-getty-generator. Однако на systemdсамом деле не открывается /dev/consoleдля этого.

  3. Во время начальной загрузки системы у вас может даже не быть sysfs. Но вы хотите иметь возможность показывать сообщения об ошибках и прогресс как можно скорее! Итак, мы обходим вокруг пункта 1). Ядро запускает PID 1 с подключенным stdin / stdout / stderr /dev/console. Очень приятно иметь этот простой механизм с самого начала.

  4. Внутри контейнера 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подключения.

  5. Вы можете писать срочные сообщения в console/ tty0, чтобы записать в текущую виртуальную консоль пользователя. Это может быть полезно для срочных сообщений об ошибках в пользовательском пространстве, аналогично срочным сообщениям ядра, которые выводятся на консоль (см. man dmesg). Однако это не распространено, по крайней мере, после завершения загрузки системы.

    rsyslog имеет один пример на этой странице , который печатает сообщения ядра /dev/console; в Linux это бессмысленно, потому что ядро ​​уже сделает это по умолчанию. Один пример, который я не могу найти снова, говорит о том, что не стоит использовать это для сообщений, не относящихся к ядру, потому что слишком много сообщений системного журнала, вы заполняете консоль, и она слишком сильно мешает.

    systemd-journald также имеет опции для пересылки всех журналов на консоль. В принципе это может быть полезно для отладки в виртуальной среде. Хотя для отладки мы обычно ждем /dev/kmsgвместо этого. Это сохраняет их в буфере журнала ядра, чтобы вы могли читать их с помощью dmesg. Как и сообщения, сгенерированные самим ядром, эти сообщения могут выводиться на консоль в зависимости от текущей конфигурации ядра.

sourcejedi
источник
В качестве дополнения к пункту 2, он обычно (не только в Linux) запускался xconsoleдля отслеживания происходящего ;-). (И чтобы избежать записи сообщений непосредственно в кадровый буфер, например, на SPARCstations.)
Стивен Китт
@StephenKitt, когда я впервые использовал SUSE Linux, я думаю, что он запустил xconsole или улучшил его, чтобы вы могли запустить его из главного меню рабочего стола, или что-то еще - я точно не помню, но я видел это :-).
Sourcejedi
Позвольте мне попытаться понять это. /dev/tty{1..63}и /dev/pts/nявляются файлами устройств, представляющими сами устройства (хотя они являются эмуляциями), а не по отношению к процессу или ядру. /dev/tty0представляет тот, в /dev/tty{1..63}котором в данный момент что-то используется (может, процесс ядра или оболочки?). /dev/ttyпредставляет управляющий терминал, в настоящее время используемый сеансом процесса. /dev/consoleпредставляет терминал, используемый в настоящее время ядром? Что представляет собой файл устройства, представляющий сам физический терминал, а не по отношению к ядру или процессу?
Тим
@Tim "/ dev / tty0 представляет файл в /dev/ttyndom1..63}, который в данный момент используется чем-то (возможно, процессом ядра или оболочки?)" - ядром.
Sourcejedi
Что представляет собой файл устройства, представляющий сам физический терминал, а не по отношению к ядру или процессу?
Тим