自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Btrfs 詳解:基礎(chǔ)概念

系統(tǒng)
這篇文章是《Btrfs 詳解》系列文章中的一篇。從 Fedora Linux 33 開(kāi)始,Btrfs 就是 Fedora Workstation 和 Fedora Silverblue 的默認(rèn)文件系統(tǒng)。

介紹

文件系統(tǒng)是現(xiàn)代計(jì)算機(jī)的基礎(chǔ)之一。它是任何操作系統(tǒng)必不可少的一部分,且通常不為人注意。但是,像 Btrfs 這樣的現(xiàn)代文件系統(tǒng)提供了許多很棒的特性,使計(jì)算機(jī)的使用更加方便。例如,它可以無(wú)感地為你壓縮文件,或者為增量備份建立可靠的基礎(chǔ)。

這篇文章將帶你高屋建瓴地了解 Btrfs 文件系統(tǒng)是如何工作的,有什么特性。本文既不會(huì)過(guò)多涉及技術(shù)細(xì)節(jié),也不會(huì)研究其底層實(shí)現(xiàn),系列后續(xù)的文章會(huì)詳細(xì)介紹一些重要特性。

什么是文件系統(tǒng)

如果你基本了解過(guò)文件系統(tǒng)是如何工作的,那么下面的內(nèi)容對(duì)你應(yīng)該是不陌生的,你可以直接跳到下一節(jié)。否則,請(qǐng)先閱讀下面對(duì)文件系統(tǒng)的簡(jiǎn)短介紹。

簡(jiǎn)單來(lái)說(shuō),文件系統(tǒng)允許你的 PC 去尋找存儲(chǔ)在磁盤上的數(shù)據(jù)。這聽(tīng)起來(lái)像是微不足道的工作,但實(shí)際上時(shí)至今日各種類型的非易失性存儲(chǔ)設(shè)備(比如機(jī)械硬盤、固態(tài)硬盤、SD 卡等等)仍然與 1970 年代 PC 被發(fā)明時(shí)基本相同:一個(gè)(巨大的)存儲(chǔ)塊集合。

“塊Block” 是最小的可尋址存儲(chǔ)單元。PC 上的每個(gè)文件內(nèi)容被存儲(chǔ)在多個(gè)塊中。一個(gè)塊通常是 4096 字節(jié)的大小。這取決于你的硬件和在這之上的軟件(即文件系統(tǒng))。

文件系統(tǒng)允許我們從海量的存儲(chǔ)塊中查找文件的內(nèi)容,這是通過(guò)所謂的 inode

下面是 inode 的示意圖:

A text file “myfile.txt” and a hypothetical example of its representation on disk. All the squares are individual storage blocks.A text file “myfile.txt” and a hypothetical example of its representation on disk. All the squares are individual storage blocks.

inode 的結(jié)構(gòu)對(duì)文件系統(tǒng)的功能有巨大的影響,因此它是各種文件系統(tǒng)諸多的重要數(shù)據(jù)結(jié)構(gòu)之一。出于這個(gè)原因,每個(gè)文件系統(tǒng)有各自的 inode 結(jié)構(gòu)。如果你想了解更多信息,看看下面 鏈接 關(guān)于 Btrfs 文件系統(tǒng) inode 結(jié)構(gòu)的內(nèi)容。如需更詳細(xì)地了解各個(gè)字段的含義,你可以 參考 ext4 文件系統(tǒng)的 inode 結(jié)構(gòu)。

寫時(shí)復(fù)制(CoW)文件系統(tǒng)

相比 ext4,Btrfs 擁有的杰出特性之一是,它是一個(gè) 寫時(shí)復(fù)制Copy-on-Write(CoW)文件系統(tǒng)。當(dāng)一個(gè)文件被改變和回寫磁盤,它不會(huì)故意寫回它原來(lái)的位置,而是被復(fù)制和存儲(chǔ)在磁盤上的新位置。從這個(gè)意義上,可以簡(jiǎn)單地認(rèn)為 Cow 是一種 “重定向”,因?yàn)槲募懭氡恢囟ㄏ虻讲煌拇鎯?chǔ)塊上。

這聽(tīng)起來(lái)很浪費(fèi),但實(shí)際上并不是。這是因?yàn)楸恍薷牡臄?shù)據(jù)無(wú)論如何一定會(huì)被寫到磁盤上,不管文件系統(tǒng)是如何工作的。Btrfs 僅僅是確保了數(shù)據(jù)被寫入在之前沒(méi)被占據(jù)的塊上,所以舊數(shù)據(jù)保持完整。唯一真正的缺點(diǎn)就是這種行為會(huì)導(dǎo)致文件碎片化比其他文件系統(tǒng)要快。在日常的電腦使用中,你不太可能會(huì)注意到這點(diǎn)差異。

CoW 的優(yōu)勢(shì)在哪里?簡(jiǎn)單的說(shuō):文件被修改和編輯的歷史被保存了下來(lái)。Btrfs 保存文件舊版本的引用(inode)可以輕易地被訪問(wèn)。這個(gè)引用就是快照:文件系統(tǒng)在某個(gè)時(shí)間點(diǎn)的狀態(tài)鏡像。這將是這系列文章里的單獨(dú)的一篇,所以暫時(shí)留到后面介紹。

除了保存文件歷史,CoW 文件系統(tǒng)永遠(yuǎn)處于一致的狀態(tài),即使之前的文件系統(tǒng)事務(wù)(比如寫入一個(gè)文件)由于斷電等原因沒(méi)有完成。這是因?yàn)槲募到y(tǒng)的元數(shù)據(jù)更新也是寫時(shí)復(fù)制的:文件系統(tǒng)本身永遠(yuǎn)不會(huì)被覆寫,所以中斷不會(huì)使其處于部分寫入的狀態(tài)。

對(duì)文件的寫時(shí)復(fù)制

你可以將文件名視為對(duì) inode 的指針。在寫入文件的時(shí)候,Btrfs 創(chuàng)建一個(gè)被修改文件內(nèi)容(數(shù)據(jù))的拷貝,和一個(gè)新的 inode(元數(shù)據(jù)),然后讓文件名指向新的 inode,舊的 inode 保持不變。下面是一個(gè)假設(shè)示例來(lái)闡述這點(diǎn):

Continuation of the example above: 3 more bytes of data were addedContinuation of the example above: 3 more bytes of data were added

這里 myfile.txt 增加了三個(gè)字節(jié)。傳統(tǒng)的文件系統(tǒng)會(huì)更新中間的 Data 塊去包含新的內(nèi)容。CoW 文件系統(tǒng)不會(huì)改變舊的數(shù)據(jù)塊(圖中灰色),寫入(復(fù)制)更改的數(shù)據(jù)和元數(shù)據(jù)在新的地方。值得注意的是,只有被改變的數(shù)據(jù)塊被復(fù)制,而不是全部文件。

如果沒(méi)有空閑的塊去寫入新內(nèi)容,Btrfs 將從被舊文件版本占據(jù)的數(shù)據(jù)塊中回收空間(除非它們是快照的一部分,本系列后續(xù)文章會(huì)看到)。

對(duì)目錄的寫時(shí)復(fù)制

從文件系統(tǒng)的角度看,目錄只是特殊類型的文件。與常規(guī)文件不同,文件系統(tǒng)直接解釋數(shù)據(jù)塊的內(nèi)容。一個(gè)目錄有自身的元數(shù)據(jù)(inode,就像上面說(shuō)的文件一樣)去記錄訪問(wèn)權(quán)限或修改時(shí)間。最簡(jiǎn)單的形式,存在目錄里的數(shù)據(jù)(被叫作目錄項(xiàng))是一個(gè) inode 引用的列表,每個(gè) inode 又是另外的文件或目錄。但是,現(xiàn)代文件系統(tǒng)在目錄項(xiàng)中至少會(huì)存儲(chǔ)一個(gè)文件名和對(duì)應(yīng)的 inode 引用。

之前已經(jīng)指出,寫入一個(gè)文件會(huì)創(chuàng)建之前 inode 的副本,并相應(yīng)修改其內(nèi)容。從根本上,這產(chǎn)生了一個(gè)和之前無(wú)關(guān)的新的 inode 。為了讓被修改的文件對(duì)文件系統(tǒng)可見(jiàn),所有包含這個(gè)文件引用的目錄項(xiàng)都會(huì)被更新。

這是一個(gè)遞歸的過(guò)程!因?yàn)橐粋€(gè)目錄本身是一個(gè)帶有 inode 的文件。修改目錄里的任何一項(xiàng)都會(huì)為這個(gè)目錄文件創(chuàng)建新的 inode 。這會(huì)沿著文件系統(tǒng)樹(shù)遞歸直到文件系統(tǒng)的根。

所以,只要保留對(duì)任何舊目錄的引用,并且這些目錄沒(méi)有被刪除和覆寫,就可以遍歷之前舊狀態(tài)的文件系統(tǒng)樹(shù)。這就是快照的功能。

后續(xù)文章可以期待的內(nèi)容

Btrfs 不只是一個(gè) Cow 文件系統(tǒng)。它目標(biāo)是實(shí)現(xiàn)高級(jí)特性的同時(shí)關(guān)注容錯(cuò)、修復(fù)和易于管理(參見(jiàn) 文檔)。本系列未來(lái)的文章將會(huì)專門介紹這些特性。

  • 子卷 – 文件系統(tǒng)中的文件系統(tǒng)
  • 快照 – 回到過(guò)去
  • 壓縮 – 透明節(jié)省存儲(chǔ)空間
  • 配額組 – 限制文件系統(tǒng)大小
  • RAID – 替代 mdadm 配置

這遠(yuǎn)非 Btrfs 特性的詳盡列表。如果你想全面地了解可用特性,查看 維基 和 文檔。

總結(jié)

我希望我已能激起你進(jìn)一步了解計(jì)算機(jī)文件系統(tǒng)的興趣。如果目前你有任何疑問(wèn),請(qǐng)?jiān)谠u(píng)論區(qū)留言討論以便在日后文章中探討,同時(shí),你也可以自行學(xué)習(xí)文中提供的相關(guān)資源。如果你發(fā)現(xiàn) Btrfs 中某項(xiàng)特別有趣的功能,也歡迎在評(píng)論區(qū)提出。如果某個(gè)主題收到足夠的關(guān)注,我可能會(huì)在系列文章中新增相關(guān)內(nèi)容。下一篇文章再見(jiàn)!

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2023-10-16 10:08:31

Btrfs快照

2023-10-20 13:12:10

Btrfs壓縮

2023-10-04 09:44:56

Btrfs子卷

2010-07-20 16:05:07

Perl包

2010-02-01 16:13:15

C++繼承

2010-01-12 18:05:38

VB.NET對(duì)象

2010-01-13 10:15:19

VB.NET Stri

2010-02-02 09:43:27

C++存儲(chǔ)區(qū)域

2010-01-12 18:28:28

VB.NET共享變量

2010-01-13 18:17:00

VB.NET通信程序

2009-12-16 14:51:26

Ruby nil

2010-05-17 13:39:10

MySQL Clust

2011-05-18 15:40:32

XML

2009-08-27 10:14:04

LINQ基礎(chǔ)概念

2021-05-31 06:10:14

Btrfs文件系統(tǒng)Linux

2010-02-02 11:16:28

C++異常

2010-07-12 13:20:18

UML協(xié)作圖

2010-07-14 15:23:19

Perl文件句柄

2009-12-28 16:54:30

WPF注釋

2009-12-18 15:24:52

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)