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启动界面

 

APT(Advanced Packaging Tool)是Ubuntu Linux中功能最强大的命令行软件包管理工具,用于获取、安装、编译、卸载和查询Deb软件包,以及检查软件包依赖关系。本章介绍APT工作原理以及APT软件包管理器的使用方法,包括软件源的配置、软件包和源码包的查询、安装、卸载等。最后,介绍搭建APT代理服务器的方法。

 

9.1 APT工作原理

Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源(Reposity)。APT工作原理如图9.1所示。

 

图9.1  APT工作原理

然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在Ubuntu系统中,使用软件源配置文件/etc/apt/sources.list列出最合适访问的镜像站点地址。

即使这样,软件源配置文件只是告知Ubuntu系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。因而,就有必要为这些软件资源列个清单(建立索引文件),以便本地主机查询。这就是APT软件包管理器的工作原理,如图9.1所示。

同时,APT能够检查Ubuntu Linux系统中的软件包依赖关系,大大简化了Ubuntu用户安装和卸载软件包的过程。因而,APT成为Ubuntu Linux中最受欢迎的工具,也成为其他软件包管理工具的底层工具,例如,图形界面的软件包管理工具Synaptic就是在APT基础上工作的。

不过,APT并不是某个具体的命令,应该说是一组命令,以下列举几个常用的APT     命令。

  ●    apt-get:用于管理软件包,包括安装、卸载、升级等操作;

  ●    apt-cache:用于查询软件包信息;

  ●    apt-proxy:用于搭建APT代理服务器;

  ●    apt-show-versions:用于显示系统中软件包版本信息;

  ●    apt-config:用于读取APT配置文件的简单工具;

  ●    apt-cdrom:用于将CD-ROM加入软件源配置文件。

 

9.2 设置APT源

在安装Ubuntu Linux时,系统会根据用户所选择的国家/时区,推荐合适的软件源地址。通常,用户使用默认的配置文件就可以。不过,当用户发现更合适的软件源镜像站点时,可以重新设置APT源。
9.2.1  软件源配置文件

APT软件包管理器在一个文件中列出可获得软件包的镜像站点地址,这个软件源配置文件就是/etc/apt/sources.list。这个软件源配制文件的本质就是一个普通的文本文件,可以在超级管理员授权下,使用任何文本编辑器进行编辑。在该文件中,添加的软件源镜像站点称为一个配置项,并遵循以下格式:

DebType  AddressType://Hostaddress/Ubuntu  Distribution  Component1  Component2……

其中各字段含义如下所示。

  ●    DebType表示Deb软件包类型,使用deb表示二进制软件包,使用deb-src表示源码包;

  ●    AddressType表示访问地址类型,常用类型有:http、ftp、file、cdrom、ssh等;

  ●    Distribution表示Ubuntu的各个发行版本,例如dapper、feisty;

  ●    Component表示软件包组件类别,是由技术支持程度不同而划分的类别,可选择main、restricted、universe和multiverse中的一种或多种。

当然在软件源配置文件中可以添加很多条配置项,这样APT就可以从不同渠道、不同站点获取软件资源。假设要将cn.archive.ubuntu.com作为软件源镜像站点,以下为在/etc/apt/sources.list文件中添加的配置项:

deb  http://cn.archive.ubuntu.com/ubuntu/ feisty  main  restricted  universe  multiverse

deb-src  http://cn.archive.ubuntu.com/ubuntu/ feisty  main  restricted  universe  multiverse

以上配置信息告知APT工具,可以从该地址中获得Ubuntu的feisty版本的软件资源,包括二进制软件包(deb)和源码包(deb-src),并指明可以使用所有类别的软件包。

通常,在安装Ubuntu Linux时,系统会根据用户所选择的国家/时区,推荐合适的软件源地址,并自动添加到软件源配置文件中。用户可以使用默认的配置文件。如果需要修改或添加新的软件源地址,可以直接使用文本编辑器修改,也可以使用第四章介绍的软件源图形工具(单击【系统】|【系统管理】|【软件源】命令,打开【软件源】对话框)进行配置。

在编辑软件源配置文件时,如果需要暂时屏蔽掉某个配置项,可以在行首加“#”,APT读取文件时会自动跳过。

需要提醒的是,在每次修改完/etc/apt/sources.list文件后,一定要运行“apt-get update”命令,才会使更改有效。

 

9.3 查询软件包信息

一个正常运转的Ubuntu Linux系统中需要安装成千上万软件包,同时,在软件源的镜像站点上存放着不计其数的软件资源。如何准确、快速地检索到相关软件包信息,以便决定是否执行进一步操作(安装、升级、卸载)显得非常重要。
9.3.1  apt-cache命令

通常使用apt-cache命令完成查询软件源和软件包的相关信息。不过apt-cache是一个底层工具,需要与子命令配合使用,完成特定的查询工作。apt-cache命令提供了一系列工具可帮助用户找到想要的软件包。apt-cache命令的一般语法格式为:

apt-cache  subcommands  [ -p | -s | - q | - i | - c | -h ]  pkg

其中,pkg表示目标软件包的名称,可以是多个软件包;subcommands表示apt-cache的子命令,表9.2对常用子命令作了描述。apt-cache命令的选项有很多,表9.3列出了部分常用选项。

表9.2                                            apt-cache命令的常用子命令说明
子  命  令 
描    述

showpkg 
获取二进制软件包的常规描述信息

showsrc 
获取源码包的详细描述信息

show 
获取二进制软件包的详细描述信息

stats 
获取软件源的基本统计信息

dump 
获取软件源中所有软件包的简要信息

dumpavail 
获取当前中已安装的所有软件包的描述信息

unmet 
获取所有未满足的依赖关系

search 
根据正则表达式检索软件包

depends 
获取该软件包的依赖信息

rdepends 
获取所有依赖于该软件包的软件包

pkgnames 
列出所有已安装软件包的名字

policy 
获取软件包当前的安装状态


表9.3                                                apt-cache命令常用选项描述
选    项 
描    述

-p 
软件包的缓存

-s 
源代码包的缓存

-q 
关闭进度获取

-i 
获取重要的依赖关系,仅与unmet命令一起使用

-c 
读取指定配置文件

-h 
获取帮助信息


正如8.3节所述,dpkg命令将当前Ubuntu系统中已安装的软件包信息全部记录在/var/lib/dpkg/available文件中;而APT命令会扫描软件源中每一个镜像站点服务器,为可用的软件包资源建立索引文件,并存放在本地的/var/lib/apt/lists/目录中。以下是一个索引文件中有关gnome-nettool的片段,是对该软件的详细描述,gnome-nettool是Ubuntu系统默认安装的网络管理工具。

Package: gnome-nettool

Priority: optional

Section: gnome

Installed-Size: 2016

Maintainer: Ubuntu Core Developers ubuntu-devel-discuss@lists.ubuntu.com

Original-Maintainer: Andrew Lau netsnipe@users.sourceforge.net

Architecture: i386

Version: 2.18.0-0ubuntu1

Replaces: gnome-network (<= 1.99.5)

Depends: libc6 (>= 2.5-0ubuntu1), libgconf2-4 (>= 2.13.5), libglade2-0 (>= 1:2.5.1), libglib2.0-0 (>= 2.12.9),
    libgtk2.0-0 (>= 2.10.3), liblaunchpad-integration0 (>= 0.0patch26), libpango1.0-0 (>= 1.16.1), dnsutils, finger, net-tools, ping, iputils-tracepath, whois

Suggests: gnome-system-tools

Conflicts: gnome-network (<= 1.99.5)

Filename: pool/main/g/gnome-nettool/gnome-nettool_2.18.0-0ubuntu1_i386.deb

Size: 99158

MD5sum: 003cfb8e1a1a8e96bee4baab480e9c85

SHA1: 7e0c95c9ae3974f9cc8fc5898ab5f09a4206d54f

SHA256: 3666a2c39b048ab846aa6f7c9c23f27560ac50e5819bb19bb76054f3f81ec463

Description: network information tool for GNOME

    GNOME Nettool is a network information tool which provides user interfaces for

    some of the most common command line network tools including:

      * ifconfig

      * ping

      * netstat

      * tracepath

      * port scanning

      * DNS lookup

      * finger

      * whois.

Homepage: http://www.gnome.org/projects/gnome-network/

Bugs: mailto:ubuntu-users@lists.ubuntu.com

Origin: Ubuntu

Task: ubuntu-desktop, edubuntu-desktop

可以看出,索引文件中的软件包描述形式与/var/lib/dpkg/available的大致相同。其中,Filename项是gnome-nettool在软件源镜像站点上的存放位置,以及安装软件包的名称。

为了与dpkg命令进行比较,下面介绍各apt-cache命令查询功能时,仍以查询rxvt命令终端软件为例。
9.3.2  获取软件包的统计信息

在一个Ubuntu系统中包含了很多的软件包,那么到底数量有多少呢?下面的命令组合可以实现这个目标。首先使用“apt-cache pkgnames”命令获得目前系统中所有的已安装软件包,然后用wc命令完成统计。组合命令执行结果为,当前系统中总共安装了8946个软件包。

wdl@UbuntuFisher:~$ apt-cache pkgnames  |  wc –l

8946

如果用户认为上面的统计还是太粗糙,希望得到更细致的软件包统计数据,可以使用“apt-cache stats”命令。显然,“apt-cache stats”命令得到的信息,要比前面的组合命令丰富得多。该命令能够按照普通软件包、完全虚拟软件包、单虚拟软件包、混合虚拟软件包等类别,分别进行软件包数量和大小的统计。

wdl@UbuntuFisher:~$ apt-cache  stats

软件包总数(按名称计):8946 (358k)

  普通软件包:5096

  完全虚拟软件包:119

  单虚拟软件包:814

  混合虚拟软件包:29

  缺漏的:2888

按版本共计:5238 (272k)

Total Distinct Descriptions: 5240 (126k)

按依赖关系共计:43343 (1214k)

按版本/文件关系共计:6247 (100.0k)

Total Desc/File relations: 5240 (83.8k)

提供映射共计:1484 (29.7k)

Glob 字串共计:52 (450)

依赖关系版本名所占空间共计:260k

Slack 空间共计:88.4k

总占用空间:2062k
9.3.3  按关键字检索软件包

用户查询软件包,总会有记忆得不够准确、不够完整的时候。使用“apt-cache search”命令能够按照关键字检索软件包信息,帮助用户快速找到软件包。由于关键词是与软件包名称和描述信息进行匹配,因此,如果查询词过于普通的话,可能会返回很多无关的信息。建议用户使用多个关键词组合,以帮助提高查询精度。

以下命令的查询关键词是“rxvt”,命令执行结果返回三条记录。

wdl@UbuntuFisher:~$ apt-cache search  rxvt

ncurses-base -  Descriptions of common terminal types

rxvt         -    VT102 terminal emulator for the X Window System

rxvt-ml      -   multi-lingual VT102 terminal emulator for the X Window System
9.3.4  查询软件包描述信息

使用“apt-cache search”命令检索到用户关心的软件包,之后就可以希望进一步查询软件包的详细信息。
1.获取软件包的详细信息

可以使用“apt-cache show”命令获取指定软件包的详细信息,包括软件包安装状态、优先级、适用架构、版本、存在依赖关系的软件包,以及功能描述。该命令可以同时显现多个软件包的详细信息。

如果当前系统中已安装了某个软件包,同时又搜索到它的新版本,“apt-cache show”命令会将它们的详细信息一并列出。先列出可用软件包信息,后列出当前安装的软件包信息。

wdl@UbuntuFisher:~$ apt-cache  show  rxvt

Package: rxvt

Status: install ok installed

Priority: optional

Section: x11

Installed-Size: 552

Maintainer: David Moreno Garza damog@debian.org

Architecture: i386

Version: 1:2.6.4-10

Provides: x-terminal-emulator

Depends: libc6 (>= 2.3.4-1), libx11-6, base-passwd (>= 2.0.3.4)

Suggests: libxpm4

Conflicts: suidmanager (<< 0.50)

Conffiles: /etc/menu-methods/rxvt 03249f31e8009308c8126ad87661527f

Description: VT102 terminal emulator for the X Window System

    Rxvt is an 8-bit clean, color xterm replacement that uses significantly less memory than

    a conventional xterm, mostly since it doesn't support toolkit configurability or Tek graphics,

    but also since features can be removed at compile-time to reflect your needs..

    The distribution also includes rclock, the smaller/better xclock replacement with

    appointment scheduling and xbiff functionality.

以上命令的执行结果返回rxvt的详细描述信息,可以发现显示结果同“dpkg  -s rxvt”命令的执行结果是完全相同的。

如果用户感兴趣,希望获得系统中所有软件包的详细描述信息,可以使用“apt-cache dumpavail”命令,当然由于信息太多了,会在屏幕上飞快地闪过,不便于阅读。用户可以使用重定向符“>”,将这些信息保存一个文件中。以下命令将当前系统中的所有软件包信息保存在了pkgavail.txt文件中。

wdl@UbuntuFisher:~$ apt-cache dumpavail > pkgavail.txt
2.获取软件包的常规信息

在软件安装过程,用户关注更多的是软件包版本和软件包的依赖关系。因此,用户可以使用“apt-cahce showpkg”命令获取软件包的常规信息。

wdl@UbuntuFisher:~$ apt-cache showpkg  rxvt

Package: rxvt

Versions: 1:2.6.4-10 (/var/lib/dpkg/status)

Description Language:

  File: /var/lib/dpkg/status

  MD5: 66a3d03c2f89b2bd7ca372d0304de2dd

Reverse Depends: rxvt-ml, rxvt

Dependencies:

1:2.6.4-10 - libc6 (2 2.3.4-1) libx11-6 (0 (null)) base-passwd (2 2.0.3.4) libxpm4 (0 (null)) suidmanager (3 0.50)

Provides: 1:2.6.4-10 - x-terminal-emulator

Reverse Provides:

以上命令用于获取rxvt命令终端软件的常规信息,其中Dependencies表示存在依赖关系的软件包,Reverse Depends表示存在反向依赖关系的软件包;Provides表示存在提供关系的软件包,Reverse Provides表示存在反向提供关系的软件包。
9.3.5  获取软件包安装状态

在长期使用一个系统过程中,用户随时都可能需要了解一个软件包在当前系统中的安装状态。使用“apt-cache policy”可以获取软件包当前的安装状态,功能与“dpkg -l”命令基本相同,不过前者具有较好的可读性。

以下命令用于查询rxvt命令终端软件的安装状态。可以发现,rxvt的当前状态是“已安装”。

wdl@UbuntuFisher:~$ apt-cache policy  rxvt

rxvt:

   已安装:1:2.6.4-10

   候选的软件包:1:2.6.4-10

   版本列表:

   *** 1:2.6.4-10 0

             100 /var/lib/dpkg/status

如果接下来使用“dpkg-r”命令不完全卸载rxvt,再次查询rxvt的安装状态。可以看出rxvt软件已成功删除,但仍保留了软件的版本列表等配置信息。

wdl@UbuntuFisher:~$ sudo dpkg -r rxvt

(正在读取数据库 ... 系统当前总共安装有 117549 个文件和目录。)

正在删除 rxvt ...

wdl@UbuntuFisher:~$ apt-cache policy  rxvt

rxvt:

    已安装:(无)

    候选的软件包:(无)

    版本列表:

    1:2.6.4-10 0

         100 /var/lib/dpkg/status

紧接着,使用“dpkg-P”命令完全卸载rxvt,再次查询安装状态。可以看出rxvt软件,以及相关的配置信息全部删除。

wdl@UbuntuFisher:~$ sudo dpkg -P  rxvt

(正在读取数据库 ... 系统当前总共安装有 117516 个文件和目录。)

正在删除 rxvt ...

正在清除 rxvt 的配置文件 ...

wdl@UbuntuFisher:~$ apt-cache policy  rxvt

rxvt:

   已安装:(无)

   候选的软件包:(无)

   版本列表:
9.3.6  查询依赖关联的软件包

如8.1节所述,软件包的依赖性关系有6种,包括依赖、推荐、建议、替换、提供和冲突。每个软件包都可能具有其中的一种或几种特点。大多数的软件包管理器只处理重要的软件包依赖性关系,如APT只处理依赖和冲突的软件包,对软件包的其他关系不予理睬。因此,查询一个软件包的关联关系,以便全面掌握。
1.查询存在依赖关系的软件包

如果用户仅想了解某个软件包依赖于哪些软件包,可以使用“apt-cache depends”命令。以下命令的查询结果显示rxvt所依赖的软件包,除此还显示与其有建议关系和冲突关系的软件包。

wdl@UbuntuFisher:~$ apt-cache depends  rxvt

rxvt

   依赖: libc6

   依赖: libx11-6

   依赖: base-passwd

   建议: libxpm4

   冲突: <suidmanager>
2.查询存在反向依赖关系的软件包

如果用户仅想了解某个软件包被哪些软件包所依赖,可以使用“apt-cache redepends”命令。以下命令的查询结果显示依赖于rxvt的软件包。

wdl@UbuntuFisher:~$ apt-cache rdepends rxvt

rxvt

Reverse Depends:

  rxvt-ml

 

9.4 管理软件包

在Ubuntu Linux中,通常使用“apt-get”命令管理软件包,只需告知软件包名字,就可以自动完成软件包的获取、安装、编译和卸载,以及检查软件包依赖关系。
9.4.1  apt-get命令

apt-get命令本身并不具有管理软件包功能,只是提供了一个软件包管理的命令行平台。在这个平台上使用更丰富的子命令,完成具体的管理任务。apt-get命令的一般语法格式为:

apt-get  subcommands  [ -d | -f | -m | -q | --purge | --reinstall | - b | - s | - y | - u | - h | -v ]  pkg

其中,subcommands表示apt-get的子命令,表9.4对子命令做了描述;pkg表示目标软件包的名称,apt-get可以处理多个软件包。apt-get命令的选项有很多,表9.5列出部分常用选项。

表9.4                                                   apt-get命令的子命令说明
子  命  令 
描    述

update 
下载更新软件包列表信息

upgrade 
将系统中所有软件包升级到最新的版本

install 
下载所需软件包并进行安装配置

remove 
卸载软件包

autoremove 
将不满足依赖关系的软件包自动卸载

source 
下载源码包

build-dep 
为源码包构建所需的编译环境

dist-upgrade 
发布版升级

dselect-upgrade 
根据dselect的选择来进行软件包升级

clean 
删除缓存区中所有已下载的包文件

autoclean 
删除缓存区中老版本的已下载的包文件

check 
检查系统中依赖关系的完整性


表9.5                                                   apt-get命令常用选项描述
选    项 
描    述

-d 
仅下载软件包,而不安装或解压

-f 
修复系统中存在的软件包依赖性问题

-m 
当发现缺少关联软件包时,仍试图继续执行

-q 
将输出作为日志保留,不获取命令执行进度

--purge 
与remove子命令一起使用,完全卸载软件包

--reinstall 
与install子命令一起使用,重新安装软件包

-b 
在下载完源码包后,编译生成相应的软件包

-s 
不做实际操作,只是模拟命令执行结果

-y 
对所有询问都作肯定的回答,apt-get不再进行任何提示

-u 
获取已升级的软件包列表

-h 
获取帮助信息

-v 
获取apt-get版本号


从表9.4和表9.5所列的内容就可以看出apt-get具有很强大的功能,熟练掌握子命令、选项的用法,并进行巧妙的组合,可以完成几乎所有的管理任务。例如,“apt-get check”与“apt-get -f install”通常作为组合命令使用,前者用于检查软件包依赖关系,后者用于修复依赖关系。

在处理依赖关系上,apt-get会自动下载并安装具有依赖关系(depends)的软件包,但不会处理与安装软件包存在推荐(recommends)和建议(suggests)关系的软件包。也就是说,使用apt-get命令进行安装、卸载、升级等操作,只默认处理具有依赖关系的软件包。其他关系的软件包需要用户另行安装。
9.4.2  刷新软件源

无论用户使用哪些手段配置APT软件源,只是修改了配置文件——/etc/apt/sources.list,目的只是告知软件源镜像站点的地址。但那些所指向的镜像站点所具有的软件资源并不清楚,需要将这些资源列个清单,以便本地主机知晓可以申请哪些资源。

用户可以使用“apt-get update”命令刷新软件源,建立更新软件包列表。在Ubuntu Linux中,“apt-get update”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。因此,在计算机设备空闲时,经常使用“apt-get update”命令刷新软件源,是一个好的习惯。

wdl@UbuntuFisher:~$ sudo apt-get update

获取:1 http://debian.cn99.com feisty Release.gpg [191B]

忽略 http://debian.cn99.com feisty/main Translation-zh_CN

获取:2 http://debian.cn99.com feisty/universe Translation-zh_CN [27.5kB]

获取:3 http://debian.cn99.com feisty Release [57.2kB]

获取:4 http://debian.cn99.com feisty/main Packages [1007kB]

获取:5 http://debian.cn99.com feisty/universe Packages [3754kB]

获取:6 http://debian.cn99.com feisty/main Sources [293kB]

获取:7 http://debian.cn99.com feisty/restricted Sources [1710B]

获取:8 http://debian.cn99.com feisty/universe Sources [1131kB]

下载 6272kB,耗时 3m53s (26.8kB/s)

正在读取软件包列表... 完成

以上命令的执行结果将刷新软件源,建立软件包资源索引文件。
9.4.3  安装软件包

在准备好软件源并连通网络后,用户只需告知安装软件的名称,“apt-get install”命令就可以轻松完成整个安装过程,而无须考虑软件包的版本、优先级、依赖关系等。
1.安装软件包

使用“apt-get install”下载软件包大体分为4步:第一步,扫描本地存放的软件包更新列表(由“apt-get update”命令刷新更新列表),找到最新版本的软件包;第二步,进行软件包依赖关系检查,找到支持该软件正常运行的所有软件包;第三步,从软件源所指的镜像站点中,下载相关软件包;第四步,解压软件包,并自动完成应用程序的安装和配置。

以下命令用于安装xchat聊天室软件。

wdl@UbuntuFisher:~$ sudo apt-get install  xchat

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

读取状态信息... 完成

将会安装下列额外的软件包:

tcl8.4   xchat-common

建议安装的软件包:

tclreadline   libnet-google-perl

下列【新】软件包将被安装:

tcl8.4  xchat  xchat-common

共升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 1 个软件未被升级。

需要下载 2354kB 的软件包。

解压缩后会消耗掉 6693kB 的额外空间。

您希望继续执行吗?[Y/n] y

获取:1 http://debian.cn99.com feisty/main        tcl8.4         8.4.14-0ubuntu1  [1163kB]

获取:2 http://debian.cn99.com feisty/universe  xchat-common 2.8.0-0ubuntu4 [888kB]

获取:3 http://debian.cn99.com feisty/universe  xchat          2.8.0-0ubuntu4   [303kB]

下载 2354kB,耗时 1m44s (22.6kB/s)

选中了曾被取消选择的软件包 tcl8.4。

(正在读取数据库 ... 系统当前总共安装有 117915 个文件和目录。)

正在解压缩 tcl8.4 (从 .../tcl8.4_8.4.14-0ubuntu1_i386.deb) ...

选中了曾被取消选择的软件包 xchat-common。

正在解压缩 xchat-common (从 .../xchat-common_2.8.0-0ubuntu4_all.deb) ...

选中了曾被取消选择的软件包 xchat。

正在解压缩 xchat (从 .../xchat_2.8.0-0ubuntu4_i386.deb) ...

正在设置 tcl8.4 (8.4.14-0ubuntu1) ...

正在设置 xchat-common (2.8.0-0ubuntu4) ...

正在设置 xchat (2.8.0-0ubuntu4) ...

从以上命令执行结果中,可以看到xchat软件的整个安装过程。用户输入安装软件的名称,默认情况下,“apt-get install”将会安装最新版本的xchat软件,并且,检查xchat软件包依赖关系树。此时会发现与xchat存在依赖关系的软件包有tcl8.4和xchat-common,存在建议关系的软件包有tclreadline和libnet-google-perl。默认情况下,“apt-get install”只安装依赖关系的软件包。在回答“是否继续下载?”的提示后,开始下载软件包,下载过程可能需要一段时间。下载结束后,这些软件包会被自动解压,并按照依赖关系的前后顺序,依次完成安装和配置。

为确认是否安装成功,用户可以在命令提示符下执行以下指令,运行xchat。相关代码如下:

wdl@UbuntuFisher:~$ xchat  &

若用户将安装软件包的名称输入错误,“apt-get install”命令将提示“无法找到软件包”。以下命令将xchat软件名错误的输入为“XChat”,软件安装将失败。当然,若用户确定输入的软件名称正确,依然返回相同的错误提示,则说明当前所用镜像站点上没有该软件。

wdl@UbuntuFisher:~$ sudo apt-get install  XChat

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

读取状态信息... 完成

E: 无法找到软件包 XChat

需要说明的是,“apt-get install”命令下载软件包并不是立即安装的,而是将下载的包文件存放在本地缓存目录(/var/cache/apt/archives)中,等全部下载结束后,再进行安装。用户可以在这个目录下找到所有由apt-get install下载的软件包。
2.重新安装软件包

当用户不小心损坏了已安装的软件包,而需要修复,或者,希望重新安装软件包中某些文件的最新版本,可以使用“apt-get --reinstall install”命令进行软件包的重新安装。

以下命令用于重新安装xchat。不管当前软件是否已经安装,都将重新获得最新版本的xchat。

wdl@UbuntuFisher:~$ sudo apt-get  --reinstall  install  xchat

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

读取状态信息... 完成

建议安装的软件包:

libnet-google-perl

下列【新】软件包将被安装:

xchat

共升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 1 个软件未被升级。

需要下载 0B/303kB 的软件包。

解压缩后会消耗掉 815kB 的额外空间。

选中了曾被取消选择的软件包 xchat。

(正在读取数据库 ... 系统当前总共安装有 118070 个文件和目录。)

正在解压缩 xchat (从 .../xchat_2.8.0-0ubuntu4_i386.deb) ...

正在设置 xchat (2.8.0-0ubuntu4) ...

这里有个小的技巧,使用“apt-get install”也可以卸载软件包,只需在要卸载的软件包后标识“-”即可。卸载软件包的过程同后面讲到的“apt-get remove”执行结果是完全相同的。

wdl@UbuntuFisher:~$ sudo apt-get install xchat-
9.4.4  更新软件包

如前所述,使用“apt-get install”命令能够安装或更新指定的软件包。而在Ubuntu Linux中,只需一条命令就可以轻松地将系统中的所有软件包一次性升级到最新版本,这个命令就是“apt-get upgrade”,它可以很方便的完成在相同版本号的发行版中更新软件包。

wdl@wdl-desktop:~$ sudo apt-get upgrade

正在读取软件包列表... 完成

正在分析软件包的依赖关系树... 完成

下列的软件包将被升级:

  app-install-data-commercial cpio cupsys cupsys-bsd cupsys-client debconf debconf-
i18n dpkg dselect

  evolution-data-server hal hal-device-manager iptables klogd language-pack-en language-
pack-en-base

  lvm2 popularity-contest python-apt python2.4-apt sysklogd update-manager xserver-
xorg-core

……

共升级了 49 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 0 个软件未被升级。

需要下载 34.8MB 的软件包。

解压缩后会消耗掉 10.6MB 的额外空间。

您希望继续执行吗?[Y/n]

从以上命令执行结果可以看出,整个Ubuntu系统的更新过程非常简单。在依赖关系检查后,命令列出了目前所有需要升级的软件包,在得到用户确认后,便开始更新软件包的下载和安装。当然,apt-get upgrade命令会在最后以合理的次序,安装本次更新的软件包。系统更新需要用户等待一段时间。
9.4.5  升级到新版本

Ubuntu Linux会不断推出新的版本,无论是通过Internet,还是使用光盘(由ISO镜像文件刻录的安装光盘),使用“apt-get dist-upgrade”命令可以实现Ubuntu系统从一个版本直接升级到另一个新版本。例如,从Ubuntu的一个发行版本dapper(version 6.10)升级到feisty(version 7.04)。

这个升级过程包括3步:

  ●    第一步,需要修改软件源配置文件的各个配置项中的版本标识。类似于将以下配置项。

deb http://cn.archive.ubuntu.com/ubuntu/  dapper main restricted

修改为:

deb http://cn.archive.ubuntu.com/ubuntu/  feisty  main restricted

  ●    第二步,使用“apt-get update”命令刷新软件包更新列表。

  ●    第三步,使用“apt-get dist-upgrade”命令为系统升级新的版本。

从以下命令的执行结果可以看出,“apt-get dist-upgrade”要比“apt-get upgrade”要复杂的多,必须要筹划整个系统的升级过程,其中包括列出所有需要卸载、安装和升级的软件包。这个升级过程中的时间和空间消耗是相当大的。

wdl@wdl-desktop:~$ sudo apt-get  dist-upgrade

正在读取软件包列表... 完成

正在分析软件包的依赖关系树... 完成

正在筹划升级... 完成

下列软件包将被【卸载】:

  bluez-pcmcia-support gtk2-engines-clearlooks gtk2-engines-crux gtk2-engines-highcontrast

  gtk2-engines-industrial gtk2-engines-lighthouseblue gtk2-engines-mist gtk2-engines-redmond95

  ……

下列【新】软件包将被安装:

  avahi-autoipd avahi-daemon compiz compiz-core compiz-gnome compiz-gtk compiz-plugins console-setup

  console-terminus cpp cpp-4.1 cupsys-common dash dcraw desktop-effects espeak-data evolution-common

  ……

下列的软件包的版本将保持不变:

  ubuntu-minimal

下列的软件包将被升级:

  acpi-support acpid adduser alacarte alsa-base alsa-utils anacron apmd app-install-data

  app-install-data-commercial apt apt-utils aptitude aspell aspell-en at at-spi base-files bash bc

……

共升级了 792 个软件包,新安装了 168 个软件包,要卸载 71 个软件包,有 1 个软件未被升级。

需要下载 621MB 的软件包。

解压缩后会消耗掉 427MB 的额外空间。

您希望继续执行吗?[Y/n]
9.4.6  卸载软件包

在Ubuntu Linux系统中,卸载软件包也不仅仅是删除某个软件包就可万事大吉,同样需要保证系统中依赖关系的完整性。使用“apt-get remove”命令可以实现干净彻底地删除软件。
1.不完全卸载

不完全卸载是指卸载某个软件包及其关联软件包,但依然保留这些软件包在系统中的配置信息。“apt-get remove”会关注那些与被删除的软件包相关的其他软件包,删除一个软件包时,将会连带删除与该软件包有依赖关系的软件包。

以下命令用于卸载xchat,在分析软件包依赖关系树后,提示用户一同被删除的软件包还有:xchat-common、tcl8.4。

wdl@UbuntuFisher:~$ sudo apt-get remove  xchat

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

读取状态信息... 完成

The following packages were automatically installed and are no longer required:

xchat-common  tcl8.4

使用 'apt-get autoremove' 来删除它们。

下列软件包将被【卸载】:

xchat

共升级了 0 个软件包,新安装了 0 个软件包,要卸载 1 个软件包,有 1 个软件未被升级。

需要下载 0B 的软件包。

解压缩后将会空出 815kB 的空间。

您希望继续执行吗?[Y/n]y

(正在读取数据库 ... 系统当前总共安装有 118085 个文件和目录。)

正在删除 xchat ...

由于是不完全删除,xchat以及与之有依赖关系的软件包会被删除,但它们的配置文件,会完好无损地保留在系统里。可以使用“dpkg-l”查看xchat的状态为“rc”,即为“删除/仅保存配置”。

wdl@UbuntuFisher:~$ dpkg -l  xchat

期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)

| 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)

|/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)

||/    名称        版本                 简介

+++-========-==============-==================================

rc   xchat    2.8.0-0ubuntu4     IRC client for X similar to AmIRC
2.完全卸载

完全卸载是指彻底删除所有相关软件包及其配置文件。“apt-get --purge remove”命令在卸载软件包文件的同时,还删除该软件包所使用的配置文件。

以下命令执行结果将完全卸载xchat。从运行结果可以看到,完全删除的软件包使用星号“*”标识。与不完全卸载的过程相比,完全卸载的最后一步为“清除配置文件”。

wdl@UbuntuFisher:~$ sudo apt-get --purge remove  xchat

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

读取状态信息... 完成

The following packages were automatically installed and are no longer required:

xchat-common tcl8.4

使用 'apt-get autoremove' 来删除它们。

下列软件包将被【卸载】:

xchat*

共升级了 0 个软件包,新安装了 0 个软件包,要卸载 1 个软件包,有 1 个软件未被升级。

需要下载 0B 的软件包。

解压缩后将会空出 815KB 的空间。

您希望继续执行吗?[Y/n]y

(正在读取数据库 ... 系统当前总共安装有 118085 个文件和目录。)

正在删除 xchat ...

正在清除 xchat 的配置文件 ...

使用“dpkg –l”查看xchat的状态为“pn”,意为“清除/未知”。

wdl@UbuntuFisher:~$ dpkg -l xchat

期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)

| 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)

|/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)

||/    名称        版本                 简介

+++-========-==============-==================================

pn      xchat     <无>         (无相关介绍)

与“apt-get install”相同,使用“apt-get remove”也可以安装软件包,只需在要安装的软件包后标识“+”即可。安装软件包的过程同“apt-get install”执行过程完全相同。

wdl@UbuntuFisher:~$ sudo apt-get remove xchat+
9.4.7  修复软件包依赖关系

如果由于故障而中断软件的安装过程,可能会造成关联的软件包只有部分安装。之后,用户就会发现该软件既不能重装又不能删除。另外,有些用户可能会不顾及依赖关系,使用“dpkg -i”强制安装软件包,也可能破坏依赖关系。这时,可以使用“apt-get -f install”修复软件包依赖关系。

以下命令中,使用“dpkg -i”强行安装了g++软件包,从运行结果就可以发现,依赖关系无法满足。

wdl@UbuntuFisher:~$ sudo dpkg -i  g++_4.1.2-9ubuntu2_i386.deb

(正在读取数据库 ... 系统当前总共安装有 118086 个文件和目录。)

正预备替换 g++ 4:4.1.2-1ubuntu1 (使用 g++_4.1.2-9ubuntu2_i386.deb) ...

正在解压缩将用于更替的包文件 g++ ...

dpkg:依赖关系问题使得 g++ 的配置工作不能继续:

g++ 依赖于 g++-4.1 (>= 4.1.2-1);然而:

系统中 g++-4.1 的版本为 4.1.2-0ubuntu4。

dpkg:处理 g++ (--install)时出错:

依赖关系问题 - 仍未被配置

在处理时有错误发生:

g++

此时,使用“apt-get -f install”修复软件包依赖关系。在检查系统依赖关系后,将会下载额外的软件包,以便使当前的依赖关系能够恢复正常。

wdl@wdl-desktop:~/TreeCode$ sudo apt-get -f install

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

Reading state information... 完成

正在更正依赖关系... 完成

将会安装下列额外的软件包:

g++-4.1

建议安装的软件包:

gcc-4.1-doc lib64stdc++6 glibc-doc manpages-dev libstdc++6-4.1-doc

下列【新】软件包将被安装:

g++-4.1

共升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 1 个软件未被升级。

有 1 个软件包没有被完全安装或卸载。

需要下载2581kB的软件包。

解压缩后会消耗掉 32.9MB 的额外空间。

您希望继续执行吗?[Y/n]y

获取:1 http://debian.cn99.com feisty/main g++-4.1 4.1.2-0ubuntu4 [2581kB]

下载2581kB,耗时 1m59s (65.9kB/s)

选中了曾被取消选择的软件包 g++-4.1。

正在解压缩 g++-4.1 (从 .../g++-4.1_4.1.2-0ubuntu4_i386.deb) ...

正在设置 g++-4.1 (4.1.2-0ubuntu4) ...

建议用户经常使用“apt-get check”命令对软件包依赖关系进行检查。如果发现问题,就可以使用“apt-get -f install”命令进行修复。

wdl@UbuntuFisher:~$ sudo  apt-get  check

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

读取状态信息... 完成
9.4.8  清理软件包缓冲区

“apt-get install”为用户带来的方便就是,能够主动获取软件包以及存在依赖关系的软件包。不过“apt-get install”并不是边下载边安装,而是先将所有的软件包文件下载到本地,临时存放在一个软件包缓冲区/var/cache/apt/archives/中,等下载结束后再开始安装。随着系统使用时间的延长,这个缓冲区会不断膨胀,占用硬盘的存储资源,因此,需要用户定期清理软件包缓冲区。
1.清理整个软件包缓冲区

如果用户认为软件包缓冲区中的文件没有任何价值了,有必要删除全部下载的软件包。可以使用“apt-get clean”清理除了lock锁文件和partial目录的整个软件包缓冲区。命令执行效果与超级用户使用rm命令删除软件包文件是一样的。

wdl@UbuntuFisher:~$ ls  /var/cache/apt/archives/

lock  partial  rxvt_1%3a2.6.4-10_i386.deb  rxvt_2.6.4-12_i386.deb  xchat_2.8.0-0ubuntu4_
i386.deb

wdl@UbuntuFisher:~$ sudo apt-get clean

wdl@UbuntuFisher:~$ ls  /var/cache/apt/archives/

lock  partial

以上命令中,在“apt-get clean”前后使用ls命令查看目录内容,可以看出是否完成清理。
2.按照依赖关系清理缓冲区中多余的软件包

由于长时间使用系统,软件包缓冲区中存放了很多不同历史版本的软件包,例如用户曾经两次使用“apt-get install”命令安装了两个版本的rxvt命令终端软件,rxvt_1%3a2.6.4-10_i386.deb和rxvt_2.6.4-12_i386.deb。如果用户希望缓冲区中只保留最新版本的软件包,多余版本全部清除,可以使用“apt-get autoclean”命令。相关代码如下:

wdl@UbuntuFisher:~$ ls /var/cache/apt/archives/

lock  partial  rxvt_1%3a2.6.4-10_i386.deb  rxvt_2.6.4-12_i386.deb  xchat_2.8.0-0ubuntu4_
i386.deb

wdl@UbuntuFisher:~$ sudo apt-get  autoclean

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

读取状态信息... 完成

Del rxvt 2.6.4-12 [201kB]

wdl@UbuntuFisher:~$ ls /var/cache/apt/archives/

lock  partial  rxvt_1%3a2.6.4-10_i386.deb  xchat_2.8.0-0ubuntu4_i386.deb

从以上命令的执行结果可以看出,“apt-get autoclearn”在分析了依赖关系后,删除了多余的rxvt软件包。总之,“apt-get autoclean”仅删除那些过时的文件。

 

9.5 管理源码包

在开源软件的世界中,所有应用程序的源代码都是开放的。依照GNU的约定,Linux应用程序的源代码必须随软件包一同发布,即使第三方软件包也必须同意有偿开放源码。因而,用户随时可以获取自己所需要的应用程序源码包。在Ubuntu中,用户不但可以使用APT工具管理软件包,也可管理源码包,包括查询、获取、编译源码包,直至安装。本节将以tree实用程序(以树形结构获取目录树)为例,介绍管理源码包的方法。

在获取源码包之前,确保在软件源配置文件/etc/apt/source.list中添加了deb-src项。
9.5.1  查询源码包

从软件源镜像站点获取源码包,多数情况下需要事先了解源码包的相关信息。用户使用“apt-cache showsrc”命令就可以事先查询源码包信息,命令返回结果包括:版本(Version)、优先级(Priority)、编译依赖关系(Build-Depends)、适用计算机架构(Architecture)、镜像站点中存放位置(Directory)以及源码包中包含的文件(file)等。

以下命令的执行结果获取了tree源码包的详细描述信息。可以看到,file项列出了tree源码包中所包含的3个文件:tree_1.5.1-2.dsc、tree_1.5.1.orig.tar.gz、tree_1.5.1-2.diff.gz;Build-Depends项列出了编译tree源码包所依赖的软件包——debhelper。

wdl@UbuntuFisher:~$ sudo apt-cache  showsrc  tree

Package: tree

Binary:  tree

Version: 1.5.1-2

Priority: optional

Section: universe/utils

Maintainer: Florian Ernst florian@debian.org

Build-Depends: debhelper (>= 5)

Architecture: any

Standards-Version: 3.7.2

Format: 1.0

Directory: pool/universe/t/tree

Files:

    80dfa94dd21e331600d39f1e7ac60085 545 tree_1.5.1-2.dsc

    274ca4d36ee6fb216fa6cf01ad5eaa84 30806 tree_1.5.1.orig.tar.gz

    9f292df6931d70f59e1da7a7e06c35e9 4277 tree_1.5.1-2.diff.gz

实质上,使用“apt-cache showsrc”命令的更重要目的是,查询当前软件源中是否存放了某个源码包。在保证查询关键字正确的情况下,返回结果提示不存在,说明当前镜像站点中没有放置该源码包。此时,需要用户添加新的软件源。
9.5.2  获取源码包

在Ubuntu Linux中,使用“apt-get source”命令获取源码包。只需告知源码包的名字,该命令就可主动下载全部源码包文件。通常,源码包中包含3个文件,分别以dsc、orig.tar.gz和diff.gz为后缀名。“apt-get source”会将源码包下载到用户当前所在目录,并在命令执行过程中,调用dpkg-source命令,根据dsc文件中的信息,将源码包解压到同名目录中,应用程序的源代码就存放在这里。

以下命令执行结果,将tree源码包下载到当前目录“TreeSourceCode”中,又在这个目录下新建了tree-1.5.1目录,并将源码包解压到tree-1.5.1中。

wdl@UbuntuFisher:~/TreeSourceCode$ sudo  apt-get  source  tree

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

读取状态信息... 完成

需要下载 35.6kB 的源代码包。

获取:1 http://ubuntu.cn99.com feisty/universe tree 1.5.1-2 (dsc) [545B]

获取:2 http://ubuntu.cn99.com feisty/universe tree 1.5.1-2 (tar) [30.8kB]

获取:3 http://ubuntu.cn99.com feisty/universe tree 1.5.1-2 (diff) [4277B]

下载 35.6kB,耗时 2s (15.7kB/s)

gpg: 于 2007年01月25日 星期四 07时31分00秒 CST 创建的签名,使用 DSA,钥匙号 514B3E7C

gpg: 无法检查签名:找不到公钥

dpkg-source:正在解压 tree 于 tree-1.5.1

dpkg-source:正在解包 tree_1.5.1.orig.tar.gz

在下载tree源码包结束后,查看当前目录TreeSourceCode中的内容,可以看到三个文件(tree_1.5.1-2.diff.gz、tree_1.5.1-2.dsc、tree_1.5.1.orig.tar.gz)和一个目录(tree-1.5.1)。其中,存放在tree-1.5.1目录中的tree.c文件就是tree程序的源代码。

wdl@UbuntuFisher:~/TreeSource$ ls –l

总用量 48

drwxr-xr-x 4 root  root  4096  2007-10-03 06:58  tree-1.5.1

-rw-r--r—1  root  root  4277  2007-02-08 02:03  tree_1.5.1-2.diff.gz

-rw-r--r-- 1  root  root  545   2007-02-08 02:03  tree_1.5.1-2.dsc

-rw-r--r-- 1  root  root  30806 2007-02-08 02:03  tree_1.5.1.orig.tar.gz

需要强调的是,在下载源码包前,必须确保安装了dpkg-dev(执行“apt-get install dpkg-dev”安装)。否则,只下载源码包的3个文件,而不解压源码包。当然用户可以直接使用dpkg-source命令解压源码包。
9.5.3  构建源码包编译环境

通常,将源代码编译成二进制可执行的应用程序,还需要很多的头文件或共享库。因此,在编译源码包之前,需要安装具有依赖关系的相关软件包。例如,在9.5.1节中,使用“apt showsrc”命令查询tree源码包信息,“Build-Depends”项列出了编译该源码包所关联的软件包。可以看到,若要正确编译tree源码包必须先安装debhelper。

在Ubuntu Linux中,只需告知源码包的名字,使用“apt-get build-dep”命令可以主动获取并安装所有关联的软件包。

wdl@wdl-desktop:~/TreeCode$ sudo apt-get  build-dep  tree

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

Reading state information... 完成

下列【新】软件包将被安装:

debhelper

共升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 1 个软件未被升级。

需要下载514kB的软件包。

解压缩后会消耗掉 9384kB 的额外空间。

您希望继续执行吗?[Y/n]y

获取:1 http://ubuntu.cn99.com feisty/main debhelper 5.0.42ubuntu1 [514kB]

下载514kB,耗时 1m37s (25.3kB/s)

正在解压缩 debhelper (从 .../debhelper_5.0.42ubuntu1_all.deb) ...

正在设置 debhelper (5.0.42ubuntu1) ...

以上命令的执行结果是,获取并安装软件包debhelper,以备后期编译tree源码包。
9.5.4  编译源码包

用户获取应用程序源代码的目的,大多是为了按照自己的需求修改源程序。在完成必要的修改后,仍需要编译成二进制可执行程序,并打包生成Deb软件包,以便发布。在完成构建编译环境后,就可以着手开始编译源码包。

如前所述,在“apt-get source”命令下载源码包过程中,调用了“dpkg-source”命令,将源码包解压到同名目录中,应用程序的源代码就存放在这里。编译源码包时,需要进入这个目录,使用dpkg-buildpackage命令编译源码包,并将生成的Deb软件包放置在上层目录中。

例如,在下载tree源码包时,由“dpkg-source”命令将源代码解压放置在tree-1.5.1文件夹中。编译源码包时,进入tree-1.5.1目录,执行“dpkg-buildpackage”命令开始编译tree源码包。编译过程可能需要一段时间。最后,生成的可执行程序tree放置在tree-1.5.1目录中,生成的软件包tree_1.5.1-2_i386.deb放置在tree-1.5.1目录的上一层目录中。

wdl@UbuntuFisher:~/TreeCode$ cd  tree-1.5.1

wdl@UbuntuFisher:~/TreeCode/tree-1.5.1$ sudo  dpkg-buildpackage

dpkg-buildpackage: source package is tree

dpkg-buildpackage: source version is 1.5.1-2

dpkg-buildpackage: source changed by Florian Ernst < florian@debian.org>

dpkg-buildpackage: host architecture i386

dpkg-buildpackage: source version without epoch 1.5.1-2

debian/rules clean

dpkg-source -b tree-1.5.1

dpkg-source:构建中的 tree 使用已存在的 tree_1.5.1.orig.tar.gz

dpkg-source:正在构建 tree 于 tree_1.5.1-2.diff.gz

dpkg-source:正在构建 tree 于 tree_1.5.1-2.dsc

debian/rules build

gcc -o tree tree.o

dpkg-deb:正在新建软件包"tree",包文件为"../tree_1.5.1-2_i386.deb"。

signfile tree_1.5.1-2.dsc

通过以上编译过程,生成的软件包同样可以使用软件包管理器进行管理。下面使用“dpkg-i”命令安装刚刚编译生成的软件包,将tree实用程序安装在系统中。

wdl@UbuntuFisher:~/ TreeCode $ sudo  dpkg –i  tree_1.5.1-2_i386.deb

(正在读取数据库 ... 系统当前总共安装有 117915 个文件和目录。)

正预备替换 tree 1.5.1-2 (使用 tree_1.5.1-2_i386.deb) ...

正在解压缩将用于更替的包文件 tree ...

正在设置 tree (1.5.1-2) ...

现在可以使用tree命令查看以上编译工作目录中的内容。

wdl@UbuntuFisher:~/TreeCode$ tree  -L 2

.                            #当前目录为TreeCode

|-- tree-1.5.1            #dpkg-source命令将源码包解压到该目录中

|  |-- CHANGES

|  |-- LICENSE

|  |-- Makefile

|  |-- README

|  |-- build-stamp

|  |-- debian                  #在debian目录存放了打包用的控制文件

|  |-- man

|  |-- tree                    #编译生成的可执行文件

|  |-- tree.c                   #应用程序的源代码

|  `-- tree.o                   #编译生成的目标文件

|-- tree_1.5.1-2.diff.gz

|-- tree_1.5.1-2.dsc

|-- tree_1.5.1-2_i386.changes

|-- tree_1.5.1-2_i386.deb         #编译生成的软件包

`-- tree_1.5.1.orig.tar.gz

3 directories, 13 files

Logo

更多推荐