RPM
RPM(Red Hat Package Manager)是一种在Linux系统中使用的软件包管理工具。它的主要功能是用于安装、升级、卸载软件包。在Red Hat、CentOS、Fedora等Linux发行版中,RPM是默认的软件包格式。
RPM命令是用于管理RPM包的命令行工具,它可以用来查询、安装、升级和删除RPM包。下面是一些常用的RPM命令:
rpm -qa:列出系统中所有安装的RPM包
rpm -qi package_name:查询指定RPM包的详细信息
rpm -qf file_name:查询指定文件所属的RPM包
rpm -Uvh package_name.rpm:升级指定的RPM包
rpm -e package_name:卸载指定的RPM包
在创建一个RPM包之前,我们需要编写一个spec文件。spec文件是一个包含了RPM包的所有相关信息的文件,包括软件名称、版本号、构建要求、依赖关系、安装目录、执行脚本等。以下是一些spec文件的规则:
Name:指定软件包的名称。
Version:指定软件包的版本号。
Release:指定软件包的发布号,也可以是软件包的修订号。
Summary:简短地描述软件包的功能和作用。
License:指定软件包的许可证。
URL:指定软件包的官方网站。
Source0:指定软件包源代码的位置。
BuildRequires:指定构建软件包所需的软件包。
Requires:指定安装软件包所需的软件包。
%description:用于详细描述软件包的功能和用途。
%prep:指定RPM包的准备工作,如解压缩源代码。
%build:指定构建RPM包的过程,如编译、链接等。
%install:指定安装RPM包的过程,如创建目录、复制文件等。
%check:指定进行软件包测试的过程。
%clean:指定清理构建过程中生成的临时文件和目录。
%files:指定将要打包到RPM包中的文件和目录。
%pre:指定在安装软件包之前需要执行的操作。
%post:指定在安装软件包之后需要执行的操作。
%preun:指定在卸载软件包之前需要执行的操作。
%postun:指定在卸载软件包之后需要执行的操作。
%changelog:指定软件包的变更历史记录。
这些规则提供了RPM包所需的基本信息,可以帮助构建、安装和管理软件包。当编写spec文件时,需要遵循这些规则并根据需要进行自定义,以确保软件包能够正常工作并满足用户的需求。
如何使用rpm发布版本
如果要通过RPM发布软件包版本,通常需要完成以下步骤:
- 创建一个RPM spec文件:spec文件是一个包含了RPM包的所有相关信息的文件,包括软件名称、版本号、构建要求、依赖关系、安装目录、执行脚本等。在创建spec文件时,需要遵循一些规则,并根据软件包的需求进行自定义。
- 准备软件包源代码:将软件包源代码放置在指定的位置,通常是在SPEC文件中的Source0字段中指定的位置。
- 安装构建软件包所需的依赖关系:使用yum或dnf等工具安装软件包构建过程中所需的依赖关系,例如编译器、开发库等。
- 执行构建命令:使用rpmbuild命令执行构建命令,该命令会自动执行spec文件中指定的准备、构建、安装、打包等步骤,并生成RPM包文件。
我们通过具体操作来了解rpm包发布
1、创建RPM构建目录:使用rpmdev-setuptree命令来创建RPM构建目录,该命令会自动创建RPM目录结构,包括SOURCES、SPECS、BUILD、RPMS和SRPMS目录。示例:
sudo yum install rpm-build rpmdevtools
rpmdev-setuptree
将会在用户目录下生成rpmbuild目录
[root@centos-7 rpmbuild]# ls
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
2、准备要打包程序的源码
[root@centos-7 myapp]# ls
Makefile myapp.c myapp.spec
3、编辑makefile
SRCHOME = $(shell pwd)
APPNAME = "myapp"
CC=gcc
CFLAGS=-Wall -Wextra -O2
export VERSION := 1.0
export RPM_TOP_DIR := $(shell rpm -E %{
_topdir})
export RELEASE := 1
all: myapp
myapp: myapp.o
$(CC) $(CFLAGS) -o myapp myapp.o
myapp.o: myapp.c
$(CC) $(CFLAGS) -c myapp.c
rpm:
cp -a -r ${SRCHOME} /tmp/$(APPNAME)-$(VERSION);\
cd /tmp;\
tar zcvf $(RPM_TOP_DIR)/SOURCES/$(APPNAME)-$(VERSION).tar.gz $(APPNAME)-$(VERSION)
rpmbuild -bb --define "VERSION $(VERSION)" --define "RELEASE $(RELEASE)" $(APPNAME).spec
rpmclean:
rm -rf ${RPM_TOP_DIR}/BUILD/$(APPNAME)-$(VERSION)
rm -rf ${RPM_TOP_DIR}/SOURCES/$(APPNAME)-$(VERSION).tar.gz
rm -rf /tmp/$(APPNAME)-$(VERSION)
clean:
rm -f myapp myapp.o
makefile中rpm命令来完成打包工作,其中先将源码压缩放入rpm目录中,然后通过rpmbuild命令来完成打包工作
4、编辑spec文件
在rpmbuild命令中需要指定spec文件来完成打包工作,sepc中具体的描述了打包过程的具体内容
Name: myapp
Version: %{
VERSION}
Release: %{
RELEASE}_%{
?dist}
Summary: a simple rpm example
Group: York·Zhang
License: GPLv3+
Packager: Developer York·Zhang
Vendor: zy
Source0: %{
name}-%{
version}.tar.gz
%description
a simple rpm example
%define debug_package %{
nil}
%prep
%setup -q -n %{
name}-%{
version}
%build
%{
__make} all
%install
install -D %{
name} ${RPM_BUILD_ROOT}/usr/bin/%{
name}
exit 0
%make_install
%files
/usr/bin/%{
name}
%defattr(644,root,root,-)
%changelog
sepc中使用了makefile定义的环境变量来指定rpm的版本信息,以及其他rpm包的信息,这些信息在软件安装后可以通过命令rpm -qi myapp查看,另外,%build指定通过make命令来编译源码,这需要我们写好makefile文件,%install会将编译生成的myapp安装到/usr/bin路径下,在这里如果程序有其他的文件,比如配置文件都可以安装到相应路径下,另外spec的其他规则可以帮助我们完成更多的共组,比如我们如果想在安装前完成一些工作可以把他们放在%pre下,例如备份配置文件,停止依赖的其他服务等等
5、make rpm
使用make rpm生成rpm包,生成的rpm包如下:
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd myapp-1.0
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/myapp-1.0-1_.el7.x86_64
+ exit 0
[root@centos-7 myapp]# ls /root/rpmbuild/
BUILD/ BUILDROOT/ RPMS/ SOURCES/ SPECS/ SRPMS/
[root@centos-7 myapp]# ls /root/rpmbuild/RPMS/x86_64/myapp-1.0-1_.el7.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/myapp-1.0-1_.el7.x86_64.rpm
[root@centos-7 myapp]#
6、安装
[root@centos-7 myapp]# rpm -ivh /root/rpmbuild/RPMS/x86_64/myapp-1.0-1_.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:myapp-1.0-1_.el7 ################################# [100%]
[root@centos-7-yu myapp]#
查看软件安装信息
[root@centos-7-yu myapp]# rpm -qi
rpm: no arguments given for query
[root@centos-7-yu myapp]# rpm -qi myapp
Name : myapp
Version : 1.0
Release : 1_.el7
Architecture: x86_64
Install Date: Thu 09 Mar 2023 04:14:06 PM CST
Group : York·Zhang
Size : 8360
License : GPLv3+
Signature : (none)
Source RPM : myapp-1.0-1_.el7.src.rpm
Build Date : Thu 09 Mar 2023 04:12:25 PM CST
Build Host : CentOS-7-YU.ZHANG1
Relocations : (not relocatable)
Packager : Developer York·Zhang
Vendor : zy
Summary : a simple rpm example
Description :
a simple rpm example
[root@centos-7-yu myapp]#
这样我们就完成了rpm版本发布和安装