8.3 dpkg软件包管理器
dpkg软件包管理器是Ubuntu Linux系统的核心软件管理工具。由于dpkg不负责检查软件包依赖关系,因此,通常使用dpkg安装单个软件包。本节介绍dpkg的基本使用方法。
8.3.1 dpkg软件包管理命令
dpkg是Ubuntu Linux中最基本的命令行软件包管理工具,用于安装、编译、卸载和查询Deb软件包。但是,dpkg存在两个最大缺陷:第一,不能主动从镜像站点获取软件包;第二,安装软件包时,无法检查软件包的依赖关系。因此,在对一个软件组件的依赖关系不清楚的情况下,建议使用APT软件包管理器,如果用户对软件包的依赖关系非常清楚,才可以使用dpkg。
dpkg命令的一般语法格式为:
dpkg [ -l | -L | -s | -S | -i | -I | -c | -r | -P ] Debfilename
表8.5列出了部分常用选项。
表8.5 dpkg命令选项说明
选 项
描 述
-l
查看当前系统中已安装软件包的信息
-L
查看当前系统中指定软件包的所安装的相关文件
-s
查询已安装的指定软件包的详细信息
续表
选 项
描 述
-S
查询系统中某个文件所属的软件包
-i
安装软件包
-I
查看未安装软件包的信息
-c
列出Deb软件包中所包含的文件
-r
卸载Deb软件包,但不删除软件包的配置文件
-P
完全卸载Deb软件包,包括所有相关配置文件
dpkg将当前系统中所有软件包的详细描述信息保存在配置文件/var/lib/dpkg/status中,包括已安装和曾经安装过的,它是dpkg软件包信息查询操作的主要信息来源。以下是该文件中有关tasksel软件包的片段,包括优先级、版本、适用计算机架构、依赖与冲突的组件等描述信息。
Package: tasksel
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 868
Maintainer: Ubuntu Installer Team ubuntu-installer@lists.ubuntu.com
Architecture: all
Version: 2.59ubuntu2
Depends: debconf (>= 0.5) | debconf-2.0, debconf (>= 1.5.5) | cdebconf (>= 0.106), liblocale-gettext-perl, apt (>= 0.6.45ubuntu14), aptitude (>= 0.2.15-1), tasksel-data
Conflicts: debconf (<< 1.4.27), base-config (<< 2.32)
Size: 56932
Description: Tool for selecting tasks for installation on Debian systems
This package provides 'tasksel', a simple interface for users who
want to configure their system to perform a specific task.
Original-Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
由于每个软件包特性不同,因此各自所拥有的描述项也不尽相同,表8.6列出了常见软件包描述项。
表8.6 软件包描述信息项
描 述 项
含 义
实 例
Package
软件包名称
tasksel
Status
软件包状态
install ok installed
Priority
软件包优先级
important
Section
软件包所属类别
admin
Installed-Size
安装后的大小
868
Maintainer
维护者
Ubuntu Installer Team
Architecture
适用的计算机架构
all
Version
软件包版本
2.59ubuntu2
Replaces
替代关系的软件包
/
Provides
提供关系的软件包
/
Depends
依赖关系的软件包
debconf (>= 0.5) | debconf-2.0, debconf (>= 1.5.5) | cdebconf (>= 0.106), liblocale-gettext-perl, apt (>= 0.6.45ubuntu14), aptitude (>= 0.2.15-1), tasksel-data
续表
描 述 项
含 义
实 例
Recommends
推荐关系的软件包
/
Conflicts
冲突关系的软件包
debconf (<< 1.4.27), base-config (<< 2.32)
Description
软件包功能描述
Tool for selecting tasks for installation on Debian systemsThis package provides 'tasksel', a simple interface for users whowant to configure their system to perform a specific task.
Original-Maintainer
原始开发者
Debian Install System Team
8.3.2 获取已安装软件包的信息
Ubuntu Linux将所有已安装或已卸载的软件包信息都全部记录下来,以便后期的检索。然而这个安装记录非常多,靠手工查询费时费力,使用dpkg工具可以很方便地完成信息提取。
1.查看当前系统中已安装软件包
Ubuntu Linux系统是由非常多的程序组件支撑运行的。查询当前系统中的软件包安装情况,了解某个软件包的安装状态等操作都是经常要做的。“dpkg -l”可以获得当前系统中已安装软件包的信息列表。在此基础上,可以了解某些软件包是否被安装,或计算机系统中软件包的安装数量等。
下面的命令用于查询Vim、tasksel软件包的安装状态。从执行结果可以看到,目前系统中已安装了tasksel,软件包状态是“已安装”(ii表示已安装);而系统并未安装Vim,软件包状态是“未知”(un表示未安装,也无任何描述信息)。
wdl@UbuntuFisher:~$ dpkg -l vim tasksel
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
|/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
||/ 名称 版本 简介
+++-===============================================================================
ii tasksel 2.59ubuntu2 Tool for selecting tasks for installation on Debian system
un vim <无> (无相关介绍)
如果单独执行“dpkg-l”命令,由于安装的软件包非常多,显示的信息会在屏幕上非常快的滚动过去,对查询信息没有任何意义。因此,巧妙地将dpkg与其他命令结合起来使用,可以实现更多的查询功能,例如“dpkg -l | more”可以分屏显示。下面的命令用于统计当前系统中安装的软件包数量。
wdl@UbuntuFisher:~$ dpkg -l | grep ii | wc –l
1112
2.获取已安装软件包的详细描述信息
若希望进一步了解已安装软件包的详细信息,可以使用“dpkg -s”。可以发现,获取的信息就是该软件包在/var/lib/dpkg/status中的相关内容。当然,如果查询的软件包没有安装,或输入错误,“dpkg -s”会返回错误提示。
以下命令的目的是,查询gnome-terminal命令终端软件的详细描述信息,包括与其存在依赖、替代和冲突等关系的软件包信息。
wdl@UbuntuFisher:~$ dpkg -s gnome-terminal
Package: gnome-terminal
Status: install ok installed
Priority: optional
Section: gnome
Installed-Size: 432
Maintainer: Ubuntu Core Developers ubuntu-devel-discuss@lists.ubuntu.com
Architecture: i386
Version: 2.18.0-0ubuntu1
Replaces: gnome-terminal2
Provides: x-terminal-emulator
Depends: libatk1.0-0 (>= 1.13.1), libbonobo2-0 (>= 2.15.0), libc6 (>= 2.5-0ubuntu1), libgconf2-4 (>= 2.13.5), libglade2-0 (>= 1:2.5.1), libglib2.0-0 (>= 2.12.9), libgnome2-0 (>= 2.14.1), libgnomeui-0 (>= 2.17.1), libgnomevfs2-0 (>= 1:2.17.90), libgtk2.0-0 (>= 2.10.3), liblaunchpad-integration0 (>= 0.0patch26), liborbit2 (>= 1:2.14.1), libpango1.0-0 (>= 1.16.1), libpopt0 (>= 1.10), libstartup-notification0 (>= 0.8-1), libvte9 (>= 1:0.16.0), libx11-6, libxrender1, scrollkeeper (>= 0.3.14-5), gnome-control-center (>= 1:2.8.0), gnome-terminal-data (= 2.18.0-0ubuntu1)
Recommends: yelp
Conflicts: gnome-terminal2
Description: The GNOME 2 terminal emulator application
GNOME Terminal is a terminal emulation application that you can use to
perform the following actions:.
- Access a UNIX shell in the GNOME environment.
- Run any application that is designed to run on VT102, VT220, and xterm terminals..
GNOME Terminal features the ability to use multiple terminals in a single window (tabs) and
profiles support.
Original-Maintainer: Guilherme de S. Pastore <gpastore@debian.org>
3.查询已安装软件包的相关文件
在一个软件包安装完成后,其相关文件可能会非常多,且比较分散。若要进行软件配置,非常有必要了解与这个软件包相关的文件到底有哪些,以免出现遗漏。使用“dpkg -L”命令可以查询已安装软件包的相关文件。
命令的执行结果显示了已安装组件——gnome-terminal命令终端的所有相关文件。
wdl@UbuntuFisher:~$ dpkg -L gnome-terminal
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/gnome-terminal
/usr/share/doc/gnome-terminal/README
/usr/share/doc/gnome-terminal/AUTHORS
/usr/share/doc/gnome-terminal/copyright
/usr/share/doc/gnome-terminal/changelog.gz
/usr/share/doc/gnome-terminal/NEWS.gz
/usr/share/doc/gnome-terminal/changelog.Debian.gz
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/gnome-terminal.1.gz
/usr/bin
/usr/bin/gnome-terminal
/usr/bin/gnome-terminal.wrapper
/usr/share/man/man1/gnome-terminal.wrapper.1.gz
从以上执行结果可以看到,gnome-terminal是放置在/usr/bin目录下,它的联机帮助与说明文档分别放置在“/usr/share/man”和“/usr/share/doc”目录中。
4.查询某个文件相关软件包
与上面的情况相反,有时用户可能遇到某个文件,不能确定这个文件属于哪个软件包。因此查询与某个文件相关的软件包是非常必要的。使用“dpkg -S”可以将包描述信息与检索关键词匹配的所有软件包罗列出来。
wdl@UbuntuFisher:~$ dpkg -S gnome-terminal.wrapper
gnome-terminal: /usr/share/man/man1/gnome-terminal.wrapper.1.gz
gnome-terminal: /usr/bin/gnome-terminal.wrapper
以上命令的执行结果显示出与关键词“gnome-terminal.wrapper”匹配的系统中已安装的软件包。
8.3.3 获取软件包的信息
从一个侧面理解Deb软件包,其本质就是一个归档压缩文件,将程序文件、配置文件、man/info帮助页面等文件整合在一个文件中,该特点类似于tar文件。当然Deb软件包是用于安装的,而tar文件只是用于归档。使用dpkg可以查看Deb软件包的描述信息,以及软件包中的内容。
前面介绍过dpkg不能帮助用户下载指定的软件包。因此,用户需要使用wget手动下载软件包。下面命令的目的是,从某个URL地址下载一个软件包g++_4.1.2-9ubuntu2_i386.deb,并保存在当前目录。下面使用dpkg命令执行查询操作,以软件包g++_4.1.2-9ubuntu2_i386.deb为例。
wdl@UbuntuFisher:~$ wget http://ubuntu.cn99.com/ubuntu/pool/main/g/gcc-defaults/
g++_4.1.2-9ubuntu2_i386.deb
--03:43:17-- http://ubuntu.cn99.com/ubuntu/pool/main/g/gcc-defaults/g++_4.1.2-9
ubuntu2_i386.deb
=> `g++_4.1.2-9ubuntu2_i386.deb.1'
正在解析主机 ubuntu.cn99.com... 61.132.102.124
正在连接 ubuntu.cn99.com|61.132.102.124|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 1,440 (1.4K) [application/x-debian-package]
100%[===================================================================>] 1,440 3.88K/s
03:43:30 (3.88 KB/s) - `g++_4.1.2-9ubuntu2_i386.deb' saved [1440/1440]
1.查看软件包的描述信息
获取某个软件包后的第一件事,应该是查看这个软件的基本信息,包括版本、适用的计算机架构、依赖关系等,据此判断下载的软件包是否正确。可以使用“dpkg-I”查看软件包的描述信息,以下命令显示了g++_4.1.2-9ubuntu2_i386.deb软件包的信息。
wdl@UbuntuFisher:~$ dpkg -I g++_4.1.2-9ubuntu2_i386.deb
新格式的 debian 软件包,格式版本 2.0。
大小 1440 字节:主控包=962 字节。
632 字节, 16 行 control
1248 字节, 37 行 * postinst #!/bin/sh
107 字节, 9 行 * prerm #!/bin/sh
Package: g++
Source: gcc-defaults (1.59ubuntu2)
Version: 4:4.1.2-9ubuntu2
Architecture: i386
Maintainer: Ubuntu Core developers ubuntu-devel-discuss@lists.ubuntu.com
Installed-Size: 40
Depends: cpp (>= 4:4.1.2-9ubuntu2), gcc (>= 4:4.1.2-9ubuntu2), g++-4.1 (>= 4.1.2-1), gcc-4.1 (>= 4.1.2-1)
Suggests: g++-multilib
Provides: c++-compiler
Section: devel
Priority: optional
Description: The GNU C++ compiler
This is the GNU C++ compiler, a fairly portable optimizing compiler for C++..
This is a dependency package providing the default GNU C++ compiler.
Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
可以发现,显示结果的形式与/var/lib/dpkg/status中软件包描述内容的形式是基本一致,只是缺少status项。Ubuntu Linux在安装该软件包后,会将这些描述信息追加到/var/lib/dpkg/avaiable文件中保存。
2.查看软件包中的内容
在确认获取了正确的软件包后,在安装之前还应当查看一下该软件包会在系统中安装哪些文件。“dpkg-c”用于显示软件包中包含的文件列表。类似于“tar-tvf”命令显示tar包文件中包含的内容。以下命令列出了在g++_4.1.2-9ubuntu2_i386.deb软件包中包含的文件,这些文件均为链接文件。
wdl@UbuntuFisher:~$ dpkg -c g++_4.1.2-9ubuntu2_i386.deb
drwxr-xr-x root/root 0 2007-09-04 08:47 ./
drwxr-xr-x root/root 0 2007-09-04 08:47 ./usr/
drwxr-xr-x root/root 0 2007-09-04 08:47 ./usr/bin/
drwxr-xr-x root/root 0 2007-09-04 08:47 ./usr/share/
drwxr-xr-x root/root 0 2007-09-04 08:47 ./usr/share/man/
drwxr-xr-x root/root 0 2007-09-04 08:47 ./usr/share/man/man1/
drwxr-xr-x root/root 0 2007-09-04 08:47 ./usr/share/doc/
lrwxrwxrwx root/root 0 2007-09-04 08:47 ./usr/bin/i486-linux-gnu-g++ -> g++-4.1
lrwxrwxrwx root/root 0 2007-09-04 08:47 ./usr/bin/g++ -> g++-4.1
lrwxrwxrwx root/root 0 2007-09-04 08:47 ./usr/share/man/man1/i486-linux-gnu-g++.1.gz ->
g++-4.1.1.gz
lrwxrwxrwx root/root 0 2007-09-04 08:47 ./usr/share/man/man1/g++.1.gz -> g++-4.1.1.gz
lrwxrwxrwx root/root 0 2007-09-04 08:47 ./usr/share/doc/g++ -> cpp
8.3.4 安装软件包
可以使用“dpkg-i”命令安装软件包。但要强调的是,dpkg不能自动解决软件包的依赖性问题。在遇到有依赖关系的软件包不存在时,dpkg命令就会中止安装。从下面命令的执行结果可以看到由于依赖关系问题导致安装失败的情况。
wdl@wdl-desktop:~$ sudo dpkg -i g++_4.1.1-6ubuntu3_i386.deb
选中了曾被取消选择的软件包 g++。
(正在读取数据库 ... 系统当前总共安装有 88059 个文件和目录。)
正在解压缩 g++ (从 g++_4.1.1-6ubuntu3_i386.deb) ...
dpkg:依赖关系问题使得 g++ 的配置工作不能继续:
g++ 依赖于 g++- 4.1 (>= 4.1.1-2);然而:
未曾安装软件包"g++-4.1"。
dpkg:处理 g++ (--install)时出错:
依赖关系问题 - 仍未被配置
在处理时有错误发生:
g++
因此,dpkg适合于安装独立软件包,例如安装rxvt命令终端。仍然使用wget获得软件包rxvt_1%3a2.6.4-10_i386.deb,然后执行下面的命令完成安装。
wdl@UbuntuFisher:~$ sudo dpkg -i rxvt_1%3a2.6.4-10_i386.deb
选中了曾被取消选择的软件包 rxvt。
(正在读取数据库 ... 系统当前总共安装有 115795 个文件和目录。)
正在解压缩 rxvt (从 rxvt_1%3a2.6.4-10_i386.deb) ...
正在设置 rxvt (2.6.4-10) ...
8.3.5 卸载软件包
使用dpkg可以直接卸载指定的软件包。但要小心,dpkg不会理睬系统中软件间复杂的关联关系,删除指定软件包后,其他与之相关的软件包将置之不理。
1.不完全卸载
所谓不完全卸载,是指删除软件包在系统中的安装文件,而保留原有的配置文件。不完全卸载的目的是,有的用户卸载软件可能是为了升级软件包的版本,在重新安装该软件后,还能使用原有配置文件。
下面使用“dpkg –r”命令卸载rxvt命令终端,但保留rxvt在系统的信息,使用“dpkg-l”命令查看安装前后的状态。
wdl@UbuntuFisher:~$ dpkg -l | grep rxvt
ii rxvt 2.6.4-10 VT102 terminal emulator for the X Window Sys
wdl@UbuntuFisher:~$ sudo dpkg -r rxvt
(正在读取数据库 ... 系统当前总共安装有 115823 个文件和目录。)
正在删除 rxvt ...
wdl@UbuntuFisher:~$ dpkg -l | grep rxvt
rc rxvt 2.6.4-10 VT102 terminal emulator for the X Window Sys
从上面的执行结果可以看到,第一次查看rxvt的状态为“安装”状态(状态标记为ii);卸载后,再次查看rxvt,其状态为“删除/仅保存配置”状态(状态标记为rc)。
2.完全卸载
完全卸载就是将删除软件包在系统中的安装文件,包括其配置文件。“dpkg-P”用于干净彻底的删除软件包。下面的命令将完全卸载rxvt命令终端。
wdl@UbuntuFisher:~$ dpkg -l rxvt
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
|/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
||/ 名称 版本 简介
ii rxvt 2.6.4-10 VT102 terminal emulator for the X Window System
wdl@UbuntuFisher:~$ sudo dpkg -P rxvt
(正在读取数据库 ... 系统当前总共安装有 115823 个文件和目录。)
正在删除 rxvt ...
正在清除 rxvt 的配置文件 ...
wdl@UbuntuFisher:~$ dpkg –l rxvt
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
|/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
||/ 名称 版本 简介
pn rxvt <无> (无相关介绍)
从上面的执行结果可以看到,第一次查看rxvt软件包的状态为“安装”状态(状态标记为ii);完全卸载后,再此查看rxvt,其状态为“清除/未知”状态(状态标记为pn)。
8.3.6 将RPM文件转为Deb文件
在Ubuntu的镜像站点上,提供了几乎所有Deb格式的软件,供用户下载和使用。不推荐用户在Ubuntu Linux中使用Rpm软件包,因为其中存在很多文件格式兼容的问题。
如果用户认为有必要的话,可以使用alien实用程序将Rpm软件包转换为Deb软件包。转换后的软件包通常作为独立软件包,使用dpkg进行安装。不过可能新的Deb软件包仍存在依赖性问题。
wdl@UbuntuFisher:~$ sudo alien xine-skins-1.8-1.lvn5.noarch.rpm
warning: xine-skins-1.8-1.lvn5.noarch.rpm: Header V3 DSA signature: NOKEY, key ID a109b1ec
warning: xine-skins-1.8-1.lvn5.noarch.rpm: Header V3 DSA signature: NOKEY, key ID a109b1ec
hostname: Unknown host
xine-skins_1.8-2_all.deb generated
以上命令的执行结果将一个Rpm软件包转化成了Deb格式的软件包。