9、Linux 程序包管理

Linux 程序包管理

API:Application Programming Interface
POSIX:Portable OS

​ 程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接
​ 静态编译:
​ 共享编译:.so

ABI:Application Binary Interface
Windows与Linux不兼容
库级别的虚拟化:
Linux: WINE
Windows: Cywin

系统级开发 C、C++
应用级开发 java、Python、php、perl、ruby

二进制应用程序的组成部分:
二进制文件、库文件、配置文件、帮助文件

​ 程序包管理器:
​ debian:deb, dpt
​ redhat: rpm, rpm
​ rpm: Redhat Package Manager
​ RPM is Package Manager

​ Gentoo
​ Archlinux

源代码:name-VERSION.tar.gz
VERSION: major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
VERSION: major.minor.release
release.arch:
release:release.OS

​ zlib-1.2.7-13.el7.i686.rpm

​ 常见的arch:
​ x86: i386, i486, i586, i686
​ x86_64: x64, x86_64, amd64
​ powerpc: ppc
​ 跟平台无关:noarch

​ testapp: 拆包
​ testapp-VERSION-ARCH.rpm: 主包
​ testapp-devel-VERSION-ARCH.rpm:支包
​ testapp-testing-VERSION-ARHC.rpm

​ 包之间:存在依赖关系
​ X, Y, Z

​ yum:rpm包管理器的前端工具;
​ apt-get:deb包管理器前端工具;
​ zypper: suse上的rpm前端管理工具;
​ dnf: Fedora 22+ rpm包管理器前端管理工具;

查看二进制程序所依赖的库文件:
ldd /PATH/TO/BINARY_FILE

管理及查看本机装载的库文件:
ldconfig
/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系;

​ 配置文件为:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
​ 缓存文件:/etc/ld.so.cache

程序包管理:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作;

​ 1、程序的组成组成清单 (每个包独有)
​ 文件清单
​ 安装或卸载时运行的脚本
​ 2、数据库(公共)
​ 程序包名称及版本
​ 依赖关系;
​ 功能说明;
​ 安装生成的各文件的文件路径及校验码信息;

管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf

获取程序包的途径:
(1) 系统发版的光盘或官方的服务器;
CentOS镜像:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com

​ (2) 项目官方站点
​ (3) 第三方组织:
​ Fedora-EPEL
​ 搜索引擎:
​ http://pkgs.org
​ http://rpmfind.net
​ http://rpm.pbone.net
​ (4) 自己制作

建议:检查其合法性
来源合法性;
程序包的完整性;

CentOS系统上rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护

安装
rpm {-i|–install} [install-options] PACKAGE_FILE …
-v: verbose
-vv:
-h: 以#显示程序包管理执行进度;每个#表示2%的进度

​ rpm -ivh PACKAGE_FILE …

​ [install-options]
​ --test: 测试安装,但不真正执行安装过程;dry run模式;
​ --nodeps:忽略依赖关系;
​ --replacepkgs: 重新安装;

​ --nosignature: 不检查来源合法性;
​ --nodigest:不检查包完整性;

​ --noscipts:不执行程序包脚本片断;
​ %pre: 安装前脚本; --nopre
​ %post: 安装后脚本; --nopost
​ %preun: 卸载前脚本; --nopreun
​ %postun: 卸载后脚本; --nopostun
实例:(先挂载 /dev/cdrom )

1、测试安装
[root@localhost mnt]# rpm -ivh --test cdrom/Packages/wget-1.14-18.el7_6.1.x86_64.rpm 
warning: cdrom/Packages/wget-1.14-18.el7_6.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
2、不检查来源合法性安装
[root@localhost mnt]# rpm -ivh --nosignature  cdrom/Packages/wget-1.14-18.el7_6.1.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:wget-1.14-18.el7_6.1             ################################# [100%]
3、重新安装
[root@localhost mnt]# rpm -ivh --replacepkgs  cdrom/Packages/wget-1.14-18.el7_6.1.x86_64.rpm 
warning: cdrom/Packages/wget-1.14-18.el7_6.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:wget-1.14-18.el7_6.1             ################################# [100%]

升级
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作;
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
–oldpackage:降级;
–force: 强行升级;
注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;

查询

​ rpm {-q|–query} [select-options] [query-options]
​ [select-options]
​ -a: 所有包
​ -f: 查看指定的文件由哪个程序包安装生成
​ -p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作;
​ --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
​ --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
​ PACKAGE_NAME:查询指定的程序包是否已经安装
实例:

[root@localhost Packages]# rpm -q zsh     # 根据包名直接查询信息
zsh-5.0.2-34.el7_8.2.x86_64
[root@localhost Packages]# rpm -qa | grep "^z"  # 查询所有已经安装的包,与正则表达式一起用
zlib-1.2.7-18.el7.x86_64
zip-3.0-11.el7.x86_64
zsh-5.0.2-34.el7_8.2.x86_64
zenity-3.28.1-1.el7.x86_64
[root@localhost Packages]# rpm -qf /bin/ls    # 查询 /bin/ls 这个文件由哪一个程序包安装
coreutils-8.22-24.el7.x86_64
[root@localhost Packages]# rpm -q --whatprovides /bin/bash      # 查询其是由那个包所提供
bash-4.2.46-34.el7.x86_64
[root@localhost Packages]# rpm -q --whatrequires zsh		# 查询那些包依赖于此
no package requires zsh
[root@localhost Packages]# rpm -qp --provides  wget-1.14-18.el7_6.1.x86_64.rpm   # 查询一个程序包尚未安装,但依然要查询相关信息,与[query-options]连用

​ [query-options]
​ --changelog:查询rpm包的changlog
​ -c: 查询程序的配置文件
​ -d: 查询程序包提供的文档
​ -i: information,程序包相关的信息
​ -l: 查看指定的程序包安装后生成的所有文件;
​ --scripts:程序包自带的脚本片断
​ -R: 查询指定的程序包所依赖的CAPABILITY;
​ --provides: 列出指定程序包所提供的CAPABILITY;

​ 用法:
​ -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
​ -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, …
​ -qa
实例:

[root@localhost Packages]# rpm -q --changelog wget | head -5   # 查询改变的日志信息
* Fri Apr 05 2019 Tomas Hozza <thozza@redhat.com> - 1.14-18.1
- Fix CVE-2019-5953 (#1696733)

* Wed May 09 2018 Tomas Hozza <thozza@redhat.com> - 1.14-18
- Fix CVE-2018-0494 (#1576106)
[root@localhost Packages]# rpm -ql zsh | wc -l   # 查询 zsh 这个程序包安装后生成的所有文件
988
[root@localhost Packages]# rpm -qi zsh 			# 查询这个程序包的相关信息
[root@localhost Packages]# rpm -qc bash			# 查询程序的配置文件信息
[root@localhost Packages]# rpm -qd bash			# 查询这个程序包提供的文档信息
[root@localhost Packages]# rpm -q --provides bash 		# 查询这个程序包所提供的的capability
[root@localhost Packages]# rpm -qR bash			# 查询指定程序包它所依赖的capability
[root@localhost Packages]# rpm -q --scripts zsh				# 查询这个程序自己携带的脚本片段 

卸载
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts] [–notriggers] [–test] PACKAGE_NAME …
–allmatches:卸载所有匹配指定名称的程序包版本
–nodeps:忽略依赖关系
–test:测试卸载

校验
rpm {-V|–verify} [select-options] [verify-options]

​ S file Size differs
​ M Mode differs (includes permissions and file type)
​ 5 digest (formerly MD5 sum) differs
​ D Device major/minor number mismatch
​ L readLink(2) path mismatch
​ U User ownership differs
​ G Group ownership differs
​ T mTime differs
​ P caPabilities differ

包来源合法性验正及完整性验正:
完整性验正:SHA256、来源合法性验正:RSA
公钥加密:
对称加密:加密、解密使用同一密钥;
非对称加密:密钥是成对儿的,
public key: 公钥,公开所有人
secret key: 私钥, 不能公开
导入所需要公钥:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
验证:
(1)安装此组织签名的程序时,会自动执行验证
(2)手动验证:rpm -K PACKAGE_FILE

实例:

[root@localhost Packages]# rpm -ivh wget-1.14-18.el7_6.1.x86_64.rpm 
warning: wget-1.14-18.el7_6.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:wget-1.14-18.el7_6.1             ################################# [100%]
[root@localhost Packages]# rpm -e wget 
[root@localhost cdrom]# rpm --import /mnt/cdrom/RPM-GPG-KEY-CentOS-7  # 导入公钥,自动校验
[root@localhost cdrom]# cd Packages/
[root@localhost Packages]# rpm -ivh wget-1.14-18.el7_6.1.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:wget-1.14-18.el7_6.1             ################################# [100%]
[root@localhost Packages]# rpm -K wget-1.14-18.el7_6.1.x86_64.rpm  # 手动校验
wget-1.14-18.el7_6.1.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

数据库重建:
rpm 管理数据库路径:/var/lib/rpm/
rpm {–initdb|–rebuilddb} [-v] [–dbpath DIRECTORY] [–root DIRECTORY] # man rpmdb
initdb: 初始化
如果事先不存在数据库,则新建之;否则,不执行任何操作;
rebuilddb:重建
无论当前存在与否,直接重新创建数据库
实例:

[root@localhost rpm]# mkdir /tmp/test_db
[root@localhost rpm]# rpm --initdb  --dbpath /tmp/test_db/
[root@localhost rpm]# ls /tmp/test_db/
Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
[root@localhost rpm]# rpm --rebuilddb --dbpath /tmp/test_db/
[root@localhost rpm]# !ls
ls /tmp/test_db/
Basenames     Dirnames  Installtid  Obsoletename  Providename  Sha1header  Triggername
Conflictname  Group     Name        Packages      Requirename  Sigmd5

yum 工具介绍

CentOS: yum, dnf

​ 配置文件:
​ /etc/yum.conf:为所有仓库提供公共配置,主配置文件
​ /etc/yum.repos.d/*.repo:为仓库的指向提供配置

仓库指向的定义
​ [repositoryID]
​ name=Some name for this repository
​ baseurl=url://path/to/repository/
​ enabled={1|0} # 是否启用此仓库
​ gpgcheck={1|0} # 对此仓库中的所有程序包在安装之前是否检查完整性及来源合法性
​ gpgkey=URL # 指明秘钥文件的路径
​ enablegroups={1|0} # 是否支持上使用组批量管理程序包
​ failovermethod={roundrobin|priority} # baseurl 有多个时,使用哪一个(随机或根据优先级)
​ 默认为:roundrobin,意为随机挑选
​ cost=
​ 默认为1000

配置仓库实例:

1、指向本地光盘当作yum源,管理centos7程序包

yum命令的用法
yum [options] [command] [package …]

​ command is one of:

    * repolist [all|enabled|disabled]    
    * install package1 [package2] [...]
    * update [package1] [package2] [...]
    * update-to [package1] [package2] [...]
    * check-update
    * upgrade [package1] [package2] [...]
    * upgrade-to [package1] [package2] [...]
    * distribution-synchronization [package1] [package2] [...]
    * remove | erase package1 [package2] [...]
    * list [...]	
    * info [...]
    * provides | whatprovides feature1 [feature2] [...]
    * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
    * makecache
    * groupinstall group1 [group2] [...]
    * groupupdate group1 [group2] [...]
    * grouplist [hidden] [groupwildcard] [...]
    * groupremove group1 [group2] [...]
    * groupinfo group1 [...]
    * search string1 [string2] [...]
    * shell [filename]
    * resolvedep dep1 [dep2] [...]
    * localinstall rpmfile1 [rpmfile2] [...]
       (maintained for legacy reasons only - use install)
    * localupdate rpmfile1 [rpmfile2] [...]
       (maintained for legacy reasons only - use update)
    * reinstall package1 [package2] [...]
    * downgrade package1 [package2] [...]
    * deplist package1 [package2] [...]
    * repolist [all|enabled|disabled]
    * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
    * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    * check
    * help [command]

显示仓库列表:
repolist [all|enabled|disabled]

显示程序包:
list
# yum list [all | glob_exp1] [glob_exp2] […]
# yum list {available|installed|updates} [glob_exp1] […]

安装程序包:
install package1 [package2] […]
reinstall package1 [package2] […] (重新安装)

升级程序包:
update [package1] [package2] […]
downgrade package1 [package2] […] (降级)

检查可用升级:
check-update

卸载程序包:
remove | erase package1 [package2] […]

查看程序包information:
info […]

查看指定的特性(可以是某文件)是由哪个程序包所提供:
provides | whatprovides feature1 [feature2] […]

清理本地缓存:
clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

构建缓存:
makecache

搜索:
search string1 [string2] […]

​ 以指定的关键字搜索程序包名及summary信息;

查看指定包所依赖的capabilities:
deplist package1 [package2] […]

查看yum事务历史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

安装及升级本地程序包:
localinstall rpmfile1 [rpmfile2] […]
(maintained for legacy reasons only - use install)

​ localupdate rpmfile1 [rpmfile2] […]
​ (maintained for legacy reasons only - use update)

包组管理的相关命令:

  • groupinstall group1 [group2] […]
  • groupupdate group1 [group2] […]
  • grouplist [hidden] [groupwildcard] […]
  • groupremove group1 [group2] […]
  • groupinfo group1 […]

yum的命令行选项:
–nogpgcheck:禁止进行gpg check;
-y: 自动回答为“yes”;
-q:静默模式;
–disablerepo=repoidglob:临时禁用此处指定的repo;
–enablerepo=repoidglob:临时启用此处指定的repo;
–noplugins:禁用所有插件;

yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号;
$arch: 平台;
$basearch:基础平台;
Y U M 0 − YUM0- YUM0YUM9

​ http://mirrors.magedu.com/centos/ r e l e a s e v e r / releasever/ releasever/basearch/os

创建yum仓库:
createrepo [options] <directory>

程序包编译安装:
testapp-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装;

​ 源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行

​ 源代码组织格式:
​ 多文件:文件中的代码之间,很可能存在跨文件依赖关系;

​ C、C++: make (configure --> Makefile.in --> makefile) 项目管理器
​ java: maven

​ C代码编译安装三步骤:
​ ./configure:
​ (1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;
​ (2) 检查依赖到的外部环境;
​ make:
​ 根据makefile文件,构建应用程序;
​ make install

​ 开发工具:
​ autoconf: 生成configure脚本
​ automake:生成Makefile.in

​ 建议:安装前查看INSTALL,README

​ 开源程序源代码的获取:
​ 官方自建站点:
​ apache.org (ASF)
​ mariadb.org
​ …
​ 代码托管:
​ SourceForge
​ Github.com
​ code.google.com

​ c/c++: gcc (GNU C Complier)

​ 编译C源代码:
​ 前提:提供开发工具及开发环境
​ 开发工具:make, gcc等
​ 开发环境:开发库,头文件
​ glibc:标准库

​ 通过“包组”提供开发组件
​ CentOS 6: “Development Tools”, “Server Platform Development”,

​ 第一步:configure脚本
​ 选项:指定安装位置、指定启用的特性

​ --help: 获取其支持使用的选项
​ 选项分类:
​ 安装路径设定:
​ --prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/
​ --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;

​ System types:

​ Optional Features: 可选特性
​ --disable-FEATURE
​ --enable-FEATURE[=ARG]

​ Optional Packages: 可选包
​ --with-PACKAGE[=ARG]
​ --without-PACKAGE

​ 第二步:make

​ 第三步:make install

​ 安装后的配置:( 以练习2为前提 ,安装路径和配置文件路径不是默认的,需要执行这些操作)
​ (1) 导出二进制程序目录至PATH环境变量中;
​ 编辑文件/etc/profile.d/NAME.sh
​ export PATH=/PATH/TO/BIN:$PATH
​ (2) 导出库文件路径
​ 编辑/etc/ld.so.conf.d/NAME.conf
​ 添加新的库文件所在目录至此文件中;
​ 让系统重新生成缓存:
​ ldconfig [-v]
​ (3) 导出头文件
​ 基于链接的方式实现:
​ ln -sv
​ (4) 导出帮助手册
​ 编辑/etc/man.config文件
​ 添加一个MANPATH

(1) 导出二进制程序目录至PATH环境变量中
[root@localhost profile.d]# vim apache.sh 
export PATH=/test/Apache/apache_install/bin:$PATH
(2) 导出库文件路径
[root@localhost etc]# cd /etc/ld.so.conf.d/
[root@localhost ld.so.conf.d]# vim apache.conf 
/test/Apache/apache_install
(3) 导出头文件
ln -sv /test/Apache/apache_install/include     /usr/include

练习:
1、yum的配置和使用;包括yum repository的创建


​ 2、编译安装apache 2.4; 启动此服务

(1)从官网下载Apache2.4.48的源码包到本地(http://httpd.apache.org/download.cgi#apache24)
[root@localhost 下载]# ls     (我们下载的源码包)
apr-1.4.5         apr-util-1.3.12         httpd-2.4.48.tar.bz2  pcre-8.10.zip
apr-1.4.5.tar.gz  apr-util-1.3.12.tar.gz  pcre-8.10
(2)解压缩到指定目录
# tar -xvf httpd-2.4.48.tar.bz2 -C /test/Apache/
(3)进入到解压缩后的目录中,进行configure脚本
[root@localhost Apache]# cd httpd-2.4.48/
[root@localhost httpd-2.4.48]# ./configure --prefix=/test/Apache/apache_install --sysconfdir=/test/Apache/apache_etc      # 这里我们人为指定了安装的目录的配置文件的目录存放地方
注:若在configure脚本时出现了如下错误,请查看链接进行排错。
	configure: error: APR could not be located. Please use the --with-apr option.
	configure: error: APR not found.  Please read the documentation.
	链接:https://blog.csdn.net/xysoul/article/details/49290331、
			 https://blog.csdn.net/sunamnxin/article/details/115580236
[root@localhost httpd-2.4.48]# ./configure --prefix=/test/Apache/apache_install --sysconfdir=/test/Apache/apache_etc --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre  # 出错后的配置脚本命令,需要根据链接提示完成一些前提操作
(4)成功后进行 make && make install
[root@localhost httpd-2.4.48]# make && make install
(5)进入到安装服务的位置并开启服务
[root@localhost httpd-2.4.48]# cd /test/Apache/apache_install/
[root@localhost apache_install]# bin/apachectl start
(6)测试
在网页中输入centos的IP地址,若出现it works,则配置成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值