大多数现代类Unix系统都提供了查找和安装软件的包管理工具。软件通常以软件包的形式储存在仓库中,管理软件一般叫做软件包管理。包是一个操作系统的基础组成部分,它包含共享库、应用程序、服务程序和文档。
包管理工具除了提供安装软件之外,还包括升级软件。仓库里的软件包都是经过测试的,不同版本的软件已经通过软件开发者和软件包维护者的实际测试。在配置服务器或开发环境时,非常有必要看一下官方仓库,因为仓库中稳定版本的软件包有时会是很老的旧版本。
软件包管理是系统管理员和开发者都要掌握的基本技能,对于主流发型版来说,它里面包含的软件包资源相当的多,而且绝大部分的软件包都是开源的。
这篇文章介绍不同发型版软件包管理工具的基本使用:查找、安装和升级软件包。
包管理工具
一般来说,一个软件包是一个压缩文件,里面包括编译好的二进制文件和需要用到的资源,还有一个安装脚本。软件包中还包含一些其它数据:软件包的依赖。下面列出了对应系统包格式和包管理工具:
操作系统 | 格式 | 工具 |
---|---|---|
Debian | .deb | apt , apt-cache , apt-get , dpkg |
Ubuntu | .deb | apt , apt-cache , apt-get , dpkg |
CentOS | .rpm | yum |
Fedora | .rpm | dnf |
FreeBSD | Ports, .txz | make , pkg |
基于Debian的发型版,像Ubuntu、Linux Mint和Raspbian,它们使用的软件包格式为.deb。APT( Advanced Packaging Tool)高级软件包工具提供搜索仓库、安装软件包和依赖、管理升级。APT命令处理前端,dpkg工具处理后端(处理deb文件)。
CentOS、Fedora和其它基于Red Hat的发型版使用RPM文件。在CentOS中,yum命令可以处理单独的软件包和仓库中的软件包。在最近版本的Fedora中,dnf已经取代了yum,dnf更加现代化,它使用和yum命令相似的接口。
FreeBSD的二进制包管理系统使用pkg命令。FreeBSD也提供了Ports Collection,一个从源码编译安装的本地工具,在没有二进制包的情况下非常方便。
更新软件包缓存
大多数软件包管理系统都在本地数据库保存远程软件仓库的可用软件包列表。在安装或更新软件之前,最好更新一下本地缓存的可用软件包数据库。yum和dnf在执行一些命令时会自动更新缓存的软件包列表。
系统 | 命令 |
---|---|
Debian / Ubuntu | sudo apt-get update |
sudo apt update | |
CentOS | yum check-update |
Fedora | dnf check-update |
FreeBSD Packages | sudo pkg update |
FreeBSD Ports | sudo portsnap fetch update |
升级已安装的软件包
为了确保安装在系统中的软件保持最新,你需要更新软件包。注意,有些软件包在更新时会打破以前的配置。
在FreeBSD系统上,在用portmaster更新系统前,最好读一读/usr/ports/UPDATING。
系统 | 命令 | 说明 |
---|---|---|
Debian / Ubuntu | sudo apt-get upgrade | 只更新已安装的包 |
sudo apt-get dist-upgrade | 可能会增加或删除包以满足新的依赖项 | |
sudo apt upgrade | 和 apt-get upgrade 类似 | |
sudo apt full-upgrade | 和 apt-get dist-upgrade 类似 | |
CentOS | sudo yum update | |
Fedora | sudo dnf upgrade | |
FreeBSD Packages | sudo pkg upgrade | |
FreeBSD Ports | less /usr/ports/UPDATING | 使用 less 来查看 ports 的更新提示(使用上下光标键滚动,按 q 退出)。 |
cd /usr/ports/ports-mgmt/portmaster && sudo make install && sudo portmaster -a | 安装 portmaster 然后使用它更新已安装的 ports |
查找软件包
大多数发型版提供了图形前端,简单方便。但是快速高效的方法是使用命令行工具操作。
系统 | 命令 | 说明 |
---|---|---|
Debian / Ubuntu | apt-cache search search_string | |
apt search search_string | ||
CentOS | yum search search_string | |
yum search all search_string | 搜索所有的字段,包括描述 | |
Fedora | dnf search search_string | |
dnf search all search_string | 搜索所有的字段,包括描述 | |
FreeBSD Packages | pkg search search_string | 通过名字进行搜索 |
pkg search -f search_string | 通过名字进行搜索并返回完整的描述 | |
pkg search -D search_string | 搜索描述 | |
FreeBSD Ports | cd /usr/ports && make search name=package | 通过名字进行搜索 |
cd /usr/ports && make search key=search_string | 搜索评论、描述和依赖 |
查看特定软件包的信息
当要安装软件包时,读一读软件包的详细描述是很有必要的。
系统 | 命令 | 说明 |
---|---|---|
Debian / Ubuntu | apt-cache show package | 显示有关包的本地缓存信息 |
apt show package | ||
dpkg -s package | 显示包的当前安装状态 | |
CentOS | yum info package | |
yum deplist package | 列出包的依赖 | |
Fedora | dnf info package | |
dnf repoquery --requires package | 列出包的依赖 | |
FreeBSD Packages | pkg info package | 显示已安装的包的信息 |
FreeBSD Ports | cd /usr/ports/category/port && cat pkg-descr |
从仓库中安装软件包
如果你已经知道了软件包名,你就可以使用一个命令安装它和它的依赖。也可以同时安装多个软件包。
系统 | 命令 | 说明 |
---|---|---|
Debian / Ubuntu | sudo apt-get install package | |
sudo apt-get install package1 package2 ... | 安装所有列出来的包 | |
sudo apt-get install -y package | 在 apt 提示是否继续的地方直接默认 yes | |
sudo apt install package | 显示一个彩色的进度条 | |
CentOS | sudo yum install package | |
sudo yum install package1 package2 ... | 安装所有列出来的包 | |
sudo yum install -y package | 在 yum 提示是否继续的地方直接默认 yes | |
Fedora | sudo dnf install package | |
sudo dnf install package1 package2 ... | 安装所有列出来的包 | |
sudo dnf install -y package | 在 dnf 提示是否继续的地方直接默认 yes | |
FreeBSD Packages | sudo pkg install package | |
sudo pkg install package1 package2 ... | 安装所有列出来的包 | |
FreeBSD Ports | cd /usr/ports/category/port && sudo make install | 从源码构建安装一个 port |
从本地安装软件
有时候,软件并没有收录到软件仓库中,这时就需要下载软件包文件进行安装了。在基于Debian的操作系统上,dpkg命令可以处理单独的软件包文件,如果一个软件包没有满足依赖,可以使用gdebi命令从官方仓库中安装依赖包。在CentOS和Fedora系统上,yum和dnf用来安装软件包文件,它们同时处理了依赖。
系统 | 命令 | 说明 |
---|---|---|
Debian / Ubuntu | sudo dpkg -i package.deb | |
sudo apt-get install -y gdebi && sudo gdebi package.deb | 安装 gdebi ,然后使用 gdebi 安装 package.deb 并处理缺失的依赖 | |
CentOS | sudo yum install package.rpm | |
Fedora | sudo dnf install package.rpm | |
FreeBSD Packages | sudo pkg add package.txz | |
sudo pkg add -f package.txz | 即使已经安装的包也会重新安装 |
移除一个或多个软件包
因为软件包管理工具知道一个包安装的文件位置,它可以从系统中把包移除干净。
系统 | 命令 | 说明 |
---|---|---|
Debian / Ubuntu | sudo apt-get remove package | |
sudo apt remove package | ||
sudo apt-get autoremove | 删除不需要的包 | |
CentOS | sudo yum remove package | |
Fedora | sudo dnf erase package | |
FreeBSD Packages | sudo pkg delete package | |
sudo pkg autoremove | 删除不需要的包 | |
FreeBSD Ports | sudo pkg delete package | |
cd /usr/ports/path_to_port && make deinstall | 卸载 port |
apt 命令
Debian 家族发行版的管理员通常熟悉 apt-get 和 apt-cache。较少为人所知的是简化的 apt 接口,它是专为交互式使用而设计的。虽然 apt 通常是一个特定操作的快捷方式,但它并不能完全替代传统的工具,它的接口可能会随着版本的不同而发生变化,以提高可用性。如果你在脚本或 shell 管道中使用包管理命令,那么最好还是坚持使用 apt-get 和 apt-cache。
传统命令 | 等价的 apt 命令 |
---|---|
apt-get update | apt update |
apt-get dist-upgrade | apt full-upgrade |
apt-cache search string | apt search string |
apt-get install package | apt install package |
apt-get remove package | apt remove package |
apt-get purge package | apt purge package |
获得帮助
万能的man命令,除了基于 web 的文档,请记住我们可以通过 shell 从 Unix 手册页(通常称为 man 页面)中获得大多数的命令。比如要阅读某页,可以使用 man:man page,在 man 中,你可以用箭头键导航。按 / 搜索页面内的文本,使用 q 退出。
系统 | 命令 | 说明 |
---|---|---|
Debian / Ubuntu | man apt-get | 更新本地包数据库以及与包一起工作 |
man apt-cache | 在本地的包数据库中搜索 | |
man dpkg | 和单独的包文件一起工作以及能查询已安装的包 | |
man apt | 通过更简洁,用户友好的接口进行最基本的操作 | |
CentOS | man yum | |
Fedora | man dnf | |
FreeBSD Packages | man pkg | 和预先编译的二进制包一起工作 |
FreeBSD Ports | man ports | 和 Ports 集合一起工作 |