`
zhanghw0917
  • 浏览: 182524 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

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

作者:陈明辉

日期: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卸载掉安装好的文件。
分享到:
评论

相关推荐

    制作nodejs的linux安装包

    制作nodejs的linux安装包(rpm、run、bin)

    linux下mysql的rpm安装包

    这是在/usr/share/mysql 目录下生成一些 文件,其中有一个文件名为:my-medium.cnf 将其拷贝到/etc/my.cnf中 # cp /usr/share/mysql/my-medium.cnf /etc/my.cnf 现在就安装完了,可以看看他运行的进程: # ps -ef | ...

    linux 二维码 python 安装包 源码

    文件夹包含了用python生成二维码的库,需要安装一下,同时还有简单的源码生成二维码!

    《Linux实用教程》电子教案

    Linux实用教程是由刘兵、吴煜煌等编著的介绍Red Hat Linux操作系统。第一部分是Red Hat Linux操作...第三部分是如何在Red Hat Linux进行程序设计,包括一个程序的编辑、编译、调试、生成RPM安装包的整个过程。

    linux实用教程

    第三部分是如何在Red Hat Linux进行程序设计,包括一个程序的编辑、编译、调试、生成RPM安装包的整个过程。本书使用Red Hat 9.0版本为例来描述。 本书适合高等学校计算机专业及计算机网络专业的学生使用。也...

    Linux操作系统实用教程

    本书从三个方面来介绍Red Hat Linux操作系统。...第三部分是如何在Red Hat Linux进行程序设计,包括一个程序的编辑、编译、调试、生成RPM安装包的整个过程。本书使用Red Hat 9.0版本为例来描述。

    宋广华LINUX操作系统相关PPT

    从三个方面来介绍Red Hat Linux操作系统。...第三部分是如何在Red Hat Linux进行程序设计,包括一个程序的编辑、编译、调试、生成RPM安装包的整个过程。本书使用Red Hat 9.0版本为例来描述。

    浙大Linux视频教程配套课件

    第三部分是如何在Red Hat Linux进行程序设计,包括一个程序的编辑、编译、调试、生成RPM安装包的整个过程。本书使用Red Hat 9.0版本为例来描述。 本书适合高等学校计算机专业及计算机网络专业的学生使用。也可...

    gcc 8.5 rpm 离线安装依赖包

    解压后,在解压目录 rpm -ivh ./* --force --nodeps 即可

    mysql5.7.19安装包64位rpm格式

    3、上传mysql-5.7.18-1.el6.x86_64.rpm-bundle.tar到linux服务器,并解压tar包 复制代码 [root@iZwz94qazh62gk5ewl4ei2Z home]# mkdir mysql [root@iZwz94qazh62gk5ewl4ei2Z home]# tar -xf mysql-5.7.19-1.el6.x86_...

    Linux服务器配置与管理:软件包管理与服务进程.pptx

    【知识目标】 了解:Linux服务的概念 掌握:rpm软件包的命名格式 ...作用:对RPM格式的软件包进行安装、查询、更新升级、校验、卸载以及生成.rpm格式的软件包等 RPM功能通过rpm命令使用不同参数来实现。

    Gobisoft:Linux的软件安装生成器-开源

    Gobisoft是用于Linux应用程序的安装软件包生成器工具,它可以构建应用程序的自安装软件包。 Gobisoft允许制作软件包来分发您的应用程序。 该软件提供了许多可能性,例如在安装之前和之后执行命令。 Gobisoft不会生成...

    Linux命令笔记

    17:ln 生成连接文件 语法:ln -s[原件名][目标文件] 常用命令/文件搜索 1:find 文件搜索 语法:find [搜索范围][比配条件] 2:locate 在文件资料库中查找文件 语法:locate 文件名 3:which 搜索命令所在目录级别名...

    InstallBuilder试用版:支持各种平台的安装程序制作软件,能帮助用户创建跨平台的桌面软件以及系统软件的安装包

    试用版(企业版) InstallBuilder ...除此之外,InstallBuilder还能帮助生成RPM包、Debian包以及多平台的CD或DVD。一旦软件用户安装了您的软件,InstallBuilder的自动更新特性将使得将软件的更新发送至客户变的非常便捷。

    InstallShield2010 (汉化破解+教程)

    Installshield 2010破解版支持用户在制作安装包的过程中修改Autoexec.bat、config.sys、注册表以及加入产品的相应注册码,同时在制作安装包的过程中还可以自动生成反安装程序。Installshield 2010破解版支持目前所有...

Global site tag (gtag.js) - Google Analytics