Linux 包管理


导读类 Unix 操作系统 提供 一种中心化的机制 来搜索和安装软件 软件存放在存储库中  通过包的形式分发 处理包的工作被称为包管理 包提供了操作系统的基本组件 以及共享的库 应用程序 服务和文档


介绍

包管理系统 安装软件 更新已经安装的包 包存储库 有助于确保 系统中使用的代码是经过审查的  软件的安装版本已经得到了开发人员和包维护人员的认可

在配置服务器或开发环境时 最好了解下包在官方存储库之外的情况 某个发行版的稳定版本中的包有可能已经过时了 尤其是那些新的或者快速迭代的软件 然而 包管理无论对于 系统管理员 还是开发人员 都是至关重要的技能 而已打包的软件对于主流  Linux 发行版 也是一笔巨大的财富

多种 Linux 发行版 查找 安装 升级软件包 基础知识  在多个系统之间进行交叉对比

包管理系统 简要概述

大多数包系统都是围绕包文件的集合构建的 包文件通常是一个存档文件 它包含已编译的二进制文件和软件的其他资源 以及安装脚本 包文件同时也包含有价值的元数据 包括它们的依赖项  及安装和运行 所需的其他包的列表

虽然这些包管理系统的功能和优点大致相同 但打包格式和工具却因平台而异

操作系统格式工具
Debian.debapt, apt-cache, apt-get, dpkg
Ubuntu.debapt, apt-cache, apt-get, dpkg
CentOS.rpmyum
Fedora.rpmdnf
FreeBSDPorts, .txzmake, pkg

Debian 及其衍生版 如 Ubuntu Linux Mint 和 Raspbian  包格式是 .deb APT 这款先进的包管理工具提供了大多数常见的 操作命令 搜索存储库 安装软件包及其依赖项 并管理升级 在本地系统中 还可以使用 dpkg 程序来安装单个的 deb 文件 APT命令 作为底层 dpkg 的前端 有时也会直接调用它

最近发布的 debian 衍生版大多数都包含了 apt 命令 它提供了一个简洁统一的接口 可用于通常由 apt-get 和 apt-cache 命令处理的常见操作 这个命令可选 但使用它可以简化一些任务

CentOS Fedora 和其它 Red Hat 家族成员使用 RPM 文件 在 CentOS 中 通过 yum 来与单独的包文件和存储库进行交互

在最近的 Fedora 版本中 yum 已经被 dnf 取代 dnf 是它的一个现代化的分支 它保留了大部分 yum的接口

FreeBSD  二进制包系统 由 pkg 命令管理 FreeBSD 还提供了 Ports 集合 这是一个存在于本地的目录结构和工具  允许用户获取源码 使用 Makefile  从源码编译和安装包

更新包列表

多数系统 本地有一个和远程存储库 对应的包数据库 在安装或升级包前最好更新一下这个数据库 另外 yum 和 dnf 在执行一些操作之前 会自动检查更新  可以在任何时候对系统进行更新

系统命令
Debian / Ubuntusudo apt-get update

sudo apt update
CentOSyum check-update
Fedoradnf check-update
FreeBSD Packagessudo pkg update
FreeBSD Portssudo portsnap fetch update
更新已安装的包

没有包系统  想确保机器 所有已安装的软件 保持在最新的状态是 很艰巨的任务  跟踪数百个不同包的上游 更改和安全警报 虽然包管理器 不能解决升级软件时遇到的所有问题 但 确实使你能够使用一些命令来维护大多数系统组件

在 FreeBSD  升级已安装的 ports 可能会引入破坏性的改变 有些步骤还需要进行手动配置  在通过 portmaster 更新之前最好阅读下 /usr/ports/UPDATING 的内容

系统命令说明
Debian / Ubuntusudo apt-get upgrade只更新已安装的包

sudo apt-get dist-upgrade可能会增加或删除包以满足新的依赖项

sudo apt upgrade和 apt-get upgrade 类似

sudo apt full-upgrade和 apt-get dist-upgrade 类似
CentOSsudo yum update
Fedorasudo dnf upgrade
FreeBSD Packagessudo pkg upgrade
FreeBSD Portsless /usr/ports/UPDATING使用 less 来查看 ports 的更新提示(使用上下光标键滚动 按 q 退出)

cd /usr/ports/ports-mgmt/portmaster && sudo make install && sudo portmaster -a安装 portmaster 然后使用它更新已安装的 ports
搜索某个包

大多数发行版 提供 针对包集合的图形化或菜单驱动的工具  可以分类浏览软件 是 发现新软件的好方法 查找包最快 最有效的方法是使用命令行  搜索

系统命令说明
Debian / Ubuntuapt-cache search search_string

apt search search_string
CentOSyum search search_string

yum search all search_string搜索所有的字段 包括描述
Fedoradnf search search_string

dnf search all search_string搜索所有的字段 包括描述
FreeBSD Packagespkg search search_string通过名字进行搜索

pkg search -f search_string通过名字进行搜索并返回完整的描述

pkg search -D search_string搜索描述
FreeBSD Portscd /usr/ports && make search name=package通过名字进行搜索

cd /usr/ports && make search key=search_string搜索评论 描述和依赖
查看某个软件包的信息

安装软件包之前   通过 阅读包的描述  获得 有用的信息 除了人类可读的文本之外 这些内容通常包括像版本号这样的元数据和包的依赖项列表

系统命令说明
Debian / Ubuntuapt-cache show package显示有关包的本地缓存信息

apt show package

dpkg -s package显示包的当前安装状态
CentOSyum info package

yum deplist package列出包的依赖
Fedoradnf info package

dnf repoquery --requires package列出包的依赖
FreeBSD Packagespkg info package显示已安装的包的信息
FreeBSD Portscd /usr/ports/category/port && cat pkg-descr
从存储库安装包

知道包名后  用一个命令来安装它及其依赖  也可以一次性安装多个包 只需将它们全部列出来即可

系统命令说明
Debian / Ubuntusudo apt-get install package

sudo apt-get install package1 package2 ...安装所有列出来的包

sudo apt-get install -y package在 apt 提示是否继续的地方直接默认 yes

sudo apt install package显示一个彩色的进度条
CentOSsudo yum install package

sudo yum install package1 package2 ...安装所有列出来的包

sudo yum install -y package在 yum 提示是否继续的地方直接默认 yes
Fedorasudo dnf install package

sudo dnf install package1 package2 ...安装所有列出来的包

sudo dnf install -y package在 dnf 提示是否继续的地方直接默认 yes
FreeBSD Packagessudo pkg install package

sudo pkg install package1 package2 ...安装所有列出来的包
FreeBSD Portscd /usr/ports/category/port && sudo make install从源码构建安装一个 port
从本地文件系统安装一个包

有些软件官方 没有提供相应的包  开发人员或供应商将需要提供包文件的下载   可以通过 web 浏览器检索这些包 或 通过命令行 curl 来检索信息 将包下载到目标系统  可以通过单个命令来安装

在 Debian 派生的系统上 dpkg 用来处理单个的包文件 如果一个包有未满足的依赖项 那么 可以使用 gdebi 从官方存储库中检索

在 CentOS 和 Fedora 系统上 yum 和 dnf 用于安装单个的文件 并且会处理需要的依赖

系统命令说明
Debian / Ubuntusudo dpkg -i package.deb

sudo apt-get install -y gdebi && sudo gdebi package.deb安装 gdebi 然后使用 gdebi 安装 package.deb 并处理缺失的依赖
CentOSsudo yum install package.rpm
Fedorasudo dnf install package.rpm
FreeBSD Packagessudo pkg add package.txz

sudo pkg add -f package.txz即使已经安装的包也会重新安装
删除一个或多个已安装的包

包管理器知道给定的软件包提供了哪些文件 因此如果某个软件不再需要了  通常可以干净利落地从系统中清除这些文件

系统命令说明
Debian / Ubuntusudo apt-get remove package

sudo apt remove package

sudo apt-get autoremove删除不需要的包
CentOSsudo yum remove package
Fedorasudo dnf erase package
FreeBSD Packagessudo pkg delete package

sudo pkg autoremove删除不需要的包
FreeBSD Portssudo pkg delete package

cd /usr/ports/path_to_port && make deinstall卸载 port
apt 命令

Debian 家族发行版的管理员通常熟悉 apt-get 和 apt-cache 较少为人所知的是简化的 apt 接口  是专为交互式使用而设计的

传统命令等价的 apt 命令
apt-get updateapt update
apt-get dist-upgradeapt full-upgrade
apt-cache search stringapt search string
apt-get install packageapt install package
apt-get remove packageapt remove package
apt-get purge packageapt purge package

虽然 apt 通常是一个特定操作的快捷方式 并不能完全替代传统的工具 接口可能会随着版本的不同而发生变化 以提高可用性 如果 在脚本或 shell 管道中使用包管理命令 那么最好还是坚持使用 apt-get 和 apt-cache

获取帮助

基于 web 文档  shell 从 Unix 手册页(通常称为 man 页面)中获得大多数的命令 比如要阅读某页 可以使用 man

在 man 中 可以用箭头键导航 按 / 搜索页面内的文本 使用 q 退出

系统命令说明
Debian / Ubuntuman apt-get更新本地包数据库以及与包一起工作

man apt-cache在本地的包数据库中搜索

man dpkg和单独的包文件一起工作以及能查询已安装的包

man apt通过更简洁 用户友好的接口进行最基本的操作
CentOSman yum
Fedoraman dnf
FreeBSD Packagesman pkg和预先编译的二进制包一起工作
FreeBSD Portsman ports和 Ports 集合一起工作