Некоторая путанная концепция: ptmx и tty

Все следующие команды выполняются в моем терминале Debian.

ls /dev |grep ptmx /dev/ptmx ls /dev/pts 0 1 ptmx 

В чем разница между /dev/ptmx и /dev/pts/ptmx ?

 ls /dev/tty* |sort /dev/tty /dev/tty0 /dev/tty1 /dev/tty10 

Есть ли связь между / dev / tty и / dev / tty0 (/ dev / tty1 ….)?
/ dev / tty контролирует все остальные / dev / tty [число]?

/dev/ptmx является стандартным, /dev/pts/ptmx добавляется для контейнеров программного обеспечения (Docker и т. д.) и в других случаях, когда вам требуется несколько экземпляров файловой системы devpts .

Природа узлов устройства

Вы должны понимать, что «магия» узла устройства заключается не в его имени, а в основных и вспомогательных номерах устройств, которые он создан для воплощения.

Например, если у вас есть соответствующая привилегия, вы можете использовать mknod для создания узла символьного устройства с основным 1 и второстепенным 3 с любым именем в любой файловой системе в стиле Unix, и – если файловая система не имеет nodev монтирования nodev – она ​​будет ведут себя точно так же, как /dev/null , потому что для всех намерений и целей это будет еще одна реализация /dev/null .

Аналогично, и /dev/pts/ptmx и /dev/ptmx являются символьными устройствами с основным номером 5 и /dev/ptmx номером 2. Таким образом, они обеспечат доступ к точно такой же функциональности в ядре.

 $ ls -l /dev/ptmx /dev/pts/ptmx crw-rw-rw- 1 root tty 5, 2 Jun 12 20:14 /dev/ptmx c--------- 1 root root 5, 2 Jun 12 12:26 /dev/pts/ptmx 

Тип узла устройства (символ или блок) и старшие и младшие номера устройств вместе определяют, с каким драйвером устройства ядра взаимодействует этот узел устройства. Ядро не заботится об именах – оно предоставляет имена по умолчанию для udev , но вы можете полностью переделать схему именования устройств, если захотите. Вы можете создавать узлы устройства вне /dev , если вам нужно.

В Debian 9 разрешения /dev/pts/ptmx по умолчанию установлены на 000, поэтому использовать его не предполагается. Аналогично в RHEL 7.5.

Комментарий в исходном тексте ядра 4.17 гласит:

 /* * ptmx is a new node in /dev/pts and will be unused in legacy (single- * instance) mode. To prevent surprises in user space, set permissions of * ptmx to 0. Use 'chmod' or remount with '-o ptmxmode' to set meaningful * permissions. */ 

«Режим одного экземпляра» означает использование в качестве системы, соответствующей стандартам UNIX98 и Single Unix Specification v1. Поэтому очень важна обратная совместимость.

Возможность нескольких экземпляров для devpts была разработана для поддержки контейнеров. Это можно подтвердить, прочитав старые версии /Documentation/filesystems/devpts.txt начиная с 2009 года :

Для поддержки контейнеров мы теперь разрешаем несколько экземпляров файловой системы devpts, так что индексы ptys, выделенные в одном экземпляре, не зависят от индексов, распределенных в других экземплярах devpts.

Чтобы сохранить обратную совместимость, эта поддержка для нескольких экземпляров включается, только если:

  • CONFIG_DEVPTS_MULTIPLE_INSTANCES = y и
  • ‘-o newinstance’ опция монтирования указана при монтировании devpts

Теперь, devpts теперь поддерживает семантику как одного, так и нескольких экземпляров.

Когда контейнеры используются, они обычно инициализируют совершенно новое пространство имен для псевдо-TTY и могут монтировать другой экземпляр файловой системы devpts в контейнере (это может быть даже опущено, если поддержка псевдо-TTY внутри контейнера не требуется). Наличие записи devpts файловой системе devpts может быть полезно для минимизации работы, необходимой для инициализации среды внутри контейнера.