設備管理是linux中比較基礎的東西,可是因爲Linux智能程度的愈來愈高,Udev的使用愈來愈普遍,使得愈來愈多的Linux新用戶對 /dev 目錄下的東西變得再也不熟悉。有時候碰見問題就會變得抓狂。html
Linux 中的設備有2種類型:字符設備(無緩衝且只能順序存取)、塊設備(有緩衝且能夠隨機存取)。每一個字符設備和塊設備都必須有主、次設備號,主設備號相同的設 備是同類設備(使用同一個驅動程序)。這些設備中,有些設備是對實際存在的物理硬件的抽象,而有些設備則是內核自身提供的功能(不依賴於特定的物理硬件, 又稱爲"虛擬設備")。每一個設備在 /dev 目錄下都有一個對應的文件(節點)。能夠經過 cat /proc/devices 命令查看當前已經加載的設備驅動程序的主設備號。內核可以識別的全部設備都記錄在原碼樹下的 Documentation/devices.txt 文件中。在 /dev 目錄下除了字符設備和塊設備節點以外還一般還會存在:FIFO管道、Socket、軟/硬鏈接、目錄。這些東西沒有主/次設備號。linux
Linux內核所能識別的全部設備都記錄在
http://www.lanana.org/docs/device-list/
而內核原碼樹中的 Documentation/devices.txt 可能不是最新版本。ios
瞭解這些設備的最基本要求就是對每一個設備文件的含義瞭如指掌,下面列出常見的設備文件以及相應的含義(比較偏僻的就省略了)。安全
---------------------------------------------------------------------- 主設備號 設備類型 次設備號=文件名 簡要說明 ---------------------------------------------------------------------- 0 未命名設備(例如:掛載的非設備) 0 = 爲空設備號保留 1 char 內存設備 1 = /dev/mem 直接存取物理內存 2 = /dev/kmem 存取通過內核虛擬以後的內存 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 的輸出 1 block RAM disk 0 = /dev/ram0 第1個 RAM disk (initrd只能使用ram0) 1 = /dev/ram1 第2個 RAM disk ... 200 = /dev/ram200 第200個 RAM disk 4 char TTY(終端)設備 0 = /dev/tty0 當前虛擬控制檯 1 = /dev/tty1 第1個虛擬控制檯 ... 63 = /dev/tty63 第63個虛擬控制檯 4 block 若是根文件系統以是以只讀方式掛載的,那麼就不可能建立真正的設備節點, 此時就使用該設備做爲動態分配的主(major)設備的別名 0 = /dev/root 5 char 其餘 TTY 設備 0 = /dev/tty 當前 TTY 設備 1 = /dev/console 系統控制檯(通常是/dev/tty0) 2 = /dev/ptmx 全部 PTY master 的複用器 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 迴環設備(用一個普通的磁盤文件來模擬一個塊設備) 對迴環設備的綁定由 mount(8) 或 losetup(8) 處理 0 = /dev/loop0 第1個迴環設備 1 = /dev/loop1 第2個迴環設備 ... 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個分區 對於Linux/i386來講,分區1-4是主分區,5-15是邏輯分區。 9 block Metadisk(RAID)設備 0 = /dev/md0 第1組 metadisk 1 = /dev/md1 第2組 metadisk ... metadisk 驅動用於將同一個文件系統分割到多個物理磁盤上。 10 char 非串口鼠標,各類雜項設備和特性 1 = /dev/psaux PS/2鼠標 131 = /dev/temperature 機器內部溫度 134 = /dev/apm_bios APM(高級電源管理) BIOS 135 = /dev/rtc 實時時鐘(Real Time Clock) 144 = /dev/nvram 非易失配置 RAM 162 = /dev/smbus 系統管理總線(System Management Bus) 164 = /dev/ipmo Intel的智能平臺管理(Intelligent Platform Management)接口 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微代碼更新接口 186 = /dev/atomicps 進程狀態數據的原子快照 188 = /dev/smbusbios SMBus(系統管理總線) BIOS 200 = /dev/net/tun TAP/TUN 網絡設備(TAP/TUN以軟件的方式實現了網絡設備) TAP模擬了以太網幀(第二層),TUN模擬了IP包(第三層)。 202 = /dev/emd/ctl 加強型 Metadisk RAID (EMD) 控制器 220 = /dev/mptctl Message passing technology (MPT) control 223 = /dev/input/uinput 用戶層輸入設備驅動支持 227 = /dev/mcelog X86_64 Machine Check Exception driver 228 = /dev/hpet HPET driver 229 = /dev/fuse Fuse(用戶空間的虛擬文件系統) 231 = /dev/snapshot 系統內存快照 232 = /dev/kvm 基於內核的虛構機(基於AMD SVM和Intel VT硬件虛擬技術) 11 block SCSI CD-ROM 設備 0 = /dev/scd0 第1個 SCSI CD-ROM 1 = /dev/scd1 第2個 SCSI CD-ROM ... 13 char 核心輸入設備 32 = /dev/input/mouse0 第1個鼠標 33 = /dev/input/mouse1 第2個鼠標 ... 62 = /dev/input/mouse30 第31個鼠標 63 = /dev/input/mice 全部鼠標的統一 64 = /dev/input/event0 第1個事件隊列 65 = /dev/input/event1 第2個事件隊列 ... 95 = /dev/input/event1 第32個事件隊列 21 char 通用 SCSI 設備(一般是SCSI光驅) 0 = /dev/sg0 第1個通用 SCSI 設備 1 = /dev/sg1 第2個通用 SCSI 設備 ... 29 char 通用幀緩衝(frame buffer)設備 0 = /dev/fb0 第1個幀緩衝設備 1 = /dev/fb1 第2個幀緩衝設備 ... 31 = /dev/fb31 第32個幀緩衝設備 30 char iBCS-2 兼容設備 0 = /dev/socksys 套接字訪問接口 1 = /dev/spx SVR3 本地 X 接口 32 = /dev/inet/ip 網絡訪問接口 33 = /dev/inet/icmp 34 = /dev/inet/ggp 35 = /dev/inet/ipip 36 = /dev/inet/tcp 37 = /dev/inet/egp 38 = /dev/inet/pup 39 = /dev/inet/udp 40 = /dev/inet/idp 41 = /dev/inet/rawip 此外,iBCS-2 還須要下面的鏈接必須存在 /dev/ip -> /dev/inet/ip /dev/icmp -> /dev/inet/icmp /dev/ggp -> /dev/inet/ggp /dev/ipip -> /dev/inet/ipip /dev/tcp -> /dev/inet/tcp /dev/egp -> /dev/inet/egp /dev/pup -> /dev/inet/pup /dev/udp -> /dev/inet/udp /dev/idp -> /dev/inet/idp /dev/rawip -> /dev/inet/rawip /dev/inet/arp -> /dev/inet/udp /dev/inet/rip -> /dev/inet/udp /dev/nfsd -> /dev/socksys /dev/X0R -> /dev/null 36 char Netlink 支持 0 = /dev/route 路由, 設備更新, kernel to user 3 = /dev/fwmonitor Firewall packet 複製 59 char sf 防火牆模塊 0 = /dev/firewall 與 sf 內核模塊通訊 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 磁盤(整個磁盤) 89 char I2C 總線接口 0 = /dev/i2c-0 第1個 I2C 適配器 1 = /dev/i2c-1 第2個 I2C 適配器 ... 98 block 用戶模式下的虛擬塊設備(分區處理方式與 SCSI 磁盤相同) 0 = /dev/ubda 第1個用戶模式塊設備 16 = /dev/udbb 第2個用戶模式塊設備 ... 103 block 審計(Audit)設備 0 = /dev/audit 審計(Audit)設備 128-135 char Unix98 PTY master 這些設備不該當存在設備節點,而應當經過 /dev/ptmx 接口訪問。 136-143 char Unix98 PTY slave 這些設備節點是自動生成的(伴有適當的權限和模式),不能手動建立。 方法是經過使用適當的 mount 選項(一般是:mode=0620,gid=<"tty"組的gid>) 將 devpts 文件系統掛載到 /dev/pts 目錄便可。 0 = /dev/pts/0 第1個 Unix98 PTY slave 1 = /dev/pts/1 第2個 Unix98 PTY slave ... 153 block Enhanced Metadisk RAID (EMD) 存儲單元(分區處理方式與 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個存儲單元 180 char USB 字符設備 96 = /dev/usb/hiddev0 第1個USB人機界面設備(鼠標/鍵盤/遊戲杆/手寫版等人操做計算機的設備) ... 111 = /dev/usb/hiddev15 第16個USB人機界面設備 180 block USB 塊設備(U盤之類) 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 ... 203 char CPU CPUID 信息 0 = /dev/cpu/0/cpuid CPU 0 的 CPUID 1 = /dev/cpu/1/cpuid CPU 1 的 CPUID ...
有沒有感到很奇怪?爲何沒有 /dev/hda 這樣的設備,難道不經常使用麼?緣由在於從 2.6.19 版本開始,內核引入了新的ATA驅動,將SATA/PATA硬盤統一使用 /dev/sd? 來表示了,因此 /dev/hd? 就沒有存在的必要了。具體說來也就是你在編譯內核的時候不要再使用"ATA/ATAPI/MFM/RLL support"下面的驅動,而是使用更新的"Serial ATA and Parallel ATA drivers"驅動。網絡
這部分詳細說明一些應該或可能存在於 /dev 目錄以外的文件。連接最好使用與這裏徹底相同的格式(絕對路徑或相對路徑)。到底是使用硬連接(hard)仍是軟鏈接(symbolic)取決於不一樣的設備。app
必須在全部的系統上都存在這些鏈接:dom
連接 目標 連接類型 簡要說明 /dev/fd /proc/self/fd symbolic 文件描述府 /dev/stdin fd/0 symbolic 標準輸入文件描述府 /dev/stdout fd/1 symbolic 標準輸出文件描述符 /dev/stderr fd/2 symbolic 標準錯誤文件描述符 /dev/nfsd socksys symbolic 僅爲 iBCS-2 所必須 /dev/X0R null symbolic 僅爲 iBCS-2 所必須 [注意] /dev/X0R 是 <字母 X>-<數字 0>-<字母 R>
推薦在全部的系統上都存在這些鏈接:異步
連接 目標 連接類型 簡要說明 /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 的名字
下面的連接極可能須要根據機器的實際硬件配置建立其中的一部分甚至所有。這些連接僅僅是爲了迎合習慣用法,它們既非必須也非推薦。socket
連接 目標 連接類型 簡要說明 /dev/mouse mouse port symbolic 當前鼠標 /dev/tape tape device symbolic 當前磁帶 /dev/cdrom CD-ROM device symbolic 當前CD-ROM /dev/cdwriter CD-writer symbolic 當前CD-writer /dev/scanner scanner symbolic 當前掃描儀 /dev/modem modem port symbolic 當前調制解調器 /dev/root root device symbolic 當前根文件系統所在設備 /dev/swap swap device symbolic 當前swap所在設備
/dev/modem 不該當用於可以同時支持呼入和呼出的modem,由於每每會致使鎖文件問題。若是存在 /dev/modem ,那麼它應當指向一個恰當的主 TTY 設備。tcp
對於SCSI設備,/dev/tape 和 /dev/cdrom 應該分別指向"cooked"設備 /dev/st* 和 /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/gpmctl socket (LFS-LiveCD中出現) /dev/initctl fifo pipe init 監聽它並從中獲取信息(用戶與 init 進程交互的通道)
如下名稱被保留用於掛載特殊的文件系統。這些特殊的文件系統只提供內核界面而不提供標準的設備節點。
/dev/pts devpts PTY slave 文件系統 /dev/shm tmpfs 提供對 POSIX 共享內存的直接訪問
終端(或TTY)設備是一種特殊的字符設備。終端設備是能夠在會話中扮演控制終端角色的任何設備,包括:虛擬控制檯、串行接口(已廢棄)、僞終端(PTY)。
全部的終端設備共享一個通用的功能集合:line discipline,它既包含通用的終端 line discipline 也包含SLIP和PPP模式。全部的終端設備的命名都很類似。這部份內容將解釋命名規則和各類類型的TTY(終端)的使用。須要注意的是這些命名習慣包含 了幾個歷史遺留包袱。其中的一些是Linux所特有的,另外一些則是繼承自其餘系統,還有一些反映了Linux在成長過程當中拋棄了原來借用自其它系統的一些 習慣。井號(#)在設備名裏表示一個無前導零的十進制數。
虛擬控制檯是在系統視頻監視器上全屏顯示的終端。虛擬控制檯被命名爲編號從 /dev/tty1 開始的 /dev/tty# 。/dev/tty0 是當前虛擬控制檯。/dev/tty0 用於在不能使用幀緩衝設備(/dev/fb*)的機器上存取系統視頻卡,注意,不要將 /dev/console 用於此目的。/dev/console 由內核管理,系統消息將被髮送到這裏。單用戶模式下必須容許 login 使用 /dev/console 。
這裏所說的"串行接口"是指 RS-232 串行接口和任何模擬這種接口的設備,不論是在硬件(例如調制解調器)仍是在軟件(例如ISDN驅動)中模擬。在linux中的每個串行接口都有兩個設備 名:主設備或呼入(callin)設備、交替設備或呼出(callout)設備。設備類型之間使用字母的大小寫進行區分。好比,對於任意字母 X,"tty"設備名爲 /dev/ttyX# ,而"cu"設備名則爲 /dev/cux# 。因爲歷史緣由,/dev/ttyS# 和 /dev/ttyC# 分別等價於 /dev/cua# 和 /dev/cub# 。名稱 /dev/ttyQ# 和 /dev/cuq# 被保留爲本地使用。
僞終端用於建立登錄會話或提供其它功能,好比經過 TTY line discipline (包括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)。