Linux命令大全 · 2022年2月6日 0

软件包管理基础:apt,yum,dnf,pkg

大多数现代类Unix系统都提供了查找和安装软件的包管理工具。软件通常以软件包的形式储存在仓库中,管理软件一般叫做软件包管理。包是一个操作系统的基础组成部分,它包含共享库、应用程序、服务程序和文档。

包管理工具除了提供安装软件之外,还包括升级软件。仓库里的软件包都是经过测试的,不同版本的软件已经通过软件开发者和软件包维护者的实际测试。在配置服务器或开发环境时,非常有必要看一下官方仓库,因为仓库中稳定版本的软件包有时会是很老的旧版本。

软件包管理是系统管理员和开发者都要掌握的基本技能,对于主流发型版来说,它里面包含的软件包资源相当的多,而且绝大部分的软件包都是开源的。

这篇文章介绍不同发型版软件包管理工具的基本使用:查找、安装和升级软件包。

包管理工具

一般来说,一个软件包是一个压缩文件,里面包括编译好的二进制文件和需要用到的资源,还有一个安装脚本。软件包中还包含一些其它数据:软件包的依赖。下面列出了对应系统包格式和包管理工具:

操作系统格式工具
Debian.debaptapt-cacheapt-getdpkg
Ubuntu.debaptapt-cacheapt-getdpkg
CentOS.rpmyum
Fedora.rpmdnf
FreeBSDPorts, .txzmakepkg

基于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 / Ubuntusudo apt-get update
 sudo apt update
CentOSyum check-update
Fedoradnf check-update
FreeBSD Packagessudo pkg update
FreeBSD Portssudo portsnap fetch update

升级已安装的软件包

为了确保安装在系统中的软件保持最新,你需要更新软件包。注意,有些软件包在更新时会打破以前的配置。

在FreeBSD系统上,在用portmaster更新系统前,最好读一读/usr/ports/UPDATING。

系统命令说明
Debian / Ubuntusudo apt-get upgrade只更新已安装的包
 sudo apt-get dist-upgrade可能会增加或删除包以满足新的依赖项
 sudo apt upgradeapt-get upgrade 类似
 sudo apt full-upgradeapt-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 packageapt 提示是否继续的地方直接默认 yes
 sudo apt install package显示一个彩色的进度条
CentOSsudo yum install package 
 sudo yum install package1 package2 ...安装所有列出来的包
 sudo yum install -y packageyum 提示是否继续的地方直接默认 yes
Fedorasudo dnf install package 
 sudo dnf install package1 package2 ...安装所有列出来的包
 sudo dnf install -y packagednf 提示是否继续的地方直接默认 yes
FreeBSD Packagessudo pkg install package 
 sudo pkg install package1 package2 ...安装所有列出来的包
FreeBSD Portscd /usr/ports/category/port && sudo make install从源码构建安装一个 port

从本地安装软件

有时候,软件并没有收录到软件仓库中,这时就需要下载软件包文件进行安装了。在基于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 通常是一个特定操作的快捷方式,但它并不能完全替代传统的工具,它的接口可能会随着版本的不同而发生变化,以提高可用性。如果你在脚本或 shell 管道中使用包管理命令,那么最好还是坚持使用 apt-get 和 apt-cache。

传统命令等价的 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

获得帮助

万能的man命令,除了基于 web 的文档,请记住我们可以通过 shell 从 Unix 手册页(通常称为 man 页面)中获得大多数的命令。比如要阅读某页,可以使用 man:man page,在 man 中,你可以用箭头键导航。按 / 搜索页面内的文本,使用 q 退出。

系统命令说明
Debian / Ubuntuman apt-get更新本地包数据库以及与包一起工作
 man apt-cache在本地的包数据库中搜索
 man dpkg和单独的包文件一起工作以及能查询已安装的包
 man apt通过更简洁,用户友好的接口进行最基本的操作
CentOSman yum 
Fedoraman dnf 
FreeBSD Packagesman pkg和预先编译的二进制包一起工作
FreeBSD Portsman ports和 Ports 集合一起工作