电脑技术学习

FreeBSD handbook中文版 4 安装应用程序:Packages 和Ports

dn001
目录

4 安装应用程序:Packages 和Ports
4.1 概要
4.2 寻找你要的应用程序
4.3 使用包管理系统
4.4 使用Ports Collection
4.5 安装中出现的问题
=============================================================
第4 章.安装应用程序:Packages 和ports
=============================================================
(翻译中出现的任何问题或错误,请广大读者及时反馈给我:FreeBSDhandbook@163.com)
4.1 概要
在FreeBSD 上有很多应用程序。如果你是一个操作系统的开发者,基本系统就包含了
你所需要的所有东西。如果你计划用FreeBSD 来做点事情,你可能需要安装额外的应用程
序。如:一个web 浏览器,或邮件服务器,或一个象KDE 和GNOME 这样的图形环境。如果
你在安装第三方应用软件之前,就已经在使用Unix 系统了,那大概的安装情况就是这样的:
1. 下载软件,可能是源代码形式或二进制形式。
2. 用compress 或gzip 来解开软件。
3. 阅读相关文档,了解如何安装。
4. 如果软件是以源代码形式发布的,先编译。这可能需要编辑一个makefile 文件,或运
行一个配置脚本。
5. 测试和安装软件。
如果一切顺利的话,就这么简单。如果你在安装一个软件包时发生一些错误,你可能
需要编辑一下代码,以使它能正常工作。
你可以继续使用传统的方式安装软件。然而,FreeBSD 提供了两种技术:packages 和
ports。就在写这篇文章的时候,已经有超过6000 个第三方的应用程序可以使用了。
FreeBSD 的应用程序包是一个可以下载的文件。这些包包含了预编译的拷贝,还有一些
配置文件或文档。一个下载的包文件可以用FreeBSD 的包管理命令来操作,例如
pkg_add,pkg_delete,pkg_info 等等。
安装一个新的应用程序可以用一个简单的命令来完成。一个FreeBSD 的Port 是一个可
以自动从源代码编译成应用程序的文件集合。记住,如果你自己来编译的话,需要执行很
多步的操作(解压,补丁,编译,安装)。这些整理port 的文件集合包含了系统需要完成
这个工作的必需信ⅰD憧梢栽诵幸恍┘虻サ拿睿切┰创刖涂梢宰远叵略兀饪?nbsp;
打补丁,编译,直至安装完成。
第1 页FreeBSD 使用手册
Package 的优点
1. 一个编译的包通常要比一个压缩过的应用程序的源代码小得多。
2. 包不需要进行额外的编译。对于很大的应用程序如Mozilla, KDE 或GNOME,这点很重
要,特别是在你的系统比较小的情况下。
3. 包不需要你一定要知道如何在FreeBSD 上编译软件的详细过程。
Ports 的优点
1. 包在编译时通常比较保守,因为他们必须运行在比较大型的系统上。通过从port 安装,
你可以细微调整编译选项来产生适合于处理器的代码。
2. 一些包已经把与它们相关的能做和不能做的事情的选项都编译进去了。例如,Apache
可能就配置进了很多不同的组选项。你从port 中建构软件,不一定要接受默认的选项,
你可以自己来设置。
在一些例子中,多个包将需要为某个设置指定同一个应用程序。例如,Ghostscript 可
以使用ghostscript 和ghostscript-nox11 包,这取决于你是否安装了X11 服务器。这样
的略微调整对包是可能的,但如果一个应用程序有超过一个到两个不同的选项时,比较快
就变得不太好了。
1. 一些软件的许可条件禁止采用二进制形式发行。他们必须带上源代码。
2. 一些人不信任二进制发行形式。至少有了源代码,可以亲自阅读它,寻找潜在的问题。
3. 如果你要对软件打补丁,你就需要有源代码。
4. 一些人喜欢整天围着源代码转,所以他们喜欢亲自阅读源代码,修改源代码等等。
这章的其余部分将介绍如何使用packages 和ports 来安装和管理第三方软件。
4.2 寻找你要的应用程序
在你安装任何应用程序之前,你需要知道你需要什么,那个应用程序叫什么。FreeBSD 中
可用的应用程序正在不断地增长着。当前已经有超过6000 个可用的应用程序以package 或
ports 的形式存在。有许多方法可以找到你所需要的程序。
第2 页FreeBSD 使用手册
1. FreeBSD 站点上拥有一个可以搜索到的所有可用的应用程序列表, 在
(http://www.FreeBSD.org/ports/)上。它分很多种类,你既可以通过名称来搜索,
也可以在分类中列出所有可用的应用程序。
2. Dan Langille 维护着网站FreshPorts(http://www.freshports.org/)。FreshPort
时刻追踪着在ports 中应用程序的变化。当有任何程序被升级时,他们就会发email
提醒你。
3. 如果你不知道你想要的应用程序的名字, 可以通过FreshMeat
(http://www.freshmeat.net/) 或AppWatch (http://www.appwatch.com/这样的网站
来寻找。如果应用程序被找到了,你可以回FreeBSD 的主站去看一下。
4.3 使用包管理系统
4.3.1 安装一个package
你可以使用pkg_add 工具从本地或通过网络从一台服务器上安装FreeBSD 的package。
例如4-1.下载一个package 然后在本地安装它:
# ftp ftp2.freebsd.org
Connected to ftp2.freebsd.org.
220 ftp2.freebsd.org FTP server (Version 6.00LS) ready.
331 Guest login ok, send your email address as passWord.
230-
230- This Machine is in VIEnna, VA, USA, hosted by Verio.
230- Questions? E-mail freebsd@vienna.verio.net.
230-
230-
230 Guest login ok, access restrictions apply.
第3 页FreeBSD 使用手册
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /pub/FreeBSD/ports/packages/irc
250 CWD command successful.
ftp> get xchat-1.7.1.tgz
local: xchat-1.7.1.tgz remote: xchat-1.7.1.tgz
150 Opening BINARY mode data connection for ‘xchat-1.7.1.tgz' (471488
bytes).
100% |**************************************************| 460 KB
00:00 ETA
226 Transfer complete.
471488 bytes received in 5.37 seconds (85.70 KB/s)
ftp> exit
# pkg_add xchat-1.7.1.tgz
#
如果你没有本地package 的源代码,可能需要为pkg_add 加上-r 选项。这将迫使程序
自动决定目标文件的正确格式和版本,然后自动从一个FTP 站点寻找和安装package.
# pkg_add -r xchat-1.7.1
这将下载正确的package,而不需要用户的干预就可以添加。Package 文件是以.tgz 的
格式分发的。你可以在( ftp://ftp.freebsd.org/pub/FreeBSD/ports/packages/ ) 或
FreeBSD CDROM 上找到。每一个FreeBSD 发行CD 都把packages 放在/packages 目录中。
packages 的设计与/usr/ports 树很相似。每个分类都有它自己的目录,每个package 也能
在所有目录下找到。Package 系统的整个目录结构是与ports 的目录结构相对应的;他们以
package/port 的形式互相协调工作。
第4 页4.3.2 删除一个package
pkg_delete 是用来删除先前安装的软件package 的工具。
4.3.3 管理packages
pkg_info 是用来列出和描述已安装的不同package 的工具。
# pkg_info
cvsup-bin-16.1 A general network file distribution system optimized for CV
docbook-1.2 Meta-port for the different versions of the DocBook DTD
...
pkg_version 是一个用来统计所有安装的package 的版本的工具。它可以用来比较本地
package 的版本与ports 目录中的当前版本是否一致。
# pkg_version
cvsup-bin =
docbook =
...
符号
=
<
>
?
*
FreeBSD 使用手册
# pkg_delete xchat-1.7.1
#
在第二列的符号指出了安装版本的相关年纪和本地ports 目录树中可用的版本。
含义
在本地ports 树中与已安装的软件包相匹配。
已安装的版本要比在ports 树中的版本来得老。
已安装的版本要比在ports 树中的版本来得新。
已安装的软件包无法在ports 索引中找到。
软件包有很多版本。
第5 页FreeBSD 使用手册
4.3.4 其他一些
pkg_add pkg_delete pkg_info pkg_version pkg_create
所有的package 信息都保存在/var/db/pkg目录下。每一个package 的内容和描述都能在这
个目录的相关文件中找到。
4.4.使用Ports Collection
下面的章节提供了使用ports collection 来安装或卸载程序的基本用法。
4.4.1 获得Ports Collection
在你安装ports 之前,你必须先获得ports collection-----一套Makefiles, patches
和描述文件,通常被放在/usr/ports 下。
当你安装FreeBSD 系统时,Sysinstall 会问你是否要安装ports collection。如果你
选择no,你可以根据现在的指示获得ports collection。
Sysinstall 方法
这个方法包括重新使用sysinstall 来安装ports collection。
1. 首先成为root,运行/stand/sysinstall:
# /stand/sysinstall
2. 用箭头选择Configure,然后键入Enter。
3. 用箭头选择Distributions,然后键入Enter。
4. 用箭头选择ports,然后键入Space 键。
5. 用箭头选择Exit,然后键入Enter。
6. 选择你要使用的安装设备,如CDROM, FTP 等。
7. 选择菜单退出sysinstall。
还有一种获得和确保你的ports collection 始终保持最新的方法是使用CVSup,
/usr/share/examples/cvsup/ports-supfile。
CVSup 方法
第6 页FreeBSD 使用手册
这是一个使用CVSup 获得ports collection 的快速方法。如果你要确保你的ports 树
为最新或想了解更多有关CVSup 的信息,请阅读先前提到的章节。
安装net/cvsup port.看看CVSup Installation 的介绍了解更多信息。1.
进入root 方式,拷贝/usr/share/examples/cvsup/ports-supfile 到一个新的目录, 2.
如/root 或你的主目录。
编辑ports-supfile 3.
修改CHANGE_THIS.FreeBSD.org 为离你比较近的一个CVSup。看看有关CVSup 的镜4.
象信息。
运行cvsup -g -L 2 <path_to_supfile> 5.
# cvsup -g -L 2 /root/ports-supfile 6.
以后可以经常运行这个命令来下载最新的ports collection 的修正。7.
4.4.2. 安装Ports
当提到Ports collection 时,第一个要说明的就是何谓“skeleton”。一个port skeleton
是让一个程序在FreeBSD 上简洁地编译并安装的所需文件的最小组合,每个port skeleton
包含:
一个编译文件。编译文件包括好几个部分,指出应用程序是如何编译的和它将被安
装在系统的哪个地方。
一个distinfo 文件。这个文件包括这些信息:这些文件需要被下载后才能构造,需
要检查数目,确保在下载过程中文件不会被中断。
一个file 目录。这个目录包括编译程序和安装到FreeBSD 系统的补丁。这些补丁基
本上都是些小文件,指出这些文件的特殊变化。
一个pkg-comment 文件。这是一行程序的描述。
一个pkg-descr 文件。这是一个提供更多细节,有多行程序的描述文件。
一个pkg-plist 文件。这是即将被安装的许多文件的列表。它告诉ports 系统在重
新安装时什么文件需要被删除。
现在,你已经了解了足够的ports collection 的背景信息,你可以准备安装ports 了。
共有两种安装方法,下面具体介绍。在你安装之前,你需要选择一个安装的port。有两种
第7 页FreeBSD 使用手册
方法,最容易的方法是到FreeBSD 的网站上查看ports 的列表。每个port 都有一个描述文
件,你需要在安装之前先浏览一下。另外一种方法是使用whereis 命令。只需要输入“whereis
<你想安装的程序>”,如果能被系统找到,你就会看到它的保存路径:
#whereis xchat
xchat: /usr/ports/irc/xchat
#
这个命令告诉你xchat 能在/usr/ports/irc/xchat 目录中找到。另外一种查找port 的
方法是使用ports 内建的搜索功能。要使用这个功能,你先要进入/usr/ports 目录,然后
运行make search key=program-name ,这里的program-name 就是你要找的程序的名称。
例如,如果你要找xchat:
# cd /usr/ports
# make search key=xchat
Port: xchat-1.3.8
Path: /usr/ports/irc/xchat
Info: An X11 IRC client using the GTK+ toolkit, and optionally, GNOME
Maint: jim@FreeBSD.org
Index: irc
B-deps: XFree86-3.3.5 bzip2-0.9.5d gettext-0.10.35 giflib-4.1.0 glib-1.2.6
gmake-3.77 gtk-1.2.6
imlib-1.9.8 jpeg-6b png-1.0.3 tiff-3.5.1
R-deps: XFree86-3.3.5 gettext-0.10.35 giflib-4.1.0 glib-1.2.6 gtk-1.2.6
imlib-1.9.8 jpeg-6b
png-1.0.3 tiff-3.5.1
你要密切注意输出内容的“Path:”行,它告诉你能在哪儿找到它。其它的信息是在安
装ports 时不需要的,在这里就不提了。
注意: 必须具有root 权限才能安装port。
4.4.2.1.从CDROM 安装ports
做这一步的前提是你有一张FreeBSD 的安装光盘。如果你没有,你可以从FreeBSD 商店
订购一张(www.freebsdmall.com)。在确信光盘已经放入光驱之后,你需要先挂上/cdrom,
才可以安装ports。开始,改变目录到你要安装的ports 所在的目录:
第8 页FreeBSD 使用手册
# cd /usr/ports/irc/xchat
一旦进入xchat 目录,你就可以看到port skeleton 文件了。下面要编译port。只需
要在命令行简单地输入make 命令。做好之后,你可以看到下面的信息:
# make
>> xchat-1.3.8.tar.bz2 doesn't seem to exist on this system.
>> Attempting to fetch from file:/cdrom/ports/distfiles/.
===> Extracting for xchat-1.3.8
>> Checksum OK for xchat-1.3.8.tar.bz2.
===> xchat-1.3.8 depends on executable: bzip2 - found
===> xchat-1.3.8 depends on executable: gmake - found
===> xchat-1.3.8 depends on shared library: gtk12.2 - found
===> xchat-1.3.8 depends on shared library: Imlib.5 - found
===> xchat-1.3.8 depends on shared library: X11.6 - found
===> Patching for xchat-1.3.8
===> Applying FreeBSD patches for xchat-1.3.8
===> Configuring for xchat-1.3.8
...
[configure output snipped]
...
===> Building for xchat-1.3.8
...
[compilation snipped]
...
#
注意,一旦编译完成,你需要回到你的命令行。下面就安装port,在命令行输入make
install:
# make install
===> Installing for xchat-1.3.8
===> xchat-1.3.8 depends on shared library: gtk12.2 - found
===> xchat-1.3.8 depends on shared library: Imlib.5 - found
第9 页FreeBSD 使用手册
===> xchat-1.3.8 depends on shared library: X11.6 - found
...
[install routines snipped]
...
===> Generating temporary packing list
===> Installing xchat docs in /usr/X11R6/share/doc/xchat
===> Registering installation for xchat-1.3.8
#
回到命令行后,你就可以运行刚才安装的应用程序了。
注意:你也可以只运行make install,把make 和make install 两步并作一步来执行。
请记住有些ports 由于许可证的原因,不允许通过cdrom 来安装。这可能有很多原因,包
括在下载安装前需要注册,重新发布没有得到许可等等。如果你希望安装一个cdrom 上没
有的port,你可能需要在线安装。
4.4.2.2. 通过internet 安装
正如前一节所讲到的,这一节假定你已经连接到Internet 上了。如果没有的话,你只
好通过CDROM 来安装了。通过Internet 安装一个port,实际上跟你通过CDROM 安装是一样
的。两者之间唯一的不同是程序的源代码是从Internet 上而不是从CDROM 上下载。
有关的步骤是一样的:
# make install
>> xchat-1.3.8.tar.bz2 doesn't seem to exist on this system.
>> Attempting to fetch from http://xchat.org/files/v1.3/.
Receiving xchat-1.3.8.tar.bz2 (305543 bytes): 100%
305543 bytes transferred in 2.9 seconds (102.81 Kbytes/s)
===> Extracting for xchat-1.3.8
>> Checksum OK for xchat-1.3.8.tar.bz2.
===> xchat-1.3.8 depends on executable: bzip2 - found
===> xchat-1.3.8 depends on executable: gmake - found
===> xchat-1.3.8 depends on shared library: gtk12.2 - found
===> xchat-1.3.8 depends on shared library: Imlib.5 - found
===> xchat-1.3.8 depends on shared library: X11.6 - found
第10 页FreeBSD 使用手册
===> Patching for xchat-1.3.8
===> Applying FreeBSD patches for xchat-1.3.8
===> Configuring for xchat-1.3.8
...
[configure output snipped]
...
===> Building for xchat-1.3.8
...
[compilation snipped]
...
===> Installing for xchat-1.3.8
===> xchat-1.3.8 depends on shared library: gtk12.2 - found
===> xchat-1.3.8 depends on shared library: Imlib.5 - found
===> xchat-1.3.8 depends on shared library: X11.6 - found
...
[install routines snipped]
...
===> Generating temporary packing list
===> Installing xchat docs in /usr/X11R6/share/doc/xchat
===> Registering installation for xchat-1.3.8
#
正如你所看到的,唯一的不同是那些告诉你系统是从哪儿找到port 行的。在下一节中,
你将学到如何从你的系统中删除一个port。
4.4.3. 删除已经安装的port
现在你已经知道如何安装ports 了,你大概想知道如何删除它们吧。例如,已经安装好
了一个port,不久发现安装的是一个错误的port。下面的段落将谈到这些问题。
现在我们将删除我们刚才安装的xchat。正如安装ports 时一样,第一件事情是你必须
改变port 的目录。如果你记得的话,那应该是/usr/ports/irc/xchat。你改变了目录后,
你就要准备删除xchat 了。你可以执行下面的反安装程序:
# cd /usr/ports/irc/xchat
第11 页FreeBSD 使用手册
# make deinstall
===> Deinstalling for xchat-1.3.8
#
就这么简单。你现在已经把xchat 从你的系统中删除掉了。如果你想再重新安装它的话,
你可以在/usr/ports/irc/xchat目录下执行make reinstall 命令。
4.5.安装中出现的问题
4.5.1. 一些问题与解答
4.5.1.1.我认为应该作一个有关modem 的讨论?
哦,你必须想到你电脑的串口。我们使用串口从一个Unix 系统到另一个系统传送程序。
4.5.1.2.应该用package 来安装额外的程序?
是的,通常这是最快速、最简单的方法。
4.5.1.3.为什么用port 来烦人呢?
几个原因:
1,一些软件的发布许可可能不允许采用二进制的方式分发。它们必须采用源代码的方
式分发。
2,一些人不信任二进制分发。至少带上源代码,你可以自己阅读,寻找可能存在的问
题。
3,如果你有本地的补丁,那你可能在打补丁的时候需要源代码。
4,你可能在程序的编译方式上与做这些程序的人有不同的看法。无论是建构调试版,
还是把它们分开,一些人喜欢采用最优化的设置来编译以达到最强大。通常发布的
软件包在设置方面都是比较保守的。如果port 对一个特殊的处理器在使用代码上有
一个编译选项,或是需要支持一个额外的设备,你可能需要亲自对这个port 进行编
译,不需要为提供每一个额外的支持而生成许多不同的软件包。有很多这样的例子。
如果一个软件包可能对一些特殊尺寸的纸张提供了默认的支持,那我们就要提供多
种软件包,每一种对应一种尺寸的纸张。
5,一些人喜欢围着代码转。如果它们觉得无聊,或想攻克它,或想从中学点东西,诸
如此类的,它们可能会去读它。
6, 如果你不能得到源代码,那它就不是软件了。
4.5.1.4. 什么是补丁?
一个补丁(patch)是一个小文件,主要描述文件如何从一个版本升级到另一个版本。
第12 页FreeBSD 使用手册
它一般是纯文本的,基本上说是些象“delete line 23”,“add these two lines after line
468”,或“change line 197 to this ”这样的东西。它们以diff 闻名,因为它们是由diff
这个程序产生。
4.3.1.5. tarball 是指什么?
它就是以.tar 结尾的文件,或者是诸如以.tar.gz,.tar.Z,.tar.bz2,.tgz 结尾的文件。
基本上,它是一个已经被打包或压缩的目录树。这种技术最早被用于磁带机上,但后来它被
广泛运用于互联网上用来发布程序源代码。你可以看到在它里面有些什么文件,甚至你可以
亲自使用标准的UNIX tar 程序解开它们,只要这样做:
% tar tvzf foobar.tar.gz
% tar xzvf foobar.tar.gz
% tar tvf foobar.tar
% tar xvf foobar.tar
4.5.1.6. 那checksum 呢?
这是一个由统计检查文件里所有资料而产生的数字。如果有任何字符改变了,那
checksum 就不会再跟统计的结果一样,所以经过简单的比较就可以看出差异。
4.5.1.7. 我照上面说的方法从光盘编译port 都很顺,怎么一安装kermit 就出错?
# make install
>> cku190.tar.gz doesn't seem to exist on this system.
>> Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.
为什么找不到,难道这张光盘没有用?
就像在从光盘编译ports 那节所解释的,有些port 因为授权的限制不能放进光盘。Kermit
就是个例子。Kermit 的授权不允许把它做的tarball 放进光盘,所以必须自己动手下载
------真是抱歉!
会有这些错误信息是因为当时没有连上网络。只要从MASTER_SITES (列在Makefile 里)中
所列的任一个网站把文件下载下来,就可以重新开始安装的步骤了。
4.5.1.8. 我照做了,可是当要把文件放进/usr/ports/distfiles 时却得到没有许可的错误
信息。
Port 的机制是到/usr/ports/distfiles 中找tarball,可是因为它是符号连接(symlink)
到光盘的,所以那个目录只读而且也没有办法复制任何东西进去。用下面说的方法就可以让
它去找其它地方:
第13 页FreeBSD 使用手册
# make DISTDIR=/where/you/put/it install
4.5.1.9. Ports 的设计是只有把所有东西都放在/usr/ports 下才能用吗?系统管理员说要
把所有东西都放在/u/people/guests/wurzburger 下,不过这样好象不能用。
可以用PORTSDIR 和PREFIX 这两个变量来告诉port 用别的目录。例如,
# make PORTSDIR=/u/people/guests/wurzburger/ports install
会在/u/people/guests/wurzburger/ports 里编译port 并把所有东西安装在/usr/local 下。
# make PREFIX=/u/people/guests/wurzburger/local install
会在/usr/ports 里编译port 并安装至/u/people/guests/wurzburger/local。毫无疑问的,
# make PORTSDIR=.../ports PREFIX=.../local install
会结合这两种(要在这页完整的写出来太长了,不过它应该给你点概要了)。如果不想每次安
装一个port 就要把这些字再打一次,把这设置放到环境变量里会是个好主意。读读shell
的联机手册来获得做这些事的指导。
4.5.1.10. 我没有FreeBSD 的光盘,不过我想要把所有的tarball 放在手边,这样就不用
每次装一个port 就要等待下载。有什么好方法可以一次全下载下来吗?
要得到ports collection 每个tarball 的话,执行:
# cd /usr/ports
# make fetch
4.5.1.11. 我知道从临近的FreeBSD mirror 站下载比较快。可是有办法从其它
MASTER_SITES 上面没有的站下载port 吗?
可以。如果知道的话,例如ftp.FreeBSD.org 比MASTER_SITES 上面列的任何站都近,
那就这么做:
# cd /usr/ports/Directory
# make
MASTER_SITE_OVERRIDE=ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/
fetch
4.5.1.12. 要怎样在make 去下载文件前先知道所需的文件?
make fetch-list 会列出一个port 所需的文件。
4.5.1.13. 有办法在port 编译前停止吗?我想在它安装前hack 一下程序代码,不过每次
都要边看边按control-C 很讨厌。
用make extract 会在源代码下载完并解开后停止。
第14 页FreeBSD 使用手册
4.5.2. 帮助!Port 损坏了
如果你遇到port 不能用了,可以这样做:
1. 修复它!在“如何编译一个port”那一节能帮助你这样做。
2. 遇到困难时,可以通过email 寻求帮助!只需要发一封email 给port 的维护者。输入
make maintainer 或读一下Makefile 文件找到维护者的email 地址。记住要包括这个
port 的名称和port 的版本,还有遇到的错误。如果你没有得到维护者的回复,你可能
要使用send-pr 命令提交一个bug 报告。
3. 忘掉它吧!这是一个最好的解决办法,很少的ports 能被分为“不可或缺的”。有时当
一个port 升级时,一些问题可能会被修复。
4. 可以从你附近的ftp 站点上下载一些升级包。主力站点是ftp.freebsd.org,在它的
Packages directory 中有很多“主要的”软件包。但你最好先检查一下当地的镜象站
点!因为这样工作起来可能要快一点。使用pkg_add 程序将这些软件包安装到你的系统。

标签: