一:VFS VFS架構要說Linux文件系統(tǒng),不得不說VFS:Virtual File System,如上圖,Linux設計了一個文件系統(tǒng)的中間層,上層用戶都直接和VFS打交道,文件系統(tǒng)開發(fā)者再把VFS轉換為自己的格式。這樣做的優(yōu)點主要有:
我們來看看這張文件系統(tǒng)層次圖中的每一層。
網絡文件系統(tǒng)NFS把文件層之后的操作在遠端實現(xiàn)。下面是NFS基本原理。 VFS組成盡管Linux內核是C語言寫的,但VFS是一種面向對象的框架,把文件相關的東西分為4個對象:
這些對象平時保存在磁盤上,使用時加載到內存并給各種屬性和接口賦值,同時inode和dentry都是有緩存的,這樣每次查找一個路徑,就不用等啊等啊讀磁盤了,翻一下緩存就能快速找到。 下面是一個文件結構示例: Unix風格文件那么問題來了,挖掘機技術到底哪家強?有人要問,真的靠一個VFS能統(tǒng)一所有的文件系統(tǒng)操作嗎?微軟那么配合啊,會采用和Linux一樣的接口?所以VFS要求文件系統(tǒng)要有Unix風格,主要是三種Style:
Windows的文件系統(tǒng)FAT,NTFS其實不太一致,有的文件信息不專門用inode來存,有的文件夾和文件區(qū)別開來,這些文件系統(tǒng)磁盤里面沒有superblock,inode,需要在內存中生成inode和superblock來模擬。 引用Robert Love, Linux Kernel Development. https://swbae98./tag/ext4/ 二:餓想她超市血拼記 自從二十多年前一些追尋自由的人建立了Linux市以來,餓想她超市就開始經營超市業(yè)務,并且不斷擴大,每開一家新店,就會用更先進的技術管理商品,給顧客更好的購物體驗,所以現(xiàn)在餓想她已經是Linux市最有人氣的大超市了,市民們的各種日用品都去里面采購,每天人聲鼎沸,熙熙攘攘。 話說有一個小青年叫蛋蛋,剛從著名的Linux市代碼農業(yè)職業(yè)技術學院畢業(yè),成為了一名光榮的碼農。租好了房之后,他聽說著名的”餓想她”超市在附近新開了第四家分店,叫做EXT4,蛋蛋決定去買些吃的回來。這里我們要提醒一句了,Linux市已經進入了信息化社會,信息就是能量,居民們吃的食物叫做數(shù)據(jù),單位是字節(jié)。 貨架Block Group民以食為天,蛋蛋懷著饑餓的心情,來到餓想她超市大門口,看到了亮閃閃的Logo,興奮的已經飽了半分。餓想她是個工業(yè)化的超市,所有的物品都放在一個叫做sector的盒子里,每個sector大小是512字節(jié),但是餓想她真正登記貨物的最小盒子叫Block,里面放了8個sector,總大小4k字節(jié)。 餓想她超市把整個超市劃分成很多貨架,叫做Block Group,每個貨架上放了32768個Block盒子。每個貨架上的東西如下圖,后面將一一介紹。Superblock是超市概覽,Group Descriptor 是貨架介紹,Block bitmap是盒子的分布表,Inode Bitmap是貨物標簽分布表,Inode Table是標簽存放的地方,Data Block是貨物存放的地方。 超市概覽Superblock如上圖,蛋蛋提著個購物籃快步走到了一個長長的貨架前面,看著玲瑯滿目的商品,不禁一頭霧水:天哪,我該怎么找東西???還好,旁邊有一位美麗的導購姐姐帶蛋蛋來到貨架最前面,拿起一本小冊子給蛋蛋,上面是整個餓想她超市的介紹,叫做Superblock。里面的主要內容就是下面這張表,冒出了一大堆的名詞,但誰叫蛋蛋是農業(yè)技術學校畢業(yè)的呢,一看就明白了。這里面說了,超市有多少個block盒子,多少個貨物的標簽inode,每個貨架有多少的盒子block per group,超市的開張時間mount time,蛋蛋想一定要記住,周年慶了就來撿便宜貨,嘿嘿~ 引用https://ext4.wiki./index.php/Ext4_Disk_Layout 三:超市貨架的秘密 上回說到,蛋蛋來到餓想她超市第四家分店EXT4,發(fā)現(xiàn)每個貨架Block Group上都有一份超市概覽Super block的副本供顧客查閱。憑著代碼農業(yè)扎實的基礎,蛋蛋終于搞清楚了貨架的秘密。 首先我們還是得介紹一下Linux市民和我們當代人類的有一個不同??催^三體的人都知道,三體人沒有語言,而是直接看到對方的思想,不能掩藏自己的想法。Linux市民沒有嘴巴,他們只能通過數(shù)據(jù)來交流,這就是他們以數(shù)據(jù)為食物的原因:說多了,數(shù)據(jù)用沒了,餓了! 貨架說明Block Group Descriptor蛋蛋看完了超市概覽,就把它放回第一個大盒子block里。然后,打開第二個大盒子,從這里開始的幾個大盒子是貨架說明,Block Group Descriptor。 如下圖,這里面寫了這個貨架上標簽分布表inode bitmap、標簽表inode table在哪里,貨物分布表block bitmap在哪里,貨架上還有多少空盒子free block count,空標簽等等,最后還有一些特殊的字符checksum來幫助檢驗有些重要數(shù)據(jù)是不是寫錯了。 標簽和數(shù)據(jù)分布表bitmap蛋蛋合起盒子,按照貨架說明的指示,打開后面的幾個盒子,分別找到了標簽分布表inode bitmap和盒子分布表block bitmap。前者表示標簽表inode table哪些條目是占用的,后者表示哪些盒子里面有數(shù)據(jù)。他們的內容都是用一個bit是0或者1表示空或者非空。Bit是Linux市民食物字節(jié)的基本元素,8個bit組成了一個字節(jié)。 標簽表inode table蛋蛋看完兩個分布表,就知道貨架上的一個基本情況了,于是關起盒子,按照貨架說明的指示,打開了有一個盒子,上面寫著:標簽表。我們要透漏Linux市的第三個特征了,他們的貨物叫做文件,每個文件在超市里面都有一個標簽來說明和索引,方便查找和管理,叫做inode。 標簽表里面有貨架上所有貨物的標簽,每個標簽的主要內容如下表。包括了:
引用https://ext4.wiki./index.php/Ext4_Disk_Layout 四:神奇的標簽 上回我們說到,蛋蛋從標簽表中看到了一個標簽inode的內容,inode里面包含的東西除了那些,還有個更重要的就是貨物的位置:到底放哪些盒子里面? 要知道Linux市的貨物是用字節(jié)組成的長串,有的只占了一個盒子,有的占了多個盒子,甚至成千上萬個盒子,而標簽表只留了60個字節(jié)保存查找信息,根本放不下那么多盒子的位置信息,那么到底該怎么辦?我們來看看聰明的餓想她超市怎么解決這個查找的難題。 三級映射俗話說,有錢能使鬼推磨,為了降低成本,給顧客提供更大的便利,餓想她超市的老板命令工程師趕快解決上面這個問題,搞定了工資翻番,否則卷鋪蓋走人。工程師老蛋剛剛開始Linux的碼農生涯,就接了這么個活,站在自己家的大樹底下冥思苦想,想了幾天幾夜,還是沒有頭緒。一氣之下,他一頭撞在樹皮上,心想自己要跟月亮上的吳剛一樣,一輩子要跟這棵樹為伴了。唉,樹?。“?,樹!哈哈哈哈!大樹底下傳來了老蛋的四聲大笑:我終于明白了,在這個60個字節(jié)里面可以用三級映射來存放貨物的地址,就跟樹的枝干一樣,一級級細分。 如下圖,開始是頭幾個數(shù)據(jù)盒子的位置,對那種小貨物足夠了。后面是一級映射表的盒子位置,找到這個盒子就能找到所有的1024個數(shù)據(jù)盒子,因為里面放了1024個盒子的位置。如果還不夠,那么就用后面的二級映射,里面是所有一級映射的位置,從一級映射的盒子里面再找到所有的數(shù)據(jù)盒子位置,這樣就是1024*1024個盒子了。尼瑪,還不夠,嘿嘿,后面還有三級映射,總共包含1024*1024*1024個數(shù)據(jù)盒子的位置。 擴展樹:真正的樹老蛋得到了餓想她超市創(chuàng)始老板的嘉獎,成了公司技術骨干。但是,后來超市創(chuàng)始老板退休,少老板接班,新官上任三把火,決定建設一個更厲害的第四家分店ext4。他年輕有為,找到老蛋說:蛋仔,你這個三級映射太麻煩了,位置都是固定死的,修改什么的太麻煩,而且如果盒子都是連續(xù)放置的,還得在映射里面一條條保存他們的位置,一點都不高效,太浪費空間了。回去給我弄個更好的辦法,完不成提頭來見! 老蛋覺得自己受到了侮辱,成名作被一個小年輕貶的一文不值,忍著內心的悲憤回到家,跟老婆說自己都想跳槽了。老婆聽了,瞪了他一眼:沒本事整更牛的,躲開算什么男人。老蛋一想,腦子也轉過來了,于是又來到熟悉的大樹下,想啊想,還是沒辦法。突然,他想,瞅瞅大樹肯定有辦法,一抬頭,心中頓時豁然開朗:樹啊樹,又是你幫了我,不禁老淚縱橫~ 老蛋這次設計了一棵真正的大樹來放貨物的地址。如下圖,樹有一個根節(jié)點,后面有很多子節(jié)點,每個節(jié)點都有一個header,header后面的數(shù)據(jù)有兩種類型,第一種是索引,就是樹枝的位置,第二種是葉子,放數(shù)據(jù)盒子的位置。這樣一級級就可以查到,而且數(shù)據(jù)節(jié)點表示的是一串連續(xù)盒子的開頭位置和數(shù)量,而不用全都一個個列出來。老蛋再次得到了少莊主的嘉獎,他得意地回家對老婆說:每一個成功的男人背后都有一個不認輸?shù)呐耍?/p> 節(jié)點頭 樹枝內容,指向更細的樹枝 葉子內容 引用https://ext4.wiki./index.php/Ext4_Disk_Layout http://www./2009/11/16/learn-more-about-ext4/ http://blog./uid-26430381-id-4559492.html 五:按圖索驥找吃的 蛋蛋自以為搞清楚了貨物標簽的來龍去脈,突然他發(fā)現(xiàn)了一個重要的問題:貨物的名字在哪里?是啊,標簽inode里面那么多東西,為什么偏偏沒有貨物的名字呢?那么文件名到底藏在哪里,蛋蛋帶著疑問繼續(xù)翻盒子,終于找到了真相。 話說古代有個人,拿著馬經去找馬,按照圖紙牽了一匹馬回來,沒想到大家發(fā)現(xiàn)他找到的是一只大蟾蜍!這就是上面這張圖,按圖索驥的故事,諷刺刻板按照圖紙做事,但其實應該怪寫馬經的人,寫得不嚴謹,不精確,讓人找到錯的東西。Linux市經濟發(fā)達,貨物眾多,僅僅取個名很容易混淆,而且也不好管理。餓想她超市的人為了精確的表示每一個貨物,給每個貨物按個名字的同時,還加了個目錄,每個目錄里面有文件,也有目錄,最上面是個根目錄,這樣,從根目錄出發(fā),一級級找下去,就能找到最終的貨物。 路徑Dentry如下圖,要找一個文件/var/test.txt,這條路有兩條路徑,/->var,var -> test.txt,合起來就成了完整的路。每一個目錄有一個inode,同時也有dentry。先拿到根目錄/的dentry,得到它的inode地址,從inode又知道了data block位置,data block里面是個大數(shù)組,依次放著所有這個目錄里面一級目錄和文件的dentry。把var和每一個dentry的文件名一一比較,就找到了var的dentry,按同樣的方法,繼續(xù)重新開始,最終就找到了test.txt的數(shù)據(jù)盒子block了。
Dentry的內容如下,主要是文件名和inode的編號。 Hash Tree快速查找了解到這里,蛋蛋真是煩透了:買個東西這么麻煩啊!要在每個dentry的盒子里面和所有下一級dentry一個個比較,真是累死人了!還想不想做生意了,搞得哥不爽,去別家買了。扭頭便走,走到門口又停下來了:我是不是低估了餓想她超市的智商,他們生意做得這么好,肯定不會一直用這么麻煩的流程。蛋蛋又回去逛了逛:原來前面那一套都是舊的超市用的過時的方法,最近新開的店都用了更先進的方法:Hash Tree。什么,又是一棵樹,你們超市工程師以前都是種樹的吧? 如下圖,根目錄的盒子里面是個表,每個路徑用hash算法算出一個hash值,每個hash值有一個自己的盒子,里面是所有的dentry,如果多個路徑是同樣的hash值,那么就在這個hash的盒子里面放所有的dentry。這樣,最快查一次就查到一個路徑的dentry了,畢竟hash重復的概率還是不大的。 每個hash條目的內容如下,32位Hash值和對應的盒子地址。 引用https://ext4.wiki./index.php/Ext4_Disk_Layout http://www.cnblogs.com/vamei/p/3506566.html http://oldblog./2011/03/ext3adir-indexioo.html 六:諾蘭,記憶碎片,掉電恢復 自從蝙蝠俠系列,盜夢空間和星際穿越全球熱映之后,導演克里斯托弗·諾蘭成了票房的保證。 諾蘭早期拍過一部電影——記憶碎片,主人公的妻子被人奸殺,自己腦部受傷,從此患上了一種失憶癥:沒辦法形成新的記憶,因為新的記憶只能持續(xù)10分鐘。但是他還是要找到真兇,為愛妻報仇。為了讓自己記憶,他不斷的在身上寫筆記,拍立得拍照片,腿上貼便簽,記下新的進展和下次的行動。每次醒來后從這些記錄搞清楚情況,繼續(xù)報仇之路。劇透就到這里,要想知道兇手的結局,請觀看這部精彩的影片。 SSD掉電恢復老子說禍兮福之所倚,這個人經歷了這么多磨難,終于成為了一個杰出的存儲系統(tǒng)數(shù)據(jù)恢復專家。存儲系統(tǒng)掉電之后就類似于人的失憶,必須通過之前記的記錄恢復出數(shù)據(jù)的索引表。要像他一樣不斷做記錄,還要做的有規(guī)則,亂記了下次醒來就南轅北轍了。對于SSD來說,要恢復出映射表,才能知道用戶地址到內部物理地址的對應關系。具體掉電恢復的技術brokenegg大神已經介紹過,請點擊本文末尾的閱讀原文查看。 Journal——EXT3/4文件系統(tǒng)掉電恢復利器本文介紹文件系統(tǒng)EXT4(不是EXO)的掉電恢復利器日志(Journal)。 如果你看了公眾號前面文件系統(tǒng)的文章,就知道最核心的數(shù)據(jù)是lnode,文件系統(tǒng)的映射表,記錄了每個文件數(shù)據(jù)塊的地址。 以前的文件系統(tǒng),掉電恢復要掃描整個磁盤才能把inode和數(shù)據(jù)塊正確對應起來,有了日志之后,就不用這樣慢悠悠掃全盤了,只要把上次Checkpoint保存的日志掃一遍就可以了。已經刪除的文件,只要數(shù)據(jù)塊還沒被覆蓋,也能通過journal恢復出來。 引用:https://view.officeapps./op/view.aspx?src=http%3A%2F%2Fwww.cs.umd.edu%2Fprojects%2Fshrug%2Fppt%2F5-Oct-2001.ppt 七:最適合SSD的文件系統(tǒng) 餓想她超市和GRE單詞我之前用餓想她超市的例子介紹了EXT4文件系統(tǒng),SSDFans的不少讀者從事技術研發(fā),功力深厚,覺得這樣寫顯得太業(yè)余了:還不如直接看技術文檔爽快!有個讀者回復讓我們直接改名叫SSD業(yè)余粉絲o(^▽^)o 我先不直接說明原因,來說說GRE單詞吧。不少人可能背過俞敏洪的GRE紅寶書,為了幫助背單詞,俞敏洪把很多單詞進行了拆分聯(lián)想,幫助記憶。比如Vulnerable這個單詞,可以讀音理解成漢語的溫拿(winner),溫拿過得比較舒服,溫室里的花朵,很脆弱,所以就想到了單詞的意思:脆弱的,容易受傷害的。還有一種記憶法是重復,不斷重復背誦,再難的也記住了。我們工作中大部分記憶都是后者,為什么大家對自己的專業(yè)領域如此精通?就是通過一遍遍工作中的重復勞動牢牢掌握了這些技能,用的時候信手拈來。 對于不了解文件系統(tǒng)的人,工作中也不會大量接觸,就沒辦法通過重復法記住,那只能通過聯(lián)想法了,這就是我用餓想她超市來類比文件系統(tǒng)的原因:不了解文件系統(tǒng)的人,只要記住文件系統(tǒng)是個超市,文件是貨物,放在盒子block里面,inode是貨物的標簽,記錄了貨物的盒子位置,就掌握了文件系統(tǒng)的精髓。如果只是看看技術文檔,估計過不了一個月就忘得一干二凈了。 適合SSD的文件系統(tǒng)最需要什么?其實最需要的就是文件的inode映射表和SSD內部的FTL映射表統(tǒng)一成一個表,這樣就解決了大部分問題??梢詤⒖急菊镜膹拇?,SSD不用再偽裝成HDD(http://www./?p=832)一文,這樣做有幾個優(yōu)點:
適合SSD的文件系統(tǒng)在哪里?這樣看來,目前并沒有免費開放的SSD專用文件系統(tǒng),因為大部分SSD為了適應HDD的框架,都是把LBA作為基本單位,文件系統(tǒng)來訪問LBA,機械硬盤時代發(fā)明的LBA隔斷了SSD和文件系統(tǒng)的聯(lián)系。就像上圖,SSD是那個鐵路和火車,但是悲哀的是沒有火車頭,車都是馬來拉的,速度自然提不上去了。 SSD沒有一個通用的協(xié)議來開放內部數(shù)據(jù)通道給上層軟件,如果有這樣一個開放的接口,那么誕生可以融合SSD內部FTL的文件系統(tǒng)也是自然的事 。 本文轉載自SSDFans:(完) |
|