前言
一、 簡單理解文件系統(tǒng)
我們接下來以磁盤舉例:
文件=文件內(nèi)容+文件屬性
Linux中文件內(nèi)容與屬性是分開存儲(chǔ)的。
文件內(nèi)容:在數(shù)據(jù)塊中存著
文件屬性:在inode中存著
Block Group:ext2文件系統(tǒng)會(huì)根據(jù)分區(qū)的大小劃分為數(shù)個(gè)Block Group。而每個(gè)Block Group都有著相同的結(jié)構(gòu)組成。政府管理各區(qū)的例子
超級(jí)塊(Super Block):存放文件系統(tǒng)本身的結(jié)構(gòu)信息。記錄的信息主要有:bolck 和 inode的總量,未使用的block和inode的數(shù)量,一個(gè)block和inode的大小,最近一次掛載的時(shí)間,最近一次寫入數(shù)據(jù)的時(shí)間,最近一次檢驗(yàn)磁盤的時(shí)間等其他文件系統(tǒng)的相關(guān)信息。 Super Block的信息被破壞,可以說整個(gè)文件系統(tǒng)結(jié)構(gòu)就被破壞了
GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息
塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個(gè)數(shù)據(jù)塊已經(jīng)被占用,哪個(gè)數(shù)據(jù)塊沒有被占用
inode位圖(inode Bitmap):每個(gè)bit表示一個(gè)inode是否空閑可用。
i節(jié)點(diǎn)表:存放文件屬性 如文件大小,所有者,最近修改時(shí)間等
數(shù)據(jù)區(qū):存放文件內(nèi)容
Linux系統(tǒng)中,一個(gè)文件,一個(gè)inode,每一個(gè)inode都有自己的inode編號(hào)是唯一的(inode的設(shè)置是以分區(qū)為單位的,也就是1號(hào)分區(qū)inode編號(hào)從1到500,2號(hào)分區(qū)也是1到500,分區(qū)之間編號(hào)互不影響),inode為一個(gè)結(jié)構(gòu)體,里面存著文件的所有屬性,文件名并不屬于inode屬性
格式化:
每一個(gè)分區(qū)在被使用之前,都必須提前先將部分文件系統(tǒng)的屬性信息提前設(shè)置進(jìn)對(duì)應(yīng)的分區(qū)當(dāng)中(也就是劃分好Block Group ,GDT,inode位圖等),方便我們后續(xù)使用這個(gè)分區(qū)或者分組
二、文件操作具體步驟
1.新建文件
首先會(huì)分配到一個(gè)空余的分組中,在分組中通過GDT來判斷是否有剩余的位置放入,在inodeBitmap中查找最近的沒有使用的下標(biāo),將其從0置為1,之后用這個(gè)inode編號(hào)去inodeTable中這到這個(gè)位置,將自己的信息(大小,修改時(shí)間之類的)寫入到struct inode結(jié)構(gòu)體中,文件就完成了創(chuàng)建
如果要寫入數(shù)據(jù),首先判斷要寫入數(shù)據(jù)大小需要幾個(gè)數(shù)據(jù)塊大小,之后根據(jù)BlockBitmap在位圖中找到未使用的數(shù)據(jù)塊,之后將其置為1,把塊號(hào)填到inode中block數(shù)組對(duì)應(yīng)的位置,之后到DataBlock中寫入數(shù)據(jù)
刪除=允許被覆蓋,可以提高系統(tǒng)效率
2.刪除文件
我們根據(jù)我們當(dāng)前文件所處的目錄確定我們屬于哪個(gè)分區(qū)的,根據(jù)文件inode大小確定我們是哪個(gè)分組的,通過inode編號(hào)找到我們對(duì)應(yīng)inode的屬性,根據(jù)屬性中blocks數(shù)組的內(nèi)容,去BlockBitmap中將對(duì)應(yīng)位置的置為0,之后再將inode編號(hào)的位置在inodeBitmap中置為0
3.查找文件
我們根據(jù)我們當(dāng)前文件所處的目錄確定我們屬于哪個(gè)分區(qū)的,根據(jù)文件inode大小確定我們是哪個(gè)分組的,通過inode編號(hào)在inodeTable中找到我們對(duì)應(yīng)inode的屬性,根據(jù)inode結(jié)構(gòu)體里面block數(shù)組去對(duì)應(yīng)的位置DataBlock找數(shù)據(jù),將對(duì)應(yīng)塊載入內(nèi)存,雖然我們載入了整個(gè)塊大小的數(shù)據(jù),但我會(huì)根據(jù)我當(dāng)前文件大小來在塊中讀取對(duì)應(yīng)字節(jié)的數(shù)據(jù)
三、目錄的重新理解
文件那些操作的前提都是基于我們有文件的inode編號(hào),但我怎么獲得我們inode編號(hào)呢?我們平時(shí)都是直接用文件名進(jìn)行操作的。
首先目錄也是文件,Linux系統(tǒng)下一切且文件,所以我目錄也有自己的屬性+內(nèi)容,也需要數(shù)據(jù)塊來存儲(chǔ)數(shù)據(jù)。
問:目錄里存放的是什么?
答:存放的是文件名與文件名其inode編號(hào)的映射關(guān)系。
問:既然這樣那我又是怎么獲得目錄的inode編號(hào)呢?我們得先知道目錄的inode編號(hào)讀取其數(shù)據(jù)內(nèi)容才能獲得文件名與inode編號(hào)?。。?!
答:我們會(huì)一路向上遞歸到根目錄,根目錄的位置是確定的,inode編號(hào)也是確定的,我們根據(jù)根目錄中存的數(shù)據(jù),找到目錄和inode的對(duì)應(yīng)關(guān)系
1.目錄下沒有w權(quán)限,無法對(duì)其下的文件進(jìn)行創(chuàng)建與刪除
因?yàn)榧幢阄覀儼盐募?chuàng)建出來,文件名與inode的映射關(guān)系,我們沒有w權(quán)限,我們就無法將這個(gè)關(guān)系存入目錄的數(shù)據(jù)當(dāng)中。
2.目錄下沒有r權(quán)限,無法對(duì)其下的文件進(jìn)行查看
我們要先獲得文件的inode編號(hào),才能去對(duì)應(yīng)數(shù)據(jù)塊中找文件的數(shù)據(jù),但現(xiàn)在目錄都不讓我讀啊!我都沒辦法獲取到文件的inode編號(hào),拿什么去讀文件?
3.目錄下沒有x權(quán)限,無法進(jìn)入這個(gè)目錄
進(jìn)入目錄,就是cd進(jìn)去, 將系統(tǒng)的環(huán)境變量做更新,給當(dāng)前路徑做更新,并給目錄信息做更新,但沒有x權(quán)限我們就無法執(zhí)行這一操作。
四、軟鏈接
軟鏈接是一個(gè)獨(dú)立的文件,有一個(gè)獨(dú)立的inode,也有獨(dú)立的數(shù)據(jù)塊,他的數(shù)據(jù)塊中保存的是指向文件的路徑(相當(dāng)于windows中的快捷方式)
命令:ln -s 要鏈接的文件名 創(chuàng)建的軟鏈接文件名
因?yàn)檐涙溄又写嬷溄游募穆窂?,所以我們可以選擇將我們的軟鏈接文件放入可執(zhí)行文件的目錄/usr/bin
``
這樣我們就可以以直接執(zhí)行我們自己寫的可執(zhí)行程序了
五、硬鏈接
硬鏈接不是一個(gè)獨(dú)立的文件,因?yàn)槠錄]有獨(dú)立的inode編號(hào),所謂建立硬鏈接,本質(zhì)其實(shí)是在特定目錄的數(shù)據(jù)塊中新增文件名和指向文件名inode編號(hào)的映射關(guān)系(相當(dāng)于取別名)
命令:ln 要鏈接的文件名 創(chuàng)建的硬鏈接文件名
每個(gè)inode內(nèi)部都有一個(gè)引用計(jì)數(shù)器(記錄有多少個(gè)文件指向我)
1.Linux不允許目錄建立硬鏈接,會(huì)造成閉環(huán)問題
文章來源:http://www.zghlxwxcb.cn/news/detail-752443.html
我們假設(shè)可以創(chuàng)建目錄硬鏈接文章來源地址http://www.zghlxwxcb.cn/news/detail-752443.html
到了這里,關(guān)于【Linux】文件系統(tǒng)中inode與軟硬鏈接以及讀寫權(quán)限問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!