1. 程式人生 > >Linux 裝置檔案/dev/*詳解、查詢

Linux 裝置檔案/dev/*詳解、查詢

裝置管理是 Linux 中比較基礎的知識,與核心的關係也比較密切。隨著 Udev 的廣泛使用,Linux 發行版的智慧程度越來越高,許多 Linux 新使用者對 /dev 目錄下的東西變得不再熟悉,有時候遇見問題就會抓狂。

Linux 中的裝置按照存取方式的不同,可以分為兩種:

字元裝置:無緩衝且只能順序存取
塊裝置:有緩衝且可以隨機(亂序)存取,而按照是否對應物理實體,也可以分為兩種:
    物理裝置,對實際存在的物理硬體的抽象。
    虛擬裝置,不依賴於特定的物理硬體,僅是核心自身提供的某種功能。

無論是哪種裝置,在 /dev 目錄下都有一個對應的檔案(節點),並且每個裝置檔案都必須有主/次裝置號,主裝置號相同的裝置是同類裝置,使用同一個驅動程式(雖然目前的核心允許多個驅動共享一個主裝置號,但絕大多數裝置依然遵循一個驅動對應一個主裝置號的原則)。可以通過 cat /proc/devices 命令檢視當前已經載入的裝置驅動程式的主裝置號。

注意:在 /dev 目錄下除了各種裝置節點之外還通常還會存在:FIFO管道、Socket、軟/硬連線、目錄。這些東西並不是裝置檔案,因此也就沒有主/次裝置號。

裝置檔案

瞭解這些裝置的最基本要求就是對每個裝置檔案的含義瞭如指掌,下面列出了 Linux-3.13.2 核心中常見的已註冊裝置及其含義(省略了生僻與罕見的裝置)。

----------------------------------------------------------------------
主裝置號     裝置型別
          次裝置號=檔名      簡要說明
----------------------------------------------------------------------

  0         未命名裝置(例如NFS之類非裝置的掛載)
          0 = 為空裝置號保留

          參見主裝置號為144,145,146的塊裝置,以瞭解"擴充套件區域"(expansion area)


  1 char    記憶體裝置
          1 = /dev/mem         實體記憶體的全映象。可以用來直接存取實體記憶體。
          2 = /dev/kmem        核心看到的虛擬記憶體的全映象。可以用來訪問核心中的內容(檢視核心變數或用作rootkit之類)。
          3 = /dev/null        空裝置。任何寫入都將被直接丟棄(但返回"成功");任何讀取都將得到EOF(檔案結束標誌)。
          4 = /dev/port        存取I/O埠
          5 = /dev/zero        零流源。任何寫入都將被直接丟棄(但返回"成功");任何讀取都將得到無限多的二進位制零流。
          7 = /dev/full        滿裝置。任何寫入都將失敗,並把errno設為ENOSPC(沒有剩餘空間);任何讀取都將得到無限多的二進位制零流。
                               這個裝置通常被用來測試程式在遇到磁碟無剩餘空間錯誤時的行為。
          8 = /dev/random      真隨機數發生器。以背景噪聲資料或硬體隨機數發生器作為熵池,讀取時會返回小於熵池噪聲總數的隨機位元組。
                               若熵池空了,讀操作將會被阻塞,直到收集到了足夠的環境噪聲為止。建議用於需要生成高強度金鑰的場合。
                               [注意]雖然允許寫入,但企圖通過寫入此檔案來"預存"隨機數是徒勞的,因為寫入的資料對輸出並無影響。
          9 = /dev/urandom     偽隨機數發生器。更快,但是不夠安全。僅用於對安全性要求不高的場合。
                               即使熵池空了,讀操作也不會被阻塞,而是把已經產生的隨機數做為種子來產生新的隨機數。
                               [注意]雖然允許寫入,但企圖通過寫入此檔案來"預存"隨機數是徒勞的,因為寫入的資料對輸出並無影響。
         10 = /dev/aio         非同步I/O通知介面
         11 = /dev/kmsg        任何對該檔案的寫入都將作為printk的輸出;而讀取則得到printk的輸出緩衝區內容。


  1 block   RAM disk   [已過時,請用TMPFS]
          0 = /dev/ram0        第1個 RAM disk
          1 = /dev/ram1        第2個 RAM disk
            ...

          [說明]將/dev/ram0用作
initrd
的做法已過時(因為它僅針對image-initrd格式),當下的主流是cpio-initrd格式。 4 char TTY(終端)裝置 0 = /dev/tty0 當前虛擬控制檯 1 = /dev/tty1 第1個虛擬控制檯 ... 63 = /dev/tty63 第63個虛擬控制檯 64 = /dev/ttyS0 第1個UART串列埠 ... 255 = /dev/ttyS191 第192個UART串列埠 [說明]"UART串列埠"是指 8250/16450/16550 UART序列控制晶片 4 block 如果根檔案系統以是以只讀方式掛載的,那麼就不可能建立真正的裝置節點, 此時就使用該裝置作為動態分配的主裝置的別名,並掛載為根檔案系統。 0 = /dev/root 5 char 輔助 TTY 裝置 0 = /dev/tty 當前 TTY 裝置 1 = /dev/console 系統控制檯(一般是/dev/tty0) 2 = /dev/ptmx 所有 Unix98 PTY master 的複用器 3 = /dev/ttyprintk 核心通過此裝置使用printk傳送內嵌的使用者訊息(依賴於CONFIG_TTY_PRINTK) 64 = /dev/cua0 對應於 ttyS0 的撥出(Callout)裝置 ... 255 = /dev/cua191 對應於 ttyS191 的撥出(Callout)裝置 7 char 虛擬控制檯捕捉裝置(這些裝置既允許讀也允許寫) 0 = /dev/vcs 當前虛擬控制檯(vc)的文字內容 1 = /dev/vcs1 tty1 的文字內容 ... 63 = /dev/vcs63 tty63 的文字內容 128 = /dev/vcsa 當前虛擬控制檯(vc)的文字/屬性內容 129 = /dev/vcsa1 tty1 的文字/屬性內容 ... 191 = /dev/vcsa63 tty63 的文字/屬性內容 7 block 迴環裝置(用一個普通的檔案來模擬一個塊裝置) 0 = /dev/loop0 第1個迴環裝置 1 = /dev/loop1 第2個迴環裝置 ... [提示]對迴環裝置的繫結由 mount(8) 或
losetup
(8) 處理 8 block SCSI 磁碟(0-15) 0 = /dev/sda 第1個 SCSI 磁碟(整個磁碟) 16 = /dev/sdb 第2個 SCSI 磁碟(整個磁碟) 32 = /dev/sdc 第3個 SCSI 磁碟(整個磁碟) ... 240 = /dev/sdp 第16個 SCSI 磁碟(整個磁碟) 分割槽表示方法如下(以第3個 SCSI 磁碟為例) 33 = /dev/sdc1 第1個分割槽 34 = /dev/sdc2 第2個分割槽 ... 47 = /dev/sdc15 第15個分割槽 [提示]對於DOS分割槽來說,1-4是主分割槽,5-15是邏輯分割槽。但對於GPT分割槽來說,全是主分割槽,沒有邏輯分割槽的概念。 [提示]目前的核心將SATA/PATA/IED硬碟統一使用 /dev/sd* 來表示,已經不再使用 /dev/hd* 這種過時的裝置檔案了。 9 block Metadisk(RAID)裝置 0 = /dev/md0 第1組 metadisk 1 = /dev/md1 第2組 metadisk ... [說明]MD驅動(CONFIG_BLK_DEV_MD)的作用是將同一個檔案系統分割到多個物理磁碟上。 10 char 各種雜項裝置(含非串列埠滑鼠) 1 = /dev/psaux PS/2滑鼠 128 = /dev/beep 能夠讓主機板的蜂鳴器發出不同頻率聲音的裝置(Fancy Beeper Daemon) 130 = /dev/watchdog 看門狗(CONFIG_WATCHDOG) 131 = /dev/temperature 機器內部溫度 135 = /dev/rtc 實時時鐘(Real Time Clock) 143 = /dev/pciconf PCI配置空間 144 = /dev/nvram 非易失配置RAM 151 = /dev/led 發光二極體(LED)燈 152 = /dev/kpoll 核心輪詢(Poll)驅動 156 = /dev/lcd 液晶(LCD)顯示屏 161 = /dev/userdma 使用者空間DMA訪問 162 = /dev/smbus 系統管理匯流排(System Management Bus) 164 = /dev/ipmo Intel的智慧平臺管理(Intelligent Platform Management)介面 165 = /dev/vmmon VMware虛擬機器監視器 170 = /dev/thinkpad/thinkpad Thinkpad裝置 173 = /dev/ipmikcs 智慧平臺管理(Intelligent Platform Management)介面 175 = /dev/agpgart AGP圖形地址重對映表(Graphics Address Remapping Table) 182 = /dev/perfctr 效能監視計數器 183 = /dev/hwrng 通用硬體隨機數發生器 184 = /dev/cpu/microcode CPU微程式碼更新介面(依賴於CONFIG_MICROCODE) 186 = /dev/atomicps 程序狀態資料的原子快照 188 = /dev/smbusbios SMBus(系統管理匯流排) BIOS 189 = /dev/ussp_ctl 使用者空間串列埠控制器 200 = /dev/net/tun TAP/TUN 網路裝置(TAP/TUN以軟體的方式實現了網路裝置) TAP模擬了乙太網幀(第二層),TUN模擬了IP包(第三層)。 202 = /dev/emd/ctl 增強型 Metadisk RAID (EMD) 控制器 203 = /dev/cuse 使用者空間的字元裝置(Character device in user-space) 212 = /dev/watchdogs/0 第一隻看門狗 213 = /dev/watchdogs/1 第二隻看門狗 214 = /dev/watchdogs/2 第三隻看門狗 215 = /dev/watchdogs/3 第四隻看門狗 220 = /dev/mptctl Message passing technology (MPT) control 223 = /dev/input/uinput 使用者層輸入裝置 224 = /dev/tpm TCPA TPM driver 227 = /dev/mcelog X86_64 Machine Check Exception driver 228 = /dev/hpet 高精度事件定時器(HPET) 229 = /dev/fuse Fuse(使用者空間的虛擬檔案系統) 231 = /dev/snapshot 系統記憶體快照 232 = /dev/kvm 核心虛構機(基於AMD SVM和Intel VT硬體虛擬技術) 234 = /dev/btrfs-control Btrfs檔案系統控制裝置 235 = /dev/autofs Autofs控制裝置 236 = /dev/mapper/control 裝置對映(Device-Mapper)控制器 237 = /dev/loop-control 迴環裝置控制器 238 = /dev/vhost-net 用於 virtio net 的宿主核心加速器 11 block SCSI CD-ROM 裝置 0 = /dev/scd0 第1個 SCSI CD-ROM 1 = /dev/scd1 第2個 SCSI CD-ROM ... 13 char 核心輸入裝置 0 = /dev/input/js0 第一個遊戲杆(joystick) 1 = /dev/input/js1 第二個遊戲杆(joystick) ... 32 = /dev/input/mouse0 第1個滑鼠 33 = /dev/input/mouse1 第2個滑鼠 ... 63 = /dev/input/mice 所有滑鼠的合體 64 = /dev/input/event0 第1個事件佇列 65 = /dev/input/event1 第2個事件佇列 ... 14 char OSS(Open Sound System)相容裝置[已過時] 0 = /dev/mixer OSS混音控制器(CONFIG_SND_MIXER_OSS) 1 = /dev/sequencer OSS音序器(CONFIG_SND_SEQUENCER_OSS) 3 = /dev/dsp OSS數字音訊波形輸出裝置(CONFIG_SND_PCM_OSS) 8 = /dev/sequencer2 第二OSS音序器(CONFIG_SND_SEQUENCER_OSS) 16 = /dev/mixer1 第二OSS混音控制器(CONFIG_SND_MIXER_OSS) 19 = /dev/dsp1 第二OSS數字音訊波形輸出裝置(CONFIG_SND_PCM_OSS) 21 char 通用 SCSI 裝置(通常是SCSI光碟機) 0 = /dev/sg0 第1個通用 SCSI 裝置 1 = /dev/sg1 第2個通用 SCSI 裝置 ... [說明]許多發行版還將這些裝置命名為 /dev/sga, /dev/sgb, /dev/sgc ... 29 char 通用幀緩衝(frame buffer)裝置 0 = /dev/fb0 第1個幀緩衝裝置 1 = /dev/fb1 第2個幀緩衝裝置 ... 31 = /dev/fb31 第32個幀緩衝裝置 43 block 網路塊裝置(Network block devices) 0 = /dev/nb0 第1個網路塊裝置 1 = /dev/nb1 第2個網路塊裝置 ... 44 block 快閃記憶體轉換層(Flash Translation Layer)檔案系統 0 = /dev/ftla 第1個MTD(Memory Technology Device)上的FTL 16 = /dev/ftlb 第2個MTD(Memory Technology Device)上的FTL 32 = /dev/ftlc 第3個MTD(Memory Technology Device)上的FTL ... 240 = /dev/ftlp 第16個MTD(Memory Technology Device)上的FTL [說明]分割槽的表示方法與SCSI磁碟相同(最大15個) 65 block SCSI 磁碟(16-31) 0 = /dev/sdq 第17個 SCSI 磁碟(整個磁碟) 16 = /dev/sdr 第18個 SCSI 磁碟(整個磁碟) 32 = /dev/sds 第19個 SCSI 磁碟(整個磁碟) ... 240 = /dev/sdaf 第32個 SCSI 磁碟(整個磁碟) 66 block SCSI 磁碟(32-47) 0 = /dev/sdag 第33個 SCSI 磁碟(整個磁碟) 16 = /dev/sdah 第34個 SCSI 磁碟(整個磁碟) 32 = /dev/sdai 第35個 SCSI 磁碟(整個磁碟) ... 240 = /dev/sdav 第48個 SCSI 磁碟(整個磁碟) 67 block SCSI 磁碟(48-63) 0 = /dev/sdaw 第49個 SCSI 磁碟(整個磁碟) 16 = /dev/sdax 第50個 SCSI 磁碟(整個磁碟) 32 = /dev/sday 第51個 SCSI 磁碟(整個磁碟) ... 240 = /dev/sdbl 第64個 SCSI 磁碟(整個磁碟) 81 char video4linux 0 = /dev/video0 第1個視訊採集裝置(攝像頭) ... 63 = /dev/video63 第64個視訊採集裝置(攝像頭) 64 = /dev/radio0 第1個無線電裝置(收音機之類) ... 127 = /dev/radio63 第64個無線電裝置(收音機之類) 224 = /dev/vbi0 第1個垂直中斷(vertical blank interrupt) ... 255 = /dev/vbi31 第64個垂直中斷(vertical blank interrupt) 89 char I2C 匯流排介面 0 = /dev/i2c-0 第1個 I2C 介面卡 1 = /dev/i2c-1 第2個 I2C 介面卡 ... 90 char 記憶體技術裝置(Memory Technology Device) (RAM, ROM, Flash) 0 = /dev/mtd0 第1個 MTD (讀寫) 1 = /dev/mtdr0 第1個 MTD (只讀) ... 30 = /dev/mtd15 第16個 MTD (讀寫) 31 = /dev/mtdr15 第16個 MTD (只讀) 93 block NAND快閃記憶體轉換層(Flash Translation Layer)檔案系統 0 = /dev/nftla 第1個NFTL層 16 = /dev/nftlb 第2個NFTL層 ... 240 = /dev/nftlp 第16個NFTL層 [說明]分割槽的表示方法與SCSI磁碟相同(最大15個) 98 block 使用者模式下的虛擬塊裝置(分割槽處理方式與 SCSI 磁碟相同) 0 = /dev/ubda 第1個使用者模式塊裝置 16 = /dev/udbb 第2個使用者模式塊裝置 ... 108 char 獨立於特定裝置的 PPP 介面 0 = /dev/ppp 獨立於特定裝置的 PPP 介面(CONFIG_PPP) 117 block 企業卷管理系統(Enterprise Volume Management System) 0 = /dev/evms/block_device EVMS塊裝置 1 = /dev/evms/legacyname1 第1個EVMS傳統裝置 2 = /dev/evms/legacyname2 第2個EVMS傳統裝置 ... 兩個範圍都可以相互延伸(向上/向下)一直到它們相遇 ... 254 = /dev/evms/EVMSname2 第2個EVMS本地裝置 255 = /dev/evms/EVMSname1 第1個EVMS本地裝置 [說明]"legacyname"來源於普通的塊裝置名, 例如 /dev/sda5 將會變成 /dev/evms/sda5 119 char VMware虛擬網路控制器 0 = /dev/vnet0 第1個虛擬網路 1 = /dev/vnet1 第2個虛擬網路 ... 128-135 char Unix98 PTY master 這些裝置不應當存在裝置節點,而應當通過 /dev/ptmx 介面訪問。 136-143 char Unix98 PTY slave 0 = /dev/pts/0 第1個 Unix98 PTY slave 1 = /dev/pts/1 第2個 Unix98 PTY slave ... 這些裝置節點是自動生成的(伴有適當的許可權和模式),不能手動建立。 方法是通過使用適當的 mount 選項(通常是:mode=0620,gid=<"tty"組的gid>) 將 devpts 檔案系統掛載到 /dev/pts 目錄即可。 144 block 用於更多非裝置型掛載的擴充套件區域(Expansion Area)#1 0 = mounted device 256 255 = mounted device 511 145 block 用於更多非裝置型掛載的擴充套件區域(Expansion Area)#2 0 = mounted device 512 255 = mounted device 767 146 block 用於更多非裝置型掛載的擴充套件區域(Expansion Area)#3 0 = mounted device 768 255 = mounted device 1023 147 block DRBD(Distributed Replicated Block Device) 0 = /dev/drbd0 第1個 DRBD 裝置 1 = /dev/drbd1 第2個 DRBD 裝置 ... 153 block EMD(Enhanced Metadisk RAID)儲存單元(分割槽處理方式與 SCSI 磁碟相同) 0 = /dev/emd/0 第1個儲存單元 1 = /dev/emd/0p1 第1個儲存單元的第1個分割槽 2 = /dev/emd/0p2 第1個儲存單元的第2個分割槽 ... 15 = /dev/emd/0p15 第1個儲存單元的第15個分割槽 16 = /dev/emd/1 第2個儲存單元 32 = /dev/emd/2 第3個儲存單元 ... 240 = /dev/emd/15 第16個儲存單元 179 block MMC(MultiMeidaCard)塊裝置 0 = /dev/mmcblk0 第1塊 SD/MMC 卡 1 = /dev/mmcblk0p1 第1塊 SD/MMC 卡的第1個分割槽 8 = /dev/mmcblk1 第2塊 SD/MMC 卡 ... [說明]每個MMC塊裝置保留的次裝置號數量由 CONFIG_MMC_BLOCK_MINORS 決定(預設=8)。 或者也可以通過核心引導引數 mmcblk.perdev_minors 進行修改。 180 char USB字元裝置 0 = /dev/usb/lp0 第1個USB印表機 ... 15 = /dev/usb/lp15 第16個USB印表機 48 = /dev/usb/scanner0 第1個USB掃描器 ... 63 = /dev/usb/scanner15 第16個USB掃描器 96 = /dev/usb/hiddev0 第1個USB人機介面裝置(滑鼠/鍵盤/遊戲杆/手寫版等) ... 111 = /dev/usb/hiddev15 第16個USB人機介面裝置(滑鼠/鍵盤/遊戲杆/手寫版等) 132 = /dev/usb/idmouse ID Mouse (指紋掃描器) 180 block USB塊裝置 0 = /dev/uba 第1個USB塊裝置 8 = /dev/ubb 第2個USB塊裝置 16 = /dev/ubc 第3個USB塊裝置 ... 192 char 核心 profiling 介面 0 = /dev/profile Profiling 控制裝置 1 = /dev/profile0 CPU 0 的 Profiling 裝置 2 = /dev/profile1 CPU 1 的 Profiling 裝置 ... 193 char 核心事件跟蹤介面 0 = /dev/trace 跟蹤控制裝置 1 = /dev/trace0 CPU 0 的跟蹤裝置 2 = /dev/trace1 CPU 1 的跟蹤裝置 ... 195 char Nvidia 圖形裝置(比如顯示卡) 0 = /dev/nvidia0 第1個 Nvidia 卡 1 = /dev/nvidia1 第2個 Nvidia 卡 ... 255 = /dev/nvidiactl Nvidia卡控制裝置 202 char 特定於CPU模式的暫存器(model-specific register,MSR) 0 = /dev/cpu/0/msr CPU 0 的 MSRs 1 = /dev/cpu/1/msr CPU 1 的 MSRs ... 202 block Xen 虛擬塊裝置 0 = /dev/xvda 第1個 Xen 虛擬磁碟(整塊磁碟) 16 = /dev/xvdb 第2個 Xen 虛擬磁碟(整塊磁碟) 32 = /dev/xvdc 第3個 Xen 虛擬磁碟(整塊磁碟) ... 240 = /dev/xvdp 第16個 Xen 虛擬磁碟(整塊磁碟) [說明]分割槽的表示方法與SCSI磁碟相同(最大15個) 203 char CPU CPUID 資訊 0 = /dev/cpu/0/cpuid CPU0的CPUID 1 = /dev/cpu/1/cpuid CPU1的CPUID ... 226 char DRI(Direct Rendering Infrastructure) 0 = /dev/dri/card0 第1個顯示卡 1 = /dev/dri/card1 第2個顯示卡 ... 232 char 生物識別裝置 0 = /dev/biometric/sensor0/fingerprint 第1個裝置的第1個指紋感測器 1 = /dev/biometric/sensor0/iris 第1個裝置的第1個虹膜感測器 2 = /dev/biometric/sensor0/retina 第1個裝置的第1個視網膜感測器 3 = /dev/biometric/sensor0/voiceprint 第1個裝置的第1個聲波感測器 4 = /dev/biometric/sensor0/facial 第1個裝置的第1個面部感測器 5 = /dev/biometric/sensor0/hand 第1個裝置的第1個手掌感測器 ... 10 = /dev/biometric/sensor1/fingerprint 第2個裝置的第1個指紋感測器 ... 20 = /dev/biometric/sensor2/fingerprint 第3個裝置的第1個指紋感測器 ...

/dev 目錄中的其他內容

這部分詳細說明一些應該或可能存在於 /dev 目錄中的其他檔案。連結最好使用與這裡完全相同的格式(絕對路徑或相對路徑)。究竟是使用硬連結(hard)還是軟連線(symbolic)取決於不同的裝置,但最好與這裡給出示範保持一致。

必須的連結

必須在所有的系統上都存在這些連線:

連結             目標             連結型別          簡要說明
------------------------------------------------------------------------
/dev/fd         /proc/self/fd   symbolic        檔案描述符
/dev/stdin      fd/0            symbolic        stdin(標準輸入)檔案描述府
/dev/stdout     fd/1            symbolic        stdout(標準輸出)檔案描述府
/dev/stderr     fd/2            symbolic        stderr(標準錯誤)檔案描述府
/dev/nfsd       socksys         symbolic        僅為 iBCS-2 所必須
/dev/X0R        null            symbolic        僅為 iBCS-2 所必須

推薦的連結

推薦在所有的系統上都存在這些連線:

連結             目標             連結型別          簡要說明
------------------------------------------------------------------------
/dev/core       /proc/kcore     symbolic        為了向後相容
/dev/ramdisk    ram0            symbolic        為了向後相容
/dev/ftape      qft0            symbolic        為了向後相容
/dev/bttv0      video0          symbolic        為了向後相容
/dev/radio      radio0          symbolic        為了向後相容
/dev/i2o*       /dev/i2o/*      symbolic        為了向後相容
/dev/scd?       sr?             hard            代替 SCSI CD-ROM 的名字

本地定義的連結

下面的連結很可能需要根據機器的實際硬體配置建立其中的一部分甚至全部。這些連結僅僅是為了迎合習慣用法,它們既非必須也非推薦。

連結             目標             連結型別          簡要說明
------------------------------------------------------------------------
/dev/mouse      滑鼠裝置        symbolic        當前滑鼠裝置
/dev/tape       磁帶裝置        symbolic        當前磁帶裝置
/dev/cdrom      光碟裝置        symbolic        當前光碟裝置
/dev/cdwriter   燒錄機裝置      symbolic        當前燒錄機裝置
/dev/scanner    掃描器裝置      symbolic        當前掃描器裝置
/dev/modem      調變解調器(貓)   symbolic        當前撥號裝置
/dev/root       根檔案系統裝置   symbolic        當前根檔案系統裝置
/dev/swap       swap裝置       symbolic        當前swap裝置

/dev/modem 不應當用於能夠同時支援接入(dialin)和撥出(dialout)的貓,因為往往會導致鎖檔案問題。如果存在 /dev/modem ,那麼它應當指向一個恰當的主 TTY 裝置。

對於SCSI裝置,/dev/tape 應該指向 /dev/st* ,而 /dev/cdrom 應該指向 /dev/sr* ;而 /dev/cdwriter 和 /dev/scanner 應當分別指向對應的 /dev/sg* 。

/dev/mouse 可以指向一個主序列 TTY 裝置、一個硬體滑鼠、或者一個對應滑鼠驅動程式的套接字(例如 /dev/gpmdata )。

套接字和管道

持久套接字和命名管道可以存在於 /dev 中。常見的有:

/dev/printer    socket          lpd 本地套接字
/dev/log        socket          syslog 本地套接字
/dev/gpmdata    socket          gpm 滑鼠多路複用器(multiplexer)
/dev/initctl    fifo pipe       init 監聽它並從中獲取資訊(使用者與 init 程序互動的通道)

掛載點

以下目錄被保留用於掛載特殊的檔案系統。這些特殊的檔案系統只提供核心介面而不提供標準的裝置節點。

/dev/pts        devpts          PTY slave 檔案系統
/dev/shm        tmpfs           提供對 POSIX 共享記憶體的直接訪問

終端裝置

終端(或TTY)裝置是一種特殊的字元裝置。終端裝置是可以在會話中用作控制終端的任何裝置,包括:虛擬控制檯、序列介面、偽終端(PTY)。

所有終端裝置共享一個通用的功能集合(線路規則),這包含常規的終端線路規程以及SLIP和PPP模式。所有的終端裝置的命名都很相似。這部分內容將解釋命名規則和各種型別的TTY(終端)的使用。需要注意的是這些命名習慣包含了幾個歷史遺留包袱。其中的一些是Linux所特有的,另一些則是繼承自其他系統,還有一些反映了Linux在成長過程中拋棄了原來借用自其它系統的一些習慣。井號(#)在裝置名裡表示一個無前導零的十進位制數。

虛擬控制檯和控制檯裝置

虛擬控制檯是在系統視訊監視器上顯示的全屏終端。虛擬控制檯被命名為 /dev/tty# (編號從 /dev/tty1 開始)。/dev/tty0 是當前虛擬控制檯。/dev/tty0 用於在不能使用幀緩衝裝置(/dev/fb*)的機器上存取系統顯示卡,但 /dev/console 並不用於此目的。控制檯裝置(/dev/console)由核心直接管理,用於接收和顯示系統訊息,以及單使用者模式登陸。

序列介面

這裡所說的"序列介面"是指 RS-232 串列埠和任何模擬這種介面的裝置,無論是硬體(如調變解調器)還是軟體(如ISDN驅動)。Linux中的每一個串列埠都有兩個裝置名:主裝置或呼入(callin)裝置、輔裝置或撥出(callout)裝置。兩者之間使用字母的大小寫進行區分。比如,對於任意字母"X",裝置名分別為 /dev/ttyX# 與 /dev/cux# 。由於歷史原因,/dev/ttyS# 和 /dev/ttyC# 分別等價於 /dev/cua# 和 /dev/cub# 。名稱 /dev/ttyQ# 和 /dev/cuq# 被保留為僅供本地使用。

串列埠的仲裁是通過鎖檔案(/var/lock/LCK..ttyX#)來提供的。鎖檔案的內容應該是以ASCII碼錶示的鎖定程序的PID。常見的做法是安裝一個諸如 /dev/modem 這樣的連結來指向串列埠。為了確保能夠正確的預先鎖定這些連結,軟體應該追蹤符號連結並鎖定所有可能的名字。此外,還建議為相應的輔裝置安裝對應的鎖檔案。為了避免死鎖,建議按以下順序獲取鎖,並按相反的順序釋放鎖:

  1. 符號連結名,如果有(/var/lock/LCK..modem)
  2. "tty"名(/var/lock/LCK..ttyS2)
  3. 輔裝置名(/var/lock/LCK..cua2)

在符號連結出現巢狀的情況下,鎖檔案應按照符號連結的解析順序來安裝。

在任何情況下,應用程式都應該等待另一個程式釋放鎖之後,再持有這個鎖。此外,試圖為輔裝置建立鎖檔案的應用程式應考慮被用於非串列埠的TTY埠的可能性(此時不存在輔裝置)。

偽終端(PTY)

偽終端既可以用於建立登陸會話,也可以為其他需要通過TTY線路規則(包括SLIP或者PPP功能)來生成資料的程序提供幫助。每一個 PTY 都有一個master端和一個slave端。按照 System V/Unix98 的 PTY 命名方案,所有master端共享同一個 /dev/ptmx 裝置節點(開啟它核心將自動給出一個未分配的PTY),所有slave端都位於 /dev/pts/ 目錄下,名為 /dev/pts/# (核心會根據需要自動生成和刪除它們)。

一旦master端被開啟,相應的slave裝置就可以按照與 TTY 裝置完全相同的方式使用。master裝置與slave裝置之間通過核心進行連線,等價於擁有 TTY 功能的雙向管道(pipe)。