freebsdLinux学习|Gentoo/Arch/FreeBSD技术文

UNIX基础--安装应用程序: Packages 和 Ports

2015-05-04  本文已影响706人  孤逐王

Packages and Ports

概述

FreeBSD 将许多系统工具捆绑作为基本系统的一部分。另外,FreeBSD 提供了两种补充的技术来安装第三方软件:FreeBSD Ports Collection,从源代码安装; packages,从预编译的二进制版本安装。这两种方法都可以用于从本地介质, 或从网上直接安装您喜欢的应用程序的最新版本。

UNIX®系统典型的安装第三方软件的步骤包括:

1、下载这个软件,软件的发布可能是源代码格式,或是一个二进制包。
2、从默认的发行格式解压软件,通常是用compress, gzip,或bzip2压缩过tar包。
3、阅读相关文档,了解如何安装。 (通常文件名是INSTALL或README, 或在doc/ 目录下的一些文档)
4、如果软件是以源代码形式发布的,那就需要编译它。可能需要编辑一个 Makefile文件, 或运行 configure脚本。
5、测试和安装软件。

FreeBSD的package是包含了一个应用的所有命令、全部的配置文件和文档的预编译好的副本 。package可以使用pkg命令来操作。
FreeBSD的port是一个可以自动从源代码编译成应用程序的文件集合。这些文件包含了自动下载、解开、打补丁、编译、安装应用的所有必要的信息。

pots系统也可以用于生成被包管理命令维护的packages。
packages 和 ports 都可以自动处理依赖库。

这两种技术是很相似,packages 和 ports有各自的强项,根据需要选择哪种方法安装一个特定的软件。

Package优点

Port优点:

查找软件

FreeBSD中可用的应用程序正在不断地增长着。有很多方法可以查找需要安装的软件。

# cd /usr/ports
# make search name=lsof
Port:   lsof-4.88.d,8
Path:   /usr/ports/sysutils/lsof
Info:   Lists information about open files (similar to fstat(1))
Maint:  ler@lerctr.org
Index:  sysutils
B-deps:
R-deps: 

注意:内嵌搜索机制使用索引信息文件. 如果显示消息:the INDEX is required, 执行make fetchindex下载最新的索引文件.

显示精简信息,使用quicksearch特性:

# cd /usr/ports
# make quicksearch name=lsof
Port:   lsof-4.88.d,8
Path:   /usr/ports/sysutils/lsof
Info:   Lists information about open files (similar to fstat(1))

为了更深入的搜索,还可以用 make search key=string, string就是想搜索的部分内容。 它将搜索port的名字、 注释, 描述和从属关系, 如果不知道您想搜索的程序名字, 可以利用它搜索一些关键主题来找到需要的。
当使用search或quicksearch时,搜索的关键字不区分大小写。

使用pkg进行二进制包管理

pkg是FreeBSD传统的包管理工具的下一代替代者。它提供了很多特性,使处理二进制包更快,更简单。
pkg不是替代像 ports-mgmt/portmasterports-mgmt/portupgrade这样的port管理工具,这些工具既可以使用二进制方式又可以通过ports集方式安装第三方软件,而pkg只安装二进制包。

安装pkg

从FreeBSD 8.4之后的版本包括了一个用于下载安装pkg(包括使用手册)的引导程序。(bootstrap utility)

/usr/sbin/pkg
pkg常用命令

pkg默认在一个缓存目录(PKG_CACHEDIR)存储二进制包,当使用pkg upgrade更新包时,旧的版本不会自动移除。

使用Ports Collection

Ports Collection ── 本质上是 /usr/ports 目录下的一堆 Makefile、 Patches(补丁)和描述文件,这些文件用于在FreeBSD系统中编译和安装应用。

安装Ports Collection
portsnap fetch

2、如果是首次运行 Portsnap,则需要将快照释放到 /usr/ports:

portsnap extract

3、更新 /usr/ports:

portsnap fetch
portsnap update

当使用fetch选项时,extract、update选项可以连续运行:
portsnap fetch update

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

如果ports tree不可用:

pkg install subversion

2、Check out a copy of the ports tree. 使用离你最近的Subversion mirror替换svn0.us-east.FreeBSD.org

svn checkout https://svn0.us-east.FreeBSD.org/ports/head /usr/ports

3、As needed, update /usr/ports after the initial Subversion checkout:

svn update /usr/ports
Port Skeleton

port skeleton 是让一个程序在 FreeBSD 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含:

Makefile:  Makefile 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。 
distinfo: 这个文件包括这些信息:这些文件用来对下载后的文件校验和进行检查   ,来确保在下载过程中文件没有被破坏。  
files/: 这个目录包括在FreeBSD系统上编译和安装程序需要用到的补丁。这些补丁基本上都是些小文件,指出特定文件作了哪些修正。它们都是纯文本的的格式,基本上是这样的 “删除第 10 行” 或 “将第 26 行改为这样 ...”,补丁文件也被称作 “diffs”,他们由diff程序生成。
这个目录也包含了在编译 port 时要用到的其它文件。
pkg-descr:这是一个提供更多细节,有软件的多行描述。
pkg-plist: 这是即将被安装的所有文件的列表。它告诉 ports 系统在卸载时需要删除哪些文件。

port里面包含着如何编译源代码的指令,但不包含真正的源代码。ports中这个程序源代码标示文件叫 “distfile”,构建port的过程中会自动存储已经下载的源码到/usr/ports/distfiles.

安装Ports

使用Ports Collection编译安装port,需要连接网络和超级用户特权。如果没有网络,则需要将 distfile 手工放到 /usr/ports/distfiles 中。

编译port的时候可以使用make install clean节省步骤。

移除已安装的Ports

已经安装的ports可以使用pkg delete命令卸载。
也可以在ports目录,使用make deinstall命令

升级Ports

列出可以更新版本的ports:

pkg version -l "<"

Important:
Before attempting an upgrade, read /usr/ports/UPDATING from the top of the file to the date closest to the last time ports were upgraded or the system was installed. This file describes various issues and additional steps users may encounter and need to perform when updating a port, including such things as file format changes, changes in locations of configuration files, or any incompatibilities with previous versions. Make note of any instructions which match any of the ports that need upgrading and follow these instructions when performing the upgrade.

执行Ports升级,使用Portmaster或者Portupgrade.

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

Portmaster 把 ports 分成4类:

Root ports (不依赖其他的 ports,也不被依赖)
Trunk ports (不依赖其他的 ports,但是被其他的 ports 依赖)
Branch ports (依赖于其他的 ports,同时也被依赖)
Leaf ports (依赖于其他的 ports,但不被依赖)

可以使用 -L 选项列出所有已安装的 ports 和查找存在更新的 ports:

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

可以使用这个简单的命令升级所有已安装的 ports:

portmaster -a

如果你在升级的过程中发现了错误,你可以使用 -f 选项升级/重新编译所有的 ports:

portmaster -af

同样你也可以使用 Portmaster 往系统里安装新的 ports,升级所有的依赖关系之后并安装新的 port:

portmaster shells/bash

注意:
Portmaster 默认在删除一个现有的 port 前会做一个备份包。如果新的版本能够被成功安装, Portmaster 将删除备份。 使用 -b 后 Portmaster 便不会自动删除备份。加上 -i 选项之后 Portmaster 将进入互动模式, 在升级每个 port 以前提示你给予确认。

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

在每次升级之前,推荐使用 pkgdb -F 命令来扫描已安装的 port 的列表, 并修正其所报告的不一致。
运行portupgrade -a升级系统中所安装的所有过时的 ports。 如果您希望在每个升级操作时得到确认, 应指定 -i 参数。

portupgrade -ai

如果您只希望升级某个特定的应用程序, 而非全部可用的 port,应使用portupgrade pkgname。 指定 -R 参数非常重要,portupgrade将首先升级指定程序所需要的所有ports。

portupgrade -R firefox

要使用预编译的 package 而不是 ports 来进行安装, 需要指定 -P。 如果指定了这个选项, portupgrade 会搜索 PKG_PATH 中指定的本地目录, 如果没有找到, 则从远程站点下载。 如果本地没有找到, 而且远程站点也没有成功地下载预编译包, 则 portupgrade 将使用 ports。 要禁止使用 port, 可以指定 -PP。

portupgrade -PP gnome2
Ports and Disk Space

在通过 ports 编译和安装软件之后,您应记得清理临时的 work 目录, 其方法是使用 make clean 命令。

另外,许多过时的源码文件被收集在目录 /usr/ports/distfiles 中. 如果安装了Portupgrade, 下列命令将删除那些不被其他port引用的过时的distfiles。

portsclean -D

使用Portupgrade移除所有的不被系统其他port引用的distfiles:

portsclean -DD

如果安装了Portmaster,使用:

portmaster --clean-distfiles

除了这些命令之外, ports-mgmt/pkg_cutleaves package(or port)自动完成移除已安装但不再使用的ports的任务。

上一篇下一篇

猜你喜欢

热点阅读