Linux設備文件簡介

轉自:http://lamp.linux.gov.cn/Linux/device_files.html

概述

設備管理是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在成長過程當中拋棄了原來借用自其它系統的一些 習慣。井號(#)在設備名裏表示一個無前導零的十進制數。

虛擬控制檯(Virtual console)和控制檯設備(console device)

虛擬控制檯是在系統視頻監視器上全屏顯示的終端。虛擬控制檯被命名爲編號從 /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# 被保留爲本地使用。

僞終端(PTY)

僞終端用於建立登錄會話或提供其它功能,好比經過 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)。

相關文章
相關標籤/搜索