自己构建RPM包
这个原因有点多,优点也不少,下面简单写写
1.官方发布了最新源码包,但是没有发布最新的RPM包,此时想要安装最新的包就只能手动编译安装,如果我们把最新的源码封装成RPM包,那么就可以继续愉快的安装啦
2.统一的安装包管理,在自动化如此火爆的今天,自动部署是一个常见的功能,那么实现自动化部署的话RPM+私有YUM仓库也是一个不错的选择
3.统一的版本管理,自己写了一个程序,每次更新都要全量跑一遍服务器,操作的多了难免会造成线上版本的不一致,那么此时如果把自己写的程序封装成一个rpm包,且做好版本管理,那么升级是一件非常愉悦的事情,yum update 就可以解决
开始之前,先来看2个命令:
打包之前,先分析分析前人是如何打包的,这里直接看红帽封装的httpd吧
查看RPM包信息:
使用yumdownloader可以把一个yum上的rpm包下载到本地而且不安装
[root@localhost rpmbuild]# yumdownloader httpd
[root@localhost rpmbuild]# ls httpd-2.2.15-59.el6.centos.x86_64.rpm
httpd-2.2.15-59.el6.centos.x86_64.rpm
使用rpm -qpi可以查看一个rpm包的打包信息
[root@localhost rpmbuild]# rpm -qpi httpd-2.2.15-59.el6.centos.x86_64.rpm
Name : httpd Relocations: (not relocatable)
Version : 2.2.15 Vendor: CentOS
Release : 59.el6.centos Build Date: 2017年03月22日 星期三 14时53分40秒
Install Date: (not installed) Build Host: c1bm.rdu2.centos.org
Group : System Environment/Daemons Source RPM: httpd-2.2.15-59.el6.centos.src.rpm
Size : 3137746 License: ASL 2.0
Signature : RSA/SHA1, 2017年03月23日 星期四 23时02分13秒, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <My View - CentOS Bug Tracker>
URL : The Apache HTTP Server Project
Summary : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.
[root@localhost rpmbuild]#
使用rpm -qpi --scripts可以查看到一个rpm包中附带的脚本干了什么
[root@localhost rpmbuild]# rpm -qp --scripts httpd-2.2.15-59.el6.centos.x86_64.rpm
preinstall scriptlet (using /bin/sh):
# Add the "apache" user
getent group apache >/dev/null || groupadd -g 48 -r apache
getent passwd apache >/dev/null || \
useradd -r -u 48 -g apache -s /sbin/nologin \
-d /var/www -c "Apache" apache
exit 0
postinstall scriptlet (using /bin/sh):
# Register the httpd service
/sbin/chkconfig --add httpd
/sbin/chkconfig --add htcacheclean
preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ]; then
/sbin/service httpd stop > /dev/null 2>&1
/sbin/chkconfig --del httpd
/sbin/service htcacheclean stop > /dev/null 2>&1
/sbin/chkconfig --del htcacheclean
fi
posttrans scriptlet (using /bin/sh):
test -f /etc/sysconfig/httpd-disable-posttrans || \
/sbin/service httpd condrestart >/dev/null 2>&1 || :
[root@localhost rpmbuild]#
以上的介绍的方式其实只能部分程度的了解这个包的打包方式,如果要完完整整的了解一个包是如何构建的,还是要拿到软件包的srpm才可以。
红帽官方的srpm包的获取方式:http://vault.centos.org/
好啦,说了一堆没用的,下面我们看一下如果封装一个RPM包,我们这里使用的是rpmbuild
首先是安装:
[root@localhost ~]# yum -y install rpm-build
安装完成后,不会主动的生成rpmbuild目录,需要我们自己建立,不过我们可以主动触发个异常让rpmbuild自动帮我们建立了,当然你要是喜欢自己建立也OK?
首先查看一下喽,发现没有哎(这里注意哈,rpmbuild只会在用户家目录下命名为rpmbuild)
[root@localhost ~]# ll rpmbuild
ls: cannot access rpmbuild: No such file or directory
编译一个不存在的spec....
[root@localhost ~]# rpmbuild -ba aaa.spec
error: failed to stat /root/aaa.spec: No such file or directory #没有指路径肯定找不到啦
[root@localhost ~]# ll rpmbuild #出来吧皮皮虾
total 24
drwxr-xr-x 2 root root 4096 Sep 4 14:50 BUILD
drwxr-xr-x 2 root root 4096 Sep 4 14:50 BUILDROOT
drwxr-xr-x 2 root root 4096 Sep 4 14:50 RPMS
drwxr-xr-x 2 root root 4096 Sep 4 14:50 SOURCES
drwxr-xr-x 2 root root 4096 Sep 4 14:50 SPECS
drwxr-xr-x 2 root root 4096 Sep 4 14:50 SRPMS
OK 那么现在编译环境搞定了,我们看看这几个目录是干嘛的
BUILD #说直白点就是将源码解压到这目录了
BUILDROOT #编译环境的 / 目录
RPMS #编译好生产RPM的目录
SOURCES #源码存放的路径
SPECS #spec文件存放的路径,有彩蛋哟
SRPMS #编译好生成SRPM的目录
环境安装完成后,准备编译吧,我们拿nginx开刀吧,这个比较简单
将源码软件复制到SOURCES目录
去nginx官网下载个最新的源码包去,放在SOURCES目录下RPM包rpmbuild SPEC文件深度说明 【装载】去nginx官网下载个最新的源码包去,放在SOURCES目录下
http://nginx.org/download/nginx-1.12.1.tar.gz
[root@localhost ~]# wget http://nginx.org/download/nginx-1.12.1.tar.gz -O /root/rpmbuild/SOURCES/nginx-1.12.1.tar.gz
[root@localhost ~]# ls /root/rpmbuild/SOURCES/
nginx-1.12.1.tar.gz
编辑spec文件,彩蛋来喽,打开后发现已经有默认的模板喽,修改修改就可以了
这里只要使用vim在SPEC目录下建立新的文件并且以.spec结尾就会触发宏
[root@localhost ~]# vim /root/rpmbuild/SPECS/nginx-1.12.1.spec
模板里的参数都是啥???给你找一篇写的倍牛逼的文档,说实话看到这篇文档的时候已经没想法写下去了,他的太全了,不过既然写了就完结吧
http://www.cnblogs.com/schangech/p/5641108.html
先来份spec配置文件吧
Name:nginx
Version:1.12.1
Release:1
Summary:Nginx is a web server software.
Group:Applications/Internet
License:GPL
URL:www.nginx.org
Source0:nginx-1.12.1.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires:gcc pcre-devel zlib-devel
#Requires:
%description
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru: почта, поиск в интернете, новости, игры, VK, and Rambler.
%prep
%setup -q
%build
./configure --prefix=/usr/local/nginx
make %{?_smp_mflags}
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
/*
%doc
#%changelog
执行编译,编译与正常的编译过程一致,如果中途缺少依赖包yum安装即可,然后重新执行rpmbuild
[root@localhost ~]# rpmbuild -ba rpmbuild/SPECS/nginx-1.12.1.spec
[root@localhost ~]# ls /root/rpmbuild/RPMS/x86_64/
nginx-1.12.1-1.x86_64.rpm
编译完成后就可以去RPMS目录下拿rpm包与debuginfo相关的包,去SRPM目录下拿srpm包(srpm包会包含打包相关的所有数据,包含spec文件及相关依赖文件)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具