一.磁盤
磁盤是計算機的主要存儲介質,它可以存儲大量二進制數據,即使斷電后也可以保證數據不會丟失。下面我們將了解磁盤的物理結構、存儲結構以及邏輯結構。
?磁盤的存儲結構
1. 磁盤尋址的時候,基本單位既不是bit也不是byte,而是扇區。
2. 扇區的大小是512字節。512字節是硬件要求,外磁道和內磁道都是一樣的,它們只是密度不同。越靠近圓心的比特位越大,否則就越小。
3. 在單面上定位扇區:通過確定磁道,以及確定對應磁道的扇區,來具體確定該區間。確定磁道:.每一個磁道都有自己的編碼,磁道周長不同,但是存儲大小相同。由于扇區大小是相同的,因此每一個磁道有多少個扇區也是一定的,所以每一個磁道的扇區也是有編號的,因此定位到磁道就能找到對應扇區。
4. 機械硬盤的尋址方式:盤片不斷的轉動,磁頭不斷的擺動,就是在確認在哪個磁道。如何確定扇區?盤片的先選擇就是讓其磁頭定位扇區。
5. 柱面:把一系列同心的磁道壓在一起,宏觀上看成一個整體。一般定位的時候,(磁頭、柱面、扇區)與(磁頭、磁道、扇區)這兩個是等價的。磁頭指向的位置就是柱面的邊界位置。
6. 在磁盤中定位扇區:先定位在哪個磁道(在哪個柱面),磁道定位后,(因為,所有磁頭共同進退)再去定位盤面(磁頭),最后確定是哪一個扇區。
總結:在磁盤中定位一個扇區,采用的是硬件級別定位方法(CHS定位法):柱面(Cylinder)——磁頭(Head)——扇區(Sector)
二.文件系統與inode
1.文件在磁盤中是如何存儲的?
磁盤的空間很大,OS的文件系統會以1KB、2KB、4KB為單位定制多個扇區進行讀寫,即使讀取/修改1bit的內容,也必須將4KB的內容全部加載到內存中進行讀取或修改,完成操作后再將其寫回磁盤。雖然磁盤訪問的基本單位是512字節,但這相對于整個磁盤的大小還是很小的。為了方便管理,我們采用分治的思想,對磁盤空間進行分區:將1個較大的磁盤空間分為多個較小的磁盤空間,再給不同的分區內寫入不同的文件系統。
在一個分區內部再進行分組,然后寫入文件系統,管理好每一個分組就可以管理好一個分區。
這一過程是”格式化“,在磁盤中寫入文件系統。
文件 =? 內容 + 屬性(也就是數據),文件在磁盤中的存儲,本質就是存儲文件的內容和文件的屬性的數據。
Linux文件系統特定:文件內容和文件的屬性數據分開存儲
·?Data blocks(數據區):存放文件內容
· Block Bitmap(塊位圖):記錄著 Data blocks 中哪個數據塊已被占用,哪個沒被占用,Block Bitmap里的塊有編號,塊里的內容表示是否被占用。
·?i節點表(inode Table):存放文件屬性 如 文件大小,所有者,最近修改時間等。
·?inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用。
·?GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息。
·?超級塊(Super Block):存放文件系統本身的結構信息。記錄的信息主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入數據的時間,最近一次檢驗磁盤的時間等其他文件系統的相關信息。Super Block的信息被破壞,可以說整個文件系統結構就被破壞了。(不是每個分組都有的)
Linux中文件的屬性是一個固定大小的集合體,inode內部是不包含文件名的,內核層面,每一個文件都要有inode number!我們通過inode號標識一個文件。(我們可以通過指令ls -li
?來查詢文件對應的inode編號。)
刪除文件時并不需要將文件的數據和內容情況,只需要將對應文件的inode在inode bitmap中的比特位 置為0即可(即使不將它們清空也不會影響新文件的存儲,因為新文件的數據會直接將原數據覆蓋掉)。因此,在刪除文件后是可以及時將文件恢復的,恢復文件只需要找到inode的編號,然后將inode bitmap中對應比特位的值由0置為1,再去inode table對應映射表,將blosk bitmap由0置為1即可。
如果在Linux中誤刪一個文件,還是可以恢復的(前提是文件的inode和data block沒有被占用),因此當誤刪一個文件時最好的做法是什么也不做。
在windows下,刪除文件到回收站,實際上是將文件轉移到回收站的目錄而已,只有在回收站中刪除才是真的刪除。
為什么我們在目錄中查找文件時,用的是文件名而不是inode id?
因為任何一個文件都是創建在目錄下的(注意,同一目錄下不能出現相同文件名的兩個文件),而目錄也是一個文件,也有自己的inode,以及data block。目錄的數據塊(data block)中存儲的是當前目錄下文件的文件名與文件inode id的對應關系(這也是為啥inode中不保存文件名)。
新增文件要在當前目錄的內容(data block)中添加該文件名與inode id的映射關系,所以當我們在一個目錄下新增文件時,必須要有對目錄的寫權限。
羅列當前目錄的文件,要有對目錄的讀權限,想知道目錄中的文件,需要根據文件名找到inode,再讀取該文件的屬性。讀目錄內容是要拿到文件名,因此,目錄必須要有讀權限。
三.軟硬鏈接
1.軟鏈接
創建軟鏈接:
ln -s <目標路徑> <鏈接路徑>
例如,創建軟鏈接soft_text.txt文件指向text.txt文件
從上圖中可以看到,soft_text.txt有自己獨立的inode,它是一個獨立的文件,具有自己獨立的內容。
所謂的軟鏈接標定文件,它并非用文件的inode來標記。
看這個現象:我們刪除text.txt然后再去cat soft_text.txt:
軟鏈接的數據塊中保存的是指向目標文件的路徑,當目標文件被刪除時,軟鏈接也就失效了。
可以理解為你電腦桌面的快捷方式
刪除軟鏈接:
rm rm -f soft_text.txt//和刪除普通文件一樣ulink ulink ssoft_text.txt//刪除鏈接
2.硬鏈接
創建硬鏈接:
ln <目標路徑> <鏈接路徑>
可以發現硬鏈接的inode和text.txt的相同,它沒有獨立的inode,用的是目標文件的inode。
硬鏈接的作用?
當某一個硬鏈接的文件大小和內容發生變化,那么它對應的目標文件以及所有目標文件的硬鏈接都會一起發生改變。
硬鏈接沒有創建新的文件,它沒有獨立的inode、內容。它用的全部是目標文件的inode和內容。
創建硬鏈接的本質就是在指定的路徑下,新增文件名和inode的映射關系。
一個inode可能會被多個文件名所映射,為了方便管理,inode有一個計數器,count的引用計數,也將引用計數稱為硬鏈接數:
當我們刪除硬鏈接后,計數由2變為1.
硬鏈接的作用
1.為啥創建一個普通文件時,硬鏈接數是1?
因為,普通文件本身就有一個文件名和inode對應(只要創建文件,就有一個inode的映射關系)。
2.為啥創建一個目錄,它的硬鏈接數是2?
因為目錄名與它自己的inode就是一組1映射關系;其次,目錄內部的'.'('.'也表示當前目錄,它也是文件名)和inode也是一組映射,所以硬鏈接數是2。特別的,如果在當前目錄下再創建一個目錄,當前目錄的硬鏈接數就會變為3。這是因為,當前目錄下創建的子目錄中默認的有一個文件名'..'
('..'
表示上一層目錄,它也是文件名)和當前目錄的inode也是一組映射。
用戶不能給目錄建立硬鏈接
1. 為什么不允許給目錄建立硬鏈接呢?
如果允許給目錄建立硬鏈接,則可能會打破文件系統目錄的有向無環圖結構,創建目錄循環,導致fsck以及其他的遍歷文件樹的軟件出錯。可能會出現:你的子目錄是你的父目錄這種奇怪的現象,即當前目錄的子目錄是硬鏈接的當前目錄的父目錄這種情況,此時很多遍歷系統的命令(du, ls -r, pwd等)就無法使用了,因為可能會導致無限循環。
2. 為什么軟鏈接就不會出現循環調用這個情況呢?
上文中,我們了解到軟鏈接所指向的是鏈接文件本身的信息,而不是鏈接文件指向的文件的信息;硬鏈接直接指向的是inode,而不是路徑(直接指向鏈接文件所指向的文件信息)。這就意味著,在遍歷的時候,如果是軟鏈接就不會出現環路從而導致死循環。因此不允許用戶給目錄建立硬鏈接。