分享
 
 
 

Debian APT HOWTO

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

APT HOWTO

第一章 导言

最初只有.tar.gz的打包文件,用户必须编译每个他想在GNU/Linux上运行的软件。用户们普遍认为系统很有必要提供一种方法来管理这些安装在机器上的软件包,当Debian诞生时,这样一个管理工具也就应运而生,它被命名为dpkg。从而著名的“package”概念第一次出现在GNU/Linux系统中,稍后RedHat才决定开发自己的“rpm”包管理系统。

很快一个新的问题难倒了GNU/Linux制作者,他们需要一个快速、实用、高效的方法来安装软件包,当软件包更新时,这个工具应该能自动管理关联文件和维护已有配置文件,再次,Debian率先解决了这个难题,APT(Advanced Packaging Tool)诞生了。APT后来还被Conectiva改造用来管理rpm,并被其它Linux发行版本采用为它们的软件包管理工具。

本文档不打算讲解apt-rpm相关知识,因为Conectiva port of APT已很有名了,不过提供有关这部分的补充文档还是欢迎的。

本文档是基于Debian下一个发行版的,长官。

第二章 基础设置

2.1 /etc/apt/sources.list文件

=============================

作为操作的一部分,APT使用一个文件列出可获得软件包的镜像站点地址,这个文件就是/etc/apt/sources.list。

文件中的各项信息通常按如下格式列出:

deb http://site.http.org/debian distribution section1 section2 section3

deb-src http://site.http.org/debian distribution section1 section2 section3

当然,上面所列的地址项都是假设的不可用的。每行的第一个单词deb或deb-src,描述了文件类型,目录中包含的是二进制软件包(deb),即我们通常使用的已编译好的软件包;或包含的是源码包(deb-src),源码包包含源程序编码、Debian管理文件(.dsc)和“Debian化”该程序所做更改的记录文件diff.gz。

通常可以看出如下Debian默认的sources.list:

# See sources.list(5) for more information, especialy

# Remember that you can only use http, ftp or file URIs

# CDROMs are managed through the apt-cdrom tool.

deb http://http.us.debian.org/debian stable main contrib non-free

deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free

deb http://security.debian.org stable/updates main contrib non-free

# Uncomment if you want the apt-get source function to work

#deb-src http://http.us.debian.org/debian stable main contrib non-free

#deb-src http://non-us.debian.org/debian-non-US stable non-US

这些是Debian基本安装所需的软件包来源地址,第一个deb行指向官方正式软件包来源,第二个deb行指向non-US软件包来源,第三deb行指向Debian安全补丁更新包来源。

最后两行被注释掉了(在句首加#),所以apt-get将忽略它们。这些是deb-src行指向Debian源码包来源,如果你常下载程序源码来测试或重编译,可取消对它们的注释。

/etc/apt/sources.list文件可包含多种类型的地址,APT知道如何处理这些不同的地址类型:http,ftp,file(本地文件,例如:一个加载了ISO9600文件系统的目录)和ssh。

别忘了在修改完/etc/apt/sources.list文件后运行apt-get使更改生效。你必须完成这个步骤,以便让APT从你指定的地方获得新的软件包列表。

2.2 如何在本地使用APT

=====================

有时你硬盘上有许多软件包,你会希望通过APT来安装它们,以便让它去处理软件包间复杂的依赖关系。

想这么做,就建一个目录,将所有你想要安装的.deb文件放入其中。例如:

mkdir /root/debs

你可以使用一个重载文件(override file)直接去修改软件包中管理文件中的定义(definitions),使之符合你的软件储藏库管理规则,在这个重载文件中,你可能希望定义一些选项来重载那些软件包的定义,如下所示:

package priority section

package是软件包的名称,priority有三个级别low,medium或high,section是软件包所属的section,重载文件可任意命名,文件名将在接下来的步骤中做为参数传递给dpkg-scanpackages。如果你不想写重载文件,只需在调用dpkg-scanpackages时使用/dev/null就行了。

仍是在/root目录下执行:

dpkg-scanpackages debs file | gzip > debs/Packages.gz

在上述的命令行中,file为重载文件,命令生成一个Packages.gz文件,它包含了APT所需的各种软件包信息,要使用这些软件包,在sources.list中加上:

deb file:/root debs/

完成了上面的工作,就可以通常那样使用APT命令操作这些软件包了。你可以使用同样的方法生成一个源码库,但请记住你需要将.orig.tar.gz文件、.dsc文件和.diff.gz文件包含在目录中,要生成Source.gz文件而不是Packages.gz文件。所使用的命令也不相同,要使用dpkg-scansources,命令如下所示:

dpkg-scansources debs | gzip > debs/Sources.gz

注意dpkg-scansource不需要重载文件,在sources.list中的引用法是:

deb-src file:/root debs/

2.3 选择最佳镜像发布站点加入source.list文件:netselect,netselect-apt

=====================================================================

一个新用户经常问到的问题:“该将哪个Debian镜像发布站点加入source.list文件?”。有很多方法来选择镜像发布站点,专家们可能会写一个脚本去测试不同站点的ping time,不过有一个现成的程序可以帮你:netselect。

安装netselect

apt-get install netselect

不带参数运行它时会显示它的帮助信息。运行它时加上以空格分隔的镜像主机列表,它会返回一个分值和列表中的一个主机名。这个分值通过评估ping time和hops number(一个网络请求报文到达目标主机所经过的转发主机的个数)得出,它与镜像站点预计下载速度成反比(数值越小越好)。返回的主机名是主机列表中得分最低的那个(查看列表中所以主机的得分情况可使用-vv选项)。看出下的例子:

bash $ netselect ftp.debian.org http.us.debian.org ftp.at.debian.org download.unesp.br ftp.debian.org.br

365 ftp.debian.org.br

bash $

它表示,在netselect后列出的所有主机中,ftp.debian.org.br是下载速度最快的主机,其得分为365。(注意!!这是在我电脑上的测试结果,不同的网络节点网速会大不相同,所以这个分值不一定适用于其它电脑)

现在将netselect找到的连接速度最快的镜像站点加入/etc/apt/sources.list文件(see The /etc/apt/sources.list file, Section 2.1)and follow the tips in Managing packages, Chapter 3.

注意:镜像站点列表通常包含在文件http://www.debian.org/mirror/mirrors_full。

从0.3版开始,netselect软件包包含了netselect-apt脚本,它使上述操作自动完成。只需将发布目录树做为参数(默认为stable)输入,sources.list文件就会生成速度最快的main和non-US镜像站点列表,并保存在当前目录下。下面的例子生成一个包含stable发布镜像站点列表的sources.list

bash $ ls sources.list

ls: sources.list: File or directory not found

bash $ netselect-apt stable

(...)

bash $ ls -l sources.list

sources.list

bash $

记住:sources.list生成在当前目录下,必须将其移至/etc/apt目录。

Then, follow the tips in Managing packages, Chapter 3.

2.4 将CD-ROM加入source.list文件

===============================

如果你用APT从CD-ROM上安装及升级软件包,你可以将它加入到sources.list文件中。完成该操作,可使用apt-cdrom程序:

apt-cdrom add

将Debian光盘放入光驱,它将加载光盘目录,并在光盘上查找软件包信息。如果你的光驱需要额外设置,可使用以下选项:

-h - program help

-d directory - CD-ROM mount point

-r - Rename a recognized CD-ROM

-m - No mounting

-f - Fast mode, don't check package files

-a - Thorough scan mode

例如:

apt-cdrom -d /home/kov/mycdrom add

你还可以扫描一张光盘,但不将其加入列表:

apt-cdrom ident

注意,只有当你在系统的/etc/fstab中正确设置了光驱后,该程序才会工作。

第三章 软件包管理

3.1 更新可用软件包列表

======================

软件包管理系统使用一个私有数据库跟踪列表中软件包的当前状态:已安装、未安装或可安装。apt-get通过该数据库来确定如何安装用户想用的软件包以及正常运行软件包所必须的其它关联包。

你可以使用apt-get update来更新数据库列表。这个命令将扫描/etc/apt/sources.list文件中所指路径中的软件包列表文件。有关该列表文件的更多信息请查阅 第二章 /etc/apt/source.list文件。

定时运行这个程序是个好主意,它将使你和你的系统获得最新的软件包更新和安全更新等信息。

3.2 安装软件包

==============

现在,终于到了你一直期待的阶段!准备好了sources.list和最新版的的可用软件包,你所需做的就是运行apt-get来安装你渴望已久的软件了。例如,你可以这样:

apt-get install xchat

APT会扫描它的数据库找到最新的版本的软件包,并将它从sources.list中所指的地方下载到本地。如果该软件包需要其它软件包才能正常运行——如本例一样——APT会做关联性检查并自动安装所关联软件包。如下所示:

[root]@[/] # 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目录,稍后再安装。

你可以用同样的命令行删除指定软件包,只需在软件包名称后紧跟一个“-”,如下所示:

[root]@[/] # 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选项:

[root]@[/] # 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版本为0.5.3,这个版本还属于“unstable”(sid)阶段。如是你安装了这个版本,你可以在系统配置中使用新增的功能:你可以用apt-get install package/distribution来安装指定发布版中的软件包,或者用apt-get install package=version,如下所示:

apt-get install nautilus/unstable

它将为你安装“unstable”发布版中的nautilus软件包,即使你当前运行的是“stable”版本。命令中“distribution”选项的可用参数值为:stable,testing,unstable。

在处理关联问题时,你可能更乐意使用-t开关来选择目标发布版,让apt-get帮你考虑使用哪个发布版。

重要信息:最新版的Debian软件包首先会上传到“unstable”发布版中,这个发布版包含了软件包所有更改阶段,无论是小修小补还是影响到众多软件包乃至整个系统的重大修改。所以,新手和那些强调系统稳定性的用户不会使用这个发布版。

“testing”发布版比起“unstable”发布版,多注重了些系统稳定性,但正式运行的系统应当使用“stable”发布版。

3.3 移除软件包

==============

如果你不再使用某些软件包,你可以用APT将其从系统中删除。要删除软件包只需输入:apt-get remove package。如下所示:

[root]@[/] # 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会删除指定软件包以及与之有依赖关系的软件包,但它们的配置文件,如果有的话,会完好无损地保留在系统里。如果想彻底删除这些包及其配置文件,运行:

[root]@[/] # 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]

注意:软件包名字后面的*表示该软件包所有的配置文件也将被删除。

就象安装软件时一样,你可以在删除命令中用一个符号来指定安装某个软件包。在删除软件包时,如果你在软件包名字后面紧跟一个“+”,那么该软件包就会被安装而不是删除。

[root]@[/] # 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列出了那些将要被安装的关联软件包(即保证该软件包正常运行的其它软件包)和将要被删除关联软件包,然后,再次列出了将要被安装的软件包。

3.4 更新软件包

==============

软件包更新是APT最成功的特点。只需一条命令即可完成更新:apt-get upgrade。你可以使用这条命令从相同版本号的发布版中更新软件包,也可以从新版本号的发布版中更新软件包,尽管实现后一种更新的首选命令为apt-get dist-upgrade;实情参阅 3.5升级到新版本。

在运行该命令时加上-u选项很有用。这个选项让APT显示完整的可更新软件包列表。不加这个选项,你就只能盲目地更新。APT会下载每个软件包的最新更新版本,然后以合理的次序安装它们。注意在运行该命令前应先运行apt-get update更新数据库。有关详情参阅 3.1更新可用软件包列表。看看这个例子:

[root]@[/] # 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升级到新版本。

3.5 升级到新版本

================

APT的绝活就是让你一次就完成整个系统的更新,不论是通过Internet还是通过光盘文件(购买的碟片或下载的ISO镜像文件)。

它也可以用来更新寻些改变了关联关系的软件包。即如前所述的那些使用apt-get upgrade时被阻止更新(kept back)的软件包。

例如,假设你目前使用的Debian为stable revision 0(如woody 3.0 r0,译者注),而你购买了revision 3的新版Debian(如woody 3.0 r3,译者注),你可以使用APT从新光盘上升级你的系统。使用apt-cdrom(参阅 2.4将CD-ROM加入source.list文件)将光盘加载到/etc/apt/sources.list中,然后运行apt-get dist-upgrade。

请注意,APT总是搜索最新版本的软件包,因此,如果一个软件包在你的/etc/apt/sources.list中所列的版本比光盘上所列的版本要新,那么APT会按照sources.list文件所指的地址下载这个软件包而不是使用光盘上的软件包。

在 3.4更新软件包 中我们举了个例子,我们看到有些包被阻止更新(kept back),现在我们就用dist-upgrade方法来解决这个问题:

[root]@[/] # 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仍被阻止更新,可能还存在一些比建立新关联更棘手的问题,我们通过如下方法确定问题所在:

[root]@[/] # 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的关联要求。

3.6 移除无用软件包文件:apt-get clean and autoclean

===================================================

当你需要安装某个软件包时,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仅删除那些过时的文件。参阅 3.9如何从Debian的专用版本下升级软件包 获得更多apt-show-versions相关信息。

3.7 在dselect中操作APT

======================

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

如下例所示:

[root]@[/] # 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时的情形:

[root]@[/] # 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结合起来将是一个功能强大的工具。

3.8 如何构建一个混合系统

========================

人们常使用testing发布版,因为它比unstable要稳定同时又比stable时髦。然而对于那些想运行某些软件包的最新版本,又不希望将整个系统迁移到unstable发布版的还有一种选择:运行一个testing/unstable混合系统。对另一部分保守的用户而言,他们可能希望运行stable/testing混合系统。

要实现混合系统,请在/etc/apt/apt.conf中加入下面的语句:

APT::Default-Release "testing";

以后,在从unstable发布版安装软件包时,使用-t开关:

# apt-get -t unstable install packagename

别忘了,使用Debian的某个发布版的软件包时,要将镜像源加入到/etc/apt/sources.list文件中。在这个例子中,除了加入testing发布版镜像源处,我们还需要加入unstable发布版镜像源。

3.9 如何从Debian的专用版本下升级软件包

======================================

apt-show-versions提供了一个安全的途径,让那些使用混合系统的用户放心升级他们的系统,不必担心升级会将原来属于stable的包升级成了unstable包。例如,这条命令将只升级你的unstable软件包:

# apt-get install `apt-show-versions -u -b | grep unstable`

3.10 如何维护已安装软件包的多个版本(复杂)

==========================================

你可能会遇到这种情况,更改了某个软件包中的一些文件,但你没有时间或根本就不想将这些更改引入到新版本中。或者,你将系统升级到3.0,但仍想继续使用Debian 2.2下的某个软件包。你可以“钉住”(pin)这个版本,这样它就不会被更新了。

操作起来十分简单,你只需编辑/etc/apt/preferences文件。

文件格式很简单:

Package: <package>

Pin: <pin definition>

Priority: <pin's priority>

例如,我对sylpheed软件包做了某些修改,其版本为0.4.99,我想保留这些修改不被更新,可加上:

Package: sylpheed

Pin: version 0.4.99*

注意我用了一个 *(星号)。这是一个“通配符”;它表明我希望“钉住”所有以0.4.99打头的版本(以防它们被下载并安装到我机器上。pin控制的是服务器端的更新软件包而非本地的已安装软件包。译者注)。因为Debian使用“Debian版本号”为其软件包定版本,我不想进行所有这些版本的升级,如果不用通配符,那么0.4.99-1版或0.4.99-10版只要一出炉系统就会安装它们。如果你修改了软件包,你一定不希望这么做。

Priority是可选域;如果没有特别指定,它的默认值为989。

让我们来看看pin如何体现优先级(priorty)区别。一个低于0的优先级表示:该软件包被禁止安装;优先级在0到100之间表示:软件包没有安装并且当前也没有可用版本,这些软件包不会出现在供选择版本列表中;优先级为100表示软件包已被安装——对于这个已安装的软件包,如果有一个不同的版本要替换它,那么替换者的优先级必须大于100。

优先级在100以上表示软件包应该被安装。典型的例子如,某个软件包的升级补丁包,任何处于100和1000(包括1000)之间的优先级都表示上述情形。但是,一个软件包如果被定为这样的优先级,它并不会降级已安装的版本。例如,如果我安装了sylpheed 0.5.3并为sylpheed 0.4.99指定了一个优先级为999的pin,那么由于要满足pin的优先级,所以0.4.99软件包不会被安装。如果要实现软件包“降级”,则需要将pin的优先级定为大于1000。(100<优先级<=1000时,如果存在升级包就对本机相关包升级,如果本机软件包比更新包还新就保持不变;优先级>1000时,服务器端软件包不论比本机的软件包新还是旧,均对本机相关软件包进行更新。译者注)

pin可以被用来控制软件包的修订版本(version)、发布版本(release)或版本来源(origin)。

在前面我们已经看到,钉住修订版本时使用通配符来代替版本号数字,这样可一次指定多个版本。

release选项是基于发布版文件(Release file)的,这个文件在本地APT软件库中或安装光盘上。如果你从本地软件库安装软件包而软件库中又没有该文件,那么这个选项将失效。来看看/var/lib/apt/lists/目录中发布版文件的内容,发布版包括这些参数:a(archive),c(components),v(version),o(origin),l(lable)。

来看一个例子:

Package: *

Pin: release v=2.2*,a=stable,c=main,o=Debian,l=Debian

Priority: 1001

在本例中,我们选择了version为2.2*的Debian(它可以是2.2r2,2.2r3——这些版本包含了“point releases”即安全更新和其它非常生要的更新),stable软件库,main类软件包(非contrib或non-free),版本来源和标签均为Debian。版本来源(o=)说明谁制作了这个发布版文件,标签(l=)说明该发布版的名称:Debian即是指Debian自己,Progeny即是指后裔制作者,下面是一个发布版文件的样例:

 $ 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

第四章 几个非常有用的工具

4.1 如何安装本地编译的软件包:equivs

====================================

有时,用户想使用某些软件的特殊版本,它们只以源代码的形式存在,没有现成的Debian软件包。软件包管理系统在处理这类事务时可能会出问题。假设你想编译新版本的邮件服务器,编译、安装一切正常,然而,软件包管理系统并不知道你在系统中安装了自己编译的东西,在Debian中许多基于MTA(Mail Transport Agent 邮件传输代理)的软件包也不知道这些。

现在是equivs登台的时候了。用它来安装软件包,它所做的工作就是创建一个新的空软件包来实现关联,让软件包管理系统相信关联实现了。

在我们开始以前,我必须提醒你,编译某个软件最安全的方法是对该软件现有的Debian软件包进行修改后重新编译,如果你并不知道你正在干什么,劝你不要使用equivs替换关联包。更多信息请参阅 第六章 源码包操作。

继续上面的例子,你安装好了新编译的postfix,接下来打算安装mutt,突然你发现mutt想与另一个MTA建立关联,而你想让它使用你刚安装的新MTA。

转到某个目录(例如/tmp)执行:

# equivs-control name

将name替换为你创建的管理文件(control file),管理文件按如下格式创建:

Section: misc

Priority: optional

Standards-Version: 3.0.1

Package: <enter package name; defaults to equivs-dummy>

Version: <enter version here; defaults to 1.0>

Maintainer: <your name and email address; defaults to username>

Pre-Depends: <packages>

Depends: <packages>

Recommends: <packages>

Suggests: <package>

Provides: <(virtual)package>

Architecture: all

Copyright: <copyright file; defaults to GPL2>

Changelog: <changelog file; defaults to a generic changelog>

Readme: <README.Debian file; defaults to a generic one>

Extra-Files: <additional files for the doc directory, commaseperated>

Description: <short description; defaults to some wise words>

long description and info

.

second paragraph

我们只需按自己的需要修改相关项目就行了。文件中每个项目都描述得很清楚,我们不必在此逐行解释它们。现在开始修改吧:

Section: misc

Priority: optional

Standards-Version: 3.0.1

Package: mta-local

Provides: mail-transport-agent

行了,就是这样。mutt要与mail-transport-agent关联,这是所有MTA共用的一个虚拟包(virtual package),我可以简单地将这个软件包命名为mail-transport-agent,不过我更愿意使用系统的虚拟包方案,使用Provides选项。

现在你可以开始创建软件包了:

# equivs-build name

dh_testdir

touch build-stamp

dh_testdir

dh_testroot

dh_clean -k

# Add here commands to install the package into debian/tmp.

touch install-stamp

dh_testdir

dh_testroot

dh_installdocs

dh_installchangelogs

dh_compress

dh_fixperms

dh_installdeb

dh_gencontrol

dh_md5sums

dh_builddeb

dpkg-deb: building package `name' in `../name_1.0_all.deb'.

The package has been created.

Attention, the package has been created in the current directory,

然后安装这个新创建的.deb。

众所周知,equivs的用法很多,它甚至可以帮你为那些常用软件的底层关联包创建个性化版本。尽情发挥你的想像力吧,不过要小心。

重要提示:管理文件(control files)的样例文件在/usr/share/doc/equivs/examples目录下。

4.2 移除无用的locale files文件:localepurge

===========================================

许多Debian用户仅在固定地区使用Debian。例如,在巴西的Debian用户,通常使用pt_BR地区配置文件(locale file)而不会关心es地区配置文件。

对于这类用户而言localepurge是一个非常有用的工具,你可以仅保留你当前所用的地区配置文件,删除其它无用的文件,从而释放大量硬盘空间。运行apt-get install localepurge就行了。

它配置起来非常容易,debconf的提问将引导用户一步一步完成设置。在回答第一个问题时请务必谨慎,如果回答错了,系统可能删掉所有的地区配置文件,包括你正在使用的这个。复原它们的唯一方法就是重装那些软件包。

4.3 如何知晓哪些软件包可以升级

==============================

apt-show-versions工具可以告诉你系统中哪些包可以更新以及其它一些有用的信息。-u选项可以显示可更新软件包列表:

 $ apt-show-versions -u

libeel0/unstable upgradeable from 1.0.2-5 to 1.0.2-7

libeel-data/unstable upgradeable from 1.0.2-5 to 1.0.2-7

第五章 获取软件包信息

有些基于APT系统的前端程序,能十分方便地获得系统软件包列表,列表包括可安装或已安装的软件包,还可以显示某软件包属于哪个域(section),它的优先级(priority)是多少,它的说明文档,等等。

但是...在此我们想的学习如何使用APT本身来完成。你如何找出你想要安装的软件包的名称?

我们完成这个任务的方法有很多。我们从apt-cache开始,APT系统使用这个程序来维护它的数据库。下面我们通过一些实际操作来对它做个概览。

5.1 获得软件包名称

==================

假设你十分怀念玩Atari 2600的好日子,你决定用APT安装一个Atari emulator,随后再下载几个游戏,你可以这样:

[root]@[/] # apt-cache search atari

atari-fdisk-cross - Partition editor for Atari (running on non-Atari)

circuslinux - The clowns are trying to pop balloons to score points!

madbomber - A Kaboom! clone

tcs - Character set translator.

atari800 - Atari emulator for svgalib/X/curses

stella - Atari 2600 Emulator for X windows

xmess-x - X binaries for Multi-Emulator Super System

我们找到了几个相关的软件包,以及有关的简单描述。想进一步获得某个软件包的详细信息,你可以运行:

[root]@[/] # apt-cache show stella

Package: stella

Priority: extra

Section: non-free/otherosfs

Installed-Size: 830

Maintainer: Tom Lear <tom@trap.mtview.ca.us>

Architecture: i386

Version: 1.1-2

Depends: libc6 (>= 2.1), libstdc++2.10, xlib6g (>= 3.3.5-1)

Filename: dists/potato/non-free/binary-i386/otherosfs/stella_1.1-2.deb

Size: 483430

MD5sum: 11b3e86a41a60fa1c4b334dd96c1d4b5

Description: Atari 2600 Emulator for X windows

Stella is a portable emulator of the old Atari 2600 video-game console

written in C++. You can play most Atari 2600 games with it. The latest

news, code and binaries for Stella can be found at:

http://www4.ncsu.edu/~bwmott/2600

屏幕上显示出这个软件包的详细信息及其用途的完整描述。如果你的系统中已安装了某个软件包而系统又搜索到它的新版本,系统会将它们的详细信息一并列出。如下例:

[root]@[/] # apt-cache show lilo

Package: lilo

Priority: important

Section: base

Installed-Size: 271

Maintainer: Russell Coker <russell@coker.com.au>

Architecture: i386

Version: 1:21.7-3

Depends: libc6 (>= 2.2.1-2), debconf (>=0.2.26), logrotate

Suggests: lilo-doc

Conflicts: manpages (<<1.29-3)

Filename: pool/main/l/lilo/lilo_21.7-3_i386.deb

Size: 143052

MD5sum: 63fe29b5317fe34ed8ec3ae955f8270e

Description: LInux LOader - The Classic OS loader can load Linux and others

This Package contains lilo (the installer) and boot-record-images to

install Linux, OS/2, DOS and generic Boot Sectors of other OSes.

.

You can use Lilo to manage your Master Boot Record (with a simple text screen)

or call Lilo from other Boot-Loaders to jump-start the Linux kernel.

Package: lilo

Status: install ok installed

Priority: important

Section: base

Installed-Size: 190

Maintainer: Vincent Renardias <vincent@debian.org>

Version: 1:21.4.3-2

Depends: libc6 (>= 2.1.2)

Recommends: mbr

Suggests: lilo-doc

Description: LInux LOader - The Classic OS loader can load Linux and others

This Package contains lilo (the installer) and boot-record-images to

install Linux, OS/2, DOS and generic Boot Sectors of other OSes.

.

You can use Lilo to manage your Master Boot Record (with a simple text screen)

or call Lilo from other Boot-Loaders to jump-start the Linux kernel.

注意,首先列出的是可用软件包,接着列出的是已安装软件包。获取某个软件包的常规信息可运行:

[root]@[/] # apt-cache showpkg penguin-command

Package: penguin-command

Versions:

1.4.5-1(/var/lib/apt/lists/download.sourceforge.net_debian_dists_unstable_main_binary-i386_Packages)(/var/lib/dpkg/status)

Reverse Depends:

Dependencies:

1.4.5-1 - libc6 (2 2.2.1-2) libpng2 (0 (null)) libsdl-mixer1.1 (2 1.1.0) libsdl1.1 (0 (null)) zlib1g (2 1:1.1.3)

Provides:

1.4.5-1 -

Reverse Provides:

如果仅想了解某软件包的与哪些软件包关联,可运行:

[root]@[/] # apt-cache depends penguin-command

penguin-command

Depends: libc6

Depends: libpng2

Depends: libsdl-mixer1.1

Depends: libsdl1.1

Depends: zlib1g

总之,有一系列工具可帮助我们找到我们想要的软件包。

5.2 使用dpkg查找软件包名称

==========================

另一个定位软件包的方法是知道软件包中某个关键文件的名称。例如,你编译时需要某个头文件,查找提供该文件的软件包,你可以运行:

[root]@[/] # dpkg -S stdio.h

libc6-dev: /usr/include/stdio.h

libc6-dev: /usr/include/bits/stdio.h

perl: /usr/lib/perl/5.6.0/CORE/nostdio.h

或者:

[root]@[/] # dpkg -S /usr/include/stdio.h

libc6-dev: /usr/include/stdio.h

在清理硬盘空间时,了解系统中已安装软件的软件包名称十分有用,你可以运行:

[root]@[/] # dpkg -l | grep mozilla

ii mozilla-browse 0.9.6-7 Mozilla Web Browser

这个命令的缺点是它会“截断”软件包的名字。在上例中,软件包的全称是mozilla-browser,解决这个问题可以使用COLUMNS环境变量:

[kov]@[couve]  $ COLUMNS=132 dpkg -l | grep mozilla

ii mozilla-browser 0.9.6-7 Mozilla Web Browser - core and browser

或显示成这样:

[root]@[/] # apt-cache search "Mozilla Web Browser"

mozilla-browser - Mozilla Web Browser

5.3 如何“按需”安装软件包

==========================

你正在编译某段程序,突然,停住了!一条错误信息报告说你没有它需要的头文件。让auto-apt来救你吧,它问你是否要安装需要的软件包,然后挂起编译进程,安装好软件包后再恢复编译进程。

你所要做的仅仅是:

auto-apt run command

这里“command”指在运行过程中可能出现“需求文件不存在”问题的命令。例如:

auto-apt run ./configure

一会儿,它就会告诉你要安装所需的软件包并自动转到apt-get处理。如果你正在运行X,就会一个图形界面提示窗口。

为了提高效率auto-apt所用的数据库需要实时更新。可调用auto-apt update,auto-apt updatedb和auto-apt update-local来完成更新。

5.4 如何知道文件属于哪个软件包

==============================

如果你想安装某个软件包,但用apt-cache查不出它的名称,不过你知道这个程序的文件名,或这个软件包中某些文件的文件名,那么你可以用apt-file来查找软件包名称。

 $ apt-file search filename

它用起来很象dpkg -S,不过它还会列出包含该文件的已删除软件包。它也可以用来查找哪个软件包包含编译时所缺的文件,当然,解决这类问题auto-apt可能是更好的方案,请参阅 5.3如何“按需”安装软件包。

用这个命令,你可以列出软件包的内容:

 $ apt-file list packagename

apt-file用一个数据库来存放所有软件包的内容信息,和auto-apt一样,这个数据库也需要实时更新,完成更新可以运行:

# apt-file update

默认情况下,apt-file和auto-apt使用同一个数据库,参阅 5.3如何“按需”安装软件包。

5.5 如何掌握软件包的变化情况

============================

在每个软件包被安装以后,都会在文档目录(/usr/share/doc/packagename)生成一个changelog.Debian.gz的文件,这个文件记录了该软件包最后一次更新对系统做了哪些修改,你可以用zless阅读这些信息。不过当你对整个系统进行升级以后,逐个查看软件包的更新信息可不是件容易事。

有一个工具能帮你完成这项任务,它就是apt-listchanges。首先你要装上apt-listchanges软件包。在安装的过程中,Debconf会问你一些问题,按你的要求回答它们就行了。

“Should apt-listchanges be automatically run by apt”(想让apt自动运行apt-listchanges吗?)这个选项非常有用,因为在你使用apt更新软件包时,它会告诉你此次软件包更新将会对原有系统做出了哪些修改,你分析了这些信息以后再决定是否执行此次更新。“Should apt-listchanges prompt for confirmation after displaying changes?”(显示更新信息后,需要apt-listchanges等待你的确认信息吗?)选项也非常有用,因为在你阅读完更新信息后,它会询问你是否继续安装进程,如果你不想继续,apt-listchanges会返回一条错误信息,告诉apt停止安装进程。

安装了apt-listchanges后,每当apt下载软件包时(不论来源是Internet、光盘或是硬盘)都会显示这些软件包的系统更新信息。

第六章 源码包操作

6.1 下载源码包

==============

在自由软件的世界里,经常需要学习源码或为程序除错,所以你需要下载它们。APT提供了一套简便的方法帮你获得发布版中众多程序的源代码以及创建一个.debs所需的所有文件。

Debian源码的另一个普遍用途是将unstable发布版的新版程序进行改写以供别的发布版使用,例如,从stable发布版外引入新的软件包,需要重新生成.debs将它在原发布版中的关联关系迁移到新的发布版。

完成这些工作,/etc/apt/sources.list文件中deb-src所指引用镜像源应该是unstable,别忘了将行首的注释符去掉。详情参阅 2.1/etc/apt/sources.list文件。

用下面的命令下载源码包:

apt-get source packagename

通常会下载三个文件:a .orig.tar.gz, a .dsc and a .diff.gz。对于Debian专用的软件包,最后一个文件不会下载,第一个文件的文件名中没有“orig”项。

dpkg-source读取.dsc文件信息,将源码包解包到packagename-version目录,下载下来的源码包中有一个debian/目录,里面是创建.deb包所需的文件。

想要下载的源码包自动编译成软件包,只需在命令行中加上-b,如下:

apt-get -b source packagename

如果你不打算立即创建.deb包,你可以运行如下命令,以后再创建它。

dpkg-buildpackage -rfakeroot -uc -b

请在下载包所在的目录中运行上面的命令。

apt-get的source命令与它的其它命令有所不同,普通用户权限就可以运行source命令,指定文件被下载到用户调用apt-source package命令时所处的目录中。

6.2 编译源码包所需的软件包

==========================

通常,编译源码包时要用到某些头文件和共享库,所有的源码包的管理文件(control file)中都有一个域“Build-Depends:”,域中指出了编译该源码包需要哪些附加包。

APT提供了一个简单的方法下载这些附加包,你只需运行apt-get build-dep package,其中package就是你打算编译的源码包名称。见下例:

[root]@[/] # apt-get build-dep gmc

Reading Package Lists... Done

Building Dependency Tree... Done

The following NEW packages will be installed:

comerr-dev e2fslibs-dev gdk-imlib-dev imlib-progs libgnome-dev libgnorba-dev

libgpmg1-dev

0 packages upgraded, 7 newly installed, 0 to remove and 1 not upgraded.

Need to get 1069kB of archives. After unpacking 3514kB will be used.

Do you want to continue? [Y/n]

这些用于gmc正确编译指定源码包的附加包将会被安装。注意这个命令不能用来搜索某个软件的源码包,你得另外运行apt-get source下载源码包。

第七章 如何处理错误

7.1 一般错误

============

错误总是发生,大部分是因为用户的粗心,下面列举一些常见错误及处理方法。

如果在运行apt-get install package...时,你的系统报告如下信息:

Reading Package Lists... Done

Building Dependency Tree... Done

W: Couldn't stat source package list 'http://people.debian.org unstable/ Packages' (/var/state/apt/lists/people.debian.org_%7ekov_debian_unstable_Packages) - stat (2 No such file or directory)

W: You may want to run apt-get update to correct these missing files

E: Couldn't find package penguineyes

上次你修改/etc/apt/sources.list后,忘了运行apt-get update更新。

如果出现这样的信息:

E: Could not open lock file /var/lib/dpkg/lock - open (13 Permission denied)

E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

如果你没有root权限,当运行除source处的其它apt-get命令,如会出现上面的错误信息。

当你同时运行两个apt-get进程,或者当你试图运行apt-get时已有一个的dpkg进程处于激活状态,系统也会报告与上面相似的错误信息。唯一能与其它命令同时运行的只有source命令。

如果在安装过程中出现中断,然后你发现该软件包既不能重装又不能删除,试试下面两个命令:

# apt-get -f install

# dpkg --configure -a

再试着安装那个软件包,如果不行再次运行上述命令后再试。这两个命令对于那些使用unstable的玩家非常有用。

7.2 在哪儿获得帮助?

===================

如果你发现自己有太多疑问,没关系,有大量的Debian软件包管理系统文档供你参考。--help和帮助文档能为你提供巨大的帮助,这些文档位于/usr/share/doc目录中,如/usr/share/doc/apt。

如果本文档没法帮你排忧解难,可以去Debian邮件列表找找答案,相关栏目内你会获得更多信息。Debian的网址是:http://www.debian.org。

记住只有Debian用户才能这些邮件列表和资源,其它操作系统的用户请到相关系统发布者建立的社区中获取更多资源。

第八章 哪些发布版支持APT?

下面是部分使用APT系统的发布团体名称:

Debian GNU/Linux (http://www.debian.org) - APT的开发者

Conectiva (http://www.conectiva.com.br) - 第一个将APT移植用于rpm的发布团体

Mandrake (http://www.mandrake.com)

PLD (http://www.pld.org.pl)

Vine (http://www.vinelinux.org)

APT4RPM (http://apt4rpm.sf.net)

Alt Linux (http://www.altlinux.ru/)

Red Hat (http://www.redhat.com/)

Sun Solaris (http://www.sun.com/)

SuSE (http://www.suse.de/)

Yellow Dog Linux (http://www.yellowdoglinux.com/)

第九章 致谢

非常感谢你们,我Debian-BR项目组的好朋友们!还有你Debian,始终在我身边帮助我,给我动力不停工作为全人类做出贡献,帮助我树立拯救世界的理想。:)

我还要感谢CIPSGA,他们给予我们项目组乃至整个自由软件项目巨大的帮助,是我们灵感的源泉。

特别感谢:

Yooseong Yang <yooseong@debian.org>

Michael Bramer <grisu@debian.org>

Bryan Stillwell <bryan@bokeoa.com>

Pawel Tecza <pawel.tecza@poczta.fm>

Hugo Mora <h.mora@melix.com.mx>

Luca Monducci <luca.mo@tiscali.it>

Tomohiro KUBOTA <kubota@debian.org>

Pablo Lorenzzoni <spectra@debian.org>

Steve Langasek <vorlon@netexpress.net>

Arnaldo Carvalho de Melo <acme@conectiva.com.br>

Erik Rossen <rossen@freesurf.ch>

Ross Boylan <RossBoylan@stanfordalumni.org>

Matt Kraai <kraai@debian.org>

Aaron M. Ucko <ucko@debian.org>

Jon ?slund <d98-jas@nada.kth.se>

第十章 本使用指南的新版本

本操作手册由Debian-BR项目组撰写,我们希望它能为Debian用户提供有效的帮助。

你可以从Debian文档项目页面获得本文档的新版本:http://www.debian.org/doc/ddp

对本文档有任何意见或建议可直接发email给我:kov@debian.org

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有