欧美一区2区三区4区公司二百,国产精品婷婷午夜在线观看,自拍偷拍亚洲精品,国产美女诱惑一区二区

歡迎來(lái)到云服務(wù)器

云技術(shù)

詳解 Linux 中的虛擬文件系統(tǒng)

什么是文件系統(tǒng)?根據(jù)早期的 Linux 貢獻(xiàn)者和作家 Robert Love 所說(shuō),“文件系統(tǒng)是一個(gè)遵循特定結(jié)構(gòu)的數(shù)據(jù)的分層存儲(chǔ)。” 不過(guò),這種描述也同樣適用于 VFAT(虛擬文件分配表Virtual File Allocation Table)、Git 和Cassandra(一種 NoSQL 數(shù)據(jù)庫(kù))。那么如何區(qū)別文件系統(tǒng)呢?

文件系統(tǒng)基礎(chǔ)概念

Linux 內(nèi)核要求文件系統(tǒng)必須是實(shí)體,它還必須在持久對(duì)象上實(shí)現(xiàn) open()、read() 和 write() 方法,并且這些實(shí)體需要有與之關(guān)聯(lián)的名字。從 面向?qū)ο缶幊?的角度來(lái)看,內(nèi)核將通用文件系統(tǒng)視為一個(gè)抽象接口,這三大函數(shù)是“虛擬”的,沒(méi)有默認(rèn)定義。因此,內(nèi)核的默認(rèn)文件系統(tǒng)實(shí)現(xiàn)被稱為虛擬文件系統(tǒng)(VFS)。

 

如果我們能夠 open()、read() 和 write(),它就是一個(gè)文件,如這個(gè)主控臺(tái)會(huì)話所示。

VFS 是著名的類 Unix 系統(tǒng)中 “一切皆文件” 概念的基礎(chǔ)。讓我們看一下它有多奇怪,上面的小小演示體現(xiàn)了字符設(shè)備 /dev/console 實(shí)際的工作。該圖顯示了一個(gè)在虛擬電傳打字控制臺(tái)(tty)上的交互式 Bash 會(huì)話。將一個(gè)字符串發(fā)送到虛擬控制臺(tái)設(shè)備會(huì)使其顯示在虛擬屏幕上。而 VFS 甚至還有其它更奇怪的屬性。例如,它可以在其中尋址。

我們熟悉的文件系統(tǒng)如 ext4、NFS 和 /proc 都在名為 file_operations 的 C 語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中提供了三大函數(shù)的定義。此外,個(gè)別的文件系統(tǒng)會(huì)以熟悉的面向?qū)ο蟮姆绞綌U(kuò)展和覆蓋了 VFS 功能。正如 Robert Love 指出的那樣,VFS 的抽象使 Linux 用戶可以輕松地將文件復(fù)制到(或復(fù)制自)外部操作系統(tǒng)或抽象實(shí)體(如管道),而無(wú)需擔(dān)心其內(nèi)部數(shù)據(jù)格式。在用戶空間這一側(cè),通過(guò)系統(tǒng)調(diào)用,進(jìn)程可以使用文件系統(tǒng)方法之一 read() 從文件復(fù)制到內(nèi)核的數(shù)據(jù)結(jié)構(gòu)中,然后使用另一種文件系統(tǒng)的方法 write() 輸出數(shù)據(jù)。

屬于 VFS 基本類型的函數(shù)定義本身可以在內(nèi)核源代碼的 fs/*.c 文件 中找到,而 fs/ 的子目錄中包含了特定的文件系統(tǒng)。內(nèi)核還包含了類似文件系統(tǒng)的實(shí)體,例如 cgroup、/dev 和 tmpfs,在引導(dǎo)過(guò)程的早期需要它們,因此定義在內(nèi)核的 init/ 子目錄中。請(qǐng)注意,cgroup、/dev 和 tmpfs 不會(huì)調(diào)用 file_operations 的三大函數(shù),而是直接讀取和寫(xiě)入內(nèi)存。

下圖大致說(shuō)明了用戶空間如何訪問(wèn)通常掛載在 Linux 系統(tǒng)上的各種類型文件系統(tǒng)。像管道、dmesg 和 POSIX 時(shí)鐘這樣的結(jié)構(gòu)在此圖中未顯示,它們也實(shí)現(xiàn)了 struct file_operations,而且其訪問(wèn)也要通過(guò) VFS 層。

 

How userspace accesses various types of filesystems

VFS 是個(gè)“墊片層”,位于系統(tǒng)調(diào)用和特定 file_operations 的實(shí)現(xiàn)(如 ext4 和 procfs)之間。然后,file_operations 函數(shù)可以與特定于設(shè)備的驅(qū)動(dòng)程序或內(nèi)存訪問(wèn)器進(jìn)行通信。tmpfs、devtmpfs 和 cgroup 不使用 file_operations 而是直接訪問(wèn)內(nèi)存。

VFS 的存在促進(jìn)了代碼重用,因?yàn)榕c文件系統(tǒng)相關(guān)的基本方法不需要由每種文件系統(tǒng)類型重新實(shí)現(xiàn)。代碼重用是一種被廣泛接受的軟件工程最佳實(shí)踐!唉,但是如果重用的代碼引入了嚴(yán)重的錯(cuò)誤,那么繼承常用方法的所有實(shí)現(xiàn)都會(huì)受到影響。

/tmp:一個(gè)小提示

找出系統(tǒng)中存在的 VFS 的簡(jiǎn)單方法是鍵入 mount | grep -v sd | grep -v :/,在大多數(shù)計(jì)算機(jī)上,它將列出所有未駐留在磁盤上,同時(shí)也不是 NFS 的已掛載文件系統(tǒng)。其中一個(gè)列出的 VFS 掛載肯定是 /tmp,對(duì)吧?

誰(shuí)都知道把 /tmp 放在物理存儲(chǔ)設(shè)備上簡(jiǎn)直是瘋了!圖片:https://tinyurl.com/ybomxyfo

為什么把 /tmp 留在存儲(chǔ)設(shè)備上是不可取的?因?yàn)?/tmp 中的文件是臨時(shí)的(!),并且存儲(chǔ)設(shè)備比內(nèi)存慢,所以創(chuàng)建了 tmpfs 這種文件系統(tǒng)。此外,比起內(nèi)存,物理設(shè)備頻繁寫(xiě)入更容易磨損。最后,/tmp 中的文件可能包含敏感信息,因此在每次重新啟動(dòng)時(shí)讓它們消失是一項(xiàng)功能。

不幸的是,默認(rèn)情況下,某些 Linux 發(fā)行版的安裝腳本仍會(huì)在存儲(chǔ)設(shè)備上創(chuàng)建 /tmp。如果你的系統(tǒng)出現(xiàn)這種情況,請(qǐng)不要絕望。按照一直優(yōu)秀的 Arch Wiki 上的簡(jiǎn)單說(shuō)明來(lái)解決問(wèn)題就行,記住分配給 tmpfs 的內(nèi)存就不能用于其他目的了。換句話說(shuō),包含了大文件的龐大的 tmpfs 可能會(huì)讓系統(tǒng)耗盡內(nèi)存并崩潰。

另一個(gè)提示:編輯 /etc/fstab 文件時(shí),請(qǐng)務(wù)必以換行符結(jié)束,否則系統(tǒng)將無(wú)法啟動(dòng)。(猜猜我怎么知道。)

/proc 和 /sys

騰訊云代理

Copyright © 2003-2021 MFISP.COM. 國(guó)外vps服務(wù)器租用 夢(mèng)飛云服務(wù)器租用 版權(quán)所有 ? 粵ICP備11019662號(hào)

主站蜘蛛池模板: 增城市| 连城县| 富锦市| 永康市| 秭归县| 延津县| 阳新县| 上栗县| 锡林郭勒盟| 沅江市| 南阳市| 延津县| 德惠市| 裕民县| 镇雄县| 宁国市| 探索| 鹰潭市| 文山县| 夏津县| 芒康县| 宁武县| 璧山县| 桃园市| 江陵县| 马山县| 阿克陶县| 法库县| 永安市| 鹰潭市| 淮南市| 浦江县| 满洲里市| 汪清县| 二连浩特市| 三明市| 且末县| 革吉县| 安吉县| 绥江县| 庆安县|