一、Device Mapper: dm-verity是內核子系統的Device Mapper中的一個子模塊,所以在介紹dm-verity之前先要介紹一下Device Mapper的基礎知識。 Device Mapper為Linux內核提供了一個從邏輯設備到物理設備的映射框架,通過它,用戶可以定製資源 ...
一、Device Mapper:
dm-verity是內核子系統的Device Mapper中的一個子模塊,所以在介紹dm-verity之前先要介紹一下Device Mapper的基礎知識。
Device Mapper為Linux內核提供了一個從邏輯設備到物理設備的映射框架,通過它,用戶可以定製資源的管理策略。當前Linux中的邏輯捲管理器如LVM2(Linux Volume Manager 2)、EVMS(Enterprise Volume Mageagement System)、dmraid等都是基於該機制實現的。
Device Mapper有三個重要的概念:映射設備(Mapped Device)、映射表、目標設備(Target Device);
映射設備是一個邏輯塊設備,用戶可以像使用其他塊設備那樣使用映射設備。映射設備通過映射表描述的映射關係和目標設備建立映射。對映射設備的讀寫操作最終要映射成對目標設備的操作。而目標設備本身不一定是一個實際的物理設備,它可以是另一個映射設備,如此反覆迴圈,理論上可以無限迭代下去。映射關係本質上就是表明映射設備中的地址對應到哪個目標設備的哪個地址。
Device Mapper是一個靈活的架構,映射設備映射一個或多個目標設備,每個目標設備屬於一個類型,類型不同,對I/O處理不同,構造目標設備的方法也不同。映射設備可以映射多個不同類型的目標設備。
Dm-verity規定只能有兩個目標設備,一個是數據設備(Data Device),另一個是哈希設備(Hash Device);
參考IBM博客,世界厲害的人真的多,不得不佩服:
https://www.ibm.com/developerworks/cn/linux/l-devmapper/
二、dm-verity簡介:
dm-verity是Device mapper架構下的一種目標設備類型,通過它來保障設備或設備分區的完整性,它的典型架構是:
dm-verity類型的設備需要兩個底層設備,一個是數據設備,顧名思義是用來存儲數據,實際上就是要保障完整性的設備,另一個是哈希設備,用來存儲哈希值,在校驗數據設備完整性時需要。
圖中映射設備和目標設備是一對一關係,對映射設備的讀操作被映射成對目標設備的讀操作,在目標設備中,dm-verity又將讀操作映射為數據設備(Data Device)的讀操作。但是在讀操作的結束處,dm-verity加了一個額外的校驗操作,對讀到的數據計算一個hash值,用這個哈希值和存儲在哈希設備
(Hash Device)中的值做比較,如果不同,則本次讀操作被標記為錯誤。
假設數據設備和哈希設備中每塊大小均為4KB,再假設使用hash演算法SHA256,即每塊數據的哈希值為32B(256bits),則哈希設備中的每塊(4KB)存儲有4096/32=128個哈希值。所以在layer0中一個哈希設備的塊對應數據設備的128個塊。到這裡似乎完整了,數據設備中存儲數據,哈希設備存儲哈希值。
在讀取數據時,dm-verity還要防備哈希設備中存儲的哈希值被篡改的情況。所以要加上layer1,在layer1中的每塊數據對應layer0的128個塊,layer1中的數據就是對layer0中的數據(hash設備和數據設備中的數據)計算hash值,如果layer1中只有一塊,那麼就此停止,否則繼續增加layer,直到layer n只有一塊。最後對layer n再計算hash值,稱這個hash值為root hash。
這個root hash就可以反應數據設備和hash設備的變化。通過驗證root hash 就可以校驗數據是否被篡改。