Linux

使用 rsync 從 tar 恢復文件

  • February 18, 2021

我正在為一件嵌入式設備編寫軟體升級功能。目前,根文件系統通過獲取一個新的 rootfs.tar.gz 文件並將其解壓縮到根文件系統(覆蓋現有文件並添加新文件)來升級。但這不會刪除不在新包中的文件。

所以現在我將不得不 rm -rf 所有現有文件,然後解壓縮新的 rootfs tar 文件。這似乎需要做很多工作,並且需要很多時間,而且可能唯一改變的是一個配置文件。

相反,我希望能夠將 .tar.gz 文件的內容同步到目錄。這是否可行而無需通過某種中介(意思是,無需將 tar 解壓到臨時目錄然後執行 rsync)?

直接,沒有任何方法可以做你想做的事。正如評論中提到的,archivemount可能是一個選項,儘管它有其自身的限制(其中一個是依賴於在建構核心時啟用的特定配置選項)。

但是,我想到了兩個替代選項:

  1. 使用SquashFS映像而不是 gzip 壓縮的 tar 文件。這些可以由核心直接掛載,並且在許多情況下實際上比等效的壓縮 tar 文件要小。然後,您可以從已安裝的 SquashFS 映像中使用 rsync。如果您使用 Buildroot 實際為此建構根文件系統,則可以選擇直接生成這樣的圖像。
  2. 而不是只有一個根分區,而是使用兩個。進行初始安裝時,將所有數據寫入兩個分區,並將引導載入程序設置為僅從其中一個分區引導。當您升級系統時,核對另一個分區,在那裡提取您的根存檔,更新引導載入程序以從中引導,然後重新啟動。雖然執行更新需要比您建議的時間更長的時間,但它有幾個相當大的優勢:
  • 它使您可以回滾幾乎立即破壞某些功能的升級。您無需重新安裝舊韌體,只需更新引導載入程序以從另一個根分區啟動並重新啟動。
  • 這使得將系統變磚變得非常困難。因為您只在更新完成後才更新引導載入程序,所以您可以保證不會因為更新過程中斷電而引導到部分根文件系統。
  • 它可以在不需要 RAID 的情況下從儲存硬體中的靜態數據損壞中恢復(儘管如果這需要是一個可靠的設備,那麼無論如何您都應該認真考慮 RAID)。如果您知道您目前的版本“不好”,只需暫時回滾到上一個版本,然後重新安裝新版本。
  • 它減少了停機時間。對於您的策略,您必須在設備功能離線的情況下進行幾乎所有操作(否則您將面臨更新期間出現故障的風險)。使用此方法,您可以將更新所需的停機時間減少到重啟設備所需的時間。

引用自:https://unix.stackexchange.com/questions/438162