Package manager (APT, YUM, DNF)

Table of Contents

1. APT 系列

apt stands for Advanced Package Tool.

apt-get 的源配置文件为:/etc/apt/sources.list

1.1. apt-get

更新本机数据库缓存,更改 sources.list 后要做这个操作:

apt-get update

安装软件包,如果有其他依赖则自动安装相应的依赖软件包。package_name 可以是多个软件包:

apt-get install package_name

卸载软件包,但保留配置文件:

apt-get remove package_name

卸载软件包,把它依赖的不再需要的软件包也卸载。如果 autoremove 后不加 package_name,则把自动安装的不再需要的所有软件包都卸载:

apt-get autoremove package_name

卸载软件包,同时删除配置文件:

apt-get purge package_name

清理所有的缓存文件,这会清理所有/var/cache/apt/archives/和/var/cache/apt/archives/partial/中没有被锁定的文件:

apt-get clean

仅仅清理旧的缓存文件,这会清理旧版本的/var/cache/apt/archives/和/var/cache/apt/archives/partial/中的文件:

apt-get autoclean

下载软件包 package_name 的源码:

apt-get source package_name

仅下载软件包 package_name,不会安装它:

apt-get download package_name

检查所有包的信赖关系:

apt-get check

移除那些标记 broken 的软件包:

apt-get --fix-broken install/remove

--fix-broken 也可省略为 -f。-f 参数后接 install 或 remove 作用一样(后面不要带软件包名),都会移除那些标记 broken 的软件包(软件包通过 dpkg -i 方式安装时,就算依赖没有满足也可能会安装,但这些软件包会标记为 broken)。

1.2. apt-cache

显示指定软件包的信息,包括版本号,包依赖关系等:

apt-cache show package_name

搜索软件包,可以按关键字(可以用正则表达式)查找软件包,通常用于查询的关键字会使用软件包的名字或软件包的一部分:

apt-cache search package_name

显示软件包的依赖关系信息:

apt-cache showpkg package_name

显示当前系统所使用的数据源的统计信息,用户可以使用该命令查看数据源的相关统计信息:

apt-cache stats

显示软件包的安装状态和版本信息:

apt-cache policy package_name

显示指定软件包所依赖的软件包:

apt-cache depends package_name

查询指定软件包的反向依赖关系,即那些其他的软件包需要依赖你所指定的软件包作为安装和运行的必须条件:

apt-cache rdepends package_name

显示缓存中的每个软件包的简要描述信息:

apt-cache dump

1.3. apt-file

apt-file 可用于查找某个文件属于存在于哪些软件包中。这个命令不是系统自带的,需要自己安装,安装后需要对 apt-file 进行更新:

$ sudo apt-get install apt-file
$ sudo apt-file update

1.3.1. 实例:搜索头文件所在软件包

在编译安装某程序时,常常会提示找不到某个头文件,比如找不到 X11/Intrinsic.h 文件。

可以用 apt-file 搜索缺失的文件,例如:

$ apt-file search Intrinsic.h

这样就可以找到答案了
libxt-dev: /usr/include/X11/Intrinsic.h
最后把安装 libxt-dev 就可以了。

注意:如果找不到搜索的文件,要试试先更新一下 sudo apt-file update。

1.4. dpkg

dpkg stands for Debian GNU/Linux Package Manager

dpkg 基本用法:

安装软件 package_file.deb:

dpkg -i package_file.deb

卸载 deb 软件,不删除其配置文件:

dpkg -r package_name

卸载 deb 软件,同时删除其配置文件:

dpkg -P package_name

列出软件包(必须已安装)包含哪些文件:

dpkg -L package_name

注:可以通过命令 dpkg --contents package_file.deb(--contents 可省写为 -c)查看一个软件包在安装后将会产生哪些文件到系统中。

列出所有已经安装的软件包:

dpkg -l

列出以 gcc 开头的软件包状态:

dpkg -l gcc*

查看某个文件属于哪个软件包:

dpkg -S file

如下面命令可以查看/usr/share/doc/gcc-3.4-base/FAQ.gz 属于哪个软件包:

$ dpkg -S /usr/share/doc/gcc-3.4-base/FAQ.gz
gcc-3.4: /usr/share/doc/gcc-3.4-base/FAQ.gz

注:这个命令非常有用,如果不知道系统中的某个工具来自哪个软件包,就可以通过它来查询。

显示软件包的详细状态信息:

dpkg -s package_name

通过软件包查询相关信息(当然前提是手头有 deb 文件):

dpkg -I package_file.deb   # 或者 dpkg --info package_file.deb

注:安装软件时指定的是 deb 的文件名,而卸载时指定的是“软件名”。

删除 rc 状态的包
rc 状态的包,即已经卸载了却保留了配置文件的包。
如果想要完整删除所有 rc 状态的包,一个一个删还是很麻烦的,可以使用以下命令进行清理:

dpkg -l | grep ^rc | cut -d' ' -f3 | sudo xargs dpkg --purge

摘自:http://blog.csdn.net/chrisniu1984/article/details/6619755

卸载(并删除其配置文件)以 libobasis3.4-开头的所有软件包:

dpkg -l libobasis3.4-*| grep ^ii | cut -d' ' -f3 | sudo xargs dpkg --purge

查看匹配的包:

dpkg --get-selections package-name-pattern

如:dpkg --get-selections gimp*
会找到以 gimp 开头的软件包。

参考:http://yiranwuqing.iteye.com/blog/869177

1.4.1. dpkg-deb

手里有个 deb 文件,想知道安装后会在系统里增加哪些文件:

dpkg-deb -c file.deb

1.5. Tips

1.5.1. 设置代理

在/etc/apt/下建一个 apt.conf 的文件,并在文件中输入:

Acquire::http::proxy "http://yourproxy:yourport/";

注意:最后面必须用“;”结束。

1.5.2. 增加源(apt-add-repository)

最好不要手动编辑 /etc/apt/sources.list,如果要增加源时,可以使用 apt-add-repository 命令。如:

$ sudo apt-add-repository 'deb http://repos.codelite.org/ubuntu/ trusty universe'

2. yum VS. apt

2.1. 添加、删除、更新软件包

添加、删除、更新软件包相关命令如表 1 所示。

Table 1: 添加、删除、更新软件包
任务 redhat debian
刷新软件包列表 Yum 每次运行自动刷新 apt-get update
从软件包仓库安装软件 yum install package_name apt-get install package_name
从文件安装软件包 yum install package.rpm rpm -i package.rpm dpkg --install package.deb
删除软件包 yum remove package_name apt-get remove package_name
删除软件包及其依赖 yum autoremove package_name apt-get autoremove package_name
检查软件包是否有升级 yum check-update apt-get -s upgrade apt-get -s dist-upgrade
升级软件包 yum update rpm -Uvh [args] apt-get dist-upgrade
升级整个系统 yum upgrade apt-get dist-upgrade

2.2. 软件包信息

软件包信息相关命令如表 2 所示。

Table 2: 软件包信息
任务 redhat debian
搜索软件包 yum search package_name apt-cache search package_name
显示库中存在的软件包 yum list available apt-cache dumpavail
显示已安装的软件包 yum list installed 或者 rpm -qa dpkg --list
显示某软件包信息 yum info package_name apt-cache show package_name
显示已安装的某软件包信息 rpm -qi package_name dpkg --status package_name
显示已安装的某软件包的文件 rpm -ql package_name dpkg --listfiles package_name
显示已安装的某软件包的文档文件 rpm -qd package_name -
显示已安装的某软件包的配置文件 rpm -qc package_name -
显示指定软件包的依赖项 rpm -qR package_name apt-cache depends
显示哪些软件包依赖指定的包(反向依赖关系) rpm -q --whatrequires [args] apt-cache rdepends

2.3. 软件包文件信息

软件包文件信息相关命令如表 3 所示。

Table 3: 软件包文件信息
任务 redhat debian
获得某软件包文件信息 rpm -qpi package.rpm dpkg --info package.deb
显示包中的文件 rpm -qpl package.rpm dpkg --contents package.deb
显示包中的文档文件 rpm -qpd package.rpm -
显示包中的配置文件 rpm -qpc package.rpm -
解压缩包中的文件 rpm2cpio package.rpm | cpio -vid dpkg-deb --extract package.deb dir-to-extract-to
查找指定文件是哪个包安装的 rpm -qf filename dpkg --search filename
查找提供某文件的包 yum provides filename | yum whatprovides filename apt-file search filename

2.3.1. 查询未安装软件包所提供的所有文件

在 Redhat 中,可以使用 dnf repoquery -l package_name 查询 package_name(可以是还未安装到系统中的软件包)所提供的所有文件,如:

$ sudo dnf repoquery -l openssl-devel

参考:https://stackoverflow.com/questions/104055/how-to-list-the-contents-of-a-package-using-yum

2.3.2. 使用 whatprovides 查找文件所在软件包

使用 yum whatprovides 可以查找某文件(如 libpng.so)所在软件包,需要说明的是使用它时需要指定路径。

$ yum whatprovides libpng.so                  # 没有指定路径,这个命令什么都找不到!

正确的用法是指定完整路径,或者使用通配符,如:

$ yum whatprovides /usr/lib64/libpng.so       # 使用完整路径
2:libpng-devel-1.5.13-7.el7_2.x86_64 : Development tools for programs to manipulate PNG image format files
Repo        : @base/7Server
Matched from:
Filename    : /usr/lib64/libpng.so
$ yum whatprovides '*libpng.so*'              # 记不住完整路径,就使用通配符
2:libpng-devel-1.5.13-7.el7_2.x86_64 : Development tools for programs to manipulate PNG image format files
Repo        : @base/7Server
Matched from:
Filename    : /usr/lib64/libpng.so

2.4. 其他命令

其他的包管理命令如表 4 所示。

Table 4: 其他的包管理命令
任务 redhat debian
显示软件包缓存统计信息 - apt-cache stats
验证所有已安装的软件包 rpm -Va debsums
移除本地缓存目录中的软件包 yum clean packages apt-get clean
仅移除本地缓存目录中已过时的软件包 - apt-get autoclean
移除本地缓存目录中的头文件(强制下次使用时重新下载) yum clean headers apt-file purge
软件库位置定义 /etc/yum.conf /etc/apt/sources.list

2.5. yum repository 管理

执行 yum-config-manager --add-repo repository_url 可以增加一个 repository,如:

$ yum-config-manager --add-repo http://www.example.com/example.repo
Loaded plugins: product-id, refresh-packagekit, subscription-manager
adding repo from: http://www.example.com/example.repo
grabbing file http://www.example.com/example.repo to /etc/yum.repos.d/example.repo
example.repo                                             |  413 B     00:00
repo saved to /etc/yum.repos.d/example.repo

注:也可以通过下载 example.repo 文件,保存到目录 /etc/yum.repos.d/ 中的方式来增加 repository。

执行 yum repolist all 可列出所有本地安装的 repository(包含启用和禁用的),如:

$ yum repolist all
Not root, Subscription Management repositories not updated

repo id                                                  repo name                             status
codeready-builder-for-rhel-8-rhui-debug-rpms             Red Hat CodeReady Linux Builder for R disabled
codeready-builder-for-rhel-8-rhui-rpms                   Red Hat CodeReady Linux Builder for R disabled
codeready-builder-for-rhel-8-rhui-source-rpms            Red Hat CodeReady Linux Builder for R disabled
docker-ce-nightly                                        Docker CE Nightly - x86_64            disabled
docker-ce-nightly-debuginfo                              Docker CE Nightly - Debuginfo x86_64  disabled
docker-ce-nightly-source                                 Docker CE Nightly - Sources           disabled
docker-ce-stable                                         Docker CE Stable - x86_64             enabled
docker-ce-stable-debuginfo                               Docker CE Stable - Debuginfo x86_64   disabled
docker-ce-stable-source                                  Docker CE Stable - Sources            disabled
docker-ce-test                                           Docker CE Test - x86_64               disabled
docker-ce-test-debuginfo                                 Docker CE Test - Debuginfo x86_64     disabled
docker-ce-test-source                                    Docker CE Test - Sources              disabled
rhel-8-appstream-rhui-debug-rpms                         Red Hat Enterprise Linux 8 for x86_64 disabled
rhel-8-appstream-rhui-rpms                               Red Hat Enterprise Linux 8 for x86_64 enabled
rhel-8-appstream-rhui-source-rpms                        Red Hat Enterprise Linux 8 for x86_64 disabled
rhel-8-baseos-rhui-debug-rpms                            Red Hat Enterprise Linux 8 for x86_64 disabled
rhel-8-baseos-rhui-rpms                                  Red Hat Enterprise Linux 8 for x86_64 enabled
rhel-8-baseos-rhui-source-rpms                           Red Hat Enterprise Linux 8 for x86_64 disabled
rhel-8-supplementary-rhui-debug-rpms                     Red Hat Enterprise Linux 8 - Suppleme disabled
rhel-8-supplementary-rhui-rpms                           Red Hat Enterprise Linux 8 - Suppleme disabled
rhel-8-supplementary-rhui-source-rpms                    Red Hat Enterprise Linux 8 - Suppleme disabled
rhui-client-config-server-8-ha                           Red Hat Update Infrastructure 3 Clien enabled
rhui-rhel-8-for-x86_64-highavailability-debug-rhui-rpms  Red Hat Enterprise Linux 8 for x86_64 disabled
rhui-rhel-8-for-x86_64-highavailability-rhui-rpms        Red Hat Enterprise Linux 8 for x86_64 enabled
rhui-rhel-8-for-x86_64-highavailability-source-rhui-rpms Red Hat Enterprise Linux 8 for x86_64 disabled

启用和禁用 repository 的命令如下(其中需要的 repository_id 可以通过 yum repolist all 找到):

$ yum-config-manager --enable repository_id      # 启用 repository
$ yum-config-manager --disable repository_id     # 禁用 repository

3. dnf(下一代 yum)

DNF 作为下一代 yum,内置在 RHEL 8、CentOS 8 和 Fedora 中,它保留了大部分 yum 的接口,和 yum 的使用区别不大。在 RHEL 8 中 yum 命令其实只是 dnf-3 命令的一个软连接。

如果服务器用于开发环境,需要安装编译源码所需要的一些工具(如 make,gcc 等):

$ dnf group install "Development Tools"

Author: cig01

Created: <2012-07-07 Sat>

Last updated: <2022-01-12 Wed>

Creator: Emacs 27.1 (Org mode 9.4)