swupdate 之 readback handler

背景

使用 swupdate 作為 OTA 方案 ,有項目要求在寫入數據到分區之後需要再次讀出校驗。

初步實現:readout-verify attribute

初步分析有兩種方式

  • 方案一

在每一筆數據寫入後,立刻讀出校驗。此時原始數據還在 buffer 中,讀出的數據直接跟原始 buffer 做比較即可

  • 方案二

在將分區數據完全寫入後,再讀出校驗。

注意在流式升級的情況下,源數據是分片傳輸寫入的,用完即棄,因此寫完整個分區之後已經沒有原始數據可以比較了。

此時要麼重新從數據源獲取(不可取,相當於下載兩次 OTA 包),要麼需要在 OTA 包中額外配置好校驗值,對讀出數據計算得到的校驗值進行比較。

出於簡單考慮,選擇了方案一進行實現,為 image 增加了一個 readout-verify 屬性,配置後在每筆數據寫入後均會讀出校驗,校驗的方式是直接跟源 buffer 比較。

功能很簡單,但由於源碼中並未考慮這種情況,因此用於校驗的 buffer 無法傳遞,只能反覆申請和釋放,問題不大只是看著有點彆扭。

嘗試把 patch 發出來,想聽聽作者的意見,結果作者回復已經有一個 readback handler 用於支援讀出分區數據進行校驗了。

社區實現: readback handler

這個 reabback handler 採用 scripts 的形式,在所有 image 寫入完成後,再對 image 進行讀出校驗,sha256 校驗值需要在 sw-description 中預先配置好。

舉個例子:

scripts: (
{
    device = "/dev/mmcblk2p1";
    type = "readback";
    properties: {
        sha256 = "e7afc9bd98afd4eb7d8325196d21f1ecc0c8864d6342bfc6b6b6c84eac86eb42";
        size = "184728576";
        offset = "0";
    };
}
);

功能顧名思義,就是讀出指定 device 的指定範圍的數據,算出 sha256 值,驗證與配置中的 sha256 值是否一致。

具體的配置描述如下表。

欄位 類型 描述
device string 要校驗的分區節點
type string 標註handler
sha256 string 分區的sha256值
size string 要校驗的數據大小(單位:位元組)。如果未設置或設置為0,則會自動獲取分區大小
offset string 要校驗的數據偏移(單位:位元組)。如果未設置,默認為0

總結

稍微比較下兩種實現(以下列出的缺點是相對另一個而言,所以優點就不贅述了)

readback handler 的缺點在於

  1. 實現較為複雜,使用也較為複雜,需要配置sha256 (當然一般是通過腳本自動化生成)
  2. 先完全寫入再校驗,即出問題時不會立刻報錯保留現場,而是在所有 image 均寫入完成後,才進行校驗
  3. 對某些訂製不方便實現,例如要求在出錯時重試該筆數據的寫入

readout-verify attribute 的缺點在於

  1. 在某些情況下不適用,例如配合ubi handler,配合rdiff handler
  2. 只能保證該筆數據寫入正確,無法保證完整數據未被篡改。例如寫入 A 數據後讀出校驗成功,再寫入 B 時影響到了 A,則無法被檢測到

綜上,優先選擇社區默認的 readback handler,實在有無法滿足的訂製化需求時,再考慮自行實現特殊屬性和行為。

blog: //www.cnblogs.com/zqb-all/p/12827506.html
公眾號://sourl.cn/T4Skam

Tags: