Linux
/dev/pts/ptmx
來自哪裡?
在我的 Archlinux 上,
/dev/pts
是由 devpts 掛載的,那麼誰創建了/dev/pts/ptmx
設備節點?這個節點的目的是什麼?和 一樣(Major=5 Minor=2)設備節點/dev/ptmx/
,但是訪問方式不同,為什麼?
用於偽終端從設備的舊 AT&T System 5 機制是它們是
/dev
. 有一個多路復用器主設備/dev/ptmx
。用於偽終端設備的舊4.3BSD 機制在/dev
. 這些是普通磁碟文件系統上的特殊設備節點。在 OpenBSD 上,其中一些現在仍然適用。
/dev
仍然是磁碟捲,從設備仍然是真正的磁碟節點。但是,它們是按需創建的。當在設備上發出PTMGET
I/O 控制時,核心會在內部發出相關呼叫以在那裡創建新的設備節點/dev/ptm
。在 FreeBSD 上,這些都不是真的。甚至不再有多路復用器設備。
/dev
根本不是光碟捲。它是一個devfs
文件系統。從設備出現在devfs
其pts/
目錄下的文件系統中以響應posix_openpt()
系統呼叫,這是一個徹底的系統呼叫,而不是包裝ioctl()
在某個“多路復用器”設備的打開文件描述符上。有一段時間,在 Linux 上,偽終端從設備是持久設備節點。您正在查看的是它的“新”
devpts
文件系統(其中“新”意味著幾年前引入,現在)與devtmpfs
. 這幾乎允許在 FreeBSD 上使用devfs
.但也有一些區別。特別是,還有一個“多路復用器”設備。
- 在舊的“新”
devpts
系統中,這是ptmx
不同devtmpfs
文件系統中的設備,devpts
文件系統僅包含自動創建/銷毀的從設備文件。傳統上,該設置是/dev/ptmx
和一個隨附的devpts
安裝在/dev/pts
.- 但是 Linux 人希望有多個完全獨立的文件系統實例
devpts
,用於容器等,當有很多devtmpfs
文件系統時,要同步(正確的)兩個文件系統是相當困難的devpts
。因此,在較新的“新”devpts
系統中,所有設備,多路復用器和從設備,都在一個文件系統中。為了向後兼容,預設設置ptmx
是無法訪問新節點,除非設置了新的ptmxmode
掛載選項。在向後兼容模式下,人們仍然可以以舊的單實例方式執行事物,並且預設情況下會這樣做,除非newinstance
在掛載devpts
.- 在更新的仍然“新”
devpts
(自 2016 年以來一直存在)中,devpts
文件系統中的每個實例多路復用器設備現在是主多路復用器,ptmx
其中devtmpfs
是核心提供的一個 shim,它試圖模仿符號連結,綁定掛載,或到pts/ptmx
. 多實例方式現在是唯一的方式。進一步閱讀
- https://unix.stackexchange.com/a/470853/5132
- 解決這個 glibc 問題的最佳方法是什麼?
- https://unix.stackexchange.com/a/214685/5132
Documentation/filesystems/devpts.txt
. Linux 核心。- 丹尼爾·伯蘭奇 (2009-05-20)。
/dev/pts
必須使用“newinstance”掛載標誌來避免容器的安全問題。紅帽錯誤 #501718。- 埃里克·W·比德曼 (2015-12-11)。 devpts:明智的 /dev/ptmx 和強制 newinstance。Linux 核心郵件列表。
- 埃里克·W·比德曼 (2016-04-08)。 devpts:教 /dev/ptmx 通過路徑查找找到關聯的 devpts。Linux 核心郵件列表。