Linux软件包管理和编译安装

软件包介绍

开源软件最初只提供了.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/

http://mirrors.aliyun.com

https://mirrors.huaweicloud.com/

https://mirror.tuna.tsinghua.edu.cn/

http://mirrors.sohu.com

http://mirrors.163.comUbuntu

Ubuntu 镜像:

http://cdimage.ubuntu.com/releases/

http://releases.ubuntu.com2.1.7.2

第三方组织提供
软件项目官方站点

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

搜索引擎

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

https://sourceforge.net/

注意:第三方包建议要检查其合法性,来源合法性,程序包的完整性

自己制作

将源码文件,利用工具,如: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

安装后的配置

  1. 二进制程序目录导入至PATH环境变量中

​ 编辑文件/etc/profile.d/NAME.sh

export PATH=/PATH/TO/BIN:$PATH

  1. 相关用户及文件

​ 有些开源软件编译完成后,还需要创建相关的用户及文件

  1. 导入帮助手册

​ 编辑/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 用浏览器打开以下地址,可以看下面页面

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345