瞭解Linux系統中的Device Mapper機制:使用者空間

安全劍客發表於2020-01-11
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 裝置名 /* 刪除指定的邏輯裝置 */

瞭解Linux系統中的Device Mapper機制:使用者空間瞭解Linux系統中的Device Mapper機制:使用者空間

當使用者空間根據對映表下達建立邏輯裝置命令後,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的方法:

  1. 構建target device 的方法;
  2. 刪除target device 的方法;
  3. Target的對映IO請求的方法;
  4. Target結束IO請求的方法;
  5. 暫停target device讀寫的方法;
  6. 恢復target device讀寫的訪問;
  7. 獲取當前target device狀態的訪問;
  8. 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程式碼。

總結

Device Mapper是 Linux作業系統中塊裝置一級提供的一種主要對映機制,現在已被多數Linux下的邏輯卷管理器所採用。在該機制下,實現使用者自定義的儲存資源管理策略變得極其方便。理解device mapper所提供的對映機制,也是進一步理解Linux下一些常見邏輯卷管理器實現的基礎。

原文地址: https://www.linuxprobe.com/linux-device-mapper-user.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2672997/,如需轉載,請註明出處,否則將追究法律責任。

相關文章