輕鬆解壓 DEB、編輯 postinst 和重新打包 DEB
我正在嘗試安裝英特爾的 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 可以以互動方式或腳本方式使用。