轻松解压 deb,用新版本重新打包 deb

轻松解压 deb,用新版本重新打包 deb

我已经看过了轻松解压 DEB、编辑 postinst 以及重新打包 DEB- 但是,如果我想对原始 .deb 文件进行一些更改,该文件并没有解释如何正确更改 .deb 版本号。

我使用的是 Ubuntu 14.04,举hostapd个例子:

$ mkdir /tmp/debtest
$ cd /tmp/debtest/
$ apt-get download hostapd
Get:1 http://dk.archive.ubuntu.com/ubuntu/ trusty-updates/universe hostapd amd64 1:2.1-0ubuntu1.4 [423 kB]
Fetched 423 kB in 1s (361 kB/s)  
$ ls -la hostapd_1%3a2.1-0ubuntu1.4_amd64.deb 
-rw-rw-r-- 1 myuser myuser 422846 Nov 10  2015 hostapd_1%3a2.1-0ubuntu1.4_amd64.deb

现在我们可以按照上面引用的链接解压:

$ mkdir unpack-hostapd
$ dpkg-deb -R hostapd_1%3a2.1-0ubuntu1.4_amd64.deb unpack-hostapd
$ ls -la unpack-hostapd/
total 20
drwxr-xr-x 5 myuser myuser 4096 Jan 26 11:31 .
drwxrwxr-x 3 myuser myuser 4096 Jan 26 11:31 ..
drwxr-xr-x 2 myuser myuser 4096 Nov  9  2015 DEBIAN
drwxr-xr-x 6 myuser myuser 4096 Nov  9  2015 etc
drwxr-xr-x 4 myuser myuser 4096 Nov  9  2015 usr

假设我想进行一个简单的更改,例如将一行文本附加到 README.Debian:

echo "Just a test line" >> unpack-hostapd/usr/share/doc/hostapd/README.Debian

...现在我想将其重新打包为新的 .deb。

第一个问题- 有没有办法从解压状态检索包的当前(旧)版本?因为我不信任文件名,所以我通常会这样做:

$ apt-cache policy hostapd
hostapd:
  Installed: (none)
  Candidate: 1:2.1-0ubuntu1.4
...

...这告诉我我在使用时下载了该软件包的版本 1:2.1-0ubuntu1.4 apt-get download...- 但不一定是目录中的版本unpack-hostapd。是否有命令可以告诉我解压到目录中的原始 .deb 的软件包版本unpack-hostapd

现在,我debchangedch -i以前一样使用自动递增版本号(尽管在其他源项目中),但是当我在这里尝试时:

$ cd unpack-hostapd
$ pwd
/tmp/debtest/unpack-hostapd
$ dch -e
dch: fatal error at line 580:
Cannot find debian/changelog anywhere!
Are you in the source code tree?
(You could use --create if you wish to create this file.)
$ find . -name 'changelog*'
./usr/share/doc/hostapd/changelog.Debian.gz
$ dpkg -c ../hostapd_1%3a2.1-0ubuntu1.4_amd64.deb | grep changelog
-rw-r--r-- root/root      2126 2015-11-09 14:56 ./usr/share/doc/hostapd/changelog.Debian.gz

……但是,我无法改变这里的任何事情。

所以我的第二个问题是:有没有一种简单的方法(就像dch -i源包一样)来更改 .deb 包版本号,并可能向解压的 .deb 包添加更改日志?

当然,最终我想将这个新版本重新打包为 .deb 包,上面的链接建议类似dpkg-deb -b unpack-hostapd hostapd_1%3a2.1-0ubuntu1.4_amd64.deb;虽然,在这里说我宁愿使用 version 1:2.2,所以我最终会使用这样的文件名dpkg-deb -b unpack-hostapd hostapd_1%3a2.2_amd64.deb- 但是,该版本也应该与 .deb 中记录的内容匹配,我不知道该怎么做......

答案1

DEBIAN/control版本在二进制控制文件中定义,在使用时提取dpkg-deb -R。寻找一个Version:字段:

Version: 1:2.5.2+v2.4-3+b1

您可以在此处编辑新包的版本号。 (您可以选择将更改日志条目添加到 中的更改日志中usr/share/doc/hostapd/changelog.Debian.gz。)然后您可以像这样重建包,以便为dpkg-deb您确定正确的文件名:

mkdir newpkg
dpkg-deb -b hostapd newpkg

这将在newpkg目录中生成一个新的包,并适当命名。

理想情况下,您应该检查新二进制文件的库要求并更新依赖项信息control

答案2

以下是哪种手动编辑对我有用 - 然而,这是一种盲目的猜测,所以仍然很高兴能从了解该系统的人那里得到答案:

# decompress changelog.Debian.gz
unpack-hostapd$ gzip -d  usr/share/doc/hostapd/changelog.Debian.gz

# edit the uncompressed changelog.Debian:
# add this on top:
# wpa (2.2) trusty-security; urgency=medium
# 
# * whatever
# 
# wpa (2.1-0ubuntu1.4) trusty-security; urgency=medium
# ....
unpack-hostapd$ nano usr/share/doc/hostapd/changelog.Debian

# repack changelog.Debian.gz
unpack-hostapd$ gzip -9 usr/share/doc/hostapd/changelog.Debian

# change DEBIAN/control - Source: and Version:
# change to:
# Source: wpa (2.2)
# Version: 1:2.2
unpack-hostapd$ nano DEBIAN/control

# repack .deb:
unpack-hostapd$ cd ..
$ dpkg-deb -b unpack-hostapd hostapd_1%3a2.2_amd64.deb

# now can install the deb
sudo dpkg -i hostapd_1%3a2.2_amd64.deb

相关内容