Linux基礎學習-磁盤與文件系統的組織和原理

這一章主要是原理性的,介紹了Linux文件系統的運作原理。涉及到很多計算機組成和操作系統的原理性知識,這部分知識很多都忘了,在這裏複習下。
    我們只看本章第1,2節。


---------------------------------------------------------------------------------------------------------------------------------------------------


1 硬盤物理組成     //原理

    磁頭負責讀寫
    磁道(硬盤同半徑的一圈) 磁柱(所有盤磁道疊加起來的柱)
    扇區(2條半徑將磁道分開的一個扇形區域,是磁盤的最小存儲單位)


---------------------------------------------------------------------------------------------------------------------------------------------------


2 磁盤分割    //原理

    磁柱是磁盤分割的最小單位
    磁盤分割就是指定一個分割(Partition)的是從A磁柱到B磁柱
    
    所有磁盤的分割信息存放在MBR(主要開機扇區,master boot recoder),即一塊硬盤的第0軌上。計算機一開機就會去讀取這個區域。
    由MBR的含義知,若一個硬盤的MBR掛了,這塊硬盤就等於掛了。

    MBR的限制:MBR的大小決定了它不能存儲很多的分割信息,最多隻能記憶四個分割的信息(主分區和擴展分區都稱爲一個分割),而擴展分區最多只能有一個。
    由以上知識知,一塊硬盤最多四個分割,且擴展分區只能有一個。舉個例子,若你分割了3p+1E,那麼你就不能再分割分區了。


---------------------------------------------------------------------------------------------------------------------------------------------------



3 檔案系統(文件系統)    //原理

    在告知系統我的 partition 所在的起始與結束磁柱之後,再來則是需要將 partition 格式化爲『我的操作系統認識的檔案系統( Filesystem )』

    我們可以說,每一個 partition 就是一個 Filesystem

    剛剛我們提到硬盤的最小儲存單位是 sector ,不過數據所儲存的最小單位並不是 sector ,因爲用 sector 來儲存太沒有效率了。 爲了克服這個效率上的困擾,所以就有邏輯區塊( Block )的產生了! 邏輯區塊是在 partition 進行 filesystem 的格式化時, 所指定的『最小儲存單位』,這個最小儲存單位當然是架構在 sector 的大小上面( 因爲 sector 爲硬盤的最小物理儲存單位啊! ),所以 Block 的大小爲 sector 的 2 的次方倍數。
    
    規劃Block大小的考量:檔案讀取效率;檔案大小可能造成的空間浪費

    Superblock:如同前面說的,當我們在進行磁盤分割( partition )時,每個磁盤分割槽( partition )就是一個檔案系統( filesystem ), 而每個檔案系統開始的位置的那個 block 就稱爲 superblock ,superblock 的作用是儲存像是檔案系統的大小、空的和填滿的區塊,以及他各自的總數和其它諸如此類的信息等等, 這也就是說,當您要使用這一個磁盤分割槽( 或者說是檔案系統 )來進行數據存取的時候,第一個要經過的就是 superblock 這個區塊了,所以囉, superblock 壞了,您的這個磁盤槽大概也就回天乏術了!

    注意啦,MBR和Superblock是兩個層次上的東西!!!

    磁盤分割,檔案系統的關係:在磁盤分割選擇文件系統的格式時,此時格式化,就把某種格式的文件系統架構在磁盤之上了。


---------------------------------------------------------------------------------------------------------------------------------------------------



4 Linux的EX2檔案系統    //原理

    Linux的檔案不僅具有檔案內容,還有檔案屬性。Linux文件系統將檔案屬性(存放在inode中)和檔案內容(存放在block中)分開來存儲。
    
    當一個partition被格式化爲ext2文件系統時,就會有inode table和block area這兩個區域,inode都在inode table這個區域,block在block area區域。
    
   Block 已經在前面說過了,他是數據儲存的最小單位。那麼 inode 是什麼?!簡單的說, Block 是記錄『檔案內容數據』的區域,至於 inode 則是記錄『該檔案的相關屬性,以及檔案內容放置在哪一個 Block 之內』的信息。 簡單的說, inode 除了記錄檔案的屬性外,同時還必須要具有指向( pointer )的功能,亦即指向檔案內容放置的區塊之中,好讓操作系統可以正確的去取得檔案的內容。
    
    Linux 系統到底是如何讀取一個檔案的內容呢?底下我們分別針對目錄與檔案來說明:

      目錄: 當我們在 Linux 下的 ext2 檔案系統建立一個目錄時, ext2 會分配一個 inode 與至少一塊 Block 給該目錄。其中,inode 記錄該目錄的相關屬性,並指向分配到的那塊 Block ;而 Block 則是記錄在這個目錄下的相關連的檔案(或目錄)的關連性!
      檔案: 當我們在 Linux 下的 ext2 建立一個一般檔案時, ext2 會分配至少一個 inode 與相對於該檔案大小的 Block 數量給該檔案。例如:假設我的一個 Block 爲 4 Kbytes ,而我要建立一個 100 KBytes 的檔案,那麼 linux 將分配一個 inode 與 25 個 Block 來儲存該檔案!

      要注意的是, inode 本身並不紀錄文件名,而是記錄檔案的相關屬性,至於文件名則是記錄在目錄所屬的 block 區域! 那麼檔案與目錄的關係又是如何呢?就如同上面的目錄提到的,檔案的相關連結會記錄在目錄的 block 數據區域, 所以當我們要讀取一個檔案的內容時,我們的 Linux 會先由根目錄 / 取得該檔案的上層目錄所在 inode , 再由該目錄所記錄的檔案關連性 (在該目錄所屬的 block 區域) 取得該檔案的 inode , 最後在經由 inode 內提供的 block 指向,而取得最終的檔案內容。我們以 /etc/crontab 這個檔案的讀取爲例, 他的內容數據是這樣取得的:

  



另外,關於 EXT2 檔案系統,這裏有幾點小事情要提醒一下:(理解一下)


  ? ext2 與 ext3 檔案在建立時 (format) 就已經設定好固定的 inode 數與 block 數目了;

  ? ext2 允許的 block size 爲 1024, 2048 及 4096 bytes;

  ? 一個 partition (filesystem) 所能容許的最大檔案數,與 inode 的數量有關, 因爲一個檔案至少要佔用一個 inode 啊!

  ? 在目錄底下的檔案數如果太多而導致一個 Block 無法容納的下所有的關連性數據時,Linux 會給予該目錄多一個 Block 來繼續記錄關連數據;

  ? 通常 inode 數量的多寡設定爲 (partition 的容量) 除以 (一個 inode 預計想要控制的容量)。 舉例來說,若我的 block 規劃爲 4Kbytes,假設我的一個 inode 會控制兩個 block ,亦即是假設我的一個檔案大致的容量在 8Kbytes 左右時,假設我的這個 partition 容量爲 1GBytes, 則 inode 數量共有:( 1G * 1024M/G * 1024K/M ) / ( 8K ) = 131072 個。而一個 inode 佔用 128 bytes 的空間,因此格式化時就會有 ( 131072個 * 128bytes/個 ) = 16777216 byes = 16384 Kbytes 的 inode table 。也就是說,這一個 1GB 的 partition 在還沒有儲存任何數據前, 就已經少了 16MBytes 的容量啊!

  ? 因爲一個 inode 只能記錄一個檔案的屬性,所以 inode 數量比 block 多是沒有意義的! 舉上面的例子來說,我的 Block 規劃爲 4 Kbytes ,所以 1GB 大概就有 262144 個 4Kbytes 的 block ,如果一個 block 對應一個 inode 的話,那麼當我的 inode 數量大於 262144 時,多的 inode 將沒有任何用處,徒然浪費硬盤的空間而已!另外一層想法,如果我的檔案容量都很大, 那麼一個檔案佔用一個 inode 以及數個 block ,當然 inode 數量就可以規劃的少很多啦!

  ? 當 block 大小越小,而 inode 數量越多,則可利用的空間越多,但是大檔案寫入的效率較差; 這種情況適合檔案數量多,但是檔案容量小的系統,例如 BBS 或者是新聞羣組( News )這方面服務的系統;

  ? 當 Block 大小越大,而 inode 數量越少時,大檔案寫入的效率較佳,但是可能浪費的硬盤空間較多; 這種狀況則比較適合檔案容量較大的系統!



---------------------------------------------------------------------------------------------------------------------------------------------------


5 Ex2文件系統的存儲架構圖及原理        //原理


    當一個 ext2 的 filesystem 被建立時, 他擁有 superblock / group description / block bitmap / inode bitmap / inode table / data blocks 等等區域。要注意的是,每個 ext2 filesystem 在被建立的時候,會依據 partition 的大小, 給予數個 block group ,而每個 block group 就有上述的這些部分。整個 filesystem 的架構可以下圖展現:

      



        我們將整個 filesystem 簡單化, 假設僅有一個 block group ,那麼上面的各個部分分別代表什麼呢:

         ?SuperBlock:如前所述, Superblock 是記錄整個 filesystem 相關信息的地方, 沒有 Superblock ,就沒有這個 filesystem 了。他記錄的信息主要有:

              o block 與 inode 的總量;
              o 未使用與已使用的 inode / block 數量;
              o 一個 block 與一個 inode 的大小;
              o filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤 (fsck) 的時間等檔案系統的相關信息;
              o 一個 valid bit 數值,若此檔案系統已被掛載,則 valid bit 爲 0 ,若未被掛載,則 valid bit 爲 1 。

        ? Group Description:紀錄此 block 由由何處開始記錄;

        ? Block bitmap:此處記錄那個 block 有沒有被使用;

        ? Inode bitmap:此處記錄那個 inode 有沒有被使用;

        ? Inode table:爲每個 inode 數據存放區;

        ? Data Blocks:爲每個 block 數據存放區。


    當我們新增一個檔案(目錄)時:

        1. 根據 inode bitmap / block bitmap 的信息,找到尚未被使用的 inode 與 block , 進而將檔案的屬性與數據分別記載進 inode 與 block ;
    
        2. 將剛剛被利用的 inode 與 block 的號碼 (number) 告知 superblock、inode bitmap、block bitmap 等,讓這些 metadata 更新信息。一般來說,我們將 inode table 與 block area 稱爲數據存放區域,至於其它的例如 superblock、 block bitmap 與 inode bitmap 等記錄就被稱爲 metadata 囉。經由上面兩個動作,我們知道一筆數據寫入硬盤時, 會有這兩個動作。

    

---------------------------------------------------------------------------------------------------------------------------------------------------

    
6 檔案系統的運作    //原理


    好了,我們知道整個 ext2/ext3 的數據存取是透過 journal(日誌) 與 metadata 還有數據存放區在紀錄的。 不過,實際上, Linux 檔案系統在運作的時候,真的要將數據直接存放到硬盤上面嗎?!

      爲了讓 Linux 加快整個系統的存取效率,因此在 Linux 上面通常採取異步處理( asynchronously )的方式。 什麼是異步呢?舉例來說:『當系統讀取了某一個檔案, 則該檔案所在的區塊數據會被加載到內存當中,所以該磁盤區塊就會被放置在主存儲器的緩衝快取區中, 若這些區塊的數據被改變時,剛開始數據僅有主存儲器的區塊數據會被改變, 而且在緩衝區當中的區塊數據會被標記爲『 Dirty 』,這個時候磁盤實體區塊尚未被修正! 所以亦即表示,這些『 Dirty 』區塊的數據必需回寫到磁盤當中, 以維持磁盤實體區塊上的數據與主存儲器中的區塊數據的一致性。』 

    爲什麼要這麼做呢?這是因爲主存儲器的運作速度比起硬盤來實在是快太多了, 萬一系統當中有一個檔案相當的大,而又持續性的存取,那麼由於較慢的硬盤存取速度,將使得整個 Linux 速度被拖垮,所以纔會使用異步方式的數據處理啊!

    不過, 也由於硬盤與主存儲器的數據可能沒有同步化,因此,如果 Linux 不正常關機( 例如跳電或者是當機 )時,會導致系統在再次開機時,會花相當多的時間進行磁盤檢驗, 同時也有可能造成磁盤的損毀啊!



---------------------------------------------------------------------------------------------------------------------------------------------------


7 掛載點的意義        
    

    掛載點一定是『目錄』而不是檔案喔! 也就是說,這個掛載點就是進入該 filesystem 的入口。


---------------------------------------------------------------------------------------------------------------------------------------------------


8   磁盤與目錄容量  // 實踐
    
      1) 顯示目前磁盤的總容量與剩餘可用容量的指令
        
             df  [參數]    目錄或文件名

                




      2) 列出目錄下各個檔案所佔的容量

            du    [參數]    目錄或文件名
    



---------------------------------------------------------------------------------------------------------------------------------------------------


9   連接檔     


    1)    hard link

      Hard Link 只是在某個目錄下新增一個該檔案的關連數據而已!
 
      舉個例子來說,假設我的 /root/crontab 爲一個 hard link 的檔案,他連結到 /etc/crontab 這個檔案,也就是說,其實 /root/crontab 與 /etc/crontab 是同一個檔案,只是有兩個目錄( /etc 與 /root )記錄了 crontab 這個檔案的關連數據罷了!也就是說,我由 /etc 這個目錄所記錄的關連數據可知道 crontab 的 inode 放置在 A 處,而由 /root 這個目錄下的關連數據, crontab 同樣也指到 A 處的 inode !所以囉, crontab 這個檔案的 inode 與 block 都沒有改變, 有的只是有兩個目錄記錄了關連數據。 那這樣有什麼好處呢?最大的好處就是『安全!』如同上面提到的 /root/crontab 與 /etc/crontab 中, 不管哪一個檔案被刪除了,其實僅是移除一筆目錄底下的檔案關連性數據,並沒有更動到原本檔案的 inode 與 block 數據呢!而且,不論由那個目錄連結到正確的 crontab 的 inode 與 block , 都可以正確無誤的進行數據的修改喔! 

       一般來說,使用 hard link 設定連結文件時,磁盤的空間與 inode 的數目都不會改變! 由上面的說明來看,我們可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連數據,所以當然不會用掉 inode 與磁盤空間囉!
    
      Tips: 其實可能會改變的,那就是當目錄的 Block 被用完時,就可能會新加一個 block 來記錄,而導致磁盤空間的變化!不過,一般hard link 所用掉的關連數據量很小,所以通常不會改變 inode 與磁盤空間的大小喔!

      由於 hard link 是在同一個 partition 上面進行數據關連的建立,所以 hard link 是有限制的:
            ? 不能跨 Filesystem;
            ? 不能 link 目錄。
      不能跨 Filesystem 還好理解,因爲 hard link 本來就是在一個 partition 內建立關連性的, 那不能 hard link 到目錄又是怎麼回事呢?這是因爲如果使用 hard link 連結到目錄時, 連結的數據被需要連同被連結目錄底下的所有數據都建立連結,因此造成環境相當大的複雜度。目前 hard link 對於目錄暫時還是不支持.


      2)    symbol link
    

      相對於 hard link , Symbolic link 可就好理解多了,基本上,Symbolic link 就是在建立一個獨立的檔案, 而這個檔案會讓數據的讀取指向他 link 的那個檔案內容!由於只是利用檔案來做爲指向的動作, 所以,當來源檔被刪除之後,symbolic link 的檔案會『開不了』, 會一直說『無法開啓某檔案!』。這裏還是得特別留意,這個 Symbolic Link 與 Windows 的快捷方式可以給他劃上等號,由 Symbolic link 所建立的檔案爲一個獨立的新的檔案,所以會佔用掉 inode 與block 喔!

      由上面的說明來看,似乎 hard link 比較安全,因爲即使某一個目錄下的關連數據被殺掉了, 也沒有關係,只要有任何一個目錄下存在着關連數據,那麼該檔案就不會不見!舉上面的例子來說,我的 /etc/crontab 與 /root/crontab 指向同一個檔案,如果我刪除了 /etc/crontab 這個檔案,該刪除的動作其實只是將 /etc 目錄下關於 crontab 的關連數據拿掉而已, crontab 所在的 inode 與 block 其實都沒有被變動喔! 

      不過,不幸的是,由於 Hard Link 的限制太多了,包括無法做『目錄』的 link , 所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方面較廣喔!好了, 說的天花亂墜,看您也差不多快要昏倒了!沒關係,實作一下就知道怎麼回事了!要製作連結檔就必須要使用 ln 這個指令(具體用法參見help)呢!


   
關於目錄的 link 數量:

或許您已經發現了,那就是,當我們以 hard link 進行『檔案的連結』時,可以發現,在 ls -l 所顯示的第二字段會增加一纔對,
那麼如果建立目錄時,他預設的 link 數量會是多少? 讓我們來想一想,一個『空目錄』裏面至少會存在些什麼?呵呵!就是存在 . 與 .. 這兩個目錄啊! 那麼,當我們建立一個新目錄名稱爲 /tmp/testing 時,基本上會有三個東西,那就是:
• /tmp/testing
• /tmp/testing/.
• /tmp/testing/..
而其中 /tmp/testing 與 /tmp/testing/. 其實是一樣的!都代表該目錄啊~而 /tmp/testing/.. 則代表/tmp 這個目錄,所以說,當我們建立一個新的目錄時, 『新的目錄的 link 數爲 2 ,而上層目錄的 link數則會增加 1 』

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章