Linux磁碟與檔案系統原理

來源:互聯網
上載者:User

  這一章主要是原理性的,介紹了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 』

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.