linux下包管理器

一、操作linux发型版本的包管理器

此小结摘抄:
https://www.cnblogs.com/linuxprobe/p/5883783.html
 
  在 linux 中,包管理器非常重要,了解如何使用多种包管理器可以让你像一个高手一样活得很舒适,从在仓库下载软件、安装软件,到更新软件、处理依赖和删除软件是非常重要的,这也是Linux 系统管理的一个重要部分。

  • debian派系

  dpkg 是 Debian Linux 家族的基础包管理系统,它用于安装、删除、存储和提供deb包的信息。
这是一个低层面的工具,并且有多个前端工具可以帮助用户从远程的仓库获取包,或处理复杂的包关系的工具,包括如下:

(1) apt(高级打包工具)
  这个是一个 dpkg 包管理系统的前端工具,它是一个非常受欢迎的、自由而强大的,有用的命令行包管理器系统。debian 及其衍生版,例如 Ubuntu 和 Linux Mint 的用户应该非常熟悉这个包管理工具。
(2) aptitude 包管理器
  这个也是 Debian Linux 家族一个非常出名的命令行前端包管理工具,它工作方式类似 APT ,它们之间有很多可以比较的地方,不过,你应该两个都试试才知道哪个工作的更好。它最初为 Debian 及其衍生版设计的,但是现在它的功能延伸到 RHEL 家族。
(3) synaptic 包管理器
  synaptic是一个基于GTK+的APT的可视化包管理器,对于一些不想使用命令行的用户,它非常好用。

  • 红帽派系

rpm 包管理器
  这个是红帽创建的 Linux 基本标准(LSB)打包格式和基础包管理系统。基于这个底层系统,有多个前端包管理工具可供你使用,但我们应该只看那些最好的,那就是:

(1) yum
  这个是一个开源、流行的命令行包管理器,它是用户使用 RPM 的界面(之一)。你可以把它和 Debian Linux 系统中的 APT 进行对比,它和 APT 拥有相同的功能。

(2) dnf
  这个也是一个用于基于 RPM 的发行版的包管理器,Fedora 18 引入了它,它是下一代 YUM。如果你用 Fedora 22 及更新版本,你肯定知道它是默认的包管理器。这里有一些链接,将为你提供更多关于 DNF 的信息和如何使用它。

  • 其他派系

(1) Pacman包管理器(Arch Linux)
  这个是一个流行的、强大而易用的包管理器,它用于 Arch Linux 和其他的一些小众发行版。它提供了一些其他包管理器提供的基本功能,包括安装、自动解决依赖关系、升级、卸载和降级软件。但是最大的用处是,它为 Arch 用户创建了一个简单易用的包管理方式。

(2) Zypper 包管理器(openSUSE)
  这个是一个使用 libzypp 库制作的用于 OpenSUSE 系统上的命令行包管理器,它的常用功能包括访问仓库、安装包、解决依赖问题和其他功能。更重要的是,它也可以支持存储库扩展功能,如模式、补丁和产品。

(3) Portage 包管理器(Gentoo)
  这个是 Gentoo 的包管理器,当下不怎么流行的一个发行版,但是这并不阻止它成为 Linux 下最好的软件包管理器之一。Portage 项目的主要目标是创建一个简单、无故障的包管理系统,包含向后兼容、自动化等功能。

二、rpm包管理器

2.1、程序概述以及rpm概述

API:Application Program Interface,应用程序接口;
ABI:Application Binary Interface,应用二进制接口;

至于二者的区别,之前也有讲过,这里拿一张别人画好的图:

https://blog.csdn.net/FatalError1/article/details/78362829
linux下包管理器_第1张图片

  • C/C++程序格式
    源代码:文本格式的程序代码;
    编译开发环境:编译器、头文件、开发库
    二进制格式:文本格式的程序代码 - -> 编译器 - -> 二进制格式(二进制程序、库文件、配置文件、帮助文件)
  • java/python程序格式
    源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;
    开发环境:编译器、开发库
    二进制
  • 项目构建工具

    c/c++: make
    java: maven
  • 源代码格式和二进制rpm包格式
源代码命名:name-VERSION-release.tar.gz 
.tar.gz只是一种,通常是使用tar打包归档,并使用gzip压缩;
VERSION:major.minor.release(主版本号.次版本号.发型号);
name:源代码所代表的应用程序的名字;
例如:redis-5.0.0.tar.gz

rpm包命名:
name-VERSION-release.arch.rpm
VERSION:major.minor.release(软件包主版本号.次版本号.发型号);
release.arch:rpm包的发型号;
其中的release由release.os组成,(release表示发型号的版本,os表示系统说明)
arch可选值有:i386, x64(amd64), ppc, noarch等等

例如:redis-5.0.0-1.centos7.x64.rpm
  • rpm概述
rpm是一款能够用于编译,安装,查询,验证,更新以及移除软件包的包管理器。包由文件和元数据构成。
元数据构成:
二进制程序文件,库文件,配置文件,帮助文件等;

包的两种形式,上面有提到过,一种是二进制包格式,另外一种是源码包格式。
二进制包已经封装好了要安装的程序,源码包就是由程序源代码以及要生成二进制格式的一些附加配置构成;

rpm包就是由二进制格式组成的,不过为了最小化功能模块设计,一个应用程序被打包成rpm包的时候,可能
组成了不止一个rpm包,比如像mysql这种的应用程序,可能由devel,utils,libs等组成各个小包,我们称这些
为分包或支包,如果要想完整的使用应用程序,我们应该先安装对应程序的主包,然后把这些辅助的支包也安装
上。主包和支包(这种机制叫拆包)命名:
主包:name-VERSION-release.arch.rpm 
支包:name-function-VERSION-release.arch.rpm
其中function表示一类辅助功能,常见的有:
devel,utils,libs等

rpm管理器有个弊端就是不能自动解决程序包依赖关系的问题,何为依赖关系:
比如我要安装X,Y,Z程序包,安装X程序包要依赖于Y和Z程序包,而安装Y程序包要依赖于A,B,C程序包,
然后安装A程序要依赖于Y程序包,依赖我的Y程序包还没安装,而后Y程序包要装的软件包又依赖
于Y程序包本身,这种是很常见的,在rpm管理器中没能得到解决,我们只能找出依赖,先把依赖包安装好,
然后运气好的话,没有这种互相关联,我们可以解决,如果是互相关联的,就没有办法了。而rpm包的前端
工具,例如yum,就很好的解决了软件包依赖的关系。

程序包管理器的功能(例如rpm):
将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、
卸载和查询等管理操作;
1、程序包的组成清单(每个程序包都单独实现);
    文件清单
    安装或卸载时运行的脚本
2、数据库(公共)
    程序包的名称和版本;
    依赖关系;
    功能说明;
    安装生成的各文件的文件路径及校验码信息;
    等等等

获取程序包的途径:
1、系统发行版的光盘或官方的文件服务器(或镜像站点):
http://mirrors.aliyun.com 这是是国内阿里云提供的公共镜像站点;
http://mirrors.sohu.com   这是国内搜狐提供的公共镜像站点;
http://mirrors.163.com     这是163组织提供的公共镜像站点;  
2、项目的官方站点
3、第三方组织:
    (1) EPEL
    (2) 搜索引擎
        http://pkgs.org
        http://rpmfind.net 
        http://rpm.pbone.net 
4、自己部署搭建镜像站点或者主机打包rpm包

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

2.2、rpm常见选项

rpm简单组织语法格式:

rpm [OPTION] [PACKAGE_FILE]
其中OPTION根据rpm实现的每种功能,有分别的主选项,例如:
查询:-q或-query
校验:-V或--verify
安装:-i或--install
升级:U或--upgrade,-F或--freshen
卸载:-e或--erase

2.2.1、rpm的通用选项

-?, --help:查看帮助信息;
--version:查看版本;
--quiet:安静模式;
-v:详细信息;
-vv:更详细的输出;

2.2.2、rpm与安装相关的选项

语法格式:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
其中-i或--install表示安装功能主选项;
install-options表示安装的子选项;

-h, --hash:hash marks输出进度条;每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突消息等;
--nodeps:忽略软件包的依赖关系(正常情况不应该忽略);
--replacepkgs:重新安装;
--replacefiles:如果其他程序安装过相应文件,会覆盖安装;
--oldpackage:允许降级安装软件包;
--force:--replacepkgs, --replacefiles, and --oldpackage的组合;

PS:rpm包安装,可以附带四类安装脚本,分别为:
preinstall:安装过程开始之前运行的脚本,%pre
postinstall:安装过程完成之后运行的脚本,%post
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun
postuninstall:卸载过程完成之后运行的脚本,%postun

--nopre:不执行"安装过程开始之前要运行的脚本片段";
--nopost:不执行"安装过程完成之后运行的脚本片段";
--nopreun:不执行"卸载过程开始执行之前运行的脚本片段";
--nopostun:不执行"卸载过程完成之后运行的脚本片段";
--noscripts:相当于--nopre --nopost --nopreun --nopostun
--nodigest:不检查包完整性信息;
--nosignature:不检查包签名信息,不检查来源合法性;
--justdb:只安装数据库,不包安装安装文件系统的文件;(通过查询选项还是可以列出安装的文件,不过
实际并不存在,卸载的时候也要加上该选项);

PS:安装的时候,rpm的数据库没有记录软件包的相关记录,应该指明完整的rpm包名;

2.2.3、rpm与升级相关的选项

语法格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
这个-U是升级或安装,如果已经安装了且存在新版本,会移除旧版本并升级成新版本,简称升级或安装软件包;

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
这个-F只升级软件包,如果指定软件包没有安装,不会安装;

至于升级的选项,很多与安装的选项相同
--justdb:只安装数据库,不包安装安装文件系统的文件;(通过查询选项还是可以列出安装的文件,不过
实际并不存在,卸载的时候也要加上该选项);
--force:强制,相当于--replacepkgs, --replacefiles, and --oldpackage;
--oldpackage:降级;
等等,其他选项,请看上一小结。

注意事项:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;
(2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有
版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;

2.2.4、rpm与卸载相关的选项

语法结构:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
--allmatches:指定软件包如果有多个版本,会卸载掉多有的版本(正常情况如果有多个版本存在,卸载检测
出来,会报错);
--nodeps:卸载软件包前不检查依赖关系;
--test :测试卸载,不真正执行;
--nopreun:不执行"卸载过程开始执行之前运行的脚本片段";
--nopostun:不执行"卸载过程完成之后运行的脚本片段";
--noscripts:等价于 --nopreun --nopostun;

PS:卸载的时候,不能指明完整的包名,只需要指定要卸载的软件包的名字即可。

2.2.5、rpm与查询相关的选项(最核心之一)

语法格式:
rpm {-q|--query} [select-options] [query-options]

select-options:
-a, --all:查询所有已经安装过的软件包;
-f, --file FILE:查询指定文件由哪一个软件包提供;
-g, --group GROUP:查询指定开发包组中对应程序包,系统已经安装的有哪些;
-p, --package PACKAGE_FILE:用于实现对未安装的程序包进行查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

query-options:
--changelog:查询软件包的改变信息;
-l, --list:查询软件包安装生成的所有文件列表;
-i, --info:查询程序包的相关信息,包括名字,版本号,大小,所属包组,描述信息等;
-c, --configfiles:查询软件包提供的配置文件列表;(已经隐式含有-l,不用显式再指明-l选项)
-d, --docfiles:查询软件包提供的文本文件列表;(已经隐式含有-l,不用显式再指明-l选项)
--dump:导出(打印)软件包的以下部分的详细信息(隐式含有-l选项)
path size mtime digest mode owner group isconfig isdoc rdev symlink
路径 大小 修改事件 摘要码 权限 文件属主 文件属组 是否为配置文件 是否为文件文件, 设备相关,链接相关
--filesbypkg:查询所有指定软件包的安装的文件列表(每个文件前边会有软件包名,再查找多个软件包的文件列表
的时候可便于区分);
-i, --info:查询程序包的相关信息,包括名字,版本号,大小,所属包组,描述信息等;
-L, --licensefiles:查询软件包的许可证信息;
--provides:查询软件包的CAPABILITY(能力);
-R, --requires:查询指定软件包的依赖能力关系(这里的依赖关系不一定到一个软件包,因为能力是一种体现,
一个软件包可以有多个能力);
--scripts:查询软件包自带的脚本片段;

2.2.6、rpm与校验相关的选项

语法结构:
rpm {-V|--verify} [select-options] [verify-options]
select-options和查询的select-options相同;

verify-options:
--nodeps:校验的时候不检查软件包的依赖关系;
--nodigest:校验的时候不检查包完整性;
--nosignature:校验的时候不检查包签名信息和来源合法性;

输出格式由9个字符组成的字符串,可能用来标识的属性有:
c %config configuration file. 配置文件
d %doc documentation file. 文档文件;
g %ghost file (i.e. the file contents are not included in the package payload).
l %license license file.: 许可证文件
r %readme readme file. 说明文件

字符构成:
如果对应字符位置标记为符号"."表示校验通过,没有异常,如果为符号"?",表示检测异常,可能因为没有权限等
原因造成,如果标记为以下字符表示对应属性检测失败(软件包本身属性不变,如果有修改,对应字段会作出
相应的标记,不是所检测不同就表示有问题,只能说与元件包原始提供的检测不一样):
S file Size differs    标记为S表示文件大小不同;
M Mode differs (includes permissions and file type) 标记为M表示权限不同(包括权限和文件类型)
5 digest (formerly MD5 sum) differs 标记为5 表示消息摘要码不一样;
D Device major/minor number mismatch 标记为D表示主设备号或次设备号不匹配;
L readLink(2) path mismatch 标记为L表示路径不匹配;
U User ownership differs 标记为U表示文件的属主不同;
G Group ownership differs 标记为G表示文件的属组不同;
T mTime differs 标记为T表示文件的修改时间不同;
P caPabilities differ 标记为P表示软件包提供的能力检测不同;

包来源合法性验证和完整性验证:
    来源合法性验正:
    完整性验正:

获取并导入信任的包制作者的密钥:
    对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

验证:
    (1) 安装此组织签名的程序时,会自动执行验正;
    (2) 手动验证:rpm -K PACKAGE_FILE

PS:校验rpm软件包也不能带上rpm的全路径,只需要指明rpm包的名字即可;

2.2.7、rpm与数据库维护相关

数据库重建:
    rpm管理器数据库路径:/var/lib/rpm/
    查询操作:通过的rpm的数据库进行;

获取帮助:
    CentOS 6:man rpm
    CentOS 7:man rpmdb

rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
    --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
    --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;

2.3、实际案例

本小结主要以光盘中的一个名叫zsh的软件包进行演示操作说明。
1、查询
linux下包管理器_第2张图片

linux下包管理器_第3张图片

linux下包管理器_第4张图片

2、安装和升级安装,卸载

linux下包管理器_第5张图片

3、校验和数据库维护

linux下包管理器_第6张图片

linux下包管理器_第7张图片

学完rpm,记得把这个链接的10多个常见问题看一下,非常有用:
http://fedoranews.org/alex/tutorial/rpm/

Problem 1: Install or Upgrade a package? Can I install an old one?
Problem 2: Remove a package? Is it going to remove any dependencies?
Problem 3: Query installed packages? What about a RPM file?
Problem 4: List what packages are required by some RPM package?
Problem 5: Find from which package the file /usr/bin/smbmount belongs?
Problem 6: List what files will be installed by a RPM package?
Problem 7: Install a package directly from Internet? Can I use a proxy?
Problem 8: Simulate what will be done when executing "rpm -ivh new-kernel.rpm"?
Problem 9: Upgrade all my installed packages with one Freshen command?
Problem 10: Figure out the Kernel version(smp, bigmem) and base arch(i386, athlon)?
Problem 11: Install a new Kernel version but keeping my old one installed?
Problem 12: Make backups of my old packages when updating or removing them?
Problem 13: Build a RPM package from a SRPM with rpmbuild?
Problem 14: Check digests and signatures against a package?
Problem 15: See what RPM macros are defined on my system?
Problem 16: Get rpm back? The command "rpm -qa" returns nothing!
Problem 17: Figure out the installation time of my packages? [User Contribution]
Problem 18: Figure out the size of a installed package? [User Contribution]

1、安装和升级软件包,我可以使用旧软件包吗?
2、如何卸载软件包,会卸载掉依赖文件吗?
3、查询已经安装的软件包,以及rpm的安装文件信息?
4、列出依赖于rpm包的包以及文件?
5、查找某个程序文件属于哪一个软件包?(比如查询/usr/bin/smbmount输出哪个软件包)
6、列出rpm软件包将要安装的文件?
7、如何直接从互联网安装一个软件包?我可以使用代理吗?(例如使用ftp协议或者http协议)
8、如何模拟安装一个软件包?
9、如何一次升级所有已经安装过的软件包?
10、如何查询自己的内核版本以及系统体系架构?
11、安装一个新的内容版本并且保留之前已经安装过的旧版本?
12、在升级或卸载软件包的时候,如果备份软件包?
13、使用rpmbuild工具从SRPM格式构建出对应的RPM包?(这个涉及到rpm包的制作知识点,有兴趣可以查阅)
14、如何检验包的完整性和来源合法性?
15、查看我的系统定义的和RPM包相关的宏有哪些?(这个涉及到rpm包的制作知识点,有兴趣可以查阅)
16、有时候"rpm -qa"查询不出东西,怎么处理?
17、如何计算包的安装时间?(这个是用户提交的,非官方)
18、如何计算出已经安装包的大小?(这个是用户提交的,非官方)

三、rpm包管理器的前端工具yum

3.1、yum概述

yum是一个交互式的基于rpm实现的包管理器。它可以自动执行系统的更新,包括依赖性分析以及基于"仓库(repository)"的元数据库过时的处理。它也能够实现安装(新)软件包,卸载(旧)软件包以及对已经安装的软件包的查询,或者向其他命令或程序提供可用的软件包。yum和其他高级的软件包管理工具是相似的,例如像apt-get或smart。

yum可以解决rpm安装软件包依赖的问题,不过yum是基于rpm来实现的,所以如果rpm使用有异常或者环境有问题,yum可能会使用异常。
yum - Yellowdog Updater Modified,通常都叫小黄狗。yum是rpm的前端工具实现,可以从指定服务器上自动下载程序包,并自动分析程序包的元数据、自动处理程序包之间的依赖关系,能一次性安装完所有依赖的包,而无须繁琐地一次次安装所有依赖包。yum访问访问文件服务器(俗称yum仓库,yum repository)的模式是基于C/S架构的,而文件服务器(repository)则需要以某种共享服务方式将其提供的程序包及包相关的元数据提供给其他主机使用,通常使用到的协议有http、https、ftp、nfs等。此外,还可以使用光盘作为本地仓库或者自己制作本地仓库,通常使用到的协议是file。

上面有提到repository,yum的repository俗称yum仓库(yum repo),这个仓库里面存储了很多rpm包以及存放于特定
repodata目录下的包的相关元数据文件。既然yum访问yum仓库的模式是C/S架构,所以就必然有个yum客户端和
yum服务端的概念。

  • yum客户端
配置文件:
    /etc/yum.conf:为所有仓库提供公共配置
    /etc/yum.repos.d/*.repo:为仓库的指向提供配置

yum仓库指向的配置文件:
[repositoryID]    这个表示仓库的id表示,不同的yum仓库配置不能相同;
name=Some name for this repository    这个是仓库的名字;
baseurl=url://path/to/repository/   这个是访问真正的yum服务端的url指向;
enabled={1|0}   仓库是否启用,1表示启用(默认值),0表示未启用;
gpgcheck={1|0}   是否要对程序包数据的来源合法性和数据完整性做校验;,1表示检查,0表示不检查;
gpgkey=URL     指定GPG密钥文件的访问路径,可由仓库提供;;(如果gpgcheck启用,这里就要指向)
enablegroups={1|0}  是否允许以组的方式管理仓库;
failovermethod={roundrobin|priority}
    默认为:roundrobin,意为随机挑选;
    当baseurl同时指向多个仓库路径时,可指定以什么方式选择url去访问仓库,以及当某一路径访问
失败时,可指定如何再选择路径;roundrobin是随机挑选路径访问,priority是自上而下选择路径访
问;
cost=
    开销;开销越小,该仓库url更优;默认值为1000.
  • yum服务端(yum仓库)
    至于服务端,没什么好说的,我们上面有讲过客户端了,我们来通过几张图来简要说明。
    摘抄:

linux下包管理器_第8张图片

linux下包管理器_第9张图片

  用户使用yum去请求安装某一个程序包时,yum工具会先去yum配置文件中查找yum仓库指向的路径,根据该路径去访问远程或本地的文件服务器,这个服务器作为yum仓库并且存储了众多的rpm包以及包相关的元数据文件。当yum根据仓库路径访问到仓库后,会首先尝试请求获取rpm包的元数据文件并缓存至本地(/var/cache/yum目录),而这个元数据文件包括了该仓库所有rpm包的程序包名、版本号、依赖性以及每个程序包所提供的capabilities等。而后,yum根据用户要安装的程序包名去元数据文件里查找,看看仓库里是否有用户请求下载的程序包文件,如果找到了则根据元数据文件分析该程序包的依赖关系并分析本地系统上有哪些包已安装、哪些包还没安装,再将所有用户需要安装且本地尚未安装的程序包名列出来,并以客户端的角色发送至文件服务器(仓库)请求下载之。如果请求成功,则yum将要安装的程序包文件也缓存至本地并执行安装操作。安装完成之后将缓存的程序包文件删除以节约空间,而缓存中只留下元数据文件。

  为什么只缓存元数据而不缓存程序包呢?因为程序包一般只安装一次即可,很少会再安装第二次,而且基于节约空间的考虑,因此yum在安装完程序包后会将缓存中的程序包删除。而缓存元数据好处则是当下一次用户使用yum请求安装程序包时可以节约带宽,无需再次重新请求获取全部的元数据文件,并且可以提高本地分析程序包的速度。

  当用户第二次使用yum请求安装程序包时,基于实时同步更新缓存以及节约带宽的考虑,yum会先请求下载yum仓库下rpm包元数据的校验码文件至本地,将其与本地缓存上的元数据校验码相比较,如果相同,说明无须更新;如果不同,则说明仓库中rpm包已经更新,因此yum会重新请求下载仓库上的元数据文件以更新元数据缓存。接着同样是分析程序包依赖性、请求要安装的全部程序包等。

3.2、yum常见选项

语法结构:
yum [options] [command] [package ...]

options表示选项,command表示使用的命令,package表示软件包的名字;

command is one of:
 * install package1 [package2] [...]
 * update [package1] [package2] [...]
 * update-to [package1] [package2] [...]
 * update-minimal [package1] [package2] [...]
 * check-update
 * upgrade [package1] [package2] [...]
 * upgrade-to [package1] [package2] [...]
 * distribution-synchronization [package1] [package2] [...]
 * remove | erase package1 [package2] [...]
 * autoremove [package1] [...]
 * list [...]
 * info [...]
 * provides | whatprovides feature1 [feature2] [...]
 * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
 * makecache [fast]
 * groups [...]
 * search string1 [string2] [...]
 * shell [filename]
 * resolvedep dep1 [dep2] [...]
    (maintained for legacy reasons only - use repoquery or yum provides)
 * 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]
 * repoinfo [all|enabled|disabled]
 * repository-packages  
[package2] [...]
 * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
 * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
 * load-transaction [txfile]
 * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel]
 * fssnapshot [summary | list | have-space | create | delete]
 * fs [filters | refilter | refilter-cleanup | du]
 * check
 * help [command]

options:
1、repolist:显示仓库列表;
repolist [all|enabled|disabled]
如果指定enabled:表示只显示启用的仓库列表;
如果指定disabled:表示只显示关闭的仓库列表;
如果指定all:表示显示启用和关闭的仓库列表;
默认的repolist的参数是enabled。
repolist [all|enabled|disabled] 后边还可以通过仓库的id或者名字来查找,并且支持bash通配符机制;
repolist [all|enabled|disabled] "Repo-id"
repolist [all|enabled|disabled] "Repo-name"

有时候需要配置-v选项一起,查看详细信息;

2、repoinfo:查看仓库详细信息
repoinfo [all|enabled|disabled]
repoinfo命令和repolist [all|enabled|disabled] -v等价;

3、list:显示程序包
yum list [all | glob_exp1] [glob_exp2] [...]
列出所有可用和已经安装的软件包;
yum list available [glob_exp1] [...]
列出yum仓库所有可用的的安装包;
yum list updates [glob_exp1] [...]
列出yum仓库所有可用的更新包;
yum list installed [glob_exp1] [...]
列出所有已经安装的软件包;
yum list extras [glob_exp1] [...]
列出所有系统已经安装的软件包却不能被yum仓库的配置文件所列出(通过rpm安装的或者之前yum仓库安装
后来yum仓库被移除了等)软件包列表;
yum list distro-extras [glob_exp1] [...]
列出所有已经安装的软件包却不能根据yum配置文件列出的yum仓库的名字所匹配(yum仓库已经被移除了)软件包
列表;
yum list obsoletes [glob_exp1] [...]
列出系统已经安装却被rpm仓库的配置文件列表指向yum仓库人为软件包已经过时了的软件包列表;
yum list recent
   List  packages recently added into the repositories. This is often not helpful, but what you may really want
   to use is "yum list-updateinfo new" from the security yum plugin.
列出最近加入yum仓库的软件包列表。

4、install:安装
install package1 [package2] [...]

5、reinstall:重新安装
reinstall package1 [package2] [...]

6、update:升级更新
update [package1] [package2] [...]
不指定软件包名或者指定参考没有匹配(可以使用bash通配机制)软件包,会更新所有软件包;

7、downgrade:降级
downgrade package1 [package2] [...]

8、check-update:检查是否有可用的升级
返回状态值为100表示有可用的软件包升级(正常会返回可用的软件包更新列表);
返回状态值为0表示无可用的软件包升级;
返回状态值为1表示运行报错;

9、remove or erase:卸载软件包
remove | erase package1 [package2] [...]
yum默认有保护yum自身的机制,不能对yum本身进行卸载;

10、info:查看程序包信息
列出描述和摘要信息,可选的指定选项和list一样,下面只理出,不再次说明含义。
yum info [all | glob_exp1] [glob_exp2] [...]
yum info available [glob_exp1] [...]
yum info updates [glob_exp1] [...]
yum info installed [glob_exp1] [...]
yum info extras [glob_exp1] [...]
yum info distro-extras [glob_exp1] [...]
yum info obsoletes [glob_exp1] [...]
yum info recent
用的最多的就是:
yum info package_name类似于rpm -qi package_name或者rpm -qpi package_name.xxx.rpm

11、search:搜索程序包
search [all] string1 [string2] [...]
以指定的关键字搜索程序包名及summary信息;
默认是根据报名和摘要信息进行搜索,如果检索失败,会去详细描述信息和url中去检索;
可以显式指明all来增大检索的范围,搜索的结果会有一定的排序;

12、provides 或 whatprovides:查看指定的特性是由哪个程序包提供
provides | whatprovides feature1 [feature2] [...]

13、clean:清理本地缓存
yum clean expire-cache  清理过期缓存;
yum clean packages   清理包;
yum clean headers  清理头文件;
yum clean metadata 清理元数据;
yum clean dbcache 清理sqlite数据库缓存;
yum clean rpmdb 清理本地的rpmdb缓存;
yum clean plugins 清理插件;
yum clean all 清理所有的

14、makecache:构建本地缓存
makecache [fast]
不加fast,会对所有启用的仓库构建本地缓存数据;
加fast,速度更快,不过只会对过期的缓存进行重新缓存,已经缓存且没过期的不会;

15、deplist:查看指定的软件包所依赖的能力(capabilities)
deplist package1 [package2] [...]

16、history:查看yum事务历史
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
不常用,这里不进行讲解每个选项的含义。

17、安装及升级本地程序包:
* localinstall rpmfile1 [rpmfile2] [...]
   (maintained for legacy reasons only - use install)
* localupdate rpmfile1 [rpmfile2] [...]
   (maintained for legacy reasons only - use update)
这是一个早期的版本的选项,就是如果你本地有一个rpm文件,你可以直接通过yum 指定这个rpm文件(接的全名)
来安装(会解决依赖管理,去启用的仓库中寻找依赖的软件包)。
CentOS 6.x和CentOS 7.x直接使用:
yum install package_name.xxx.rpm
yum update package_name.xxx.rpm

18、包组管理相关:
* 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:禁用所有插件;

3.3、自己配置yum仓库

3.3.1、配置本地yum仓库

我们本地有个iso的光盘,里面有很多软件包,简单来看看如何配置yum的客户端,然后通过挂载光盘
到文件系统上,通过本地文件系统安装管理软件包。

(1) 挂载光盘至某目录,例如/media/cdrom
mkdir -p /media/cdrom  #创建光盘挂载点
mount -r -t iso9660 /dev/cdrom /media/cdrom #只读挂载光盘文件到/dev/cdrom下(iso9660表示光盘的类型)

(2) 创建配置文件
最少可选模板,
[repository-id]
name=
baseurl=
gpgcheck=
enabled=

[root@node2 ~]# cd /etc/yum.repos.d/
[root@node2 yum.repos.d]# mkdir -p /media/cdrom
[root@node2 yum.repos.d]# mount -r -t iso9660 /dev/cdrom /media/cdrom/
[root@node2 yum.repos.d]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        98G  1.5G   97G   2% /
devtmpfs        229M     0  229M   0% /dev
tmpfs           238M     0  238M   0% /dev/shm
tmpfs           238M  8.8M  230M   4% /run
tmpfs           238M     0  238M   0% /sys/fs/cgroup
/dev/sda1       397M   94M  303M  24% /boot
tmpfs            48M     0   48M   0% /run/user/0
tmpfs            48M     0   48M   0% /run/user/1000
tmpfs            48M     0   48M   0% /run/user/1007
/dev/sr0        4.1G  4.1G     0 100% /mnt
[root@node2 yum.repos.d]# ls -l /media/cdrom/
total 614
-rw-r--r-- 1 root root     16 Apr  1  2015 CentOS_BuildTag
drwxr-xr-x 3 root root   2048 Mar 28  2015 EFI
-rw-r--r-- 1 root root    215 Mar 28  2015 EULA
-rw-r--r-- 1 root root  18009 Mar 28  2015 GPL
drwxr-xr-x 3 root root   2048 Mar 28  2015 images
drwxr-xr-x 2 root root   2048 Mar 28  2015 isolinux
drwxr-xr-x 2 root root   2048 Mar 28  2015 LiveOS
drwxr-xr-x 2 root root 589824 Apr  1  2015 Packages
drwxr-xr-x 2 root root   4096 Apr  1  2015 repodata
-rw-r--r-- 1 root root   1690 Mar 28  2015 RPM-GPG-KEY-CentOS-7
-rw-r--r-- 1 root root   1690 Mar 28  2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r-- 1 root root   2883 Apr  1  2015 TRANS.TBL

这是我配置的yum仓库客户端的配置文件
[root@node2 yum.repos.d]# cat local-base.repo
[CentOS7-localbase]
name=CentOS 7 local iso base
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1

[root@node2 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
CentOS7-localbase                                                                                      | 3.6 kB  00:00:00     
(1/2): CentOS7-localbase/group_gz                                                                      | 154 kB  00:00:00     
(2/2): CentOS7-localbase/primary_db                                                                    | 2.7 MB  00:00:00     
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.shu.edu.cn
 * updates: mirrors.163.com
repo id                                                  repo name                                                      status
CentOS7-localbase                                        CentOS 7 local iso base                                        3,576
base/7/x86_64                                            CentOS-7 - Base                                                9,911
extras/7/x86_64                                          CentOS-7 - Extras                                                432
updates/7/x86_64                                         CentOS-7 - Updates                                             1,602
repolist: 15,521
上面可以看出,我们的配置的已经可以被查询出来了。

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

3.3.2、配置网络yum仓库

自己准备一些软件包,然后构建一个yum的服务端仓库,然后通过http协议给本地机器走http协议访问。

yum server:

1、创建一个文件系统目录,上传一些软件包(模拟测试用的)
[root@node2 ~]# mkdir -p /data/yum_server
[root@node2 ~]# cd /data/yum_server
[root@node2 yum_server]# ls /data/yum_server
DenyHosts-2.6.tar.gz           nginx-1.10.3.tar.gz   redis-3.2.11.tar.gz  redis-4.0.3.tar.gz  redis-4.0.9.tar.gz
extundelete-0.2.4.tar.bz2      nginx-1.12.2.tar.gz   redis-3.2.3.tar.gz   redis-4.0.4.tar.gz  ss5-3.8.9-8.tar.gz
fping-2.4b2-10.el6.x86_64.rpm  nginx-1.14.0.tar.gz   redis-3.2.8.tar.gz   redis-4.0.5.tar.gz  tcl8.6.6-src.tar.gz
keepalived-1.2.20.tar.gz       nginx-1.6.3.tar.gz    redis-4.0.0.tar.gz   redis-4.0.6.tar.gz
kubernetes-1.11.2.zip          Python-2.7.13.tar.xz  redis-4.0.1.tar.gz   redis-4.0.7.tar.gz
lynis-2.5.7.tar.gz             redis-3.2.10.tar.gz   redis-4.0.2.tar.gz   redis-4.0.8.tar.gz

2、安装createrepo
[root@node2 yum_server]# rpm -q createrepo
package createrepo is not installed
[root@node2 yum_server]# yum install createrepo
......

3、 初始化repodata索引文件
-d --database
       Generate sqlite databases for use with yum. This is now the default.
-p --pretty
       Output xml files in pretty format.
-o --outputdir 
       Optional output directory (useful for read only media).

[root@node2 yum_server]# createrepo -pdo /data/yum_server/ /data/yum_server/
Spawning worker 0 with 1 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@node2 yum_server]# ls /data/yum_server/
DenyHosts-2.6.tar.gz           nginx-1.10.3.tar.gz   redis-3.2.11.tar.gz  redis-4.0.3.tar.gz  redis-4.0.9.tar.gz
extundelete-0.2.4.tar.bz2      nginx-1.12.2.tar.gz   redis-3.2.3.tar.gz   redis-4.0.4.tar.gz  repodata
fping-2.4b2-10.el6.x86_64.rpm  nginx-1.14.0.tar.gz   redis-3.2.8.tar.gz   redis-4.0.5.tar.gz  ss5-3.8.9-8.tar.gz
keepalived-1.2.20.tar.gz       nginx-1.6.3.tar.gz    redis-4.0.0.tar.gz   redis-4.0.6.tar.gz  tcl8.6.6-src.tar.gz
kubernetes-1.11.2.zip          Python-2.7.13.tar.xz  redis-4.0.1.tar.gz   redis-4.0.7.tar.gz
lynis-2.5.7.tar.gz             redis-3.2.10.tar.gz   redis-4.0.2.tar.gz   redis-4.0.8.tar.gz
[root@node2 yum_server]# ls /data/yum_server/repodata
0dd81bd3480e1b700ef4d8501952ada4c17f0f7aa6e33b2ecdc1986327bcef70-primary.sqlite.bz2
54b9a1903b8bd39bcfd5c1e35840a19891a1187d078a009b4882aedf24e21154-filelists.sqlite.bz2
59026382882aae681f9af6f060b7d151f36be0e82583dcd07652cc7bb74d9f8c-other.sqlite.bz2
71b15f14ece520f2722a1648481a433c30e4bff9e407b89ad4d22f0ec40b90bd-other.xml.gz
cb1c34973cff8ddb6b6f40fc48ddaec468c057f9ff62c20fad26119d278b6c85-primary.xml.gz
dc8a69e32b8fbfd2a3d54f6f92ed53561754e3bf68b4263be3e74323a1bb2549-filelists.xml.gz
repomd.xml
[root@node2 yum_server]# cat /data/yum_server/repodata/repomd.xml |wc -l
55

4、通过http协议实现yum的文件传输
(1) 安装nginx
yum install nginx
此步骤要包装本地配置的yum客户端配置指向的启用的yum源,要有nginx安装包,常见的EPEL源和nginx官方自己的
yum仓库就提供nginx的软件包;

(2) 修改nginx主页指向

vim /etc/nginx/conf.d/default.conf
默认 root   /usr/share/nginx/html
改为
root /data/yum_server
(3) 设置nginx主页权限和防火墙放行http服务(我没有启用Selinux机制)
[root@node2 ~]# id nginx
uid=998(nginx) gid=996(nginx) groups=996(nginx)
[root@node2 ~]# setfacl -R -m u:nginx:r-- /data/yum_server
[root@node2 ~]# getfacl /data/yum_server
getfacl: Removing leading '/' from absolute path names
# file: data/yum_server
# owner: root
# group: root
user::rwx
user:nginx:r--
group::r-x
mask::r-x
other::r-x
[root@node2 ~]# getfacl /data/yum_server/redis-4.0.1.tar.gz 
getfacl: Removing leading '/' from absolute path names
# file: data/yum_server/redis-4.0.1.tar.gz
# owner: root
# group: root
user::rw-
user:nginx:r--
group::r--
mask::r--
other::r--
[root@node2 yum.repos.d]#  getfacl -p /data/yum_server/redis-4.0.1.tar.gz 
# file: /data/yum_server/redis-4.0.1.tar.gz
# owner: root
# group: root
user::rw-
user:nginx:r--
group::r--
mask::r--
other::r--

[root@node2 yum.repos.d]#  getfacl -p /data/yum_server/nginx-1.14.0.tar.gz 
# file: /data/yum_server/nginx-1.14.0.tar.gz
# owner: root
# group: root
user::rw-
user:nginx:r--
group::r--
mask::r--
other::r--

Firewalld防火墙放行http:
[root@node2 yum.repos.d]# firewall-cmd --help|grep add-service
  --add-service=
[root@node2 yum.repos.d]# firewall-cmd --add-service=http --permanent
success
[root@node2 yum.repos.d]# firewall-cmd --reload
success
[root@node2 yum.repos.d]# firewall-cmd --list-services
dhcpv6-client http ssh

(5) 启动nginx,尝试机房访问测试
[root@node2 ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@node2 ~]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@node2 ~]# systemctl start nginx.service
[root@node2 ~]# ss -nlt|grep :80
LISTEN     0      128                       *:80                       *:* 

如果是单纯的文件访问没问题,不过要想列出nginx的文件列表,首先nginx的工作进程用户要
对主页的那个目录有执行权限,其次,对应的站点的配置要添加以下内容:
autoindex on;  # 开启目录文件列表
autoindex_exact_size on;  # 显示出文件的确切大小,单位是bytes
autoindex_localtime on;  # 显示的文件时间为文件的服务器时间
charset utf-8,gbk;  # 避免中文乱码

给执行权限:
[root@node2 ~]# setfacl -R -m u:nginx:r-x /data/yum_server
[root@node2 ~]# getfacl -p /data/yum_server
# file: /data/yum_server
# owner: root
# group: root
user::rwx
user:nginx:r-x
group::r-x
mask::r-x
other::r-x
nginx -t检测语法,成功后,
systemctl reload nginx.service 重新加载

站点浏览器访问测试![](http://i2.51cto.com/images/blog/201810/28/584f59f82b3f4df557b5f0fae32705a0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

(6)、准备另外一台主机,配置客户端yum源的baseurl指向上面配置的http站点

客户端配置:
[local-http]
name=centos7 local http
baseurl=http://172.168.110.21/
enable=1
gpgcheck=0

这里有些凌乱了,我把源码包传到我的yum服务器的软件包目录了,我应该准备rpm包。
拷贝一些光盘的软件包到我的yum服务端的对应目录。
[root@node2 yum_server]# cp /media/cdrom/Packages/*.rpm .
[root@node2 yum_server]# du -sh /data/yum_server/
3.6G    /data/yum_server/
重新授权:
[root@node2 yum_server]# setfacl -R -m u:nginx:r-x /data/yum_server
软件包加入或变更,要手动更新一下:(更新是非常吃cpu资源的,请不要在有业务的生成环境上测试)
[root@node2 yum_server]# createrepo --update /data/yum_server
Spawning worker 0 with 3576 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
客户端重启构建一下缓存数据:
[root@node1 yum.repos.d]# yum makecache
Loaded plugins: fastestmirror
local-http                                                                                             | 2.9 kB  00:00:00     
(1/3): local-http/primary_db                                                                           | 2.7 MB  00:00:00     
(2/3): local-http/filelists_db                                                                         | 2.7 MB  00:00:00     
(3/3): local-http/other_db                                                                             | 1.1 MB  00:00:00     
Loading mirror speeds from cached hostfile
Metadata Cache Created

我之前把系统默认自带的repo都备份了,现在哪台客户端主机只剩下这个配置的http的yum仓库。
[root@node1 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id                                                 repo name                                                       status
local-http                                              centos7 local http                                              3,577
repolist: 3,577
[root@node1 yum.repos.d]# yum info zsh
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available Packages
Name        : zsh
Arch        : x86_64
Version     : 5.0.2
Release     : 7.el7
Size        : 2.4 M
Repo        : local-http
Summary     : Powerful interactive shell
URL         : http://zsh.sourceforge.net/
License     : MIT
Description : The zsh shell is a command interpreter usable as an interactive login
            : shell and as a shell script command processor.  Zsh resembles the ksh
            : shell (the Korn shell), but includes many enhancements.  Zsh supports
            : command line editing, built-in spelling correction, programmable
            : command completion, shell functions (with autoloading), a history
            : mechanism, and more.
[root@node1 yum.repos.d]# yum install zsh
......
[root@node1 yum.repos.d]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64
经过简单测试后,发现没有问题。

PS:一般构建自己的yum服务器,会去外网同步更新yum仓库的软件包(这台服务器必须要保证出口带宽)。如果
走外网提供yum文件传输的话,可以这样做,同步外网的软件包,然后对内走内网使用yum仓库。
比较有名的,CentOS的自己的源,163的源,EPEL的源,阿里云的源等等。

四、rpm包管理器的前端工具dnf(精简说明)

默认base仓库没有dnf软件包,需要特殊配置,就连EPEL源也没有,所以我这里只是简单的介绍一下。

网上google的做法:

yum -y install wget
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64//dnf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf-0.6.4-2.sdl7.noarch.rpm  
yum -y install python-dnf-0.6.4-2.sdl7.noarch.rpm  dnf-0.6.4-2.sdl7.noarch.rpm dnf-conf-0.6.4-2.sdl7.noarch.rpm 

[root@node2 ~]# yum info dnf
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * epel: mirrors.yun-idc.com
 * extras: mirrors.shu.edu.cn
 * updates: mirrors.163.com
Installed Packages
Name        : dnf
Arch        : noarch
Version     : 0.6.4
Release     : 2.sdl7
Size        : 652 k
Repo        : installed
From repo   : /dnf-0.6.4-2.sdl7.noarch
Summary     : Package manager forked from Yum, using libsolv as a dependency resolver
URL         : https://github.com/rpm-software-management/dnf
License     : GPLv2+ and GPLv2 and GPL
Description : Package manager forked from Yum, using libsolv as a dependency resolver.

dnf是是下一个即将到来的主要版本的yum,它是基于rpm包管理器的linux发型版本的包管理器。(很谦虚)
它大体上维护了与YUM兼容的CLI,并定义了扩展和插件的严格API。yum相较yum是有有点的,不过目前
的CentOS 7.x没有采纳进来, Fedora 22 已经默认使用 DNF作为包前端管理器。

dnf语法结构:
dnf [options]  [...]
Available commands are:

· autoremove
· check-update
· clean
· distro-sync
· downgrade
· group
· help
· history
· info
· install
· list
· makecache
· provides
· reinstall
· remove
· repolist
· repository-packages
· search
· updateinfo
· upgrade
· upgrade-to

1、安装和重新安装
dnf [options] install ...
dnf [options] reinstall ...

2、检测更新和更新
dnf [options] check-update [...]
dnf [options] upgrade

3、卸载
dnf [options] erase ...
dnf [options] remove ...

4、查看repo和软件包以及列表
dnf [options] repolist [enabled|disabled|all]
dnf [options] info [...]
dnf [options] list [all] [...]
dnf [options] list installed [...]
dnf [options] list available [...]
dnf [options] list extras [...]
dnf [options] list obsoletes [...]
dnf [options] list recent [...]
dnf [options] list upgrades [...]

5、检索软件包
dnf [options] search [all] ...

6、清理缓存和构建缓存
dnf clean dbcache
dnf clean expire-cache
dnf clean metadata
dnf clean packages
dnf clean plugins
dnf clean all
dnf [options] makecache

等(其他查看软件包的能力,以及包组管理相关,我就不列出来了,也是支持的,和yum几乎差别不大)

你可能感兴趣的:(linux下包管理器)