目錄樹(shù)
綜合來(lái)說(shuō) , Linux 的 根文件系統(tǒng)(system’s root filessystem) 是內(nèi)核啟動(dòng)mount的第一個(gè)文件系統(tǒng) 。內(nèi)核代碼映像文件保存在根文件系統(tǒng)中 , 而系統(tǒng)引導(dǎo)啟動(dòng)程序會(huì)在根文件系統(tǒng)掛載之后 , 從中把一些基本的初始化腳本和服務(wù)等加載到內(nèi)存中去運(yùn)行(文件系統(tǒng)和內(nèi)核是完全獨(dú)立的兩個(gè)部分) 。其他文件系統(tǒng) , 則后續(xù)通過(guò)腳本或命令作為子文件系統(tǒng)安裝在已安裝文件系統(tǒng)的目錄上 , 最終形成整個(gè)目錄樹(shù) 。
start_kernelvfs_caches_initmnt_initinit_rootfs // 注冊(cè)rootfs文件系統(tǒng)init_mount_tree // 掛載rootfs文件系統(tǒng)…rest_initkernel_thread(kernel_init, NULL, CLONE_FS);
就單個(gè)文件系統(tǒng)而言 , 在文件系統(tǒng)安裝時(shí) , 創(chuàng)建超級(jí)塊對(duì)象;沿樹(shù)查找文件時(shí) , 總是首先從初識(shí)目錄的中查找匹配的目錄項(xiàng) , 以便獲取相應(yīng)的索引節(jié)點(diǎn) , 然后讀取索引節(jié)點(diǎn)的目錄文件 , 轉(zhuǎn)化為dentry對(duì)象 , 再檢查匹配的目錄項(xiàng) , 反復(fù)執(zhí)行以上過(guò)程 , 直至找到對(duì)應(yīng)的文件的索引節(jié)點(diǎn) , 并創(chuàng)建索引節(jié)點(diǎn)對(duì)象 。
軟鏈接 vs 硬鏈接
軟鏈接是一個(gè)普通的文件 , 其中存放的是另外一個(gè)文件的路徑名 。硬鏈接則指向同一個(gè)索引節(jié)點(diǎn) , 硬鏈接數(shù)記錄在索引節(jié)點(diǎn)對(duì)象的i_nlink字段 。當(dāng)i_nlink字段為零時(shí) , 說(shuō)明沒(méi)有硬鏈接指向該文件 。
文件 & 進(jìn)程管理
下圖是一個(gè)簡(jiǎn)單示例 , 說(shuō)明進(jìn)程是怎樣與文件進(jìn)行交互 。三個(gè)不同進(jìn)程打開(kāi)同一個(gè)文件 , 每個(gè)進(jìn)程都有自己的文件對(duì)象 , 其中兩個(gè)進(jìn)程使用同一個(gè)硬鏈接(每個(gè)硬鏈接對(duì)應(yīng)一個(gè)目錄對(duì)象) , 兩個(gè)目錄項(xiàng)對(duì)象都指向同一個(gè) 索引節(jié)點(diǎn)對(duì)象 。
索引節(jié)點(diǎn)的數(shù)據(jù)又由兩部分組成:內(nèi)存數(shù)據(jù)和磁盤(pán)數(shù)據(jù) 。Linux 使用Write back作為索引節(jié)點(diǎn)的數(shù)據(jù)一致性策略 。對(duì)于索引節(jié)點(diǎn)的數(shù)據(jù) , 當(dāng)文件被打開(kāi)時(shí) , 才會(huì)加載索引節(jié)點(diǎn)到內(nèi)存;當(dāng)不再被進(jìn)程使用 , 則從內(nèi)存踢出;如果中間有更新 , 則需要把數(shù)據(jù)寫(xiě)回磁盤(pán) 。
* “in_use” – valid inode, i_count > 0, i_nlink > 0* “dirty” – as “in_use” but also dirty* “unused” – valid inode, i_count = 0
索引節(jié)點(diǎn)是否仍在使用 , 是通過(guò)open()和close()操作建立和銷毀文件對(duì)象 , 文件對(duì)象通過(guò)索引節(jié)點(diǎn)提供的iget和iput更新索引節(jié)點(diǎn)的i_count字段 , 以完成使用計(jì)數(shù) 。open 操作使得 i_count 加一 , close 操作使得 i_count 減一 。在 close 操作時(shí)判斷索引節(jié)點(diǎn)是否釋放 , 如果 i_count = 0 , 則意味著不再有進(jìn)程引用 , 將會(huì)從內(nèi)存釋放 。
文件 & 磁盤(pán)管理
文件與磁盤(pán)管理聯(lián)系最緊密的操作 , 莫過(guò)于touch和rm操作 , 而尤以后者最為關(guān)鍵 。通過(guò)strace(或 dtruss) , 查看rm的實(shí)際的系統(tǒng)調(diào)用 。
# dtruss rm tmp…geteuid(0x0, 0x0, 0x0) = 0 0ioctl(0x0, 0x4004667A, 0x7FFEE06F09C4) = 0 0lstat64(“tmp”, 0x7FFEE06F0968, 0x0) = 0 0access(“tmp”, 0x2, 0x0) = 0 0unlink(“tmp”, 0x0, 0x0) = 0 0
可以發(fā)現(xiàn)rm實(shí)際是通過(guò)unlink完成的 。unlink代表刪除目錄項(xiàng) , 以及減少其索引節(jié)點(diǎn)的計(jì)數(shù) 。由通用文件模型可知 , 父目錄本身同樣是一個(gè)文件 , 也就意味著目錄項(xiàng)是其文件數(shù)據(jù)的一部分 。刪除目錄項(xiàng)等價(jià)于從父目錄的文件中刪除數(shù)據(jù) , 也就意味著首先要打開(kāi)父目錄的文件 。那么 , 刪除操作即可理解為:
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- mac和win都支持的u盤(pán)格式 蘋(píng)果u盤(pán)格式讀取
- java讀取apollo配置 java判斷文件夾是否存在該文件
- struts2和springMVC的區(qū)別 struts2配置文件詳解
- 教你crontab定時(shí)執(zhí)行shell腳本 crontab安裝配置文件
- 文件或目錄損壞且無(wú)法讀取方法 input上傳文件獲取內(nèi)容
- 移動(dòng)硬盤(pán)無(wú)法讀取的解決方法 移動(dòng)硬盤(pán)文件或目錄損壞無(wú)法讀取
- u盤(pán)手機(jī)連接線 ipad怎么讀取u盤(pán)
- 讀取車牌門(mén)禁系統(tǒng)原理
- thinkphp數(shù)據(jù)庫(kù)配置文件在哪 ThinkPHP配置文件的方法
- u盤(pán)無(wú)法訪問(wèn)怎么辦 U盤(pán)無(wú)法讀取怎么辦
