在linux上我们可以重新打包已安装的rpm,如果是这样的话。我记得可以从已安装的二进制文件中生成一个rpm
rpm -??? > my.rpm
也是后者,即较新的rpm应该在不同的机器上工作
答案 0 :(得分:4)
还有rpmrebuild http://rpmrebuild.sourceforge.net
答案 1 :(得分:3)
实际上有一种简单但“棘手”的方式;它只是:rpm -e --repackage package-name
它将以/var/spool/repackage/
输出RPM。
示例:
# rpm -e --repackage samba3x-client
# file /var/spool/repackage/samba3x-client-3.5.4-0.83.el5_7.2.i386.rpm
/var/spool/repackage/samba3x-client-3.5.4-0.83.el5_7.2.i386.rpm: RPM v3 bin i386 samba3x-client-3.5.4-0.83.el5_7
为什么这么棘手?因为它在打包之前实际上删除程序,所以你知道。
答案 2 :(得分:2)
这是可能的,但不能使用rpm
命令。我写了一个执行此操作的perl脚本;它根据rpm -q
的输出制作一个spec文件,并执行一个“build”,它只是从系统中复制已安装的文件。
您可以在此处找到它:https://github.com/cormander/rogue-beret-tools/blob/master/scripts/rpm-repack
用法示例,重新打包mailx
rpm:
查询:
$ rpm -ql mailx
/bin/mail
/etc/mail.rc
/usr/bin/Mail
/usr/lib/mail.help
/usr/lib/mail.tildehelp
/usr/share/man/man1/Mail.1.gz
/usr/share/man/man1/mail.1.gz
重新包装:
$ ./rpm-repack -p mailx
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.9773
+ umask 022
+ cd /usr/src/redhat/BUILD
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip
+ /usr/lib/rpm/brp-strip-static-archive
+ /usr/lib/rpm/brp-strip-comment-note
Processing files: mailx-8.1.1-44.2.2
Provides: mailx
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.3) libc.so.6(GLIBC_2.3.4) libc.so.6(GLIBC_2.4) rtld(GNU_HASH)
Checking for unpackaged file(s): /usr/lib/rpm/check-files /tmp/tlkN4yrYEi
Wrote: ~/rpmbuild/RPMS/i386/mailx-8.1.1-44.2.2.i386.rpm
查询新构建的包:
$ rpm -qpl ~/rpmbuild/RPMS/i386/mailx-8.1.1-44.2.2.i386.rpm
/bin/mail
/etc/mail.rc
/usr/bin/Mail
/usr/lib/mail.help
/usr/lib/mail.tildehelp
/usr/share/man/man1/Mail.1.gz
/usr/share/man/man1/mail.1.gz
代码并不优雅,但功能齐全。它确实复制了很多rpm信息(来自rpm -qi
和大多数脚本的所有内容),但它并不是全面的。此外,它无法复制GPG签名,也不会与原始RPM文件具有相同的校验和。
注意:这不是构建和分发RPM软件包的“正确”方法,主要用于故障排除和教育目的。