APT工作原理

 

转自http://blog.csdn.net/buguyiqie/article/details/4948661

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.2.2  将CD-ROM加入配置文件

当用户获得一张Ubuntu新版本的安装光盘,可以使用APT从光盘上安装或升级软件包。当然,可以将如下的软件源配置项直接添加到/etc/apt/sources.list文件中。相关代码如下:

deb cdrom:[Ubuntu 7.04 _Feisty Fawn_ - Release i386 (20070415)]/ feisty main restricted

也可以使用apt-cdrom命令完成该操作。

1.apt-cdrom命令

apt-cdrom命令可用于检查Ubuntu安装光盘,也可将安装光盘作为软件源添加到软件源配置文件中。命令的一般语法格式为:

apt-cdrom  subcommands  [ -d | -r | -m | -f | -a | - h ]

其中,subcommands表示apt- cdrom的子命令:ident子命令用于扫描Ubuntu安装光盘,add子命令用于向/etc/apt/sources.list文件添加CD- ROM配置项。apt-cdrom命令的选项用于对光驱进行额外的设置,表9.1列出部分常用选项。

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

选    项

描    述

-d

指定CD-ROOM的挂载点

-r

为一个已经识别CD-ROOM改名

-m

声明CD-ROOM无挂载点

-f

快速模式,不检查软件包文件

-a

完整扫描模式

-h

获取帮助信息

在默认情况下,当安装光盘放入光驱,Ubuntu会自动将其加载到/media/cdrom目录下。如果用户需要将光盘挂载到自定义的其他位置,就需要使用“-d”选项。

2.扫描安装光盘信息

在得到新的安装光盘时,最好先使用“apt-cdrom ident”命令扫描一下,检查安装光盘内容是否完整,进行MD5校验,并识别出光盘标签。以下是对Ubuntu 7.04 Feisty安装光盘的识别。

wdl@UbuntuFisher:~$ apt-cdrom  ident

现把 /cdrom/ 作为了 CD-ROM 的挂载点

正在挂载 CD-ROM

正在鉴别.. [581fba8925f558d1af19a394af953b75-2]

存档标签:Ubuntu 7.04 Feisty Fawn - Release i386 (20070415)

需要说明的是,“apt-cdrom ident”命令只用于识别光盘,并不修改软件源配置文件。

3.将安装光盘添加软件源

如果安装光盘识别无误的话,就可以使用“apt-cdrom add”命令将CD-ROM配置项添加到/etc/apt/sources.list文件中。

wdl@wdl-desktop:~$ sudo apt-cdrom  add

现把 /cdrom/ 作为了 CD-ROM 的挂载点

正在卸载 CD-ROM 文件系统

等待插入盘片……

请把光盘碟片插入驱动器再按回车键

正在挂载 CD-ROM 文件系统……

正在鉴别.. [b0eec9ebb2f73cb755ea5ff17b89a5e4-2]

正在光盘中查找索引文件..

找到了 2 个软件包索引、0 个源代码包索引,和 1 个数字签名

这张光盘现在的名字是:

“Ubuntu 7.04 _Feisty Fawn_ - Release i386 (20070415)”

正在复制软件包列表……gpgv: 于 2007年04月15日 星期日 21时52分01秒 CST 创建的签字,使用DSA,

钥匙号 FBB75451

gpgv: 完好的签字,来自于“Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>”

Reading Package Indexes... 完成

正在写入新的软件包源列表

对应于该光盘的软件包源设置项是:

deb cdrom:[Ubuntu 7.04 _Feisty Fawn_ - Release i386 (20070415)]/ feisty main restricted

正在卸载 CD-ROM 文件系统……请对您的光盘套件中的其他光盘重复相同的操作。

可以看出这个操作非常方便。在命令执行最后,将CD-ROM作为一个软件源配置项添加到配置文件中。并且,由于Ubuntu标准安装光盘只包含Main和Restricted类别的软件,因此,在配置项中的软件包组件类别为Main、Restricted。

9.2.3  选择最优软件源

每个新用户都会遇到同一个问题:应该选择哪个镜像站点呢?数目众多的软件源镜像站点分布在Internet上,用户可以使用“netselect –vv”命令评测各个镜像站点在当前网络环境中的性能,以便选择最合适自己的镜像站点。

运行“netselect –vv”命令时,加上以空格分隔的镜像站点列表。该命令会为每个镜像站点给出一个评估分。这个分值是通过评估以下两个指标综合得出。

  ●    ping time:网络请求报文到达目标主机的时间消耗。

  ●    hops:网络请求报文到达目标主机所跳转的主机个数。

评估分值越小,说明镜像站点的预计下载速度越大。因此,选择最优软件源的标准就是挑选评估分值最小的那个站点。“netselect –vv”命令在执行最后列出最优软件源地址。

以下命令用于评价3个镜像站点,可以看出从本地主机到达目标站点ubuntu.cn99.com的时间消耗最小(374ms),评分为747,表明在这三个站点中,ubuntu.cn99.com是最佳的软件源。

wdl@UbuntuFisher:~$ sudo netselect -vv   cn.archive.ubuntu.com   ubuntu.cn99.com   debian.cn99.com

Running netselect to choose 1 out of 3 addresses.

.....................

ubuntu.cn99.com          374 ms   2 hops   60%   ok ( 6/10)    [ 747]

debian.cn99.com          389 ms   2 hops   50%   ok ( 5/10)    [ 933]

cn.archive.ubuntu.com   931 ms   2 hops   70%   ok ( 7/10)    [ 1596]

      747   ubuntu.cn99.com

当然,用户所处的网络环境不同,命令的执行结果也会不同,所以建议用户先亲自测试一下,之后,就可以将netselect找到的连接速度最快的镜像站点加入/etc/apt/sources.list文件中。

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

posted on 2017-02-19 21:12  lazydragon  阅读(3133)  评论(0编辑  收藏  举报

导航