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
的缺點在於
- 實現較為複雜,使用也較為複雜,需要配置
sha256
(當然一般是通過腳本自動化生成) - 先完全寫入再校驗,即出問題時不會立刻報錯保留現場,而是在所有
image
均寫入完成後,才進行校驗 - 對某些訂製不方便實現,例如要求在出錯時重試該筆數據的寫入
readout-verify attribute
的缺點在於
- 在某些情況下不適用,例如配合
ubi handler
,配合rdiff handler
- 只能保證該筆數據寫入正確,無法保證完整數據未被篡改。例如寫入
A
數據後讀出校驗成功,再寫入B
時影響到了A
,則無法被檢測到
綜上,優先選擇社區默認的 readback handler
,實在有無法滿足的訂製化需求時,再考慮自行實現特殊屬性和行為。
blog: //www.cnblogs.com/zqb-all/p/12827506.html
公眾號://sourl.cn/T4Skam