简介
软件包管理器是一系列工具的集合,它自动化地完成软件的安装、更新、配置和移除功能。
在 Linux 下,相比起使用应用商店安装软件,包管理系统的使用要更加广泛,许多软件均可以通过一行命令完成其安装,优雅而快速。
软件包管理器的一个重要组成部分是软件仓库。软件仓库是收藏了互联网上可用软件包(应用程序)的图书馆,里面往往包含了数万个可供下载和安装的可用软件包。
有了软件仓库,我们不需要手动下载大量的软件包再通过包管理器安装。只需要知道软件在软件仓库中的名称,即可让包管理器从网络中抓取到相应的软件包到本地,自动进行安装。
包管理系统有很多,比如管理 Debian (.deb) 软件包的 dpkg 以及它的前端 apt(用于 Debian 系的发行版);rpm 包管理器以及它的前端 dnf(用于 Fedora 和新版的 CentOS 和 RHEL)、前端 yum(用于 CentOS 7 和 RHEL 7 等);pacman 包管理器(用于 Arch Linux 和 Manjaro)等等。
包管理系统除了安装软件外,它还提供了工具来更新已经安装的包。包存储库有助于确保你的系统中使用的代码是经过审查的,并且软件的安装版本已经得到了开发人员和包维护人员的认可。
Linux 下的软件包有两种,分别是源码包和二进制包。
包的分类
Linux 源码包
源码包到底是什么呢?源码包就是一大堆源代码程序,是由软件工程师使用特定的格式和语法所书写的代码,是人写的计算机语言的指令。我们都知道,计算机只能识别机器语言,也就是二进制语言,所以源码包的安装,就需要一个中间角色把代码语言”abcdedg” 翻译成二进制语,这个中间角色我们称它为 “编译器”。“编译” 指的是从源代码到直接被计算机(或虚拟机)执行的目标代码的翻译过程,编译器的功能就是把源代码翻译为二进制代码,让计算机识别并运行。
由于源码包的安装需要把源代码编译为二进制代码,因此安装时间较长。比如,我们在 windows 系统下安装一个几十兆的软件,可能几分钟就按照完成了,因为它不需要经过编译过程所以安装很快。但是在 Linux 系统中如果我们以源码包的安装方式安装一个压缩包仅有二三十兆的软件,可能也需要花费十几分钟到几时分钟不等。而且在安装过程中,如果遇到了什么错误,对于初学者来说都很难弄解决,安装难以继续下去。因此为了解决使用源码包安装方式的这些问题,Linux 软件包的安装出现了使用二进制包的安装方式。
Linux 二进制包
何为二进制包?二进制包也就是源码包经过成功编译之后产生的包。由于二进制包在发布之前就已经完成了编译的工作,因此用户安装软件的速度较快,且安装过程报错几率大大减小。二进制包是 Linux 下的默认安装软件包,所以有时我们也把二进制包称作默认安装软件包。
目前主要有以下 2 大主流的二进制包管理系统:
- RPM 包管理系统:功能强大,安装、升级、査询和卸载非常简单方便,因此很多
Linux发行版都默认使用此机制作为软件安装的管理方式,例如Fedora、CentOS、SuSE等。 - DPKG 包管理系统:由
Debian Linux所开发的包管理机制,通过DPKG包,Debian Linux就可以进行软件包管理,主要应用在Debian和Ubuntu中。
源码包 PK 二进制包
源码包一般包含多个文件的集合,出于发行的需要,一般会把源码包打包压缩之后发布,Linux 中最常用的打包压缩格式为 “tar.gz”,因此源码包又被称为 Tarball。而且源码包需要我们自己去软件的官方站点下载,源码包的结构一般如下:
- 源代码相关文件
- 配置和检测程序,如
config等 - 软件安装说明和软件说明,如
README
源码包优点:
- 开源,如果有足够的能力,可以修改源代码
- 可以自由选择所需的功能
- 软件是编译安装,所以更加适合自己的系统,更加稳定、效率更高
- 卸载方便
源码包缺点:
- 安装过程步骤较多,尤其安装较大的软件集合时(如
LAMP环境搭建),容易出现拼写错误 - 编译过程时间较长,安装比二进制安装时间长
- 因为是编译安装,安装过程中一旦报错新手很难解决
在前面已经讲过,二进制包是在软件发布的时候已经进行过编译的软件包,所以安装速度比源码包快得多。但是因为已经进行通译,大家也就不能在看到软件的源代码了。目前两大主流的二进制包系统是 DPKG 包和 RPM 包。
RPM 包的优点如下:
- 包管理系统简单,只通过几个命令就可以实现包的安装、升级、査询和卸载
- 安装速度比源码包安装快得多
RPM 包的缺点如下:
- 经过编译,不能在看到源代码
- 功能选择不如源码包灵活
- 依赖性强。比如在安装软件包 a 时需要先安装 b 和 c,而在安装 b 时需要先安装 d 和 e。这就需要先安装 d 和 e,再安装 b 和 c,最后才能安装 a
下面详细介绍各个包管理工具的使用
dpkg
Ubuntu、Debian
dpkg 命令是 Debian Linux 系统用来安装、创建和管理软件包的实用工具
命令使用
- dpkg(选项)(参数)
dpkg --help
# Usage: dpkg [<option> ...] <command>
# 选项
# -i:安装软件包
# -r:删除软件包
# -P:删除软件包的同时删除其配置文件
# -L:显示于软件包关联的文件
# -l:显示已安装软件包列表
# --unpack:解开软件包
# -c:显示软件包内文件列表
# --confiugre:配置软件包
# 参数
#Deb软件包:指定要操作的.deb软件包- 示例演示说明
# 安装包
dpkg -i package.deb
# 删除包
dpkg -r package
# 删除包(包括配置文件)
dpkg -P package
# 列出与该包关联的文件
dpkg -L package
# 显示该包的版本
dpkg -l package
# 解开deb包的内容
dpkg --unpack package.deb
# 搜索所属的包内容
dpkg -S keyword
# 列出当前已安装的包
dpkg -l
# 列出deb包的内容
dpkg -c package.deb
# 配置包
dpkg --configure package
# 列出已安装软件包
sudo dpkg-query -l
sudo dpkg-query -l | less
sudo dpkg-query -l | grep tmuxapt
Ubuntu、Debian
apt-get 命令是 Debian Linux 发行版中的 APT 软件包管理工具。所有基于 Debian 的发行都使用这个包管理系统。deb 包可以把一个应用的文件包在一起,大体就如同 Windows 上的安装文件。
命令使用
- apt-get(选项)(参数)
# apt-get(选项)(参数)
apt --help
#Usage: apt [options] command
# 选项
# -c:指定配置文件
# 参数
#管理指令:对APT软件包的管理操作
#软件包:指定要操纵的软件包- 示例演示说明
# 更新所有已安装的软件包
apt-get upgrade
# 将系统升级到新版本
apt-get dist-upgrade
# 更新
apt-get update
# 安装一个新软件包
apt-get install packagename
# 卸载一个已安装的软件包(保留配置文件)
apt-get remove packagename
# 卸载一个已安装的软件包(删除配置文件)
apt-get –purge remove packagename
# 来删除你已经删掉的软件
apt-get autoclean apt
# 会把安装的软件的备份也删除
apt-get clean
# 列出已安装软件包
sudo apt list --installed
sudo apt list --installed | less
sudo apt list --installed | grep tmux下面以apt为例,详细介绍包管理的细节
官方软件源镜像
通过 apt 安装的软件都来源于相对应的软件源,每个 Linux 发行版一般都带有官方的软件源,在官方的软件源中已经包含了丰富的软件,apt 的软件源列表在 /etc/apt/sources.list 下。
- 查看本地的软件源列表
cat /etc/apt/sources.list | grep -v "#"
# deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted
# deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted
# deb http://mirrors.ustc.edu.cn/ubuntu/ bionic universe
# deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates universe
# deb http://mirrors.ustc.edu.cn/ubuntu/ bionic multiverse
# deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates multiverse
# deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted
# deb http://security.ubuntu.com/ubuntu/ bionic-security universe
# deb http://security.ubuntu.com/ubuntu/ bionic-security multiverse每一个条目都遵循如下的格式:
deb http://site.example.com/ubuntu/ distribution component1 component2 component3
deb-src http://site.example.com/ubuntu/ distribution component1 component2 component3分别是 Archive type、Repository URL、Distribution 和 Components。
在 Ubuntu 下,Component 可以为如下几个之一
| 类型 | 含义 |
|---|---|
| Main | 包含自由软件的软件包 |
| Restricted | 包含通常使用的软件,由 Ubuntu 团队支持,但不是完全的自由软件许可授权 |
| Universe | 包含了数千个不由 Canonical 官方支持的软件包。授权于各种自由软件许可协议,来自各种公共来源。 |
| Multiverse | 包含非自由软件的软件包 |
Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以通过修改官方源为其镜像实现更快的下载速度。
镜像缓存了官方源中的软件列表,与官方源基本一致。
本例以修改官方源为 USTC Mirror 为例。注意:在操作前请做好备份。
一般情况下,/etc/apt/sources.list 下的官方源地址为 http://archive.ubuntu.com/ ,我们只需要将其替换为 http://mirrors.ustc.edu.cn 即可
如果你使用 Ubuntu 图形安装器安装,默认的源地址通常不是 http://archive.ubuntu.com/ , 而是 http://<country-code>.archive.ubuntu.com/ubuntu/ ,如 http://cn.archive.ubuntu.com/ubuntu/,同样也将其替换为 http://mirrors.ustc.edu.cn 即可。
可以使用如下命令:sudo sed -i 's|//.*archive.ubuntu.com|//mirrors.ustc.edu.cn|g' /etc/apt/sources.list
当然也可以直接使用 vim、nano 等文本编辑器进行修改
第三方软件源
有时候,由于种种原因,官方软件源中并没有我们需要的软件,但是第三方软件提供商可以提供自己的软件源。在将第三方软件源添加到 /etc/apt/sources.list 中之后,就可以获取到第三方提供的软件列表,再通过 apt install package-name 安装我们需要的第三方软件。你一般可以在需要的第三方软件官网找到这样的配置说明。
- 通过添加 Docker 软件源安装 Docker
在各大软件源中已经提供了 Docker,在 Ubuntu/Debian 下的包名为 docker.io。
Docker 官方也提供了自己的软件源,包名为 docker-ce,它的版本会稍微更新一些。我们可以通过添加 Docker 的软件源到 /etc/apt/sources.list 中来进行安装
- 安装需要的的软件包
sudo apt-get update # 更新本地的包列表 sudo apt-get install \ ca-certificates \ curl \ gnupg-agent \ software-properties-common - 下载 Docker 软件源的 GPG Key
这一步将 GPG Key 添加到系统目录中。GPG Key 用于验证软件源的完整性,如果下载的文件被篡改,GPG 签名验证会失败,从而系统不会继续进行安装操作,防止有问题的软件包进入系统。curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - 添加 Docker 软件源到
/etc/apt/sources.list.d/中
为了方便维护,第三方的 APT 软件源一般都放在/etc/apt/sources.list.d/目录下(而非直接编辑/etc/apt/sources.list)。
这里通过echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nulldpkg --print-architecture命令获取系统当前的架构,lsb_release -cs命令获取当前的系统代号(Codename),通过 Shell 命令拼接后保存到/etc/apt/sources.list.d/docker.list文件中。 - 使用 apt 安装 Docker
首先需要从第三方源更新软件列表。sudo apt update
之后便可以直接安装docker-ce以及相关的软件包sudo apt install docker-ce docker-ce-cli containerd.io - 检查安装情况并确认启动
Docker 是作为一个服务运行在系统的后台的,要查看 Docker 是否安装完成并确定 Docker 已经启动,可以通过如下方式:sudo systemctl status docker
如果 Docker 已经在后台启动了,则会输出与下面相似的内容:
如果没有启动,则会输出类似于这样的结果:● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-04-10 20:55:27 CST; 18h ago Docs: https://docs.docker.com Main PID: 1115 (dockerd) Tasks: 18 CGroup: /system.slice/docker.service └─1115 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: inactive (dead) since Sat 2020-04-11 15:43:02 CST; 4s ago Docs: https://docs.docker.com Process: 1115 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/ Main PID: 1115 (code=exited, status=0/SUCCESS)
这时候,我们可以通过 systemctl 命令启动 Docker 服务:sudo systemctl start docker
RPM
RHEL、CentOS
rpm 命令是 RPM 软件包的管理工具。rpm 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度。
命令使用
rpm(选项)(参数)
# rpm(选项)(参数) rpm --help # Usage: rpm [OPTION...] # 选项 # -a:查询所有套件 # -c:只列出组态配置文件,本参数需配合"-l"参数使用 # -d:只列出文本文件,本参数需配合"-l"参数使用 # -e<套件档>或--erase<套件档>:删除指定的套件 # -f<文件>+:查询拥有指定文件的套件 # -h或--hash:套件安装时列出标记 # -i:显示套件的相关信息 # -i<套件档>或--install<套件档>:安装指定的套件档 # -l:显示套件的文件列表 # -p<套件档>+:查询指定的RPM套件档 # -q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户 # -R:显示套件的关联性信息 # -s:显示文件状态,本参数需配合"-l"参数使用 # -U<套件档>或--upgrade<套件档>:升级指定的套件档 # -v:显示指令执行过程 # -vv:详细显示指令执行过程,便于排错 # 参数 # 软件包:指定要操纵的rpm软件包示例演示说明
# 安装
rpm -ivh your-package.rpm
# 强制安装
rpm --force -ivh your-package.rpm
# 卸载
rpm -e proftpd-1.2.8
# 列出所有安装过的包
rpm -qa
rpm -qa | grep sql
# rpm包中的文件安装到那里
rpm -ql ***.rpm
# 一个没有安装过的软件包
rpm -qlp ***.rpm
# 一个已经安装过的软件包
rpm -ql ***.rpm
# 某个程序是哪个软件包安装
rpm -qf `which 程序名` # 返回软件包的全名
rpm -qif `which 程序名` # 返回软件包的有关信息
rpm -qlf `which 程序名` # 返回软件包的文件列表yum
CentOS6、CentOS7
yum 命令是在 Fedora 和 RedHat 以及 SUSE 中基于 rpm 的软件包管理器,它可以使系统管理人员交互和自动化地更新与管理 RPM 软件包,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
命令使用
- yum(选项)(参数)
# yum(选项)(参数)
yum --help
# Loaded plugins: fastestmirror, langpacks
# Usage: yum [options] COMMAND
# 选项
# -h:显示帮助信息;
# -y:对所有的提问都回答“yes”;
# -c:指定配置文件;
# -q:安静模式;
# -v:详细模式;
# -d:设置调试等级(0-10);
# -e:设置错误等级(0-10);
# -R:设置yum处理一个命令的最大等待时间;
# -C:完全从缓存中运行,而不去下载或者更新任何头文件。
# 参数
# install:安装rpm软件包;
# update:更新rpm软件包;
# check-update:检查是否有可用的更新rpm软件包;
# remove:删除指定的rpm软件包;
# list:显示软件包的信息;
# search:检查软件包的信息;
# info:显示指定的rpm软件包的描述信息和概要信息;
# clean:清理yum过期的缓存;
# shell:进入yum的shell提示符;
# resolvedep:显示rpm软件包的依赖关系;
# localinstall:安装本地的rpm软件包;
# localupdate:显示本地rpm软件包进行更新;
# deplist:显示rpm软件包的所有依赖关系。- 示例说明
# 安装
yum install # 全部安装
yum install package1 # 安装指定的安装包package1
yum groupinsall group1 # 安装程序组group1
# 更新和升级
yum update # 全部更新
yum update package1 # 更新指定程序包package1
yum check-update # 检查可更新的程序
yum upgrade package1 # 升级指定程序包package1
yum groupupdate group1 # 升级程序组group1
# 查找显示
yum list installed | grep mysql
yum list installed mysql*
yum info package1 # 显示安装包信息package1
yum list # 显示所有已经安装和可以安装的程序包
yum list package1 # 显示指定程序包安装情况package1
yum groupinfo group1 # 显示程序组group1信息
# 删除程序
yum remove/erase package1 # 删除程序包package1
yum groupremove group1 # 删除程序组group1
yum deplist package1 # 查看程序package1依赖情况
# 清除缓存
yum clean packages # 清除缓存目录下的软件包
yum clean headers # 清除缓存目录下的 headers
yum clean oldheaders # 清除缓存目录下旧的 headersdnf
RHEL8、CentOS8
DNF 使用 libsolv 进行依赖解析,由 SUSE 开发和维护,旨在提高性能。Yum 主要是用 Python 编写的,它有自己的应对依赖解析的方法。它的 API 没有完整的文档,它的扩展系统只允许 Python 插件。Yum 是 RPM 的前端工具,它管理依赖关系和资源库,然后使用 RPM 来安装、下载和删除包。
由于 Yum 中许多长期存在的问题仍未得到解决,因此 Yum 包管理器已被 DNF 包管理器取代。这些问题包括性能差、内存占用过多、依赖解析速度变慢等。两个管理包工具的更多区别可以查看,What is the difference between DNF and YUM? 进行阅读。
- 安装 DNF 包管理器
# 依赖
yum install -y epel-release
# 安装
yum install -y dnf
# 检查
dnf –version- 常用命令介绍
# 安装软件包
dnf install nano
# 升级软件包
dnf update systemd
# 升级所有系统软件包
dnf update
dnf upgrade
# 检查系统软件包的更新
dnf check-update
# 删除软件包
dnf remove nano
dnf erase nano
# 删除无用孤立的软件包
dnf autoremove
# 删除缓存的无用软件包
dnf clean all
# 查看系统中可用的DNF软件库
dnf repolist
# 查看系统中可用和不可用的所有的DNF软件库
dnf repolist all
# 列出所有RPM包
dnf list
# 列出所有安装了的RPM包
dnf list installed
# 列出所有可供安装的RPM包
dnf list available
# 搜索软件库中的RPM包
dnf search nano
# 查找某一文件的提供者
dnf provides /bin/bash
# 查看软件包详情
dnf info nano
# 查看所有的软件包组
dnf grouplist
# 安装一个软件包组
dnf groupinstall 'Educational Software'
# 升级一个软件包组中的软件包
dnf groupupdate 'Educational Software'
# 删除一个软件包组
dnf groupremove 'Educational Software'
# 重新安装特定软件包
dnf reinstall nano
# 回滚某个特定软件的版本
dnf downgrade acpid
# 查看DNF命令的执行历史
dnf history
# 查看所有的DNF命令及其用途
dnf help
# 获取有关某条命令的使用帮助
dnf help clean