? ? ? ? 上章講的是 os 如果管理被打開的文件,那么沒有被打開的文件(也就是在磁盤單中的文件)使用文件系統進行管理。了解完這一章,我們就可以理解我們如果想要打開一個文件的是如何找到整個文件,然后如何把它加載到內存中的,在這之前我們還會進行學習磁盤的物理結構,CHS和LBA地址,理解磁盤是如何進行分區的以及軟硬連接的使用和途徑!!!
目錄
一、?理解磁盤的結構
? ?1.1 見一見
1.2 磁盤的名詞?
1.3 磁盤邏輯結構
1.4 磁盤定位
? 1.5?CHS && LBA地址
二、 文件系統
?2.1 “塊” 的概念
2.2 分區
2.3?inode
三、Ext2 文件系統
?3.1 是什么
?3.2 有什么
3.3 與實際相關聯
? 3.3.1 目錄與文件名
? 3.3.2 路徑解析 與 路徑緩存
?3.3.3 掛載
四、軟、硬鏈接
4.1 軟鏈接
? 4.1.1 是什么
? ?4.1.2 怎么用
4.2 硬鏈接
?4.2.1 是什么
?4.2.2 怎么用
五、總結
一、?理解磁盤的結構
? ?1.1 見一見
? ? ?可以看到這個磁盤面非常的光滑,可以認為這個這個光滑的此面是許多的磁性物質組? 成,里面存放著我們的數據,然后還有一個磁頭,通過磁頭的指向,指向特定的區域然后得到想 要的文件
1.2 磁盤的名詞?
? 主要的名詞需要記住的有:磁頭,磁道,磁面,柱面,扇區。
? ? 磁道:在磁盤上面可以分成一圈一圈的。雖然你肉眼看到的是一個光滑的平面,但是要是拿一個顯微鏡看的話也可以看到是一圈一圈的
? ? 柱面:一塊磁盤當我們從側面看的時候是由許多片共同構成的所以,由磁道 + 多個磁面構成的結構立體圖形就是柱面。
? ? 磁頭:用來進行定位的。每個盤??般有上下兩?,分別對應1個磁頭,共2個磁頭
? ? 扇區:由磁頭位置到一定長度的磁道位置組成的一個扇形(注意:里面由磁道組成的扇形由遠到近,雖然大小不是相同的但是我們規定并且認為不論大小都是相同的)
? ? 磁面:就是我們肉眼可以看到的那個區域。
? ? 補充:扇區是磁盤進行文件儲存的一個基本單位,512字節,是一個塊設備。
? ? ? ? ? ? ? ? 磁盤容量 = 磁頭數 *?磁道數 * 每道扇區數 * 每扇區字節數。
? ? ? ? ? ? ? ? 控制磁頭的傳送臂式共進退的。
1.3 磁盤邏輯結構
? ? ? ? 前面理解了磁盤的物理結構,他是啥樣的就是啥樣的,但是我可以把它抽象成邏輯結構的方式來進行深入的理解,同時理解我們的文件系統它到底是如何進行工作的。
? ? ? ? 小時侯我們都玩過錄音帶,我們可以看到它的結構是一圈一圈的是不是非常的像我們的磁盤,當我們把他的纏成一圈一圈的磁帶將它展開,是不是就是一條長長的線,那我們就可以將它抽象為一個數組,所有我們的磁盤也可以簡單的理解成是要給一維數組的方式進行存放數據的,也有的相應的邏輯尋址方式。
? ? ? ? 在實際過程當中,因為我們的磁頭是共進退的,所有當我以柱面的方式來看待磁盤的時候可以發現是由二維的數組形式來實現的。
1.4 磁盤定位
? ? ? ? 當我們需要尋找要給扇區的時候,先找到哪?個柱?(Cylinder) ,在確定柱?內哪?個磁道(其實就是磁頭位置,Head),在確定扇區(Sector),所以就有了 CHS 。
? ? ? ? 因為我們是將磁盤的邏輯結構看為是一個線性數組,所以每一個扇區都有一地址叫做 LBA(Logical Block Address).
OS只需要使?LBA就可以了!!LBA地址轉成CHS地址,CHS如何轉換成為LBA地址。誰做啊??磁盤??來做!固件(硬件電路,伺服系統)
? 1.5?CHS && LBA地址
- CHS 變 LBA
? ? ? ? 扇區數 = 磁頭數 * 每磁道扇區的數量
????????LBA = 柱面號C * 單個柱面的扇區總數 + 磁頭號H*每磁道扇區數 + 扇區號S - 1
(扇區號通常是從1開始的,?在LBA中,地址是從0開始的、柱?和磁道都是從0開始編號的)
一句話:我是第二個柱面就要加上前面一個柱面的所有扇區的數量,以及我是第幾個磁頭就要算上我是前面的 n - 1 個磁頭對應的扇區的數量,最后在加上我前面的扇區數,以為是從 1 開始而數組的下標是從 0 開始的,所有要 - 1,而柱?和磁道都是從0開始編號的剛好可以計算。
- LAB 變 CHS
?????????柱?號C = LBA // (磁頭數*每磁道扇區數)【就是單個柱?的扇區總數】
????????磁頭號H = (LBA % (磁頭數*每磁道扇區數)) // 每磁道扇區數
????????扇區號S = (LBA % 每磁道扇區數) + 1
???????? "//": 表?除取整
? ? ? ? 其實這個轉化的內容我們不需要特別熟練,我們需要知道的是磁盤就是一個數組,而數組的下標就是 LBA 地址, os 通過 LBA 這個數組就可以訪問磁盤當中的扇區,就可以方式存放在磁盤當中的內容。
二、 文件系統
?2.1 “塊” 的概念
? ? ? 磁盤是一個典型的“塊”設備,可以隨機讀取。并且 os 是以塊為一單位進行讀取文件,提高os 的效率,我們最常見的塊是 4 kb,即連續?個扇區組成?個 ”塊”!
? ? ? ? 這么做的目的就是為了提高 os 讀取文件的效率。計算方法為 LBA / 8 就是哪個塊區。
2.2 分區
? ? ? ? 磁盤是可以被分成多個分區(partition)的,以Windows觀點來看,你可能會有?塊磁盤并且將它分區成C,D,E盤。那個C,D,E就是分區。分區從實質上說就是對硬盤的?種格式化。
? ? ? ? 在 Linux 是柱?是分區的最?單位,我們可以利?參考柱?號碼的?式來進?分區,其本質就是設置每個區的起始柱?和結束柱?號碼。
? ? ? ? 這樣做的目的在于,我們管理好一個 500G 的空間,與分區管理好100G 的磁盤空間是一樣的,同時這樣的難度也大大降低,所以這就是分區!
? ? ? ? 100G 的磁盤空間進行管理的還有有點困難,所以我們還需要進行分組,在進一步進行細分。還需要了解的是我們的 LIiux 對于文件的內容與屬性是進行分開存放的。
2.3?inode
? ? ? ? 前面我們提到了文件的內容與屬性是分開的。我們使用 inode 用來表示 一個文件所有的屬性。使用 stat 可以查看,在 Linux 是一個結構體。還有一個非常重要的概念就是每一個 inode 為了標識它和他的文件,回一個 inode_num 編號的方式存放在 inode 的這個屬性里面。使用 -li 可以顯示。
????????值得注意的是我們的 inode??并沒有包括文件名,這個原因我將會會在后面進行講解。
三、Ext2 文件系統
?3.1 是什么
? ? ? ? 前面我們提到了,使用分區的方式進行管理磁盤,那么分區就是文件系統的載體.只有經過分區,同時在分區的基礎上再添加上文件系統,那么我們的文件才可以被真正的使用。
????????其早期版本為 ext2,后來?發展出 ext3 和 ext4。ext3 和 ext4 雖然對 ext2 進行了增強,但是其核心設計并沒有發?變化,我們仍是以較老的 ext2 作為演示對象。
? ? ? ? 我一開也不是特別理解下面的那個圖片是什么意思我簡單的描述一下:1. 每個 partition 都是一個分區,再下面一層就是分組看,比方說我的分區大小為 300GB,那么分成 10 組,每個就是 30 GB,所以 File System 就是管理的分組。
?3.2 有什么
? ? ? ? 接下來的專有名詞的描述我將使用我的語言,我的理解進行解釋,如果想要了解,完整官方的解釋可以自行查找。
- ?Super Block
? ? ? ? 超級塊:進行存放一整個分區的相關信息,在每一個分組里面都具有這個 super,這是因為為了備份,如果丟失的話就代表著整個文件無法使用。
- GDT
? ? ? ? 塊組描述符表:塊組塊組描述的是分區之后的組里面是有好多的4kb的塊形成的這個組,所以叫做塊組。描述符表就是表示后面的其他分分組的開始位置以及 inode 使用情況以及數據塊的使用情況的表。是用來管理整個分組的一個區域。
- Block Bitmap
? ? ? ? 表示數據區的使用情況的位圖,表示那些是已經被使用,那些沒有被使用。如果想要刪除一個文件的話,直接由 1 - 0 即可。
- inode Bitmap
? ? ? ? 表示 inode 使用的情況。
- inode Table
? ? ? ? 存放文件的屬性的地方(這里解釋一下為什么使用一個相同的 inode :因為雖然文件的屬性具體的內容不相同,但是都具有這些類型,單個 inode 的大小為 128 字節,但是當內存進行加載的時候會加載 4 kb 的內容,所有只要是符合這個范圍的都可以加載到磁盤上)
- Data Blocks
? ? ? ? 存放文件的內容的地方。
? ? ? ? 還有需要注意的小點為:1. inode 和 數據塊跨組編號,不能分區,同時也是唯一的標識不會進行重復。2. 對于不同的 inode 采用 bit 的時候可能很大不用擔心無法存放的問題,因為可以%的方法進行存放。
3.3 與實際相關聯
? 3.3.1 目錄與文件名
? ? ? ? 前面我們了解到了,我們可以根據 inode 編號找到對應的 inode 結構;再根據 inode 中的數據塊指針,最終定位到磁盤上實際存放文件內容的 LBA 地址。前面這句話可能有點難以理解,簡單說就是文件系統把“物理位置”的復雜性封裝起來,你通常只通過 inode 或路徑就能訪問文件;那么目錄是一個什么鬼?我們說的都是文件,目錄是個什么東西?以及我們使用的都是文件名,也沒有使用 inode 編碼呀!
? ? ? ? 一說 inode 編號其實就可以聯想到是不是目錄里面存放的就是 inode 編號。沒錯:目錄就是一個文件,當進入一個目錄(工作目錄)的時候,就是打開了目錄這個文件的相關內容,然后根據文件名 與 inode 的映射關系,打開文件。 Linux 系統下一切皆文件。
? 3.3.2 路徑解析 與 路徑緩存
????????/home/djx/code/test/test/test.c 我們的 os 會解析這個路徑從/也就是根目錄下開始進行解析。知道找到了這個文件的 inode 編號,然后文件系統就回去對應的位置去查找相關的信息。這就就叫做路徑的解析。
? ? ? ? 明白了這個也就理解了,我們為什么需要路徑 + 文件名 才可以打開這個文件了!????????
? ? ? ? 然而每一次我們的 os 都會從頭開始進行尋找嗎?不是的, os 會有一個 dentry 結構樹,進行路徑的緩存,如果是第一次打開在遍歷完這個樹之后沒有找到相應的文件就會加載,但是如果是之前已經打開過的就不需要進行重新加載,直接在這個樹結構當中尋找即可!這就是路徑的緩存!是一個內存級的概念!
? ? ? ? 這個路徑緩存在 Linux 內核當中是叫做 dentry 樹的一個結構。在這個 dentry 當中還有 hash 與 LRU 淘汰的算法。
?3.3.3 掛載
? ? ? 一個問題在于我們的分區是相互獨立的,不同的分區可能會具有不同的文件系統!那么操作系統是如何知道我的 inode 到底是哪個分區呢?
? ? ? ? 這就是磁盤掛載的功能:即我們的文件路徑的前綴會跟分區建立映射關系,知道前面的路徑是啥,就可以知道到底是掛在到什么區域之中!
? ? ? ? 這樣的一張圖就表示了打開一個文件的全過程:首先是一個進程創建一個 pcb 結構體,然后一個結構 fs 保存 root 與 pwd 的相關的系統信息, file_struct?文件結構體有 file 結構這個里面保存著路徑結構體這個路徑結構體有 dentry ,看看這個 dentry 有沒有加載過這個文件,具體過程看前面緩存功能,根據dentry 就可以是inode 是哪個分區,哪個分組的,知道了 inode 的相關屬性,也就是想要打開文件的屬性,那么我們就可以將文件拿出來加載到內存中進行使用。
四、軟、硬鏈接
4.1 軟鏈接
? 4.1.1 是什么
? ? ?就是創建一個快捷方式。
? ?4.1.2 怎么用
ln -s abc.s abc
? ? ? ? 就建立了 abc.s 指向 abc 的軟連接,這個連接是一個全新的文件,具有全新的 inode 編號。?
4.2 硬鏈接
?4.2.1 是什么
? ? ? ? 對一個文件的備份。只能對于普通文件進行備份,不能對目錄文件做備份,因為防止 os 進行路徑加載的時候形成循環。
? ? ? ? . 與 .. 就是硬鏈接,以及還有硬連接數,只有這個數字變成 0 的時候這個文件才正真的被刪除。?
?4.2.2 怎么用
ln abc def
? ? ? ? 建立一個與 abc 相同的 def 文件進行了備份。
五、總結
????????以上是對于文件系統的回顧。這個文章用于我的學習記錄,如果是有其他的錯誤還請批評指正。如果對你有幫助還請給我點個贊👍👍👍。?????