您好,登錄后才能下訂單哦!
這篇文章主要講解了“Linux中Device Mapper內核空間是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Linux中Device Mapper內核空間是什么”吧!
Devicemapper是內核中支持邏輯卷管理的通用設備映射機制,它為實現用于存儲資源管理的塊設備驅動提供了一個高度模塊化的內核架構,它包含三個重要的對象概念,Mapped Device、Mapping Table、Target device。
在內核中它通過一個一個模塊化的 target driver 插件實現對 IO 請求的過濾或者重新定向等工作,當前已經實現的 target driver 插件包括軟 raid、軟加密、邏輯卷條帶、多路徑、鏡像、快照等,圖中 linear、mirror、snapshot、multipath 表示的就是這些 target driver。Device mapper 進一步體現了在 Linux 內核設計中策略和機制分離的原則,將所有與策略相關的工作放到用戶空間完成,內核中主要提供完成這些策略所需要的機制。Device mapper 用戶空間相關部分主要負責配置具體的策略和控制邏輯,比如邏輯設備和哪些物理設備建立映射,怎么建立這些映射關系等等,而具體過濾和重定向 IO 請求的工作由內核中相關代碼完成。因此整個 device mapper 機制由兩部分組成–內核空間的 device mapper 驅動、用戶空間的device mapper 庫以及它提供的 dmsetup 工具。在下文中,我們分內核和用戶空間兩部分進行介紹。
Device mapper 的內核相關代碼已經作為 Linux 2.6 內核發布版的一部分集成到內核源碼中了,相關代碼在內核源碼的 driver/md/ 目錄中,其代碼文件可以劃分為實現 device mapper 內核中基本架構的文件和實現具體映射工作的 target driver 插件文件兩部分。文章下面的分析結果主要是基于上述源碼文件得到的。
Device mapper 在內核中作為一個塊設備驅動被注冊的,它包含三個重要的對象概念,mapped device、映射表、target device。Mapped device 是一個邏輯抽象,可以理解成為內核向外提供的邏輯設備,它通過映射表描述的映射關系和 target device 建立映射。從 Mapped device 到一個 target device 的映射表由一個多元組表示,該多元組由表示 mapped device 邏輯的起始地址、范圍、和表示在 target device 所在物理設備的地址偏移量以及target 類型等變量組成(這些地址和偏移量都是以磁盤的扇區為單位的,即 512 個字節大小)。Target device 表示的是 mapped device 所映射的物理空間段,對 mapped device 所表示的邏輯設備來說,就是該邏輯設備映射到的一個物理設備。Device mapper 中這三個對象和 target driver 插件一起構成了一個可迭代的設備樹。在該樹型結構中的頂層根節點是最終作為邏輯設備向外提供的 mapped device,葉子節點是 target device 所表示的底層物理設備。最小的設備樹由單個 mapped device 和 target device 組成。每個 target device 都是被mapped device 獨占的,只能被一個 mapped device 使用。一個 mapped device 可以映射到一個或者多個 target device 上,而一個 mapped device 又可以作為它上層 mapped device的 target device 被使用,該層次在理論上可以在 device mapper 架構下無限迭代下去。
從上圖中我們可以看到 mapped device1 通過映射表和 a、b、c 三個 target device 建立了映射關系,而 target device a 又是通過 mapped device 2 演化過來,mapped device 2 通過映射表和 target device d 建立映射關系。
我們進一步看一下上圖中三個對象在代碼中的具體實現,dm.c 文件定義的 mapped_device 結構用于表示 mapped device,它主要包括該 mapped device 相關的鎖,注冊的請求隊列和一些內存池以及指向它所對應映射表的指針等域。
Mapped device 對應的映射表是由 dm_table.c 文件中定義的 dm_table 結構表示的,該結構中包含一個 dm_target結構數組,dm_target 結構具體描述了 mapped_device 到它某個 target device 的映射關系。
而在 dm_table 結構中將這些 dm_target 按照 B 樹的方式組織起來方便 IO 請求映射時的查找操作。Dm_target 結構具體記錄該結構對應 target device 所映射的 mapped device 邏輯區域的開始地址和范圍,同時還包含指向具體 target device 相關操作的 target_type 結構的指針。
Target_type 結構主要包含了 target device 對應的 target driver 插件的名字、定義的構建和刪除該類型target device的方法、該類target device對應的IO請求重映射和結束IO的方法等。而表示具體的target device的域是dm_target中的private域,該指針指向mapped device所映射的具體target device對應的結構。表示target device的具體結構由于不同的target 類型而不同,比如最簡單的線性映射target類型對應target device的結構是dm-linear.c文件中定義的linear_c結構。其定義如下:
struct linear_c { struct dm_dev *dev; sector_t start; };
該target device的定義相當簡單,就只包括了表示對應物理設備的dm_dev結構指針和在該物理設備中以扇區為單位的偏移地址start。上述幾個數據結構關系如圖所示:
在下面我們結合具體的代碼簡要介紹下在內核中創建一個mapped device的過程:
通過上述的4個主要步驟,device mapper在內核中就建立一個可以提供給用戶使用的mapped device邏輯塊設備。
Device mapper本質功能就是根據映射關系和target driver描述的IO處理規則,將IO請求從邏輯設備mapped device轉發相應的target device上。Device mapper處理所有從內核中塊一級IO子系統的generic_make_request和submit_bio接口[兩個接口具體的描述可以查看參考文獻[1]和[2],這兩本書對內核中的塊IO層有比較詳盡的講解。] 中定向到mapped device的所有塊讀寫IO請求。IO請求在device mapper的設備樹中通過請求轉發從上到下地進行處理。當一個bio請求在設備樹中的mapped deivce向下層轉發時,一個或者多個bio的克隆被創建并發送給下層target device。然后相同的過程在設備樹的每一個層次上重復,只要設備樹足夠大理論上這種轉發過程可以無限進行下去。在設備樹上某個層次中,target driver結束某個bio請求后,將表示結束該bio請求的事件上報給它上層的mapped device,該過程在各個層次上進行直到該事件最終上傳到根mapped device的為止,然后device mapper結束根mapped device上原始bio請求,結束整個IO請求過程。
Bio在device mapper的設備樹進行逐層的轉發時,最終轉發到一個或多個葉子target節點終止。因為一個bio請求不可以跨多個target device(亦即物理空間段), 因此在每一個層次上,device mapper根據用戶預先告知的mapped device 的target映射信息克隆一個或者多個bio,將bio進行拆分后轉發到對應的target device上。這些克隆的bio先交給mapped device上對應的target driver上進行處理,根據target driver中定義的IO處理規則進行IO請求的過濾等處理,然后再提交給target device完成。上述過程在dm.c文件中的dm_request函數中完成。Target driver可以對這些bio做如下處理:
IO請求就按照上文中描述的過程在圖2中所示的設備樹中逐層進行處理,直到IO請求結束。
感謝各位的閱讀,以上就是“Linux中Device Mapper內核空間是什么”的內容了,經過本文的學習后,相信大家對Linux中Device Mapper內核空間是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。