Bsdiff Bsd斷電差分公升級

2021-10-14 15:17:00 字數 1747 閱讀 3254

本目的是為了實現支援斷電公升級韌體。

bsdiff是乙個差量更新演算法,它在伺服器端執行bsdiff演算法產生patch包,在客戶端執行bspatch演算法,將舊檔案和patch包合成新檔案。

盡可能多的利用old檔案中已有的內容,盡可能少的加入新的內容來構建new檔案。通常的做法是對old檔案和new檔案做子字串匹配或使用hash技術,提取公共部分,將new檔案中剩餘的部分打包成patch包,在patch階段中,用copying和insertion兩個基本操作即可將old檔案和patch包合成new檔案。

在傳統更新中,包含了複製和插入兩種操作。

複製:指的是找到old檔案中所匹配的部分,將其複製到新檔案中。

插入:指的是將old檔案中所沒有的資料插入到新檔案中。

傳統更新缺點:

這種方式在二進位制檔案更新中並不適用,因為對源**進行少量的修改就會導致二進位制檔案產生較大的差異,從而複製和插入指令增多,生成的更新包遠大於理想狀態。所以bsdiff並沒有這樣做。

在乙個新的二進位制檔案,往往會包含這樣幾部分:不受更新**影響的部分,更新**後直接影響的部分,更新**後間接影響的部分。

更新**後間接影響的部分:在更新了源**後,有些**和資料的位址會發生偏移,而且偏移值相同。也就是說,在新舊兩個檔案中,源**塊相同的部分,位元組差異為0或乙個固定值,這個固定值就是位址變化的偏移量。由於這一特性,導致產生的資料將會是高度可壓縮的。

在bsdiff演算法中會找到這兩部分,求出位元組差異,作為diff string並進行壓縮儲存。

如圖在old中新增**塊1(和**塊a不相關),在二進位制檔案中會導致**塊a的位址發生偏移,偏移值是相同的,這樣old中的**塊a和new中的**塊a求位元組差異時就會為乙個固定值,具有高度可壓縮性。

更新**後直接影響的部分:如上圖,當新增了**塊1後,會導致二進位制檔案產生新的資料,這部分資料在old中並不存在,bsdiff演算法會將其作為extra string進行壓縮儲存。

所以到這裡我們能夠得出,bsdiff的更新資料=diff string+extra string。

bsdiff更新資料由四部分組成:header+ctrl block+diff block+extra block。

start/bytes

length/bytes

content08

"bsdiff40"88

the length of ctrl block168

the length of diff block248

新檔案的大小

ctrl block:這部分內容是由(x,y,z)組成。

x代表從old中讀取x位元組和diff block中讀取x位元組做位元組加運算;

y代表從extra block中讀取y位元組資料並且插入到新檔案中;

z代表在old中向前移動z位元組。

diff block:記錄了diff string,也就是位元組的差值;

extra block:記錄了new檔案中新生成的位元組值;

bsdiff主要可以分為三部分:

1.通過排序技術對old檔案的內容進行排序,形成字典序。這裡的排序使用的是字尾排序,當然也可以使用hash技術進行排序。

字典序演算法和**參考:

2.通過二分法查詢最長的匹配len,有了這個len,就可以計算出diff string,和extra string.

3.將diff string+extra string壓縮到更新檔案中。

關於linux斷電安全

因為工控系統會隨時斷電,需要保證斷電後還能正常啟動 1.使用ssd作為儲存,禁用系統日誌,避免無謂的寫入 準備使用overlayfs偽裝根目錄,但是 home目錄可以隨意讀寫,以讓應用程式可以實現斷電儲存功能 準備中.2.home目錄的配置 sqlite3資料庫是否斷電安全,測試了兩年,應該沒什麼問...

Oracle斷電無法啟動

春節回來後,發現資料庫連線不了。ora 01033 oracle initialization or shutdown 網上搜尋得知,該報錯應是資料庫異常斷電造成的。sqlplus nolog shutdown normal startup mount alter database open 出現報...

gitlab斷電後重啟

gitlab ctl status fail alertmanager runsv not running fail gitaly runsv not running systemctl start gitlab runsvdir c 卡住不動了 systemctl t target 檢視系統服務項...