為什麼特殊設備文件有 inode?
設備文件本身不是文件。它們是在類 Unix 作業系統中使用設備的 I/O 介面。它們不使用磁碟空間,但是,它們仍然使用
stat
命令報告的 inode:$ stat /dev/sda File: /dev/sda Size: 0 Blocks: 0 IO Block: 4096 block special file Device: 6h/6d Inode: 14628 Links: 1 Device type: 8,0
設備文件是否使用文件系統中的物理inode 以及它們為什麼需要它們?
簡短的回答是,只有當你有物理文件系統支持時它才
/dev
會這樣做(如果你使用的是現代 Linux 發行版,你可能沒有)。長答案如下:
這一切都可以追溯到原始的 UNIX 哲學,即一切都是文件。這種理念是 UNIX 如此通用的部分原因,因為您可以直接從使用者空間與設備互動,而無需在應用程序中使用特殊程式碼直接與物理硬體對話。
最初,
/dev
它只是您放置設備文件的另一個具有眾所周知名稱的目錄。一些 UNIX 系統仍然採用這種方法(我相信 OpenBSD 仍然採用),並且您通常可以判斷一個系統是否是這樣的,因為它會有很多系統實際上沒有的設備文件(例如,每個每個可能的磁碟上的可能分區)。這以使用更多磁碟空間為代價節省了記憶體空間和啟動時間,這對於早期系統來說是一個很好的權衡,因為它們通常非常受記憶體限制並且速度不是很快。這通常被稱為具有靜態/dev
.在現代 Linux 系統上(我相信還有 FreeBSD 和可能的最新版本的 Solaris),
/dev
是一個由核心填充的臨時記憶體文件系統(如果您使用 Systemd,則為 udev,因為它們幾乎不信任核心做任何事情) . 這以一些記憶體(通常小於幾 MB)和非常小的處理成本為代價節省了一些磁碟空間。它還具有許多其他優點,其中最大的優點之一是更容易檢測熱插拔硬體。這通常被稱為具有動態/dev
.不過,在這兩種情況下,設備節點都是通過正常 VFS 層訪問的,根據定義,這意味著它們必須有一個 inode(即使它是一個虛擬的,只是存在以便
stat()
像它應該的那樣工作。從實際的角度來看,這對使用動態的系統的影響為零,/dev
因為它們只是將 inode 儲存在記憶體中或根據需要生成它們,並且幾乎為零的影響/dev
是靜態的,因為 inode 在磁碟上佔用的空間接近零,並且大多數文件系統要麼沒有上限他們或提供的方式比任何人都可能需要的多。