linux 檔案系統簡介

來源:互聯網
上載者:User
文章目錄
  • 著作權聲明
  • 其他作品
  • BUG報告,切磋與探討
  • 必須的連結
  • 推薦的連結
  • 本地定義的連結
  • 通訊端和管道
  • 掛載點
  • 虛擬控制台(Virtual console)和控制台裝置(console device)
  • 串列介面
  • 偽終端(PTY)

原文連結

Linux裝置檔案簡介

Linux裝置檔案簡介作者:金步國著作權聲明

本文作者是一位自由軟體愛好者,所以本文雖然不是軟體,但是本著 GPL 的精神發布。任何人都可以自由使用、轉載、複製和再分發,但必須保留作者署名,亦不得對聲明中的任何條款作任何形式的修改,也不得附加任何其它條件。您可以自由連結、下載、傳播此文檔,但前提是必須保證全文完整轉載,包括完整的著作權資訊和作譯者聲明。

其他作品

本文作者十分願意與他人共用勞動成果,如果你對我的其他翻譯作品或者技術文章有興趣,可以在如下位置查看現有作品的列表:

  • 金步國作品列表
BUG報告,切磋與探討

由於作者水平有限,因此不能保證作品內容準確無誤,請在閱讀中自行鑒別。如果你發現了作品中的錯誤,請您來信指出,哪怕是錯別字也好,任何提高作品品質的建議我都將虛心接納。如果你願意就作品中的相關內容與我進行進一步切磋與探討,也歡迎你與我聯絡。連絡方式:Email: csfrank@citiz.net ; QQ: 70171448 ; MSN: csfrank122@hotmail.com

概述

裝置管理是linux中比較基礎的東西,但是由於Linux智能程度的越來越高,Udev的使用越來越廣泛,使得越來越多的Linux新使用者對 /dev 目錄下的東西變得不再熟悉。有時候遇見問題就會變得抓狂。

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 blockRAM disk  0 = /dev/ram0第1個 RAM disk (initrd只能使用ram0)  1 = /dev/ram1第2個 RAM disk    ...200 = /dev/ram200第200個 RAM disk  4 charTTY(終端)裝置  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/vcs1tty1 的常值內容    ... 63 = /dev/vcs63tty63 的常值內容128 = /dev/vcsa當前虛擬控制台(vc)的文本/屬性內容129 = /dev/vcsa1tty1 的文本/屬性內容    ...191 = /dev/vcsa63tty63 的文本/屬性內容  7 block迴環裝置(用一個普通的磁碟檔案來類比一個塊裝置)對迴環裝置的綁定由 mount(8) 或 losetup(8) 處理  0 = /dev/loop0第1個迴環裝置  1 = /dev/loop1第2個迴環裝置    ...  8 blockSCSI 磁碟(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 blockMetadisk(RAID)裝置  0 = /dev/md0第1組 metadisk  1 = /dev/md1第2組 metadisk    ...metadisk 驅動用於將同一個檔案系統分割到多個物理磁碟上。 10 char非串口滑鼠,各種雜項裝置和特性  1 = /dev/psauxPS/2滑鼠131 = /dev/temperature機器內部溫度134 = /dev/apm_biosAPM(進階電源管理) BIOS135 = /dev/rtc系統時鐘(Real Time Clock)144 = /dev/nvram非易失配置 RAM162 = /dev/smbus系統管理匯流排(System Management Bus)164 = /dev/ipmoIntel的智能平台管理(Intelligent Platform Management)介面173 = /dev/ipmikcs智能平台管理(Intelligent Platform Management)介面175 = /dev/agpgartAGP圖形地址重新對應表(Graphics Address Remapping Table)182 = /dev/perfctr效能監控計數器183 = /dev/hwrng通用硬體隨機數發生器184 = /dev/cpu/microcode CPU微代碼更新介面186 = /dev/atomicps進程狀態資料的原子快照188 = /dev/smbusbiosSMBus(系統管理匯流排) BIOS200 = /dev/net/tunTAP/TUN 網路裝置(TAP/TUN以軟體的方式實現了網路裝置)TAP類比了乙太網路幀(第二層),TUN類比了IP包(第三層)。202 = /dev/emd/ctl增強型 Metadisk RAID (EMD) 控制器220 = /dev/mptctlMessage passing technology (MPT) control223 = /dev/input/uinput使用者層輸入裝置驅動支援227 = /dev/mcelogX86_64 Machine Check Exception driver228 = /dev/hpetHPET driver229 = /dev/fuseFuse(使用者空間的虛擬檔案系統)231 = /dev/snapshot系統記憶體快照232 = /dev/kvm基於核心的虛構機(基於AMD SVM和Intel VT硬體虛擬技術) 11 blockSCSI 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 chariBCS-2 相容裝置  0 = /dev/socksys通訊端提供者  1 = /dev/spxSVR3 本地 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 charNetlink 支援  0 = /dev/route路由, 裝置更新, kernel to user  3 = /dev/fwmonitorFirewall packet 複製 59 charsf 防火牆模組  0 = /dev/firewall與 sf 核心模組通訊 65 blockSCSI 磁碟(16-31)  0 = /dev/sdq第17個 SCSI 磁碟(整個磁碟) 16 = /dev/sdr第18個 SCSI 磁碟(整個磁碟) 32 = /dev/sds第19個 SCSI 磁碟(整個磁碟)    ...240 = /dev/sdaf第32個 SCSI 磁碟(整個磁碟) 66 blockSCSI 磁碟(32-47)  0 = /dev/sdag第33個 SCSI 磁碟(整個磁碟) 16 = /dev/sdah第34個 SCSI 磁碟(整個磁碟) 32 = /dev/sdai第35個 SCSI 磁碟(整個磁碟)    ...240 = /dev/sdav第48個 SCSI 磁碟(整個磁碟) 89 charI2C 匯流排介面  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 charUnix98 PTY master這些裝置不應當存在裝置節點,而應當通過 /dev/ptmx 介面訪問。136-143 charUnix98 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 blockEnhanced 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 charUSB 字元裝置 96 = /dev/usb/hiddev0第1個USB人機介面裝置(滑鼠/鍵盤/遊戲杆/手寫版等人操作電腦的裝置)    ...111 = /dev/usb/hiddev15第16個USB人機介面裝置180 blockUSB 塊裝置(隨身碟之類)  0 = /dev/uba第1個USB 塊裝置  8 = /dev/ubb第2個USB 塊裝置 16 = /dev/ubc第3個USB 塊裝置     ...192 char核心 profiling 介面  0 = /dev/profileProfiling 控制裝置  1 = /dev/profile0CPU 0 的 Profiling 裝置  2 = /dev/profile1CPU 1 的 Profiling 裝置    ...193 char核心事件跟蹤介面  0 = /dev/trace跟蹤控制裝置  1 = /dev/trace0CPU 0 的跟蹤裝置  2 = /dev/trace1CPU 1 的跟蹤裝置    ...195 charNvidia 圖形裝置(比如顯卡)  0 = /dev/nvidia0第1個 Nvidia 卡  1 = /dev/nvidia1第2個 Nvidia 卡    ...255 = /dev/nvidiactlNvidia 卡控制裝置202 char特定於CPU模式的寄存器(model-specific register,MSR)  0 = /dev/cpu/0/msrCPU 0 的 MSRs  1 = /dev/cpu/1/msrCPU 1 的 MSRs    ...203 charCPU CPUID 資訊  0 = /dev/cpu/0/cpuidCPU 0 的 CPUID  1 = /dev/cpu/1/cpuidCPU 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)取決於不同的裝置。

必須的連結

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

連結目標連結類型簡要說明/dev/fd/proc/self/fdsymbolic檔案描述府/dev/stdinfd/0symbolic標準輸入檔案描述府/dev/stdoutfd/1symbolic標準輸出檔案描述符/dev/stderrfd/2symbolic標準錯誤檔案描述符/dev/nfsdsocksyssymbolic僅為 iBCS-2 所必須/dev/X0Rnullsymbolic僅為 iBCS-2 所必須[注意] /dev/X0R 是 <字母 X>-<數字 0>-<字母 R>
推薦的連結

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

連結目標連結類型簡要說明/dev/core/proc/kcoresymbolic為了向後相容/dev/ramdiskram0symbolic為了向後相容/dev/ftapeqft0symbolic為了向後相容/dev/bttv0video0symbolic為了向後相容/dev/radioradio0symbolic為了向後相容/dev/i2o*/dev/i2o/*symbolic為了向後相容/dev/scd?sr?hard代替 SCSI CD-ROM 的名字
本地定義的連結

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

連結目標連結類型簡要說明/dev/mousemouse portsymbolic當前滑鼠/dev/tapetape devicesymbolic當前磁帶/dev/cdromCD-ROM devicesymbolic當前CD-ROM/dev/cdwriterCD-writersymbolic當前CD-writer/dev/scannerscannersymbolic當前掃描器/dev/modemmodem portsymbolic當前數據機/dev/rootroot devicesymbolic當前根檔案系統所在裝置/dev/swapswap devicesymbolic當前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/printersocketlpd 本地通訊端/dev/logsocketsyslog 本地通訊端/dev/gpmdatasocketgpm 滑鼠多工器(multiplexer)/dev/gpmctlsocket(LFS-LiveCD中出現)/dev/initctlfifo pipeinit 監聽它並從中擷取資訊(使用者與 init 進程互動的通道)
掛載點

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

/dev/ptsdevptsPTY slave 檔案系統/dev/shmtmpfs提供對 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)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.