第4章 安装应用程序:Packages和ports
4.1 概要
FreeBSD捆绑了很多系统工具作为基本系统的一部分。然而,在实际工作中,你可能仍需要安装额外的第三方应用程序。FreeBSD提供了两种安装第三方应用程序的方法:FreeBSD ports collection和二进制软件包(package)。无论用哪种方式,你都可以从本地媒体(设备)或直接通过网络来安装你喜欢的最新版本的应用程序。
读完这章,你将了解到:
如何安装第三方的二进制软件包。
如何从ports collection安装第三方软件。
如何删除先前安装的软件包。
4.2软件安装预览
如果你在安装第三方应用软件之前,就已经使用过UNIX系统了,那大概的安装情况是这样的:
1. 下载软件,可能是源代码形式或二进制形式。
2. 用compress或gzip来解开软件。
3. 阅读相关文档,了解如何安装。
4. 如果软件是以源代码形式发布的,先编译。这可能需要编辑一个makefile文件,或运行一个配置脚本和其他一些工作。
5. 测试和安装软件。
如果一切顺利的话,就这么简单。如果你在安装一个软件包时发生一些错误,你可能需要编辑一下代码,以使它能正常工作。
你可以继续使用传统的方式安装软件。然而,FreeBSD提供了两种技术:packages和ports。就在写这篇文章的时候,已经有超过5900个第三方的应用程序可以使用了。
FreeBSD的应用程序包是一个可以下载的文件。这些包包含了预编译的拷贝,还有一些配置文件或文档。一个下载的包文件可以用FreeBSD的包管理命令来操作,例如pkg_add,pkg_delete,pkg_info等等。
用这种方法,安装一个新的应用程序可以用一个简单的命令来完成。一个FreeBSD的port是一个可以自动从源代码编译成应用程序的文件集合。记住,如果你自己来编译的话,需要执行很多步的操作(解压,补丁,编译,安装)。这些整理port的文件集合包含了系统需要完成这个工作的必需信息。你可以运行一些简单的命令,那些源代码就可以自动地下载,解开,打补丁,编译,直至安装完成。
实际上,ports系统也可以被用来产生需要用pkg_add和不久就要讲到的其他包管理命令来安装的软件包。
Packages和ports是互相依赖的。假设你想安装一个依赖于已经安装的特定库的应用程序。应用程序和那个库都已经应用于FreeBSD ports和packages。如果你使用pkg_add命令或ports系统来添加应用程序,两个都必须注意库是否被安装,如果没有,需要先安装库。
这里给出的两种技术是很相似的,你可能会奇怪为什么FreeBSD会弄出这两种技术。其实,Packages和ports都有它们自己的长处,使用哪一种完全取决于你自己的喜好。
Package的优点
一个压缩的package通常要比一个压缩的包含源代码的应用程序小得多。
package不需要进行额外的编译。对于很大的应用程序如Mozilla,KDE或GNOME,这点很重要,特别是在你的系统比较小的情况下。
包不需要你一定要知道如何在FreeBSD上编译软件的详细过程。
Ports 的优点
package在编译时通常比较保守,因为他们必须运行在比较大型的系统上。通过从port安装,你可以细微调整编译选项来产生适合于处理器的代码。
一些软件包已经把与它们相关的能做和不能做的事情的选项都编译进去了。例如,Apache可能就配置进了很多不同的组选项。你从port中建立软件,不一定要接受默认的选项,你可以自己来设置。
在一些例子中,多个package需要为同一个应用程序指定某个设置。例如,Ghostscript可以使用ghostscript package和ghostscript-nox11 package,这取决于你是否安装了X11服务器。这样的略微调整对package是可能的,但如果一个应用程序有超过一个或两个不同的编译时钟选项时,就不行了。
一些软件的许可条件禁止采用二进制形式发行。它们必须带上源代码。
一些人不信任二进制发行形式。至少有了源代码,可以亲自阅读它,寻找潜在的问题。
如果你要对软件打补丁,你就需要有源代码。
一些人喜欢整天围着源代码转,所以他们喜欢亲自阅读源代码,修改源代码等等。
这章的其余部分将介绍如何使用packages和ports来安装和管理第三方软件。
4.3 寻找你要的应用程序
在你安装任何应用程序之前,需要知道你需要什么,那个应用程序叫什么。FreeBSD中可用的应用程序正在不断地增长着。幸运的是,有许多方法可以找到你所需要的程序。
FreeBSD站点上拥有一个可以搜索到的当前所有可用的应用程序列表,在(http://www.FreeBSD.org/ports/)上。它分很多种类,你既可以通过程序的名称来搜索,也可以在分类中列出所有可用的应用程序。
Dan
Langille维护着网站FreshPorts(http://www.freshports.org/)。FreshPort时刻追踪着在ports中应用程序的变化。当有任何程序被升级时,他们就会发email提醒你。
如果你不知道你想要的应用程序的名字,可以通过FreshMeat (http://www.freshmeat.net/) 或AppWatch
(http://www.appwatch.com/)这样的网站来寻找。如果应用程序被找到了,你可以回FreeBSD的主站去看一下这个应用程序是否已经被port进去了。
4.4 使用package系统
4.4.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.
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的安装盘(如FreeBSD cdrom),可以执行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都把package放在/packages目录中。packages的设计与/usr/ports树很相似。每个分类都有它自己的目录,每个package也能在所有目录下找到。Package系统的目录结构是与port的目录结构相对应的;它们以package/port的形式互相协调工作。
4.4.2删除一个package
要删除先前安装的软件package,只要使用pkg_delete工具。
# pkg_delete xchat-1.7.1
#
4.4.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
=
...
在第二列的符号指出了安装版本的相关时间和本地ports目录树中可用的版本。
|
符 号 |
含 义 |
|
= |
在本地ports树中与已安装的软件包相匹配。 |
|
< |
已安装的版本要比在ports树中的版本来得老。 |
|
> |
已安装的版本要比在ports树中的版本来得新。 |
|
? |
已安装的软件包无法在ports索引中找到。 |
|
* |
软件包有很多版本。 |
4.4.4其他一些
所有的package信息都保存在/var/db/pkg目录下。已安装文件的列表和每个package的内容和描述都能在这个目录的相关文件中找到。
4.5使用Ports Collection
下面的章节提供了使用ports collection来安装或卸载程序的基本用法。
4.5.1 安装Ports
当提到Ports collection时,第一个要说明的就是何谓“skeleton”。简单地说,一个port skeleton是让一个程序在FreeBSD上简洁地编译并安装的所需文件的最小组合。每个port skeleton包含:
一个makefile。makefile包括好几个部分,指出应用程序是如何编译的和它将被安装在系统的哪个地方。
一个distinfo文件。这个文件包括这些信息:这些文件需要被下载后才能建立,需要checksums,确保在下载过程中文件不会被破坏。
一个files目录。这个目录包括在你的FreeBSD系统上编译和安装程序需要用到的补丁。这些补丁基本上都是些小文件,指出特定文件作了哪些修正。
它们是一些纯文本的格式,基本上是这样的“Remove line 10”或 “Change line 26 to this”。这些补丁以“diffs”出名,因为它们是用diff程序来产生的。这个目录也包含了其它在建立port时要用到的文件。
一个pkg-comment文件。这是一行程序的描述。
一个pkg-descr文件。这是一个提供更多细节,有多行的程序描述文件。
一个pkg-plist文件。这是即将被安装的所有文件的列表。它告诉ports系统在重新安装时什么文件需要被删除。
现在,你已经了解了足够的ports collection的背景信息,你可以准备安装port了。共有两种安装方法,下面具体介绍。
在你安装之前,你需要选择一个安装的port。有几种方法可以来这样做,最容易的方法是到FreeBSD的网站上查看port的列表。每个port都有一个描述文件,你需要在安装之前先浏览一下。你可以通过浏览port列表或使用网站的搜索功能。每个port也包括一个描述,所以你可以在安装它之前阅读一下每个port的介绍。
另外一种方法是使用whereis命令。只需要输入“whereis <你想安装的程序>”,如果能被系统找到,你就会看到它的保存路径:
#whereis lsof
lsof: /usr/ports/sysutils/lsof
#
这个命令告诉你lsof(一个系统工具)能在/usr/ports/sysutils/lsof目录中找到。
另外一种查找port的方法是使用ports collection内建的搜索功能。要使用这个功能,你先要进入/usr/ports目录,然后运行make search key=program-name,这里的“program-name”就是你要找的程序的名称。例如,如果你要找lsof:
# cd /usr/ports
# make search key=lsof
Port:
lsof-4.56.4
Path:
/usr/ports/sysutils/lsof
Info:
Lists information about open files (similar to fstat(1))
Maint:
obrien@FreeBSD.org
Index:
sysutils
B-deps:
R-deps:
你要密切注意输出内容的“Path:”行,它告诉你能在哪儿找到它。其他的信息是在安装port时不需要的,在这里就不提了。
注意: 你必须具有root权限才能安装port。
从CDROM安装port
做这一步的前提是你有一张FreeBSD的安装光盘。如果你没有,可以从FreeBSD商店订购一张(www.freebsdmall.com)。在确信光盘已经放入光驱之后,需要先挂上/cdrom,才可以安装port。开始,改变目录到你要安装的port所在的目录:
# cd /usr/ports/sysutils/lsof
一旦进入lsof目录,你就可以看到port skeleton文件了。下面要编译port。只需要在命令行简单地输入make命令。做好之后,你可以看到下面的信息:
# make
>>>lsof_4.57D.freebsd.tar.gz
doesn`t seem to exist in /usr/ports/distfiles/.
>>>Attempting
to fetch from file:/cdrom/ports/distfiles/.
===>Extracting
for lsof-4.57
...
[extraction
output snipped]
...
>>>Checksum
OK for lsof_4.57D.freebsd.tar.gz.
===>Patching
for lsof-4.57
===>Applying
FreeBSD patches for lsof-4.57
===>Configuring
for lsof-4.57
...
[configure
output snipped]
...
===>Building
for lsof-4.57
...
[compilation
snipped]
...
#
注意,一旦编译完成,你需要回到你的命令行。下面就安装port,在命令行输入make install:
# make install
===>Installing
for lsof-4.57
...
[install
routines snipped]
...
===>Generating
temporary packing list
===>Compressing
manual pages for lsof-4.57
===>Registering
installation for lsof-4.57
===>SECURITY
NOTE:
This port
has installed the following binaries which execute with
increased
privileges.
#
回到命令行后,你就可以运行刚才安装的应用程序了。由于lsof是一个需要拥有更高特权才能运行的程序,所以会出现一个安全警告。在建立和安装port的过程中,你必须注意系统出现的任何警告。
注意:你也可以只运行make install,把make和make
install两步并作一步来执行。
请记住有些port由于许可证的原因,不允许通过cdrom来安装。这可能有很多原因,包括在下载安装前需要注册,重新发布没有得到许可等等。如果你希望安装一个cdrom上没有的port,你可能需要在线安装。
通过internet安装port
正如前一节所讲到的,这一节假定你已经连接到Internet上了。如果没有的话,你只好通过CDROM来安装了。
通过Internet安装一个port,实际上跟你通过CDROM安装是一样的。两者之间唯一的不同是程序的源代码是从Internet上而不是从CDROM上下载。
有关的步骤是一样的:
# make install
>>>lsof_4.57D.freebsd.tar.gz
doesn’t seem to exist in /usr/ports/distfiles/.
===>Attempting
to fetch from ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.
Receiving
lsof_4.57D.freebsd.tar.gz (439860 bytes): 100%
439860
bytes transferred in 18.0 seconds (23.90 kBps)
===>Extracting
for lsof-4.57
...
[extraction
output snipped]
...
>>>Checksum
OK for lsof_4.57D.freebsd.tar.gz.
===>Patching
for lsof-4.57
===>
Applying FreeBSD patches for lsof-4.57
===>Configuring
for lsof-4.57
...
[configure
output snipped]
...
===>Building
for lsof-4.57
...
[compilation
snipped]
...
===>Installing
for lsof-4.57
...
[install
routines snipped]
...
===>Generating
temporary packing list
===>compressing
manual pages for lsof-4.57
===>
Registering installation for lsof-4.57
===>
SECURITY NOTE:
This port
has installed the following binaries which execute with
increased
privileges.
#
正如你所看到的,唯一的不同是那些告诉你系统是从哪儿找到port行的。在下一节中,你将学到如何从你的系统中删除一个port。
4.5.2 删除已经安装的port
现在你已经知道如何安装port了,你大概想知道如何删除它们吧。例如,已经安装好了一个port,不久发现安装的是一个错误的port。下面的段落将谈到这些问题。
现在我们将删除我们刚才安装的lsof。正如安装port时一样,第一件事情是你必须改变port的目录。如果你记得的话,那应该是/usr/ports/irc/lsof。你改变了目录后,就要准备删除lsof了。你可以执行下面的deinstall程序:
# cd /usr/ports/irc/lsof
# make deinstall
===>
Deinstalling for lsof-4.57
就这么简单。你现在已经把lsof从系统中删除掉了。如果你想再重新安装它的话,可以在/usr/ports/irc/lsof目录下执行make reinstall命令。
4.6 安装中出现的问题
下面这些将介绍有关ports collection的经常会问到的问题,和一些基本的解决问题的方法,以及如果一个port坏掉了该怎么办。
4.6.1一些问题与解答
1.我认为应该作一个有关modem的讨论?