it-swarm.cn

轻松解压缩DEB,编辑postinst和重新打包DEB

我正在尝试安装英特尔的OpenCL SDK,但DEB文件是RPM的错误转换(有关好奇的信息,请参阅 此处 )。我需要在它们提供的DEB中编辑postinst脚本。

如何获取现有的DEB,提取内容(包括控制信息),然后在以后重新打包内容以创建新的DEB?我只会编辑文件,不会添加或删除任何文件。

141
John Jumper

操作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

如果您要修改软件包中的任何内容,则应添加 changelog条目 并更改 版本号 。操作Debian软件包的基础结构假定,如果两个软件包具有相同的名称和版本,则它们是相同的软件包。在版本号末尾的debian_revision部分添加后缀;出于排序原因,后缀应以~开头,例如1.2.3-4.1成为1.2.3-4.1~johnjumper1

您可以使用Emacs而不是使用Shell工具。 dpkg-dev-el软件包 (这是它自己的上游,因为这是本地Debian软件包)包含编辑.deb文件和编辑Debian变更日志的模式。 Emacs可以交互使用或编写脚本。

224

您可以将 fpm--after-install选项替换postinst脚本,如下所示:

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
8
Juancho