我正在嘗試安裝 Intel 的 OpenCL SDK,但 DEB 檔案是從 RPM 轉換而來的錯誤(請參閱這裡對於好奇的人)。我需要postinst
在他們提供的 DEB 中編輯腳本。
如何取得現有的 DEB,提取內容(包括控制資訊),然後重新打包內容以製作新的 DEB?我只會編輯文件,不會新增或刪除任何文件。
答案1
操作 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 可以互動使用或腳本化使用。
答案2
您可以使用氟PM可以--after-install
選擇替換postinst
腳本,如下所示:
fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
答案3
如果您只想從 .deb 文件中提取文件,7-Zip 會很方便。 7-Zip 支援“ar”檔案“僅解壓縮”。 (無需重新命名該檔案;它會以“ar”形式開啟 *.deb,並在內部顯示“data.tar”。)