分享
 
 
 

linux生成RPM安装包的过程及问题解决措施

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

作者:陈明辉

日期:2004-6-8

1 制作前的准备

1.1 学习并掌握的知识

熟悉 bash/ksh script 语法,熟悉grep、 sed、 awk、 install、 ldconfig 等工具的使用, 熟悉 rpm 程序的四大基本功能:install、 upgrade、 query、 verify,linux C 语言编程, Makefile 写作概念,diff、patch 的使用。

1.2 参考资料

1 . linux RPM-HOWTO

2 . linux下制作RPM包关键所在

3 . 精通RPM

2 制作过程

2.1 安装文件、打包、路径设置

将文件放到最终安装目录,包括/opt/superha目录下的四个子目录bin、etc、log、gui和文件/opt/exehasvrd、/opt/ha.pwd;将/opt目录打包成opt-0.1-1.tar.gz用作源代码包(由于本安装包的制作不包含编译源代码,所以源代码包可以任意制作,充数而已)。

将opt-0.1-1.tar.gz拷贝到/usr/src/redhat/SOURCES目录下(根据系统不同这个目录也不同),redhat9在root用户的工作目录是/root/redhat所以同时拷贝一份到/root/redhat/SOURCES,这里可以不在/usr/src/redhat下做任何事情,不过我是在这下面操作的。

2.2 安装包spec文件描述代码编写

在 /usr/src/redhat/SPECS 底下编写 SuperHA-1.0-1.spec,

Summary: HA system for linux

Name: SuperHA

Version: 0.1

Release: 1

Copyright: GPL

Group: Application/System

Source: opt-1.0-1.tgz

Packager: Bowdar

%description

This package is a HA System for RPM building.

%changelog

* Sun Jun 6 2004 Bowdar

- build for the first time.

%prep

%build

%install

%files

/opt/superha

/opt/exehasvrd

/opt/ha.pwd

2.3 打包过程

编写完spec描述文件后就可以开始打包了,确定文件存在的正确性,然后在/usr/src/redhat/SPECS目录下执行rpmbuild –ba SuperHA-1.0-1.spec,顺利的话应该看到以下提示信息

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

至此软件包安装完成,但事实上不会这么顺利,我的几乎所有问题都出现在这里,详见问题及措施。

3 问题及措施

3.1 getOutputForm(): 断开的通道

打包在进行到Checking for unpackeged file(s) /usr/lib/rpm/check-files %{buildroot}时会提示错误getOutputForm(): 断开的通道错误。

这个错误的出现让我手足无搓,参考的文档中并没有提起这种问题的出现,而且不知道出现这个错误的原因,后来在对RPM-HOWTU解决的一篇文章中看到,打包RPM之前需要写一个rpmrc文档,我参照它的内容写后,出现了更多错误,原来早版本的linux才需要这个文档,不过这个文档中的buildroot项给了我提示,于是在spec文档的前面加上一句%define buildroot /var/tmp后,重新建立包,这个错误被解决。

3.2 Requires

打包到最后提示以下警告信息:

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

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

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

那么为什么会出现这个错误呢?每安装和删除一个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数据库里进行对比,而不是在实际系统存在的文件里进行对比。

我仔细检查了每一个二进制文件发现hamond、hasvrd等几个主要的HA系统文件调用了那几个so,因此build rpm包时自动将那些依赖关系加入了rpm包信息里(这是很有必要的,因为这些文件确实需要那些so才能正常运行),而那几个so是由于非rpm方式安装上的,因此在我机器上安装制作出来的包时会出现依赖缺少的警告。

包是打成功了,不过安装的时候会检查系统是否有这些so文件,会提示以下错误而无法安装

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

如果系统里没有这些包,提示这个信息就只有通过加参数 –-nodeps强行安装,但安装后应该不能运行,如果二进制文件需要这些so的话。

(打包过程还遇到了其它很多小问题,一般也能解决,这里就省略了)

4 打包结束

打包最后生成的文件在/root/redhat/RPMS文件夹下生成了SuperHA-0.1-1.i386.rpm,运行rpm –ivh SuperHA-0.1-1.i386(如果提示错误,加上--nodeps)将安装成功,rpm –e SuperHA-0.1卸载掉安装好的文件。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有