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

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

评论

可以通过午夜指挥官(apt install mc)完成解压缩部分—只需在deb文件上按Enter

#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 Pack是标准格式的文件:它们是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可以交互使用或编写脚本。

评论


您也可以使用fpm的-e开关来更改控制文件:fpm -e -s deb -t deb ../old.deb。这将在编辑器中打开控制文件。

– Artefacto
2014年6月30日13:33



顺便说一句,fakeroot bash并尝试发出有关所有权的命令将不起作用,并且ar方法对于大的deb文件来说速度很快!

–水瓶座力量
16-10-6在2:53

谢谢。这很有用。使用dpkg-deb -R保留模式,并且dpkg-deb -b将提取文件的uid:gid重置为0:0。不需要fakeroot(我想如果存档中设置了{u,g} id文件,可能会出现问题,但我的情况并非如此。

– PSkocik
18年8月16日在10:52

@PSkocik不仅是setxid文件,例如/ etc或/ var下需要属于特定组的文件和目录。

–吉尔斯'所以-不再是邪恶的'
18年8月16日在19:33

感谢您的出色回答。有没有办法确保重建的软件包与原始软件包具有相同的md5sum?

– AmaJayJB
19-10-22在13:35

#2 楼

您可以将fpm与--after-install选项一起使用来替换postinst脚本,如下所示:

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


评论


要在Debian / Ubuntu上安装fpm:sudo apt-get install ruby​​-dev build-essential; sudo gem install fpm

–克雷格·安德森(Craig S. Anderson)
18年5月24日在21:47

#3 楼

如果只想从.deb文件中提取文件,则7-Zip很方便。 7-Zip支持“ ar”文件用于“仅解包”。 (无需重命名该文件;它会将* .deb打开为“ ar”,并在其中显示“ data.tar”。)

评论


欢迎来到该站点,并感谢您的贡献。请注意,OP专门要求“拆包DEB ...并重新包装DEB”。也许您也可以编辑帖子以解决该主题。

– AdminBee
20年5月20日在6:31