Linux

了解 /dev 及其子目錄和文件

  • April 21, 2019
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. 我想知道是否所有文件/dev及其子目錄都是設備的文件描述符?
  2. 為什麼彼此之間有這麼多連結?例如,/dev/fd/0/dev/stdin/proc/self/fd/0都是指向 的連結/dev/pts/2
  3. 如果llrwx------平均連結中,ccrw--w---- 意味著什麼?

幾乎所有的文件/dev都是設備文件。讀取和寫入正常文件將數據儲存在磁碟或其他文件系統上,而訪問設備文件則與核心中的驅動程序進行通信,核心中的驅動程序通常又與硬體(硬體設備,因此得名)進行通信。

有兩種類型的設備文件:塊設備(由b的輸出中的第一個字元ls -l表示)和字元設備(由 表示c)。塊設備和字元設備之間的區別並不完全通用。塊設備類似於磁碟,其行為類似於大型、固定大小的文件:如果您在某個偏移量處寫入一個字節,然後在該偏移量處從設備中讀取,您將獲得該字節。字元設備幾乎是其他任何東西,寫入一個字節會立即產生效果(例如,它在串列線路上發出),而讀取一個字節也有一些立即效果(例如,它是從串列埠讀取的)。

設備文件的含義取決於其編號,而不是名稱(名稱對應用程序很重要,但對核心無關)。該數字實際上是兩個數字:主要數字表示哪個驅動程序負責該設備,次要數字允許驅動程序驅動多個設備¹。這些數字出現在ls -l列表中,您通常可以在其中找到文件大小。例如brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→這個設備是major 8,minor 0。

下面的一些設備文件/dev與硬體設備不對應。每個 Unix 系統上都存在的一個是/dev/null; 寫入它沒有效果,並且從它讀取永遠不會返回任何數據。當您想忽略命令的輸出 ( >/dev/null) 或執行沒有輸入的命令 ( ) 時,這在 shell 腳本中通常很方便</dev/null。其他常見的例子是/dev/zero(它返回空字節ad infinitum/dev/urandom(它返回隨機字節ad infinitum)。

一些設備文件的含義取決於訪問它的程序。例如,/dev/stdin指定目前程序的標準輸入;opens from 與打開作為程序標準輸入打開的原始文件的效果大致相同。有點類似,/dev/tty指定程序連接到的終端。在 Linux 下,現在/dev/stdin和朋友不是作為字元設備實現的,而是作為符號連結到一個更通用的機制,允許引用每個文件描述符(而不是傳統方法下只有 0、1 和 2);例如/dev/stdin是一個符號連結到/proc/self/fd/0. 請參閱/dev/fd 與 /proc/self/fd/ 有何關係?.

您會在 下找到許多符號連結/dev。這可能由於歷史原因而發生:設備文件從一個名稱移動到另一個名稱,但某些應用程序仍使用舊名稱。比如是Linux下/dev/scd0的符號連結;/dev/sr0兩者都指定第一個 CD 設備。符號連結的另一個原因是組織:在 Linux 下,你會在幾個地方找到你的硬碟和分區:/dev/sda/dev/sda1朋友(每個磁碟由任意字母指定,分區根據分區佈局),/dev/disk/by-id/*(由唯一的序列號),/dev/disk/by-label/*(具有文件系統的分區,由人工選擇的標籤指定);和更多。當通用設備名稱可能是幾個之一時,也使用符號連結;例如/dev/dvd可能是指向 的符號連結/dev/sr0,或者/dev/sr1如果您有兩個 CD 閱讀器並且第二個是預設 DVD 閱讀器,則它可能是指向的連結。

/dev最後,由於傳統原因,您可能會在 下找到一些其他文件。您不會在每個系統上都找到相同的。在大多數 unice 上,/dev/log是程序用來發出日誌消息的套接字。/dev/MAKEDEV是一個在 中創建條目的腳本/dev。在現代 Linux 系統上,條目/dev/udev自動創建,已過時MAKEDEV

¹ 這在 Linux 下實際上不再適用,但這個細節只對設備驅動程序編寫者很重要。

引用自:https://unix.stackexchange.com/questions/18239