查看linux文件系统结构,linux的文件系统架构
linux的文件系統(tǒng)是由若干個樹形以及鏈表的結(jié)構(gòu)組成的,其中眾所周知,所有的目錄和文件組成了視覺上“一棵”樹,在這“一棵”樹背后有一條掛載鏈表,如果說每一個文件系統(tǒng)都是一棵樹的話(實(shí)際上就是如此),這個鏈表將很多棵樹鏈接成了那“一棵”樹,因此,linux的文件系統(tǒng)是由很多棵樹組成的,這些樹通過掛載鏈表聯(lián)系在了一起,比如/tmp/my是一個目錄,下面有文件file1,而我們可以將一個磁盤分區(qū)D掛載在這個目錄下,此時/tmp下面的文件就是磁盤分區(qū)D下面的文件了,不僅僅如此,通過這個模型還可以實(shí)現(xiàn)非存儲性質(zhì)的文件系統(tǒng)甚至任意的文件系統(tǒng),比如procfs,sysfs,tmpfs等等,在已掛載的文件系統(tǒng)的任意目錄掛載任意的文件系統(tǒng),這些文件系統(tǒng)可以在磁盤上,可以在網(wǎng)絡(luò)上,可以在內(nèi)存中,也可以在你心里,由此看來,這種文件系統(tǒng)實(shí)際上是可以無限擴(kuò)展的。
在最底層,linux維護(hù)了一個磁盤inode的概念,它代表了一個實(shí)際文件,然后在上一層,linux維護(hù)了內(nèi)存inode,它使得操作系統(tǒng)可以提供用戶接口來操作磁盤inode,內(nèi)存inode和磁盤inode是對應(yīng)的,vfs層將不同文件系統(tǒng)的不同格式的磁盤inode統(tǒng)一成了一致的內(nèi)存inode,如此一來向上提供的接口將統(tǒng)一,在接口統(tǒng)一之前,數(shù)據(jù)結(jié)構(gòu)首先要統(tǒng)一。和內(nèi)存inode相關(guān)的是目錄項(xiàng)dentry的概念,它綁定一個且只綁定一個內(nèi)存inode,但是卻允許多個dentry綁定同一個內(nèi)存inode,實(shí)際上它就是我們在使用操作系統(tǒng)時看到的每一個文件的內(nèi)核實(shí)體,既然允許dentry和inode的多對一的關(guān)系,操作系統(tǒng)很簡單地就可以實(shí)現(xiàn)諸如鏈接這樣的概念,這個意義上dentry并不是和內(nèi)存inode處于同一個層次,inode表示文件的本質(zhì),而dentry表示操作系統(tǒng)意義上文件的接口。
unix最先實(shí)現(xiàn)了vfs,在unix中內(nèi)存inode成為vnode,這個名稱可能更好聽些。這個vfs在linux中的實(shí)現(xiàn)要更復(fù)雜一些,其本質(zhì)就是這個內(nèi)存inode數(shù)據(jù)結(jié)構(gòu),進(jìn)而在該數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上提供file_operations操作函數(shù)集,這些數(shù)據(jù)結(jié)構(gòu)是怎樣組合起來的呢?它們是在什么時候組合在一起的呢?任何事情如果想搞透它就要從起源開始研究,于是sys_open系統(tǒng)調(diào)用中必然將這一切聯(lián)系在了一個,如果說sys_open還不夠的話,那么sys_mount作為一個文件系統(tǒng)的開始一定確定了該文件系統(tǒng)的基本模板,比如super_block結(jié)構(gòu)之類的,由于sys_mount還是要使用sys_open,那么sys_open當(dāng)然是重中之重了。open的輪廓為兩層循環(huán),外部的循環(huán)解析路徑,內(nèi)層的循環(huán)在特定的路徑尋找待open路徑中下一個元素,路徑元素由'/'分割。在進(jìn)一步處理下一個路徑元素之前,必須將當(dāng)前的dentry設(shè)置到當(dāng)前目錄的最頂一層掛載的文件系統(tǒng)的根目錄,這個在linux中由follow_mount來實(shí)現(xiàn),這樣所有被mount的目錄下的原始內(nèi)容就被隱藏了,原先的樹依然存在,只是在這個節(jié)點(diǎn)上又長出一個新的根,然后這個新根又?jǐn)U展成一棵樹,任意的樹節(jié)點(diǎn)上都可以生長出新根,然后遞歸地長出新樹。
系統(tǒng)中每一個被掛載的文件系統(tǒng)都有一個超級塊,超級塊是該文件系統(tǒng)的元數(shù)據(jù) ,所有的同類文件系統(tǒng)的超級塊鏈接成一個鏈表,在超級塊回調(diào)函數(shù)的指導(dǎo)之下,系統(tǒng)模塊可以支持各種各樣的文件系統(tǒng)。系統(tǒng)中還有一張掛載表,實(shí)際上是掛載樹,很多內(nèi)核實(shí)體都是同時連入不同的數(shù)據(jù)結(jié)構(gòu),這樣就方便在不同場合使用不同的數(shù)據(jù)結(jié)構(gòu),比如vm_area_struct既連入鏈表,又連入紅黒樹中。這個掛載表的每一項(xiàng)表示一次掛載,包含一個掛載文件系統(tǒng)的超級塊信息,被掛載點(diǎn)的inode對應(yīng)的dentry,掛載文件系統(tǒng)根的inode對應(yīng)的dentry以及設(shè)備號。
每個掛載的文件系統(tǒng)都有一個根,即“/”,它是一個特殊的目錄,一般每一類文件系統(tǒng)都會為這個根分配一個固定的內(nèi)存inode號,然后為后續(xù)此掛載文件系統(tǒng)分配掛載范圍內(nèi)唯一的inode號,因此不同掛載點(diǎn)的文件系統(tǒng)中的文件的內(nèi)存inode號會相同,注意,一般不要提及磁盤inode號是否唯一的問題和概念,因?yàn)椴⒉皇敲恳环N文件系統(tǒng)都有磁盤inode概念的,unix/linux只是為了實(shí)現(xiàn)vfs才將很多的文件系統(tǒng)統(tǒng)一“適配”到內(nèi)存inode(vnode),比如ntfs就沒有inode的概念,當(dāng)在linux上掛載ntfs分區(qū)的時候,內(nèi)核的ntfs模塊會將ntfs文件的元數(shù)據(jù)裝載到內(nèi)存inode中,這就是適配器模式在linux內(nèi)核的應(yīng)用。
總結(jié)
以上是生活随笔為你收集整理的查看linux文件系统结构,linux的文件系统架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle没有imp.exe,imp.
- 下一篇: 在linux运行math_neon库,l