轻松解压 DEB、编辑 postinst 以及重新打包 DEB

轻松解压 DEB、编辑 postinst 以及重新打包 DEB

我正在尝试安装 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”。)

相关内容