(016) Linux之软件包管理
十年运维系列之基础篇 - Linux
作者:曾林
联系:1494445739@qq.com
版权:文章未经同意请勿转载
一、引言
决定Linux发行版本质量最重要的因素是软件包系统和支持该发行版本社区的活力。进一步接触Linux就会发现Linux软件的研究现状相当活跃。事物总是在不停地变化,许多一流的Linux发行版本每6个月就有一个新版本问世,而且许多个人程序每天都在更新。要想同步这些日新月异的软件,我们就需要好的工具进行软件包管理。
软件包管理是一种在系统上安装、维护软件的方法。目前,很多人通过安装Linux经销商发布的软件包来满足他们所有的软件需求。这与早期的Linux形成了鲜明的对比。因为在Linux早期,想要安装软件必须先下载源代码,然后对其进行编译。这并不是说编译源码不好,源码公开正是Linux吸引人的一大亮点。编译源码赋予用户自主检查、提示系统的能力,只是使用预先编译的软件包会更快、更容易些。
本小章节会介绍一些用于Linux软件包管理的命令行工具。虽然所有主流的Linux发行版都提供了强大而复杂的维持系统运行的图形化界面操作程序,但学习命令行程序同样重要,因为它可以执行很多图形化程序很难甚至无法完成的任务。
二、软件包系统
不同的Linux发行版用的是不同的软件包系统,并且原则上,适用于一种发行版的软件包与其他版本是并不兼容的。多数Linux发行版采用的不外乎两种软件包技术阵营,即Debian的.deb技术和Red Hat的.rpm技术。
三、软件包系统工作方式
在非开源软件产业中,给系统安装一个新应用,通常需要购买“安装光盘”之类的安装介质,然后运行安装向导进行安装。
Linux并不是这样。事实上,Linux系统所有软件都可以在网上找到,并且多数是以软件包文件的形式由发行商提供,其余则以可手动安装的源码形式存在。
- 软件包文件
包文件是组成软件包系统的基本软件单元,它是由组成软件包的文件压缩而成的文件集。一个包可能包含大量的程序以及支持这些程序的数据文件,包文件既包含了安装文件,又包含了有关包自身的及其内容的文本说明之类的软件包元数据。此外,许多软件包中还包含了安装软件包前后执行配置任务的安装脚本。
包文件通常由软件包维护者创建,该维护者通常(并不总是)是开发商的职员。包维护者从上游供应商(一般是程序的作者)获得软件源代码,然后进行编译,并创建包的元数据及其他必需的安装脚本。通常,包维护者会在初始源代码上做部分的修改,从而提高该软件包与该Linux发行版本其他部分的兼容性。
2. 库
虽然一些软件选择自己包装和分销,但如今多数软件包均由发行商或感兴趣的第三方创建。Linux用户可以从其所使用的Linux版本的中心库中获得软件包。所谓的中心库,一般包含了成千上万个软件包,而且每一个都是专门为该发行版本建立和维护的。
3. 依赖关系
几乎没有任何一个程序是独立的。程序之间相互依赖彼此完成既定工作。一些公有的操作,比如输入/输出操作,就是由多个程序共享的例程来执行的。这些例程存储在共享库里面,共享库里面的文件为多个程序提供必要的服务。如果一个软件包需要共享库之类的共享资源,说明其具有依赖性。现代软件包管理系统都提供依赖性解决策略,从而确保用户安装了软件包的同时也安装了其所有的依赖关系。
四、常见软件包管理任务
命令行软件包管理工具可以完成许多操作。在下面的讨论中,单词package_name指软件包的实际名称,而package_file则是指包含该软件包的文件名。例如我们要安装emacs文本编辑器,那么package_name就是emacs,而package_file可能为emacs-22.1-7.fc7-i386。
1. 在库里查找软件包
通过使用高级工具来搜索库元数据时,我们可以根据包文件名或其描述来查找该包。例如,在Red hat系统的yum库中搜索emac文本编辑器的代码如下:
shell> yum search emacs
执行结果如下图:
2. 安装库中的软件包
包管理工具允许从库中下载、安装软件包,同时安装所有的依赖包,例如在red hat系统上安装emac文本编辑器的代码如下:
shell> yum install package_name
命令执行截图如下所示:
3. 安装软件包文件中的软件包
如果软件包文件并不是从库源中下载的,那么我们就可以使用包管理工具直接安装(但并不安装依赖关系),安装命令如下:
shell> rpm -i package_file
例如,当emacs-22.1-7.fc7-i386.rpm软件包文件从非库资源网站下载时,可采用如下方式安装于Red Hat系统中。
rpm -i emacs-22.1-7.fc7-i386.rpm
注意:由于使用系统包管理工具rpm来进行安装,而不是采用库安装,所以并不会解决依赖性关系。一旦rpm在安装过程中发现缺少依赖包,rpm就会跳出错误后退出。
4. 查找已经安装的包
通过yum库安装的方式或者是rpm -i安装的方式安装的包可以使用命令rpm来查找。
shell> rpm -qa package_name
如果想查看已经安装包的具体安装位置,可以使用-l选项,具体如下:
shell> rpm -ql package_name
具体如下图所示:
5. 删除软件包
卸载软件包既可以使用高级包管理工具yum,也可以使用低级包管理工具rpm。高级管理工具yum的命令如下:
shell> yum erase package_name
低级管理工具rpm的命令如下:
shell> rpm -e package_name
命令执行结果如下图:
6. 更新库中的软件包
最常见的软件包管理任务是保持系统安装最新的软件包。高级包管理工具只需要一步就可以完成此重要的任务。命令如下:
shell> yum update package_name
7. 更新软件包文件中的软件包
如果软件包的更新版本已从非库源中下载,那么就可以用如下的命令进行安装更新从而取代原版本。命令如下:
shell> rpm -U package_file
例如,将Red Hat系统上已安装好的emacs程序更新为emacs-22.1-7.fc7-i386.rpm软件包文件中的版本的代码如下:
shell> rpm -U emacs-22.1-7.fc7-i386.rpm
8. 显示已安装软件包的相关信息
在已知已安装的软件包的名称的情况下,可以使用低级包管理工具rpm info来查看已安装包的详细信息。
shell> rpm info package_name
执行结果如下图:
9. 查看某具体文件由哪个软件包安装得到
可以使用低级包管理工具判断某个特定的文件是由哪个软件包负责安装的。命令如下:
shell> rpm -qf file_name
例如:查看Red Hat系统中哪个软件包安装了/usr/bin/emacs目录下的代码如下:
shell> rpm -qf /usr/bin/emacs
执行结果如下图所示: