[ 上一篇 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 下一篇 ]
软件包管理系统使用一个私有数据库来跟踪哪些软件包已安装、哪些未安装以及哪些可供安装。apt-get
程序使用此数据库来查找如何安装用户请求的软件包,并找出所选软件包正常工作所需的其他软件包。
要更新此列表,您可以使用命令 apt-get update
。此命令在 /etc/apt/sources.list 中找到的归档文件中查找软件包列表;有关此文件的更多信息,请参见 /etc/apt/sources.list 文件,第 2.1 节。
定期运行此命令是一个好主意,以便使您自己和您的系统了解可能的软件包更新,特别是安全更新。
终于到了大家期待已久的过程!在您的 sources.list 准备就绪且可用软件包列表为最新之后,您只需运行 apt-get 即可安装您想要的软件包。例如,您可以运行
# apt-get install xchat
APT 将在其数据库中搜索此软件包的最新版本,并将从 sources.list 中指定的相应归档文件中检索它。如果此软件包依赖于另一个软件包(此处的情况就是如此),APT 将检查依赖项并安装所需的软件包。请看这个例子
# apt-get install nautilus Reading Package Lists... Done Building Dependency Tree... Done The following extra packages will be installed: bonobo libmedusa0 libnautilus0 The following NEW packages will be installed: bonobo libmedusa0 libnautilus0 nautilus 0 packages upgraded, 4 newly installed, 0 to remove and 1 not upgraded. Need to get 8329kB of archives. After unpacking 17.2MB will be used. Do you want to continue? [Y/n]
软件包 nautilus
依赖于引用的共享库,因此 APT 将从归档文件中获取它们。如果您在 apt-get 命令行中指定了这些库的名称,则 APT 不会询问您是否要继续;它会自动接受您想要安装所有这些软件包。
这意味着 APT 仅在需要安装命令行中未指定的软件包时才请求确认。
以下 apt-get 的选项可能很有用
-h This help text. -d Download only - do NOT install or unpack archives -f Attempt to continue if the integrity check fails -s No-act. Perform ordering simulation -y Assume Yes to all queries and do not prompt -u Show a list of upgraded packages as well
可以在一行中选择多个软件包进行安装。从网络下载的文件放置在目录 /var/cache/apt/archives 中以供稍后安装。
您也可以在同一命令行中指定要删除的软件包。只需在要删除的软件包名称后立即添加一个 '-',就像这样
# apt-get install nautilus gnome-panel- Reading Package Lists... Done Building Dependency Tree... Done The following extra packages will be installed: bonobo libmedusa0 libnautilus0 The following packages will be REMOVED: gnome-applets gnome-panel gnome-panel-data gnome-session The following NEW packages will be installed: bonobo libmedusa0 libnautilus0 nautilus 0 packages upgraded, 4 newly installed, 4 to remove and 1 not upgraded. Need to get 8329kB of archives. After unpacking 2594kB will be used. Do you want to continue? [Y/n]
有关软件包删除的更多详细信息,请参见 删除软件包,第 3.3 节。
如果您以某种方式损坏了已安装的软件包,或者只是希望使用可用的最新版本重新安装软件包的文件,则可以使用 --reinstall 选项,如下所示
# apt-get --reinstall install gdm Reading Package Lists... Done Building Dependency Tree... Done 0 packages upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 1 not upgraded. Need to get 0B/182kB of archives. After unpacking 0B will be used. Do you want to continue? [Y/n]
如果您不再想使用某个软件包,可以使用 APT 从系统中删除它。为此,只需键入:apt-get remove package。例如
# apt-get remove gnome-panel Reading Package Lists... Done Building Dependency Tree... Done The following packages will be REMOVED: gnome-applets gnome-panel gnome-panel-data gnome-session 0 packages upgraded, 0 newly installed, 4 to remove and 1 not upgraded. Need to get 0B of archives. After unpacking 14.6MB will be freed. Do you want to continue? [Y/n]
正如您在上面的示例中看到的,APT 还会负责删除依赖于您请求删除的软件包的软件包。无法使用 APT 删除软件包而不删除依赖于它的那些软件包。
如上所述运行 apt-get
将导致软件包被删除,但它们的配置文件(如果有)将保留在系统上。要完全删除软件包,请运行
# apt-get --purge remove gnome-panel Reading Package Lists... Done Building Dependency Tree... Done The following packages will be REMOVED: gnome-applets* gnome-panel* gnome-panel-data* gnome-session* 0 packages upgraded, 0 newly installed, 4 to remove and 1 not upgraded. Need to get 0B of archives. After unpacking 14.6MB will be freed. Do you want to continue? [Y/n]
请注意名称后的 '*'。这表示还将删除每个软件包的配置文件。
就像 install 方法一样,您可以使用符号与 remove 一起使用,以反转特定软件包的含义。在删除的情况下,如果您在软件包名称后添加 '+',则将安装该软件包而不是被删除。
# apt-get --purge remove gnome-panel nautilus+ Reading Package Lists... Done Building Dependency Tree... Done The following extra packages will be installed: bonobo libmedusa0 libnautilus0 nautilus The following packages will be REMOVED: gnome-applets* gnome-panel* gnome-panel-data* gnome-session* The following NEW packages will be installed: bonobo libmedusa0 libnautilus0 nautilus 0 packages upgraded, 4 newly installed, 4 to remove and 1 not upgraded. Need to get 8329kB of archives. After unpacking 2594kB will be used. Do you want to continue? [Y/n]
请注意,apt-get
列出了将要安装的额外软件包(即,为请求安装的软件包正常运行而需要安装的软件包)、将要删除的软件包以及将要安装的软件包(再次包括额外软件包)。
软件包升级是 APT 系统的一大成功之处。只需一个命令即可实现:apt-get upgrade。您可以使用此命令来升级同一发行版中的软件包,以及升级到新的发行版,尽管对于后者,首选命令是 apt-get dist-upgrade;有关更多详细信息,请参见 升级到新版本,第 3.5 节。
使用 -u 选项运行此命令非常有用。此选项使 APT 显示将要升级的软件包的完整列表。如果没有它,您将盲目升级。APT 将下载每个软件包的最新版本,并将按正确的顺序安装它们。务必始终在尝试此操作之前运行 apt-get update。请参见 更新可用软件包列表,第 3.1 节。看看这个例子
# apt-get -u upgrade Reading Package Lists... Done Building Dependency Tree... Done The following packages have been kept back cpp gcc lilo The following packages will be upgraded adduser ae apt autoconf debhelper dpkg-dev esound esound-common ftp indent ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0 libesd0-dev libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev liborbit0 libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit procps psmisc 29 packages upgraded, 0 newly installed, 0 to remove and 3 not upgraded. Need to get 5055B/5055kB of archives. After unpacking 1161kB will be used. Do you want to continue? [Y/n]
过程非常简单。请注意,在最前面的几行中,apt-get 说某些软件包被 保留。这意味着这些软件包有新版本,但由于某些原因不会安装。可能的原因是依赖关系中断(它所依赖的软件包没有可供下载的版本)或新的依赖关系(自上次版本以来,该软件包已开始依赖于新的软件包)。
对于第一种情况,没有干净的解决方案。对于第二种情况,只需对有问题的特定软件包运行 apt-get install 即可,因为这将下载依赖项。更干净的解决方案是使用 dist-upgrade。请参见 升级到新版本,第 3.5 节。
APT 的此功能允许您一次升级整个 Debian 系统,可以通过 Internet 或从新 CD(购买或下载为 ISO 映像)。
当已安装软件包之间的关系发生更改时,也会使用它。使用 apt-get upgrade,这些软件包将保持不变(保留)。
例如,假设您正在使用 Debian 稳定版本的修订版 0,并且您购买了一张包含修订版 3 的 CD。您可以使用 APT 从这张新 CD 升级您的系统。为此,请使用 apt-cdrom
(请参见 将 CD-ROM 添加到 sources.list 文件,第 2.4 节)将 CD 添加到您的 /etc/apt/sources.list,然后运行 apt-get dist-upgrade。
重要的是要注意,APT 始终查找软件包的最新版本。因此,如果您的 /etc/apt/sources.list 列出了一个归档文件,其中软件包的版本比 CD 上的版本更新,则 APT 将从那里下载该软件包。
在 升级软件包,第 3.4 节 中显示的示例中,我们看到某些软件包被 保留。现在我们将使用 dist-upgrade 方法解决此问题
# apt-get -u dist-upgrade Reading Package Lists... Done Building Dependency Tree... Done Calculating Upgrade... Done The following NEW packages will be installed: cpp-2.95 cron exim gcc-2.95 libident libopenldap-runtime libopenldap1 libpcre2 logrotate mailx The following packages have been kept back lilo The following packages will be upgraded adduser ae apt autoconf cpp debhelper dpkg-dev esound esound-common ftp gcc indent ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0 libesd0-dev libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev liborbit0 libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit procps psmisc 31 packages upgraded, 10 newly installed, 0 to remove and 1 not upgraded. Need to get 0B/7098kB of archives. After unpacking 3118kB will be used. Do you want to continue? [Y/n]
现在请注意,软件包将被升级,并且还将安装新的软件包(软件包的新依赖项)。还要注意,lilo 仍然被 保留。它可能存在比新依赖关系更严重的问题。我们可以通过运行以下命令来找出原因
# apt-get -u install lilo Reading Package Lists... Done Building Dependency Tree... Done The following extra packages will be installed: cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2 logrotate mailx The following packages will be REMOVED: debconf-tiny The following NEW packages will be installed: cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2 logrotate mailx The following packages will be upgraded lilo 1 packages upgraded, 9 newly installed, 1 to remove and 31 not upgraded. Need to get 225kB/1179kB of archives. After unpacking 2659kB will be used. Do you want to continue? [Y/n]
如上所述,lilo 与软件包 debconf-tiny
存在新的冲突,这意味着如果不删除 debconf-tiny,则无法安装(或升级)它。
要了解是什么导致软件包被保留或删除,您可以使用
# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade Reading Package Lists... Done Building Dependency Tree... Done Calculating Upgrade... Starting Starting 2 Investigating python1.5 Package python1.5 has broken dep on python1.5-base Considering python1.5-base 0 as a solution to python1.5 0 Holding Back python1.5 rather than change python1.5-base Investigating python1.5-dev Package python1.5-dev has broken dep on python1.5 Considering python1.5 0 as a solution to python1.5-dev 0 Holding Back python1.5-dev rather than change python1.5 Try to Re-Instate python1.5-dev Done Done The following packages have been kept back gs python1.5-dev 0 packages upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
这样,很容易注意到 python1.5-dev 软件包由于未满足的依赖关系:python1.5 而无法安装。
当您安装软件包时,APT 会从 /etc/apt/sources.list 中列出的主机检索所需的文件,将它们存储在本地存储库 (/var/cache/apt/archives/
) 中,然后继续安装,请参见 安装软件包,第 3.2 节。
随着时间的推移,本地存储库可能会增长并占用大量磁盘空间。幸运的是,APT 提供了用于管理其本地存储库的工具:apt-get
的 clean 和 autoclean 方法。
apt-get clean
从 /var/cache/apt/archives/
和 /var/cache/apt/archives/partial/
中删除除锁定文件之外的所有内容。因此,如果您需要重新安装软件包,APT 应该再次检索它。
apt-get autoclean
仅删除无法再下载的软件包文件。
以下示例显示了 apt-get autoclean 的工作原理
# ls /var/cache/apt/archives/logrotate* /var/cache/apt/archives/gpm* logrotate_3.5.9-7_i386.deb logrotate_3.5.9-8_i386.deb gpm_1.19.6-11_i386.deb
/var/cache/apt/archives 中有两个软件包 logrotate
的文件和一个软件包 gpm
的文件。
# apt-show-versions -p logrotate logrotate/stable uptodate 3.5.9-8 # apt-show-versions -p gpm gpm/stable upgradeable from 1.19.6-11 to 1.19.6-12
apt-show-versions
显示 logrotate_3.5.9-8_i386.deb
提供了 logrotate
的最新版本,因此 logrotate_3.5.9-7_i386.deb
是无用的。同样,gpm_1.19.6-11_i386.deb
也是无用的,因为可以检索到软件包的更新版本。
# apt-get autoclean Reading Package Lists... Done Building Dependency Tree... Done Del gpm 1.19.6-11 [145kB] Del logrotate 3.5.9-7 [26.5kB]
最后,apt-get autoclean 仅删除旧文件。有关 apt-show-versions 的更多信息,请参见 如何从特定版本的 Debian 升级软件包,第 3.9 节。
dselect
是一个帮助用户选择要安装的 Debian 软件包的程序。它被认为有点复杂且相当乏味,但通过练习,您可以掌握其基于控制台的 ncurses 界面。
dselect 的一个功能是它知道如何利用 Debian 软件包的“推荐”和“建议”安装其他软件包的能力。要使用该程序,请以 root 身份运行 `dselect'。选择 'apt' 作为您的访问方法。这不是真正必要的,但如果您没有使用 CD-ROM 并且想要从 Internet 下载软件包,这是使用 dselect 的最佳方式。
要更好地理解 dselect 的用法,请阅读 Debian 页面 http://www.debian.org/doc/ddp
上的 dselect 文档。
在使用 dselect 进行选择后,请使用
# apt-get -u dselect-upgrade
如下例所示
# apt-get -u dselect-upgrade Reading Package Lists... Done Building Dependency Tree... Done The following packages will be REMOVED: lbxproxy The following NEW packages will be installed: bonobo console-tools-libs cpp-3.0 enscript expat fingerd gcc-3.0 gcc-3.0-base icepref klogd libdigest-md5-perl libfnlib0 libft-perl libgc5-dev libgcc300 libhtml-clean-perl libltdl0-dev libsasl-modules libstdc++3.0 metamail nethack proftpd-doc psfontmgr python-newt talk tidy util-linux-locales vacation xbill xplanet-images The following packages will be upgraded debian-policy 1 packages upgraded, 30 newly installed, 1 to remove and 0 not upgraded. Need to get 7140kB of archives. After unpacking 16.3MB will be used. Do you want to continue? [Y/n]
与我们在同一系统上运行 apt-get dist-upgrade 时看到的情况进行比较
# apt-get -u dist-upgrade Reading Package Lists... Done Building Dependency Tree... Done Calculating Upgrade... Done The following packages will be upgraded debian-policy 1 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 421kB of archives. After unpacking 25.6kB will be freed. Do you want to continue? [Y/n]
请注意,上面许多软件包正在被安装,因为其他软件包“建议”或“推荐”了它们。其他软件包正在根据我们在浏览 dselect 的软件包列表时所做的选择进行安装或删除(例如 lbxproxy 的情况)。当与 APT 结合使用时,Dselect 可能是一个强大的工具。
人们有时对使用 Debian 的某个版本作为其主要系统发行版,以及来自另一个分支的一个或多个软件包感兴趣。
要设置您的 Debian 主要版本,您应该编辑 /etc/apt/apt.conf
(通常不存在,如果您没有,请创建它)以包含以下行
APT::Default-Release "version";
其中 version 是您要用作主要发行版的 Debian 版本。您可以使用的版本是 stable、testing 和 unstable。要从另一个版本安装软件包,那么,您必须按以下方式使用 APT
# apt-get -t distribution install package
为了使其工作,您需要在您的 /etc/apt/sources.list
中至少有一行 APT 源,用于您想要从中获取软件包的发行版,并且该软件包必须存在于该源上。
您还可以使用以下语法请求软件包的特定版本
# apt-get install package=version
例如,下面的行将安装软件包 nautilus
的版本 2.2.4-1。
# apt-get install nautilus=2.2.4-1
重要提示:Debian 的“unstable”版本是 Debian 软件包的最新版本首先上传到的版本。此发行版经历了软件包的所有更改,包括小的更改和影响许多软件包或整个系统的更剧烈的更改。因此,经验不足的用户或需要经过验证的稳定性的用户不应使用此版本的发行版。
“testing”发行版不一定比“unstable”更好,因为它没有快速接收安全更新。对于服务器和其他生产系统,应始终使用 stable。
apt-show-versions
为混合发行版的用户提供了一种安全的方式来升级他们的系统,而不会获得比他们预期更多的不太稳定的发行版。例如,通过在安装 apt-show-versions
软件包后运行以下命令,可以仅升级您的 unstable 软件包
# apt-get install `apt-show-versions -u -b | grep unstable | cut -d ' ' -f 1`
您可能有时需要修改软件包中的某些内容,并且没有时间或不想将这些更改移植到程序的新版本。或者,例如,您可能刚刚将 Debian 发行版升级到 3.0,但希望继续使用 Debian 2.2 中某个软件包的版本。您可以“锁定”您已安装的版本,以便它不会被升级。
使用此资源很简单。您只需要编辑文件 /etc/apt/preferences。
格式很简单
Package: <package> Pin: <pin definition> Pin-Priority: <pin's priority>
每个条目必须与其他任何条目用空行分隔。例如,为了保留我修改过的软件包 sylpheed
以在版本 0.4.99 上使用“reply-to-list”,我添加
Package: sylpheed Pin: version 0.4.99*
请注意,我使用了 * (星号)。这是一个“通配符”;它表示我希望此“锁定”对于所有以 0.4.99 开头的版本都有效。这是因为 Debian 使用“Debian 修订版”对其软件包进行版本控制,并且我不希望避免安装这些修订版。因此,例如,版本 0.4.99-1 和 0.4.99-10 将在可用后立即安装。请注意,如果您修改了软件包,您将不想以这种方式进行操作。
锁定优先级有助于确定是否将安装与“Packages:”和“Pin:”行匹配的软件包,优先级越高,匹配的软件包越有可能被安装。您可以阅读 apt_preferences(7)
以全面讨论优先级,但一些示例应该给出基本概念。以下描述了在上面的 sylpheed 示例中将优先级字段设置为不同值的影响。
Sylpheed 版本 0.4.99 永远不会被 apt 替换。如果可用,apt 将安装版本 0.4.99,即使它会替换已安装的更高版本的软件包。只有优先级大于 1000 的软件包才会降级现有软件包。
效果与优先级 1001 相同,只是 apt 将拒绝将已安装的版本降级到 0.4.99
版本 0.4.99 仅会被从使用“APT::Default-Release”变量(请参见上面的 如何保持混合系统,第 3.8 节)指定为首选的发行版中提供的更高版本替换。
从任何发行版提供的任何高于 0.4.99 的 sylpheed 版本都将优先于版本 0.4.99,但 0.4.99 仍然优先于较低版本。
从任何发行版提供的 sylpheed 的更高版本将优先于版本 0.4.99,任何已安装的更高版本的 slypheed 也是如此;因此,只有在尚未安装任何版本的情况下,才会安装 0.4.99。这是已安装软件包的优先级。
也允许负优先级,并阻止永远安装 0.4.99。
可以在软件包的 version、release 或 origin 上指定锁定。
正如我们所见,锁定 version 支持文字版本号以及通配符,以便一次指定多个版本。
选项 release 取决于 APT 存储库或 CD 中的 Release 文件。如果您使用的是不提供此文件的软件包存储库,则此选项可能根本无用。您可以在 /var/lib/apt/lists/ 上查看您拥有的 Release 文件的内容。release 的参数是:a (archive)、c (components)、v (version)、o (origin) 和 l (label)。
一个例子
Package: * Pin: release v=2.2*,a=stable,c=main,o=Debian,l=Debian Pin-Priority: 1001
在此示例中,我们选择了 Debian 的 2.2* 版本(可以是 2.2r2、2.2r3 -- 这适用于通常包含安全修复程序和其他非常重要的更新的“点发布”),stable 存储库,main 部分(与 contrib 或 non-free 相对)以及来源和标签 Debian。Origin (o=) 定义了谁生成了该 Release 文件,label (l=) 定义了发行版的名称:Debian 对于 Debian 本身,Progeny 对于 Progeny,例如。一个示例 Release 文件
$ cat /var/lib/apt/lists/ftp.debian.org.br_debian_dists_potato_main_binary-i386_Release Archive: stable Version: 2.2r3 Component: main Origin: Debian Label: Debian Architecture: i386
[ 上一篇 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 下一篇 ]
APT HOWTO (过时文档)
1.8.11 - 2005 年 8 月kov@debian.org