Linux內核中的DeviceMapper機制
本文結合具體代碼對 Linux 內核中的 device mapper 映射機制進行了介紹。Device mapper 是 Linux 2.6 內核中提供的一種從邏輯設備到物理設備的映射框架機制,在該機制下,用戶可以很方便的根據自己的需要制定實現存儲資源的管理策略,當前比較流行的 Linux 下的邏輯卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等都是基于該機制實現的。理解該機制是進一步分析、理解這些卷管理器的實現及設計的基礎。通過本文也可以進一步理解 Linux 系統塊一級 IO的設計和實現。
Device Mapper 是 Linux2.6 內核中支持邏輯卷管理的通用設備映射機制,它為實現用于存儲資源管理的塊設備驅動提供了一個高度模塊化的內核架構,如圖 1。
在內核中它通過一個一個模塊化的 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在用戶空間相對簡單,主要包括device mapper庫和dmsetup工具。Device mapper庫就是對ioctl、用戶空間創建刪除device mapper邏輯設備所需必要操作的封裝,dmsetup是一個提供給用戶直接可用的創建刪除device mapper設備的命令行工具。因為它們的功能和流程相對簡單,在本文中對它們的細節就不介紹了,用戶空間主要負責如下工作:
1、 發現每個mapped device相關的target device;
2、 根據配置信息創建映射表;
3、 將用戶空間構建好的映射表傳入內核,讓內核構建該mapped device對應的dm_table結構;
4、 保存當前的映射信息,以便未來重新構建。
以下我們主要通過實例來說明dmsetup的使用,同時進一步說明device mapper這種映射機制。用戶空間中最主要的工作就是構建并保存映射表,下面給出一些映射表的例子:
1)
0 1024 linear /dev/sda 204
1024 512 linear /dev/sdb 766
1536 128 linear /dev/sdc 0
2) 0 2048 striped 2 64 /dev/sda 1024 /dev/sdb 0
3) 0 4711 mirror core 2 64 nosync 2 /dev/sda 2048 /dev/sdb 1024
例子1中將邏輯設備0~1023扇區、1024~1535扇區以及1536~1663三個地址范圍分別以線形映射的方式映射到/dev/sda設備第204號扇區、/dev/sdb設備第766號扇區和/dev/sdc設備的第0號扇區開始的區域。
例子2中將邏輯設備從0號扇區開始的,長度為2048個扇區的段以條帶的方式映射的到/dev/sda設備的第 1024號扇區以及/dev/sdb設備的第0號扇區開始的區域。同時告訴內核這個條帶類型的target driver存在2個條帶設備與邏輯設備做映射,并且條帶的大小是64個扇區,使得驅動可以該值來拆分跨設備的IO請求。
例子3中將邏輯設備從0號扇區開始的,長度為4711個扇區的段以鏡像的方式映射到/dev/sda設備的第2048個扇區以及/dev/sdb設備的第1024號扇區開始的區域。
映射表確定后,創建、刪除邏輯設備的操作就相對簡單,通過dmsetup如下命令就可以完成相應的操作。
dmsetup create 設備名 映射表文件 /* 根據指定的映射表創建一個邏輯設備 */
dmsetup reload 設備名 映射表文件 /* 為指定設備從磁盤中讀取映射文件,重新構建映射關系 */
dmsetup remove 設備名 /* 刪除指定的邏輯設備 */

當用戶空間根據映射表下達創建邏輯設備命令后,device mapper在內核中就根據傳入的參數和映射關系建立邏輯地址到物理地址的映射關系。根據映射表例子1中的映射關系建立的設備如圖4所示,圖中的下半部分就抽象地描繪出了按照該映射表在內核中建立的邏輯地址到物理地址的映射關系。
【編輯推薦】






























