FreeBSD是Unix操作系统的一种,广泛用于服务器、桌面和嵌入式平台中。很多大型公司,如Netflix、Yahoo、WhatsApp、BBC、Sony等都在使用FreeBSD。FreeBSD天生就是为服务器打造的操作系统。本文讲解了如何在FreeBSD操作系统上使用pkg包管理器,需要使用到一台安装了FreeBSD 12的云服务器。
在FreeBSD上,我们有两种安装软件的方法,Ports和Packages。Ports使用软件供应商提供的源代码,根据我们的需要启用或禁用某些功能,以构建的方式安装软件。Packages是一种安装预编译软件的工具,默认采用大部分人能够接受的选项,从而简化安装过程。Packages使得安装、卸载、升级软件的过程变得快速而简单。FreeBSD的Packages系统也被称为pkg,其软件包存储在SQLite数据库中,便于检索和查询。
需要注意的是,FreeBSD的pkg包管理器的软件安装路径和Linux有所不同。软件安装路径是/usr/local,而软件配置路径是/usr/local/etc。这一点和Linux完全不同。
pkg基本操作
FreeBSD的pkg包管理器提供许多功能,让软件安装变得快速而简单。pkg是一种有很多子命令的独立应用程序,每个子命令各司其职,如安装、卸载、查询等。所有的pkg操作都必须以root身份或者通过sudo来执行。比如以下命令用于在FreeBSD上安装curl软件包。也可以在命令结尾加上-y,跳过命令执行过程中的确认提示:Proceed with this action? [y/N]
pkg install curl
卸载软件包也非常简单和直观:
pkg delete curl
使用pkg help命令快速查看参考文档,或者指定某个子命令,查看关于这个子命令的操作手册。
pkg help
pkg help install
pkg help delete
安装pkg
FreeBSD的默认版本中并未预装pkg包管理器。当我们第一次安装软件时,系统会提示是否安装pkg包管理器。比如我们要安装wget,命令行提示如下:
pkg install wget
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
输入y并回车后,pkg就会开始安装,pkg安装完毕后,需要安装的软件也会随之安装。我们也可以只安装pkg,而不同时安装其他软件。使用以下命令只安装pkg。
pkg bootstrap
注意:朝暮数据的FreeBSD云服务器默认已安装了pkg包管理器,无需再次安装。
配置pkg
pkg包管理器的灵活性很强,每一个子命令都有很多配置项。我们可以自定义设置全局的配置项,配置项位于/usr/local/etc/pkg.conf文件中。该文件使用统一配置语言(UCL)编写,有大量的被注释的选项,也就是默认配置项。配置项的值可以是整数、字符串或者布尔值。例如:
#PKG_DBDIR = "/var/db/pkg";
#PKG_CACHEDIR = "/var/cache/pkg";
#PORTSDIR = "/usr/ports";
#INDEXDIR = "";
#INDEXFILE = "INDEX-10"; # Autogenerated
#HANDLE_RC_SCRIPTS = false;
#DEFAULT_ALWAYS_YES = false;
#ASSUME_ALWAYS_YES = false;
在pkg.conf配置文件中,还可以定义pkg子命令的别名。在文件末尾,有一个标记为“ALIAS”的部分,在这里可以添加别名。别名通常用于简化较为复杂或冗长的命令。更多关于pkg.conf配置文件的信息,可以通过以下命令获取。
man pkg.conf
查找软件包
现在我们已经安装并配置好了pkg包管理器,下面就准备安装软件了。如果你有一定的运维服务器的经验,应该知道即使是相同的软件,对于不同的操作系统和不同的软件版本,软件包的名称也是不同的。以Apache为例,在不同的Linux版本中的名称也各有差异。因此,在安装软件之前,还需要查清楚软件包的具体名称是什么。
FreeBSD操作系统的公共软件库每隔几天就会更新一次,有超过25000个软件包。比如我们要查找Apache的具体名称,可以用以下命令。
pkg search apache
# apache24-2.4.38 Version 2.4.x of Apache web server
该命令会返回名称中含有apache的全部软件,可能结果会很长。我们可以使用pkg search子命令的软件来调整查询结果。关于该命令的使用方法,可以通过pkg help search命令来获得帮助。
如果你不确定某个软件包是否符合需要,可以加上-R选项来查看该软件包的更多信息。
pkg search -R apache24
# name: "apache24"
# origin: "www/apache24"
# version: "2.4.38"
# comment: "Version 2.4.x of Apache web server"
# maintainer: "apache@FreeBSD.org"
# www: "https://httpd.apache.org/"
# abi: "FreeBSD:12:amd64"
# arch: "freebsd:12:x86:64"
# prefix: "/usr/local"
# . . .
安装软件包
以Apache为例,使用以下命令进行安装。
pkg install apache24
整个安装过程是这样的。当执行pkg install命令时,pkg首先查询本地软件缓存,如果然后从公共软件库(pkg.FreeBSD.org)中下载。安装成功后,pkg在本地SQLite数据库中进行注册,数据库文件为/var/db/pkg/local.sqlite。如果这个数据库文件被删除,系统将无法跟踪哪些软件被安装过。如果该软件还有一些依赖性软件,在安装过程中也会一并自动安装。
pkg包管理器也可以只下载软件而不进行安装,我们在合适的时候再安装。使用pkg fetch命令下载软件,-d选项代表同时下载依赖的软件。软件下载路径为/var/cache/pkg目录。
pkg fetch nginx -d
之后当需要安装软件的时候,执行pkg install命令进行安装,此时pgk使用本地软件缓存,而不会重新从公共软件库中下载。
经过一段时间后,本地软件缓存目录可能会变得很大。pkg clean子命令用于清理缓存,-a选项代表清理全部缓存。
pkg clean -a
如果我们希望每次安装或升级软件后自动清理,在pkg.conf配置文件中把AUTOCLEAN配置项设置为true即可。
获取已安装的软件包信息
当我们想了解服务器上安装了哪些软件,可以通过pkg info子命令来获取已安装的全部软件列表。
pkg info
# atk-2.28.1 GNOME accessibility toolkit (ATK)
# avahi-app-0.7_2 Service discovery on a local network
# ca_root_nss-3.42.1 Root certificate bundle from the Mozilla Project
# . . .
如果想具体了解某个软件的信息,使用pkg info加上软件名称即可。系统会返回软件版本、安装时间、软件授权等很多有用的信息。
pkg info nginx
# nginx-1.14.2_3,2
# Name : nginx
# Version : 1.14.2_3,2
# . . .
卸载软件包
卸载软件也很方便,使用pkg delete或pkg remove子命令,系统会返回被卸载的软件列表。卸载某个软件时,依赖于它的其他软件也会同时卸载。
pkg delete nginx
锁定软件包
也许会有这种需求,你希望云服务器上的某个软件一直不要更新,这是可以用锁定功能来实现。当软件包被锁定后,pkg包管理器则不会升级、降级、卸载或者重装该软件包。对于该软件包的依赖软件包,也会采取同样的处理方式。使用pkg lock子命令锁定软件包。
pkg lock openssl
解锁软件包:
pkg uklock openssl
查看已锁定的软件包列表:
pkg lock -l
使用-a选项锁定或解锁全部软件包:
锁定全部软件包:
pkg lock -a
pkg unlock -a
公共软件库
公共软件库是pkg包管理器的一个组成部分。操作系统上可以有多个软件课,我们可以添加、删除、启用或者禁用软件库,也可以使用UCL语言设置每个软件库。FreeBSD官方的公共软件库位于/etc/pkg目录下,名称为“FreeBSD”,默认启用,配置文件位于/etc/pkg/FreeBSD.conf,内容如下。
FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}
我们可以添加或者删除第三方软件库。由于/etc/pkg目录是官方软件库专用的,通常第三方软件库位于/usr/local/etc/pkg/repos目录下。该目录默认不存在,需要用mkdir手工创建。第三方软件库的配置文件也位于此目录下。
其他pkg子命令示例
这里列出了其他常用的pkg子命令,作为FreeBSD操作系统管理员,会经常使用到。
安装软件并跳过确认提示:
pkg install -y package
备份本地pkg数据库:
pkg backup
列出已安装的全部软件:
pkg info
显示某个软件的详细信息:
pkg info package
查找软件包:
pkg search -i package
显示软件包已知的安全漏洞:
pkg audit -F
删除不使用的软件包:
# Removes unused packages
pkg autoremove
卸载软件包:
pkg delete package
清理本地软件缓存:
pkg clean -ay
更新已安装的软件:
pkg update
升级已安装的软件:
pkg upgrade
检查软件包的完整性:
pkg check -saq
显示软件包相关的文件名
pkg info -l nginx
重要的文件和目录
- pkd配置文件:/usr/local/etc/pkg.conf
- FreeBSD官方软件库目录:/etc/pkg
- FreeBSD官方软件库配置文件:/etc/pkg/FreeBSD.conf
- 第三方软件库目录:/usr/local/etc/pkg/repos
- 本地软件缓存目录:/var/cache/pkg
- SQLite数据库文件:/var/db/pkg/local.sqlite
总之,FreeBSD提供两种安装软件包的技术,从安装源编译的Ports和从预装软件安装的Packages。由于FreeBSD操作系统已经明确向着统一的软件包管理方式转变,我们尽可能使用pkg包管理器来管理第三方软件,避免使用需要复杂配置的编译方式来管理软件。