如何从已安装的文件构建RPM软件包?


8

有两台机器,SLES的版本/架构相同。

在#A机器上,安装了一个“ foo”软件,我们可以使用来查看rpm -qa

在#B机器上,需要安装“ foo”软件。

foo.rpm从任何来源无法使用,从互联网等

由于该软件包foo.rpm已安装在#A机器上,我们可以foo.rpm根据已经安装的文件在其上构建文件吗?

我认为rpm中也有前置/后置脚本。因此可以安装foo.rpm具有依赖项?)。


您几乎可以从这里找到所有rpm软件包。rpmfind.net/linux/RPM
Ramesh,

Answers:


11

这样做是可能的,但是非常困难,以便正确完成。如果您不顾一切,可以创建一个新的RPM .spec文件并构造一个“伪”源RPM(SRPM)文件,然后可以使用该文件来构建最终的RPM文件rpmbuild --rebuild

我将继续搜索实际的RPM。您没有说明问题中的哪一个,但是根据我的经验,如果您知道如何搜索,就可以在Internet上找到任何内容。我发现Red Hat发行版的RPM的古老版本已经使用了10多年了,所以我很难相信这个RPM的任何地方都没有。

同样,您经常可以返回到RPM中包含的应用程序源,也可以使用它来重构RPM。通常,源应用程序会包含一个.spec用于重建RPM 的必要文件。

最后,您可以.spec从构建服务(例如Koji for Red Hat发行版)中获取源文件和文件。SuSE也维护类似的构建服务,因此您可以搜索这些以获得旧的构建工件。

将二进制文件照原样

您可以使用此方法从一个系统中提取实际的可执行文件,并将其压缩以在另一系统上进行部署。

机器A

$ rpm -ql <packageNameHere> | xargs tar -zcvf /tmp/program.tgz

机器B

$ tar -zxvf /path/to/your/program.tgz

SLES的RPM版本

根据该线程中的帖子之一:Re: rpm据说如何在SLES上创建RPM fron安装的软件包--repackage。这在Red Hat版本(在Fedora或CentOS中)不存在。但是根据帖子,您可以这样使用它:

$ rpm -e --repackage <somepackage>

完成后,您将在此处找到可访问的RPM:

/var/spool/repackage

使用rpmerizor

Rpmerizor是您可以安装的第三方工具/脚本,它将源文件重新打包到相应的RPM中。此脚本的用法可在此处访问,标题为:rpmerizor的手册页

摘抄

Rpmerizor是一个脚本,允许您从已安装的文件创建RPM软件包。您只需在命令行上指定文件,并回答一些交互式问题即可填充rpm元数据(包名称,版本...)。您也可以在批处理模式下将其与元数据的命令行选项一起使用。

使用rpmrebuild

不要与构建工具相混淆rpmbuildrpmrebuild是其他第三方的脚本,你可以用做一个已经安装RPM的重新包装。

摘抄

rpmrebuild是从基本使用中已经安装的软件包中构建RPM文件的工具,rpmrebuild的使用不需要任何rpm构建知识。(在debian上,等效产品是dpkg-repack)。

假设我们要重新包装openssh-server。

$ rpm -aq | grep openssh-server
openssh-server-6.2p2-8.fc19.x86_64

现在打包:

$ rpmrebuild openssh-server-6.2p2-8.fc19.x86_64
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
..?......  c /etc/ssh/sshd_config
..?......  c /etc/sysconfig/sshd
Do you want to continue ? (y/N) y
Do you want to change release number ? (y/N) n
result: /root/rpmbuild/RPMS/x86_64/openssh-server-6.2p2-8.fc19.x86_64.rpm

参考文献


无论如何,它是:jdk-1.6.0_02-fcs.rpm :)它不在“互联网”上
evachristine

您可以从以下网址获取任何版本的JDK的官方RPM:oracle.com/technetwork/java/javase/downloads/…。那将带您到相同版本的1.6u2。
slm

您怎么知道“ jdk-1.6.0_02-fcs.rpm”是“ 1.6u2”?:O
evachristine

1
我找到了!!谢谢!它的名称为:jdk-6u2-linux-i586.rpm谢谢!
伊娃·克里斯汀(Eevachristine),2014年

1
@evachristine-是的,很高兴解决了它。
slm

0

作为一般规则。

幸运的话rpm -qi,您rpm -q --changelog可以深入了解包装的来源。

如果它是在系统上运行的,则您可能仍然拥有用于生成实际rpm的spec文件,如果不是两者都没有。

通常,我不建议您复制文件/二进制文件,但是大多数元信息都在RPM数据库中,并且您拥有实际的文件。

rpm -q --list <pkg_name> 显示软件包部署的所有文件。

rpm -q --scripts <pkg_name> 以显示通过安装(或删除)软件包而执行的所有脚本,就其目的而言,其提供的洞察力至少与要部署的文件一样多。

可以使用找到任何必须安装的依赖项rpm -q --requires <pkg_name>

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.