swupdate 之 readback handler

all發表於2020-05-04

背景

使用 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: https://www.cnblogs.com/zqb-all/p/12827506.html
公眾號:https://sourl.cn/T4Skam

相關文章