软件包介绍
开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软件。用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具dpkg也就应运而生,可用来管理deb后缀的"包"文件。从而著名的“package”概念第一次出现在GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统
软件包中的文件分类
- 二进制文件
- 库文件
- 配置文件
- 帮助文件
范例:利用cpio工具查看包文件列表
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
程序包管理器
软件包管理器功能:
将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
主流的程序包管理器
- redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
- debian:deb文件, dpkg 包管理器
包命名
源代码打包文件命名:
name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
范例:Linux 最新内核的C源码的行数
[root@centos8 ~]#tar xvf linux-5.7.2.tar.xz
[root@centos8 ~]#cd linux-5.7.2/
[root@centos8 linux-5.7.2]#for file in `find -name "*.c"`;do line=`cat $file|wc -l`;let sum+=line;done;echo $sum
19517994
[root@centos8 linux-5.7.2]#cat `find -name "*.c"` |wc -l
19517994
[root@centos8 linux-5.7.2]#find -name "*.c" | xargs cat |wc -l
19517994
常见的arch:
- x86: i386, i486, i586, i686
- x86_64: x64, x86_64, amd64
- powerpc: ppc
- 跟平台无关:noarch
范例:
bash-3.2-32.el5_9.1.i386.rpm
bash-4.2.46-19.el7.x86_64.rpm
bash-4.4.19-7.el8.x86_64.rpm
bash-4.4.19-7.el8.aarch64.rpm
bash-4.4.19-7.el8.ppc64le.rpm
bc_1.07.1-2_amd64.deb
bc_1.07.1-2_s390x.deb
范例:统计rpm的架构类型及相应的包数量
[19:55:26 root@centos8 Packages]#ls | grep -Eo '[^.]+\.rpm$' |grep -Eo '^[^.]+' |sort |uniq -c
389 i686
208 noarch
1060 x86_64
[19:57:56 root@centos8 Packages]#ls | rev | cut -d. -f2 |rev |sort |uniq -c |sort -nr |head -3
1060 x86_64
389 i686
208 noarch
[19:59:59 root@centos8 Packages]#ls | grep -Eo '[^.]+\.rpm$' | cut -d. -f1 |sort |uniq -c
389 i686
208 noarch
1060 x86_64
分类和拆包
软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中。
包的分类
- Application-VERSION-ARCH.rpm: 主包
- Application-devel-VERSION-ARCH.rpm 开发子包
- Application-utils-VERSION-ARHC.rpm 其它子包
- Application-libs-VERSION-ARHC.rpm 其它子包
包的依赖
软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包安装软件包时,会因为缺少依赖的包,而导致安装包失败
解决依赖包管理工具:
- yum:包管理器的前端工具
- dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替
- yumapt:deb包管理器前端工具
- zypper:suse上的rpm前端管理工具
程序包管理器相关文件
1.包文件组成 (每个包独有)
- 包内的文件
- 元数据,如:包的名称,版本,依赖性,描述等
- 可能会有包安装或卸载时运行的脚本
2.数据库(公共):/var/lib/rpm
- 程序包名称及版本
- 依赖关系
- 功能说明包
- 安装后生成的各文件路径及校验码信息
获取程序包的途径
软件包需要事先将源码进行编译后打包形成,获取包的途径如下:
系统发版的光盘或官方网站
CentOS镜像:
https://www.centos.org/download/
https://mirrors.huaweicloud.com/
https://mirror.tuna.tsinghua.edu.cn/
Ubuntu 镜像:
http://cdimage.ubuntu.com/releases/
http://releases.ubuntu.com2.1.7.2
第三方组织提供
-
Fedora-EPEL:Extra Packages for Enterprise Linux
https://fedoraproject.org/wiki/EPEL
https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.3bc47dfaZpesAr
Rpmforge:官网:http://repoforge.org/, RHEL推荐,包很全,即将关闭
Community Enterprise Linux Repository:http://www.elrepo.org,支持最新的内核和硬件相关包
软件项目官方站点
http://yum.mariadb.org/10.4/centos8-amd64/rpms/
http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/2.1.7.4
搜索引擎
注意:第三方包建议要检查其合法性,来源合法性,程序包的完整性
自己制作
将源码文件,利用工具,如:rpmbuild,fpm等工具制作成rpm包文件
包管理器rpm
CentOS系统上使用rpm命令管理程序包
功能:
安装、卸载、升级、查询、校验、数据库维护
安装
格式
rpm {-i|--install} [install-options] PACKAGE_FILE...
选项
-i 安装软件包
-v: 详细心思
-vv: 更详细的信息
-h: 以#显示程序包管理执行进度
-q 查询软件是否安装,支持通配符
-e 卸载软件包
常用组合
rpm -ivh PACKAGE_FILE ...
rpm包安装[install-options]
--test: 测试安装,但不真正执行安装,即dry run模式
--nodeps:忽略依赖关系
--replacepkgs | replacefiles 覆盖原有的包
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
%pre: 安装前脚本--nopre
%post: 安装后脚本--nopost
%preun: 卸载前脚本 --nopreun
%postun: 卸载后脚本--nopostun
升级和降级
rpm包升级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
对应选项:
upgrade:安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”,如果不存在旧版程序包,则不执行升级操作
--oldpackage:降级
--force: 强制安装
常用组合
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
升级注意项:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留
包查询
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的程序包文件做查询操作
[query-options]
--changelog:查询rpm包的changelog
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本
#和CAPABILITY相关
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
--provides:列出指定程序包所提供的CAPABILITY
-R:查询指定的程序包所依赖的CAPABILITY
常用查询语法
-qa 查看所有安装包
-q PACKAGE
-qi PACKAGE 查看程序包的详细信息
-qc PACKAGE
-ql PACKAGE 查看程序包安装后生成的所有文件
-qd PACKAGE
-q --scripts PACKAGE
-qf FILE 查看指定文件由哪个程序包安装生成
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE, ...
包卸载
格式
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
注意:当包卸载时,对应的配置文件不会删除,以FILENAME.rpmsave形式保留
范例:强行删除rpm包,并恢复
[root@centos7 ~]#rpm -e rpm --nodeps
#重启进入rescue模式
#mkdir /mnt/cdrom
#mount /dev/sr0 /mnt/cdrom
#rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.el7.x86_64.rpm --root=/mnt/sysimage
#reboot
包校验
在安装包时,系统也会检查包的来源是否是合法的
检查包的完整性和签名
rpm -K|--checksig rpmfile
在检查包的来源和完整性前,必须导入所需要公钥
范例:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”
范例:CentOS 8
[20:15:00 root@centos8 Packages]#rpm -K /mnt/AppStream/Packages/httpd-2.4.37-11.module_el8.0.0+172+85fc1f40.x86_64.rpm
/mnt/AppStream/Packages/httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64.rpm: digests SIGNATURES NOT OK
[20:24:22 root@centos8 Packages]#cat /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
mQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn
rIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ
8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X
5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c
aevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e
f+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7
JINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m
vufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk
nHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry
Gat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y
m4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB
tDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5
QGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB
Ah4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl
Gy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs
N3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD
vOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq
a0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw
byaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg
q4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X
407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z
V6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG
rCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32
o8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy
yy+mHmSv
=kkH7
-----END PGP PUBLIC KEY BLOCK-----
[20:26:05 root@centos8 Packages]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centostesting
[20:28:19 root@centos8 Packages]#rpm -K /mnt/AppStream/Packages/httpd-2.4.37-11.module_el8.0.0+172+85fc1f40.x86_64.rpm
/mnt/AppStream/Packages/httpd-2.4.37-11.module_el8.0.0+172+85fc1f40.x86_64.rpm: digests signatures OK
[20:29:02 root@centos8 Packages]#rpm -qa "gpg-pubkey*"
gpg-pubkey-8483c65d-5ccc5b19
[20:15:00 root@centos8 Packages]#rpm -qi gpg-pubkey-8483c65d-5ccc5b19
Name : gpg-pubkey
Version : 8483c65d
Release : 5ccc5b19
Architecture: (none)
Install Date: Wed 29 Jul 2020 04:02:56 PM CST
Group : Public Keys
Size : 0
License : pubkey
Signature : (none)
Source RPM : (none)
Build Date : Fri 03 May 2019 11:15:37 PM CST
Build Host : localhost
Relocations : (not relocatable)
Packager : CentOS (CentOS Official Signing Key) <security@centos.org>
Summary : gpg(CentOS (CentOS Official Signing Key) <security@centos.org>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.14.2 (NSS-3)
mQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn
rIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ
8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X
5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c
aevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e
f+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7
JINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m
vufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk
nHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry
Gat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y
m4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB
tDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5
QGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB
Ah4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl
Gy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs
N3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD
vOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq
a0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw
byaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg
q4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X
407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z
V6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG
rCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32
o8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy
yy+mHmSv
=kkH7
-----END PGP PUBLIC KEY BLOCK-----
[20:18:33 root@centos8 Packages]#rpm -K /mnt/AppStream/Packages/httpd-2.4.37-11.module_el8.0.0+172+85fc1f40.x86_64.rpm
/mnt/AppStream/Packages/httpd-2.4.37-11.module_el8.0.0+172+85fc1f40.x86_64.rpm: digests signatures OK
范例:校验包文件
[20:31:39 root@centos8 Packages]#rpm -K tree-1.7.0-15.el8.x86_64.rpm
tree-1.7.0-15.el8.x86_64.rpm: digests signatures OK
[20:32:10 root@centos8 Packages]#cp tree-1.7.0-15.el8.x86_64.rpm /data
[20:32:18 root@centos8 Packages]#cd /data
[20:32:22 root@centos8 data]#ll
total 68
-r--r--r-- 1 root root 60780 Aug 12 20:32 tree-1.7.0-15.el8.x86_64.rpm
[20:32:26 root@centos8 data]#echo >> tree-1.7.0-15.el8.x86_64.rpm
[20:32:41 root@centos8 data]#cd
[20:32:53 root@centos8 ~]#rpm -K /data/tree-1.7.0-15.el8.x86_64.rpm
/data/tree-1.7.0-15.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK
软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录至rpm相关的数据库中,可以用来检查包中的文件是否和当初安装时有所变化
rpm {-V|--verify} [select-options] [verify-options]
示例:
[20:37:21 root@centos8 ~]#rpm -qf /etc/issue
centos-release-8.0-0.1905.0.9.el8.x86_64
[20:38:17 root@centos8 ~]#rpm -V centos-release-8.0-0.1905.0.9.el8.x86_64
S.5....T. c /etc/issue
S.5....T. c /etc/yum.repos.d/CentOS-Base.repo
S 文件大小不同
M 模式不同(包括权限和文件类型)
5 摘要(以前的MD5和)不同
D 设备主/副号码不匹配
L 路径不匹配
U 用户所有权不同
G 组所有权不同
T 修改文件时间不同
P 能力不同
. (点) 表示当前位置代表的字符含义一致
#c 所在的位置表示文件类型
c 配置文件
d 文件数据文件
g 该文件不属于某个文件(少数情况)
l 许可证文件(license file)
r 自述文件(READ ME)
范例:
[20:45:33 root@centos8 ~]#cat /etc/issue
\S
Kernel \r on an \m
\l
\t
\n
[20:46:36 root@centos8 ~]#rpm -V centos-release
S.5....T. c /etc/issue
S.5....T. c /etc/yum.repos.d/CentOS-Base.repo
[20:46:54 root@centos8 ~]#vim /etc/issue
[20:47:49 root@centos8 ~]#cat /etc/issue
\S
Kernel \r on an \m
[20:47:58 root@centos8 ~]#rpm -V centos-release
.......T. c /etc/issue
S.5....T. c /etc/yum.repos.d/CentOS-Base.repo
[20:48:45 root@centos8 ~]#rpm -ql centos-release
/etc/centos-release
/etc/centos-release-upstream
/etc/dnf/vars/contentdir
/etc/dnf/vars/infra
/etc/issue
/etc/issue.net
/etc/os-release
/etc/pki/rpm-gpg
/etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
/etc/pki/rpm-gpg/RPM-GPG-KEY-centostesting
/etc/redhat-release
/etc/rpm/macros.dist
/etc/system-release
/etc/system-release-cpe
/etc/yum.repos.d/CentOS-AppStream.repo
/etc/yum.repos.d/CentOS-Base.repo
/etc/yum.repos.d/CentOS-CR.repo
/etc/yum.repos.d/CentOS-Debuginfo.repo
/etc/yum.repos.d/CentOS-Extras.repo
/etc/yum.repos.d/CentOS-Media.repo
/etc/yum.repos.d/CentOS-PowerTools.repo
/etc/yum.repos.d/CentOS-Sources.repo
/etc/yum.repos.d/CentOS-Vault.repo
/etc/yum.repos.d/CentOS-centosplus.repo
/etc/yum.repos.d/CentOS-fasttrack.repo
/usr/lib/systemd/system-preset/85-display-manager.preset
/usr/lib/systemd/system-preset/90-default.preset
/usr/lib/systemd/system-preset/99-default-disable.preset
/usr/share/centos-release/EULA
/usr/share/doc/centos-release/Contributors
/usr/share/doc/centos-release/GPL
/usr/share/doc/redhat-release
/usr/share/redhat-release
[20:50:02 root@centos8 ~]#rpm -Va
.M....... g /var/log/dnf.librepo.log
.M....... g /var/log/dnf.log
.M....... g /var/log/dnf.rpm.log
.M....... g /var/log/hawkey.log
.M....G.. g /var/log/lastlog
.M....... g /var/cache/dnf/packages.db
.M....... g /etc/udev/hwdb.bin
.M....... g /var/lib/systemd/random-seed
.......T. c /etc/issue
S.5....T. c /etc/yum.repos.d/CentOS-Base.repo
.M....... /mnt
.......T. c /etc/kdump.conf
.M....... c /etc/rc.d/rc.local
.M.....T. /usr/bin/chmod
.M....... g /run/dbus
.M....G.. g /var/log/lastlog
.M....... c /etc/machine-id
missing c /etc/systemd/system/dbus-org.freedesktop.resolve1.service
.M....... g /var/cache/private
.M....... g /var/lib/private
.M....... g /var/log/btmp
.M....... g /var/log/private
S.5....T. c /var/lib/unbound/root.key
.M....... d /usr/share/info/dir.old
.M....... g /var/lib/plymouth/boot-duration
.....UG.. g /var/lib/sss/mc/group
.....UG.. g /var/lib/sss/mc/initgroups
.....UG.. g /var/lib/sss/mc/passwd
.M....... /var/log/audit
.M.....T. c /etc/default/useradd
.M....... g /boot/System.map-4.18.0-80.el8.x86_64
.M....... g /boot/initramfs-4.18.0-80.el8.x86_64.img
数据库
rpm包安装时生成的信息,都放在rpm数据库中
/var/lib/rpm
可以重建数据库
rpm {--initdb|--rebuilddb}
initdb: 初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
程序包编译
源码编译介绍
程序包编译安装:
源代码-->预处理-->编译-->汇编-->链接-->执行
多文件:文件中的代码之间,很可能存在跨文件依赖关系
虽然有很多开源软件将软件打成包,供人们使用,但并不是所有源代码都打成包,如果想使用开源软件,可能需要自已下载源码,进行编译安装。另外即使提供了包,但是生产中需要用于软件的某些特性,仍然需要自行编译安装。但是利用源代码编译安装是比较繁琐的,庆幸的是有相关的项目管理工具可以大大减少编译过程的复杂度
开源程序源代码获取
项目官方自建站点:
apache.org (ASF:Apache Software Foundation)
mariadb.org
...
代码托管:
Github.com
gitee.com
SourceForge.net
code.google.com
编译源码的项目工具
-
C、C++的源码编译:使用 make 项目管理器
configure脚本 --> Makefile.in --> Makefile
相关开发工具:
autoconf: 生成configure脚本
automake:生成Makefile.in
java的源码编译: 使用 maven
C语言源代码编译安装过程
利用编译工具,通常只需要三个大的步骤
-
./configure
(1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefile.in文件生成Makefile
(2) 检查依赖到的外部环境,如依赖的软件包
make 根据Makefile文件,会检测依赖的环境,进行构建应用程序
make install 复制文件到相应路径
注意:安装前可以通过查看README,INSTALL获取帮助
编译安装准备
准备:安装相关的依赖包
- 开发工具:make, gcc (c/c++编译器GNU C Complier)
- 开发环境:开发库(glibc:标准库),头文件,可安装开发包组 Development Tools
- 软件相关依赖包
生产实践:基于最小化安装的系统建议安装下面相关包
yum install gcc make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel opensslopenssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages
编译安装
第一步:运行 configure 脚本,生成 Makefile 文件
其选项主要功能:
- 可以指定安装位置
- 指定启用的特性
获取其支持使用的选项
./configure --help
选项分类:
-
安装路径设定
--prefix=/PATH:指定默认安装位置,默认为/usr/local/
--sysconfdir=/PATH:配置文件安装位置
System types:支持交叉编译
-
软件特性和相关指定:
Optional Features: 可选特性
--disable-FEATURE
--enable-FEATURE[=ARG]
Optional Packages: 可选包
--with-PACKAGE[=ARG] 依赖包
--without-PACKAGE 禁用依赖关系
注意:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件,其包名一般类似于name-devel-VERSION
第二步:make
第三步:make install
安装后的配置
- 二进制程序目录导入至PATH环境变量中
编辑文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
- 相关用户及文件
有些开源软件编译完成后,还需要创建相关的用户及文件
- 导入帮助手册
编辑/etc/man.config|man_db.conf文件,添加一个MANPATH
编译安装实战实例
官网下载并编译安装新版 tree
范例:CentOS 7 编译安装 tree1.8
#1 安装相关的依赖包
[14:15:04 root@centos7 ~]#yum install -y gcc make
#2 下载源码并解压
[root@centos7 ~]#tar xvf tree-1.8.0.tgz
#3 进入解压缩的目录,README和INSTALL
[root@centos7 ~]#cd tree-1.8.0/
[root@centos7 tree-1.8.0]#cat README
[root@centos7 tree-1.8.0]#cat INSTALL
#4 修改源码的版本号
[root@centos7 tree-1.8.0]#sed -i 's#v1\.8\.0#v.8.8.8#' tree.c
#5 编译准备
[root@centos7 tree-1.8.0]#vim Makefile
prefix = /apps/tree
#6 编译
[root@centos7 tree-1.8.0]#make
#7 安装
[root@centos7 tree-1.8.0]#make install
#8 修改PATH变量
#默认无法直接运行tree
[root@centos7 ~]#tree-bash: tree: command not found
[root@centos7 ~]#echo 'PATH=/apps/tree/bin:$PATH' > /etc/profile.d/tree.sh
[root@centos7 ~]. /etc/profile.d/tree.sh
#或者利用软链接实现
[root@centos7 ~]#ln -s /apps/tree/bin/tree /usr/local/bin
#9 验证结果
[root@centos7 ~]#tree --versiontree
v8.8.8 (c) 1996 - 2018 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro
#10 添加man帮助
#默认无法查看man
[root@centos7 ~]#man tree
No manual entry for tree
[root@centos7 ~]#vim /etc/man_db.conf
MANDATORY_MANPATH /apps/tree/man
[root@centos7 ~]#man tree
#11 运行tree查看生成的文件列表
[root@centos7 ~]#tree /apps/tree
/apps/tree
├── bin
│ └── tree
└── man
└── man1
└── tree.1
3 directories, 2 files
编译安装 cmatrix
范例:CentOS 8 编译安装 cmatrix
#1 安装相关包[root@centos8 ~]#dnf install gcc make autoconf ncurses-devel
#2 下载并解压缩包[root@centos8 ~]#cd /usr/local/src
[root@centos8 src]#wget
https://github.com/abishekvashok/cmatrix/releases/download/v2.0/cmatrix-v2.0-Butterscotch.tar
[root@centos8 src]#tar xvf cmatrix-v2.0-Butterscotch.tar
#3 配置
[root@centos8 ~]#cd cmatrix
[root@centos8 cmatrix]#./configure --prefix=/apps/cmatrix
#4 编译并安装
[root@centos8 cmatrix]#make && make install
#5 配置环境
[root@centos8 ~]#echo 'PATH=/apps/cmatrix/bin:$PATH' > /etc/profile.d/cmatrix.sh
[root@centos8 ~]#. /etc/profile.d/cmatrix.sh
#或者用软链接实现
[root@centos8 ~]#ln -sv /apps/cmatrix/bin/cmatrix /usr/local/bin/
#6运行
[root@centos8 ~]#cmatrix -a -b -C yellow7
#帮助
[root@centos8 ~]#vim /etc/man_db.conf
MANDATORY_MANPATH /apps/cmatrix/share/man
[root@centos8 ~]#man cmatrix
编译安装 httpd2.4
范例:centos8 编译安装 httpd-2.4.46
#安装前准备:关闭防火墙和SELinux
#1 安装相关包
[root@centos8 ~]#dnf install gcc make autoconf apr-devel apr-util-devel pcre-devel openssl-devel redhat-rpm-config
#2 下载并解压缩包
[root@centos8 ~]#wget https://mirror.bit.edu.cn/apache//httpd/httpd-2.4.46.tar.bz2[root@centos8 ~]#tar xvf httpd-2.4.46.tar.bz2 -C /usr/local/src
#3 配置
[root@centos8 ~]#cd /usr/local/src/httpd-2.4.43/
[root@centos8 httpd-2.4.46]#./configure --prefix=/apps/httpd --sysconfdir=/etc/httpd --enable-ssl
#4 编译并安装
[root@centos8 httpd-2.4.46]#make -j 4 && make install
#5 配置环境
[root@centos8 ~]#echo 'PATH=/apps/httpd/bin:$PATH' > /etc/profile.d/httpd.sh
[root@centos8 ~]#. /etc/profile.d/httpd.sh
#6 运行
[root@centos8 ~]#apachectl start
#7 指定用apache用户运行
[root@centos8 ~]#useradd -r -s /sbin/nologin -d /var/www -c Apache -u 48 apache
[root@centos8 ~]#vim /etc/httpd/httpd.conf
user apache
group apache
#8 配置生效和验证
[root@centos8 ~]#apachectl restart
#9 查看进程
[root@centos8 ~]#ps aux
#10 用浏览器打开以下地址,可以看下面页面