В системе Linux, в чем разница /dev/console
, /dev/tty
и /dev/tty0
?
Каково их соответствующее использование и как они сравниваются?
В системе 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/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
всегда текущая консоль.
$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
sudo -i
, а вуаля - корневая оболочка.
sudo anycommand
работает, то sudo -i
и рут тоже работает. Не существует такой вещи, как Linux / BSD / Unix, где вы не можете получить root-права. (Тогда это больше не будет Linux / BSD / Unix.)
/dev/console
это виртуальный набор устройств, который можно установить в качестве параметра во время загрузки. Он может быть перенаправлен на последовательное устройство или виртуальную консоль и по умолчанию указывает на /dev/tty0
. Когда console=
в ядро передается несколько опций, вывод консоли будет идти на более чем одно устройство.
/dev/tty0
текущая виртуальная консоль
/dev/tty[1-x]
это один из виртуальных консолей вы переключитесь с control- alt- F1и так далее.
/dev/tty
это своего рода псевдоним консоли (физического, виртуального или псевдоустройства, если таковое имеется), связанный с процессом, который его открывает. В отличие от других устройств, вам не нужны привилегии root для записи на него. Также обратите внимание, что такие процессы, как запущенные cron
и подобные пакетные процессы, не могут быть использованы /dev/tty
, поскольку они не связаны ни с какими. Эти процессы есть ?
в TTY
столбце ps -ef
вывода.
/dev/tty
может быть другое устройство, если оно есть, в зависимости от процесса, который его открывает. Ответ обновлен.
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
.
Узлы устройства Linux TTY tty1
через tty63
виртуальные терминалы. Их также называют VT или виртуальными консолями. Они моделируют несколько консолей поверх физического драйвера устройства консоли. Только одна виртуальная консоль отображается и контролируется одновременно. Активный терминал может быть переключен, например, используя chvt
, или Ctrl + Alt + F1 через любое количество функциональных клавиш, которые у вас есть.
Вы также можете читать и писать в текущий VT, используя /dev/tty0
. tty0
обычная консоль ядра, например, если вы не выбрали явно. «Система сначала ищет VGA-карту [на которой работают VT], а затем - последовательный порт». Вы также можете установить консоль на определенный VT, например console=tty1
.
«Если в вашей системе нет карты VGA, первый последовательный порт автоматически станет консолью». Подобно «последовательной консоли», ttyS0
вероятно, является наиболее распространенной альтернативой tty0
. Невозможно использовать систему VT поверх последовательной консоли.
/dev/tty
является одним из трех стандартных файлов устройств, указанных в POSIX ( /dev/
это одно из трех имен каталогов, указанных в POSIX). Открытие его эквивалентно открытию управляющего терминала текущего процесса. Управляющий терминал устанавливается, когда процесс впервые открывает терминал, по крайней мере, в Linux . Например, в init
, это будет относиться к /dev/console
.
Отсоединение от управляющего терминала является одним из шагов, традиционно необходимых для запуска фонового процесса, например , демона системного входа . Шаги, чтобы стать фоновым процессом, ужасно запутаны, но, если быть точным, шаг, который отсоединяется от управляющего терминала, является системным вызовом setsid . В более современных системах система init, например, systemd, запускает службу без какого-либо управляющего терминала.