dm-verity,
一、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 就可以校正資料是否被篡改。