Package-Management

輕鬆解壓 DEB、編輯 postinst 和重新打包 DEB

  • July 26, 2021

我正在嘗試安裝英特爾的 OpenCL SDK,但 DEB 文件是來自 RPM 的錯誤轉換(好奇的請參見此處)。我需要postinst在他們提供的 DEB 中編輯腳本。

如何獲取現有的 DEB,提取內容(包括控制資訊),然後重新打包內容以製作新的 DEB?我只會編輯文件,不會添加或刪除文件。

操作 deb 包的主要命令是dpkg-deb.

要解壓包,創建一個空目錄並切換到它,然後執行dpkg-deb以提取其控制資訊和封包件。用於dpkg-deb -b重建包。

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

請注意,除非您的腳本以 root 身份執行,否則文件的權限和所有權將在提取階段損壞。避免這種情況的一種方法是在fakeroot. 請注意,您需要在 下執行整個序列fakeroot,而不是dpkg-deb單獨執行,因為它fakeroot是保留無法按原樣創建的文件權限的記憶體的過程。

fakeroot sh -c '
 mkdir tmp
 dpkg-deb -R original.deb tmp
 # edit DEBIAN/postinst
 dpkg-deb -b tmp fixed.deb
'

您可以保持數據存檔完整併僅修改控制存檔,而不是弄亂權限。dpkg-deb沒有提供這樣做的方法。幸運的是,deb 包採用標準格式:它們是ar檔案。因此,您可以使用ar來提取控制存檔,修改其文件,然後ar再次使用以將控制存檔替換為新版本。

mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz

如果您修改包中的任何內容,您應該**添加一個更改日誌條目並更改版本號。**操作 Debian 軟體包的基礎設施假設如果兩個軟體包具有相同的名稱和版本,它們就是同一個軟體包。在版本號末尾的debian_revision部分添加後綴;出於排序原因,後綴應以 開頭~,例如1.2.3-4.1變為1.2.3-4.1~johnjumper1.

您可以使用 Emacs,而不是使用 shell 工具。該dpkg-dev-el軟體包(這是它自己的上游,因為這是一個本地 Debian 軟體包)包含編輯.deb文件和編輯 Debian 變更日誌的模式。Emacs 可以以互動方式或腳本方式使用。

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