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