[ 上一页 ] [ 目录 ] [ 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 这个帮助信息 -d 只下载——不安装或解压档案 -f 即便完整性检查失败了仍然继续 -s 不做什么。只是按顺序模拟 -y 对于所有问题都假定为Yes,不询问 -u 显示一系列已经将要更新的包
可以用一条命令安装多个软件包。包文件从网络上下载到本地 /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报告有些软件包 的更新被kept back,这表明这些软件包的更新版本因故无法安装,可能 的原因有关联不同步(当前没有供下载的新版本关联包)或关联扩展(需要安装新的 关联包以配合新版软件包)。
对于第一种原因没有很好的解决方法,对于第二次原因,运行apt-get intall安装所需的新关联包就可以。另一个更好的解决方法就是使用dist-upgrade。详情请参考升级到新版本, 第 3.5 节。
APT的绝活就是让你一次就完成整个系统的更新,不论是通过Internet还是通过光 盘文件(购买的碟片或下载的ISO镜像文件)。
它也可以用来更新那些关联关系发生改变的软件包。即如前所述的那些使用apt-get upgrade时被不被更新(kept back)的软件包。
例如,假设你目前使用的Debian为stable revision 0,而你购买了revision 3的 新版Debian,你可以使用APT从新光盘上升级你的系统。使用apt-cdrom(参考将CD-ROM加入source.list文件, 第 2.4 节)将光盘加载到/etc/apt/sources.list中,然后运行apt-get dist-upgrade。
请注意,APT总是搜索最新版本的软件包,因此,如果一个软件包在你的 /etc/apt/sources.list中所列的版本比光盘上所列的版本要新,那么 APT会下载其中的软件包而不是使用光盘上的软件包。
在更新软件包, 第 3.4 节节的例子中,我们看到有些包被kept back了,现 在我们就用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仍被 kept back,可能还存在一些比建立新关联更棘手的问题,我们通过如下 方法确定问题所在:
# 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,否则将无法安装(或更新)lilo。
想知道该保留或删除哪些软件包,你可以使用:
# 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仅删除那些过时的文件。参考 如何从Debian的专用版本下升级软件包, 第 3.9 节以了解apt-show-versions的更多详情。
dselect
工具帮助用户选取想要安装的Debian软件包。它有点复杂甚
至令人望而生厌,但经过实践你就能掌握它恐怖的终端界面。
dselect高级功能之一就是它知道利用Debian软件包的“推荐”和“建议”能力。(Debian软 件包有一种能力:推荐或建议系统在安装自己的同时,安装别的软件包以配合自身的 工作,当然这些推荐的软件包不一定是必须的;而dselect工具可以识别和利用这个能 力,使用dselect时你就能体会到。译者注)以root身份运行dselect,进入程 序后选择apt作为连接方式(access)。该步骤不是必须的,但如果你没有光驱而且想通 过Internet下载安装软件包,这是使用dselect的最好方法。
想深入学习dselect的用法,请到Debian网站查阅dselect文档页面http://www.debian.org/doc/ddp
.
在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]
我们看到在前例中许多软件包被安装是其它软件包“推荐”或“建议”的结果。另外一 些软件包被安装或删除(例如lbxproxy软件包)是我们通过dselect工具作出的决定。 由此可见dselect与APT结合起来将是一个功能强大的工具。
人们有时会对这种情况有兴趣——使用一个版本的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-get install package=version
例如,下面的命令将会安装2.2.4-1版的nautilus
软 件包:
# apt-get install nautilus=2.2.4-1
重要信息:最新版的Debian软件包首先会上传到“unstable”发布版中, 这个发布版包含了软件包所有更改阶段,无论是小修小补还是影响到众多软件包 乃至整个系统的重大修改。所以,新手和那些强调系统稳定性的用户不 会使用这个发布版。
“testing”发布版比起“unstable”发布版,多注重了些系统稳定性,但正式运行的 系统应当使用“stable”发布版。
apt-show-versions
提供了一个安全的途径,让那些使用混合系统的
用户放心升级他们的系统,不必担心升级会将原来属于stable的包升级成了unstable包。
例如,在安装了apt-show-versions
软件包之后,
使用这条命令将只升级你的unstable软件包:
# apt-get install `apt-show-versions -u -b | grep unstable | cut -d ' ' -f 1`
你可能会遇到这种情况,更改了某个软件包中的一些文件,但你没有时间或根本就 不想将这些更改引入到新版本中。或者,你将系统升级到3.0,但仍想继续使用Debian 2.2下的某个软件包。你可以“钉住”这个版本,这样它就不会被更新了。
操作起来十分简单,你只需编辑/etc/apt/preferences文件。 /etc/apt/preferences.
文件格式很简单:
Package: <package> Pin: <pin definition> Pin-Priority: <pin's priority>
每个条目都要以空白行与其它条目分割开。例如,我对sylpheed
软件包做了某些修改以使用“reply-to-list”功能,其版本为0.4.99。我想保留这
些修改不被更新,可加上:
Package: sylpheed Pin: version 0.4.99*
注意我用了一个*(星号)。这是一个“通配符”;它表明我希望“钉住”所有 以0.4.99打头的版本(以防它们被下载并安装到我机器上。pin控制的是服务器端的 更新软件包而非本地的已安装软件包。译者注)。因为Debian使用“Debian版本号” 为其软件包定版本,我不想进行所有这些版本的升级,如果不用通配符, 那么0.4.99-1版或0.4.99-10版只要一出炉系统就会安装它们。如果你修改了软件包, 你一定不希望这么做。
Pin的优先级帮助我们检查一个与“Packages:”和“Pin:”相符合的软件包是否应该被
安装。当优先级比较高时,符合的软件包将会被安装。你可以查阅apt_preferences(7)
,其中有关于优先级的详细讨论,但通过
一些简单的例子也可以了解基本的概念。下面就说明了在上面的sylpheed例子中设
定优先级域的效果。
Sylpheed 0.4.99永远不会被apt替换。如果可能,apt甚至会用0.4.99版替换已经 安装的更高的版本呢。只有那些优先级比1000大的软件包才会降级。
除了不会将高版本降级以外,与1001的效果相同。
版本0.4.99只会被首选发布系列中高版本的的软件包替换,首选发行版由变量 “APT::Default-Release”定义(参考如何保持一个混合系统, 第 3.8 节。
任何发布系列中比0.4.99版本高的sylpheed都会被安装,但相对于低版本而言,仍然 建议使用0.4.99。
任何发布系列中高版本的sylpheed都会被安装;因此只有没有其它版本可以安装时 才会安装0.4.99。已安装包的优先级。
负的优先级也是允许的,它会组织0.4.99版被安装。
钉子也可以用来指定软件包的version、release或 origin。
我们已经看到,钉在一个version上,可以使用具体的版本号,也可以使 用通配符一次指定多个版本。
release选项依赖于APT仓库上的或者CD中的Release文件。如果你使用的 APT仓库并没有提供这个文件,这个选项就没有任何用处了。你可以在 /var/lib/apt/lists/中看到Release文件的内容。release的参数是: a(存档)、c(部件)、v(版本)、o(起源) 和l(标签)。
例如:
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 (Obsolete Documentation)
1.8.10.4 - 2005年3月kov@debian.org
iamlyoo@163.com