Linux裝置節點
裝置管理是linux中比較基礎的東西,但是由於Linux智慧程度的越來越高,Udev的使用越來越廣泛,使得越來越多的Linux新使用者對 /dev 目錄下的東西變得不再熟悉。有時候遇見問題就會變得抓狂
本文是我在寫作《DIY 一個基於LFS的實用 Mini-LAPP 伺服器》過程中整理的資料,拿出來與大家共享
Linux 中的裝置有2種類型:字元裝置(無緩衝且只能順序存取)、塊裝置(有緩衝且可以隨機存取)。每個字元裝置和塊裝置都必須有主、次裝置號,主裝置號相同的裝置是同類裝置(使用同一個驅動程式)。這些裝置中,有些裝置是對實際存在的物理硬體的抽象,而有些裝置則是核心自身提供的功能(不依賴於特定的物理硬體,又稱為"虛擬裝置")。每個裝置在 /dev 目錄下都有一個對應的檔案(節點)。可以通過 cat /proc/devices 命令檢視當前已經載入的裝置驅動程式的主裝置號。核心能夠識別的所有裝置都記錄在原碼樹下的 Documentation/devices.txt 檔案中。在 /dev 目錄下除了字元裝置和塊裝置節點之外還通常還會存在:FIFO管道、Socket、軟/硬連線、目錄。這些東西沒有主/次裝置號。
Linux核心所能識別的所有裝置都記錄在
http://www.lanana.org/docs/device-list/
而核心原碼樹中的 Documentation/devices.txt 可能不是最新版本。
瞭解這些裝置的最基本要求就是對 每個裝置檔案的含義瞭如指掌,下面就醫列表的形式列出常見的裝置檔案以及相應的含義(比較偏僻的就省略了):
----------------------------------------------------------------------
主裝置號 裝置型別
次裝置號=檔名 簡要說明
----------------------------------------------------------------------
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 系統控制檯
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 目錄之外的檔案。
連結最好使用與這裡完全相同的格式(絕對路徑或相對路徑)。
究竟是使用硬連結(hard)還是軟連線(symbolic)取決於不同的裝置。
必須的連結
必須在所有的系統上都存在這些連線:
連結 目標 連結型別 簡要說明
/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 的名字
本地定義的連結
下面的連結很可能需要根據機器的實際硬體配置建立其中的一部分甚至全部。
這些連結僅僅是為了迎合習慣用法,它們既非必須也非推薦。
連結 目標 連結型別 簡要說明
/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 裝置。
對於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)。
===============================
你可能會很奇怪,為什麼沒有 /dev/hda 這樣的裝置,難道不常用麼?
原因在於從 2.6.19 開始,核心引入了新的ATA驅動,將SATA/IDE硬碟同意使用 /dev/sd? 來表示了,所以 /dev/hd? 就沒有存在的必要了