QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2971|回复: 17

用rpm打包软件,通过了,但不能安装,为什么?

[复制链接]
发表于 2004-6-7 01:03:35 | 显示全部楼层 |阅读模式
我要制作的包只需要把一些的文件复制到安装位置,不编译
操作系统为 redhat linux 9,  rpm版本为RPM version 4.2
我的spec文件如下# vi opt-0.1-1.spec
[code:1]
%define buildroot /var/tmp
Summary: SuperHA for linux
Name: SuperHA
Version: 0.1
Release: 1
Copyright: GPL
Group: Applications/System
Source: opt-0.1.tar.gz
Packager: Bowdar
%description
HA System for linux
%changelog
*Sun Jun 6 2004 Bowdar
-build for the first time
%prep
%build
%install
%files
%defattr (-,root,root)
/opt/superha
/opt/exehasvrd
/opt/ha.pwd
[/code:1]
打包过程中后面几行有以下的提示信息# rpmbuild -ba opt-0.1-1.spec
[code:1]
Processing files: SuperHA-0.1-1
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: libaio.so.1 libaio.so.1(SUNW_0.7) libc.so.1 libc.so.1(SUNW_0.8) libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.1.3) libcrypt.so.1 libcrypt.so.1(GLIBC_2.0) libelf.so.1 libm.so.6 libncurses.so.5 libnsl.so.1 libpthread.so.0 libpthread.so.0(GLIBC_2.0) libpthread.so.0(GLIBC_2.1) libsocket.so.1 libstdc++-libc6.2-2.so.3 libucb.so.1 libucb.so.1(SUNW_0.7)
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp
Wrote: /root/redhat/SRPMS/SuperHA-0.1-1.src.rpm
Wrote: /root/redhat/RPMS/i386/SuperHA-0.1-1.i386.rpm
[/code:1]
安装时提示信息如下# rpm -ivh opt-0.1-1.i386.rpm
[code:1]
error: Failed dependencies:
        libaio.so.1 is needed by SuperHA-0.1-1
        libaio.so.1(SUNW_0.7) is needed by SuperHA-0.1-1
        libc.so.1 is needed by SuperHA-0.1-1
        libc.so.1(SUNW_0.8) is needed by SuperHA-0.1-1
        libsocket.so.1 is needed by SuperHA-0.1-1
        libucb.so.1 is needed by SuperHA-0.1-1
        libucb.so.1(SUNW_0.7) is needed by SuperHA-0.1-1
[/code:1]
发表于 2004-6-7 08:58:26 | 显示全部楼层
因为你的spec少写了安装语句,可在%install下加入下列命令再试试:
mkdir -p $$buildroot/opt
tar zxf %{SOURCE} -C $buildroot/opt
回复

使用道具 举报

 楼主| 发表于 2004-6-7 14:27:31 | 显示全部楼层
我按照你说的添加了, 打包时最后几行提示以下内容:
[code:1]
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.47674
+ umask 022
+ cd /root/redhat/BUILD
+ LANG=C
+ export LANG
+ mkdir -p 2787buildroot/opt
+ tar zxf '%{SOURCE}' -C /opt
tar (child): %{SOURCE}: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error exit delayed from previous errors
error: Bad exit status from /var/tmp/rpm-tmp.47674 (%install)


RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.47674 (%install)
[/code:1]
我很菜,刚做这个,不懂,
添加那两行分别是什么作用?
回复

使用道具 举报

发表于 2004-6-7 16:17:21 | 显示全部楼层
Requires: libaio.so.1 libaio.so.1(SUNW_0.7) libc.so.1 libc.so.1(SUNW_0. libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.1.3) libcrypt.so.1 libcrypt.so.1(GLIBC_2.0) libelf.so.1 libm.so.6 libncurses.so.5 libnsl.so.1 libpthread.so.0 libpthread.so.0(GLIBC_2.0) libpthread.so.0(GLIBC_2.1) libsocket.so.1 libstdc++-libc6.2-2.so.3 libucb.so.1 libucb.so.1(SUNW_0.7)

很明显,你这个rpm包build时rpmbuild自动帮你生成依赖关系,并将这种依赖关系加入到制作出来的rpm包里以便安装时对安装环境做判断,其中的依赖有:libaio.so.1 libaio.so.1(SUNW_0.7) libc.so.1 libc.so.1(SUNW_0.,也就是说,安装者的系统必须有这几个so才能运行你这个程序,而你安装这个rpm包时所出现的依赖缺少报警的原因是,rpm命令安装时会自动在你系统所安装的所有rpm包数据库里搜索这几个so,由于rpm数据库里没有这几个so(估计这几个so是你自己手工编译装上的,而不是rpm包格式安装的,因此rpm包数据里没有你这几个so的信息),因此报警依赖缺少,其实,你用--nodeps参数装上还是可以运行的(因为你的系统里确实有这几个so)

也就是说,你build的这个rpm包是正确的,因为程序确实依赖这几个so来运行,只是可能因为你这几个so是由于非rpm安装的才产生这种安装错误

rpm包数据库里只记录通过rpm方式装上的文件信息,不包括自己手工编译的文件信息
回复

使用道具 举报

 楼主| 发表于 2004-6-7 19:11:27 | 显示全部楼层
llc:
的确是你说的这个原因,我加上--nodep就安装上了,
这么说我的系统里肯定有libaio.so.1等这几个文件了?
难道我以前自己装进去的吗?我以前装oracle8i的时候强行安装了glibc的低版本,是这个原因吗?
那么我应该怎么解决呢?
回复

使用道具 举报

 楼主| 发表于 2004-6-7 20:00:46 | 显示全部楼层
好象不是因为我装了glibc的这个原因,我在另一台机器上也试了还是出现同样的问题
回复

使用道具 举报

 楼主| 发表于 2004-6-7 20:28:02 | 显示全部楼层
我仔细找了一下,是要安装的几个二进制文件需要这个东西,一但我不包含它们就不会有提示了,这种可以解决吗?
或者有没有让打成的rpm包不检查需求,而直接用rpm -ivh 就可以安装的方法?
回复

使用道具 举报

发表于 2004-6-7 23:19:31 | 显示全部楼层
你的rpm包本来就没错,你的程序需要那几个so才能运行
现在只是由于你系统里存在那些so,用--nodeps安装后才能运行,但在别人的机器上用--nodeps强行装上这个rpm的话,别人的机器未必有上面的so,因此rpm -ivh时产生这种警告是很必要的
刚上www.rpmfind.net上搜索了一下,发现下面的rpm包包含了上面的那些so:
red-carpet-1.4.2-1.ximian.2.sparc.rpm,描述是Ximian's next-generation software manager and updater,Ximian Gnome distribs

回忆一下,你是否最近自己从源码包编译安装了类似这样的软件或安装oracle8i时将这些so安装进系统里,结果导致了你系统里安装了这几个so;由于你的rpm包里的二进制文件调用了这些so(可能是某些功能数),因此制作rpm包时自动将这几个so的依赖加入到rpm包信息里
回复

使用道具 举报

发表于 2004-6-8 00:14:33 | 显示全部楼层
每安装和删除一个rpm包,都会更新一个数据库,这个数据库位于/var/lib/rpm目录下(下面称这个数据库为rpm数据库);
这个数据库记录了你安装上的所有的包的相关信息,包括包的各种描述信息(譬如安装进系统的包的名字,用途描述,包里面包括的文件等等),譬如,a.rpm这个包安装时将b这个文件安装到/usb/bin/b,这个信息会记录(/usr/bin/b)进rpm数据库,以后你卸载a这个rpm包时,系统会自动根据数据库里的记录将/usr/bin/b卸载掉,同时去掉数据库里关于a这个包的一切记录。正是由于这个数据库的存在,才让rpm包的安装和卸载变得易于管理。根据这个数据库,你很容易知道你曾经安装过哪些rpm包(rpm -qa |more),安装上的所有包的描述信息(rpm -qia|more),和其中某个包的信息(rpm -qil rpm包名)。

当你要安装一个rpm包时,rpm命令会先读取这个rpm包的依赖文件(rpm包的依赖文件你可以用rpm -qpi --requires XXX.rpm命令查看),然后遍历一遍rpm数据库进行对比,如果读到的依赖文件在rpm数据库里全部有记录存在,也判断依赖关系完全满足而顺利安装,否则,就会出现你说的情况;注意的是,它只会在rpm数据库里进行对比,而不是在实际系统存在的文件里进行对比

譬如这样

A.rpm仅依赖lib.so,而这个lib.so先前已经通过某个叫B.rpm安装到系统里,因此rpm数据库里保留有lib.so的信息,rpm命令就认为你系统里确实存在这个so,即使你将这个lib.so删除掉(非rpm方式卸载)而不存在,安装A.rpm时还是给你通过而不报警,因为它只搜索自己的数据库(你没卸载B这个包,因此数据库里还有lib.so存在的记录);反之,如果这个lib.so你不是通过rpm方式安装上去的(通过手工拷贝或者自己编译源码安装的),那么rpm数据库里没有关于lib.so存在的记录,安装A.rpm时还是会报警,虽然你系统里确实存在lib.so。

你做出来的rpm包里由于里面的二进制文件调用了那几个so,因此build rpm包时自动将那些依赖关系加入了rpm包信息里(这是很有必要的,因为你的包确实需要那些so才能正常运行),而那几个so是由于非rpm方式安装上的,因此在自己机器上安装制作出来的包时会出现依赖缺少的警告,虽然实际上你的系统有那些so文件。

一向表达能力不好,不知道这么说你明不明白  :-)
回复

使用道具 举报

 楼主| 发表于 2004-6-8 08:47:44 | 显示全部楼层
谢谢,我懂了,
虽然表面上看起来容易让人糊涂,但读两遍就知道了,说得很清楚,特佩服你还有论坛上的其它前辈如此乐于助人的精神
回复

使用道具 举报

发表于 2004-6-8 09:58:48 | 显示全部楼层
[quote:dd140b1a79="bowdar"]
或者有没有让打成的rpm包不检查需求,而直接用rpm -ivh 就可以安装的方法?[/quote]

制作包时就不加入依赖信息(就是不检查需求)的方法不清楚有没有(很可能没有),只知道在安装时可以用--nodeps参数可以忽略依赖关系强行安装
回复

使用道具 举报

发表于 2004-6-8 22:21:47 | 显示全部楼层
建议搞两个版本:
提供给ML安装盘的就用不包含依赖包的rpm,
独立发布的就把需要的so都放到rpm中去,安装的时候先安装这些so,同时将spec中相应的依赖信息去掉。
回复

使用道具 举报

发表于 2004-6-8 23:38:45 | 显示全部楼层
spec里如果没指定依赖(譬如楼主的spec),依赖关系是制作包过程中自动加上的,去除不了

把需要的so都放到rpm中也不行,你多打包一个so,它的依赖关系就越多,因为新加入的so必然又依赖其他的so,这样依赖关系只会越来越复杂
回复

使用道具 举报

发表于 2004-6-9 16:00:01 | 显示全部楼层
最好的解决办法就是:只安装 RPM 包…………
回复

使用道具 举报

 楼主| 发表于 2004-6-9 22:34:06 | 显示全部楼层
[quote:097e2ae485="jiangtao9999"]只安装 RPM 包…………[/quote]
这是什么意思?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-26 11:31 , Processed in 0.172241 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表