- 软件管理
- 程序包的来源
- 更换yum 源示例
- 第一种:源码包安装:
- 第二种:RPM安装
- 概述
- Grammar
- Option
- 参数
- Living Example
- 正常安装rpm软件包:
- 强制安装包:rpm -ivh --force 软件包名 (建议不要强制安装)
- 安装源码的.src.rpm软件包 (2种方法)
- 卸载:rpm -e 软件名
- 更新:rpm -Uvh 软件包名字
- 查询系统已安装的rpm包:rpm -qa 软件包名
- 查看系统未安装的软件包:
- 获取关于一个已安装软件包的相关信息?:rpm -qi 包名
- 获取关于一个未安装软件包的相关信息?rpm -qip 包名
- 获取rpm包软件所在的位置和有那些文件?rpm -ql
- 如何不安装但是获取rpm包中的文件
- 查看软件的配置文件
- 查看软件的帮助文档在哪?rpm -qd 文件名
- 如何查询一个可执行文件属于哪个rpm包(很重要)
- 如何查询一个文件属于哪个rpm包(很重要)
- 如何查询一个库文件属于哪个rpm包
- 导入公钥查看数字签名:
- 验证安装包的数字签名:rpm -V 软件名字
- 实际中,删除rpm命令,后恢复
- 第三种:yum安装
- rsync同步中科大的rpm包
- reposync同步yum源
- 制定企业级yum仓库
- 利用rpm-build制定rpm包
- 利用fpm制定rpm包
- centos-release-scl 多版本软件共存
软件管理
软件安装的方式:源码、RPM、SRPM、yum
程序包的来源
参考:
https://www.jianshu.com/p/9ae2253ad878
https://cloud.tencent.com/developer/article/1171376
站点版
(一)、企业站
搜狐:http://mirrors.sohu.com/
有php、mysql、nginx、Python
网易:http://mirrors.163.com/
有MySQL、nginx、mongodb、ceph、kali-images、maven
华为:https://mirrors.huaweicloud.com/home
有jdk、npm
https://repo.huaweicloud.com/java/jdk/8u172-b11/jdk-8u172-linux-x64.tar.gz
阿里云:
http://mirrors.aliyun.com/
https://developer.aliyun.com/mirror
https://mirrors.aliyun.com/centos-vault/ #目前centos6不在维护,所以用这个地址替换base url就可以成功下载包了
https://developer.aliyun.com/mirror/centos
http://pub.mirrors.aliyun.com/epel/7/x86_64/Packages/
ius: https://repo.ius.io/
淘宝:http://npm.taobao.org/
腾讯:http://android-mirror.bugly.qq.com:8080/(仅针对APP开发的软件,限流,不推荐)
(二)、教育站
上海交通大学:http://ftp.sjtu.edu.cn/html/resources.xml(部分移动运营商出口状况不佳,无法访问)
华中科技大学:http://mirror.hust.edu.cn/(当前已用容量估计:4.83T)
清华大学:http://mirrors.tuna.tsinghua.edu.cn/(当前已用容量估计:9.8T)
北京理工大学:http://mirror.bit.edu.cn/web/
中国科技大学:http://mirrors.ustc.edu.cn/(当前已用容量估计:21.32T)
兰州大学:http://mirror.lzu.edu.cn/
大连东软信息学院:http://mirrors.neusoft.edu.cn/(当前已用容量估计:2.5T)
东北大学:http://mirror.neu.edu.cn/
大连理工大学:http://mirror.dlut.edu.cn/
哈尔滨工业大学:http://run.hit.edu.cn/html/(部分联通运营商出口状况不佳,无法访问)
北京交通大学:http://mirror.bjtu.edu.cn/cn/
天津大学:http://mirror.tju.edu.cn(无法访问,ping超时)
中国地质大学:http://mirrors.cug.edu.cn/(当前已用容量估计:2.3T)
浙江大学:http://mirrors.zju.edu.cn/
厦门大学:http://mirrors.xmu.edu.cn/
中山大学:http://mirror.sysu.edu.cn/
重庆大学:http://mirrors.cqu.edu.cn/(当前已用容量估计:3.93T)
北京化工大学:http://ubuntu.buct.edu.cn/(Android SDK镜像仅供校内使用,当前已用容量估计:1.72T)
南阳理工学院:http://mirror.nyist.edu.cn/
中国科学院:http://www.opencas.org/mirrors/
电子科技大学:http://ubuntu.uestc.edu.cn/(无法访问,ping超时)
电子科技大学星辰工作室:http://mirrors.stuhome.net/(当前已用容量估计:1.08T)
西北农林科技大学:http://mirrors.nwsuaf.edu.cn/(只做CentOS镜像,当前已用容量估计:140GB)
浙江大学:http://mirrors.zju.edu.cn/
台湾淡江大学: http://ftp.tku.edu.tw/Linux/
(三)、其他
首都在线科技股份有限公司(英文名Capital Online Data Service):http://mirrors.yun-idc.com/
中国电信天翼云:http://mirrors.ctyun.cn/
noc.im:http://mirrors.noc.im/(当前已用容量估计:3.74T)
常州贝特康姆软件技术有限公司:http://centos.bitcomm.cn/(只做CentOS镜像,当前已用容量估计:140GB)
公云PubYun(母公司为贝特康姆):http://mirrors.pubyun.com/
Linux运维派:http://mirrors.skyshe.cn/(使用阿里云服务器,界面使用浙江大学的模板,首页维护,内容可访问)
中国互联网络信息中心:http://mirrors.cnnic.cn/(只做Apache镜像,当前已用容量估计:120GB)
Fayea工作室:http://apache.fayea.com/(只做Apache镜像,当前已用容量估计:120GB)
开源中国社区 http://mirrors.oss.org.cn/
软件版
(一)、操作系统类
1.Ubuntu
阿里云:http://mirrors.aliyun.com/ubuntu-releases/
网易:http://mirrors.163.com/ubuntu-releases/
搜狐:http://mirrors.sohu.com/ubuntu-releases/(搜狐在12年之后似乎不同步了)
首都在线科技股份有限公司:http://mirrors.yun-idc.com/ubuntu-releases/
2.CentOS
网易:http://mirrors.163.com/centos/
搜狐:http://mirrors.sohu.com/centos/
阿里云:http://mirrors.aliyun.com/centos/
北京理工:https://mirror.bit.edu.cn/centos/
3、kali
网易:http://mirrors.163.com/kali-images/
(二)、web服务类
1.Apache
清华大学:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/
北京理工大学:http://mirror.bit.edu.cn/apache/
中国互联网络信息中心:http://mirrors.cnnic.cn/apache/
华中科技大学:http://mirrors.hust.edu.cn/apache/
TOMCAT全版本:https://archive.apache.org/dist/tomcat/
2.MySQL
北京理工大学:http://mirror.bit.edu.cn/mysql/downloads/MySQL-5.7/
中国电信天翼云:http://mirrors.ctyun.cn/Mysql/
搜狐镜像源:http://mirrors.sohu.com/mysql/
网易镜像源: http://mirrors.163.com/
3.PostgreSQL
浙江大学:http://mirrors.zju.edu.cn/postgresql/
4.MariaDB
中国电信天翼云:http://mirrors.ctyun.cn/MariaDB/
5.VideoLAN
大连东软信息学院:http://mirrors.neusoft.edu.cn/videolan/
中国科技大学:http://mirrors.ustc.edu.cn/videolan-ftp/
6、php
php全版本: https://secure.php.net/releases/
搜狐: http://mirrors.sohu.com/
原文链接:https://blog.csdn.net/weixin_41004350/java/article/details/80479051
# 安装php的源
$ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
# 安装php已经会用到扩展
$ yum install -y php70w-devel php70w-pear php70w-pecl php70w-gd php70w-opcache php70w-cli php70w-pdo php70w-process php70w-pecl-apcu php70w-mcrypt php70w-mysql php70w-fpm php70w-pecl-memcached php70w-common php70w-xml php70w-mbstring php70w-pecl-igbinary
7、mongodb
网易: http://mirrors.163.com/
(三)、开发工具类
1.Eclipse
中国科技大学:http://mirrors.ustc.edu.cn/eclipse/
中国科学院:http://mirrors.opencas.cn/eclipse/
东北大学:http://ftp.neu.edu.cn/mirrors/eclipse/,http://mirror.neu.edu.cn/eclipse/
2.Android SDK
中国科学院:http://mirrors.opencas.ac.cn/android/repository/
南洋理工学院:http://mirror.nyist.edu.cn/android/repository/
中国科学院:http://mirrors.opencas.cn/android/repository/
腾讯:http://android-mirror.bugly.qq.com:8080/android/repository/(限流,不推荐)
大连东软信息学院:http://mirrors.neusoft.edu.cn/android/repository/(同步效果不如中科院的镜像,不推荐)
3.Xcode
腾讯:http://android-mirror.bugly.qq.com:8080/Xcode/(从7.2之后不再更新,建议直接从官网下载)
(四)、容器
lxc国内镜像源: https://mirrors.tuna.tsinghua.edu.cn/lxc-images/
官方镜像列表状态地址
CentOS:http://mirror-status.centos.org/#cn
Archlinux:https://www.archlinux.org/mirrors/status/
Ubuntu:https://launchpad.net/ubuntu/+cdmirrors
Debian:http://mirror.debian.org/status.html
Fedora Linux/Fedora EPEL:https://admin.fedoraproject.org/mirrormanager/mirrors
Apache:http://www.apache.org/mirrors/#cn
Cygwin:https://www.cygwin.com/mirrors.html
三方:
http://rpmfind.net
https://sourceforge.net
https://pkgs.org/
http://rpm.pbone.net
https://packagecloud.io/prometheus-rpm/release
https://packagecloud.io/rabbitmq/
https://www.findbestopensource.com/home #开源项目汇集
更换yum 源示例
网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常的不错。
将yum源设置为163 yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到。
安装步骤
首先备份/etc/yum.repos.d/CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载对应版本 repo 文件, 放入 /etc/yum.repos.d/ (操作前请做好相应备份)
-
CentOS6 :http://mirrors.163.com/.help/CentOS6-Base-163.repo
-
CentOS7 :http://mirrors.163.com/.help/CentOS7-Base-163.repo
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
mv CentOS6-Base-163.repo CentOS-Base.repo
运行以下命令生成缓存
yum clean all
yum makecache
第一种:源码包安装:
一般格式:httpd-2.4.37.tar.gz
官网:https://httpd.apache.org/
以httpd服务为例
首先必须安装相关联的组包:
yum -y groupinstall "Development Tools"
yum groupinstall "Server Platform Development" -y
yum install apr apr-devel apr-util apr-util-devel gcc pcre-devel zlib zlib-devel openssl-devel -y
解压源码包:(建议所有软件都安装在/usr/local目录下)
安装的位置由自己决定(这里以/usr/local)
httpd需要有这三个包,才能完成(apr、apr-util、httpd)
首先创建这3个包的安装目录,并把源码包分别放在对应目录下,(其实可以不用创建目录,安装时会自动生成)
mkdir -pv /usr/local/apr
mkdir -pv /usr/local/apr-util
mkdir -pv /usr/local/httpd
然后分别进行解压这3个包(步骤略)
tar zxvf 文件名 (这里需要根据源码包的类型解压)
进入解压后的源码包所在的目录进行安装:
如果软件包里面有makefile文件,就可以直接进行安装:
执行 make –j 4 && make install 命令(意思就是先执行make,成功过后再执行make install)
说明:-j 4 使用4进程同时编译,提升编译速度或者使用4核CPU同时编译;这里的4是计算机的内核是4,如果你的内核是2,就-j 2
[root@localhost ~]# lscpu #查看
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
如果软件包里面没有makefile文件,就运行configure脚本,然后执行make && make install 命令:
对apr的源码包进行编译和安装:
# cd /usr/local/apr/apr-1.6.5
# ./configure --prefix=/usr/local/apr
安装:
# make && make install
对apr-util的源码包进行编译和安装:
# cd /usr/local/apr-util/apr-util-1.6.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
安装:
# make && make install
在这里如果报错,就是依赖关系问题,很简单,执行下面这一条命令
解决依赖关系:
# yum -y install expat-devel
一般是缺少这个expat-devel库
然后在进行安装apr-util
对httpd的源码包进行编译和安装:
# cd /usr/local/httpd/httpd-2.4.38
#./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --sysconfdir=/etc/httpd --with-pcre --enable-rewrite --with-included-apr --enable-so
httpd安装的位置,关联的apr位置,关联apt-util的位置,配置文件的位置
./configure \
--prefix=/usr/local/httpd-2.4 \
--sysconfdir=/etc/httpd \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--enable-auth-digest \
--with-pcre \
--with-included-apr \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-modules=most \
--enable-so \
--enable-rewrite \
--with-mpm=worker \
--enable-cgi
参数解释:
--prefix=/application/apache2.4.38 \ #指定安装路径;最后把版本号带上,然后做软连接
--enable-deflate \ #激活压缩
--enable-expires \ #激活到期时间
--enable-headers \ #激活头部控制
--enable-modules=most \ #激活大部分模块
--enable-so \ #支持动态共享模块(即打开DSO支持)激活dso
--enable-rewrite \ #激活URL重写
--with-mpm=worker #指定工作模式(Apache3种工作模式)
--enable-charset-lite \
--enable-cgi:启用cgi
--enable-cgid:MPM使用的是event或worker要启用cgid
--enable-mpms-shared=all: 启用MPM所有支持的模式,这样event、worker、prefork就会以模块化的方式安装,要用哪个就在 httpd.conf 里配置就好了。
--with-mpm=event: 指定启用的mpm模式,默认使用enevt模式,在apache的早期版本2.0默认prefork,2.2版本是worker,2.4版本是event.
--enable-modules=most: 明确指明要静态编译到httpd二进制文件的模块,<MODULE-LIST>为空格分隔的模块名列表、all或者most,all表示包含所有模块,most表示包含大部分常用模块
如果编译时就出现了如下错误:
那么就把解压的apr与apr-util分别copy到http的解压文件里面的该目录下/httpd-2.4.33/srclib
然后在安装:
make && makeinstall
在这里如果出现如下错误:
configure: error: Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/.
网上搜索的解决方法虽正确,网址却是打不开;于是,去apache官网找:
进官网:www.apache.org --> download --> HTTP 模块下找个比较快的网址 (如:http://apache.fayea.com/) --> 找到apr --> 选择bz2或者gz的版本的apr和apr-util,复制链接,下载到/usr/local/src目录下面。下面是下载的参数,如果出现网址错误,请去官网按照上面的方法下载:
# cd /usr/local/src<br># wget http://apache.fayea.com/apr/apr-1.5.2.tar.bz2
# wget http://apache.fayea.com/apr/apr-util-1.5.4.tar.bz2
# tar -jxvf apr-util-1.5.4.tar.bz2
# tar -jxvf apr-1.5.2.tar.bz2
将解压的库文件夹移动到httpd子目录srclib里(去掉版本号):
# cp -rf apr-1.5.2 /usr/local/src/httpd-2.4.18/srclib/apr //将版本号去掉,下同
# cp -rf apr-util-1.5.4 /usr/local/src/httpd-2.4.18/srclib/apr-util
(这里去掉版本号就是apr-1.5.2apr)
完成上面操作,然后在执行编译httpd,就不会报错了。
然后在./configure编译:
# make && make install
最后安装成功的界面:
编译安装完成后,为了更有效的安排文件路径,则必须自行进行定义一系列参数
-A、做一个链接指定到/usr/local/httpd(目的是为了以后软件升级后,再次导入这系列参数,而是只需要把新版本链接到/usr/local/httpd):
#ln -sv /usr/local/httpd-2.4/ /usr/local/httpd
‘/usr/local/httpd-2.4’ -> ‘/usr/local/httpd /’
A、导出man手册
# vim /etc/man.config /etc/man_db.conf #添加帮助文档的位置、7版本
添加:
MANPATH /usr/local/httpd/man
# man httpd
B、导出库文件及头文件以及修改权限路径:
# ln -sv /usr/local/httpd/lib/ /usr/lib64/
#ln -sv /usr/local/httpd/include/ /usr/include/httpd
C、 导出二进制程序到当前shell的环境变量中:
# vim /etc/profile.d/httpd.sh 或者写在/etc/profile
添加:
export PATH=$PATH:/usr/local/httpd/bin
# source /etc/profile.d/httpd.sh
# httpd -f /etc/httpd/httpd.conf -M (安装了哪些模块)
#apachectl -k start (启动服务)
httpd –V:查看Apache的工作模式,另外使用httpd -l 也可以查看到
D、写一个相关链的启动脚本,用于程序启动(或者直接复制启动脚本):
第一种:#cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd (不管6或者7复制过去都必须加这两项)
将httpd交给systemctl接管:
[root@ apache]# vim /etc/init.d/httpd (在#!/bin/sh下面添加这两项)
#!/bin/sh
#chkconfig: 345 85 15
#description: apache 2.4.38
[root@ apache]# chkconfig --add httpd #添加httpd
[root@ apache]# chkconfig httpd on #设置开机启动
[root@ apache]# systemctl status httpd #测试
第二种:
# vim /etc/rc.d/init.d/httpd
#!/bin/bash
# chkconfig: - 85 15
# description: Apache is a Web server
# 以上这3项必须有
# author: gobgm
# version: v1.01
#这个路径必须对
APA=/usr/local/apache/bin/apachectl
#端口不一定是80
NET=$(netstat -antpu | grep :80)
start(){
if [ -n "$NET" ];then
echo " Apache server is running"
return 88
else
echo -en "\e[0;32m Starting Apache \e[0m......\t\t\t"
$APA start
echo -e "\e[0;32m[OK]\e[0m"
fi
}
stop(){
if [ -z "$NET" ];then
echo "Apache server is stopped"
else
echo -en "\e[0;32m Stopping Apache \e[0m......\t\t\t"
$APA stop
echo -e "\e[0;32m[OK]\e[0m"
fi
}
status(){
if [ -n "$NET" ];then
echo -e "\e[0;32m Apache server is running\e[0m......\t\e[0;32m[OK]\e[0m"
else
echo -e "\e[0;32m Apacheserver is stopped \e[0m......\t\e[0;32m[OK]\e[0m"
fi
}
restart(){
echo -en "\e[0;32m Restarting Apache \e[0m......\t\t\t"
$APA start &> /dev/null
echo -e "\e[0;32m[OK]\e[0m"
}
case $1 in
"start")
start;;
"stop")
stop;;
"status")
status;;
"restart")
restart;;
*)
echo " start | stop | status | restart "
esac
然后修改权限:
E、添加用户apache,并修改httpd以apache用户启动
useradd -s /sbin/nologin -M -r apache
#chown -R apache.apache httpd/ (修改属主、属组)
修改用户和ServerName:
vim /etc/httpd/httpd.conf
User apache
Group apache
ServerName 192.168.2.198
F、最后一步加入系统服务:
# chkconfig --add httpd
# chkconfig httpd on
# chmod --reference=/etc/init.d/iptables /etc/init.d/httpd
# service httpd restart
vim /usr/local/httpd/htdocs/index.html #web文件存放所在的位置)
make clean #清除之前编译的内容
make uninstall #卸载
httpd命令详解
# httpd -f /etc/httpd/httpd.conf -M (安装了哪些模块)
#apachectl -k start (启动服务)
httpd –V:查看Apache的工作模式,另外使用httpd -l 也可以查看到
# ./apachectl -h 或者:# ./httpd -h
Usage: /usr/local/atstar/apache2/bin/httpd [-D name] [-d directory] [-f file]
[-C "directive"] [-c "directive"]
[-k start|restart|graceful|graceful-stop|stop]
[-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S]
Options:
-D name : define a name for use in <IfDefine name> directives
-d directory : specify an alternate initial ServerRoot
-f file : specify an alternate ServerConfigFile #指定配置文件
-C "directive" : process directive before reading config files
-c "directive" : process directive after reading config files
-e level : show startup errors of level (see LogLevel)
-E file : log startup errors to file
-v : show version number
-V : show compile settings
-h : list available command line options (this page)
-l : list compiled in modules
-L : list available configuration directives
-t -D DUMP_VHOSTS : show parsed settings (currently only vhost settings)
-S : a synonym for -t -D DUMP_VHOSTS
-t -D DUMP_MODULES : show all loaded modules
-M : a synonym for -t -D DUMP_MODULES
-t : run syntax check for config files #查看语法
-T : start without DocumentRoot(s) check
第二种:RPM安装
一般格式->文件名字.rpm 用rpm安装无法指定到那个位置,已经安装在默认路径
概述
rpm命令是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。
Grammar
rpm(Option)(参数)
Option
--test只进行测试
--force忽略软件包及文件的冲突
--excludedocs不安装软件包中的文件
--includedocs安装文件
--replacepkgs强制重新安装已经安装的软件包
--replacefiles替换属于其他软件包的文件
--percent以百分比的形式输出安装的进度
--noscripts不运行预安装和后安装脚本
--ignorearch不校验软件包的结构
--ignoreos不检查软件包运行的操作系统
--nodeps不检查依赖性关系
--ftpproxy HOST用HOST作为FTP代理
--ftpport HOST指定FTP的埠号为HOST
-i:<套件档>或--install<套件档>:安装指定的套件档或者显示套件的相关信息
-v:显示指令执行过程;
-h或--hash:显示进度条;
-l:显示套件的文件列表;
-c:只列出组态配置文件,本参数需配合\"-l\"参数使用;
-a:查询所有套件;
-e<套件档>或--erase<套件档>:删除指定的套件;
-q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
-p<套件档>+:查询指定的RPM套件档;
-f<文件>+:查询拥有指定文件的套件;
-U<套件档>或--upgrade<套件档>:升级指定的套件档;
-R:显示套件的依赖信息;
--test:测试安装,并检查是否会被提示存在依赖关系和冲突关系等等。
--builddb:程序包数据的维护
--nodeps:操作程序包时,不考虑依赖关系
--allmatches:卸载所有匹配指定名称的程序包的各个版本
--force:强制安装
--oldpackage: 此选项允许安装一个版本比当前已安装版本更低的包。通常情况下,rpm 只会安装比当前版本新的包,而 此选项允许降级安装,即安装一个旧版本的包。
-d:只列出文本文件,本参数需配合"-l"参数使用;
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
-s:显示文件状态,本参数需配合"-l"参数使用;
-v|-vv:详细显示指令执行过程,便于排错。
--justdb:更新数据库,当不变动任何文件。
--scripts:查看rpm包中的脚本。rpm -qp --scripts /opt/nginx-1.12.2-1.x86_64.rpm
常用选项组合:
rpm -qa
rpm -ivh
rpm -e
rpm -qf
参数
软件包:指定要操纵的rpm软件包。
Living Example
zsh-4.3.11-4.el6.centos.2.x86_64.rpm
PackageName-主版本号.次版本号-修改次数.Arch.系统平台构架
Name-Version-release.arch.rpm
rpm包的格式为:
name-version-release.arch.rmp
name:就是软件包的名字
version:软件包的版本号,一般由三位组成,分别为主版本号-次版本号-修正号。
release:发行号
arch:支持的硬件平台,一般有:
i386:支持几乎所有的x86的CPU平台
i586:如P-I MMX CPU及AMD的K5,K6系列等。
i686:P-II以后的Intel系列
X86_64:支持64位的cpu,如Intel core2以上及AMD的Athlon64以后的cpu
noarch:表示没有硬件平台的限制
function:
libs:库文件包
utils:工具包
devel:开发包
tools:工具包
ldconfig几个需要注意的地方:
-
往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到。
-
想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到。
-
比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在程序运行时被找到。
-
如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。
-
ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。
-
总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。
-
再有,诸如libdb-4.3.so文件头中是会含有库名相关的信息的(即含"libdb-4.3.so",可用strings命令察看),因此仅通过修改文件名以冒充某已被识别的库(如libdb-4.8.so)是行不通的。为此可在编译库的Makefile中直接修改配置信息,指定特别的库名。
这个目录里面的内容很重要,如果丢失系统就不知道你装了哪些rpm,卸载等就无法完成,建议定期备份一下。
正常安装rpm软件包:
rpm -ivh your-package.rpm (i:表示install安装,v:表示安装过程,h:进度条)
your-package.rpm 是你要安装的rpm包的文件名,一般置于当前目录下。
强制安装包:rpm -ivh --force 软件包名 (建议不要强制安装)
安装过程中可能出现下面的警告或者提示:
... conflict with ...
可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用rpm --force -i强制安装即可
... is needed by ...
... is not installed ...
此包需要的一些软件你没有安装可以用rpm --nodeps -i来忽略此信息,
也就是说rpm -i --force --nodeps可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。
rpm 强制更新安装
rpm -ivh --replacefiles --force --nodeps *.rpm
安装源码的.src.rpm软件包 (2种方法)
#rpmbuild
-bp 只作准备 (解压与打补丁)
-bc 准备并编译
-bi 编译并安装
-bl 检验文件是否齐全
-ba 编译后做成*.rpm和src.rpm
-bb 编译后做成*.rpm
-bs 只做成*.src.rpm
-tc -ti -ta -tb -ts 的功能类似,只是所需参数由spec文件变成tar包。
有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法:(建议直接第二种)
方法一:
rpm -i your-package.src.rpm
cd /root/rpmbuild/SPECS # 一般会在家目录生成rpmbuild包,里面有两个目录。分别是SOURCES、SPECS ;SOURCES里面放了源码。
# tree rpmbuild/
rpmbuild/
├── SOURCES
│ ├── guacamole-server-1.3.0.tar.gz
│ └── guacamole-server.service
└── SPECS
└── guacamole-server.spec
2 directories, 3 files
rpmbuild -bp your-package.specs #一个和你的软件包同名的specs文件
cd /root/rpmbuild/BUILD/your-package/ #一个和你的软件包同名的目录
./configure #这一步和编译普通的源码软件一样,可以加上参数
make
make install
方法二:
rpm -i you-package.src.rpm
cd /root/rpmbuild/SPECS
前两步和方法一相同
rpmbuild -bb your-package.specs #一个和你的软件包同名的specs文件
这时在/root/rpmbuild/RPM/x86_64/(根据具体包的不同,也可能是i686,noarch等等)在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm即可安装完成。
卸载:rpm -e 软件名
使用命令rpm -e包名,包名可以包含版本号等信息,但是不可以有后缀.rpm,比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:
rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd
不可以是下列格式:
rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1
有时会出现一些错误或者警告:
... is needed by ...
这说明这个软件被其他软件需要,不能随便卸载,可以用rpm -e --nodeps忽略依赖关系卸载
或者强制卸载:rpm -e httpd --force
更新:rpm -Uvh 软件包名字
rpm -Uvh 软件包名字
特点:如果这个包之前没有安装,就正常的安装就相当于-ivh,如果之前有安装过,就先卸载之前的旧版本,在安装新版本,,,,,,,重点:安装的时候一定用-ivh,因为你不知道新版本是否有问题
查询系统已安装的rpm包:rpm -qa 软件包名
rpm -qa (q:查询,a:安装过的所有包) 列出所有安装过的包
记不住名字可以,通过管道可以查询具体哪个包是否安装没有:
rpm -qa | grep sql (意思表示查询一下当前系统是否安装过sql这个软件)
[root@test-6 ~]# rpm -qa do* (利用通配符,查找某软件,*表示匹配所有)
[root@LAMP ~]# rpm -qa | egrep "httpd|vim" (查找多个软件包)
查看系统未安装的软件包:
rpm -qp 软件包名字
获取关于一个已安装软件包的相关信息?:rpm -qi 包名
例如:rpm -qi dos2unix
[root@test-6 ~]# rpm -qi dos2unix
Name : dos2unix Relocations: (not relocatable)
Version : 3.1 Vendor: CentOS
Release : 37.el6 Build Date: 2010年08月23日 星期一 07时05分10秒
Install Date: 2019年01月02日 星期三 18时37分35秒 Build Host: c6b6.bsys.dev.centos.org
Group : Applications/Text Source RPM: dos2unix-3.1-37.el6.src.rpm
Size : 18857 License: BSD
Signature : RSA/8, 2011年07月03日 星期日 12时10分26秒, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
Summary : Text file format converter
Description :
Dos2unix converts DOS or MAC text files to UNIX format.
获取关于一个未安装软件包的相关信息?rpm -qip 包名
-
一个没有安装过的软件包,使用rpm -qip ****.rpm
-
一个已经安装过的软件包,还可以使用rpm -qi ****.rpm
获取rpm包软件所在的位置和有那些文件?rpm -ql
-
一个已经安装过的软件包,还可以使用rpm -ql ****.rpm
-
一个没有安装过的软件包,使用rpm -qlp ****.rpm
[root@test-6 ~]# rpm -ql dos2unix
/usr/bin/dos2unix
/usr/bin/mac2unix
/usr/share/doc/dos2unix-3.1
/usr/share/doc/dos2unix-3.1/COPYRIGHT
/usr/share/man/man1/dos2unix.1.gz
/usr/share/man/man1/mac2unix.1.gz
说明:/bin下面的是可以执行的
查询rpm安装的软件所在的位置:rpm -ql 软件名?
例如:rpm -ql openssh-5.3p1-117.el6.x86_64
rpm -ql 包名
[root@CentOS6 ~]# rpm -ql openssh-5.3p1-117.el6.x86_64
/etc/ssh
/etc/ssh/moduli
…………………………………………
/usr/share/man/man8/ssh-keysign.8.gz
Notice这里的是不包括.rpm后缀的软件包的名称,也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。
如果只是想知道可执行程序放到那里去了,也可以用which,比如:
which mysql
如何不安装但是获取rpm包中的文件
还可以用来恢复某个软件里缺失的文件(eg:不小心删除了/usr/bin/tree)
使用工具rpm2cpio和cpio
rpm2cpio xxx.rpm | cpio -tvi (查看)
rpm2cpio xxx.rpm | cpio -idmv (解压)
rpm2cpio xxx.rpm | cpio --extract --make-directories
参数i和extract相同,表示提取文件。v表示指示执行进程,d和make-directory相同,表示根据包中文件原来的路径建立目录,m表示保持文件的更新时间。
eg:
[root@CentOS6 ~ 15:06]#rpm2cpio /mnt/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -tvi
[root@CentOS6 ~ 15:06]#rpm2cpio /mnt/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -idmv (当前目录下,生成一个usr目录)
[root@CentOS6 ~ 15:06]#rpm2cpio /mnt/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -idmv
./usr/bin/tree
./usr/share/doc/tree-1.5.3
./usr/share/doc/tree-1.5.3/LICENSE
./usr/share/doc/tree-1.5.3/README
./usr/share/man/man1/tree.1.gz
132 块
[root@CentOS6 ~ 15:07]#ls
usr
[root@CentOS6 ~ 15:07]#tree usr/
usr/
├── bin
│ └── tree
└── share
├── doc
│ └── tree-1.5.3
│ ├── LICENSE
│ └── README
└── man
└── man1
└── tree.1.gz
6 directories, 4 files
查看软件的配置文件
rpm -qc 软件名
例如:rpm -qc linuxqq
查看软件的帮助文档在哪?rpm -qd 文件名
例如:rpm -qd openssh-5.3p1-117.el6.x86_64
[root@CentOS6 ~]# rpm -qd openssh-5.3p1-117.el6.x86_64
/usr/share/doc/openssh-5.3p1/CREDITS
/usr/share/doc/openssh-5.3p1/ChangeLog
…………………………………………
/usr/share/man/man8/ssh-keysign.8.gz
[root@test-6 ~]# rpm -qd dos2unix
/usr/share/doc/dos2unix-3.1/COPYRIGHT
/usr/share/man/man1/dos2unix.1.gz
/usr/share/man/man1/mac2unix.1.gz
如何查询一个可执行文件属于哪个rpm包(很重要)
rpm -qf `which 程序名` #返回软件包的全名
rpm -qif `which 程序名` #返回软件包的有关信息
rpm -qlf `which 程序名` #返回软件包的文件列表
Notice,这里不是引号,而是`,就是键盘左上角的那个键。也可以使用rpm -qilf,同时输出软件包信息和文件列表。
[root@test-6 ~]# rpm -qf `which lsof`
lsof-4.82-5.el6.x86_64
[root@test-6 ~]# rpm -qif `which lsof`
Name : lsof Relocations: (not relocatable)
Version : 4.82 Vendor: CentOS
Release : 5.el6 Build Date: 2015年07月24日 星期五 01时38分32秒
Install Date: 2018年11月27日 星期二 00时29分10秒 Build Host: c6b8.bsys.dev.centos.org
Group : Development/Debuggers Source RPM: lsof-4.82-5.el6.src.rpm
Size : 921456 License: zlib
Signature : RSA/SHA1, 2015年07月25日 星期六 04时42分10秒, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof
Summary : A utility which lists open files on a Linux/UNIX system
Description :
Lsof stands for LiSt Open Files, and it does just that: it lists
information about files that are open by the processes running on a
UNIX system.
[root@test-6 ~]# rpm -qlf `which lsof`
/usr/sbin/lsof
/usr/share/doc/lsof-4.82
/usr/share/doc/lsof-4.82/00.README.FIRST
/usr/share/doc/lsof-4.82/00.README.FIRST_4.82
/usr/share/doc/lsof-4.82/00CREDITS
……………………………………
/usr/share/man/man8/lsof.8.gz
如何查询一个文件属于哪个rpm包(很重要)
Notice:前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。
前提是知道这个文件名。首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:
查看某文件是有哪个安装包安装生成的:rpm -qf(很重要)
[root@test-6 ~]# rpm -qf /etc/passwd
setup-2.8.14-23.el6.noarch
whereis + rpm -qf
[root@test-6 ~]# whereis lsb_release
lsb_release: /usr/bin/lsb_release /usr/share/man/man1/lsb_release.1.gz
[root@test-6 ~]# rpm -qf /usr/bin/lsb_release
redhat-lsb-core-4.0-7.el6.centos.x86_64
[root@test-6 ~]# rpm -qf /usr/share/man/man1/lsb_release.1.gz
redhat-lsb-core-4.0-7.el6.centos.x86_64
-----------------------------------------------------------------------------------------
rpm + which -qf
[root@test-6 ~]# which lsb_release
/usr/bin/lsb_release
[root@test-6 ~]# rpm -qf /usr/bin/lsb_release
redhat-lsb-core-4.0-7.el6.centos.x86_64
如何查询一个库文件属于哪个rpm包
1.如果这个库文件已经存在
使用rpm命令:
# rpm -qf /file/path (绝对路径)
例如:
# rpm -qf /lib/libm.so.6
glibc-2.12-1.47.el6.i686
当然,这适用于rpm包已经安装了的情况。
如果,没有安装呢?比如系统提示缺少某个库?
2.如果这个库文件不存在
yum provides libm.so.6
如果不行,可能需要这样:
#yum provides */libm.so.6
或者用repoquery,这样软件需要安装yum-utils
# repoquery --help
# repoquery --nvr --whatprovides libm.so.6
导入公钥查看数字签名:
导入过后,安装包时,不会有这个提示
eg:下面两个文件都可以(只是光盘里面的是只读文件)
rpm --import /etc/pki/RPM-GPG-KEY-CentOS-6
rpm --import /mnt/RPM-GPG-KEY-CentOS-6
eg:也可以卸载key;先查找key,在卸载
[root@CentOS6 ~ 14:57]#rpm -qa "gpg-pubkey*" (查找)
gpg-pubkey-c105b9de-4e0fd3a3
gpg-pubkey-0608b895-4bd22942
[root@CentOS6 ~ 14:58]#rpm -e gpg-pubkey-c105b9de-4e0fd3a3 (卸载)
验证安装包的数字签名:rpm -V 软件名字
[root@CentOS6 ~]#rpm -K /mnt/Packages/tree-1.5.3-3.el6.x86_64.rpm
/mnt/Packages/tree-1.5.3-3.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
实际中,删除rpm命令,后恢复
进入救援模式,挂载光盘,安装rpm
第三种:yum安装
summarize
yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
yum是基于Python写的
Grammar
yum(Option)(参数)
Option
-y:对所有的提问都回答"yes";
-v:详细模式;
-C:完全从缓存中运行,而不去下载或者更新任何头文件。
yum-config-manager --enablerepo=repoidglob:将某个仓库临时的启用
yum-config-manager --disablerepo=repoidglob:将某个仓库临时的关闭
yum-config-manager --add-repo http://mirrors.aliyun.com/xx.repo:添加某个仓库
--nogpgcheck:不进行gpgcheck校验
-h:显示帮助信息;
-c:指定配置文件;
-q:安静模式;
-d:设置调试等级(0-10);
-e:设置错误等级(0-10);# yum install -d0 -e0 -y curl
-R:设置yum处理一个命令的最大等待时间;
arguments
install:安装rpm软件包
reinstall:重新安装rpm软件包
update:更新rpm软件包
remove:删除指定的rpm软件包
list:显示软件包的信息
clean:清理yum过期的缓存
localinstall:安装本地的rpm软件包
search:检查软件包的信息
info:显示指定的rpm软件包的描述信息和概要信息
localupdate:显示本地rpm软件包进行更新
deplist:显示rpm软件包的所有依赖关系
resolvedep:显示rpm软件包的依赖关系
--showduplicates: 显示软件包的所有版本
check-update:检查是否有可用的更新rpm软件包
--enablerepo=epel (yum install XXX --enablerepo=YYY #XXX是要安装的软件,YYY是repo源的名字)
shell:进入yum的shell提示符
--downloadonly don\'t update, just download
--downloaddir=DLDIR
--skip-broken 来跳过无法安装的软件包
Living Example
部分常用的命令包括:
-
自动搜索最快镜像插件:yum install yum-fastestmirror
-
安装yum图形窗口插件:yum install yumex
-
查看可能批量安装的列表:yum grouplist
----------------------------------------------------------------------
查找和显示
yum list #显示所有已经安装和可以安装的程序包
yum list package1 #显示指定程序包安装情况package1
yum list vsftp \* #后面表示记不住包名,就用这个
yum list all #查看所以包,有@的都是已安装
yum list installed #查看已安装的包
yum whatprovides */lsb_release #查找哪个源包含这个命令
yum provides */lsb_release #查找哪个源包含这个命令
yum search vsftp #用这个命令查询记不住包名的方法
yum info package1 #显示安装包信息package1
yum deplist httpd #显示所有依赖关系
yum history #yum历史记录
yum grouplist #显示系统所有的yum组
/yum grouplist \"GNOME Desktop\" #显示系统某一个yum组
yum groupinfo group1 #显示程序组group1信息
yum search string 根据关键字string查找安装包
------------------------------------------------------------
安装
yum list installed #查看已安装的软件包
yum install package1 #安装指定的安装包package1
yum reinstall package1 #重新安装package1
yum localinstall blah.rpm #使用yum来安装本地rpm,从资源库进行安装
yum grouplist #查看组包
yum groupinfo 'Development Tools' #查看组包信息
yum groupinstall 'Development Tools' #安装yum分组;建议安装此组包
yum groupinsall group1 #安装程序组group1
-----------------------------------------------------------------------
更新和升级
yum update #全部更新
yum update package1 #更新指定程序包package1
yum downgrade package1 [package2] [...] #降级
yum --exclude=package* update #将一个包排除在外不更新
yum distribution-synchronization or distro-sync:把本地的软件版本变成和yum源上最新的版本一直。可能升级也可能降级。关键看你本地已安装软件版本和yum源上版本。最软件包组不生效。
yum check-update #检查可更新的程序
yum upgrade package1 #升级指定程序包package1
yum groupupdate group1 #升级程序组group1
----------------------------------------------------------------------------
删除程序
yum deplist package1 #查看程序package1依赖情况
yum remove package1 #删除程序包package1
yum groupremove group1 #删除程序组group1
-------------------------------------------------------------
清除与生成缓存
yum clean all #清除缓存
yum clean metadata #清除源数据
yum makecache fast #加载缓存插件
yum makecache #生成缓存
yum repolist #查看可用repo列表
yum repolist all #查看所有repo列表
yum clean all
rm -f /var/lib/rpm/__db*
rpm --rebuilddb
yum clean metadata
yum makecache
yum info kernel
yum list installed #查看已安装的软件包
yum clean packages #清除缓存目录下的软件包
yum clean headers #清除缓存目录下的 headers
yum clean oldheaders #清除缓存目录下旧的 headers
------------------------------------------------------------------
Notice:yum的repolist配置文件中,引入了变量一说
$releasever:引用当前系统的版本号[主版本号]
$basearch:引用当前系统的基础架构[x86、x86_64]
$infra:引用系统架构的相关信息
eg:name=LS$releasever-iso-$basearch-$infra
效果显示就是LS6-iso-x86_64-stock
清华源自动配置yum源文件
https://mirrors.tuna.tsinghua.edu.cn/help/centos/
安装指定版本的包
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b116SEwyb
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
查看所以版本信息
yum list erlang --showduplicates
安装指定版本
yum list erlang-23.3.4.7-1.el8
挂载ISO文件后构建本地yum源
把ISO文件挂载到/mnt目录下
# cat /etc/yum.repos.d/local.repo
[localyum]
name=localyum
baseurl=file:///mnt/
enabled=1
gpgcheck=0
参数详解
cat /etc/yum.repos.d/local.repo #注意文件中不好写注释,否则不能识别
1、首先构建本地yum: 可以写多个源
[localyum] (yum的repo id(源标识),必须唯一,不能有空格格式:[内容随便])
2、 name=localyum.repo(repo name(源名称),描述信息,等于后面不能有空格,切必须要有name=)
3、baseurl=file:///mnt(表示光盘的挂载点,必须是repodata/目录的上一级目录)支持ftp://ip;http://;https://等等;这个ip是其他地方机器的ip,意思就是访问其他机器上的内容。也可以访问本地的yum源,但是应该这样写baseurl=file:///mnt;如果有多个地址,可以把这些地址写在一个文件中,在指向这个文件)
4、enabled=1 (表示启动这个yum)
5、gpgcheck=0 (表示不验证数字签名)
#如果需要验证:
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
6、把本地yum源与其他yum源分开,然后挂载镜像。
7、清空一下缓存:yum clean all
7、生成缓存:yum makecache
8、查看仓库:yum repolist
自动生repo成配置文件:
# 生成一个 1.1.1.1_centos_yum_7_.repo
# yum-config-manager --add-repo=http://1.1.1.1/centos/yum/7/
Loaded plugins: fastestmirror, langpacks
Repository epel is listed more than once in the configuration
adding repo from: http://1.1.1.1/centos/yum/7/
[1.1.1.1_centos_yum_7_]
name=added from: http://1.1.1.1/centos/yum/7/
baseurl=http://1.1.1.1/centos/yum/7/
enabled=1
# ll /etc/yum.repos.d/1.1.1.1_centos_yum_7_.repo
# yum-config-manager --disable 仓库门 #禁用仓库
# yum-config-manager --enable 仓库门 #启用仓库
vim /etc/yum.conf (这个文件很少去调整,为所有仓库提供公共配置文件)
[main]
cachedir=/var/cache/yum/$basearch/$releasever (元数据缓存的目录)
keepcache=0 (rpm包缓存,1表示需要缓存;0表示不需要)
debuglevel=2
logfile=/var/log/yum.log (yum日志)
exactarch=1
obsoletes=1
gpgcheck=1 (校验包)
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
--------------------------------------------------------------------------------
#aliyun.epel源,eprl源有很多包可以使用
[epel]
name=aliyun.erel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0
rsync同步中科大的rpm包
https://servers.ustclug.org/2021/05/rsync-repo-removal/
#使用rsync同步yum源.为了节省带宽、磁盘和下载时间,我只同步了CentOS6的rpm包,这样所有的rpm包只占用了21G,全部同步需要300G左右。
#同步base源,小技巧,我们安装系统的光盘镜像含有部分rpm包,大概3G,这些就不用重新下载。
/usr/bin/rsync -av rsync://mirrsors.ustc.edu.cn/centos/6/os/x86_64/ /data/yum_data/centos/6/os/x86_64/
/usr/bin/rsync -av rsync://mirrsors.ustc.edu.cn/centos/6/extras/x86_64/ /data/yum_data/centos/6/extras/x86_ 64/
/usr/bin/rsync -av rsync://mirrors.ustc.edu.cn/centos/6/updates/x86_64/ /data/yum_data/centos/6/updates/x86 64/
# epel源
/us/bin/rsync -av -exclude=debug rsync://mirrors.ustc.edu.cn/epel/6/x86_64/ /data/yum data/epel/6/x86_64/
reposync同步yum源
将公网源的包全部下载到本地(本地能连接互联网),然后进行本地安装
https://blog.csdn.net/weixin_33827590/article/details/92345191
reposync同步yum源的方法(转载于:https://blog.51cto.com/moerjinrong/2354860)
安装reposync & createrepo
yum install yum-utils createrepo -y
# reposync --help
Usage:
Reposync is used to synchronize a remote yum repository to a local
directory using yum to retrieve the packages.
/usr/bin/reposync [options]
Options:
-h, --help show this help message and exit
-c CONFIG, --config=CONFIG
config file to use (defaults to /etc/yum.conf)
-a ARCH, --arch=ARCH act as if running the specified arch (default: current
arch, note: does not override $releasever. x86_64 is a
superset for i*86.) # 常用选项
--source operate on source packages
-r REPOID, --repoid=REPOID # 常用选项
specify repo ids to query, can be specified multiple
times (default is all enabled)
-e CACHEDIR, --cachedir=CACHEDIR
directory in which to store metadata
-t, --tempcache Use a temp dir for storing/accessing yum-cache
-d, --delete delete local packages no longer present in repository
-p DESTDIR, --download_path=DESTDIR # 常用选项
Path to download packages to: defaults to current dir
--norepopath Don't add the reponame to the download path. Can only
be used when syncing a single repository (default is
to add the reponame)
-g, --gpgcheck Remove packages that fail GPG signature checking after
downloading
-u, --urls Just list urls of what would be downloaded, don't
download
-n, --newest-only Download only newest packages per-repo
-q, --quiet Output as little as possible
-l, --plugins enable yum plugin support
-m, --downloadcomps also download comps.xml
--download-metadata download all the non-default metadata
--allow-path-traversal
Allow packages stored outside their repo directory to
be synced (UNSAFE, USE WITH CAUTION!)
在本地配置外网的yum源,以阿里云上的virt源为例,这个源中的qemu-kvm-rhev包是OpenStack所依赖的,如果你想同步base源或者epel源,更换成对头的baseurl即可
[virt]
name=kvm
baseurl=http://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
gpgcheck=0
配置完成,更新yum缓存
yum makecache
执行
reposync -r virt -p /home/yum/
其中
-r选项用来指明同步当前主机的哪个yum源,是根据repo id来选择的
-p选项可以指明同步到哪个目录下,此目录最好是httpd服务器的DocumentRoot,如果不使用-p选项则会在当前路径下创建一个与repo id同名的目录
执行
cd /home/yum/virt/
createrepo . #命令执行成功后会在该目录下创建一个repodata目录
如果源里面的包发生了更新,需要执行如下步骤:如果你本地操作系统是x86,你要导出aarach的需要指定参数-a aarch64
reposync -r virt -p /home/yum/
cd /home/yum/virt/
createrepo --update .
创建.repo配置文件指向到本地仓库的路径,注意文件名一定要是.repo结尾
/etc/yum.repos.d/local.repo
#yum的repo id(源标识),必须唯一
[locarepo]
#repo name(源名称)
name=locayum
#仓库路径[必须是repodata/目录的同一级目录],由于是放在本地的只能用file协议而不是http
baseurl=file:///home/yum/virt/
#开启该仓库
enabled=1
#不做gpg检查
gpgcheck=0
最后通过yum repolist命令查看仓库及包的数量,可以看到创建的local仓库已经加载
创建企业YUM仓库
上面的操作中只是在本地建立了一个YUM仓库,这样别人是无法使用的。所以通常会在计划任务中把公网YUM源同步到本地(推荐使用reposync),同步后再执行一次createrepo更新元数据,最后把仓库目录通过FTP或者Nginx、Apache、NFS服务等共享出来,然后客户端的配置文件中修改如下:
[test]
name=test
enable=1
gpgcheck=0
baseurl=http://10.10.10.10
制定企业级yum仓库
http://www.linuxe.cn/post-300.html
下载离线包
方式1、
yum -y install xxx --downloadonly --downloaddir=./ #在有网络的环境下下载需要的离线包。(此命令只会下载离线包到指定目录 不会去安装如果需要安装 再执行yum install xxx 即可)
缺点:不会下载系统已存在的依赖包
方式2、
yumdownloader是什么: yumdownloader is a program for downloading RPMs from Yum repositories
yumdownloader 命令在软件包 yum-utils 里面
缺点:不会下载系统已存在的依赖包
语法格式
yumdownloader [options] package1 [package2] [package..]
常用参数说明
参数 | 说明 |
---|---|
-q | 静默执行 |
-v | 显示执行细节 |
-y | 所有的选择都答yes |
--downloadonly | 不更新,只下载 |
--destdir | 保存路径,默认为当前路径 |
--resolve | 解析依赖关系并下载所需的包 |
1、安装:
# yum install yum-utils -y
2、从本机的yum源中下载httpd软件包
# yumdownloader httpd
默认情况下,Yumdownloader 将会下载软件包到当前工作目录下,为了将软件下载到一个特定的目录下,我们使用 --destdir 参数
获取httpd安装包及依赖,并放到指定目录中:
# 下载httpd软件包
# yumdownloader --resolve --destdir=/root/mypackages/ httpd
# 下载制作离线包的工具
# yumdownloader --resolve --destdir=/root/mypackages/ createrepo
至此,httpd服务软件包及依赖已经保存到指定目录了,下载createrepo包为制作离线源使用.
方式3、(推荐)
yum install yum-utils
repotrack --help
# 显示最终要下载的包的“urls”,而不实际下载。
repotrack -u httpd
# 指定特定的“repoid” (默认是所有启用的ID)
repotrack -r base -u httpd
# 下载到指定的目录centos7与centos8参数不一样了
repotrack httpd -p ./httpd
# 下载指定平台的包(这里下载的x86_64),默认是下载当前机器的架构包
repotrack -a x86_64 httpd -p ./httpd-x86_64
repotrack -a aarch64 httpd -p ./httpd-aarch64
repotrack -a i686 zlib -p ./zlib-i686
# 区别:
yumdownloader解决了httpd的依赖包,但是无法解决依赖包的依赖包;
repotrack不仅解决了httpd的依赖包,还解决了依赖包和依赖包之间的关系;
createrepo:创建元数据仓库
当网络上dowload某个程序包时,会造成极大的带宽消耗;为了实现远程文件服务器的本地仓库镜像源,将下载的程序包,制作成本地的包仓库
提示:
1、需要下载rpm包[数据文件]
2、提供rpm包制作的\'元数据\'文件[createrepo]
Notice:在此过程中createrepo用于创建rpm包的源数据信息
补充命令:
createrepo:创建元数据仓库
Grammar:
- createrepo [Options]
Option:
- --basedir:定义repodata目录输出到指定的目录下面
安装createrepo工具
3、打包mypackages目录并上传至离线服务器的/root目录后解压
切换到mypackages目录,执行如下安装制作元数据工具
yumdownloader --resolve --destdir=/root/mypackages/ httpd
yumdownloader --resolve --destdir=/root/mypackages/ createrepo
[root@VM-16-16-centos ~ 13:12:08]# cd mypackages/
[root@VM-16-16-centos ~/mypackages 13:13:12]# ll
total 3020
-rw------- 1 root root 95840 Aug 10 2017 createrepo-0.9.9-28.el7.noarch.rpm
-rw------- 1 root root 2849200 May 30 23:15 httpd-2.4.6-99.el7.centos.1.x86_64.rpm
-rw------- 1 root root 96708 May 30 23:15 httpd-tools-2.4.6-99.el7.centos.1.x86_64.rpm
-rw-r--r-- 1 root root 31264 Jul 4 2014 mailcap-2.1.41-2.el7.noarch.rpm
#将mypackages目录制作成仓库,会生产repodata目录
# createrepo /root/mypackages
Spawning worker 0 with 2 pkgs
Spawning worker 1 with 2 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@VM-16-16-centos ~/mypackages 13:14:05]# ll /root/mypackages
total 3024
-rw------- 1 root root 95840 Aug 10 2017 createrepo-0.9.9-28.el7.noarch.rpm
-rw------- 1 root root 2849200 May 30 23:15 httpd-2.4.6-99.el7.centos.1.x86_64.rpm
-rw------- 1 root root 96708 May 30 23:15 httpd-tools-2.4.6-99.el7.centos.1.x86_64.rpm
-rw-r--r-- 1 root root 31264 Jul 4 2014 mailcap-2.1.41-2.el7.noarch.rpm
drwx------ 2 root root 4096 Aug 1 13:14 repodata
[root@VM-16-16-centos ~/mypackages 13:14:22]# ll /root/mypackages/repodata/
total 36
-rw------- 1 root root 3509 Aug 1 13:14 24ac5dc314fb73bfc39b4514b0ca9b31059a6302fcea6b19c19691db5b589fb1-filelists.xml.gz
-rw------- 1 root root 5403 Aug 1 13:14 2da81245c745636ea4bd8460d2c5bcaae1e92f550c7103a0afbd3cc98472f91e-filelists.sqlite.bz2
-rw------- 1 root root 2449 Aug 1 13:14 7799e910079fa5600d0328dd5ec4da6348137a61ad8cd90cc1bc9272e6ca9e02-primary.xml.gz
-rw------- 1 root root 5853 Aug 1 13:14 857aa2a9c08820a4fef2d7d9fb8b6d5ce41338526c00fefb53d5c35ca4fea52b-primary.sqlite.bz2
-rw------- 1 root root 3723 Aug 1 13:14 87332eede929dbc953602516b9baa8fc394967ced701d65abc59375d06b22063-other.sqlite.bz2
-rw------- 1 root root 2317 Aug 1 13:14 be58b9739472e88bb4d1abb319f40d3ebc3b9832eaef0a15c8c654d393e7bbf0-other.xml.gz
-rw------- 1 root root 2974 Aug 1 13:14 repomd.xml
#如果有新的包执行更新操作
createrepo --update /root/mypackages
创建yum仓库文件
4、编辑yum文件
cat > /etc/yum.repos.d/local.repo << EOF
#yum的repo id(源标识),必须唯一
[localrepo]
#repo name(源名称)
name=localyum
#仓库路径
baseurl=file:///root/mypackages/
#开启该仓库
enabled=1
#不做gpg检查
gpgcheck=0
EOF
安装软件
5、安装httpd
# yum list httpd --enablerepo=localrepo #可以看到是用的localrepo源
[root@VM-16-16-centos ~/mypackages 13:15:49]# yum list httpd --enablerepo=localrepo
Loaded plugins: fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
* elrepo: mirrors.tuna.tsinghua.edu.cn
localrepo | 2.9 kB 00:00:00
localrepo/primary_db | 5.7 kB 00:00:00
Available Packages
httpd.x86_64 2.4.6-99.el7.centos.1 localrepo
# yum install httpd -y --enablerepo=localrepo
利用rpm-build制定rpm包
原文链接:
https://blog.csdn.net/get_set/article/details/53453320
https://blog.51cto.com/laoguang/1103628
1 准备
首先请准备一个Linux环境,比如CentOS。
RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包,这个是必装的。
$ yum install rpm-build
当然也可以直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上。
$ yum install rpmdevtools
当然,根据不同的软件构建过程,还需要其他的编译打包工具,比如C语言的make、gcc,python的setuptools等,根据需要安装即可。
2 原理
RPM打包的时候需要编译源码,还需要把编译好的配置文件啊二进制命令文件啊之类的东西按照安装好的样子放到合适的位置,还要根据需要对RPM的包进行测试,这些都需要先有一个"工作空间"。rpmbuild命令使用一套标准化的"工作空间":
$ rpmdev-setuptree
rpmdev-setuptree这个命令就是安装rpmdevtools带来的。可以看到运行了这个命令之后,在\$HOME家目录下多了一个叫做rpmbuild的文件夹,里边内容如下:
[root@master ~]# tree rpmbuild/
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
5 directories, 0 files
你可以通过rpmbuild --showrc | grep topdir
查看你系统默认的工作车间
如果没有安装rpmdevtools的话,其实用mkdir命令创建这些文件夹也是可以的。
mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
或者直接运行rpmbuild xxx 如果这个命令没有那么那也会自动生成这些目录
从这些文件的名字大体也能看得出来都是干嘛用的。具体来说:
默认位置 | 宏代码 | 名称 | 用途 |
---|---|---|---|
%{getenv:HOME}/rpmbuild | %{_topdir} | 工作空间 | 保存整个rpmbuild目录文件 |
~/rpmbuild/SPECS | %_specdir | Spec 文件目录 | 保存 RPM 包配置(.spec)文件 |
~/rpmbuild/SOURCES | %_sourcedir | 源代码目录 | 保存源码包(如 .tar 包)和所有 patch 补丁 |
~/rpmbuild/BUILD | %_builddir | 构建目录 | 源码包被解压至此,并在该目录的子目录完成编译 |
~/rpmbuild/BUILDROOT | %buildroot | 最终安装目录 | 保存 %install 阶段安装的文件,编译后生成的软件临时安装目录 |
~/rpmbuild/RPMS | %_rpmdir | 标准 RPM 包目录 | 生成/保存二进制 RPM 包 |
~/rpmbuild/SRPMS | %_srcrpmdir | 源代码 RPM 包目录 | 生成/保存源码 RPM 包(SRPM) |
Reference:
http://fedoraproject.org/wiki/Packaging/RPMMacros#RPM_directory_macros
RPM directory macros
%{_topdir} %{getenv:HOME}/rpmbuild
%{_builddir} %{_topdir}/BUILD
%{_rpmdir} %{_topdir}/RPMS
%{_sourcedir} %{_topdir}/SOURCES
%{_specdir} %{_topdir}/SPECS
%{_srcrpmdir} %{_topdir}/SRPMS
%{_buildrootdir} %{_topdir}/BUILDROOT
Note: On releases older than Fedora 10 (andEPEL), %{_buildrootdir} does not exist.更改为这个了%buildroot
原文链接:https://blog.csdn.net/txgc1009/article/details/6833764
通过命令rpm --showrc查看实现代码。另外直接通过 rpm --eval "%{macro}"来查看具体对应路径。
比如我们要查看%{_bindir}的路径,就可以使用命令rpm --eval "%{_bindir}"来查看。
另外,所有的宏都可以在/usr/lib/rpm/macros里找到。
SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。
打包的过程有点像是流水线,分好几个工序:
1. 首先,需要把源代码放到%_sourcedir中;
2. 然后,进行编译,编译的过程是在%_builddir中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
3. 第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
4. 然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
5. 还有一步可选操作,那就是检查软件是否正常运行;
6. 最后,生成的RPM包放置到%_rpmdir,源码rpm包放置到%_srpmdir下。
https://www.cnblogs.com/jmliao/p/11322680.html
3 SPEC文件各阶段
https://blog.csdn.net/get_set/article/details/53453320
https://blog.51cto.com/laoguang/1103628
spec file由%开头的宏定义的域段落组成,我们可以在不同的段落写执行shell命令来完成编译,安装等功能。
以上这些步骤都是配置在SPEC文件中的,具体来说各个阶段:
阶段 | 读取的目录 | 写入的目录 | 具体动作 |
---|---|---|---|
%prep | %_sourcedir | %_builddir | 读取位于 %_sourcedir 目录的源代码和 patch 。之后解压源代码至 %_builddir 的子目录并应用所有 patch。 |
%build | %_builddir | %_builddir | 编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。 |
%install | %_builddir | %_buildrootdir | 读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。 |
%check | %_builddir | %_builddir | 检查软件是否正常运行。通过执行类似 make test 的命令实现。很多软件包都不需要此步。 |
bin | %_buildrootdir | %_rpmdir | 读取位于 %_buildrootdir 最终安装目录下的文件,以便最终在 %_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录, noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。 |
src | %_sourcedir | %_srcrpmdir | 创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至 %_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。 |
%prep阶段
%prep 预处理段,顾名思义,该段内容通常用来执行解压缩开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,比如mkdir,cp。部分描述了解压源码包的方法。一般而言,其中包含 %autosetup 命令。另外,还可以使用 %setup 和 %patch 命令来指定操作 Source0、Patch0 等标签的文件。
怎么知道具体解压文件是哪个呢?:%{SOURCE0}会引用这个参数来作为操作本次spec文件第一步需要解压文件
%autosetup 命令用于解压源码包。可用选项包括:
-n name : 如果源码包解压后的目录名称与 RPM 名称(%{name}-%{version},根据spec文件中的name、version取得)不同,此选项用于指定正确的解压目录名称。通俗易懂解释:如果你的源码文件解压后的名字不是spec文件中的%{name}-%{version},那么你必须指定解压文件名。例如,如果 tar xf ball.tar.gz 解压后的目录名为 FOO,则使用 “%autosetup -n FOO”
-c name : 如果源码包解压后包含多个目录,而不是单个目录时,此选项可以创建名为 name 的目录,并在其中解压。
%setup 命令,解压并进入解压后的目录里面
如果使用 %setup 命令,通常使用 -q 抑止不必要的输出。如果需要解压多个文件,有更多 %spec 选项可用,这对于创建子包很有用。常用选项如下:
%setup 不加任何选项,仅将软件包打开
-a number:在切换目录后,只解压指定序号的 Source 文件(例如 “-a 0” 表示 Source0)。
-b number :在切换目录前, 只解压指定序号的 Source 文件(例如 “-b 0” 表示 Source0)。
-D:解压前,不删除目录。
-T:禁止自动解压归档。
-c name : 如果源码包解压后包含多个目录,而不是单个目录时,此选项可以创建名为 name 的目录,并在其中解压。
%setup -n newdir 将SOURCES目录中软件包里面文件解压在newdir目录下。
%setup -c 解压缩之前先产生目录。
%setup -b num 将第num个source文件解压缩。
%setup -T 不使用default的解压缩操作。
%setup -T -b 0 将第0个源代码文件解压缩。
%setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
%patch 命令
如果使用 %autosetup 命令,则不需要手动进行补丁管理。如果你的需求很复杂,或需要与 EPEL 兼容,需要用到此部分的内容。%patch0 命令用于应用 Patch0(%patch1 应用 Patch1,以此类推)。Patches 是修改源码的最佳方式。常用的 -p NUMBER 选项,向 patch 程序传递参数,表示跳过 NUM 个路径前缀。
补丁文件名通常像这样 telnet-0.17-env.patch,命名格式为 %{name} - %{version} - REASON.patch(有时省略 version 版本)。补丁文件通常是 diff -u 命令的输出;如果你在 ~/rpmbuild/BUILD 子目录执行此命令,则之后便不需要指定 -p 选项。
为一个文件制作补丁的步骤:
cp foo/bar foo/bar.orig
vim foo/bar
diff -u foo/bar.orig foo/bar > ~/rpmbuild/SOURCES/PKGNAME.REASON.patch
如果需要修改多个文件,简单方法是复制 BUILD 下的整个子目录,然后在子目录执行 diff。切换至~rpmbuild/BUILD/NAME 目录后,执行以下命令:
cp -pr ./ ../PACKAGENAME.orig/
... 执行修改 ...
diff -ur ../PACKAGENAME.orig . > ~/rpmbuild/SOURCES/NAME.REASON.patch
如果你想在一个补丁中编辑多个文件,你可以在编辑之前,使用 .orig 扩展名复制原始文件。然后,使用 gendiff(在 rpm-build 包中)创建补丁文件。
==========================================
%patch 最简单的补丁方式,自动指定patch level。
%patch0 -p0 打第1个补丁,利用当前相对路径名称
%pacth1 -p2 打第2个补丁,忽略补丁文件第一层目录
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
%patch -s 不显示打补丁时的信息。
%patch -T 将所有打补丁时产生的输出文件删除。
%build阶段
%build阶段顾名思义就是对解压到%_builddir下的源码进行编译的阶段,整个过程在该目录下完成。
许多程序使用 GNU configure 进行配置。默认情况下,文件会安装到前缀为 “/usr/” 的路径下,对于手动安装很合理。然而,打包时需要修改前缀为 “/usr/local”。共享库路径视架构而定,安装至 /usr/lib 或 /usr/lib64 目录。
由于 GNU configure 很常见,可使用 %configure 宏来自动设置正确选项(例如,设置前缀为 /usr)。一般用法如下:
%configure
make %{?_smp_mflags} #make后面的意思是,如果就多处理器的话make时并行编译
若需要覆盖 makefile 变量,请将变量作为参数传递给 make:
make %{?_smp_mflags} CFLAGS="%{optflags}" BINDIR=%{_bindir}
#使用宏%configure默认有以下选项 ./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info
你会发现SPEC中会用到很多预定义好的宏,用来通过一个简单的宏来完成一个或一系列常见的操作,比如:%prep阶段用于解压的%setup和%autosetup,%build阶段的%configure等。
%install阶段
根据spec文件中的Name、Version、Release、BuildArch 4个参数创建此虚拟安装目录: /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.%{buildarch},即从 %{_builddir}/ 复制相关文件到 %{buildroot} 目录(通常表示从 ~/rpmbuild/BUILD 复制到 ~/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.%{buildarch}) 目录下,并根据需要在 %{buildroot} 中创建必要目录。
此阶段包含安装阶段需要执行的命令,例如执行make install安装程序 ,可以指定PREFIX。也可以做其他shell 命令满足安装软件的需求
容易混淆的术语:
1 “build 目录”,也称为 %{_builddir},实际上与 “build root”,又称为 %{buildroot},是不同的目录。在前者中进行编译,并将需要打包的文件从前者复制到后者,%{buildroot}通常为 ~/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.%{arch}。
2 在 %build 阶段,当前目录为 %{buildsubdir},是 %prep 阶段中在 %{_builddir} 下创建的子目录。这些目录通常名为 ~/rpmbuild/BUILD/%{name}-%{version}。
3 %install 阶段的命令不会在用户安装 RPM 包时执行,此阶段仅在打包时执行。
一般,这里执行 “make install” 之类的命令:
%install
rm -rf %{buildroot} # 仅用于 RHEL 5
%makeinstall
1.理想情况下,对于支持的程序,你应该使用 %makeinstall(这又是一个宏),它等同于 DESTDIR=%{buildroot},它会将文件安装到 %{buildroot} 目录中,就是~/rpmbuild/BUILDROOT/下面
使用 “%makeinstall” 宏。此方法可能有效,但也可能失败。该宏会展开为 make prefix=%{buildroot}%{_prefix} bindir=%{buildroot}%{_bindir} ... install,可能导致某些程序无法正常工作。请在 %{buildroot} 根据需要创建必要目录。
2.使用 auto-destdir 软件包的话,需要 BuildRequires: auto-destdir,并将 make install 修改为 make-redir DESTDIR=%{buildroot} install。这仅适用于使用常用命令安装文件的情况,例如 cp 和 install。
3.手动执行安装。这需要在 %{buildroot} 下创建必要目录,并从 %{_builddir} 复制文件至 %{buildroot} 目录。要特别注意更新,通常会包含新文件。示例如下:
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}%{_bindir}/
cp -p mycommand %{buildroot}%{_bindir}/
cp -a * $RPM_BUILD_ROOT/
%check 阶段
如果需要执行测试,使用 %check 是个好主意。测试代码应写入 %check 部分(紧接在 %install 之后,因为需要测试 %{buildroot} 中的文件),而不是写入 %{build} 部分,这样才能在必要时忽略测试。通常,此部分包含:
make test
有时候也可以用:
make check
请熟悉 Makefile 的用法,并选择适当的方式
%clean 阶段
编译完成后的清理工作,对%{buildroot}目录清空,make clean等
%clean
#清理/root/rpmbuild/BUILDROOT目录下的文件。清理这个文件不能斜杠星(xx/*这个无法删除的哈)
rm -rf %{buildroot}/
#清理/root/rpmbuild/BUILD目录下的文件
rm -rf %{_builddir}/%{name}-%{version}
通常内容为:
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
%files 阶段
原文链接:https://blog.csdn.net/get_set/article/details/53453320
那些需要安装在系统中的文件,我们需要在 %files 中声明它们,这样rpmbuild命令才知道哪些文件是要安装的
此部分列出了需要被打包的文件和目录
用于定义程序所包含的文件,可执行程序,配置文件,说明文档(doc),还可定义文件访问权限,owner 属组
注意:不要使用形如 /usr/bin/ 的硬编码, 应使用类似 %{_bindir}/hello 这样的宏来替代。手册页应在 %doc 中声明 : %doc %{_mandir}/man1/hello.1.*。
%files 基础
%defattr 用于设置默认文件权限,通常可以在 %files 的开头看到它。注意,如果不需要修改权限,则不需要使用它。其格式为:%defattr(<文件权限>, <用户>, <用户组>, <目录权限>)
第 4 个参数通常会省略。常规用法为 %defattr(-,root,root,-),其中 "-" 表示默认权限。
您应该列出该软件包拥有的所有文件和目录。尽量使用宏代替目录名,具体的宏列表如下:
%{_sysconfdir} /etc
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datarootdir} %{_prefix}/share
%{_datadir} %{_datarootdir}
%{_includedir} %{_prefix}/include
%{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var
%{_initddir} %{_sysconfdir}/rc.d/init.d
%{_unitdir} %{_prefix}/lib/systemd/system/
%{_var} /var
%{_tmppath} %{_var}/tmp
%{_usr} /usr
%{_usrsrc} %{_usr}/src
%{_lib} lib (lib64 on 64bit multilib systems)
%{_docdir} %{_datadir}/doc
%{buildroot} %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
$RPM_BUILD_ROOT %{buildroot}
$RPM_BUILD_DIR %{_builddir}
如果路径以 “/” 开头(或从宏扩展),则从 %{buildroot} 目录取用。否则,假设文件在当前目录中(例如:在 %{_builddir} 中,包含需要的文档)。如果您的包仅安装一个文件,如 /usr/sbin/mycommand,则 %files 部分如下所示:
%files
%{_sbindir}/mycommand
若要使软件包不受上游改动的影响,可使用通配符匹配所有文件:
%{_bindir}/*
注意,%{_bindir}/* 不会声明此软件包拥有 /usr/bin 目录,而只包含其中的文件。如果您列出一个目录,则该软件包拥有这个目录及该目录内的所有文件和子目录。因此,不要列出 %{_bindir},并且要小心的处理那些可能和其他软件包共享的目录。
包含一个目录:
%{_datadir}/%{name}/
如果存在以下情况,可能引发错误:
通配符未匹配到任何文件或目录
文件或目录被多次列出
未列出 %{buildroot} 下的某个文件或目录
您也可以使用 %exclude 来排除文件。这对于使用通配符来列出全部文件时会很有用,注意如果未匹配到任何文件也会造成失败。
%files 前缀
上边的“hello”的示例中,%files部分还有用到%doc等宏,可能您看得一知半解,这里详细介绍一下。
如果需要在 %files 部分添加一个或多个前缀,用空格分隔。
%doc test1 README 等等文件
用于列出 %{_builddir} 内,但不复制到 %{buildroot} 中的文档。通常包括 README 和 INSTALL等。它们会保存至 /usr/share/doc 下适当的目录中,不需要声明 /usr/share/doc 的所有权。
注意: 如果指定 %doc 条目,rpmbuild < 4.9.1 在安装前会将 %doc 目录删除。这表明已保存至其中的文档,例如,在 %install 中安装的文档会被删除,因此最终不会出现在软件包中。如果您想要在 %install 中安装一些文档,请将它们临时安装到 build 目录(不是 build root 目录)中,例如 _docs_staging,接着在 %files 中列出,如 %doc _docs_staging/* 这样。
%license COPYING
license 文件
配置文件保存在 /etc 中,一般会这样指定(确保用户的修改不会在更新时被覆盖)通俗的讲,就是删除软件包时,如果配置文件发生更改后会自动保存一份后缀为.rpmsave的文件:
%config(noreplace) %{_sysconfdir}/foo.conf
如果更新的配置文件无法与之前的配置兼容,则应这样指定:
%config %{_sysconfdir}/foo.conf
"%attr(mode, user, group)" 用于对文件进行更精细的权限控制,”-” 表示使用默认值:
%attr(0644, root, root) FOO.BAR
# %dir %attr对目录进行权限控制
%dir %attr(755, root, root) %{_sharedstatedir}/xxx
"%caps(capabilities)" 用于为文件分配 POSIX capabilities。例如:
%caps(cap_net_admin=pe) FOO.BAR
如果包含特定语言编写的文件,请使用 %lang 来标注:
%lang(de) %{_datadir}/locale/de/LC_MESSAGES/tcsh*
如果程序使用了翻译和国际化,因此会看到很多未声明的 i18 文件。 使用推荐方法来声明它们:
包含程序安装的相关文件
查找 %install 中的语言文件: %find_lang %{name}
添加编译依赖: BuildRequires: gettext
声明找到的文件: %files -f %{name}.lang
这样下来,%files部分的内容为:
%files -f %{name}.lang
%doc AUTHORS ChangeLog NEWS README THANKS TODO
%license COPYING
%{_mandir}/man1/hello.1.*
%{_infodir}/hello.info.*
%{_bindir}/hello
==========
%files
%config(noreplace) /etc/nginx/nginx.conf #%config表明这是个配置文件noplace表明不能替换
%config(noreplace) /etc/nginx/fastcgi_params
%doc /usr/html/index.html #%doc表明这个是文档
%attr(0755,root,root) /etc/rc.d/init.d/nginx #%attr后面的是权限,属主,属组
==========
%files
%defattr(-,root,root,-)
%{_bindir}/prometheus
%{_bindir}/promtool
%config(noreplace) %{_sysconfdir}/prometheus/prometheus.yml
%{_datarootdir}/prometheus
%{_unitdir}/prometheus.service
%config(noreplace) %{_sysconfdir}/default/prometheus
%dir %attr(755, prometheus, prometheus)%{_sharedstatedir}/prometheus
Scriptlets 阶段
https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/
当用户安装或卸载 RPM 时,您可能想要执行一些命令。这可以通过 scriptlets 完成。
脚本片段可以:
在软体包安装之前 (%pre) 或之后 (%post) 执行
在软体包卸载之前 (%preun) 或之后 (%postun) 执行
在事务开始 (%pretrans) 或结束 (%posttrans) 时执行
例如,每个二进制 RPM 包都会在动态链接器的默认路径中存储共享库文件,并在 %post 和 %postun 中调用 ldconfig 来更新库缓存。如果软件包有多个包含共享库的子包,则每个软体包也需要执行相同动作。
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
如果仅执行一个命令,则 “-p” 选项会直接执行,而不启用 shell。然而,若有许多命令时,不要使用此选项,按正常编写 shell 脚本即可。
如果你在脚本片段中执行任何程序,就必须以 Requires(CONTEXT)(例: Requires(post))的形式列出所有依赖。
%pre、%post、%preun 和 %postun 提供 $1 参数,表示动作完成后,系统中保留的此名称的软件包数量。因此可用于检查软件安装情况,不过不要比较此参数值是否等于 2,而是比较是否大于等于 2。对于%pretrans 和 %posttrans,$1 的值恒为 0。
完整的参数传递如下:
%pre和%post段
当传递的第一个参数为1时,表示新安装一个rpm包。
当传递的第一个参数为2时,表示升级一个已经存在的包。
%preun和%postun段
当传递的第一个参数为0时,表示删除一个包。
当传递的第一个参数为1时,表示更新一个包。
例如:如果软件包安装了一份 info 手册,那么可以用 info 包提供的 install-info 来更新 info 手册索引。首先,我们不保证系统已安装 info 软件包,除非明确声明需要它;其次我们不想在 install-info 执行失败时,使软件包安装失败:
Requires(post): info
Requires(preun): info
...
%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi
上边的示例中还有一个安装 info 手册时的小问题需要解释一下。install-info 命令会更新 info 目录,所以我们应该在 %install 阶段删除 %{buildroot} 中无用的空目录:
rm -f %{buildroot}%{_infodir}/dir
========================这是安装prometheus =================
https://blog.csdn.net/weixin_38184741/article/details/112784282
https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/
使用的时候还需要声明依赖
对 systemd 包的依赖
如果包 scriptlet 调用其他 systemd 工具,例如systemd-tmpfiles,包应该声明适当的依赖项。该%{?systemd_requires}宏的快捷方式,需要systemd的 %pre,%post和%postun小脚本。请注意,这些依赖并不需要对 %systemd_{post,preun,postun_with_restart,user_post,user_preun} 上面列出的宏。
如果包想要使用 systemd 工具(如果它们可用),但不想声明依赖项,那么%{?systemd_ordering}宏可以用作%{?systemd_requires} 仅在 RPM 事务期间声明排序的较弱形式。
%{?systemd_requires}
%pre
getent group prometheus >/dev/null || groupadd -r prometheus
getent passwd prometheus >/dev/null || \
useradd -r -g prometheus -d %{_sharedstatedir}/prometheus -s /sbin/nologin \
-c "Prometheus services" prometheus
exit 0
%post
%systemd_post prometheus.service #这个就相当于调用了下面的postinstall scriptlet 处的shell命令
%preun
%systemd_preun prometheus.service
%postun
%systemd_postun prometheus.service
[root@master SPECS]# rpm -qp --scripts /root/rpmbuild/RPMS/x86_64/prometheus2-2.32.0-1.el7.x86_64.rpm
preinstall scriptlet (using /bin/sh):
getent group prometheus >/dev/null || groupadd -r prometheus
getent passwd prometheus >/dev/null || \
useradd -r -g prometheus -d /var/lib/prometheus -s /sbin/nologin \
-c "Prometheus services" prometheus
exit 0
postinstall scriptlet (using /bin/sh):
if [ $1 -eq 1 ] ; then
# Initial installation
systemctl preset prometheus.service >/dev/null 2>&1 || :
fi
preuninstall scriptlet (using /bin/sh):
if [ $1 -eq 0 ] ; then
# Package removal, not upgrade
systemctl --no-reload disable prometheus.service > /dev/null 2>&1 || :
systemctl stop prometheus.service > /dev/null 2>&1 || :
fi
postuninstall scriptlet (using /bin/sh):
systemctl daemon-reload >/dev/null 2>&1 || :
%changelog阶段
记录日志变更
4 rpmlint检查
为避免常见错误,请先使用 rpmlint 查找 SPEC 文件的错误:
$ rpmlint program.spec
如果返回错误/警告,使用 "-i" 选项查看更详细的信息。
也可以使用 rpmlint 测试已构建的 RPM 包,检查 SPEC/RPM/SRPM 是否存在错误。你需要在发布软件包之前,解决这些警告。此页面 提供一些常见问题的解释。如果你位于 SPEC 目录中,请执行:
$ rpmlint NAME.spec ../RPMS/*/NAME*.rpm ../SRPMS/NAME*.rpm
进入 ~/rpmbuild/RPMS 下的特定架构目录中,您会发现有许多二进制 RPM 包。使用以下命令快速查看 RPM 包含的文件和权限:
$ rpmls *.rpm
5 开始打包
spec 文件编写好以后就可以进行打包了。
在SPECS文件夹下执行命令: rpmbuild -bb xxx.spec
在RPMS文件夹下生成了RPM包,在x86_64下,表示所应用的架构,由于没有指定arch为noarch,所以默认用本机架构。在SRPMS文件夹下生产了源码包,源码包当然木有架构这一说了
可以先rpmbuild -bp
,再-bc
再 -bi
如果没问题,rpmbuild -ba
生成src包与二进制包
rpmbuild 如果出错了可以通过 不同的命令来看是在打包的那一步出了问题: -bp 执行到pre -bc 执行到 build段 -bi 执行install段 -bl 检测有文件没包含,查看%files中的文件是否存在 -ba 既生成src.rpm又生成二进制rpm -bs 只生成src的rpm -bb 只生二进制的rpm
参数 | 说明 |
---|---|
-bp | 从spec文件中读取配置,并执行至%prep阶段 |
-bc | 从spec文件中读取配置,并执行至%build阶段 |
-bi | 从spec文件中读取配置,并执行至%install阶段 |
-bl | 从spec文件中读取配置,并执行一次列表检查,查看%files中的文件是否存在 |
-ba | 从spec文件中读取配置,并生成二进制包.rpm和源代码包.src.rpm |
-bb | 从spec文件中读取配置,并生成二进制包*.rpm |
-bs | 从spec文件中读取配置,并生成源代码包*.src.rpm |
-tp | 从tar包中读取配置,并执行至%prep阶段 |
-tc | 从tar包中读取配置,并执行至%build阶段 |
-ti | 从tar包中读取配置,并执行至%install阶段 |
-ta | 从tar包中读取配置,并生成二进制包.rpm和源代码包.src.rpm |
-tb | 从tar包中读取配置,并生成二进制包*.rpm |
-ts | 从tar包中读取配置,并生成源码包*.src.rpm |
--rebuild | 针对目标源码包,进行源代码包的安装,然后执行准备,编绎,安装,并重新构建新的二进制包 |
--recompile | 针对目标源码包,进行源代码包的安装,然后执行准备,编绎,安装 |
--buildroot=DIRECTORY | 设定DIRECTORY来替换%buildroot值 |
--clean | 打包完成后清除构建树 |
--nobuild | 不进行包的实际创建 |
--nodeps | 不检查编绎条件是否满足 |
--nodirtokens | rpm v3版本的头文件兼容转换 |
--noclean | 不执行SPEC文件中的%clean阶段(即使其存在) |
--nocheck | 不执行SPEC文件中的%check阶段(即使其存在) |
--rmsource | 构建rpm包后删除源代码,也可单独使用,如rpmbuild --rmsource xxx.spec |
--rmspec | 构建rpm包后删除SPEC文件,也可单独使用,如rpmbuild --rmspec xxx.spec |
--short-circuit | 直接跳到指定阶段,只有与c或i或b连用时才有效,仅用于本地调试,生成的包将被标记为依赖关系不足 |
--target=CPU-VENDOR-OS | 强制指定运行平台 |
-D, --define='MACRO EXPR' | 指定宏定义MACRO的值为EXPR |
--undefine=MACRO | 删除指定的宏定义 |
-E, --eval='EXPR' | 从EXPR中导入宏定义信息 |
--macros= |
设定宏定义文件列表,以冒号:分隔 |
--noplugins | 不使用任何插件 |
--nodigest | 不校验包的完整性信息(MD5求和) |
--nosignature | 不校验包的签名信息 |
--rcfile= |
设定包含配置信息的文件列表,以冒号:分隔,默认读取/usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:/etc/rpmrc:~/.rpmrc这些文件 |
-r, --root=ROOT | 在编绎时设定ROOT为最高级目录,即/ |
--dbpath=DIRECTORY | RPM归档数据库的路径 |
--querytags | 显示已知的请求标签信息 |
--showrc | 显示rpmbuild的编绎环境和宏变量定义等 |
--quiet | 不输出编绎信息 |
-v, --verbose | 输出详细的编绎过程信息 |
--version | 显示rpmbuild的版本信息 |
--with= | 强制使用指定的参数 |
--without= | 禁止使用指定的参数 |
--buildpolicy= |
设定策略文档路径,比如用户手册等 |
--sign | GPG签名,已废弃,用rpmsign代替 |
-?, --help | 显示rpmbuild命令的帮助信息,如参数详细说明等 |
--usage | 显示rpmbuild命令的格式及所有参数 |
6 很多优秀的模板
https://github.com/mrsipan/prometheus-rpm
7 spec脚本常用关键字
https://blog.51cto.com/laoguang/1103628
http://hlee.iteye.com/blog/343499
http://laoguang.blog.51cto.com/6013350/1103628
最终的生成的rpm名称: %{name}-%{version}-%{relesae}-%{BuildArch}.rpm
%define debug_package %{nil} #使用rpmbuild打包时不对文件进行strip操作(http://www.ichenfu.com/2017/11/20/rpmbuild-not-strip/)
默认情况下,在使用rpmbuild打包时,会对安装的所有文件进行strip操作,去除文件的一些调试信息,并将这些调试信息放到debuginfo包中,但在很多时候,我们并不需要rpmbuild帮我们执行strip,也不需要生成debuginfo包,所以我们可以修改一下spec文件,关闭这些选项。
在spec文件中,加上%define __os_install_post %{nil},将__os_install_post设置为空,这样在打包的时候,就不会执行上面的这些操作了,也就不会对文件进行strip操作了。同样的,如果不需要生成debuginfo包,只需要再加上%define debug_package %{nil}就可以了。
%define: 预定义的变量,例如定义日志路径: %define _logpath /var/log/weblog
Name: 软件包的名称,在后面的变量中即可使用%{name}的方式引用,在~/rpmbuild/BUILDROOT/目录下会以这个名字为前缀创建安装目录
Summary: 软件包的内容
Version: 软件的实际版本号,一定要与tar包的一致哦。例如:1.12.1等,后面可使用%{version}引用
Release: 发布序列号,例如:1%{?dist},标明第几次打包,后面可使用%{release}引用
Group: 软件分组,建议使用:Applications/System
License: 软件授权方式GPLv2
Source0: 放在rpmbuild/SOURCES/下的源码包、配置文件等文件,可以带多个用Source1等源,后面也可以用%{SOURCE0}、%{SOURCE1}引用
URL: 软件的URI,发布者的网站,博客,邮箱等信息可放在这里
Conflicts: prometheus #表示防止重复安装冲突,当你已经安装了prometheus时在执行安装的会包冲突
Vendor: 打包组织或者人员
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
BuildArch: %{_arch}指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值。(https://blog.51cto.com/foolishfish/1431894)
BuildRoot: 这个是安装或编译时使用的“虚拟目录”也可以叫临时目录,即模拟安装完以后生成的文件目录:%_topdir/BUILDROOT 后面可使用$RPM_BUILD_ROOT 方式引用。默认可以不写就是这个目录下%_topdir/BUILDROOT。该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用。
Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
BuildRequires: gcc,make,gettext #制作过程中用到的软件包, gettext在国际化需要的依赖
Requires(pre): shadow-utils: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:libxxx-devel >= 1.1.1 openssl-devel 。 注意:“>=”号两边需用空格隔开,而不同软件名称也用空格分开
%description:软件的详细说明
The "Hello World" program, done with all bells and whistles of a proper FOSS
project, including configuration, build, internationalization, help files, etc.
%description -l zh_CN #(支持国际化的参数 -l zh_CN表示中文)
"Hello World" 程序, 包含 FOSS 项目所需的所有部分, 包括配置, 构建, 国际化, 帮助文件等.
%prep: #这个宏开始,这个宏的作用静默模式解压并cd,预备参数,通常为 %setup -q
%build: 编译制作阶段,主要目的就是编译-> ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/……。 #./configure 也可以用%configure来替换
%install: 安装步骤,此时需要指定安装路径,创建编译时自动生成目录,复制配置文件至所对应的目录中(这一步比较重要!)
rm -rf %{buildroot} #先删除原来的安装的,如果你不是第一次安装的话
make install DESTDIR=%{buildroot} #DESTDIR指定安装的目录,而不是真实的安装目录,%{buildroot}你应该知道是指的什么了->指的是这个目录~/rpmbuild/BUILDROOT
%pre: 安装前需要做的任务,如:创建用户
%post: 安装后需要做的任务 如:自动启动的任务
%preun: 卸载前需要做的任务 如:停止任务
%postun: 卸载后需要做的任务 如:删除用户,删除/备份业务数据
%clean: 清除上次编译生成的临时文件,就是上文提到的虚拟目录
%files: 设置文件属性,包含编译文件需要生成的目录、文件以及分配所对应的权限
%changelog: 修改历史
Group:软件包所属类别,具体类别有:
Amusements/Games (娱乐/游戏)
Amusements/Graphics(娱乐/图形)
Applications/Archiving (应用/文档)
Applications/Communications(应用/通讯)
Applications/Databases (应用/数据库)
Applications/Editors (应用/编辑器)
Applications/Emulators (应用/仿真器)
Applications/Engineering (应用/工程)
Applications/File (应用/文件)
Applications/Internet (应用/因特网)
Applications/Multimedia(应用/多媒体)
Applications/Productivity (应用/产品)
Applications/Publishing(应用/印刷)
Applications/System(应用/系统)
Applications/Text (应用/文本)
Development/Debuggers (开发/调试器)
Development/Languages (开发/语言)
Development/Libraries (开发/函数库)
Development/System (开发/系统)
Development/Tools (开发/工具)
Documentation (文档)
System Environment/Base(系统环境/基础)
System Environment/Daemons (系统环境/守护)
System Environment/Kernel (系统环境/内核)
System Environment/Libraries (系统环境/函数库)
System Environment/Shells (系统环境/接口)
User Interface/Desktops(用户界面/桌面)
User Interface/X (用户界面/X窗口)
User Interface/X Hardware Support (用户界面/X硬件支持)
8 演示,制作prometheus
1、先下载prometheus.default、prometheus.service、prometheus2.spec、prometheus-2.32.0.linux-amd64.tar.gz 这个几个文件,然后cp到对应目录下面哈
# tree ../
../
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│ ├── prometheus-2.32.0.linux-amd64.tar.gz
│ ├── prometheus.default
│ └── prometheus.service
├── SPECS
│ └── prometheus2.spec
└── SRPMS
6 directories, 4 files
[root@master SPECS]# cat prometheus2.spec
%define debug_package %{nil}
Name: prometheus2
Version: 2.32.0
Release: 1%{?dist}
Summary: The Prometheus 2.x monitoring system and time series database.
License: ASL 2.0
URL: https://prometheus.io
Conflicts: prometheus
Source0: https://github.com/prometheus/prometheus/releases/download/v%{version}/prometheus-%{version}.linux-amd64.tar.gz
Source1: prometheus.service
Source2: prometheus.default
%{?systemd_requires}
Requires(pre): shadow-utils
%description
Prometheus is a systems and service monitoring system. It collects metrics from
configured targets at given intervals, evaluates rule expressions, displays the
results, and can trigger alerts if some condition is observed to be true.
%prep
%setup -q -n prometheus-%{version}.linux-amd64
%build
/bin/true
%install
mkdir -vp %{buildroot}%{_sharedstatedir}/prometheus
install -D -m 755 prometheus %{buildroot}%{_bindir}/prometheus
install -D -m 755 promtool %{buildroot}%{_bindir}/promtool
for dir in console_libraries consoles; do
for file in ${dir}/*; do
install -D -m 644 ${file} %{buildroot}%{_datarootdir}/prometheus/${file}
done
done
install -D -m 644 prometheus.yml %{buildroot}%{_sysconfdir}/prometheus/prometheus.yml
install -D -m 644 %{SOURCE1} %{buildroot}%{_unitdir}/prometheus.service
install -D -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/default/prometheus
%pre
getent group prometheus >/dev/null || groupadd -r prometheus
getent passwd prometheus >/dev/null || \
useradd -r -g prometheus -d %{_sharedstatedir}/prometheus -s /sbin/nologin \
-c "Prometheus services" prometheus
exit 0
%post
%systemd_post prometheus.service
%preun
%systemd_preun prometheus.service
%postun
%systemd_postun prometheus.service
%files
%defattr(-,root,root,-)
%{_bindir}/prometheus
%{_bindir}/promtool
%config(noreplace) %{_sysconfdir}/prometheus/prometheus.yml
%{_datarootdir}/prometheus
%{_unitdir}/prometheus.service
%config(noreplace) %{_sysconfdir}/default/prometheus
%dir %attr(755, prometheus, prometheus)%{_sharedstatedir}/prometheus
[root@master SOURCES]# cat prometheus.default
PROMETHEUS_OPTS='--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/data'
[root@master SOURCES]# cat prometheus.service
# -*- mode: conf -*-
[Unit]
Description=The Prometheus 2 monitoring system and time series database.
Documentation=https://prometheus.io
After=network.target
[Service]
EnvironmentFile=-/etc/default/prometheus
User=prometheus
ExecStart=/usr/bin/prometheus \
--web.console.libraries=/usr/share/prometheus/console_libraries \
--web.console.templates=/usr/share/prometheus/consoles \
$PROMETHEUS_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=5s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
第二步:执行解压(把/root/rpmbuild/SOURCES/里的源码包解压到root/rpmbuild/BUILD)
%prep
%setup -q -n prometheus-%{version}.linux-amd64
[root@master ~]# cd /root/rpmbuild/SPECS/
[root@master SPECS]# rpmbuild -bp prometheus2.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Sw1qrn
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf prometheus-2.32.0.linux-amd64
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/prometheus-2.32.0.linux-amd64.tar.gz
+ /usr/bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd prometheus-2.32.0.linux-amd64
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
##查看结果
[root@master ~]# tree rpmbuild/
rpmbuild/
├── BUILD
│ └── prometheus-2.32.0.linux-amd64
│ ├── console_libraries
│ │ ├── menu.lib
│ │ └── prom.lib
│ ├── consoles
│ │ ├── index.html.example
│ │ ├── node-cpu.html
│ │ ├── node-disk.html
│ │ ├── node.html
│ │ ├── node-overview.html
│ │ ├── prometheus.html
│ │ └── prometheus-overview.html
│ ├── LICENSE
│ ├── NOTICE
│ ├── prometheus
│ ├── prometheus.yml
│ └── promtool
├── BUILDROOT
├── RPMS
├── SOURCES
│ ├── prometheus-2.32.0.linux-amd64.tar.gz
│ ├── prometheus.default
│ └── prometheus.service
├── SPECS
│ └── prometheus2.spec
└── SRPMS
9 directories, 18 files
第三步:编译(这里我们是下载的二进制包,不需要编译,忽略此步骤)
%build
/bin/true
[root@master SPECS]# rpmbuild -bc prometheus2.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.T41Lno
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf prometheus-2.32.0.linux-amd64
+ /usr/bin/tar -xf -
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/prometheus-2.32.0.linux-amd64.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd prometheus-2.32.0.linux-amd64
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.bs6AvK
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd prometheus-2.32.0.linux-amd64
+ /bin/true #执行了%build阶段的命令
+ exit 0 #返回结果为真
第四步:安装(根据%install一一执行,相当于把/root/rpmbuild/BUILD/里的文件按照%install里面指定的命令复制到root/rpmbuild/BUILDROOT)
%install
mkdir -vp %{buildroot}%{_sharedstatedir}/prometheus
install -D -m 755 prometheus %{buildroot}%{_bindir}/prometheus
install -D -m 755 promtool %{buildroot}%{_bindir}/promtool
for dir in console_libraries consoles; do
for file in ${dir}/*; do
install -D -m 644 ${file} %{buildroot}%{_datarootdir}/prometheus/${file}
done
done
install -D -m 644 prometheus.yml %{buildroot}%{_sysconfdir}/prometheus/prometheus.yml
install -D -m 644 %{SOURCE1} %{buildroot}%{_unitdir}/prometheus.service
install -D -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/default/prometheus
[root@master SPECS]# rpmbuild -bi prometheus2.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.7VMYor
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf prometheus-2.32.0.linux-amd64
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/prometheus-2.32.0.linux-amd64.tar.gz
+ /usr/bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd prometheus-2.32.0.linux-amd64
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.dCmFGV
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd prometheus-2.32.0.linux-amd64
+ /bin/true
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.3eXJlq
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
++ dirname /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
+ cd prometheus-2.32.0.linux-amd64
+ mkdir -vp /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/var/lib/prometheus
mkdir: created directory '/root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/var'
mkdir: created directory '/root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/var/lib'
mkdir: created directory '/root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/var/lib/prometheus'
+ install -D -m 755 prometheus /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/bin/prometheus
+ install -D -m 755 promtool /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/bin/promtool
+ for dir in console_libraries consoles
+ for file in '${dir}/*'
+ install -D -m 644 console_libraries/menu.lib /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/console_libraries/menu.lib
+ for file in '${dir}/*'
+ install -D -m 644 console_libraries/prom.lib /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/console_libraries/prom.lib
+ for dir in console_libraries consoles
+ for file in '${dir}/*'
+ install -D -m 644 consoles/index.html.example /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/index.html.example
+ for file in '${dir}/*'
+ install -D -m 644 consoles/node-cpu.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/node-cpu.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/node-disk.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/node-disk.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/node-overview.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/node-overview.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/node.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/node.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/prometheus-overview.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/prometheus-overview.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/prometheus.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/prometheus.html
+ install -D -m 644 prometheus.yml /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/etc/prometheus/prometheus.yml
+ install -D -m 644 /root/rpmbuild/SOURCES/prometheus.service /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/lib/systemd/system/prometheus.service
+ install -D -m 644 /root/rpmbuild/SOURCES/prometheus.default /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/etc/default/prometheus
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: prometheus2-2.32.0-1.el7.x86_64
Provides: config(prometheus2) = 2.32.0-1.el7 prometheus2 = 2.32.0-1.el7 prometheus2(x86-64) = 2.32.0-1.el7
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(pre): /bin/sh shadow-utils
Requires(post): /bin/sh systemd
Requires(preun): /bin/sh systemd
Requires(postun): /bin/sh systemd
Conflicts: prometheus
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
##查看结果
[root@master ~]# tree rpmbuild/
rpmbuild/
├── BUILD
│ └── prometheus-2.32.0.linux-amd64
│ ├── console_libraries
│ │ ├── menu.lib
│ │ └── prom.lib
│ ├── consoles
│ │ ├── index.html.example
│ │ ├── node-cpu.html
│ │ ├── node-disk.html
│ │ ├── node.html
│ │ ├── node-overview.html
│ │ ├── prometheus.html
│ │ └── prometheus-overview.html
│ ├── LICENSE
│ ├── NOTICE
│ ├── prometheus
│ ├── prometheus.yml
│ └── promtool
├── BUILDROOT
│ └── prometheus2-2.32.0-1.el7.x86_64
│ ├── etc
│ │ ├── default
│ │ │ └── prometheus
│ │ └── prometheus
│ │ └── prometheus.yml
│ ├── usr
│ │ ├── bin
│ │ │ ├── prometheus
│ │ │ └── promtool
│ │ ├── lib
│ │ │ └── systemd
│ │ │ └── system
│ │ │ └── prometheus.service
│ │ └── share
│ │ └── prometheus
│ │ ├── console_libraries
│ │ │ ├── menu.lib
│ │ │ └── prom.lib
│ │ └── consoles
│ │ ├── index.html.example
│ │ ├── node-cpu.html
│ │ ├── node-disk.html
│ │ ├── node.html
│ │ ├── node-overview.html
│ │ ├── prometheus.html
│ │ └── prometheus-overview.html
│ └── var
│ └── lib
│ └── prometheus
├── RPMS
├── SOURCES
│ ├── prometheus-2.32.0.linux-amd64.tar.gz
│ ├── prometheus.default
│ └── prometheus.service
├── SPECS
│ └── prometheus2.spec
└── SRPMS
25 directories, 32 files
第五步:%files步骤检测,检测一下所以文件是否包含正确
%files
%defattr(-,root,root,-)
%{_bindir}/prometheus
%{_bindir}/promtool
%config(noreplace) %{_sysconfdir}/prometheus/prometheus.yml
%{_datarootdir}/prometheus
%{_unitdir}/prometheus.service
%config(noreplace) %{_sysconfdir}/default/prometheus
%dir %attr(755, prometheus, prometheus)%{_sharedstatedir}/prometheus
[root@master SPECS]# rpmbuild -bl prometheus2.spec
Processing files: prometheus2-2.32.0-1.el7.x86_64
Provides: config(prometheus2) = 2.32.0-1.el7 prometheus2 = 2.32.0-1.el7 prometheus2(x86-64) = 2.32.0-1.el7
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(pre): /bin/sh shadow-utils
Requires(post): /bin/sh systemd
Requires(preun): /bin/sh systemd
Requires(postun): /bin/sh systemd
Conflicts: prometheus
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
[root@master SPECS]# echo $?
0
第六步:正在的开始打成rpm包
[root@master SPECS]# rpmbuild -bb prometheus2.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.CNNBhL
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf prometheus-2.32.0.linux-amd64
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/prometheus-2.32.0.linux-amd64.tar.gz
+ /usr/bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd prometheus-2.32.0.linux-amd64
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.Q98RCG
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd prometheus-2.32.0.linux-amd64
+ /bin/true
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.2WnLkC
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
++ dirname /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
+ cd prometheus-2.32.0.linux-amd64
+ mkdir -vp /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/var/lib/prometheus
mkdir: created directory '/root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/var'
mkdir: created directory '/root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/var/lib'
mkdir: created directory '/root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/var/lib/prometheus'
+ install -D -m 755 prometheus /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/bin/prometheus
+ install -D -m 755 promtool /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/bin/promtool
+ for dir in console_libraries consoles
+ for file in '${dir}/*'
+ install -D -m 644 console_libraries/menu.lib /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/console_libraries/menu.lib
+ for file in '${dir}/*'
+ install -D -m 644 console_libraries/prom.lib /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/console_libraries/prom.lib
+ for dir in console_libraries consoles
+ for file in '${dir}/*'
+ install -D -m 644 consoles/index.html.example /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/index.html.example
+ for file in '${dir}/*'
+ install -D -m 644 consoles/node-cpu.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/node-cpu.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/node-disk.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/node-disk.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/node-overview.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/node-overview.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/node.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/node.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/prometheus-overview.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/prometheus-overview.html
+ for file in '${dir}/*'
+ install -D -m 644 consoles/prometheus.html /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/share/prometheus/consoles/prometheus.html
+ install -D -m 644 prometheus.yml /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/etc/prometheus/prometheus.yml
+ install -D -m 644 /root/rpmbuild/SOURCES/prometheus.service /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/usr/lib/systemd/system/prometheus.service
+ install -D -m 644 /root/rpmbuild/SOURCES/prometheus.default /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64/etc/default/prometheus
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: prometheus2-2.32.0-1.el7.x86_64
Provides: config(prometheus2) = 2.32.0-1.el7 prometheus2 = 2.32.0-1.el7 prometheus2(x86-64) = 2.32.0-1.el7
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(pre): /bin/sh shadow-utils
Requires(post): /bin/sh systemd
Requires(preun): /bin/sh systemd
Requires(postun): /bin/sh systemd
Conflicts: prometheus
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64
Wrote: /root/rpmbuild/RPMS/x86_64/prometheus2-2.32.0-1.el7.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.gohonx
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd prometheus-2.32.0.linux-amd64
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/prometheus2-2.32.0-1.el7.x86_64 #自动删除BUILDROOT下面的文件。
+ exit 0
##查看结果
[root@master ~]# tree rpmbuild/
rpmbuild/
├── BUILD
│ └── prometheus-2.32.0.linux-amd64
│ ├── console_libraries
│ │ ├── menu.lib
│ │ └── prom.lib
│ ├── consoles
│ │ ├── index.html.example
│ │ ├── node-cpu.html
│ │ ├── node-disk.html
│ │ ├── node.html
│ │ ├── node-overview.html
│ │ ├── prometheus.html
│ │ └── prometheus-overview.html
│ ├── LICENSE
│ ├── NOTICE
│ ├── prometheus
│ ├── prometheus.yml
│ └── promtool
├── BUILDROOT
├── RPMS
│ └── x86_64
│ └── prometheus2-2.32.0-1.el7.x86_64.rpm
├── SOURCES
│ ├── prometheus-2.32.0.linux-amd64.tar.gz
│ ├── prometheus.default
│ └── prometheus.service
├── SPECS
│ └── prometheus2.spec
└── SRPMS
10 directories, 19 files
#测试打包好的rpm包是否可用
# rpm -qp /root/rpmbuild/RPMS/x86_64/prometheus2-2.32.0-1.el7.x86_64.rpm
prometheus2-2.32.0-1.el7.x86_64
[root@master ~]# rpm -qpl /root/rpmbuild/RPMS/x86_64/prometheus2-2.32.0-1.el7.x86_64.rpm
/etc/default/prometheus
/etc/prometheus/prometheus.yml
/usr/bin/prometheus
/usr/bin/promtool
/usr/lib/systemd/system/prometheus.service
/usr/share/prometheus
/usr/share/prometheus/console_libraries
/usr/share/prometheus/console_libraries/menu.lib
/usr/share/prometheus/console_libraries/prom.lib
/usr/share/prometheus/consoles
/usr/share/prometheus/consoles/index.html.example
/usr/share/prometheus/consoles/node-cpu.html
/usr/share/prometheus/consoles/node-disk.html
/usr/share/prometheus/consoles/node-overview.html
/usr/share/prometheus/consoles/node.html
/usr/share/prometheus/consoles/prometheus-overview.html
/usr/share/prometheus/consoles/prometheus.html
/var/lib/prometheus
[root@master ~]# rpm -qp --scripts /root/rpmbuild/RPMS/x86_64/prometheus2-2.32.0-1.el7.x86_64.rpm
preinstall scriptlet (using /bin/sh):
getent group prometheus >/dev/null || groupadd -r prometheus
getent passwd prometheus >/dev/null || \
useradd -r -g prometheus -d /var/lib/prometheus -s /sbin/nologin \
-c "Prometheus services" prometheus
exit 0
postinstall scriptlet (using /bin/sh):
if [ $1 -eq 1 ] ; then
# Initial installation
systemctl preset prometheus.service >/dev/null 2>&1 || :
fi
preuninstall scriptlet (using /bin/sh):
if [ $1 -eq 0 ] ; then
# Package removal, not upgrade
systemctl --no-reload disable prometheus.service > /dev/null 2>&1 || :
systemctl stop prometheus.service > /dev/null 2>&1 || :
fi
postuninstall scriptlet (using /bin/sh):
systemctl daemon-reload >/dev/null 2>&1 || :
[root@master ~]# rpm -ivh --test /root/rpmbuild/RPMS/x86_64/prometheus2-2.32.0-1.el7.x86_64.rpm
Preparing... ################################# [100%]
[root@master ~]# rpm -ivh --test /root/rpmbuild/RPMS/x86_64/prometheus2-2.32.0-1.el7.x86_64.rpm
Preparing... ################################# [100%]
[root@master ~]# rpm -ql prometheus2-2.32.0-1.el7.x86_64
/etc/default/prometheus
/etc/prometheus/prometheus.yml
/usr/bin/prometheus
/usr/bin/promtool
/usr/lib/systemd/system/prometheus.service
/usr/share/prometheus
/usr/share/prometheus/console_libraries
/usr/share/prometheus/console_libraries/menu.lib
/usr/share/prometheus/console_libraries/prom.lib
/usr/share/prometheus/consoles
/usr/share/prometheus/consoles/index.html.example
/usr/share/prometheus/consoles/node-cpu.html
/usr/share/prometheus/consoles/node-disk.html
/usr/share/prometheus/consoles/node-overview.html
/usr/share/prometheus/consoles/node.html
/usr/share/prometheus/consoles/prometheus-overview.html
/usr/share/prometheus/consoles/prometheus.html
/var/lib/prometheus
[root@master ~]# rpm -qi prometheus2 #这些信息在/root/rpmbuild/SPECS/prometheus2.spec这个文件里内容是一一对应的哈
Name : prometheus2
Version : 2.32.0
Release : 1.el7
Architecture: x86_64
Install Date: Thu 16 Dec 2021 10:48:03 PM CST
Group : Unspecified
Size : 166129421
License : ASL 2.0
Signature : (none)
Source RPM : prometheus2-2.32.0-1.el7.src.rpm
Build Date : Thu 16 Dec 2021 06:14:56 PM CST
Build Host : master
Relocations : (not relocatable)
URL : https://prometheus.io
Summary : The Prometheus 2.x monitoring system and time series database.
Description :
Prometheus is a systems and service monitoring system. It collects metrics from
configured targets at given intervals, evaluates rule expressions, displays the
results, and can trigger alerts if some condition is observed to be true.
[root@master ~]# id prometheus #安装的用户
uid=994(prometheus) gid=990(prometheus) groups=990(prometheus)
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl status prometheus
● prometheus.service - The Prometheus 2 monitoring system and time series database.
Loaded: loaded (/usr/lib/systemd/system/prometheus.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: https://prometheus.io
[root@master ~]# systemctl start prometheus
[root@master ~]# systemctl status prometheus #成功启动
● prometheus.service - The Prometheus 2 monitoring system and time series database.
Loaded: loaded (/usr/lib/systemd/system/prometheus.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2021-12-16 23:02:48 CST; 5s ago
Docs: https://prometheus.io
Main PID: 30240 (prometheus)
Tasks: 7
Memory: 23.3M
CGroup: /system.slice/prometheus.service
└─30240 /usr/bin/prometheus --web.console.libraries=/usr/share/prometheus/console_libraries --web.console.templates=/usr/share/prome...
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.242Z caller=head.go:488 level=info component=tsdb msg="Replaying on-di... if any"
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.244Z caller=head.go:522 level=info component=tsdb msg="On-disk memory …n=26.307µs
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.246Z caller=head.go:528 level=info component=tsdb msg="Replaying WAL, ...a while"
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.253Z caller=head.go:599 level=info component=tsdb msg="WAL segment loa...egment=0
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.253Z caller=head.go:605 level=info component=tsdb msg="WAL replay comp…9.060302ms
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.255Z caller=main.go:945 level=info fs_type=XFS_SUPER_MAGIC
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.255Z caller=main.go:948 level=info msg="TSDB started"
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.256Z caller=main.go:1129 level=info msg="Loading configuration file" f...heus.yml
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.258Z caller=main.go:1166 level=info msg="Completed loading of configuration fi…µs
Dec 16 23:02:49 master prometheus[30240]: ts=2021-12-16T15:02:49.258Z caller=main.go:897 level=info msg="Server is ready to receive web requests."
Hint: Some lines were ellipsized, use -l to show in full.
[root@master ~]# netstat -nutlp | grep 9090 #默认监听9090端口
tcp6 0 0 :::9090 :::* LISTEN 30240/prometheus
[root@master ~]# systemctl stop prometheus #停止
[root@master ~]# systemctl status prometheus
● prometheus.service - The Prometheus 2 monitoring system and time series database.
Loaded: loaded (/usr/lib/systemd/system/prometheus.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: https://prometheus.io
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.787Z caller=main.go:776 level=warn msg="Received SIGTERM, exiting gracefully..."
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.787Z caller=main.go:799 level=info msg="Stopping scrape discovery manager..."
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.787Z caller=main.go:813 level=info msg="Stopping notify discovery manager..."
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.787Z caller=main.go:835 level=info msg="Stopping scrape manager..."
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.787Z caller=main.go:795 level=info msg="Scrape discovery manager stopped"
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.787Z caller=main.go:809 level=info msg="Notify discovery manager stopped"
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.787Z caller=manager.go:945 level=info component="rule manager" msg="St...ager..."
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.787Z caller=manager.go:955 level=info component="rule manager" msg="Ru...stopped"
Dec 16 23:11:39 master prometheus[30240]: ts=2021-12-16T15:11:39.789Z caller=main.go:829 level=info msg="Scrape manager stopped"
Dec 16 23:11:39 master systemd[1]: Stopped The Prometheus 2 monitoring system and time series database..
Hint: Some lines were ellipsized, use -l to show in full
[root@master ~]# rpm -e prometheus2
[root@master ~]# rpm -qa prometheus2 #成功卸载
## 相关文件已删除
[root@master ~]# ll /usr/lib/systemd/system/prometheus.service
ls: cannot access /usr/lib/systemd/system/prometheus.service: No such file or directory
[root@master ~]# ll /usr/share/prometheus/
ls: cannot access /usr/share/prometheus/: No such file or directory
[root@master ~]# ll /etc/default/prometheus
ls: cannot access /etc/default/prometheus: No such file or directory
[root@master ~]# ll /etc/prometheus/prometheus.yml
ls: cannot access /etc/prometheus/prometheus.yml: No such file or directory
[root@master ~]# id prometheus #用户没有删除
uid=994(prometheus) gid=990(prometheus) groups=990(prometheus)
# ll /var/lib/prometheus/data/ #数据目录没有删除
total 16
drwxr-xr-x 2 prometheus prometheus 6 Dec 16 23:02 chunks_head
-rw-r--r-- 1 prometheus prometheus 20001 Dec 16 23:11 queries.active
drwxr-xr-x 2 prometheus prometheus 22 Dec 16 23:02 wal
9 演示,制作hello
https://blog.csdn.net/qq_16542775/article/details/80961213
https://blog.csdn.net/get_set/article/details/53453320
wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz #下载后放到rpmbuild/SOURCES/下面
[root@master SPECS]# cat hell.spec
Name: hello
Version: 2.10
Release: 1%{?dist}
Group: Applications/System
Summary: The "Hello World" program from GUN
License: GPLv3+
URL: http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
#Conflicts: hello
Source0: %{name}/%{name}-%{version}.tar.gz
BuildArch: %{_arch}
BuildRequires: gettext
Requires(post): info
Requires(preun): info
%description
The "Hello World" program, done with all bells and whistles of a proper FOSS
project, including configuration, build, internationalization, help files, etc.
%description -l zh_CN
Hello World" 程序, 包含 FOSS 项目所需的所有部分, 包括配置, 构建, 国际化, 帮助文件等.
%prep
rm -rf %{_builddir}/%{name}-%{version}
%setup -q
%build
%configure
make %{?_smp_mflags}
%install
rm -rf %{buildroot}/
%makeinstall
#make install DESTDIR=%{buildroot}
%find_lang %{name}
rm -f %{buildroot}/%{_infodir}/dir
%pre
%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi
%postun
%clean
#清理/root/rpmbuild/BUILDROOT目录下的文件。清理这个文件不能斜杠星(xx/*这个无法删除的哈)
rm -rf %{buildroot}/
#清理/root/rpmbuild/BUILD目录下的文件
rm -rf %{_builddir}/*
%files -f %{name}.lang
%doc AUTHORS ChangeLog NEWS README THANKS TODO
%license COPYING
%{_mandir}/man1/hello.1.*
%{_infodir}/hello.info.*
%{_bindir}/hello
%changelog
* Sun Dec 4 2021 Your Name <youremail@xxx.xxx> - 2.10-1
- Update to 2.10
10 演示, 制作java的rpm包
[root@master SPECS]# cat idaas-gw.spec
%define debug_package %{nil}
%define _installdir /opt/idaas
Name: idaas-gw
Version: latest
Release: 1%{?dist}
Summary: idaas-gw service
License: ASL 2.0
URL: https://blog.gobgm.com
Conflicts: idaas-gw
Group: Applications/System
Source0: idaas.zip
%{?systemd_requires}
Requires(pre): shadow-utils
%description
%prep
rm -rf %{_builddir}/*
rm -rf %{buildroot}
%setup -q -n idaas
%build
/bin/true
%install
rm -rf %{buildroot}
mkdir -pv %{buildroot}%{_installdir}
cp -f control-all.sh dm_svc.conf %{buildroot}%{_installdir}
cp -rf idaas-gw %{buildroot}%{_installdir}
%pre
%post
test -f /opt/idaas/idaas-gw/idaas-gw.service && \cp /opt/idaas/idaas-gw/idaas-gw.service /usr/lib/systemd/system/ || :
%systemd_post idaas-gw.service
%preun
%systemd_preun idaas-gw.service
%postun
test -f /usr/lib/systemd/system/idaas-gw.service && \rm -f /usr/lib/systemd/system/idaas-gw.service || :
%systemd_postun idaas-gw.service
%clean
#清理/root/rpmbuild/BUILDROOT目录下的文件。清理这个文件不能斜杠星(xx/*这个无法删除的哈)
#rm -rf %{buildroot}/
#清理/root/rpmbuild/BUILD目录下的文件
#rm -rf %{_builddir}/*
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
#rm -rf $RPM_BUILD_DIR/%{name}-%{version}.linux-amd64
rm -rf %{_builddir}/*
%files
%defattr(-,root,root,-)
%{_installdir}/*
%dir %attr(755, root, root) %{_installdir}
利用fpm制定rpm包
参考:
https://www.cnblogs.com/kaishirenshi/p/9780156.html
https://blog.oldboyedu.com/autodeploy-rpm/
第一步:安装fpm
看redis数据迁移章节(依赖ruby环境)
4.1 fpm 常用参数说明
-s 指定源类型
-t 指定目标类型,即想要制作成什么包(rpm等)
-n 指定包的名字
-v 指定包的版本号
-C 指定打包的相对路径 Change directory to here before searching forfiles
-d 指定依赖于哪些包
-a 指定rpm适用的服务器架构(-a all 表示noarch,适用所有平台、-a aarch64 表示适用与aarch64的服务器、-a x86_64 表示适用与x86_64的服务器)
-f 第二次打包时目录下如果有同名安装包存在,则覆盖它
-p 输出的安装包的目录,不想放在当前目录下就需要指定
--post-install 软件包安装完成之后所要运行的脚本;同--after-install
--pre-install 软件包安装完成之前所要运行的脚本;同--before-install
--post-uninstall 软件包卸载完成之后所要运行的脚本;同--after-remove
--pre-uninstall 软件包卸载完成之前所要运行的脚本;同--before-remove
--description DESCRIPTION 软件包描述信息,默认无
支持的源类型包:
dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包
rpm: 对rpm进行转换
gem: 对rubygem包进行转换
python: 将Python模块打包成相应的类型
支持的目标类型包:
rpm: 转换为rpm包
deb: 转换为deb包
solaris: 转换为solaris包
puppet: 转换为puppet包
原文链接:https://blog.csdn.net/zyhse/article/details/111356756
第二步:进行打包
制作nginx-1.12.2的rpm包
4.2.1 本地编译安装nginx-1.12.2
mkdir -p /service/{tools,scripts}
mkdir /application
cd /service/tools
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar zxvf nginx-1.12.2.tar.gz
yum install gcc gcc-c++ glibc pcre-devel zlib-devel openssl-devel -y
cd nginx-1.12.2
./configure --prefix=/application/nginx-1.12.2 --pid-path=/var/run/nginx.pid --user=nginx --group=nginx --with-http_ssl_module
make && make install
grep nginx /etc/group &> /dev/null || groupadd -r nginx
id nginx &> /dev/null || useradd -r -M -g nginx -c "create-time is `date +%Y/%m/%d` ;is web service" -s /sbin/nologin nginx
ln -sf /application/nginx-1.12.2 /application/nginx
ln -sf /application/nginx/sbin/nginx /usr/bin/
4.2.2 编写脚本
安装后脚本:
cd /service/scripts/
# cat nginx_rpm.sh
#!/bin/bash
grep nginx /etc/group &> /dev/null || groupadd -r nginx
id nginx &> /dev/null || useradd -r -M -g nginx -c "create-time is `date +%Y/%m/%d` ;is web service" -s /sbin/nologin nginx
ln -svf /application/nginx-1.12.2 /application/nginx
ln -svf /application/nginx/sbin/nginx /usr/bin/
卸载后脚本:
# cat nginx_remove.sh
#!/usr/bin
pkill nginx -9 || nginx -s stop
id nginx &> /dev/null && userdel -f nginx
grep nginx /etc/group &> /dev/null && groupdel nginx
test -f /usr/bin/nginx && rm -fr /usr/bin/nginx
test -d /application/ && rm -fr /application/
4.2.3 打包
#打包之前需要安装rpmbuild工具才能使用fpm进行打包,当然也可以直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上.当然,根据不同的软件构建过程,还需要其他的编译打包工具,比如C语言的make、gcc,python的setuptools等,根据需要安装即可。
yum install rpm-build -y
#切换到打包的目录下
cd /application/nginx-1.12.2
#开始打包
fpm -s dir -t rpm -n nginx -v 1.12.2 -d 'pcre-devel,openssl-devel' --post-install /service/scripts/nginx_rpm.sh --post-uninstall /service/scripts/nginx_remove.sh -f -p /opt/ /application/nginx-1.12.2/
#查看打包后rpm
ls /opt/nginx-1.12.2-1.x86_64.rpm
rpm -qpl /opt/nginx-1.12.2-1.x86_64.rpm
rpm -qpi /opt/nginx-1.12.2-1.x86_64.rpm
#查看rpm包中的脚本
rpm -qp --scripts /opt/nginx-1.12.2-1.x86_64.rpm
第三步:安装与卸载
rpm -ivh --test /opt/nginx-1.12.2-1.x86_64.rpm
rpm -ivh /opt/nginx-1.12.2-1.x86_64.rpm
rpm -e /opt/nginx-1.12.2-1
centos-release-scl 多版本软件共存
原文链接:https://blog.csdn.net/Mr_FenKuan/article/details/111072880
SCL is not available for i686 platform, only for x86_64
作用:CentOS7 gcc版本为4.8.5,Red Hat为了软件的稳定和版本支持,yum安装的版本也是4.8.5,所以无法使用yum的方式进行gcc的软件升级,所以使用scl。
scl:SoftwareCollections)软件集,是为了给RHEL/CentOS用户提供一种以方便,安全地安装、使用应用程序和运行时环境的多个版本方式,同时避免吧系统搞乱。
通过yum安装centos-release-scl
# 安装
yum install centos-release-scl -y
使用Centos-release-scl
scl -h 或 scl --help
列出scl有哪些源可以使用
列出scl有哪些源可以使用
yum list all --enablerepo='centos-sclo-rh'
# 查看scl中gcc版本
yum list all --enablerepo='centos-sclo-rh' | grep gcc
## 返回结果
devtoolset-9-gcc.x86_64 9.3.1-2.el7 centos-sclo-rh
………………………………
使用centos-release-scl安装更高版本的gcc,其他版本同理
yum install devtoolset-9-gcc #软件安装在该目录下 # ll /opt/rh/
scl -l 或 scl --list #查看从 SCL 中安装的包的列表
[root@localhost ~]# scl -l
devtoolset-9
切换版本(切换版本后,退出bash或系统重启,将回到系统原本的版本)
关键字:scl enable 要切换的软件 bash
# 切换gcc版本,将gcc切换成gcc9,使用scl创建一个scl包的bash会话
scl enable devtoolset-9 bash
[root@localhost ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-9/root/usr --mandir=/opt/rh/devtoolset-9/root/usr/share/man --infodir=/opt/rh/devtoolset-9/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --with-default-libstdcxx-abi=gcc4-compatible --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-9.3.1-20200408/obj-x86_64-redhat-linux/isl-install --disable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC)
退出当前版本,关键字:exit
[root@localhost ~]# exit
scl其他常用的命令
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。