第8章 Ubuntu软件包管理概述
Ubuntu Linux采用了Debian的软件包管理机制。由于软件包具有易用性、灵活性和扩展性的特点,再加上Internet的支持,使用户随时都能拥有最新的 Ubuntu系统,这也是Ubuntu受到推崇的一个重要原因。因而,Deb软件包管理也成为Ubuntu中最有活力的部分。本章介绍Ubuntu软件包 管理和dpkg软件包管理器。
8.1 Deb软件包概述
Deb软件包本质上是文件包,这点类似于tar文件将多个文件合并为一个归档文件。但是Deb的身价不在于整合文件,而在于使应用程序更易于传播。
8.1.1 流行的两种软件包管理机制
最初,基于Linux系统的开发者在完成应用程序开 发后,将很多二进制文件发给用户,用户使用之前需要将相关程序逐个安装。因此,Debian Linux首先提出“软件包”的管理机制——Deb软件包,将应用程序的二进制文件、配置文档、man/info帮助页面等文件合并打包在一个文件中,用 户使用软件包管理器直接操作软件包,完成获取、安装、卸载、查询等操作。
随即,Redhat Linux基于这个理念推出了自己的软件包管理机制——Rpm软件包。当然,Redhat Linux采用了自己的打包格式生成Rpm包文件,由Rpm包管理器负责安装、维护、查询,甚至软件包版本管理。由于Redhat Linux系统的普及,Rpm软件包被广泛使用,甚至出现第三方开发的软件管理工具,专门管理Rpm格式的软件包。
随着Linux操作系统规模的不断扩大,系统中软件 包之间复杂的依赖关系,导致Linux用户麻烦不断。为了解决这个问题,Debian Linux开发出了APT软件包管理器。它能够自动检查和修复软件包之间的依赖关系。并且,利用Internet网络带来的快捷的连通手段,APT工具可 以帮助用户主动获取软件包。因此,APT工具再次促进了Deb软件包更为广泛地使用,成为Debian Linux的一个无法替代的亮点。
Ubuntu Linux系统的软件包管理机制延续了Debian的包管理方法。
8.1.2 软件包的类型
Debian包文件包含了二进制可执行文件、库文件、配置文件和man/info帮助页面等文档。通常Debian包文件的后缀为.deb,因此称为“Deb软件包”。Ubuntu有两种类型的软件包:二进制软件包(deb)和源码包(deb-src)。
● 二进制软件包(Binary Packages):包含可执行文件、库文件、配置文件、man/info页面、版权声明和其他文档。
● 源码包(Source Packages):包含软件源代码、版本修改说明、构建指令以及编译工具等。先由tar工具归档为.tar.gz文件,然后再打包成.dsc文件。
用户不确定一个软件包具体类型时,可以使用file命令查看文件类型。例如下面命令用于证实一个软件包的文件类型是否是Deb软件包文件。
wdl@UbuntuFisher:~$ file g++_4.1.2-9ubuntu2_i386.deb
g++_4.1.2-9ubuntu2_i386: Debian binary package (format 2.0)
在Ubuntu Linux中,需要说明一个概念——虚拟软件包。将系统中具有相同或相近功能的多个软件包作为一个软件包集合,称为虚拟软件包,并指定其中一个软件包作为 虚拟软件包的默认首选项。提出虚拟软件的意图就是为了防止软件安装过程中发生冲突。例如,exim、sendmail和postfix软件包都是用于邮件 传输代理,将“mail-transport-agent”指定为它们的虚拟软件包。当用户安装“mail-transport-agent”时,将选择 安装exim、sendmail和postfix其中的首选项。
8.1.3 软件包的命名
在Ubuntu Linux中,软件包的命名遵循以下约定:
Filename_Version-Reversion_Architecture.deb
其中,Filename表示软件包文件名,Version表示软件版本号,Reversion表示修订版本号,Architecture表示适用计算机架构。通常,修订版本号是由Ubuntu开发者或创建这个软件包的人指定。在软件包被修改过之后,将修改版本号加1。
以g++_4.1.2-9ubuntu2_i386.deb软件包为例,g++是软件包名,4.1.2是软件版本号,9ubuntu2是修订版本号,i386是适用的计算机架构。
8.1.4 软件包的优先级
Ubuntu Linux为每个软件包指定了一个优先级,作为软件包管理器选择安装和卸载的一个依据。表8.1列出了Ubuntu定义的所有软件包优先级描述。
表8.1 软件包优先级描述
级 别 | 含 义 | 补 充 说 明 | |
Required(必须) | 高
低 | 该级别软件包是保证系统正常运行所必须的 | 包含所有必要的系统工具。尽管Require级别的软件不能满足整个系统的服务,但至少能够保证系统正常启动。如果删除其中一个软件包,系统将受到损坏而无法恢复。例如bash、mount、upstart |
Important(重要) | 若缺少该级别软件包,系统会运行困难或不好操作 | 该级别软件包是一些实现系统底层功能的程序。例如,aptitude、ubuntu-keyring、cpio | |
Standard(基本) | 该级别软件包是任何Linux系统的标准件 | 该级别的软件包可以支撑命令行控制台系统运行,通常作为默认安装选项,例如,memtest86、telnet、pppconfig、ed | |
Optional(可选) | 该级别软件包是否安装不影响系统的正常运行 | 该级别的软件包用于满足用户特定的需求或服务,它们不会影响系统的正常运行。例如,X11、mysql、openoffic.org | |
Extra(额外) | 该级别软件包可能与其他高级别软件包存在冲突 |
在Ubuntu系统中规定,任何高优先级的软件包都不能依赖于低优先级的软件包。这样可以实现按照优先级一层层冻结系统。在新版本发布准备阶段,优先级的作用就显得更为重要。
基本系统由Required级和 Important级软件包组成,属于这类优先级的软件包首先被冻结。由于这些软件包是其他软件包所依赖的,它们能保证整个系统的稳定,这是Ubuntu 发布新版本所必需的。然后,冻结Standard级软件包,紧接着,在发布新版本之前对Optional级和Extra级软件包进行冻结。
8.1.5 软件包的状态
在使用系统过程中,用户会不断的安装、卸载软件包。为了记录用户的安装行为,Ubuntu对软件包定义了以下两种状态,如表8.2所示。
● 期望状态:标记用户希望将某个软件包处于的状态。
● 当前状态:标记用户操作该软件包后的最终状态。
表8.2 软件包状态定义
类 别 | 状 态 | 状 态 符 | 描 述 |
期望状态 | 未知(unknown) | u | 用户并没描述他想对软件包进行什么操作 |
已安装(install) | i | 该软件包已安装或升级 | |
删除(remove) | r | 软件包已删除,但不想删除任何配置文件 | |
清除(purge) | p | 用户希望完全删除软件包,包括配置文件 | |
保持(hold) | h | 用户希望软件包保持现状,例如,用户希望保持当前的版本,当前的状态 | |
当前状态 | 未安装(Not) | n | 该软件包描述信息已知,但仍未在系统中安装 |
已安装(installed) | i | 已完全安装和配置了该软件包 | |
仅存配置(config-file) | c | 软件包已删除,但配置文件仍保留在系统中 | |
仅解压缩(Unpacked) | U | 已将软件包中的所有文件释放,但尚未执行安装和配置 | |
配置失败(Failed-config) | F | 曾尝试安装该软件包,但由于错误没有完成安装 | |
不完全安装(Half-installed) | H | 已开始进行提取后的配置工作,但由于错误没有完成安装 |
8.1.6 软件包的依赖性关系
Linux操作系统是一个复杂系统。这个系统包含了 大量的软件组件。但是,若要求它们能够成为一个有机整体,支撑Linux系统的正常运转,就必须要求各个组件密切配合。这就是Linux操作系统最初的设 计理念——尽可能提高软件系统内部的耦合度。换句话说,某个软件组件是否能够正常运行或运行的更好,依赖于其他一些软件组件的存在。这样做的好处是,使系 统更加致密、紧凑,减少中间环节可能引发的错误。然而,随即带来的两个负面问题是,软件组件依赖和软件组件冲突问题。
为了解决这个问题,Debian提出了程序依赖性机制,并做详细的定义。程序依赖性是用来描述独立运行程序与当前系统中程序之间存在的关联程度。表8.3列出了Ubuntu中依赖性关系的定义。
表8.3 依赖性关系定义
依 赖 关 系 | 关 系 描 述 |
依赖(depends) | 要运行软件包A必须安装软件包B,甚至还依赖于B的特定版本,通常版本依赖有最低版本限制 |
推荐(recommends) | 软件包维护者认为所有用户都不会喜欢缺少软件包A的某些功能,而这些功能需要B来提供 |
建议(suggests) | 软件包B能够增强软件包A的功能 |
替换(replaces) | 软件包B安装的文件被软件包A中的文件删除或覆盖了 |
冲突(conflicts) | 如果系统中安装了软件包B,那么软件包A将无法运行。“Conflicts”常和“Replaces”同时出现 |
提供(provides) | 软件包A中包含了软件包B中的所有文件和功能 |
软件包管理器将依据软件包“依赖关系”完成组件 的安装或卸载。例如,包含GNU C编译器(gcc)的软件包依赖于包含链接器和汇编器的binutils软件包。如果用户试图在没有安装binutils的情况下安装gcc,软件包管理 器将会中止安装,并出现错误提示,要求用户事先安装binutils。
8.2 Deb软件包管理工具概述
Deb软件包将二进制应用程序、配置文档、帮助页面都整合在一个文件中,便于传递、安装、升级和备份。显然,Deb软件包的管理不能单纯依靠用户手工来完成。本节简单介绍Ubuntu Linux所支持的常见软件包管理工具。
8.2.1 软件包管理工具分类
Ubuntu Linux为用户提供了不同层次和类型的软件包管理工具,根据用户交互方式的不同,可以将常见的软件包管理工具分为3类,如表8.4所示。
表8.4 软件包管理工具分类
类 别 | 常见工具举例 | 描 述 |
命令行 | dpkg-deb、dpkg、apt | 在命令行模式下完成软件包管理任务。为完成软件包的获取、查询、软件包依赖性检查、安装、卸载等任务,需要使用各自不同的命令 |
文本窗口界面 | dselect、aptitude、tasksel | 在文本窗口模式中,使用窗口和菜单可以完成软件包管理任务 |
图形界面 | synaptic | 在X-Window图形桌面环境中运行,具有更好的交互性、可读性、易用性等特点 |
使用软件包管理工具能够实现以下功能:
● 从Ubuntu软件源的镜像站点自动获取与安装软件相关的所有软件包;
● 将应用软件的相关文档打包成Deb软件包;
● 查询和检索Deb软件包信息;
● 检查当前操作系统中软件包的依赖关系;
● 安装和卸载Deb软件包。
8.2.2 命令行管理工具
dpkg、dpkg-deb和APT是Ubuntu Linux最基础、最传统的命令行模式的软件包管理工具,其中APT工具是最受瞩目的。应该准确的说,它们是一个软件工具集,都包含了很多的应用程序,并各自具有独立的功能。
dpkg是最早的Deb包管理工具,它在 Debian Linux一提出包管理模式后就诞生了。使用dpkg可以实现软件包的安装、编译、卸载、查询,以及应用程序打包等功能。但是由于当时Linux系统规模 和Internet网络条件的限制,没有考虑到操作系统中软件包存在如此复杂的依赖关系,以及存在帮助用户获取软件包(获取存在依赖关系的软件包)的需 要。为了解决软件包依赖性问题和获取问题,就出现了APT工具。不过,作为基本的包管理工具,Ubuntu Linux仍然支持dpkg。
APT系列工具可能是Deb软件包管理工具中功能最 强大的。Ubuntu将所有的开发软件包存放在Internet上的许许多多镜像站点上,用户可以选择其中最适合自己的站点作为软件源。然后,在APT工 具的帮助下,就可以完成所有的软件包的管理工作,包括维护系统中的软件包数据库、自动检查软件包依赖关系、安装和升级软件包、从软件源镜像站点主动获取相 关软件包等。常用的APT实用程序有apt-get、apt-cache、apt-file、apt-cdrom等。下一章会对APT工具做详细介绍。
dpkg-deb是dpkg的后端工具,为dpkg提供更底层的软件包管理功能。用户在使用dpkg命令时将会自动调用dpkg-deb。
8.2.3 文本窗口管理工具
文本窗口管理工具实质是将命令行工具作为底层,在上层包装了一个文本界面的实用工具。文本窗口管理工具为用户提供了窗口、菜单、快捷键等操作手段,以方便完成软件包的管理工作,而无需用户再记忆大量复杂的命令。
1.aptitude
aptitude提供了用户所需的大部分包管理功能,界面操作简单,可以使用鼠标和键盘打开菜单,执行各种动作。在命令行执行以下命令,启动aptitude,如图8.1所示。
wdl@UbuntuFisher:~$ sudo aptitude
aptitude的界面十分友好,用户可以在上 方区域中的树形列表中选择软件包,同时,在窗口下方区域中显示相应的软件包描述信息。aptitude窗口具备功能强大的菜单以及丰富的联机帮助,可以指 导用户很快地学会使用,而且操作起来也相当简便,例如按下【q】键就可退出aptitude窗口。
2.dselect
dselect是Deb软件包管理工具的元老级工 具,功能比aptitude强大的多。只是作为文本窗口的管理工具,它缺少aptitude的简洁性、易用性。比如dselect仅使用数字菜单,不支持 鼠标操作。当然,对于Ubuntu服务器用户,在文本终端环境下工作,使用dselect是最好的选择。
在命令行执行以下命令,启动dselect,如图8.2所示。
wdl@UbuntuFisher:~$ sudo dselect
图8.1 apptitude启动界面 图8.2 dselect启动界面
由于dselect的底层实质就是调用了APT、dpkg等工具,用户在dselect中执行某个动作,都会进入命令行中执行,结束后再返回dselect的数字菜单。
3.tasksel
有时为了完成某个安装任务,需要安装的软件包非常 多。比如,Ubuntu的桌面系统是由许多的软件包共同支撑运行的。因此,可以按照一个大的任务来规划需要安装的软件包。默认情况下,tasksel会列 出几个典型的安装任务供选择,用户可以不用顾及其中需要安装哪些软件包。使用tasksel特别适用于首次安装和大面积升级。
在命令行执行以下命令,启动tasksel,如图8.3所示。
wdl@UbuntuFisher:~$ sudo taskel
在tasksel的任务列表中,用星号(*)标识已 经安装的任务组件。使用空格键选择要安装的任务组件,光标移动到【确定】,按Enter键开始安装。需要说明的,由于安装的软件包非常多,tasksel 的执行过程可能会等待很长的时间。在任务结束后,按【Esc】键就可退出tasksel窗口。
在命令行执行“tasksel --list”命令也可显示tasksel的任务列表。在执行结果中,“i”表示该任务组件已安装,“u”表示该任务组件未安装。
wdl@UbuntuFisher:~$ tasksel --list
i dns-server DNS server
u edubuntu-server Edubuntu server
u lamp-server LAMP server
u edubuntu-desktop Edubuntu desktop
u kubuntu-desktop Kubuntu desktop
i ubuntu-desktop Ubuntu desktop
u xubuntu-desktop Xubuntu desktop
u edubuntu-live Edubuntu live CD
u kubuntu-live Kubuntu live CD
u ubuntu-live Ubuntu live CD
u xubuntu-live Xubuntu live CD
在命令行执行“tasksel install”命令,可以开始安装指定任务组件。
wdl@UbuntuFisher:~$ sudo tasksel install edubuntu-server
以上命令用于安装edubuntu-server,该命令会紧接着打开安装界面,如图8.4所示。
图8.3 tasksel启动界面 图8.4 tasksel开始安装
8.2.4 图形界面管理工具
synaptic是Ubuntu Linux在图形桌面环境下使用最广泛的软件包管理工具。在中文Ubuntu系统中,被称为“新立得”软件包管理器。synaptic底层仍是依赖于 APT包管理命令,除了具有软件包的安装、卸载、升级、查询等功能,同时还增加了软件包过滤、版本锁定、强制安装等功能。而且,synaptic利用主菜 单、关联菜单、工具栏、视窗、标记符号等可视化工具,使用户无需特意学习,就可以很快掌握操作方法。因而,synaptic具有的非常优良的交互性、可读 性、易用性,吸引了大量的桌面用户。synaptic软件包管理器将在第10章详细介绍。启动synaptic有两种方式。
● 方式一:在命令行执行以下命令,启动synaptic。
wdl@UbuntuFisher:~$ sudo /usr/sbin/synaptic
● 方式二:使用桌面菜单启动synaptic。
单击【系统】|【系统管理】|【新立得软件包管理器】命令,打开【新立得软件包管理器】窗口,如图8.5所示。
图8.5 synaptic启动界面