首页 > 其他 > 详细

软件包管理

时间:2020-04-13 09:44:27      阅读:53      评论:0      收藏:0      [点我收藏+]

1 软件运行和编译

1.1 软件相关概念

1.1.1 ABI

ABI即 Application Binary Interface

Windows与Linux不兼容

? ELF(Executable and Linkable Format)

? PE(Portable Executable)

库级别的虚拟化:

? Linux: WINE

? Windows: Cygwin

1.1.2 API

API即Application Programming Interface,API可以在各种不同的操作系统上实现给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却可能迥异,主流的操作系统有两种,一种是Windows系统,另一种是Linux系统。由于操作系统的不同,API又分为Windows API和Linux API。在Windows平台开发出来的软件在Linux上无法运行,在Linux上开发的软件在Windows上又无法运行,这就导致了软件移植困难,POSIX 标准的出现就是为了解决这个问题

POSIX:Portable Operating System Interface 可移植操作系统接口,定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。

Linux和windows都要实现基本的posix标准,程序就在源代码级别可移植了

1.2 C语言程序的实现过程

C 程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接

范例:gcc 编译过程

#分步骤编译运行
gcc -E hello.c -o hello.i 对hello.c文件进行预处理,生成了hello.i 文件
gcc -S hello.i -o hello.s 对预处理文件进行编译,生成了汇编文件
gcc -c hello.s -o hello.o 对汇编文件进行编译,生成了目标文件
gcc hello.o -o hello 对目标文件进行链接,生成可执行文件
#一步实现编译过程
gcc hello.c -o hello 直接编译链接成可执行目标文件

1.3 软件模块的静态和动态链接

链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态和动态链接

1.3.1 静态链接

  • 把程序对应的依赖库复制一份到包

  • 生成模块文件libxxx.a

  • 嵌入程序包

  • 升级难,需重新编译

  • 占用较多空间,迁移容易

1.3.2 动态链接

  • 只把依赖加做一个动态链接

  • 生成模块文件libxxx.so

  • 连接指向

  • 占用较少空间,升级方便

1.3.3 模块(库)文件

查看二进制程序所依赖的库文件

ldd /PATH/TO/BINARY_FILE

管理及查看本机装载的库文件

#加载配置文件中指定的库文件
ldconfig
#显示本机已经缓存的所有可用库文件名及文件路径映射关系
/sbin/ldconfig –p

配置文件:

/etc/ld.so.conf,
/etc/ld.so.conf.d/*.conf

缓存文件:

/etc/ld.so.cache

2 软件包和包管理器

2.1.1 软件包中的文件分类

  • 二进制文件
  • 库文件
  • 配置文件
  • 帮助文件

范例:利用 cpio工具查看包文件列表

rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件

2.1.2 程序包管理器

软件包管理器功能:

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

主流的程序包管理器

  • redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
  • debian:deb文件, dpkg 包管理器

2.1.3 包的依赖

软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包

安装软件包时,会因为缺少依赖的包,而导致安装包失败。

解决依赖包管理工具:

  • yum:rpm包管理器的前端工具
  • dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum
  • apt:deb包管理器前端工具
  • zypper:suse上的rpm前端管理工具

2.1.6 程序包管理器相关文件

  1. 包文件组成 (每个包独有)
  • 包内的文件
  • 元数据,如:包的名称,版本,依赖性,描述等
  • 可能会有包安装或卸载时运行的脚本
  1. 数据库(公共):/var/lib/rpm
  • 程序包名称及版本
  • 依赖关系
  • 功能说明
  • 包安装后生成的各文件路径及校验码信息

3包管理器rpm

CentOS系统上使用rpm命令管理程序包

功能:

安装、卸载、升级、查询、校验、数据库维护

3.1 安装

格式:

rpm {-i|--install} [install-options] PACKAGE_FILE…

选项:

-v: verbose
-vv: 
-h: 以#显示程序包管理执行进度

常用组合:

rpm -ivh PACKAGE_FILE ...

rpm包安装[install-options]

--test: 测试安装,但不真正执行安装,即dry run模式
--nodeps:忽略依赖关系
--replacepkgs | replacefiles
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
 %pre: 安装前脚本 --nopre
 %post: 安装后脚本 --nopost
 %preun: 卸载前脚本 --nopreun
 %postun: 卸载后脚本 --nopostun

3.2 升级和降级

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 ...

3.3 包查询

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, ...

3.4 包卸载

格式:

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] 
PACKAGE_NAME ...

3.5 包校验

在安装包时,系统也会检查包的来源是否是合法的

检查包的完整性和签名

rpm -K|--checksig rpmfile

在检查包的来源和完整性前,必须导入所需要公钥

范例:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”

软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录至rpm相关的数据库中,可以用来检查包中的文件是否和当初安装时有所变化

rpm {-V|--verify} [select-options] [verify-options]
#示例:
[root@centos8 ~]#rpm -V centos-release
S.5....T. c /etc/issue
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
. (点) 表示当前位置代表的字符含义一致
c 所在的位置表示文件类型
c 配置文件
d 文件数据文件
g 该文件不属于某个文件(极少情况)
l 许可证文件(license file)
r 自述文件(READ ME)

3.6 数据库

rpm包安装时生成的信息,都放在rpm数据库中

/var/lib/rpm

可以重建数据库

rpm {--initdb|--rebuilddb}
initdb: 初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录

4 yum和dnf

CentOS 使用 yum, dnf 解决rpm的包依赖关系

YUM: Yellowdog Update Modififier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的

4.1 yum/dnf 工作原理

yum/dnf 是基于C/S 模式

  • yum 服务器存放rpm包和相关包的元数据库
  • yum 客户端访问yum服务器进行安装或查询等

yum 实现过程

先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的

元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询远数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。

yum服务器的仓库可以多种形式存在:

  • file:// 本地路径
  • http://
  • https://
  • ftp://

注意:yum仓库指向的路径一定必须是repodata目录所在目录

4.2 yum 客户端配置

yum客户端配置文件

/etc/yum.conf #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo: #为每个仓库的提供配置文件

相关变量

yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号,如:8,7,6
$arch: CPU架构,如:aarch64, i586, i686,x86_64等
$basearch:系统基础平台;i386, x86_64
$contentdir:表示目录,比如:centos-8,centos-7
$YUM0-$YUM9:自定义变量

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}
 roundrobin:意为随机挑选,默认值
 priority:按顺序访问
cost= 默认为1000

yum-confifig-manager 命令

可以生成yum仓库的配置文件及启用或禁用仓库,来自于yum-utils包

格式:

#增加仓库
yum-config-manager --add-repo URL或file 
#禁用仓库
yum-config-manager --disable “仓库名" 
#启用仓库
yum-config-manager --enable “仓库名”

4.3 yum 命令

yum命令的用法:

yum [options] [command] [package ...]

yum的命令行选项:

-y #自动回答为“yes”
-q #静默模式
--nogpgcheck #禁止进行gpg check
--enablerepo=repoidglob ? ?#临时启用此处指定的repo,支持通配符,如:”*“
--disablerepo=repoidglob #临时禁用此处指定的repo,和上面语句同时使用,放在后面的生效

4.3.1 显示仓库列表

yum repolist [all|enabled|disabled]

4.3.2 显示程序包

yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]

4.3.3 安装程序包

yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] #重新安装

4.3.4 卸载程序包

yum remove | erase package1 [package2] [...]

4.3.5 升级和降级

升级和降级

yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降级)

检查可用升级:

yum check-update

4.3.6 查询

查看程序包information:

yum info [...]

查看指定的特性(可以是某文件)是由哪个程序包所提供:

yum provides | whatprovides feature1 [feature2] [...]

注意:文件要写全路径,而不只是文件名,否则无法查询到

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

yum search string1 [string2] [...]

查看指定包所依赖的capabilities:

yum deplist package1 [package2] [...]

4.3.7 仓库缓存

清除目录/var/cache/yum/缓存

yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

构建缓存:

yum makecache

4.3.8 查看 yum 事务历史

yum 执行安装卸载命令会记录到相关日志中

日志 文件:

#CentOS 7以前版本日志
/var/log/yum.log
#CentOS 8 版本日志
/var/log/dnf.rpm.log
/var/log/dnf.log

日志命令

yum history [info|list|packages-list|packages-info|summary|addoninfo|redo|undo|rollback|new|sync|stats

4.3.9 安装及升级本地程序包

yum localinstall|install rpmfile1 [rpmfile2] [...]
yum localupdate|update rpmfile1 [rpmfile2] [...]

4.3.10 包组管理的相关命令

yum grouplist [hidden] [groupwildcard] [...]
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]

4.3.11 实现私用 yum 仓库

下载所有yum仓库的相关包和meta 数据

#CentOS 8 dnf 工具集成
dnf reposync --help #查看帮助
#默认只下载rpm包,不下载meta数据,需要指定--download-metadata 才能下载meta
dnf reposync ?--repoid=REPOID --download-metadata -p /path 
#CentOS 7 以前版本,reposync工具来自于yum-utils包
reposync --repoid=REPOID --download-metadata -p /path ?

创建私有yum仓库:

createrepo [options]

4.3.12 DNF 介绍

DNF,即DaNdiFied,是新一代的RPM软件包管理器。DNF 发行日期是2015年5月11日,DNF 包管理 器采用Python 编写,发行许可为GPL v2,首先出现在Fedora 18 发行版中。在 RHEL 8.0 版本正式取代了 YUM,DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等

配置文件:

/etc/dnf/dnf.conf

仓库文件:

/etc/yum.repos.d/ *.repo

日志:

/var/log/dnf.rpm.log
/var/log/dnf.log

dnf 用法与yum一致

dnf [options] <command> [<arguments>...]
dnf --version
dnf repolist
dnf reposync
dnf install httpd
dnf remove httpd
dnf clean all
dnf makecache
dnf list installed
dnf list available
dnf search nano
dnf history undo 1

4.3.13 yum Troubleshooting

yum 和 dnf 失败最主要原因:

  • yum的配置文件格式或路径错误

    ? 解决方法:检查/etc/yum.repos.d/*.repo文件格式

  • yum cache

    ? 解决方法:yum clean all

  • 网络不通:

    ? 解决方法:网卡配置

5 程序包编译

5.1 源码编译介绍

程序包编译安装:

源代码-->预处理-->编译-->汇编-->链接-->执行

多文件:文件中的代码之间,很可能存在跨文件依赖关系

虽然有很多开源软件将软件打成包,供人们使用,但并不是所有源代码都打成包,如果想使用开源软件,可能需要自已下载源码,进行编译安装。另外即使提供了包,但是生产中需要用于软件的某些特性,仍然需要自行编译安装。但是利用源代码编译安装是比较繁琐的,庆幸的是有相关的项目管理工具可以大大减少编译过程的复杂度

5.2 编译源码的项目工具

  • C、C++的源码编译:使用 make 项目管理器

confifigure脚本 --> Makefifile.in --> Makefifile相关开发工具:

autoconf: 生成confifigure脚本

automake:生成Makefifile.in

  • java的源码编译: 使用 maven

5.3 C 语言源代码编译安装过程

利用编译工具,通常只需要三个大的步骤

  • ./confifigure

    (1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefifile.in文件生成Makefifile

    (2) 检查依赖到的外部环境,如依赖的软件包

  • make 根据Makefifile文件,会检测依赖的环境,进行构建应用程序,

  • make install 复制文件到相应路径

注意:安装前可以通过查看README,INSTALL获取帮助

5.4.1 编译安装准备

准备:安装相关的依赖包

  • 开发工具:make, gcc (c/c++编译器GNU C Complier)
  • 开发环境:开发库(glibc:标准库),头文件,可安装开发包组 Development Tools
  • 软件相关依赖包

5.3.2 编译安装

第一步:运行 confifigure 脚本,生成Makefifile 文件

其选项主要功能:

  • 可以指定安装位置

  • 指定启用的特性

    获取其支持使用的选项

./configure --help

选项分类:

  • 安装路径设定:

    --prefifix=/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

5.3.3 安装后的配置

  1. 二进制程序目录导入至PATH环境变量中编辑文件/etc/profifile.d/NAME.sh

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

  1. 相关用户及文件

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

  1. 导入帮助手册

编辑/etc/man.confifig|man_db.conf文件,添加一个MANPATH

6 Ubuntu 软件管理

Debian软件包通常为预编译的二进制格式的扩展名“.deb”,类似rpm文件,因此安装快速,无需编译软件。包文件包括特定功能或软件所必需的文件、元数据和指令

  • dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
  • apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构,类似于yum

6.1 APT 工作原理

在服务器上先复制所有DEB包,然后用APT的分析工具genbasedir根据每个DEB 包的包头(Header)信息对所有的DEB包进行分析,并将该分析结果记录在文件夹base内的一个DEB 索引清单文件中,一旦APT 服务器内的DEB有所变动,要使用genbasedir产生新的DEB索引清单。客户端在进行安装或升级时先要查询DEB索引清单,从而获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。当客户端需要安装、升级或删除某个软件包时,客户端计算机取得DEB索引清单压缩文件后,会将其解压置放于 /var/cache/apt/,而客户端使用apt-get install或apt-get upgrade命令的时候,就会将这个文件夹内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已安装、未安装或是可以升级的

6.2 dpkg 包管理器

帮助参看:man dpkg

dpkg 常见用法

#安装包
dpkg -i package.deb 
#删除包,不建议,不自动卸载依赖于它的包
dpkg -r package 
#删除包(包括配置文件)
dpkg -P package 
#列出当前已安装的包,类似rpm -qa
dpkg -l
#显示该包的简要说明,类似rpm –qi
dpkg -l package 
#列出该包的状态,包括详细信息,类似rpm –qi
dpkg -s package 
#列出该包中所包含的文件,类似rpm –ql 
dpkg -L package 
#搜索包含pattern的包,类似rpm –qf
dpkg -S <pattern> 
#配置包,-a 使用,配置所有没有配置的软件包
dpkg --configure package 
#列出 deb 包的内容,类似rpm –qpl 
dpkg -c package.deb 
#解开 deb 包的内容
dpkg --unpack package.deb
#列出系统上安装的所有软件包
dpkg -l
#列出软件包安装的文件
dpkg -L bash
#查看/bin/bash来自于哪个软件包
dpkg -S /bin/bash
#安装本地的 .deb 文件
dpkg -i /mnt/cdrom/pool/main/z/zip/zip_3.0-11build1_amd64.deb
#卸载软件包
dpkg -r zip

注意:一般建议不要使用dpkg卸载软件包。因为删除包时,其它依赖它的包不会卸载,并且可能无法再正常运行

6.3 apt

Debian 使用apt 工具集来管理包系统,apt-get 是其中一个常用的命令行工具,另外一款较为流行的命令行与 GUI 兼顾的工具是 aptitude ,之前最常用的 Linux 包管理命令都被分散在了 apt-get、apt

cache 和 apt-confifig 这三条命令中

在 2014 年apt 命令发布第一个稳定版,Ubuntu 16.04 引入新特性之一便是 apt 命令,apt 命令解决了命令过于分散的问题,它包括 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-confifig 命令中很少用到的功能。在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-confifig,提供管理软件包所需的必要选项

apt 相当于 apt-get、apt-cache 和 apt-confifig 中最常用命令选项的集合

apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。此外,启用的几个特性也非常有帮助。例如:可以在使用 apt 命令安装或删除程序时看到进度条,apt 还会在更新存储库数据库时提示用户可升级的软件包个数

apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令,也即可用 apt 替换部分apt-get 系列命令,但不是全部

apt 命令用法

aptapt-get****命令对比

apt 命令 被取代的命令 命令的功能
apt install apt-get install 安装软件包
apt remove apt-get remove 移除软件包
apt purge apt-get purge 移除软件包及配置文件
apt update apt-get update 刷新存储库索引
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove apt-get autoremove 自动删除不需要的包
apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系

apt 特有的命令

apt list 列出包含条件的包(已安装,可升级等)
apt edit-sources 编辑源列表

APT包索引配置文件

/etc/apt/sources.list
/etc/apt/sources.list.d

apt命令操作(如安装和删除软件包)日志文件

/var/log/dpkg.log

范例:

#安装包:
apt install tree zip
#安装图形桌面
apt install ubuntu-desktop
#删除包:
apt remove tree zip
#说明:apt remove中添加--purge选项会删除包配置文件,谨慎使用
#更新包索引,相当于yum clean all;yum makecache
apt update ?
#升级包:要升级系统,请首先更新软件包索引,再升级
apt upgrade
#apt列出仓库软件包,等于yum list
apt list
#搜索安装包
apt search nginx
#查看某个安装包的详细信息
apt show apache2 
#在线安装软件包
apt install apache2 
#卸载单个软件包但是保留配置?件
apt remove apache2 
#删除安装包并解决依赖关系
apt autoremove apache2 
#更新本地软件包列表索引,修改了apt仓库后必须执?
apt update 
#卸载单个软件包删除配置?件
apt purge apache2 
#升级所有已安装且可升级到新版本的软件包
apt upgrade
#升级整个系统,必要时可以移除旧软件包。
apt full-upgrade 
#编辑source源?件
apt edit-sources
#查看仓库中软件包有哪些版本可以安装
apt-cache madison nginx 
#安装软件包的时候指定安装具体的版本
apt install nginx=1.14.0-0ubuntu1.6

软件包管理

原文:https://www.cnblogs.com/dadadezhang/p/12689229.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!