【Linux庖丁解牛】— 文件系統!

1?引?"塊"概念

其實硬盤是典型的“塊”設備,操作系統讀取硬盤數據的時候,其實是不會?個個扇區地讀取,這樣 效率太低,?是?次性連續讀取多個扇區,即?次性讀取?個”塊”(block)。

硬盤的每個分區是被劃分為?個個的”塊”。?個”塊”的??是由格式化的時候確定的,并且不可 以更改,最常?的是4KB,即連續?個扇區組成?個”塊”。”塊”是?件存取的最?單位。

注意:

? 磁盤就是?個三維數組,我們把它看待成為?個"?維數組",數組下標就是LBA,每個元素都是扇 區

? 每個扇區都有LBA,那么8個扇區?個塊,每?個塊的地址我們也能算出來。

? 知道LBA:塊號=LBA/8

?? 知道塊號:LAB=塊號*8+n.(n是塊內第?個扇區)

2 引?"分區"概念

其實磁盤是可以被分成多個分區(partition)的,以Windows觀點來看,你可能會有?塊磁盤并且將 它分區成C,D,E盤。那個C,D,E就是分區。分區從實質上說就是對硬盤的?種格式化。但是Linux的設備 都是以?件形式存在,那是怎么分區的呢?

柱?是分區的最?單位,我們可以利?參考柱?號碼的?式來進?分區,其本質就是設置每個區的起 始柱?和結束柱?號碼。此時我們可以將硬盤上的柱?(分區)進?平鋪,將其想象成?個?的平 ?,如下圖所?: ?

3 ext2?件系統

3.1 inode Table&Data Blocks

操作系統在給磁盤分區后,由于每個區的大小可能還是很大,為了方便管理,還會進行分組。我們知道文件=內容+屬性,在Linux下,內容和屬性是分開存儲的,內容存儲在Data Blocks中【以快4kb進行存儲】。在Linux中,正常文件都要有自己的屬性集合{文件大小,創建時間,權限,類型等},而這些屬性則放在一個叫iNode的結構體【128字節】中

這里有一個特殊情況,文件名不會作為屬性,保存在文件的iNode當中!為什么呢?

以我們現在膚淺的理解:inode節點的大小是固定的,而每個文件名大小是不定的,如果讓inode保存文件名就會讓這個節點處于一個很尷尬的地位。我們也不可能做一個定長的字符數組,太短不行,太長也勢必會浪費很多空間。

在一個組中,有一個inode表,所有的inode節點都放在這張表中。內存讀取數據是以快為單位,也就是一次讀取4kb【一個數據塊,會保存32個inode】。那我們訪問一個inode時,其他inode是不是也加載到內存當中了呢?雀氏如此,有些inode我們可能不會訪問,即使加載到內存當中。不過,這樣做也有一定的原因,連在一起的inode一本來說都是一起創建有一定聯系的文件。它們有更大的概率會被同時訪問,這樣它們就不用多次加載了,這也就是局部性原理,和vector擴容有異曲同工之妙。

在inode中沒有存儲文件名,那我們如何區分一個文件的唯一性呢?

答案就是int inode_number,每個inode都有一個編號來區分文件的唯一性。

我們用ls -li 就可以查看一個文件的inode編號了。

3.2 Block Bitmap&inode Bitmap

我們現在已經知道文件的屬性和內容分別存儲在inode表和數據塊當中,但是,文件系統是如何管理這些區域呢,比如,文件系統是如何知道哪些數據塊使用了,哪些沒有使用,哪些inode節點使用了,哪些inode節點沒有使用呢?

很簡單,在一個分組中有兩張位圖Block Bitmapinode Bitmap,兩張位圖當中的每個比特位對應的就是每個數據塊和節點。如果比特位是0則表示這塊區域沒有被使用,為1則表示已經被使用。

3.3?GDT(Group Descriptor Table)

塊組描述符表,描述塊組屬性信息,整個分區分成多個塊組就對應有多少個塊組描述符。每個塊組描 述符存儲?個塊組的描述信息,如在這個塊組中從哪?開始是inode Table從哪?開始是Data Blocks,空閑的inode和數據塊還有多少個等等。塊組描述符在每個塊組的開頭都有?份拷貝。

// 磁盤級blockgroup的數據結構 
/** Structure of a blocks group descriptor*/
struct ext2_group_desc
{__le32 bg_block_bitmap; /* Blocks bitmap block */__le32 bg_inode_bitmap; /* Inodes bitmap */__le32 bg_inode_table; /* Inodes table block*/__le16 bg_free_blocks_count; /* Free blocks count */__le16 bg_free_inodes_count; /* Free inodes count */__le16 bg_used_dirs_count; /* Directories count */__le16 bg_pad;__le32 bg_reserved[3];
};

3.4 超級塊(Super Block)??


存放?件系統本?的結構信息描述整個分區的?件系統信息。記錄的信息主要有:bolck 和inode的總量,未使?的block和inode的數量,?個block和inode的??,最近?次掛載的時間,最近?次寫?數據的時間,最近?次檢驗磁盤的時間等其他?件系統的相關信息。Super Block的信息被破壞,可以說整個?件系統結構就被破壞了超級塊在每個塊組的開頭都有?份拷?(第?個塊組必須有,后?的塊組可以沒有)。

為了保證?件系統在磁盤部分扇區出現物理問題的情況下還能正常?作,就必須保證?件系統的super block信息在這種情況下也能正常訪問。所以?個?件系統的super block會在block group中進?備份,這些super block區域的數據保持?致。

3.5 一些細節

> 格式化的本質就是寫入文件系統的管理信息。

> Super Block在分區中有多份備份,在某些分組中存在。為什么不在一個分區的開始記錄一份,因為超級快實在太重要了,需要多份備份。

> inode和數據塊是跨組編號的。【即在一個分區內,所有的inode編號和塊號都是唯一的】

> inode和數據塊不能跨分區。

> 在Linux中看待目錄和文件一樣,目錄也有自己的inode和數據塊。只不過,目錄的數據塊中存儲的內容是該目錄下的文件名和該文件inode的映射關系。我們之前說一個文件的文件名不會被看做屬性被記錄到inode當中,現在我們知道文件名是被記錄到該文件所屬目錄的數據塊當中了。但是,這里有一個問題:我們知道可以用一個文件的inode找到文件【也就是說,文件系統只認inode編號】,但是,從我們用戶的角度來看,我們是用文件名來找到一個文件的。所以,文件系統是如何通過我們提供的文件名找到文件的呢?

有了上面的鋪墊,我們也可以很好理解:當我們要查找一個磁盤文件時,文件系統先打開該文件所在的當前目錄【也就是路徑】,得到文件名和inode之間的映射關系,最后也是用該文件的inode找到該文件。所以,我們訪問任何文件都必須要有路徑,找文件的本質是:從根目錄開始,進行路徑解析,找到對應的文件。

3.6 路徑緩存

我們訪問任何路徑都要從根目錄下開始進行路徑解析嗎?這樣不就是一直在做磁盤IO嗎,效率是不是太低了??

操作系統在我們進行路徑解析的時候,會把歷史路徑【目錄】記錄下來,形成一課多叉樹【這顆多叉樹和PCB一樣是內存級別的】,進行保存。這也就是Linux的樹狀目錄結構!

Linux中,在內核中維護樹狀路徑結構的內核結構體叫做: struct dentry

struct dentry {atomic_t d_count;unsigned int d_flags; /* protected by d_lock */spinlock_t d_lock; /* per dentry lock */struct inode *d_inode; /* Where the name belongs to - NULL is* negative *//** The next three fields are touched by __d_lookup. Place them here* so they all fit in a cache line.*/struct hlist_node d_hash; /* lookup hash list */struct dentry *d_parent; /* parent directory */struct qstr d_name;struct list_head d_lru; /* LRU list *//** d_child and d_rcu can share memory*/union {struct list_head d_child; /* child of parent list */struct rcu_head d_rcu;} d_u;struct list_head d_subdirs; /* our children */struct list_head d_alias; /* inode alias list */unsigned long d_time; /* used by d_revalidate */struct dentry_operations *d_op;struct super_block *d_sb; /* The root of the dentry tree */void *d_fsdata; /* fs-specific data */
#ifdef CONFIG_PROFILINGstruct dcookie_struct *d_cookie; /* cookie, if any */
#endifint d_mounted;unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};

注意:
? 每個?件其實都要有對應的dentry結構,包括普通?件。這樣所有被打開的?件,就可以在內存中
形成整個樹形結構
? 整個樹形節點也同時會?屬于LRU(Least Recently Used,最近最少使?)結構中,進?節點淘汰
? 整個樹形節點也同時會?屬于Hash,?便快速查找?
? 更重要的是,這個樹形結構,整體構成了Linux的路徑緩存結構,打開訪問任何?件,都在先在這
棵樹下根據路徑進?查找,找到就返回屬性inode和內容,沒找到就從磁盤加載路徑,添加dentry
結構,緩存新路徑

3.7 掛載分區

我們已經可以通過inode在指定分區中找到文件了,也可以通過目錄文件內容找到inode,但是inode不是不能跨分區嗎,我們怎么知道這個文件在哪個分區呢?

在Linux中,某個分區是無法直接訪問的,這時候就需要將目錄掛載到指定分區。也就是說,分區寫入文件系統,需要和指定的目錄關聯,進行掛載才能使用。

如此一來,我們就可以根據訪問目標文件的“路徑前綴”來準確判斷我在哪一個分區

至此,我們也可以更深刻的理解fopen時,操作系統干了什么了:首先拿到當前文件的路徑,再根據文件名和inode的映射關系得到inode,拿著inode在磁盤中進行索引找到當前文件,如果有可能,也會在dentry樹中索引提高效率。接著系統會在內存中創建struct file對象,將文件的屬性信息拷貝到file對象中的inode字段中,將文件的全部內容或部分內容寫入文件內核緩沖區當中。同時,系統也會創建對應的文件描述符表,并返回對應的文件描述符!

3.8 文件系統相關總結圖表

4. 軟硬鏈接?

4.1 軟連接

我們先來看一個現象:

可以看出,軟連接是一個獨立的文件,因為它有獨立的inode number。?

那軟連接有什么用呢?

在一些大型工程當中,我們的可執行文件可能被藏在一些比較深的路徑,直接找到這個路徑可能比較麻煩,這時候,使用軟鏈接我們就可以更方便的執行該程序,如下:

這就相當于Windows當中的快捷鍵,而軟鏈接文件的內容就是目標文件的路徑。當然,軟鏈接還有其他的作用,以后再說。?

4.2 硬鏈接

我們先來看一個現象:

我們直接使用了命令ln不帶選項就是硬鏈接,我們發現這兩個文件的inode編號都是相同的,所以硬鏈接文件就是不是獨立的文件,而是一組新的文件名和inode的映射關系。?

我們再看到這個數字,這個數字其實就是硬鏈接數。當這個硬鏈接數為2的時候,說明這個文件有兩個,也就是說硬鏈接可以幫我們完成一個文件的備份,當我們以一個文件名刪除文件時,這個文件的內容和屬性其實還在,我們通過另一個文件名就可以得到。這也就是硬鏈接的作用!

上面操作創建了一個目錄dir,這個目錄的硬鏈接數為什么是2呢,我們明明沒有注定完成硬鏈接操作,原因就是,在dir目錄下的影藏文件【.】就是當前路徑【也就是代表dir目錄】,所以 . 就是dir目錄的硬鏈接!?.. 也是同樣的道理啊。

至此,我們也明白了.和..的本質就是硬鏈接!

但是,在Linux中,我們用戶卻并不可以對目錄進行硬鏈接!但是,系統當中的.和..不就是目錄的硬鏈接文件嗎!這不是只許州官放火,不許百姓點燈嗎?事實就是如此,但是為什么系統不讓用戶自定義硬鏈接文件,卻又自己設計.和..的硬鏈接文件呢?

如果,我們在樹狀的目錄結構當中,其中一個文件對根目錄進行硬鏈接,那這就容易形成路徑換問題。那我們在目錄查找文件時就容易出現問題。而對于.和..硬鏈接文件雖然也形成了路徑換,但是由于名字特殊,做特殊處理即可!.和..存在的意義也是為了用戶方便進行命令操作。

還有個問題,軟鏈接不也形成路徑環了嗎,但是我們要看到改文件的類型是被l標識的!做特殊判斷即可!所以,在Linux中有些東西有其存在的考量和并不存在的理由。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912407.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何通過自動化減少重復性工作

通過自動化減少重復性工作的關鍵策略包括:1、識別可被規則化操作的任務、2、引入RPA(機器人流程自動化)工具、3、整合AI與業務流程系統、4、部署腳本與低代碼平臺、5、持續優化自動化場景與效率。 其中,“引入RPA工具”被廣泛認為…

知識變現全鏈路設計:從IP打造到商業閉環的系統方法論|創客匠人

一、變現低效根源:碎片化努力為何換不來持續增長? 創客匠人服務上千位知識創業者后發現,變現乏力多因缺乏系統設計:某營銷專家的課程因定位模糊、表達生硬、渠道單一,低價仍少有人問。文檔中提出的“六大超級設計公式…

如何利用人工智能大模型提升流量質量

摘要 流量質量是衡量數字化營銷效果的重要指標之一,它反映了用戶對網站或應用的興趣和滿意度。流量質量的常用評估方法有點擊率、跳出率和用戶停留時間等。本文將介紹如何利用人工智能大模型來分析和優化這些指標,提高流量質量,從而提升數字…

從單體架構到微服務:微服務架構演進與實踐

一、單體架構的困境與演進 (一)單體應用的初始優勢與演進路徑 在系統發展的初期,單體架構憑借其簡單性和開發效率成為首選。單體應用將整個系統的所有功能模塊整合在一個項目中,以單一進程的方式運行,特別適合小型系…

Elasticsearch 自定義排序:使用 Painless 腳本實現復雜排序邏輯

需求背景: 從es查詢數據出來的時候,要求type為CATALOG的數據排在最前面,也就是目錄類型的要放在最前面,而且要求按照層級排序,從L1到L5順序排序 直接上解法: {//查詢條件"query": {"bool…

華為云Flexus+DeepSeek征文|華為云數字人 + DeepSeek:智能交互的革命性突破

目錄 前言 關于華為云數字人和云服務 1、華為云數字人 (1)MetaStudio介紹 (2)應用場景 (3)功能特性 (4)使用體驗 2、華為云云服務 華為云數字人結合DeepSeek的核心流程 1、…

【GESP】C++四級練習 luogu-P5729 【深基5.例7】工藝品制作

GESP C四級練習,二維/多維數組練習,難度★★☆☆☆。 題目題解詳見:【GESP】C四級練習 luogu-P5729 【深基5.例7】工藝品制作 | OneCoder 【GESP】C四級練習 luogu-P5729 【深基5.例7】工藝品制作 | OneCoderGESP C四級練習,二維…

通過npm install -g yarn安裝Yarn顯示Proxy代理相關問題如何解決?

手動下載yarn.msi安裝包或者yarn.js文件 參考:windows 怎么下載yarn安裝包并將下載的yarn文件移動到全局目錄并添加執行權限?-CSDN博客

arm交叉編譯qt應用中含opengl問題解決

問題是采用正點原子方案中,用虛擬機交叉編譯含opengl的qt程序會出現編譯失敗問題,因為正點原子中的交叉編譯qt源碼時沒有編opengl。 野火似乎有解決: https://doc.embedfire.com/linux/rk356x/Qt/zh/latest/lubancat_qt/install/install_arm…

服務器排查與加固服務詳細介紹

一、服務概述 服務器排查與加固服務是針對企業核心信息資產(服務器)的全方位安全保障方案,旨在通過系統性排查潛在風險、修復漏洞、優化配置,提升服務器抗攻擊能力,確保業務連續性和數據安全性。該服務覆蓋硬件、操作…

提升開發思維的設計模式(下)

上期回顧 提升開發思維的設計模式(上) 2. 設計模式分類(23種設計模式) 2.13 組合模式(Composite Pattern) 將對象組合成樹形結構,以表示“整體-部分”的層次結構。 通過對象的多態表現&#…

h5學習筆記:前端打包

這2天做了一個實驗。在非module傳統的網頁,要實現改名和避免緩存。原本這個事情早在幾年前就做過借助gulp的方式或者fis3 的工具來完成。然而隨著nodejs 來到了24版本后,似乎nodejs的版本這事情就變動復雜多變了。 為什么那么麻煩?實際上開發…

14.OCR字符識別

目錄 1. 識別方法 1. OCR識別 2. OCR識別方法1-助手識別 3. OCR識別方法2-算子分割識別 4.文本分割識別 2. 文本分割 1. 借用助手設置參數文本分割+混合識別 2. 借用助手設置參數文本分割場景2 3.不同字符場景 1.傾斜字符 1. 識別方法 1. OCR識別 *OCR *1. 概念 * …

如果將Word里每頁的行數設置成50行

https://www.zhihu.com/question/357856175 本文來自知乎林聽晴 第一步:新建一個Word文檔 打開“頁面布局”,之后點擊圖片圈起來的小圖標,即可出現“頁面設置”頁面。 ? ? 路徑:頁面設置—文檔網絡,可以看到默認行…

WebRTC(十一):RTCP和SRTCP

RTCP 基本概念 RTCP 是 RTP 的控制協議,用于監控媒體傳輸質量和參與者狀態,并與 RTP 一起工作。RTP 用于傳輸媒體數據(如音視頻),RTCP 則用于傳輸控制信息。 RTCP 通常和 RTP 同時使用,并通過 不同端口&…

將element-plus table背景改成透明色

方法一:全局修改(推薦) /* 全局透明表格樣式 */ .el-table, .el-table__header-wrapper, .el-table__body-wrapper, .el-table__row {background-color: transparent !important; }/* 可選:自定義表頭和斑馬紋行的透明度 */ .el-table__header th {background-color: rgba(…

安全運營中的漏洞管理和相關KPI

漏洞管理一直是企業網絡安全運維中的關鍵環節,但又是安全運維的痛點。不僅要投入大量的人力物力,還無法被其他運維團隊所理解。那么,向領導層和相關團隊反映出當前漏洞管理的現狀和挑戰便是一個急需解決的問題。 通過有效的數據講好故事,發現問題,或許是做好漏洞管理的突破…

機器學習框架(1)

以吳恩達的《機器學習》課程為藍本,整理課程框架,自己學習的簡單記錄。 課程講解很清楚,建議有空可以看看原課程。 01 單變量線性回歸 回歸偏向于連續屬性,分類偏向于離散屬性。 監督學習是給定標簽的學習;而無監督學…

AI Ready數據庫,OceanBase打了一個樣

大數據產業創新服務媒體 ——聚焦數據 改變商業 過去一年,企業對AI的興趣不減。從接入大模型,到部署RAG(檢索增強生成)系統、探索AI Agent,AI從“新技術”變成了“業務工具”的候選項。但一個技術能否真正落地&#x…

趣味數據結構之——鏈

記得數組嗎,一個蘿卜一個坑的想象。在數組的世界里我們就是第三視角,置身于坑外的。如果我們是二維平面上的生物,那數組就是一維的線,我們可以隨機訪問,增刪查改,也可以一眼看出數組大小。 那么對于鏈來說…