Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 區塊級 CDP (連續資料保護) 核心模組原始碼深度解析與下載

編輯:Linux 教學

一、區塊級 CDP 核心架構

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

三大核心裝置角色

  • 主機磁碟 (Host Disk):受保護的來源裝置。
  • CDP 倉庫裝置 (Repository):循序儲存所有寫入資料的歷史副本。
  • CDP 中繼資料裝置 (Metadata):記錄每筆 I/O 的時間戳、長度、來源扇區與倉庫扇區對應關係。

主機磁碟與 CDP 倉庫關係圖

CDP 倉庫與中繼資料對應圖

中繼資料結構定義

struct metadata {
    int hrs, min, sec;          // 寫入時間
    unsigned int bisize;        // 資料區塊長度 (bytes)
    sector_t cdp_sector;        // 倉庫裝置起始扇區
    sector_t host_sector;       // 主機磁碟起始扇區
};

核心流程詳解

1.1 倉庫裝置寫入機制

  • 全域變數 maddr 指向下一筆 I/O 在倉庫裝置的起始扇區,初值為 START_METADATA (0)。
  • 寫請求到達時,資料寫入倉庫裝置 maddr 位置,隨後 maddr 依扇區數遞增。

1.2 中繼資料記錄機制

  • 全域變數 taddr 指向中繼資料裝置的下一筆記錄扇區,初值同為 0。
  • 為簡化實作,每筆中繼資料佔用一整個扇區 (512 bytes),雖浪費空間但極大簡化索引邏輯:寫入 taddr 後 taddr++。

1.3 請求處理流程 (make_request)

  1. 取得當前系統時間戳。
  2. 將原始 bio (B) 克隆為三個 bio:
    • B0:寫入主機磁碟
    • B1:寫入 CDP 倉庫
    • B2:寫入中繼資料
  3. 重導向各 bio 的 bi_bdev 指向對應裝置,設定 bi_end_io 完成回呼。
  4. 分配 cdp_bio 結構串聯三個子請求,使用原子計數器 remaining 追蹤完成狀態 (初值 1,建構完成後遞減一次,避免態)。
  5. 三個子請求全部完成後,呼叫原 bio 完成函數、釋放資源、回傳結果。

請求分流流程圖

1.4 資料恢復流程 (IOCTL GET_TIME)

  1. 掃描中繼資料:循序讀取所有中繼資料扇區,建立 host_sector → cdp_sector 映射鏈表 mt_home,只保留時間戳 ≤ 指定恢復時間點的最新修改。
  2. 從倉庫讀取資料:對 mt_home 每個項目發起讀取倉庫裝置請求,完成時構造對應的寫入主機磁碟 bio,掛載至 mt_bi_home 鏈表。
  3. 執行恢復寫入:提交 mt_bi_home 所有 bio 至主機磁碟,完成後釋放鏈表資源。

步驟 2-3 採用 tasklet 實現,可能為了在中斷上下文外處理大量 I/O 合成。

原始碼下載與參考資源

專案首頁:Block based CDP Module for Linux Kernel (SourceForge)
學術參考:張冬《大話存儲Ⅱ——存儲系統架構與底層原理極限剖析》第 466-470 頁

附錄:Linux 裝置管理基礎補充

文章後半部補充了 Linux 裝置檔案類型 (b/c/s)、主次裝置號、mknod 建立裝置節點、dd 備份 MBR 等基礎操作,適合初学者建立裝置層概念。

# 建立區塊裝置節點範例
mknod harddisk b 3 0
# 查看裝置號
ls -l /dev/hda
file /dev/hda
Copyright © Windows教程網 All Rights Reserved