5分鐘讓你了解Device Mapper 技術

5分鐘讓你瞭解Device Mapper 技術

Device Mapper 簡介

Device Mapper是 linux 的內核用來將塊設備映射到虛擬塊設備的 framework,它支持許多高級卷管理技術。docker 的 devicemapper 存儲驅動程序利用此框架的自動精簡配置(thin provisioning) 和快照功能來管理 docker 鏡像和容器。本文將 Device Mapper 存儲驅動稱為 devicemapper,將它的內核框架稱為 Device Mapper

Device Mapper不同於 AUFS、ext4、NFS 等,因為它並不是一個文件系統(File System),而是 Linux 內核映射塊設備的一種技術框架。提供的一種從邏輯設備(虛擬設備)到物理設備的映射框架機制,在該機制下,用戶可以很方便的根據自己的需要制定實現存儲資源的管理策略。

當前比較流行的 Linux 下的邏輯卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等都是基於該機制實現的。

值得一提的是 Device Mapper工作在塊級別(block),並不工作在文件級別(file)。Device Mapper 自 Linux 2.6.9 後編入 Linux 內核,所有基於 Linux 內核 2.6.9 以後的發行版都內置 Device Mapper,但你需要進行一些額外的配置才能在 docker中使用它。比如在 RHELCentOS 系統中,docker默認使用的存儲驅動是 overlay

devicemapper存儲驅動使用專用於 docker的塊設備,它運行在塊級別上而不是文件級別。使用塊設備比直接使用文件系統性能更好,通過向 Docker 的宿主機添加物理存儲可以擴展塊設備的存儲空間。

用戶空間和內核空間

Device Mapper主要分為用戶空間部分和內核空間部分

用戶空間相關部分主要負責配置具體的策略和控制邏輯,比如邏輯設備和哪些物理設備建立映射,怎麼建立這些映射關係等,包含 device mapper 庫和 dmsetup 工具。對用戶空間創建刪除 device mapper設備的操作進行封裝。

內核中主要提供完成這些用戶空間策略所需要的機制,負責具體過濾和重定向 IO 請求。通過不同的驅動插件,轉發 IO 請求至目的設備上。附上 Device Mapper 架構圖。

5分鐘讓你瞭解Device Mapper 技術

Device Mapper 技術分析

Device Mapper 作為 Linux 塊設備映射技術框架,向外部提供邏輯設備。包含三個重要概念,映射設備(mapped device),映射表(map table),目標設備(target device)。

  • 映射設備即對外提供的邏輯設備,映射設備向下尋找必須找到支撐的目標設備。

  • 映射表存儲映射設備和目標設備的映射關係。

  • 目標設備可以是映射設備或者物理設備,如果目標設備是一塊映射設備,則屬於嵌套,理論上可以無限迭代下去。

簡而言之,Device Mapper 對外提供一個虛擬設備供使用,而這塊虛擬設備可以通過映射表找到相應的地址,該地址可以指向一塊物理設備,也可以指向一個虛擬設備。

5分鐘讓你瞭解Device Mapper 技術

映射表,是由用戶空間創建,傳遞到內核空間。映射表裡有映射設備邏輯的起始地址、範圍、和表示在目標設備所在物理設備的地址偏移量以及Target 類型等信息(注:這些地址和偏移量都是以磁盤的扇區為單位的,即 512 個字節大小,所以,當你看到 128 的時候,其實表示的是 128*512=64K)。

映射驅動在內核空間是插件,Device Mapper 在內核中通過一個一個模塊化的 Target Driver 插件實現對 IO 請求的過濾或者重新定向等工作,當前已經實現的插件包括軟 Raid、加密、多路徑、鏡像、快照等,這體現了在 Linux 內核設計中策略和機制分離的原則。

Device Mapper中的 IO 流處理,從虛擬設備(邏輯設備)根據映射表並指定特定的映射驅動轉發到目標設備上。

Docker 中的 Device Mapper 核心技術

Docker 的devicemapper驅動有三個核心概念,copy on-write(寫複製),thin-provisioning(精簡配置),snapshot(快照)首先簡單介紹一下這三種技術。

CoW(copy on write)寫複製:一些文件系統提供的寫時複製策略。

aufs的 cow 原理如下:

當容器需要修改一個文件,而該文件位於低層 branch 時,頂層 branch 會直接複製低層 branch 的文件至頂層再進行修改,而低層的文件不變,這種方式即是

CoW 技術(寫複製)。

當容器刪除一個低層 branch 文件時,只是在頂層 branch 對該文件進行重命名並隱藏,實際並未刪除文件,只是不可見。


下圖所示,容器層所見 file1 文件為鏡像層文件,當需要修改 file1 時,會從鏡像層把文件複製到容器層,然後進行修改,從而保證鏡像層數據的完整性和複用性。

5分鐘讓你瞭解Device Mapper 技術

下圖所示,當需要刪除 file1 時,由於 file1 是鏡像層文件,容器層會創建一個 .wh 前置的隱藏文件,從而實現對 file1 的隱藏,實際並未刪除 file1,從而保證鏡像層數據的完整性和複用性。

5分鐘讓你瞭解Device Mapper 技術

devicemapper支持在塊級別(

block)寫複製。

  • Snapshot(快照技術):關於指定數據集合的一個完全可用拷貝,該拷貝包括相應數據在某個時間點(拷貝開始的時間點)的映像。快照可以是其所表示的數據的一個副本,也可以是數據的一個複製品。而從具體的技術細節來講,快照是指向保存在存儲設備中的數據的引用標記或指針。

  • Thin-provisioning(精簡配置)直譯為精簡配置。Thin-provisioning是動態分配,需要多少分配多少,區別於傳統分配固定空間從而造成的資源浪費。

它是什麼意思呢?你可以聯想一下我們計算機中的內存管理中用到的——“虛擬內存技術”——操作系統給每個進程 N 多 N 多用不完的內址地址(32 位下,每個進程可以有最多 2GB 的內存空間),但是呢,我們知道,物理內存是沒有那麼多的,如果按照進程內存和物理內存一一映射來玩的話,那麼,我們得要多少的物理內存啊。所以,操作系統引入了虛擬內存的設計,意思是,我邏輯上給你無限多的內存,但是實際上是實報實銷,因為我知道你一定用不了那麼多,於是,達到了內存使用率提高的效果。(今天雲計算中很多所謂的虛擬化其實完全都是在用和“虛擬內存”相似的

Thin Provisioning的技術,所謂的超配,或是超賣)。

好了,話題拉回來,我們這裡說的是存儲。看下面兩個圖,第一個是 Fat Provisioning,第二個是 Thin Provisioning,其很好的說明了是個怎麼一回事(和虛擬內存是一個概念)。

5分鐘讓你瞭解Device Mapper 技術

5分鐘讓你瞭解Device Mapper 技術

那麼,Docker 是怎麼使用 Thin Provisioning 這個技術做到像 UnionFS 那樣的分層鏡像的呢?答案是,Docker 使用了 Thin Provisioning 的 Snapshot 的技術。


分享到:


相關文章: