第十章 软件安装
安装了 FreeBSD 后,您一定还会需要安装其它非 FreeBSD 内附的软件。在 FreeBSD 上安装软件有许多种方法,我们将一一为各位介绍。
本章包含了下列软件安装必备的课题:
10.1 概论
传统上,要在一个 UNIX 系统上安装其它软件时,有几个步骤:
当然,我们可以在 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 的优点:
ports 的优点:
接着我们就针对 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 这个指令来安装它。下面是一个简单的范例,使用 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 的目录:
或者我们也可以到 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"
|
10.6 传统安装方式
我们介绍了 FreeBSD 独有的 package 及 port 安装方式后,接下来我们还是要详细说明一下传统上在 UNIX 机器上安装软件的方式。
有的时候,我们要想要装的软件可能不在 port 里,或者 port 中的软件版本尚未更新,这时候我们就必须使用传统的安装方式来安装软件。基本上,传统安装方式就像本章开头所说的,大多必须要有下列步骤:
我们以 MySQL 这个软件为例。
下载及解压缩
首先我们到 MySQL 网站上下载最新的原始码。一般原始码大多以指令 tar 包成一个档案,再压缩成 gzip 或是 bzip2 格式。所以您下载的档案扩展名大多为 .tar.gz、.tgz、或是 .tar.bz2。
扩展名为 .tar.gz 或是 .tgz 的档案为 tar + gzip 格式,MySQL 的原始码就是这一种类型。我们可以使用下列指令来解压缩:
# tar zxvf mysql-4.1.13.tar.gz
如果扩展名为 .tar.bz2 的档案,则是 tar + bzip2 的格式,遇到这种格式时,我们可以使用下列指令解压缩:
# tar jxvf mysql-4.1.13.tar.bz2
我们可以看到上述二种格式都可以使用 tar 来解压缩,只是 gzip 格式必须使用参数 z,而 bzip2 的格式必须使用参数 j。指令 tar 的其它参数所代表的意义为:x 是解开的意思、v 是要观看解开的过程、f 是指定要解压缩的文件名称。
解开之后,我们就可以进入下一步开始安装。
查看说明档
每个软件在安装上大同小异,但有的软件除了一般安装流程外,可能还有自己独特步骤。所以在安装之前,我们必须先看一下说明档,以了解如何进行安装。
大部份的开放原始码软件都会有 README 或是 INSTALL 这二个档案,用以说明安装的步骤。有的软件可能有其它档案,但我们可以从档名了解应该要看哪一个说明档。以 MySQL 为例,在它的原始码包装中,有一个档名为 INSTALL-SOURCE 的档案,应该就是我们要看的安装说明档。我们使用文书编辑器打开该档后,可以看到一些关于安装的说明。MySQL 的说明档写的蛮详细的,但我们可以将重点放在 Installation 的地方:
2.8.1 Source Installation Overview ---------------------------------- The basic commands you must execute to install a MySQL source distribution are: shell> groupadd mysql shell> useradd -g mysql mysql shell> gunzip < mysql-VERSION.tar.gz | tar -xvf - shell> cd mysql-VERSION shell> ./configure --prefix=/usr/local/mysql shell> make shell> make install shell> cp support-files/my-medium.cnf /etc/my.cnf shell> cd /usr/local/mysql shell> bin/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql var shell> chgrp -R mysql . shell> bin/mysqld_safe --user=mysql & |
我们可以看到它的安装步骤写的很详细,还有指令范例。简单来看,应该就是要先增加一个使用者为 mysql,并增加 mysql 群组。接着再解压缩原始码、进行编译、安装、并做一些安装后的设定。
编译
在 MySQL 的安装步骤中,编译前要先进行 configure。事实上,大多数的开放原始码软件编译流程都使用下列三个步骤:
# ./configure # make # make install
第一个指令是 configure,这个指令可以用来检查您目前系统的设定,并依您的使用环境决定要不要加入某些功能。您也可以使用下列指令查看 configure 指令中可以使用哪些参数:
# ./configure --help | more
原则上,除非有特殊要求,否则我们直接执行 configure 即可。以 MySQL 为例,我们在 configure 指令后面加上下列参数:
# ./configure --prefix=/usr/local/mysql \ --with-low-memory \ --with-charset=big5
我们使用 --prefix 以指定要安装的路径,这是所有使用 configure 的软件都会有的参数。另外,我们还指定编译时不要使用太多内存 (--with-low-memory),并设定 MySQL 支持中文字集 (--with-charset=big5)。
执行完 configure 检查环境并设定安装的项目后,我们就可以使用 make 来进行编译。指令 make 会呼叫编译器 gcc 来将原始码转换成执行档。
安装
编译完后,我们可以使用下列指令安装:
# make install
您可以看到程序安装的过程。安装完成后,我们必须依不同的软件要求进行安装后的设定。以 MySQL 为例,我们必须先使用 mysql_install_db 以初始化数据库,并将一些目录的拥有者设定为 mysql。
最后就可以启动 mysql 了。而如果我们要在开机时启动 MySQL,必须将它的启动指令加入 /etc/rc.local 中,或是在 /usr/local/etc/rc.d 中加入一个 mysql.sh 并将启动的指令写在该档案中,然后将 mysql.sh 设为可执行。如此一来,FreeBSD 在开机时就会自动执行它。
以上就是一般传统软件安装的流程:configure、make、make install,其实使用上也不太难。
|