沒有文件系統的文件可以存在嗎?
我正在閱讀有關文件系統的資訊,並想到了一些問題。
問:如果文件是 unix/linux 的一個組成部分(即表示程序
/proc
或設備文件/dev
)就像一句名言“一切都是文件”,那麼它們是否存在於文件系統的上下文之外?我覺得某些文件(例如網路套接字文件或塊設備文件)是獨立於文件系統的,更像是作業系統本身的一部分。追問 Q. unix/linux 可以在沒有文件系統的情況下執行嗎?例如,Linux 系統可以通過手動訪問二級儲存來工作嗎?
是的。和不。也許。
並非一切都是文件;顯然,硬碟驅動器不能包含一個分區,然後包含一個文件系統,然後包含硬碟驅動器本身。只是通過文件系統樹中可見的名稱可以**訪問許多東西。
就文件系統而言(邏輯文件系統,或資料結構意義上的具體文件系統,如 ext4),只是某些文件被標記為某些特定編號設備的“設備節點”。但是它們的功能是由單獨的驅動程序實現的。當一個程序訪問它們時,作業系統只是將訪問轉移到適當的驅動程序,而不是文件系統。將它們視為引用或指針等。
考慮到這一點,很容易理解 eg
/proc
絕不是強制性的。系統可以執行,即使沒有它也可以執行程序。您只是沒有那種查看這些過程的方法。但是像fork()
,kill()
and之類的東西wait*()
仍然可以工作,因為它們通過 PID 引用程序,而不是通過某些文件系統名稱。一般來說,網路套接字也不顯示為命名文件。Unix域套接字可以做到這一點,但IIRC他們不必這樣做。而 TCP 或 UDP 套接字等則不會。但是網路套接字確實顯示為程序的文件描述符read()
,並且write()
系統呼叫與管道或“真實”文件的工作方式相同。所以在某種意義上,網路套接字也像文件一樣走路、說話和嘎嘎作響,儘管網路協議與在磁碟上儲存位沒有太大關係。但是,據我所知,如果沒有那些命名的設備節點,您實際上無法引用任意硬碟驅動器。您的硬體仍然存在,系統仍然具有必要的 SATA/USB/與它們一起工作所需的任何驅動程序,但您無法告訴它這樣做。儘管您可以掛載文件系統,然後刪除指向文件系統所在設備的設備節點。這裡沒有問題,因為設備節點只是使用者空間訪問設備的一種方式。
您問,“unix/linux 可以在沒有文件系統的情況下執行嗎?”。Linux 在沒有文件系統的情況下無法執行,例如,因為它通過查找要執行的執行檔來啟動使用者空間(最終執行保留為 的文件
init
)。該文件系統不需要是正常磁碟驅動器上的文件系統,但是,它可以是核心根據核心映像中包含的數據設置的特殊 rootfs 文件系統。(順便說一句,你不能擺脫 rootfs。它總是在那裡,即使是空的,這樣核心就不需要處理沒有任何掛載文件系統的想法。)參見ramfs -rootfs-initramfs.txt有關 rootfs 的詳細資訊的核心文件。我想我們可以假設一些假設的作業系統可以在沒有文件系統的情況下執行,但是例如
execve()
係統呼叫需要一個文件名,所以無論執行什麼都無法啟動其他程序(正在執行的程序需要以其他方式載入),並且如果沒有命名的設備節點,訪問儲存也很困難。無論如何,它看起來不像其他 Unixen。在 Linux 上,有可能設計一個奇怪的單一用途系統,它會在啟動時從 rootfs 啟動單個使用者空間程序,然後清除 rootfs 並且從不掛載任何其他文件系統。這將盡可能接近沒有文件系統,並且程序仍然可以執行並且例如訪問網路。不過,我懷疑它是否有任何實際用途,並且像往常一樣,任何打開的文件在關閉之前仍然存在,因此刪除它們的名稱可能不是很有用。
另請參閱Linux 核心是否需要文件系統才能執行?,我在上面回應的部分答案。有關“一切都是文件”口頭禪的更長時間的討論,請參閱外行對“一切都是文件”的解釋的答案——與 Windows 有什麼不同?.