谈谈FreeBSD软件安装方法
了 FreeBSD 后,您一定还会需要其它非 FreeBSD 内附的软件。在 FreeBSD 上软件有许多种,我们将一一为各位介绍。
本章包含了下列软件必备的课题:
* 各种方式的优缺点。
* 如何使用 package。
* 如何使用 port。
* 如何使用传统自行编译软件。
10.1 概论
传统上,要在一个 UNIX 上其它软件时,有几个步骤:
* 下载该软件,有可能是 binary 档或是原始码。
* 解压缩该档案,通常是以 tar 或 gzip 压缩的。
* 读一下该目录中的说明文件,可能是 readme 或是 doc/ 的文件,来了解如何该软件。
* 如果所下载的是原始码,可能要先编辑一下 Makefile 或是执行 configure,接着再编译该软件。
* 最后再测试与。
当然,我们可以在 FreeBSD 上使用传统的方式来软件,但是还有更简单的选择。FreeBSD提供了 package 和 ports 这二种简单的软件方式。
所谓的 pakcage 是别人帮你将程序编译成 binary 文件,并定义了该在什么地方。我们只要下载一个压缩档,并使用 pkg_add 这个指令就可以快速的将软件在 FreeBSD 上。这是软件最简单的步骤,所的东西也是最标准的,和自己依需求修改并编译原始码比较起来较缺乏弹性。
而 port 就是使用原始码来软件。我们只要进入 /usr/ports/ 里想要的软件目录中,打指令 make install 就可以完成了。FreeBSD 己经帮我们定义了该软件所须的步骤、所要求的其它套件。不管是 package 或是 ports,当的软件需要依靠其它软件才能继续时,它们会自动帮你该软件。所有好的软件都将记录在 /var/db/pkg 中,日后如果我们想要移除软件时,可以用一个简单的指令 pkg_delete 加上软件名称就可以了。
即然 port 这么好用,为什么 FreeBSD 要同时有 package 和 ports 呢?我们来比较一下 ports 和 package 的优点:
package 的优点:
* 一个己经编译过的压缩档通常比包含原始码的档案还要小。
* 使用 pakcage 并不需要再做任何的编译动作,如果你的计算机速度很慢,在像 KDE、GNOME 等大型软件时,不用编译可以省下很多时间。
* 使用 package 来软件时,你不必事先了解在 FreeBSD 上编译时所使用的软件及其过程。
ports 的优点:
* package 为了要在多数的计算机执行,考虑兼容性问题,通常编译的比较保守。而使用 ports 你可以依自己的修改,例如选择使用 Pentium III 或是 Athlon 的处理器。
* 在编译 package 时,就已经限制了该软件的功能,无法再依自己需求扩充。例如 Apache 这套软件就有许多的功能可以在编译时挂进来,使用 ports 来时,你可以依自己的需求来加以修改。
* 我们可以经由更新 Port Tree 来使用较新的软件,而 package 通常只和一起 release。
* 有些软件不允许使用 binary 文件的方式散播,只能下载原始码。
* 有了原始码,你可以自己修改并加以应用。
* 有的人喜欢拥有原始码,他们可以读它、从中学习。
接着我们就针对 package 及 ports 来说明它们的使用方式。
10.2 使用 package
10.2.1 Package
package 有二种方式,第一种是使用 sysinstall (也就是我们 FreeBSD 时所看到的画面) 来,另一种是使用手动。使用 sysinstall 时,我们必需选择的来源,最常使用的来源是及光盘片。但是由于光盘片容量有限,所以在 FreeBSD 光盘中所含的 package 软件数量并不多,因此我通常都选择使用。而使用手动必须自行抓回所需的档案,并以指令。以下我们就分别针对这二种方式来说明:
方式一:使用 sysinstall
假设我们要在 FreeBSD 上收信的软件 pine,首先我们要执行 sysinstall 以进入时的画面:
# sysinstall
图 10-1
接着选取 Configure选项,进入图 10-2 的画面:
图 10-2
我们选 Packages 选项来 package:
图 10-3
在图 10-3 中,我们必须选择来源,在这里我们选择 FTP ,从 FTP 中我们可以找到较多的软件。选择了 FTP 之后,将出现图 10-4 的画面,让我们选择要使用哪一个 FTP 站台:
图 10-4
我们选择「URL」来自订要使用的 FTP 站台。接着便会出现一个要求我们输入站台地址的窗口,如图 10-5 所示,假设我们要使用交大资工的站台,则输入 freebsd.csie.nctu.edu.tw/pub/releases/i386/:
图 10-5
输入站台后,会问您是否要使用目前的设定。如果我们己经连上,则选 YES,否则请选 NO 来设定。接着会出现一个软件分类选单,这一份分类选单将各个软件分门别类放在不同的选项下,其中 All 是所有软件的所在,如图 10-6。
图 10-6
我们以邮件软件 pine 为例,由于 pine 位于 mail 分类下,所以我们选择mail。如果您要中文版本的 pine ,应该选择 Chinese 选项而非 mail。选择了 mail 之后,将出现 mail 分类下的所有软件,我们选 pine-4.58 这一项,如图 10-7:
图 10-7
选了pine 之后,就可以选 OK 回到前一个分类画面,接着按照这种方式选了其它我们要的软件之后,就可以选「Install」来了。选了 Install 之后,将出现所有我们已选取的软件列表,如图 10-8,如果要继续则选 OK 即可。
图 10-8
方式二:使用手动
如果以手动的方式,我们必须先取回所要的package。只要是 package ,它的扩展名就是 .tgz。我们可以用 pkg_add 这个指令来它。狼蚁网站SEO优化是一个简单的范例,使用 package 来 lsof-4.66.1.tgz:
# ftp -a freebsd.csie.nctu.edu.tw
Connected to freebsd.csie.nctu.edu.tw.
220---------- Welcome to Pure-FTPd ----------
220-You are user number 139 of 200 allowed.
220-Local time is now 17:49. Server port: 21.
220-Only anonymous FTP is allowed here
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
331 Any password will work
230 Any password will work
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /pub/FreeBSD/ports/packages/sysutils/
250 CWD command successful.
ftp> get lsof-4.71.tgz
local: lsof-4.71.tgz remote: lsof-4.71.tgz
227 Entering Passive Mode (140,113,17,209,189,16)
150-Accepted data connection
150 96.1 kbytes to download
100% |*********************************************************| 98372 136.87 KB/s 00:00 ETA
226-File successfully transferred
226 0.362 seconds (measured here), 265.35 Kbytes per second
98372 bytes received in 00:00 (136.70 KB/s)
ftp> bye
221-Goodbye. You uploaded 0 and downloaded 97 kbytes.
221 Logout.
# pkg_add lsof-4.71.tgz
要使用 package 软件,首先必须取得想要的软件。我们可以先 ftp 到各大学 FTP 站台去取得。packaeg 的副档案是 .tgz,可以在各 FTP 站台的 ports/packages 中取得。以交大资工的 FTP 站而言是放在 ftp://freebsd.csie.nctu.edu.tw/pub/ports/packages ;而中央资工的 FTP 是放在 ftp://freebsd.csie.ncu.edu.tw/FreeBSD/ports/packages 。当进入 ports 的目录后,我们会发现还有一堆目录,您可以依您的版本选择要使用哪一个目录,其中 packages 这个目录包含了最新的 packages。如果您想要使用 packages-5.4-release 的 packages,我们就可以选择进入 packages-5.4-release 这个目录。进入这个目录后,又有一堆目录,这里的目录结构和你中 /usr/ports/ 下的目录一样,每个目录都是软件的分类,而 All 这个目录是所有软件。
如果您只知道想要的软件名称,却不知道版本及完整的档名,例如您要下载 popa3d 这个软件,但不知道是哪一版的,你可以先进入 All 的目录下,再以下列方式查询:
ftp> ls popa3d*
227 Entering Passive Mode (140,113,209,200,159,54)
150 Opening ASCII mode data connection for /bin/ls.
-r--r--r-- 1 FTP CSIE 19007 Nov 11 12:43 popa3d-0.6.4.1.tgz
226 Transfer complete.
ftp> get popa3d-0.6.4.1.tgz
找到了想要下载的版本是 0.6.4.1,接着就以 get 指令去取回该软件,最后下 exit 离开。
接着你就可以使用 pkg_add popa3d-0.6.4.1.tgz 来该软件。
10.2.2 管理 Package
如果我们后悔了,想要移除之前过的软件,可以下指令 pkg_delete popa3d-0.6.4.1 来移除 popa3d-0.6.4.1 这套软件,所有我们过的软件都会记录在 /var/db/pkg 的目录中。
我们可以使用 pkg_info 这个指令来得到软件的信息。例如在我们下载完一个 package 后,你想要知道这个软件的信息,以 popa3d-0.6.4.1.tgz 而言,如果我们想知道它的信息,你使用下列指令来取得:
# pkg_info popa3d-0.6.4.1.tgz
您也可以只打 pkg_info 来得知所有你过的软件有哪些。
10.3 使用 ports
如果你要使用 ports 软件,你必须先确认 /usr/ports 这个目录是否有。如果没有的话,使用 /stand/sysinstall 来 ports 的目录:
1. 以 root 执行 /stand/sysinstall
2. 选择 Configure 后按 Enter
3. 选择 Distributions 后按 Enter
4. 选择 ports 后按空格键
5. 选择 Exit 后按 Enter
6. 选择你要从 CDROM 或 FTP 等
7. 跟着选单照做,最后离开 sysinstall
或者我们也可以到 http://www.freebsd.org/ports/ 去手动抓回 port.tar.gz 这个档案,将它放在 /usr/ 下。并以下列指令来:
# cd /usr
# tar zxvf port.tar.gz
现在可以进入 /usr/ports 的目录中,软件了。
通常每一个软件都有一个独立的目录,而目录中都存在着一些档案,每个档案都有其特定用途,我们简列如下:
Makefile 软件的编译设定,您可以修改这个档案来设定我们在编译及软件时的参数。
README.html 我们可以经由浏览 README.html 来查看所有 ports 目录下的软件说明。
distinfo 说明所需要的档案及其 MD5 的检查数据。
pkg-comment 简单的软件描述。
pkg-descr 较详细的描述,我们通常可以在里面找到该软件网页的位置,使我们能到该网页得到更多信息。
pkg-plist 列出软件将的清单,后会放在硬盘中的什么地方。
如果您想某一个软件,却不知道它的目录位置,您可以使用 whereis 这个指令来找出它来。例如我们想 qpopper ,可以使用 whereis qpopper 来找出它所在的目录。 或者果我们只知道某个程序的关键词,确不知道它放在哪个目录,我们可以使用下列指令:
# cd /usr/ports
# make search key='关键词'
进入该目录后,最简单的方式是直接打 make install,就会自动去上抓取需要的软件回来。 ports 时,make 时找档案的顺序是:先去 /usr/ports/distfiles 、再去找 /cdrom/ports/distfiles、最后是中下载。如果您不使用的话,您可以自己去抓回软件,并将它放在 /usr/ports/distfiles/ 下,这样子在我们打 make install 时,就不会去上抓取档案。如果您所需档案存在光盘中,在软件之前,必须先将光驱 mount 在 /cdrom 中。。但有的软件并不会到光盘中去寻找档案,所以建议您还是将光盘中 /ports/distfiles 目录内容复制到 /usr/ports/distfiles 目录中,或者先连上吧。
当使用取得档案时,预设抓取档案的器通常在国外,因此,您可以修改 /etc/make.conf 来指定使用国内的 FTP 站台,例如编辑 /etc/make.conf 并加入:
MASTER_SITE_BACKUP?= \
ftp://freebsd.csie.ncu.edu.tw/distfiles/${DIST_SUBDIR}/ \
ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}
当完 ports 后,我们可以再下指令 make clean 来清除编译过程产生的档案,建议最好这么做,否则有的过程中产生大量档案可是很惊人的。如果您了一堆软件之后,才想到之前没有 make clean,没关系,在 ports 时,编译过程的档案都存在于该软件目录下的 work 目录中。我们可以使用下列指令来找出所有未 make clean 的软件,并将暂存数据删除:
# find /usr/ports -depth -name work -exec rm -rf {} \;
如果您使用,它会将所下载的原始码存在 /usr/ports/distfiles 中,当你下 make clean 后,并不会将它们清除。
当你完后,想要移除该软件时,只要在该软件的 ports 目录中打 make deinstall 即可。请注意,不要在 /usr/ports 的目录中打 make deinstall,这样可是会将 "所有" 软件都移除喔。
还有一些较不常用的 make 方式,简述如下:
make fetch:抓回所需的原始档。
make fetch-list:显示所需的档案。
make checksum:抓回原始档并以 MD5 检查其正确性。
make extract:抓回并解开原始档。
make configure:进行组态,但不继续编译。
make all install:抓回原始档、编译且。
make reinstall:若先前发生意外中断,以此命令继续尝试。
make package:将做好的 ports 打包制作成 packages。
如果完新的软件之后,如果使用的 Shell 是 Csh 或 Tcsh,我们可能必须执行指令 rehash 来重建 hash table,之后才能在所设定的指令路径中找到刚的程序,不然的话就必须输入该程序的完整路径或重新登入才能使用。
我们可以在 /var/db/pkg 的目录中看到我们已的软件,每一个软件有一个目录,目录中存放着软件的信息,包含了软件说明、到哪些目录中。有的软件要前,会要求先某一套软件,如果你事先没有它所要求的软件,通常该软件会自动帮你。所以我们会在 /var/db/pkg 下看到一些不是我们主动的软件。既然软件之间可能会相互依赖,我们要如何得知这些软件彼此间的关系呢?pkg_tree 这套软件可以让我们检视软件间的关系。我们可以使用 port 来这套软件:
# cd /usr/ports/sysutils/pkg_tree
# make install clean
之后我们就可以使用 pkg_tree | more 来看各个软件之间的关系了 (别忘了要 rehash 喔)。
10.4 更新 port tree
当 FreeBSD release 时,会事先测试过 ports 目录中的所有软件是否能正常。因为不同软件之间时常是相互依赖的,有的时候我们要 A 软件,会自动抓取所需要的其它软件。这些软件对于彼此的版本可能会有相互依赖,所以在 release 之前,ports 会暂停更新各个软件的版本,以确保 release 的版本能正常运作。
但在 release 之后,ports 目录中的软件版本可能已有更新,有的软件版本更新可能只是增加新的功能,而有的更新更涉及安全。如果您想使用 ports 软件最新的版本,在软件之前,我们可以先使用一些工具来更新整个 port tree。
有时候更新了 port tree 之后,因为版本相依问题,有些软件可能会因此而无法顺利,您只要在过几天后重新做一次 port tree 的更新应该就可以了。
更新 port tree 的很简单,我们可以使用 CVSup 来保持 ports 在最新状态。CVSup 是一套用来维持软件原始码和开发团队同步的工具,在我们执行了 CVSup 之后,它会经由向所设定的软件器检查并更新原始码的版本。我们可以使用 CVSup 来更新 port tree,也可以用来更新 /usr/src 目录下的 FreeBSD 原始码。
首先,我们必须 CVSup,因为我们不使用图形接口,所以 cvsup-without-gui:
# cd /usr/ports/net/cvsup-without-gui
# make install clean
在中有一份以 CVSup 更新 port tree 的设定文件范例,您可以直接加以修改或着先复制一份后再修改。我们将该设定文件范例复制到 /root 之后再加以修改:
# cp /usr/share/examples/cvsup/ports-supfile /root/
接着请以文书编辑软件打开 /root/ports-supfile 后,找到 host 的部份来设定所要使用的 CVSup 器。
# Defaults that apply to all the collections
#
# IMPORTANT: Change the next line to use one of the CVSup mirror sites
# listed at http://www.freebsd.org/doc/handbook/mirrors.html.
*default host=cvsup.tw.freebsd.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
# If your network link is a T1 or faster, comment out the following line.
*default compress
## Ports Collection.
#
# The easiest way to get the ports tree is to use the "ports-all"
# mega-collection. It includes all of the individual "ports-*"
# collections,
ports-all
# These are the individual collections that make up "ports-all". If you
# use these, be sure to comment out "ports-all" above.
#
# Be sure to ALWAYS cvsup the ports-base collection if you use any of the
# other individual collections below. ports-base is a mandatory collection
# for the ports collection, and your ports may not build correctly if it
# is not kept up to date.
#ports-base
#ports-archivers
#ports-astro
#ports-audio
#ports-benchmarks
………略…………
上面的范例中,我们将 CVSup 器设为 cvsup.tw.freebsd.org,这一台器是由交大资工所维护,您可以依您所在位置使用其它 cvsup1 ~ cvsup13.tw.freebsd.org 的器。例如 cvsup3 位于中山大学,cvsup13 是 giga 和信超媒体的器。最后一行的 ports-all 表示我们要更新 /usr/ports 目录下的所有档案。您也可以只更新其中的部份目录,只要将 ports-all 以井字号 "#" 标示起来,并将档案中 ports-base 那一行的 # 移除,接着您就可以依您所要更新的目录来要移除其它的 # 字号。例如,我们只要更新 /usr/ports/www 这个目录,将 ports-all 以 # 标示起来之后,我们还要移除 ports-base 及 ports-www 开头的 #。
设定完毕之后,我们就可以开始进行 ports 的更新了。
# cvsup -g -L 2 /root/ports-supfile
上述指令中,参数 g 表示不使用图形接口,而参数 L 及其后所跟随的数字 2 表示我们要看到更新过程的记录的详细程度,数字可以从 0 ~ 2,最后的档名表示所要使用的设定档。
在使用 ports 软件之前,先执行 CVSup 是一个不错的习惯,您可以随时取得软件的最新版本,不过您的机器一定要连上因特网才能进行更新。
10.5 使用 portupgrade 更新软件
在使用 Port 了一堆软件后,如果软件有新的版本出来怎么办?FreeBSD 的 ports 管理工具中有一个好用的软件 - portupgrade。
通常 ports 中的软件都有相依性,例如 Apache 会自动 libexpat、防垃圾信软件会自动一堆 Perl 模块。而在更新软件时,我们必须要确定更新过后,相依的软件都一并更新,才不会造成更新后有东西不能运作的情形。不过这并不表示我们一定要常常更新软件,建议您只有在必要时才使用 portupgrade 来更软件,不要有事没事就跑一次。因为软件并不是最新的就最好,没有人能保证更新的软件是否还维持您原本期望的行为。
portupgrade 在更新软件时,会保留您原本的设定档。例如,在更新 Apache 时,它会保留 httpd.conf 的设定。使用 portupgrade 是更新 ports 软件比较安全的方式。
在您使用 cvsup 更新 port tree 后,我们可以使用下列指令查看目前的软件版本是否和 port tree 中的版本一样:
# pkg_version -v
ispell-3.2.06_12 = up-to-date with port
jasper-1.701.0 = up-to-date with port
jpeg-6b_3 = up-to-date with port
kde-3.3.0 < needs updating (port has 3.3.1)
kdeaccessibility-3.3.0 < needs updating (port has 3.3.1)
... 略 ...
上列输出中需要更新的软件会有「< needs updating」的字样。您可以选择想要更新的软件,再使用 portupgrade 来更新。首先,我们必须使用 ports 来 portupgrade:
# cd /usr/ports/sysutils/portupgrade
# make install clean
如果您只想要升级某一个软件本身,而非所有相依的软件,只要使用 portupgrade pkgname 即可。如果您要升级所有和该软件相依的其它软件,则可以加上参数 -r。如果您要更新包含相依软件的相依软件,则可以使用参数 -R。另外,您可以使用参数 -m 来要求编译 (make) ports 时多传入一些参数,还可以使用参数 -f 要求就算版本一样也强制更新。
假设我们要更新的软件是 perl-5.8,我们可以使用下列指令来更新:
# portupgrade -rf "perl-5.8.*" -m "ENABLE_SUIDPERL=yes"