歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Device Mapper 代碼分析

Device Mapper 代碼分析

日期:2017/2/28 16:19:18   编辑:Linux教程

Device Mapper(DM)是Linux 2.6全面引入的塊設備新構架,通過DM可以靈活地管理系統中所有的真實或虛擬的塊設備。

DM以塊設備的形式注冊到Linux內核中,凡是掛載(或者說“映射”)於DM結構下的塊設備,不管他們是如何組織,如何通訊,在Linux看來都是一個完整的DM塊設備。因此DM讓不同組織形式的塊設備或者塊設備集群在Linux內核面前有一個完整統一的DM表示。

一、DM與MD

在Linux內核代碼中(本文以2.6.33內核代碼為參照),DM指的是整個Device Mapper的設計框架。MD(Mapped Device)是框架所虛擬出來的各種設備。簡而言之DM就是不同種類的MD經過特定的關系連接到塊設備管理器上的大構架。

DM的內核代碼集中在drivers/md目錄中。DM構架相關的代碼在dm.c和dm-io.c文件中,各種抽象的MD虛擬設備代碼分散在同目錄的其他文件中,除了dm-ioctl.c是dm設置接口設備。

二、使用DMSetup

使用DM的工具是dmsetup。這個命令幫助我們“組裝”、“解散”、“監視”我們自己的虛擬存儲結構。具體的用法可以參照這裡 ,本文的目的是結合Linux內核源代碼來窺視dm的運作機制。

在dmsetup的子命令中,create、load、reload子命令都帶有 --table <table> 的參數,<table>字符串是創建dm設備的關鍵,若非在命令行中以參數形式給出,則必然需要寫在一個table文件中傳給dmsetup。

table字符串有如下形式:

<start> <length> <type> <arguments>

為了弄清楚這些參數,首先必須明白,create、load、reload子命令總是將一個或一組已經存在的塊設備A的一部分或者全部虛擬稱為塊設備B。在內核代碼中,塊設備B(也是我們直接打交道的設備)稱為mapped device,那一組塊設備A中指定的那部分抽象(可以看作是我們將它交給dm來管理的那一部分)稱為target device(s),對應的驅動為target driver。我們並不要求設備A必須是一個真實的磁盤,它也可以是dm已經虛擬出來的另外一個mapped device。[2] 詳盡的解釋了mapped device、target driver和target device之間的關系。但是這篇文章並沒有著重分析源代碼,而這是本文分析的重點。

table字符串中的<start>和<length>是設備A中,交由dm管理的區域,單位是sector。也就是說,由此創建的mapped device剛好映射在源設備中偏移為start、長度為length的這些sectors中;<type>為target driver的類型,每一個type字符串都對應一個target driver;<arguments>是用來創建target device的參數,這些參數傳遞給target device的創建函數的形式就如同命令行參數傳遞給int main(int argc, char *argv[])一樣。

Linux內核自帶的target driver有linear、stripe、mirror、multi-path、dm-crypt以及一組標准raid的驅動。接下來,我們以stripe的代碼為例,來解釋target driver是如何創建、運行target device的。

Copyright © Linux教程網 All Rights Reserved