4.5. 使用Port套件集

Port套件集是指一数个Makefiles、修补及描述档案,每一组这些档案可用来编译与安装在FreeBSD上的一个应用程序,即称为一个Port

预设,Port套件集储存在/usr/ports的子目录下。

在应用程序可以使用Port编译之前,必须先安装Port套件集。若在安装FreeBSD时没有安装,可以使用以下其中一种方式安装:

过程 4.1. Portsnap方法

FreeBSD的基础系统内含Portsnap,这是一个可用来取得Port套件集简单又快速的工具,较建议多数使用者使用这个方式。此工具会联机到FreeBSD的网站,验证密钥,然后下载Port套件集的新复本。该密钥是要用来检验所有已下载档案的完整性。

  1. 要下载压缩后的Port套件集快照(Snapshot)到/var/db/portsnap

    # portsnap fetch
  2. 当第一次执行Portsnap时,要先解压缩快照到/usr/ports

    # portsnap extract
  3. 在完成上述第一次使用Portsnap的动作之后,往后可随需要执行以下指令来更新/usr/ports

    # portsnap fetch
    # portsnap update

    当使用fetch时也可同时执行extractupdate如:

    # portsnap fetch update
过程 4.2. Subversion方法

若要取得更多对Port树的控制,或若有本地的变更需要维护,可以使用Subversion来取得Port套件集。请参考Subversion Primer来取得Subversion的详细说明。

  1. 必须安装Subversion才可用来取出(Check out)Port树。若已存在Port树的复本,可使用此方式安装Subversion

    # cd /usr/ports/devel/subversion
    # make install clean

    若尚无法使用Port树,或已经使用pkg来管理套件,可使用套件来安装Subversion

    # pkg install subversion
  2. 取出Port树的复本:

    # svn checkout https://svn.FreeBSD.org/ports/head /usr/ports
  3. 若需要,在第一次Subversion取出后可使用以下指令更新/usr/ports

    # svn update /usr/ports

Port套件集中含有代表不同软件分类的目录,每个分类底下的子目录代表每个应用程序,每个内含数个用来告诉FreeBSD如何编译与安装该程序档案的应用程序子目录即称作Port Skeleton,每个Port Skeleton会含有以下档案及目录:

部份Port含有pkg-message或其他档案用来处理特殊情况。要取得有关这些档案的详细信息,以及Port的概要可参考FreeBSD Porter's Handbook

Port中并不含实际的源码,即为distfile,在编译Port解压缩时会自动下载的源码到/usr/ports/distfiles

4.5.1. 安装Port

下面我们会介绍如何使用Port套件集来安装、移除软件的基本用法。make可用的目标及环境变数详细说明可参阅ports(7)

警告:

在编译任何Port套件前,请先确认已经如前章节所叙述之方法更新Port套件集。安装任何第三方软件皆可能会导致安全性漏洞,建议在安装前先阅读http://vuxml.freebsd.org/了解Port已知的安全性问题。或者在每次安装新Port前执行pkg audit-F。此指令可以设定在每日系统安全性检查时自动完成安全性稽查以及更新漏洞数据库。要取得更多资讯,请参考pkg-audit(8)periodic(8)

使用Port套件集会假设您拥有可正常联机的网络,同时也会需要超级使用者的权限。

要编译并安装Port,需切换目录到要安装的Port底下,然后输入make install,信息中会显示安装的进度:

# cd /usr/ports/sysutils/lsof
# make install
>> lsof_4.88D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
===>  Extracting for lsof-4.88
...
[extraction output snipped]
...
>> Checksum OK for lsof_4.88D.freebsd.tar.gz.
===>  Patching for lsof-4.88.d,8
===>  Applying FreeBSD patches for lsof-4.88.d,8
===>  Configuring for lsof-4.88.d,8
...
[configure output snipped]
...
===>  Building for lsof-4.88.d,8
...
[compilation output snipped]
...

===>  Installing for lsof-4.88.d,8
...
[installation output snipped]
...
===>   Generating temporary packing list
===>   Compressing manual pages for lsof-4.88.d,8
===>   Registering installation for lsof-4.88.d,8
===>  SECURITY NOTE:
      This port has installed the following binaries which execute with
      increased privileges.
/usr/local/sbin/lsof
#

lsof是需要进阶权限才有办法执行的程序,因此当该程序安装完成时会显示安全性警告。一旦安装完成便会显示指令提示。

有些Shell会将PATH环境变数中所列目录中可用的指令做缓存,来增加在执行指这些指令时的查询速度。tcsh Shell的使用者应输入rehash来让新安装的指令不须指定完整路径便可使用。若在sh Shell则使用hash -r。请参考Shell的说明文件以取得更多资讯。

安装过程中会建立工作用的子目录用来储存编译时暂存的档案。可移除此目录来节省磁盘空间并渐少往后升级新版Port时造成问题:

# make clean
===>  Cleaning for lsof-88.d,8
#

注意:

若想要少做这个额外的步骤,可以编译Port时使用make install clean

4.5.1.1. 自定义Port安装

部份Port提供编译选项,可用来开启或关闭应用程序中的元件、安全选项、或其他允许自定义的项目。这类的应用程序例子包括www/firefoxsecurity/gpgme以及mail/sylpheed-claws。若Port相依的其他Port有可设定的选项时,预设的模式会提示使用者选择菜单中的选项,这可能会让安装的过程暂停让使用者操作数次。要避免这个情况,可一次设定所有选项,只要在Port skeleton中执行make config-recursive,然后再执行make install [clean]编译与安装该Port。

提示:

使用 config-recursive 時,會使用 all-depends-list Target 來收集所有要設定 Port 清單。建議執行 make config-recursive 直到所有相依的 Port 選項都已定義,直到 Port 的選項畫面不會再出現,來確定所有相依的選項都已經設定。

有许多方式可以重新进入Port的编译选项清单,以便在编译Port之后加入、移除或更改这些选项。方法之一是cd进入含有Port的目录并输入make config。还有另一个方法是使用make showconfig。最后一个方法是执行makermconfig来移除所有曾选择过的选项,让您能够重新设定。这些方法在ports(7)中都有详细的说明。

Port系统使用fetch(1)来下载档案,它支持许多的环境变数可设定。若FreeBSD系统在防火墙或FTP/HTTP代理服务器后面,可以设定 FTP_PASSIVE_MODEFTP_PROXY以及FTP_PASSWORD变数。请参考fetch(3)取得完整支持的变数清单。

对于那些无法一直联机到网际网络的使用者,可在/usr/ports下执行make fetch来下载所有的distfiles,或是可在某个分类的目录中,例如/usr/ports/net,或指定的Port Skeleton中执行。要注意的是,若Port有任何的相依,在分类或Port Skeleton中执行此指令并不会下载相依在其他分类的Port distfiles。可使用make fetch-recursive来下载所有相依Port的distfiles。

在部份少数情况,例如当公司或组织有自己的本地distfiles档案库,可使用MASTER_SITES变数来覆盖在Makefile中指定的下载位址。当要指定替代的位址时可:

# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.organization.org/pub/FreeBSD/ports/distfiles/ fetch

也可使用WRKDIRPREFIXPREFIX变数来覆盖预设的工作及目标目录。例如:

# make WRKDIRPREFIX=/usr/home/example/ports install

会编译在/usr/home/example/ports的Port并安装所有东西到/usr/local下。

# make PREFIX=/usr/home/example/local install

会编译在/usr/ports Port并安装到/usr/home/example/local。然后:

# make WRKDIRPREFIX=../ports PREFIX=../local install

来同时设定工作及目标目录。

这些变数也可做为环境变数设定,请参考您使用的Shell操作手册来取得如何设定环境变数的说明。

4.5.2. 移除已安装的Port

安装的Port可以使用pkg delete卸载。使用这个指令的示例可以在pkg-delete(8)操作手册找到。

或者,可在Port的目录下执行make deinstall

# cd /usr/ports/sysutils/lsof
# make deinstall
===>  Deinstalling for sysutils/lsof
===>   Deinstalling
Deinstallation has been requested for the following 1 packages:

	lsof-4.88.d,8

The deinstallation will free 229 kB
[1/1] Deleting lsof-4.88.d,8... done

建议阅读Port解除安装后的信息,若有任何相依该Port的应用程序,这些信息会被显示出来,但卸载的程序仍会继续。在这种情况下最好重新安装应用程序来避免破坏相依性。

4.5.3. 升级Port

随着时间推移,Port套件集中会有新版的软件可用。本节将说明如何检查是否有可以升级的软件及如何升级。

要检查已安装Port是否有新版可用,请先确定已安装最新版本的Port树,使用过程 4.1, “Portsnap方法”过程 4.2, “Subversion方法”中说明的指令来更新。在FreeBSD 10与更新的版本,或若套件系统已转换为pkg,可以使用下列指令列出已经安装的Port中有那些已过时:

# pkg version -l "<"

在FreeBSD 9.X与较旧的版本,可以使用下列指令列出已经安装的Port中有那些已过时:

# pkg_version -l "<"

重要:

在尝试升级之前,请先从档首阅读/usr/ports/UPDATING来取得最近有那些Port已升级或系统已安装。这个档案中会说明各种问题及在升级Port时可能会需要使用者执行的额外步骤,例如档案格式更改、配置文件位置更改、或任何与先前版本不兼容的问题。留意那些与您要升级Port相关的指示,并依照这些指示执行升级。

4.5.3.1. 升级与管理Port的工具

Port套件集含有数个工具可以进行升级,每一种工具都有其优点及缺点。

以往大多Port安装会使用PortmasterPortupgrade,现在有较新的Synth可使用。

注意:

那一种工具对特定系统是最佳的选择取决于系统管理员。建议在使用任何这些工具之前先备份数据。

4.5.3.2. 使用Portmaster升级Port

ports-mgmt/portmaster是可用来升级已安装Port的小巧工具,它只使用了随FreeBSD基础系统安装的工具,不需要相依其他Port或数据库便可在FreeBSD使用,要使用Port安装此工具可:

# cd /usr/ports/ports-mgmt/portmaster
# make install clean

Portmaster将Port定义成四种类型:

  • 根Port:没有相依且也不被任何其他Port相依。

  • 主干Port:没有相依,但被其他Port相依。

  • 分支Port:有相依,且其被其他Port相依。

  • 枝Port:有相依,但没有被其他Port相依。

要列出这几个分类并搜寻是否有新版:

# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> ispell-3.2.06_18
===>>> screen-4.0.3
        ===>>> New version available: screen-4.0.3_1
===>>> tcpflow-0.21_1
===>>> 7 root ports
...
===>>> Branch ports (Have dependencies, are depended on)
===>>> apache22-2.2.3
        ===>>> New version available: apache22-2.2.8
...
===>>> Leaf ports (Have dependencies, not depended on)
===>>> automake-1.9.6_2
===>>> bash-3.1.17
        ===>>> New version available: bash-3.2.33
...
===>>> 32 leaf ports

===>>> 137 total installed ports
        ===>>> 83 have new versions available

此指令用来升级所有过时的Port:

# portmaster -a

注意:

预设Portmaster会在删除已存在的Port前备份套件,若成功安装新版Portmaster会删除该备份。使用-b来让Portmaster不会自动删除备份。加入-i可启动Portmaster的互动模式,会在升级每个Port前提示信息。尚有许多可用的其他选项,请阅读portmaster(8)的操作手册来取得详细的用法。

若升级的过程发生错误,可加入-f来升级并重新编译所有Port:

# portmaster -af

Portmaster也可用来安装新的Port到系统,在编译及安装新Port前升级所有相依模块。要使用这个功能,要指定Port位于Port套件集中的位置:

# portmaster shells/bash

更多有关ports-mgmt/portmaster的信息可至其pkg-descr取得。

4.5.3.3. 使用Portupgrade升级Port

ports-mgmt/portupgrade是另一个可以用来升级Port的工具,此工具会安装一套可以用来管理Port的应用程序,它需要相依Ruby。要安装该Port:

# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

在执行升级之前使用此工具,建议使用pkgdb -F扫描已安装的Port并修正该指令回报的所有信息不一致的套件。

要升级所有安装在系统上过时的Port,可使用portupgrade -a,或者加上-i会在每个套件升级时询问确认:

# portupgrade -ai

要升级指定的应用程序而非所有可用Port可使用portupgrade pkgname,非常重要的是,要加上-R来先升级指定应用程序所有相依的Port:

# portupgrade -R firefox

若使用-PPortupgrade会先在PKG_PATH清单中的本地目录中搜寻可用的套件。若本地没有可用的套件,则会从远端下载。若套件无法在本地或远端找到,Portupgrade则会使用Port来安装。要避免完全使用Port安装,可使用-PP,这个选项会告诉Portupgrade若没有套件可用时放弃安装:

# portupgrade -PP gnome3

若只想要下载Port distfiles或套件,使用-P参数。若不要编译或安装任何东西,使用-F。请参考portupgrade的操作手册来取得所有可用选项的更多资讯。

更多有关ports-mgmt/portupgrade的信息可至其pkg-descr取得。

4.5.4. Port与磁盘空间

使用Port套件集会随着时间消耗磁盘空间。在编译与安装Port完之后,在Port Skeleton中执行make clean可清除暂存的work目录。若使用Portmaster来安装Port,则会自动移除该目录,除非使用-K。若有安装Portupgrade,此指令将会移除所有在Port套件集的本地复本中找到的work目录:

# portsclean -C

除此之外,许多过时的源码发行档案会储存在/usr/ports/distfiles。使用Portupgrade删除所有不再被任何Port所引用的distfiles:

# portsclean -D

Portupgrade可以移除所有未被任何安装在系统上的Port所引用的distfiles:

# portsclean -DD

若有安装Portmaster,则可使用:

# portmaster --clean-distfiles

预设,若distfile应要被删除,这个指令会以互动的方式向使用者确认。

除了以上指令外,ports-mgmt/pkg_cutleaves可自动移除不再需要使用的Port。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.