一.認識硬件–磁盤
1. 物理結構
1.2 存儲結構
?如何定位?個扇區呢?
可以先定位磁頭(header)——》確定磁頭要訪問哪?個柱?(磁道)(cylinder)——》 定位?個扇區(sector)。
柱?(cylinder),磁頭(head),扇區(sector),顯然可以定位數據了,這就是數據定位(尋址)?式之?,CHS尋址方式。
1.3 邏輯抽象
我們知道磁帶存儲數據的結構是一個很長很長的帶子,我們可以把磁帶“拉直”,形成一個線性結構。
那么磁盤本質上雖然是硬質的,但是邏輯上我們可以把磁盤想象成為卷在?起的磁帶,那么磁盤的邏輯存儲結構我們也可以類似于:
這樣每?個扇區,就有了?個線性地址(其實就是數組下標),這種地址叫做LBA
?為什么扇區大小不均勻的但是LBA地址是均勻??
——》因為磁道是從中間向外輻射的,所以里面的磁道有多少個扇區,外面的磁道就有多少個扇區,只不過里面磁道的扇區會小一點(扇區大小不均勻) 但其實可以通過調整密度來變得均勻(里面的01序列稠密一點,外面的稀疏一點)
二.文件系統
通過邏輯抽象,我們可以把對扇區的地址抽象成線性的LBA地址,整個磁盤都可以被抽象是成一個一維數組。
但是具體磁盤有多大呢?已經用了多少扇區?哪些扇區還沒被使用?哪些扇區存的是屬性?哪些扇區存的是內容?要往哪個扇區去寫入??——>諸如以上問題,注定了我們的操作系統必須想辦法把磁盤空間組織起來!!
操作系統如何對磁盤空間進行管理?
? inode存放的是文件的屬性,Block存放的是文件的內容,在Linux文件系統中,文件的屬性和內容是分開存儲的!
2.1 inode
我們知道,文件 = 屬性 + 內容,屬性也是數據,要管理這些數據,就要以結構體的方式構建出來,這些管理屬性數據的結構體,就是inode!一個文件就有一個inode,inode就是屬性數據的集合。
? Linux系統里標記文件的唯一標識用的是inode,且文件的屬性中不包含文件的名稱!!
?如何在Linux查到每一個文件的inode編號
ls -li
2.2 Data Block
? Data Block:存文件內容的區域,以塊作為最小單位,塊的大小常見的是4KB大小,一般而言一個塊只有自己的數據!
? 一個文件只有一個inode,但如果是個大文件可能會有很多個塊。所以在inode結構體內部會有一個block數組,存儲的是數據塊的塊號,標識自己這個文件的內容占據了具體的哪一個數據塊。注意:inode的block數組存的只是塊號,而一個塊號對應著一個Data Block(4KB)。
2.3 BlockBitmap和 InodeBitmap
InodeBitmap:是一個位圖,每一個bit表示?個inode是否空閑可用。
BlockBitmap:同樣是個位圖,每一個bit記錄著DataBlock中哪個數據塊已經被占?,哪個數據塊沒有被占?
?問題1: 為什么我們下載一個文件需要很久,但是刪除的時候卻很快呢??
?刪除一個文件的時候,并不會把塊(文件內容)清空,而僅僅只是把對應比特標志位給修改了,表明該塊是空閑可用的。
?問題2:如果我們想恢復一個被刪除的文件,要怎么辦呢??
? 如果我們不小心誤刪的一個文件,如果這個文件很重要,最好的辦法就是什么都不做然后找專業的人去恢復(一般來說恢復其實就是得找到該文件的inode編號,比如通過Linux的日志信息找到被刪文件的inode,但是具體怎么恢復得依靠一些專業的東西!),因為雖然內容還在,但是他的位圖信息表明是可以被使用的,所以你如果亂操作可能會導致文件內容被覆蓋。
2.4 SuperBlock
存放?件系統本?的結構信息,描述整個分區的文件系統信息。記錄的信息主要有:bolck和inode的總量,未使?的block和inode的數量,?個block和inode的??,最近?次掛載的時間,最近?次寫?數據的時間,最近?次檢驗磁盤的時間等其他?件系統的相關信息。SuperBlock的信息被破壞,可以說整個文件系統結構就被破壞了
?格式化:就是寫入空的文件系統!!
2.5 GDT(GroupDescriptorTable)
塊組描述符表,描述塊組屬性信息,整個分區分成多個塊組就對應有多少個塊組描述符。每個塊組描述符存儲?個塊組的描述信息,如在這個塊組中從哪?開始是inodeTable,從哪?開始是Data Blocks,空閑的inode和數據塊還有多少個等等。塊組描述符在每個塊組的開頭都有?份拷貝。
三.深刻理解文件系統下目錄文件
3.1 對文件操作,os怎么做?
?新建和刪除文件,在文件系統的角度下,os到底是怎么做的?
?1??新建文件
:OS會在某個路徑下去創建,路徑幫助我們確定在哪一個分區——》讀取了超級塊后確定了一個block,然后通過查該block的GDT知道該分區的inode還有很多沒有被使用——》于是到inodebitmap位圖結構里找到了沒有用過的inode,然后分配給該文件——》分配好之后把自己的屬性往里面填,這樣就算新建成功了!
?如果還打算寫入的話,先確認一下要寫入內容的大小,確定一下需要幾個塊,然后到blockbitmap里面找到沒被使用的塊,把塊號填到inode結構體里面的block數組里,然后再把文件內容寫進這些塊里面。
?2??刪除文件
:先找到分區,再找到inode,然后把對應inodebitmap和blockbitmap的位置置0。其實文件還在,只不過對應的塊可以被覆蓋。
?但是我們會發現一個問題,就是在文件系統的角度下,os無論對文件進行怎樣的操作,都要取到對應的inode號,進而才能對其操作,但是我們在對文件進行操作的時候,可從來沒有關心過indoe號啊?!我們對文件操作向os提供的是文件的地址,os是怎么根據文件的地址知道文件的inode的???
?回答這個問題必須先了解文件系統下的目錄。
3.2 目錄文件
首先要明白一個事實,那就是目錄也是文件,也有自己的inode ,也是有內容+屬性構成!
?但是我們知道,目錄文件跟普通文件不同的是,目錄文件沒有所謂的"文件內容"的,那目錄文件的文件內容存的是什么?
?有內容就要占據數據塊,目錄有自己的數據塊,其中數據塊存儲的就是,在當前目錄下的文件和其inode值的映射關系!!!!
我們可以借助這一結論回答很多問題,提升我們對文件的理解:
?疑問1:在同一目錄下,為什么不允許有同名文件?
?因為文件名和inode是key和value的關系,通過文件名找到inode,key值必須唯一。
?疑問2:為什么沒有w權限無法創建文件??
?沒有w權限意味著我們就無法將文件名和inode的映射關系寫進去,因此無法創建文件。
?疑問3:為什么沒r無法查看文件??
?沒有r權限著意味著我們也看不到文件名和inode的映射關系,找不到inode就找不到文件,也就找不到文件的內容。
?疑問4:為什么沒有x無法進入目錄??
?x意味著沒有操作權限,要進入一個目錄必須cd目錄名,并且將當前目錄名更新到環境變量PWD中,所以無法進行該操作的話我們就無法進入。
3.3 路徑解析
?問題:打開當前工作?錄文件,查看當前?作?錄?件的內容?當前?作?錄不也是?件嗎?我們訪問當前?作?錄不也是只知道當前?作?錄的?件名嗎?要訪問它,不也得知道當前?作?錄的inode嗎?
?所以也要打開當前?作?錄的上級?錄,類似"遞歸",需要把路徑中所有的?錄全部解析,出?是"/"根?錄。
??實際上,任何?件,都有路徑,訪問?標?件,?如:
/home/lvision/code/test/test/test.c
都要從根?錄開始,依次打開每?個?錄,根據?錄名,依次訪問每個?錄下指定的?錄,直到訪問到test.c。這個過程叫做Linux路徑解析。
四.深刻理解軟硬鏈接
4.1 硬鏈接
4.1.1 如何建立硬鏈接
ln a[源文件] b[硬鏈接名字]
4.1.2 如何理解硬鏈接
我們知道,真正找到磁盤上?件的并不是文件名,inode。其實在linux中,可以讓多個文件名映射同?個inode,而這些新建立的,對indoe建立的映射關系,的文件,就是硬鏈接。
硬鏈接不是一個獨立的文件,因為他沒有獨立的inode!!
-
Hardlink和myfile.cc的鏈接狀態完全相同,他們被稱為指向?件的硬鏈接。內核記錄了這個連接數,inode 650257 的硬連接數為2。
-
我們在刪除?件時干了兩件事情:1.在目錄中將對應的記錄刪除,2.將硬連接數-1,如果為0,則將對應的磁盤釋放。
硬鏈接應用場景:通常用來做路徑定位!!可以通過硬鏈接進行目錄切換!
4.1.3為什么Linux不允許對目錄建立硬鏈接
如果對目錄建立硬鏈接,就可能會出現這樣的情景,
?可是目錄內部不是有. 和 … 的硬鏈接,他們不是目錄的硬鏈接嗎??
-
. 和 … 是操作系統創建的,操作系統提前規定好了 .和…不會被做搜索,這是強制規定的!所以不會有環的問題!
-
操作系統給我們. 和 … ,我們就可以用相對路徑去訪問文件了,可以在一些情境中不必用很長的絕對路徑去訪問文件。
4.2 軟鏈接
4.2.1 如何建立軟鏈接
ln -s a[源文件] b[硬鏈接名字]
4.2.2 如何理解軟鏈接
軟連接是一個獨立的文件,有獨立的inode,也有獨立的數據塊 ,他的內容里面保存的是指向的文件的路徑。(相當于windows的快捷方式)
應用場景:快捷方式