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卸载掉安装好的文件。
分享到:
相关推荐
描述中提到,下载JDK 8的Linux 64位RPM安装包(jdk-8u172-linux-x64.rpm),然后将其上传到Linux系统中进行安装,操作简单易行。这表明这个RPM包是为64位架构的Linux系统设计的,适用于那些希望在服务器或开发环境中...
通过以上步骤,您已经成功地创建了一个Node.js的RPM安装包。这个包可以在其他支持RPM包管理器的Linux系统上进行安装,大大简化了Node.js的部署过程。此外,您可以根据需要调整spec文件的内容来适应不同的需求或版本...
在给定的压缩包文件中,包含了多个RPM安装包,它们分别对应于不同的字体相关组件: 1. `stix-fonts-1.1.0-5.el7.noarch.rpm`:这是一款名为STIX(Scientific and Technical Information Exchange)的开源字体包,专...
**CentOS Openssh 8.8 RPM安装包详解** OpenSSH是开源的SSH(Secure SHell)套件,用于在不安全的网络上提供安全的远程登录和其他网络服务。它包含许多组件,如sshd服务器、ssh客户端、scp、sftp等。在CentOS系统中...
总结来说,"sqlplus11.2 rpm安装包"是为了在Linux环境中安装和使用Oracle SQLPlus 11.2版的工具,提供了一种便捷的方式来管理Oracle数据库并执行SQL和PL/SQL命令。通过RPM包管理,用户可以轻松地安装、更新和卸载...
针对"openssh-9.3p2 rpm安装包",我们有三个RPM文件: 1. `openssh-clients-9.3p2-1.el6.x86_64.rpm`:这个包包含了OpenSSH的客户端组件,如ssh、scp、sftp等,用于连接到OpenSSH服务器进行安全通信。 2. `openssh...
这两个文件分别对应MySQL 5.7和8.0社区版的RPM安装包,适用于基于RPM的Linux发行版,如CentOS 7。 ### MySQL 5.7 和 8.0 的主要区别 - **MySQL 5.7**:这是MySQL的一个稳定版本,提供了增强的安全性、性能优化和新...
制作RPM安装包的过程涉及多个步骤,包括装包、配置文件说明、打包以及spec文件详解。以下是详细的知识点解析: 1. **装包**: 在Linux系统中,完成RPM安装后,会提供`rpmbuild`工具,用于创建RPM包。`rpmbuild`...
3. **RPM安装包**: RPM(Red Hat Package Manager)是Linux下的软件包管理器,主要用于安装、升级、查询、卸载软件。在CentOS系统中,我们通常使用RPM来管理软件。对于`mkfontscale`和`mkfontdir`这两个命令,如果...
这是在/usr/share/mysql 目录下生成一些 文件,其中有一个文件名为:my-medium.cnf 将其拷贝到/etc/my.cnf中 # cp /usr/share/mysql/my-medium.cnf /etc/my.cnf 现在就安装完了,可以看看他运行的进程: # ps -ef | ...
总的来说,理解和掌握OpenSSL库以及其开发包的使用是构建安全网络服务的关键技能,而离线RPM包的使用则是在没有网络连接时解决依赖问题的有效方法。在实际工作中,根据具体的系统环境和需求,选择合适的OpenSSL版本...
在Linux平台上,MySQL数据库系统的安装通常涉及使用RPM(Red Hat Package Manager)包管理器。RPM是一种广泛使用的软件包管理格式,尤其在基于RPM的Linux发行版中,如Red Hat Enterprise Linux、CentOS和Fedora。本...
Java Development Kit (JDK) 是Java编程语言的核心组件...在Linux系统上,这通常涉及到下载、解压、配置环境变量和验证安装过程。理解JDK的新特性有助于充分利用其优势,而熟练管理多版本JDK则能确保开发工作的灵活性。
在Linux系统中,traceroute是网络管理员和开发者常用的命令行工具,用于识别数据包在网络中的跳跃过程,帮助定位网络延迟或丢包问题。 标题“traceroute安装包”表明这是一个用于在Linux系统中安装traceroute工具的...
标题中的“gcc-c++工具rpm安装包”指的是在Linux系统中用于编译C++程序的GNU Compiler Collection (GCC) 的rpm格式安装包。GCC不仅支持C++,还支持C、Fortran、Ada和Go等多种编程语言,但在这里我们主要关注其C++...
`jdk-8u271-linux-x64.rpm`这个文件包含了Java开发所需的全部组件,包括Java编译器(javac)、Java解释器(java)、Java文档生成器(javadoc)以及其他必要的库和工具。RPM包管理器能够帮助用户轻松地安装这个JDK,...
1. **下载rpm包**:首先,你需要从官方网站或其他可靠的源下载zlib的rpm安装包。 2. **验证签名**:为了确保下载的包没有被篡改,可以检查其数字签名。 3. **安装**:使用`rpm`命令进行安装,例如`sudo rpm -ivh ...
请注意,离线安装可能需要对 Linux 系统管理和软件编译有深入的理解,因为可能需要手动解决依赖关系和配置问题。此外,如果系统已经存在其他版本的依赖,可能需要额外处理冲突。 总的来说,这个离线 RPM 安装包为在...
在这个场景中,我们关注的是JDK 8的RPM安装包,这是一种专为使用Red Hat Package Manager (RPM)的Linux发行版设计的软件包格式。 **一、JDK的组成部分** 1. **Java编译器** (javac):将源代码编译成可执行的字节码...
首先,你需要下载适用于CentOS 7的MySQL 8.0.20 RPM安装包。通常,这些包包括`mysql-community-release-el7-*.noarch.rpm`(这是MySQL的YUM仓库配置文件)和一系列的`.rpm`文件,如`mysql-community-server-*.rpm`、...