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