<!-- Subversion revision of original English document "1696" -->
<!--
   Chinese version: $Revision: 1.1 $
   -->  

<chapt id="pkgtools">Debian 的包管理工具

<sect id="pkgprogs">提供了哪些管理工具?

<sect1 id="dpkg">dpkg

<p>这个主要的软件包管理工具, 有很多参数, 常用的有:
<list>
  <item>参数查找:  <tt>dpkg --help</tt>.
  <item>输出指定软件包的控制文件(和其它信息): <tt>dpkg --info foo_VVV-RRR.deb</tt>
  <item>安装软件包(包括解包和配置): <tt>dpkg --install foo_VVV-RRR.deb</tt>.
  <item>解包(但不配置): <tt>dpkg --unpack foo_VVV-RRR.deb</tt>.  注意, 此操作解开的包处于不可用状态, 要正常运行, 一些文件还需要进一步配置. 这个命令会删除这个程序的已安装版本. 并运行相关联的 preinst 脚本(详见<ref id="maintscripts">).
  <item>配置一个解开的包:
    <tt>dpkg --configure foo</tt>.  这个操作会运行相关联的 postinst(详见<ref id="maintscripts">)脚本, 并升级 <tt>conffiles</tt> 中列举的文件. 注意,'配置'(configure)操作使用软件包名(如 foo), 而不是Debian文档文件名(如, foo_VVV-RRR.deb).
  <item>从 Debian 包中释放一个名为 "blurf" 文件(或一组名为 "blurf" 的文件):
    <tt>dpkg --fsys-tarfile foo_VVV-RRR.deb | tar -xf - blurf*</tt>
  <item>删除软件包(不包括它的配置文件):
    <tt>dpkg --remove foo</tt>.
  <item>删除软件包(包括它的配置文件):
    <tt>dpkg --purge foo</tt>.
  <item>列出包含 "foo*" 字符串的软件包的状态: <tt>dpkg --list 'foo*'</tt>.
</list>

<sect1 id="dselect">dselect

<p>Debian 包管理系统的菜单界面. 对第一次安装和大范围升级特别有用.

<p><prgn/dselect/ 可以:
<list>
  <item>引导用户选择安装或删除软件包时, 确保要安装的包不与其它包冲突, 使得每个(要安装的软件)包正常运行的所需的所有软件包都被安装.;
  <item>对用户所作选择的不一致和不兼容做出警告;
  <item>确定必须安装的软件包的安装顺序;
  <item>自动完成安装或删除; 并
  <item>引导用户完成每个软件包的配置\.
</list>

<p>进入 <prgn/dselect/ 时, 有七个菜单项, 每项完成特定的功能, 用户可以用上下键移动亮度条, 然后按 &lt;回车&gt; (<em>&lt;enter&gt;</em>) 键选择加亮显示的项.

<p>接下来的显示和用户的选择有关. 如果选的不是 <tt>Access</tt> 或 <tt>Select</tt>, <prgn/dselect/ 就会继续执行指定的动作: 如, 选 <tt>Remove</tt>, dselect就会删除用户在 <tt>Select</tt> 中的最后选择的所有软件包.

<p><tt>Access</tt> 和 <tt>Select</tt> 菜单项下有更多的菜单选项, 两种选择都会出现分屏, 上部给出选项的滚动列表, 部是对应选项的简要解释("info").

<p>任何时候都可按下 "?" 键, 都可呼出帮助信息, 使用在线帮助.

<p>通常按照第一个界面里菜单排列顺序操作来完成软件包安装, 但, 用户也可以根据自己的需要来做出选择(但这和用户的具体选择有关)..

<list>
  <item>通过选择一个 <strong/Access Method/ 开始. 这是指用户访问 Debian 软件包的方法; 如有些用户从 CD-ROM 上获取 Debian 软件包, 有些打算通过匿名 FTP 获取. <prgn/dselect/ 退出后所选的 "Access Method" 会被存储下来, 因此如不再调用这个选项, 访问方式不会改变.

  <item>接着 <strong/Update/  可用软件列表. <prgn/dselect/  读取位于 Debian 软件包存储目录的顶层的 "Packages.gz" 文件(如果不存在, <prgn/dselect/ 会试图生成一个).

  <item><strong/Select/ 欲安装的软件包, 选取此菜单项后, 首先显示的是满屏的帮助信息(除非使用了 `--expert' 命令行参数), 退出帮助, 就会出现选择软件包的分屏菜单..

    <p>相对较窄的上半屏是 &all-pkgs; 个 Debian 软件包的滚动列表; 下半屏是对应软件包或包组的描述T.

    <p>用高亮条来选定软件包名或者包组, 然后选择操作:
    <taglist>
      <tag>安装:
        <item>按下"+"键.
      <tag>删除:
        <item>有两种办法删除:
        <list>
          <item>删除: 删除软件包的大部分相关文件, 但是不包括配置文件(参阅 <ref id="conffile">)内列举的需要保护的文件和软件包的配置信息, 使用 '-' 键..
          <item>清除: 删除软件包的<em>所有</em>文件, 使用 '_' 键.
        </list>
          注意，不可能删除 "所有" 的软件包. 如果试图这样做, 系统就会回到最初的基本系统状态.
      <tag>锁定
        <item>使用 '=' 键, 告诉 <prgn/dselect/ 即使这个包即使不是最新版本也不要升级.
        <p>可以通过 `:' 键来取消锁定, 这是默认设置.
    </taglist>

    <p>可以使用不同的排序方式显示软件包列表, 使用 `o' 键在不同的排序方式间切换. 默认的排序方式是优先级排序, 同一优先级内, 按存储目录排序, 这种排序方式, 可能先显示 A 目录的软件包, 然后是B, 接着是低一个优先级的 A.

    <p>你也可以使用 `v' (verbose) 键来展开屏幕顶部标签的解释. 这样就可以在右边显示更多的内容, 通过左右箭头来进行左右移动.

    <p>如果选了安装或删除一个软件包, 如<package/foo.deb/, 这个软件包又依赖于(需要)另一个(软件)包, 如 <package/blurf.deb/,  <prgn/dselect/ 就会在下一屏显示出来, 可以对系统建议(安装或不安装)做出选择, 接受或拒绝. 按 Shift-D 键稍后操作, Shift-U 返回上一菜单. 任何时候都可以按 Shift-Q 保存选择,返回主菜单.

  <item>返回主菜单, 选择 "Install" 菜单进行对选择的软件包解包和配置. 或者选择 "Remove" 菜单来删除. 选择 "Quit" 退出 <prgn/dselect/, 所作选择会被 <prgn/dselect/ 保存下来.
</list>

<sect1 id="dpkg-deb">dpkg-deb

<p>用于 Debian 格式 (<tt>.deb</tt>) 文件的操作. 常见操作:
<list>
  <item>查看全部选项:  <tt>dpkg-deb --help</tt>.
  <item>查看 Debian 格式软件包内的文件:  <tt>dpkg-deb --contents foo_VVV-RRR.deb</tt>)
  <item>释放 Debian 格式软件包内的文件到指定目录:  <tt>dpkg-deb --extract foo_VVV-RRR.deb tmp</tt>
    释放 <tt>foo_VVV-RRR.deb</tt> 内的全部文件到 <tt>tmp/</tt> 目录. 这是不需要安装, 在本地目录测试(软件)包内容的简单方法.
</list>

<p>注意, 仅仅执行 <tt/dpkg-deb
--extract/ 并不能正确的安装软件包, 应该执行 <tt/dpkg --install/.

<p>详细参见手册 <manref name="dpkg-deb" section="1">.

<sect1 id="apt-get">apt-get

<p><prgn/apt-get/ 提供一个简单的命令行安装软件包的方法. 和 <prgn/dpkg/ 不同, <prgn/apt-get/ 不能识别 .deb 文件, 它使用软件包原来的名称通过 <file>/etc/apt/sources.list</file> 指定的安装源进行安装.

<p>更多信息, 安装 <package/apt/ 软件包参阅
<manref name="apt-get" section="8">, <manref name="sources.list" section="5">
和 <file>/usr/share/doc/apt/guide.html/index.html</file>.

<sect1 id="dpkg-split">dpkg-split

<p>这个程序用来将大软件包分割成小文件(如, 写到软盘上), 和将分割的文件合并. 这个程序只能在 Debian 系统上使用(或含 <package/dpkg/ 包的系统), 因为它需要调用 <tt>dpkg-deb</tt> 程序分析这个 Debian 包的组成.

<p>例如, 把一个大 .deb 分割成 N 部分,
<list>
  <item>执行命令 <tt>dpkg-split --split foo.deb</tt>.
    就会在当前目录出现分割出N个大小为 460KB 的文件.
  <item>把这 N 个文件考到软盘上.
  <item>把软盘上的内容考到其他机器上.
  <item>使用命令 <tt>dpkg-split --join "foo*"</tt> 合并.
</list>

<sect id="updaterunning">Debian 可以对一个运行中的程序进行升级, 如何做到的?

<p>&debian; 系统的内核支持运行中替换文件.

<p>我们另外提供可一个称作 <prgn/start-stop-daemon/ 的程序, 用于启动时驱动进程或内核运行级别发生变化时停掉进程(如, 由多用户到单用户模式或到关机模式). 包含某个进程的软件包安装时, 安装脚本停止和重起进程调用用的也是这个程序.

<sect id="whatpackages">我的 Debian 系统上装了哪些软件包?

<p>要查看 Debian 系统上安装的所有软件包的状态, 运行
  <example>dpkg --list</example>

输出每个软件包的一行简单介绍, 2字符的状态标志, 包名, 所<em>安装</em>版本, 和简要描述.

<p>查看以 "foo" 开头的软件包的状态, 执行:
  <example>dpkg --list 'foo*'</example>

<p>要得到某个软件包的更详细信息, 执行:
  <example>dpkg --status packagename</example>

<sect id="filesearch">如何找出一个文件的归属包?

<p>要查找出包含文件 <tt>foo</tt> 的软件包, 执行:

<list>
  <item><tt>dpkg --search filename</tt>
    <p>在已安装软件包中搜寻 <tt>filename</tt>.(等同于搜索 <tt>/var/lib/dpkg/info/</tt> 目录下扩展名为 <tt>.list</tt> 的文件, 并输出所有包含此文件的软件包名和版本号).

  <item><tt>zgrep foo Contents-ARCH.gz</tt>
    <p>通过绝对路径来搜寻含 <tt>foo</tt> 字符串的文件, <tt>Contents-ARCH.gz</tt> 文件(ARCH 指要查询的平台)在 Debian FTP 的主软件包目录(main, non-free, contrib)下, 一个 <tt>Contents</tt> 文件只包含同一目录下的软件包,因此用户查找含 <tt>foo</tt> 文件的软件包，需要搜寻多个 <tt>Contents</tt> 文件.

    <p>相对于 <tt>dpkg --search</tt> 这种方法的优点是，它不仅仅搜寻系统已安装软件包.
</list>
