zoukankan      html  css  js  c++  java
  • LINUX磁盘与档案系统

    • 我們常聽到的LVM與軟體磁碟陣列(software raid), 這些技術可以將一個分割槽格式化為多個檔案系統(例如LVM),也能夠將多個分割槽合成一個檔案系統(LVM, RAID)! 所以說,目前我們在格式化時已經不再說成針對 partition 來格式化了, 通常我們可以稱呼一個可被掛載的資料為一個檔案系統而不是一個分割槽喔!
      • superblock:記錄此 filesystem 的整體資訊,包括inode/block的總量、使用量、剩餘量, 以及檔案系統的格式與相關資訊等;
      • inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的 block 號碼;
      • block:實際記錄檔案的內容,若檔案太大時,會佔用多個 block 。
    •                               
    • data block: data block 是用來放置檔案內容資料地方,在 Ext2 檔案系統中所支援的 block 大小有 1K, 2K 及 4K 三種而已。在格式化時 block 的大小就固定了,且每個 block 都有編號,以方便 inode 的記錄啦。

      • 原則上,block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化);
      • 每個 block 內最多只能夠放置一個檔案的資料;
      • 承上,如果檔案大於 block 的大小,則一個檔案會佔用多個 block 數量;
      • 承上,若檔案小於 block ,則該 block 的剩餘容量就不能夠再被使用了(磁碟空間會浪費)。
    • inode table (inode 表格):inode 記錄的檔案資料至少有底下這些:
      • 該檔案的存取模式(read/write/excute);
      • 該檔案的擁有者與群組(owner/group);
      • 該檔案的容量;
      • 該檔案建立或狀態改變的時間(ctime);
      • 最近一次的讀取時間(atime);
      • 最近修改的時間(mtime);
      • 定義檔案特性的旗標(flag),如 SetUID...;
      • 該檔案真正內容的指向 (pointer);

             inode 的數量與大小也是在格式化時就已經固定了,除此之外 inode 還有些什麼特色呢?

      • 每個 inode 大小均固定為 128 bytes (新的 ext4 與 xfs 可設定到 256 bytes);
      • 每個檔案都僅會佔用一個 inode 而已;
      • 承上,因此檔案系統能夠建立的檔案數量與 inode 的數量有關;
      • 系統讀取檔案時需要先找到 inode,並分析 inode 所記錄的權限與使用者是否符合,若符合才能夠開始實際讀取 block 的內容。
    •                                
    • 上圖最左邊為 inode 本身 (128 bytes),裡面有 12 個直接指向 block 號碼的對照,這 12 筆記錄就能夠直接取得 block 號碼啦! 至於所謂的間接就是再拿一個 block 來當作記錄 block 號碼的記錄區,如果檔案太大時, 就會使用間接的 block 來記錄號碼。如上圖 7.1.4 當中間接只是拿一個 block 來記錄額外的號碼而已。 同理,如果檔案持續長大,那麼就會利用所謂的雙間接,第一個 block 僅再指出下一個記錄號碼的 block 在哪裡, 實際記錄的在第二個 block 當中。依此類推,三間接就是利用第三層 block 來記錄號碼啦!

      這樣子 inode 能夠指定多少個 block 呢?我們以較小的 1K block 來說明好了,可以指定的情況如下:

      • 12 個直接指向: 12*1K=12K
        由於是直接指向,所以總共可記錄 12 筆記錄,因此總額大小為如上所示;

      • 間接: 256*1K=256K
        每筆 block 號碼的記錄會花去 4bytes,因此 1K 的大小能夠記錄 256 筆記錄,因此一個間接可以記錄的檔案大小如上;

      • 雙間接: 256*256*1K=2562K
        第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個號碼,因此總額大小如上;

      • 三間接: 256*256*256*1K=2563K
        第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個第三層,每個第三層可以指定 256 個號碼,因此總額大小如上;

      • 總額:將直接、間接、雙間接、三間接加總,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB

      此時我們知道當檔案系統將 block 格式化為 1K 大小時,能夠容納的最大檔案為 16GB,比較一下檔案系統限制表的結果可發現是一致的!但這個方法不能用在 2K 及 4K block 大小的計算中, 因為大於 2K 的 block 將會受到 Ext2 檔案系統本身的限制,所以計算的結果會不太符合之故。

    • Superblock (超級區塊):

      他記錄的資訊主要有:

      • block 與 inode 的總量;
      • 未使用與已使用的 inode / block 數量;
      • block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128bytes 或 256bytes);
      • filesystem 的掛載時間、最近一次寫入資料的時間、最近一次檢驗磁碟 (fsck) 的時間等檔案系統的相關資訊;
      • 一個 valid bit 數值,若此檔案系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1 。
      • 除了第一個 block group 內會含有 superblock 之外,後續的 block group 不一定含有 superblock , 而若含有 superblock 則該 superblock 主要是做為第一個 block group 內 superblock 的備份咯,這樣可以進行 superblock 的救援呢!
    • block bitmap (區塊對照表):如果你刪除某些檔案時,那麼那些檔案原本佔用的 block 號碼就得要釋放出來, 此時在 block bitmap 當中相對應到該 block 號碼的標誌就得要修改成為『未使用中』囉!這就是 bitmap 的功能。
    • inode bitmap (inode 對照表):這個其實與 block bitmap 是類似的功能,只是 block bitmap 記錄的是使用與未使用的 block 號碼, 至於 inode bitmap 則是記錄使用與未使用的 inode 號碼囉!
    • dumpe2fs: 查詢 Ext 家族 superblock 資訊的指令
    • sync:直接在文字介面下輸入sync,那麼在内存中尚未被更新的資料,就會被寫入硬碟中!所以,這個指令在系統關機或重新開機之前, 很重要喔!最好多執行幾次!
    • XFS 檔案系統的配置(用於高容量磁碟以及高效能檔案) ,主要規劃為三個部份,一個資料區 (data section)、一個檔案系統活動登錄區 (log section)以及一個即時運作區 (realtime section)。 這三個區域的資料內容如下:
      • 資料區 (data section):xfs 的這個資料區的儲存區群組 (allocation groups, AG),你就將它想成是 ext 家族的 block 群組 (block groups) 就對了!本小節之前講的都可以在這個區塊內使用。 只是 inode 與 block 是動態產生,並非一開始於格式化就完成配置的
      • 檔案系統活動登錄區 (log section):因為系統所有動作的時候都會在這個區塊做個紀錄,因此這個區塊的磁碟活動是相當頻繁的!xfs 設計有點有趣,在這個區域中, 妳可以指定外部的磁碟來作為 xfs 檔案系統的日誌區塊喔!例如,妳可以將 SSD 磁碟作為 xfs 的登錄區,這樣當系統需要進行任何活動時, 就可以更快速的進行工作!相當有趣!
      • 即時運作區 (realtime section):當有檔案要被建立時,xfs 會在這個區段裡面找一個到數個的 extent 區塊,將檔案放置在這個區塊內,等到分配完畢後,再寫入到 data section 的 inode 與 block 去! 這個 extent 區塊的大小得要在格式化的時候就先指定,最小值是 4K 最大可到 1G。
      • XFS 檔案系統的描述資料觀察:像 EXT 家族的 dumpe2fs 去觀察 superblock 內容的相關指令可以查閱呢?有啦!可以使用 xfs_info 去觀察的! 詳細的指令作法可以參考如下:
    •                  
    •       
  • 相关阅读:
    Redis21:客户端与服务器端的通信与redis管道
    Redis20:keys、scan、bigkeys、查看key的存储方式
    Redis19:限流
    Redis18:分布式锁
    Redis17:cluster集群
    Redis16:两种redis集群解决方案:codis和cluster
    Android : 获取声卡信息的测试代码
    Android : 基于alsa库的音乐播放
    Android system :灯光系统_HAL_lights
    Android system :led_class驱动
  • 原文地址:https://www.cnblogs.com/itheone/p/11901406.html
Copyright © 2011-2022 走看看