您好,登錄后才能下訂單哦!
本篇內容介紹了“Linux系統中的Device Mapper機制介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Device mapper在用戶空間相對簡單,主要包括device mapper庫和dmsetup工具。Device mapper庫就是對ioctl、用戶空間創建刪除device mapper邏輯設備所需必要操作的封裝,dmsetup是一個提供給用戶直接可用的創建刪除device mapper設備的
命令行工具。 |
因為它們的功能和流程相對簡單,在本文中對它們的細節就不介紹了,用戶空間主要負責如下工作:
發現每個mapped device相關的target device;
根據配置信息創建映射表;
將用戶空間構建好的映射表傳入內核,讓內核構建該mapped device對應的dm_table結構;
保存當前的映射信息,以便未來重新構建。
以下我們主要通過實例來說明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所示,圖中的下半部分就抽象地描繪出了按照該映射表在內核中建立的邏輯地址到物理地址的映射關系。
Device mapper的用戶空間部分對開發者要實現自己的存儲管理工具來說是可選的,事實上,很多我們常見的邏輯卷管理器,比如LVM2、dmraid等工具都利用device mapper的提供的device mapper用戶空間庫,根據自己的管理需求建立獨立的一套管理工具,而并沒有使用它提供的dmsetup工具,甚至IBM的開源項目企業級的邏輯卷管理系統-EVMS,在實現中都沒有采用device mapper的用戶空間庫,完全根據內核中的ioctl定義實現了一套自己的函數庫。
Target Driver
Device mapper提供了一個統一的架構,通過target driver 插件的方式允許用戶根據實際的需要指定自己的IO處理規則,因此target driver充分體現了device mapper的靈活性。在上文中我們已經不止一次的提到過target driver,也描述過target driver的功能,在這里我們結合最簡單的linear target driver具體介紹target driver的實現。
Target driver主要定義對IO請求的處理規則,在device mapper中對target driver的操作已定義好了統一的接口,在實現中該接口由我們上文提到的target_type結構中定義,它定義了以下target driver的方法:
構建target device 的方法;
刪除target device 的方法;
Target的映射IO請求的方法;
Target結束IO請求的方法;
暫停target device讀寫的方法;
恢復target device讀寫的訪問;
獲取當前target device狀態的訪問;
Target 處理用戶消息的方法;
用戶可以根據具體需求選擇性地實現上述方法,但一般最少要實現前3種方法,否則在device mapper下不能夠正常的工作。linear target driver就只實現了前3種方法和方法7,它完成邏輯地址空間到物理地址空間的線性映射,可以將多個物理設備以線性連接的方式組成一個邏輯設備,就如圖4中描述的那樣,通過linear target driver將/dev/sda、/dev/sdb、/dev/sdc的三段連續空間組成了一個大的邏輯塊設備。Linear target的實現很簡單,它的創建和刪除方法主要完成申請和釋放描述linear target device所用結構的內存資源;IO映射處理方法的實現更是簡單,如下代碼所示:
static int linear_map(struct dm_target *ti, struct bio *bio, union map_info *map_context) { struct linear_c *lc = (struct linear_c *) ti->private; bio->bi_bdev = lc->dev->bdev; bio->bi_sector = lc->start + (bio->bi_sector - ti->begin); return 1; }
該映射方法就是將發送給邏輯設備mapped device的bio請求,根據映射關系以線性的方式重新定向到linear target device所表示物理設備的相應位置,如代碼所示具體實現方法就是修改bio的bi_bdev設備指針為target device對應的設備指針,并根據target device的起始地址和該bio請求在mapped device設備上的偏移值改變IO請求開始的扇區號bi_sector,從而完成IO請求的重定向。其他target driver的實現也都大同小異,按照device mapper所定義的接口規范,結合自己需要的功能進行實現即可,這里就不一一介紹了,有興趣的讀者可以看內核中具體的target driver代碼。
“Linux系統中的Device Mapper機制介紹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。