recovery模式差分(增量)升級小結

  • 2019 年 11 月 2 日
  • 筆記

最近在做recovery模式下的升級,簡單的總結一下。

先說說recovery模式,他是個升級小系統,有單獨的kernel,通過特定的系統命令就可以進入到此系統中,選擇進入正常系統的kernel還是recovery系統的kernel,

決定在於bootloader中,recovery中的boot與正常系統的boot燒寫的是相同的kernel,不同點在於,recovery模式有一個單獨的rootfs,這個是一個非常小的系統,

系統的很多功能也是不啟動的, 主要目的就是留給升級流出足夠的內存,主系統與recovery系統通信的橋樑就是/cache分區,此分區在正常系統啟動與recovery

模式都是要被掛載mount。在主系統寫命令到cache中,在recovery中讀取,升級後,升級結果及日誌也是在cache中。

recovery系統中大致流程,有些覺得不重要就省略了

1、執行find_recovery_partition.sh腳本它的工作就是生成/res/recovery_volume_detected文件,很重要的,掛載分區,attach類型為ubi的分區,如system modem。

2、rc啟動腳本主要是啟動了調用recovery進程的腳本,此腳本中運行recovery進程,升級的所有功能就在recovery進程中完成,recovery進程中涉及到的load_volume_table()

    函數,讀取的文件就是由find_recovery_partition.sh腳本生成的。

3、讀取升級命令,升級命令位於/cache/recovery/command中,格式可以看函數注釋。在此過程中會寫misc分區一個msg,主要是防止升級過程中掉電,在lk中會

     讀取misc中的msg,如果升級中異常掉電,系統加載起來之後就繼續進入recovery模式進程升級。

4、接下來就是從升級包重獲取可執行程序,讀取到/tmp中,升級包簽名校驗,本項目沒涉及到不多說,然後就是創建管道,創建子進程,子進程中執行updater進

      程。將進度,結果等通知到主進程,直到升級結束。

5、updater進程的執行過程,有太多的文件講了及就不講了。

6、升級結束後,finish_recovery做收尾工作,拷貝日誌,寫升級結果,然後系統reboot。

7、重啟後,主系統正常啟動後,就可以從cache中獲取到當前升級的結果,日誌,升級包等。

遇到的一些問題:

1、對nand來說,存在flash層的操作與mtd層的操作,lk中是對flash的操作可以按照頁,頁大小有2048/4096,mtd層對block操作的,一般都是好多個頁組成,如64*2048,

作為一個block。有個分區比較特殊,不能多寫flash,因為就是recovery中是mtd層的操作,想要精確,只能在lk中去做,比較特殊。

2、使用的打包工具,高人寫了腳本,可以將modem分區按照ubi的方式打包,很是厲害啊,對比了下文件展開方式,升級包比較小,升級還快,真實佩服啊。

3、整個recovery模式升級功能其實高通已經完成了很多關鍵,主要的功能,我們也是簡單的使用了下。

10-24 新增流程圖

簡單說明

1、流程圖中省略也很多細節,其實好多細節都是可以拿出來大寫特寫,比如差分文件是如何計算生成的(涉及imgdiff 與bsddiff),對於有文件系統的文件權限的處理

    (full package時更關心一點)  updater-script腳本用於執行的腳本解析器的運行,等等

2、標註紅色的部分是我認為比較關鍵和重要的部分,包括為說明的updater-script每條命令對應的回調函數。

3、可能不同的應用場景不一樣,當前沒有將ui部分的邏輯,還有升級前的條件檢查處理,升級異常等等。

4、recovery進程執行結束之後會執行收尾工作,保存日誌,寫升級結果等等,然後就是syse_reboot,圖中帶recovery 的塊其實就是在recovery進程中執行的, 按照函數

     調用順序寫的。

                                 

 

                                 長按二維碼關注【嵌入式C部落】,獲取更多編程資料及精華文章