Для чого використовується `/ 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є керуючим терміналом сеансу процесу процесу і може бути пунктом, /dev/ttynде nвід 1 до 63 або більше?)

В іншій відповіді згадується:

Документація ядра вказує /dev/consoleяк символьний пристрій під номером 5: 1. Відкриваючи цей символьний пристрій, відкривається "головна" консоль, яка є останньою в списку консолей.

Чи означає "список консолей" все console=, що знаходиться у варіанті завантаження ?

Під " /dev/consoleсимвольним пристроєм із номером 5: 1" це означає, що /dev/consoleце файл пристрою фізичного текстового терміналу, тобто системної консолі? (Знову ж таки, перша відповідь, яку я цитував вище, говорить /dev/consoleпро те, /dev/tty0що це не фізичний текстовий термінал, а віртуальна консоль)

Дякую.


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

Відповіді:


18

/dev/consoleіснує насамперед для того, щоб відкрити консоль ядра в просторі користувачів. У документації Linux Kernel на пристроях тепер говорить

Консольний пристрій, /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дійсно забезпечує доступ до останнього з них :

У командному рядку ядра можна вказати кілька консолей = опцій. Вихідні дані з’являться на всіх них. Останній пристрій буде використаний під час відкриття /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на активний, він, схоже, переходить на манекен. (Графічні інтерфейси графічного інтерфейсу, здається, не зачіпаються, але текстові графіки перестають працювати) Писати 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?

  1. Технічно ви можете читати і писати з console/ tty0, наприклад, запускаючи a, 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 файл у файлі /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монтажу.

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

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

    У systemd-journald аналогічно є варіанти для пересилання всіх журналів на консоль. В принципі це може бути корисно для налагодження у віртуальному середовищі. Хоча, для налагодження ми зазвичай переадресовуємо /dev/kmsgнатомість. Це зберігає їх у буфері журналу ядра, щоб ви могли їх читати dmesg. Як і повідомлення, згенеровані самим ядром, ці повідомлення можуть перегукуватися на консолі залежно від поточної конфігурації ядра.


Як доповнення до пункту 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/tty{1..63}, який зараз використовується чимось (можливо, процесом ядра чи оболонки?)" - ядром.
sourcejedi

Що таке файл пристрою, що представляє сам фізичний термінал, а не стосовно ядра чи процесу?
Тім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.