Linux 软件管理

1. 实验介绍

1.1 实验内容

在本实验中将为大家介绍软件管理的相关工具,让大家能够轻松解决安装的相关问题,提及到的管理工具有 apt,dpkg,rpm,yum。

1.2 实验知识点

  • dpkg 使用
    • dpkg 软件查询
    • dpkg 软件安装
    • dpkg 软件卸载
  • apt 使用
    • 软件源的配置
    • 软件包信息的查看
    • 软件包的安装
    • 软件包的升级
    • 软件包的卸载
  • aptitude 简单介绍
  • rpm 简单介绍
  • yum 简单介绍

1.3 推荐阅读

2. dpkg的使用

2.1 dpkg 介绍

最初软件的工具的安装只能依靠代码的下载,通过编译安装,随着 Debian 的诞生,出现了 dpkg(Debain Packager)软件包管理工具,这样使得我们可以直接通过一个安装包直接安装软件,Red Hat 系列受启发开发出了类似的管理工具 rpm。

但是有一些软件的实现依赖于其他软件已有的功能,这样我们就需要首先安装其依赖的软件,不然直接安装会提示依赖错误,此时 Debain 提出了解决方案,创造了 apt 工具来解决这样的困境,帮我们安装相关的依赖与安装顺序的问题,当然 Red Hat 系列的 Linux 操作系统(如 Red Hat、Centos、fe dora 等)会使用 rpm 与 yum 这样德尔包管理工具。

同时我们了解到先是有了 dpkg 软件包管理工具,然后才有了 apt 软件包管理工具。两者直接具体什么区别呢?

区别 dpkg apt
离线与在线 dpkg 就像 windows 中的 exe 安装包,我们只需要安装这个包就可以了,属于离线方式,不需要依靠网络 apt每次安装都需要从网络中获取线管资源,属于在线方式,需要依靠网络
依赖的处理 dpkg 没有处理依赖的能力,若是无依赖安装成功,若是有依赖,必须了解依赖关系,按顺序手动安装相关软件包否则安装失败 apt 能够获取安装软件的所有信息,并自动为你处理其依赖的关系,从而完成软件包的正确安装
工具的实现 dpkg 是用 C、perl 等开发语言实现的工具 apt 虽然也是使用 C++、shell 等开发语言实现的工具,但其底层会调用 dpkg 处理一些安装的工作

相信通过以上的描述大家会对 dpkg 有一定的认识,下面我们将通过一些剪短的例子让大家实现感受 dpkg 的使用。而在此之前将为大家介绍一下将会使用或是常用的参数:

参数 说明
-i 安装指定 deb 包
-R 后面加上目录名,用于安装该目录下的所有 deb 安装包
-r remove,移除某个已安装的软件包
-I 显示 deb 包文件的信息
-s 显示已安装软件的信息
-S 搜索已安装的软件包
-L 显示已安装软件包的目录信息

2.2 查看软件包

(1)已安装软件包列表

dpkg -l

同样可以使用 wc -l 统计软件包的个数

# wc 工具是按行统计,而 dpkg -l 信息中头五行为表头,所以得到的结果应该减去五为实际的个数
dpkg -l | wc -l

(2)查看已安装软件信息

比如git

dpkg -l git

ii 表示已安装 un 表示未安装

(3)使用 dpkg -L 查看 git 包安装目录的信息

$ dpkg -L git

(3)已安装包详细信息

dpkg -s git

2.3 使用 dpkg 安装 deb 软件包

例如我们用 dpkg 方式安装 sysvbanner 工具:

首先使用 apt-get 工具中的 -d 参数帮助我们只下载不安装该软件包(apt-get 工具将在后续详细讲解):

sudo apt-get -d install sysvbanner

下载完成后,查看 /var/cache/apt/archives/ 目录下的内容,如下图:

ls /var/cache/apt/archives

然后我们将下载下来的 deb 软件包拷贝到 home 目录下,并使用 dpkg 安装:

$ cp /var/cache/apt/archives/sysvbanner_1.0.15_amd64.deb ~
# 安装之前参考deb包的信息
$ sudo dpkg -I sysvbanner_1.0.15_amd64.deb

包名很长,我们可以使用 TAB 键自动补全,如果无法使用自动补全,同时我们选择该软件包的原因是其没有其他的依赖包需要安装,直接安装该软件包即可成功。

# 使用dpkg安装
$ sudo dpkg -i sysvbanner_1.0.15_amd64.deb

验证安装成功与否,可以尝试其相关的命令:

banner shiyanlou

若是所安装的软件还有其他依赖包,但是我们安装是并不知道,直接使用上述命令安装而导致安装失败可以使用如下命令修复安装:

sudo apt-get -f install

2.4 使用 dpkg 卸载

不完全卸载

使用 dpkg -r 软件名 可以不完全卸载,会保留原有的配置文件。

完全卸载

使用 dpkg -P 完全卸载

可以看到已经把 sysvbanner 完全卸载了

3. 使用 apt

3.1 小试牛刀

比如我们想安装一个软件,名字叫做 figlet(图形字符),那么输入如下命令:

$ sudo apt-get install figlet

使用 figlet 输出 shiyanlou

figlet shiyanlou

3.2 apt 介绍

从上文我们可以了解到 APT(Advanced Packaging Tool)是 Debian 系列的软件包管理工具,是 dpkg 的升级版本,可用于获取、查询、安装、升级、卸载 Deb 软件包,当然主要功能便是解决软件包依赖关系。

以下是一些常用 apt 命令:

命令 作用
apt-get 管理软件包,包装安装,卸载,升级等
apt-cache 查询软件包信息
apt-proxy 搭建APT代理服务器
apt-show-versions 显示系统中软件包版本信息
apt-config 读取APT配置文件
apt-cdrom 将CD-ROM加入软件源配置文件

3.3 软件源配置文件

以前使用 deb 安装包的方式,就像我们在 windows 中一样直接下载安装包安装即可,而使用 apt 方式的话,并不需要我们再去单独的下载安装包。APT 是一个客户/服务器结构的工具,客户端就是我们本地使用 apt 工具,而服务端的 apt 中管理着各种各样的 deb 包,通常我们将其称为镜像站或者是源,我们的 apt 客户端工具会根据我们的命令去服务端中获取相关的软件包并自动为我们安装。

由此可以看出 apt 的强大之处了,而其简单的工作流程是这样的:

  • apt 首先查看配置文件中所给的镜像站(源)地址
  • 然后通过该地址下载了一个资源列表,保存在 /var/lib/apt/lists 中(通常是一个类似于镜像站名-Packages.gz的压缩包,该压缩包中是一张资源列表,该列表包含着所有软件的信息,例如包名、优先级、版本号、依赖包、冲突信息、大小、服务器中的路径等等)
  • 在安装软件的时候,便通过读取该文件中的信息,到镜像站中下载相关的软件包,临时存储在 /var/cache/apt/archives 中
  • 安装完毕之后会将安装的包信息写入 /var/lib/dpkg/available 文件中

在上文中我们提到的镜像站地址的配置文件就是 /etc/apt/sources.list,里面列出了软件包的镜像站点地址。我们来查看一下

cat /etc/apt/sources.list

# 是注释内容,下面的 deb 开头后面跟的就是镜像站点地址。

每次修改完过后,一定要运行 apt-get update,这样 apt 才会再次读取配置文件获取站点中的包信息,来更新本地的列表信息:

3.4 apt 查看软件包信息

在软件包的安装之前我们通常会查看一下软件包相关的信息,查看软件包相关信息的方式通常使用 apt-cache 工具。

我们可以通过 apt-cache --help 来查看该命令常用的参数,我们将使用个别的命令做事例给大家一些直观的感受。

例如:

(1)查看我们 apt 源中所有可用的软件包

# 查看所有可用的软件包列表
apt-cache pkgnames | less

# 统计可用的软件包个数
apt-cache pkgnames | wc -l

apt-cache pkgnames 是列出所有可用的软件包,wc -l 是统计上一步执行结果有多少行

如果想获取一些统计性的信息可以使用

apt-cache stats

(2)根据正则表达式搜索软件包

正则表达是一种检索字符串的规则,我们将在后续的章节中做详细的讲解

比如查询包含 git 关键词的软件包

apt-cache search git

如果想查询名为 git 的软件包,可以这样利用正则表达式查询:

apt-cache search ^git$

(3)查询软件包详细信息

比如查询 git 软件包的详细信息

apt-cache show git

这些信息便是来自于上述所说从镜像站中获取的资源列表,包含包名、版本、依赖、大小等等。

(4)查询软件包安装状态

通过这样一个命令,我们可以了解到当前设备中 git 软件包的状态,与我们可安装的版本:

apt-cache policy git

如图中版本前带 * 便是已安装的版本,其他的是可安装的版本,其排列顺序是以版本的高低排列。

(5)查询某软件包相关的软件包

apt-cache depends git

从图中我们可以看到 git 所依赖的软件包、预期相关联的推荐安装软件包等等

3.5 apt 操作软件包

在通过 apt-cache 命令查询到包相关的信息,完成信息获取的阶段,紧接着我们便会尝试去安装软件包,此时我们便可使用 apt-get 命令。同样在使用直接我们来查看一些常用的命令与参数。

通过 apt-get —help 命令我们可以看到这样一些命令:

工具 说明
install 其后加上软件包名,用于安装一个软件包
update 用于更新本地软件列表的缓存
upgrade 升级本地可更新的全部软件包,若更新的软件包与其他软件包在依赖关系,并会造成影响的,则不更新
dist-upgrade 解决依赖关系并升级(存在一定危险性),若是系统有升级会升级系统
remove 移除之前被其他软件包依赖,但现在不再被使用的软件包
autoremove 移除之前被其他软件包依赖,但现在不再被使用的软件包
purge 与remove相同,但会完全移除软件包,包含其配置文件
clean 移除下载到本地的已经安装的 deb 软件包,默认保存在 /var/cache/apt/archives/
autoclean 移除已安装的软件的旧版本软件包

下面是一些 apt-get 常用的参数:

参数 说明
-y 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
-s 模拟安装
-q 静默安装方式,指定多个 q 或者 -q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用
-f 修复损坏的依赖关系
-d 只下载不安装
--reinstall 重新安装已经安装但可能存在问题的软件包
--install-suggests 同时安装APT给出的建议安装的软件包

3.5.1 安装软件包

通常我们使用 apt-get install 命令来安装软件包。而该命令实际进行了以下几个步骤:

  1. 读取本地存放的软件列表(就是上述从镜像站中获取的列表),找到软件包相关信息。
  2. 从信息中获取软件包依赖关系,获取其相关的软件包的信息。
  3. 根据信息中的软件包地址,下载所有软件包。
  4. 按照其依赖的顺序安装所有软件包。

例如我们安装一个 sysvbanner(图形字符)的工具,便会经历这样四个步骤:

sudo apt-get install sysvbanner

安装的过程中难免有意外的情况,若是我们安装失败了,可以使用如下命令重新安装:

sudo apt-get --reinstall install sysvbanner

3.5.2 软件升级

世界上没有完美的软件,所以只要还在维护的软件,每过一段时间便会出现新的版本来修复以前存在的 bug 或是增加新的功能,通常会用到这样的一些命令:

# 更新软件源
$ sudo apt-get update
# 升级没有依赖问题的软件包
$ sudo apt-get upgrade
# 升级并解决依赖关系(慎重使用,一般不使用,如果系统有新版本会更新系统)
$ sudo apt-get dist-upgrade

若是只为了升级单个数据包我们可以通过这样的命令来实现:

apt-get install --only-upgrade <packagename>

3.6 卸载软件

例如卸载我们刚刚安装的 sysvbanner 工具

# 不保留配置文件的移除
$ sudo apt-get purge sysvbanner
# 或者 sudo apt-get --purge remove sysvbanner
# 移除不再需要的被依赖的软件包
$ sudo apt-get autoremove

想了解更多 apt 相关可以参考

4. aptitude 介绍

在 apt 之后又出现了新的工具 aptitude,但是 aptitude 的出现并没有带来非常颠覆行的功能,所以其被人熟知的程度并不高,在 Debian 的官方文档中还是非常推崇该工具的。

aptitude 与 apt 相比差异在于 aptitude 将 apt-get 与 apt-cache 等中许多常用的功能进行了整合,也就是 aptitude 不再像 apt 中有 apt-get 与 apt-cache 等多个命令工具,一个 aptitude 便可独当一面。同时进一步的优化了处理依赖上的问题。

首先是功能的整合:

例如查看 git 包信息上述的方法是 apt-cache show git,而若是用 aptitude 则是 aptitude show git,还有类似与 reinstall、search 等功能 aptitude 都可以直接办到。

其次就是依赖优化与增强的功能:

例如包的升级,在 apt 中便是 apt-get upgrade 与 apt-get dist-upgrade,这样的升级还有可能产生一些安全隐患,而 aptitude 中提供了 full-upgrade、safe-upgrade 的升级方式,还有 hold、unhold 保持包版本避免失误升级某个包。

还有 why 与 why-not 这样提供冲突信息的命令。

aptitude 是一个不错的选择,若是大家愿意尝试可以通过 sudo apt-get install aptitude 来安装该工具,然后体验一番,选择最后 apt-get 还是 aptitude 看自己的使用习惯。

5. RPM 的使用

以下的实验内容使用于 Centos 等 Red Hat 系列,暂未提供相关的实验环境。

在之前讲解 dpkg 与 apt 由来的时候我们提及过 rpm 的由来,其同样是为了解决安装问题而产生的软件包管理工具,其与 yum 管理工具的区别类似于 dpkg 于 apt 的区别,这里便不再赘述。

虽说是为了相同目标产生的,但是毕竟出生在不同的平台,不同的创造者,所以在使用上还是有一点点差异的。

例如在包的安装,rpm 与 dpkg 相同使用 -i 参数:

rpm -i package-name.rpm

不同之处在于软件包的卸载,dpkg 中使用 -r 参数,其代表的是 remove 的意思,而在 rpm 中使用 -e 参数,其代表的是 erase 的参数:

# 此处只用包名可加可不加的后缀,后面的版本号信息可加可不加
rpm -e package-name

在查看所有已安装的数据包上,dpkg 使用 -l 参数,而 rpm 中则会使用 -qa 参数,q 代表的是 query 查询,a 代表的是 all 所有的意思:

# 查询所有安装的软件包名
rpm -qa

# 统计安装包的个数
rpm -qa | wc -l

6. YUM 的使用

yum 是 Duke University 发起的项目,通过对 apt 的改造而创建出来的工具。但其实他更类似于 aptitude,因为其没有其他子命令如 apt-cache、apt-get,直接就是一个 yum 可以独当一面。

同样的在一些参数、命令上与 apt 不太相同,但是增删改查这样的一下常用的功能也是有的:

命令 功能
install 安装软件包
clean 删除缓存数据
deplist 查看依赖关系
erase 卸载软件包
upgrade 升级软件包

值得一提的便是在 yum 中有一个安装的方式是其独有的:groupinstall,这是一种官方所提供的批量安装方式,一些常用的安装组合便可通过这样的方式安装,例如我们需要安装 xfce 桌面,使用 apt 我们可能需要这样安装:

apt-get install xfce4 xfwm4 xfce4-panel xfce4-settings xfce4-session xfce4-terminal

而若是使用 yum 的话则是:

yum groupinstall Xfce

该命令会帮我们自动把相关的组件都安装,非常的便捷。

7. 总结

在结尾部分我们简单的提及了 aptitude、rpm、yum 这样三个工具,没有详细讲解的原因在其功能与 dpkg 与 apt 非常的相似,一些只是命令的名称不同但是功能相同的差异,希望大家在后续的 Linux 帮助命令中掌握在线查看帮助命令的方式,能够快速掌握这些工具。

本节实验中我们学习了以下内容:

  • dpkg 使用
    • dpkg 软件查询
    • dpkg 软件安装
    • dpkg 软件卸载
  • apt 使用
    • 软件源的配置
    • 软件包信息的查看
    • 软件包的安装
    • 软件包的升级
    • 软件包的卸载
  • aptitude 简单介绍
  • rpm 简单介绍
  • yum 简单介绍

不懂或不足之处欢迎与我们讨论,向我们指出。

results matching ""

    No results matching ""