如何在FreeBSD 12上使用Pkg包管理器

・16 分钟阅读

介绍

FreeBSD是一个类似Unix的开源操作系统,用于支持现代服务器,台式机和嵌入式平台。像Netflix,雅虎,WhatsApp,BBC和索尼这样的巨头都在以某种形式使用FreeBSD ,FreeBSD系统并不像Linux那样广为人知,主要是因为Linux多年来一直专注于桌面而FreeBSD项目往往更加基于服务器。

在本指南中你会了解Freebsd 12上的包管理。

Ports vs Packages

在FreeBSD上我们有两种不同的方法来安装附加软件:通过Ports Collection或Ports,并通过预先配置的软件包安装和管理软件。

port是在FreeBSD上构建附加软件的系统,开始使用软件供应商提供的原始源代码,并根据需要构建软件,启用和禁用功能。

软件包是预编译软件,它们是使用Ports维护者认为最有用的结果,软件包使你可以快速安装,卸载和升级add-on软件,FreeBSD系统的打包软件称为包,即pkg ,包信息存储在SQLite数据库中,你可以查询包数据。

FreeBSD包管理的另一个重要内容是包二进制文件的位置,包在/usr/local下安装二进制文件,大多数配置文件最终以/usr/local/etc而不是/etc ,如果你来自Linux世界,你可能会发现这点很不同。

FreeBSD软件包管理器,pkg

传统的FreeBSD软件包管理工具的下一代替代工具是pkg ,提供了很多使处理二进制软件包更加快捷的特性,pkg是安装不包含在FreeBSD基础系统中的软件,它是一个具有许多子命令的程序,你会使用这些子命令,例如,安装,删除包,所有包操作和更改都必须以root或通过sudo运行。

以下是你在FreeBSD上安装curl软件包的方法:

 
pkg install curl

 

你可以使用-y来输入该命令,以避免,Proceed with this action? [y/N]: 安装软件或将pkg配置为始终在配置文件中使用-y时问题。

要删除软件包,你可以使用delete

 
pkg delete curl

 

你可以看到,它非常简单和直观。

对于可用子命令或pkg help <subcommand>,使用pkg help快速引用,以显示特定子命令的手册页:


pkg help
pkg help install
pkg help delete

安装pkg

FreeBSD的版本没有安装pkg软件包管理器,第一次尝试安装包时,pkg会提示你安装包管理工具,例如,假设你要安装在新FreeBSD上的第一个软件包是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,将开始安装软件包管理工具,安装好之后,你想要安装(wget )的初始软件包会被安装。

你还可以在不添加其他包的情况下自行安装包系统,通过运行pkg bootstrap ,此外,pkg知道如何安装和更新自身和其他软件包。

配置pkg

pkg程序设计得非常灵活,每个子命令有许多选项,你可以为pkg的大多数程序建立自定义,但是一致的行为,位于/usr/local/etc/pkg.conf中的系统配置文件。

文件包含注释的pkg默认值,只要阅读这个文件,你就可以了解到pkg的行为,配置是用通用配置语言(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子命令定义别名,在pkg.conf的底部,你会找到一个标记为ALIAS的节,当你发现重复运行复杂的命令时,应该添加别名。

有关文件格式和选项的详细信息,你可以参考pkg.conf(5)手册页:

 
man pkg.conf

 

查找软件包

既然已经安装了包管理器,你现在可以安装包了。如果你是系统管理员,则你熟悉不同操作系统为同一软件的打包版本分配不同名称的事实。例如,Freebsd上的Apache Web服务器包与不同Linux发行版上的Apache包有完全不同的名称,因此,在安装任何内容之前,需要确定要安装的包的名称是什么。

FreeBSD项目在公共存储库中提供了几组包,并且每几天更新一次,目前有25,000个软件包。

例如,让我们尝试搜索Apache网络服务器:


pkg search apache
# apache24-2.4.38 Version 2.4.x of Apache web server

它会在名称中找到所有带有apache的软件包。这会返回一个长列表,但是,你要查找的是apache24包,每个包都有简短的描述,这应该可以帮助你决定安装什么包,但是,它并不总是很简单。

某些搜索可以生成数百个结果,你需要使用不同的命令行选项来修剪或调整搜索结果,查阅pkg-search手册页或帮助页pkg help search以便了解有关常见搜索选项的更多信息。

如果你不确定包是否正确,可以使用以下命令查找包的详细信息:


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"
# . . .
# . . .

这个命令为你提供许多关于软件包的有用信息。

安装软件包

要安装软件,请使用install子命令和软件包的名称来安装:

 
pkg install apache24

 

pkg install安装包时,pkg查询本地包目录,然后将请求的包从存储库下载到pkg.FreeBSD.org ,安装包后,它被注册到保存在/var/db/pkg/local.sqlite中的SQLite数据库中,注意不要删除此文件,否则系统会丢失已安装的软件包,如果软件有依赖性,pkg会找出它们,并且与基本软件包一起安装,作为依赖项安装的软件包称为自动包。

软件包管理器能够通过互联网下载软件包,并将它们保存在磁盘上的一个位置,这允许你在其他时间安装它们,你可以使用pkg fetch命令在不安装软件包的情况下下载软件包:

 
pkg fetch nginx

 

此命令只获取Nginx而不包含它依赖项,可以使用-d标志来获取所有依赖项以及命名包:


pkg fetch -d nginx

包被下载到包缓存目录/var/cache/pkg ,获取软件包后,pkg会把它们添加到此目录,你可以列出文件以查看它包含的内容:

 
ls/var/cache/pkg

 

现在,要在获取后安装下载的软件包,请正常运行pkg install ,安装过程使用缓存的文件而不是已下载的文件。

随着时间的推移,包缓存目录可能会变大。pkg clean命令删除已被更新版本替换的所有缓存软件包以及存储库中不再存在的包文件:

 
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-info手册页了解完整的详细信息。

删除软件包

要卸载二进制软件包,请使用pkg delete子命令,它也可以作为pkg remove


pkg delete nginx
# or
pkg remove nginx

你将得到要删除的软件包列表,以及这将释放多少空间。

如果删除其他软件包依赖的包,pkg也会删除依赖包。

锁定软件包

可能有一个时候你想让你的服务器上的软件包永远不升级,锁定包时,pkg将不会升级,降级,卸载或重新安装,它对软件包依赖项和它所依赖的程序应用相同的规则。

使用pkg lock锁定软件包:

 
pkg lock openssl

 

openssl软件包已被锁定。

要列出系统上当前锁定的所有软件包,请使用-l标志:

 
pkg lock -l

 

要删除锁,请使用pkg unlock命令:

 
pkg unlock openssl

 

要同时锁定或解锁系统上的所有软件包,请使用-a标志:


pkg lock -a
pkg unlock -a

软件包存储库

pkg支持软件包存储库,是包的命名集合,你可以添加,删除,启用和禁用存储库,你应该使用UCL格式在它自己的文件中配置每个存储库,官方的FreeBSD存储库属于/etc/pkg目录,FreeBSD附带了repo "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是为正式的FreeBSD存储库保留的,所以,你需要另外一个目录,传统的位置是/usr/local/etc/pkg/repos ,如果要使用其他目录,则需要使用REPO_DIRS选项在pkg.conf中设置一个位置,默认情况下,本地存储库目录不存在,因此你需要使用mkdir -p/usr/local/etc/pkg/repos创建它,将你自己的存储库配置放在该目录中。

pkg子命令例子

本部分将列出在管理FreeBSD服务器时最常用的一些最常用的子命令:


# Installs a package without asking any questions
pkg install -y package

# Makes a backup of the local package database
pkg backup

# Lists all installed packages
pkg info

# Shows extended information for a package
pkg info package

# Searches package repository
pkg search -i package

# Shows packages with known security vulnerabilities
pkg audit -F

# Shows which package owns the named file
pkg which file

# Removes unused packages
pkg autoremove

# Uninstalls a package
pkg delete package

# Removes cached packages from /var/cache/pkg 
pkg clean -ay

# Updates local copy of the package catalog
pkg update

# Upgrades installed packages to their latest version
pkg upgrade

# Checks the integrity of all your packages
pkg check -saq

# Verifies that a package's files are unaltered
pkg check -s nginx

# Shows what files came with the package
pkg info -l nginx

# Lists non-automatic packages
pkg prime-list

重要文件和目录

  • pkg配置文件- /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提供了两种安装第三方软件的补充技术: FreeBSD Ports Collection,用于从源代码和包安装,用于从预构建的二进制文件进行安装。由于FreeBSD将系统更加有效地转移到通用软件包管理,请尝试使用pkg管理第三方软件,除非你想要的软件没有打包版本或者你需要自定义编译时选项,否则请避免使用Ports。

Anne655 profile image