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


129

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

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

Answers:


202

处理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可以交互使用或编写脚本。


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

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

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

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

8

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

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

2
要在Debian / Ubuntu上安装fpm:sudo apt-get install ruby​​-dev build-essential; sudo gem install fpm
Craig S. Anderson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.