Block based CDP Module for Linux Kernel 是 Red Hat 學術開源專案,在區塊層實現連續資料保護 (CDP)。它持續攔截所有寫入 I/O 請求,為每個請求打上時間戳,將資料變更順序寫入 CDP 倉庫裝置,並將中繼資料儲存於獨立的中繼資料裝置,支援將資料恢復至任意歷史時間點。


struct metadata {
int hrs, min, sec; // 寫入時間
unsigned int bisize; // 資料區塊長度 (bytes)
sector_t cdp_sector; // 倉庫裝置起始扇區
sector_t host_sector; // 主機磁碟起始扇區
};
maddr 指向下一筆 I/O 在倉庫裝置的起始扇區,初值為 START_METADATA (0)。maddr 位置,隨後 maddr 依扇區數遞增。taddr 指向中繼資料裝置的下一筆記錄扇區,初值同為 0。taddr 後 taddr++。make_request)bi_bdev 指向對應裝置,設定 bi_end_io 完成回呼。cdp_bio 結構串聯三個子請求,使用原子計數器 remaining 追蹤完成狀態 (初值 1,建構完成後遞減一次,避免態)。
GET_TIME)host_sector → cdp_sector 映射鏈表 mt_home,只保留時間戳 ≤ 指定恢復時間點的最新修改。mt_home 每個項目發起讀取倉庫裝置請求,完成時構造對應的寫入主機磁碟 bio,掛載至 mt_bi_home 鏈表。mt_bi_home 所有 bio 至主機磁碟,完成後釋放鏈表資源。步驟 2-3 採用 tasklet 實現,可能為了在中斷上下文外處理大量 I/O 合成。
專案首頁:Block based CDP Module for Linux Kernel (SourceForge)
學術參考:張冬《大話存儲Ⅱ——存儲系統架構與底層原理極限剖析》第 466-470 頁
文章後半部補充了 Linux 裝置檔案類型 (b/c/s)、主次裝置號、mknod 建立裝置節點、dd 備份 MBR 等基礎操作,適合初学者建立裝置層概念。
# 建立區塊裝置節點範例
mknod harddisk b 3 0
# 查看裝置號
ls -l /dev/hda
file /dev/hda