一些混淆的概念: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
$$ number $$?
/dev/ptmx
是標準的,/dev/pts/ptmx
用於軟體容器(Docker 等)和其他需要多個文件系統實例的情況devpts
。設備節點的性質
您應該意識到,設備節點的“魔力”不在於其名稱,而在於其創建以體現的主要和次要設備編號。
例如,如果您有適當的權限,您可以使用
mknod
任何名稱在任何 Unix 樣式的文件系統中創建一個具有任何名稱的主要 1 和次要 3 的字元設備節點,並且 - 除非文件系統具有nodev
掛載選項 - 它的行為將完全一致就像/dev/null
,因為從所有意圖和目的來看,這將是的另一種實現/dev/null
。同樣,兩者都是主設備號 5
/dev/pts/ptmx
和/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 中。/* * 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
為容器支持開發了多實例功能。這可以通過閱讀2009 年左右的舊版本來<Linux kernel source>/Documentation/filesystems/devpts.txt
確認:為了支持容器,我們現在允許 devpts 文件系統的多個實例,這樣在一個實例中分配的 ptys 的索引獨立於在 devpts 的其他實例中分配的索引。
為了保持向後兼容性,僅在以下情況下啟用對多個實例的支持:
- CONFIG_DEVPTS_MULTIPLE_INSTANCES=y,並且
- 掛載 devpts 時指定了“-o newinstance”掛載選項
IOW,devpts 現在支持單實例和多實例語義。
當容器在使用中時,它們通常會為偽 TTY 初始化一個全新的命名空間,並且可能會在容器內掛載
devpts
文件系統的另一個實例(如果不需要容器內的偽 TTY 支持,這甚至可以省略)。ptmx
文件系統中的條目的存在devpts
可能有助於最小化初始化容器內環境所需的工作。