目錄
一、磁盤
1、磁盤的物理結構
2、磁盤的存儲結構
3、磁盤的抽象結構
二、文件系統(tǒng)與inode
1、初識inode
2、文件系統(tǒng)
3、用inode編號找文件屬性和內(nèi)容
4、inode和文件名的關系
5、創(chuàng)建一個文件
6、查看一個文件
7、刪除一個文件
三、軟硬鏈接
1、軟連接
2、硬鏈接
一、磁盤
磁盤可以存儲大量的二進制數(shù)據(jù),并且斷電后也能保持數(shù)據(jù)不丟失。因此磁盤是一種永久性存儲介質,在計算機中,磁盤是一個外設,也是唯一的機械設備。既然磁盤是一個外設,那么就意味著,磁盤和內(nèi)存(掉電易失存儲介質)相比就比較慢了。
目前所有的普通文件都是在磁盤中存儲的。磁盤在馮諾依曼體系結構當中既可以充當輸入設備,又可以充當輸出設備。
1、磁盤的物理結構
磁盤的盤片/盤面是用來存儲數(shù)據(jù)的,兩面都有。磁頭(每一面都有一個磁頭)和盤面并沒有接觸。中間有音圈馬達,一旦磁盤通電之后,盤片旋轉,磁頭擺動,馬達可以控制磁頭擺動,控制盤片旋轉,通過磁頭將二進制數(shù)據(jù)寫到磁盤上。
因為磁盤上存儲的是二進制數(shù)據(jù),數(shù)據(jù)是兩態(tài)的,而磁盤上有許多小的磁鐵顆粒,所以磁頭是通過改變磁盤上的正負性來寫入數(shù)據(jù)的。
2、磁盤的存儲結構
我們在知道了磁盤的物理結構后,知道盤片是用來存儲數(shù)據(jù)的。那么磁盤是怎么通過磁頭將數(shù)據(jù)存儲到某一位置,然后又能重新找到呢?這就和磁盤的存儲方法有關了。
如下圖:
扇區(qū):一塊綠色的部分就是扇區(qū)。磁盤存儲數(shù)據(jù)的基本單位。扇區(qū)大小512字節(jié),512字節(jié)是硬件要求。
磁道:左圖中,一圈一圈的灰色的同心圓就是磁道。磁盤上只有磁道位置能夠存儲數(shù)據(jù),其他位置則不能存儲數(shù)據(jù)。
柱面:多個半徑相同的圓構成柱面。如右圖紫色的部分。
如何將數(shù)據(jù)寫到指定的扇區(qū)上:1、首先確認寫到哪一個面上(用哪一個磁頭去寫入) 2、在哪一個磁道上? ?3、最后找到在哪一個扇區(qū)。
磁盤中存儲數(shù)據(jù),需要先定位扇區(qū),定位任何一個扇區(qū),采用的硬件級別定位方式(CHS定位法):柱面Cylinder——磁頭Head——扇區(qū)Sector。
3、磁盤的抽象結構
由于操作系統(tǒng)并不認識磁盤的物理結構,因此操作系統(tǒng)在訪問磁盤時必須使用自己的方式將磁盤的數(shù)據(jù)管理起來。我們可以把磁盤盤片想象成線性結構。在操作系統(tǒng)的角度,磁盤就是一個線性結構。我們使用數(shù)組來表示一個磁盤。要訪問某個扇區(qū),只需要找到數(shù)組下標,也就是說知道這個扇區(qū)的下標就算定位了一個扇區(qū)。
在操作系統(tǒng)中,我們稱這種地址為LBA(Logic Block Address)地址。而要寫到物理磁盤上,我們就要把LBA地址轉換成對應磁盤的三維地址CHS地址。
于是在操作系統(tǒng)中,對于磁盤的管理,就變成了對于該數(shù)組的管理。操作系統(tǒng)能夠通過某種方法,將LBA地址轉換成CHS地址,進而可以訪問磁盤數(shù)據(jù)。
二、文件系統(tǒng)與inode
1、初識inode
如下圖:我們使用 ls -li 命令后,發(fā)現(xiàn)除了文件的名稱、類型、權限、擁有者、所屬組、大小最近修改時間這些內(nèi)容,每個文件的最開始會有一串數(shù)字。那么這個數(shù)字是什么呢?其實這個數(shù)字就是該文件的inode編號。
那么inode編號代表著什么意思呢?我們接著往下看。?
2、文件系統(tǒng)
在操作系統(tǒng)中,對于磁盤的管理,本質上就是對于磁盤抽象成的數(shù)組的管理。而我們知道,如果一個磁盤的空間是很大的,所以抽象出的數(shù)組也一定是很大的,那么操作系統(tǒng)如何管理這么大的數(shù)組的呢?
我們假設一個磁盤有500GB的大小。如果直接對這500GB進行管理,那是十分麻煩的。所以我們可以將磁盤分成多個小的分區(qū)。對一個小的分區(qū)進行管理。我們?nèi)绻麑⑺行〉姆謪^(qū)管理好了,那么整個磁盤就管理好了。如果一個分區(qū)還是比較大,那么我們可以繼續(xù)劃分,最后,我們得到一個便于管理的塊組。把一個塊組管理好,這個分區(qū)就管理好了,分區(qū)管理好了,整個磁盤就管理好了。
下面我們對一個塊組中的內(nèi)容進行解釋:
Boot Block:一個分區(qū)的最前面,有一個區(qū)域叫做boot block。它是啟動塊,存在每個分區(qū)的開頭,備份文件與啟動相關的。
Super Block:保存的是整個文件系統(tǒng)的屬性信息。Super Block保存在各個塊組里意味著備份,如果某個塊組的 Super Block損壞,便可以通過拷貝其他塊組的Super Block。
Data blocks:保存特定文件的內(nèi)容。雖然磁盤存儲數(shù)據(jù)的基本單位是扇區(qū)(512字節(jié)),但是操作系統(tǒng)(文件系統(tǒng))和磁盤進行IO的基本單位是4KB。data blocks相當于多個4KB大小的空間的集合。Linux的文件=內(nèi)容+屬性,而Linux在磁盤上存儲文件是將內(nèi)容和屬性是分開存儲的。
inode table:inode是一個大小為128字節(jié)的空間,保存對應文件的屬性。inode table 則是多個inode空間的集合,所以為了區(qū)別,每一個inode空間對應一個inode編號。即:一般而言,一個文件,一個inode空間,一個inode編號。
data blocks和inode tables都是由許多個小的空間組成的,那么我們在向磁盤寫入數(shù)據(jù)時,我們怎么知道哪些空間被占用了,哪些空間沒有被占用呢?我們可以使用block bitmap和inode bitmap來標注這些空間的占用情況。
block bitmap:data blocks對應的位圖結構,位圖中的比特位位置和當前data block對應的數(shù)據(jù)塊位置是一一對應的。比特位為1,代表block被占用,否則表示可用。
inode bitmap:inode對應的位圖結構,統(tǒng)計inode的使用情況,位圖中比特位的位置和當前文件對應的inode的位置是一樣對應的,比特位為1,代表inode被占用,否則表示可用。
GDT(group descripteor table):塊組描述符,表示該塊組的屬性信息,如已經(jīng)使用多少,inode有多少個,已經(jīng)被占用了多少個,還剩下多少個。
格式化:當磁盤完成分區(qū)后,我們還需要對磁盤進行格式化。磁盤格式化就是對磁盤中的分區(qū)進行初始化的一種操作,即:磁盤格式化就是對分區(qū)后的各個區(qū)域寫入對應的管理信息,如block bitmap和inode bitmap全部初始化成為0。所以格式化通常會導致現(xiàn)有的磁盤或分區(qū)中所有的文件被清除。
所以,一個塊組的前四個部分被我們稱為文件系統(tǒng)信息,后面兩個部分就是文件的相關內(nèi)容信息。
3、用inode編號找文件屬性和內(nèi)容
既然文件的屬性和內(nèi)容是分開存儲的,那么我們要怎么通過inode編號去找到它呢?
首先,屬性是很容易就可以找到的,因為我們只要知道了inode編號,就可以直接找到文件的屬性。但是,想要找到文件的內(nèi)容就不是那么容易了。第一點,我們無法通過某種方式直接找到,而且一個文件的大小是可以很大的,這就說明了一個文件的內(nèi)容會被存儲在多個 data blocks中,我們必須將所有的data blocks找到,才是找到了文件的內(nèi)容,但是我們怎么知道哪些data blocks屬于同一個文件。
那么我們應該怎么尋找文件的內(nèi)容呢?在Data blocks中,每個data block都會有一個編號。而inode其實是一個結構體,它的里面除了文件的各種屬性信息外,還有一個int blocks數(shù)組,該數(shù)組里保存的數(shù)字,就是對應的data block的編號,通過這個數(shù)組,我們就可以找到屬于該文件的所有內(nèi)容。
但是,這里就又有一個疑問了, blocks數(shù)組一般只能存15個編號,可是如果文件內(nèi)容的data block個數(shù)多于數(shù)組大小呢?這當然是有解決辦法的。
并不是所有的data block只能存放文件的內(nèi)容,也可以存放其他塊的編號,所以最終指向更多的data block來存儲。如下圖:
4、inode和文件名的關系
首先,我們要知道的是,在Linux中,inode屬性里面并沒有文件名的概念。但是,用戶使用時使用的卻是文件名,而不是系統(tǒng)認識的inode,這是為什么呢?
在一個目錄下,可以保存很多的文件,且同一個目錄下文件名是沒有重復的。其實,目錄也是一個文件,它也有自己的inode和data block。目錄的data block中保存的就是該目錄下的文件的文件名與其inode編號的映射關系。
5、創(chuàng)建一個文件
在inode bitmap中對應的比特位由0置為1,找到其inode table,把屬性填進去,文件的數(shù)據(jù)寫到block里,再inode和block建立映射關系,然后block bitmap中對應的比特位由0變?yōu)?,接著文件名和inode編號建立映射關系,最后返回inode編號,創(chuàng)建成功。
所以我們在一個目錄下創(chuàng)建一個新的文件,必須有寫的權限,新建一個文件的時候,要向當前目錄的內(nèi)容里去寫文件名和inode的映射關系,所以必須得有寫入權限。
6、查看一個文件
拿到inode找到inode table,在根據(jù)inode table找到對應的數(shù)據(jù)塊,內(nèi)容加屬性就全找到了。
7、刪除一個文件
實際上刪除一個文件時,我們只需要找到inode在inode bitmap當中的比特位和block bitmap中的比特位,把比特位由1置為0,然后解除文件名和inode編號的映射關系。
所以把文件刪除是能夠恢復的,因為刪除只是把比特位清掉了,想要恢復只要得到inode的編號,然后把inode bitmap里的比特位由0置為1,在去inode table對應的映射表,在block bitmap的0置為1。所以如果在Linux中誤刪除一個文件,還是能恢復的,但是前提必須是inode和data block沒有被新的內(nèi)容占用,所以當誤刪除一個文件時,最好的辦法就是什么都不做。
三、軟硬鏈接
1、軟連接
我們先來看一看下面的問題:在 bin/exe 路徑下有一個可執(zhí)行程序 test,如果我們要在最開始的目錄下執(zhí)行它的話,我們要使用完整的路徑。如果可執(zhí)行程序在一個路徑下藏得非常深,那么即使是使用相對路徑,也比較麻煩。
所以,我們可以使用軟連接來幫助我們快速找到可執(zhí)行程序
ln -s myfile.txt soft_file.link
軟連接就相當于Windows下的快捷方式:在我的電腦上,桌面上的微信指向的就是一個長路徑下微信的可執(zhí)行程序。
有自己獨立的inode的稱為軟鏈接,即軟鏈接是獨立的文件,獨立的文件有獨立的inode和對應的文件內(nèi)容。?
2、硬鏈接
創(chuàng)建硬鏈接:
ln myfile.txt hard_file.link
?
軟硬鏈接最重要的區(qū)別在于是否具有獨立的inode,硬鏈接沒有獨立的inode,它的inode是與其鏈接文件的inode相同。
建立硬鏈接根本沒有新增文件,因為沒有給硬鏈接的文件分配獨立的inode,所以創(chuàng)建硬鏈接本質就是在指定的路徑下,新增文件名和inode編號的映射關系!相當于給文件取了一個別名。
我們再仔細觀察,發(fā)現(xiàn)建立了硬鏈接后,數(shù)字變成了2,刪除硬鏈接后,數(shù)字又重新變成了1。這個數(shù)字就叫做硬鏈接數(shù)。也就是這個文件有幾個名字。
~ 為什么創(chuàng)建一個普通文件的時候,默認硬鏈接數(shù)是1?
因為一個普通文件在創(chuàng)建時用戶是一定要取名的,因此文件本身就有一個自己文件名和自己的inode,具有一個映射關系。
~ 為什么創(chuàng)建一個空目錄的時候,默認硬鏈接數(shù)是2??
首先目錄和本身的inode就是一組映射關系了,第二,目錄中還有一個目錄?. 表示當前目錄,該文件和inode也是一組映射關系,所以是硬鏈接數(shù)是2。
~ 現(xiàn)在在空目錄dir下創(chuàng)建一個新的目錄d1,此時dir的硬鏈接數(shù)就變成了3,為什么?
文章來源:http://www.zghlxwxcb.cn/news/detail-776951.html
因為d1目錄下有一個目錄?.. 表示上級目錄,也就是dir,所以硬鏈接數(shù)為3。?文章來源地址http://www.zghlxwxcb.cn/news/detail-776951.html
到了這里,關于Linux之文件系統(tǒng)與軟硬鏈接的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!