Linux: разница между / dev / console, / dev / tty и / dev / tty0

133

В системе Linux, в чем разница /dev/console, /dev/ttyи /dev/tty0?

Каково их соответствующее использование и как они сравниваются?

Аксель Фонтейн
источник
3
Вы также можете быть заинтересованы в этом
Кевин

Ответы:

93

Из документации :

/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:

Переключитесь на 2-ую консоль нажатием Ctrl+ Alt+ F2. Войти как root. Тип sleep 5; echo tty0 > /dev/tty0. Нажмите Enterи переключитесь на 3-ю консоль, нажав Alt+ F3. Теперь переключитесь обратно на 2-ю консоль, нажав Alt+ F2. Введите sleep 5; echo tty > /dev/tty, нажмите Enterи переключитесь на 3-ю консоль.

Вы можете видеть, что ttyэто консоль, с которой начинается процесс, и tty0всегда текущая консоль.

dchirikov
источник
6
хорошее упражнение! Ubuntu блокирует root, поэтому один из способов воспроизвести это на Ubuntu:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28
10
@ SFun28, я всегда использовал sudo -i, а вуаля - корневая оболочка.
Андре Ласло
4
одна идиома для записи в файлы, требующие привилегированных прав пользователя, - это echo | sudo tee / dev / tty0> / dev / null;
Питер Кордес
Проклятье. Когда Ī̲ написал unix.stackexchange.com/a/229598/80483 , Ī̲ не знал об этом ответе!
Incnis Mrsi
@ SFun28: если sudo anycommandработает, то sudo -iи рут тоже работает. Не существует такой вещи, как Linux / BSD / Unix, где вы не можете получить root-права. (Тогда это больше не будет Linux / BSD / Unix.)
Evi1M4chine
59
  • /dev/consoleэто виртуальный набор устройств, который можно установить в качестве параметра во время загрузки. Он может быть перенаправлен на последовательное устройство или виртуальную консоль и по умолчанию указывает на /dev/tty0. Когда console=в ядро ​​передается несколько опций, вывод консоли будет идти на более чем одно устройство.

  • /dev/tty0 текущая виртуальная консоль

  • /dev/tty[1-x]это один из виртуальных консолей вы переключитесь с control- alt- F1и так далее.

  • /dev/ttyэто своего рода псевдоним консоли (физического, виртуального или псевдоустройства, если таковое имеется), связанный с процессом, который его открывает. В отличие от других устройств, вам не нужны привилегии root для записи на него. Также обратите внимание, что такие процессы, как запущенные cronи подобные пакетные процессы, не могут быть использованы /dev/tty, поскольку они не связаны ни с какими. Эти процессы есть ?в TTYстолбце ps -efвывода.

jlliagre
источник
Что вы подразумеваете под запросом этого утверждения: «/ dev / tty - консоль, используемая процессом, запрашивающим ее»?
Рон Винс
1
@RonVince Я имею в виду, что это /dev/ttyможет быть другое устройство, если оно есть, в зависимости от процесса, который его открывает. Ответ обновлен.
Jlliagre
Благодарю. Могу я узнать, действительно ли процессы записывают / читают в / из / dev / tty, а не прямо в / из файла устройства, связанного с ними?
Рон Винс
@RonVince Боюсь, я не уверен, что вы спрашиваете. Не могли бы вы перефразировать это?
Jlliagre
1
@RonVince Открытие / dev / tty (не /dev/tty[1,..,n]) - это стандарт Unix (и Linux) для процесса записи чего-либо в пользовательский терминал. Непосредственная запись на любое другое устройство является непереносимой, более сложной и менее надежной. Процесс не должен знать, к какому фактическому устройству подключен терминал процесса, ядро ​​это уже знает.
Jlliagre
20

/ DEV / консоли

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). При открытии этого символьного устройства открывается «главная» консоль, которая является последним tty в списке консолей. Первый неядерный процесс, называемый initили «PID 1», запускается с /dev/consoleподключением к стандартному выводу, стандартной ошибке и стандартному вводу.

Если ни одна из консолей не является tty, то открытие /dev/consoleвозвращает ошибку ENODEV(«Нет такого устройства»). Ядро будетРаспечататьзарегистрировать сообщение и начать initнезависимо. Для примера консоли ядра, которая не является устройством tty, см. netconsoleИли моя любимая консоль линейный принтер .

Вы также можете увидеть список tty консолей, прочитав /sys/class/tty/console/active. В документации systemd указывается, что первое показанное устройство является главной консолью. Список на самом деле в обратном порядке командной строки ядра. В текущей документации ядра неверно указано, что последнее показанное устройство является основной или «активной» консолью. По какой-то причине возможно опросить этот файл на предмет изменений (в случае удаления консольных устройств?).

Внутри systemd-nspawnконтейнера стандартный /dev/consoleфайл заменяется псевдо-терминальным устройством (PTY). Их лучше всего описать как виртуальные терминальные устройства. Они создаются динамически, а также используются для реализации графических эмуляторов терминала, таких как GNOME Terminal, и для удаленного доступа ssh.

/ DEV / tty0

Узлы устройства Linux TTY tty1через tty63виртуальные терминалы. Их также называют VT или виртуальными консолями. Они моделируют несколько консолей поверх физического драйвера устройства консоли. Только одна виртуальная консоль отображается и контролируется одновременно. Активный терминал может быть переключен, например, используя chvt, или Ctrl + Alt + F1 через любое количество функциональных клавиш, которые у вас есть.

Вы также можете читать и писать в текущий VT, используя /dev/tty0. tty0обычная консоль ядра, например, если вы не выбрали явно. «Система сначала ищет VGA-карту [на которой работают VT], а затем - последовательный порт». Вы также можете установить консоль на определенный VT, например console=tty1.

«Если в вашей системе нет карты VGA, первый последовательный порт автоматически станет консолью». Подобно «последовательной консоли», ttyS0вероятно, является наиболее распространенной альтернативой tty0. Невозможно использовать систему VT поверх последовательной консоли.

/ DEV / TTY

/dev/ttyявляется одним из трех стандартных файлов устройств, указанных в POSIX ( /dev/это одно из трех имен каталогов, указанных в POSIX). Открытие его эквивалентно открытию управляющего терминала текущего процесса. Управляющий терминал устанавливается, когда процесс впервые открывает терминал, по крайней мере, в Linux . Например, в init, это будет относиться к /dev/console.

Отсоединение от управляющего терминала является одним из шагов, традиционно необходимых для запуска фонового процесса, например , демона системного входа . Шаги, чтобы стать фоновым процессом, ужасно запутаны, но, если быть точным, шаг, который отсоединяется от управляющего терминала, является системным вызовом setsid . В более современных системах система init, например, systemd, запускает службу без какого-либо управляющего терминала.

sourcejedi
источник