> For the complete documentation index, see [llms.txt](https://freebsd-journal-cn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freebsd-journal-cn.bsdcn.org/20180708-da-shu-ju/freebsd-in-scientific-computing.md).

# FreeBSD 在科学计算中的应用

作者：**Jason Bacon**

我自 20 世纪 90 年代中期以来一直使用 FreeBSD 和 Linux，从未间断。多年来我运行过许多不同的 Linux 发行版，最近主要使用 CentOS。我也大量使用 Mac OS X 和 NetBSD，并尝试过许多其他 BSD 平台。作为坚信开放标准价值的不可知论者，我喜欢熟悉 POSIX 世界的所有选项，以便随时为工作选择最佳工具。

多年来，我目睹 FreeBSD 的使用门槛逐一落下。开源软件持续扩展，如同 Blob 般食般蔓延开来，填补着曾经专属于商业软件和其他闭源软件的领域。OpenOffice/LibreOffice、OpenJDK、Clang、Flang 以及许多其他高质量开源产品，使得大多数人能够轻松用 FreeBSD 完成所需的工作。少数仍然存在的 FreeBSD 可运行限制日益冷僻，看来也注定会逐渐消亡。我个人使用 MS Windows 的需求在十多年前就已结束，尽管工作需要，我仍提供一定的 Windows 支持。Mac OS X 曾经满足 Windows 才能完成的少数需求，但如今连我的 Mac 也已缩减为每年用一次的平台，仅用于运行税务软件。当然，如果不是出于云计算安全的现实，我完全可以使用 FreeBSD 运行基于 Web 的税务程序。归根结底，如今我觉得 FreeBSD 比商业操作系统更易用、体验更愉悦，适合我的大部分工作与个人计算。

我自 1999 年底以来的大多数专业工作都是支持科学计算。从 1999 年到 2008 年，我为多学科团队提供 fMRI 脑图谱研究支持，团队成员包括神经病学家、神经心理学家、细胞生物学家、精神科医生和生物物理学家。在此期间的大部分时间里，我是几个实验室唯一的 IT 支持人员，支持超过 60 位研究人员。我负责维护许多 Unix 工作站，以及管理 fMRI 分析所需的全部研究软件。对一套功能完备且极为可靠的操作系统的需求变得非常迫切。FreeBSD 回应了这一需求，让我能凭一己之力推动这项重要研究持续多年。

自 2009 年以来，我支持了广泛的研究，包括工程、生物信息、物理、数学、化学、公共卫生、商业和心理学。这一环境的重要组成部分是运行 CentOS Linux 的 HPC 集群。FreeBSD 也作为开发和测试平台发挥着重要作用，是我们教育 HPC 集群和 HTCondor 网格的主操作系统。它还为我们管理 CentOS 系统上的大多数开源软件提供了模式，即使用 pkgsrc，这是来自 NetBSD 项目的跨平台包管理器，最初源自 FreeBSD Ports。

FreeBSD 已是 HPC 的重要组成部分

FreeBSD 已经在研究中扮演关键角色，包括许多高性能计算（HPC）环境，尽管有些人可能并未听说过它的名字。FreeBSD 是一些最受欢迎的高性能存储设备的基石，包括 FreeNAS、Isilon、NetApp 和 Panasas。FreeBSD 也是 Juniper 网络交换机、pfSense 防火墙、Apple OS X 的重要组件，并运行着许多 Web 托管和云服务的服务器。FreeBSD 还获得其他厂商的强力支持，包括 Mellanox，该公司正在为他们的网络适配器开发 FreeBSD 驱动。

科学研究之外，FreeBSD 也被商业巨头使用，这些公司需要最大化性能和可靠性。你曾在 Netflix 上看过电影吗？如果是，你就是 FreeBSD 用户。把电影流到电视或电脑的 Netflix 服务器就运行 FreeBSD。FreeBSD 也已用于 Yahoo! 服务器数十年。关于使用 FreeBSD 的知名公司清单，见 FreeBSD Handbook（<https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/nutshell.html#introduction-nutshell-users>）。

FreeBSD 作为计算平台

得益于快速、廉价的硬件和功能完备的免费软件，科学计算近年来达到了某种乌托邦状态。对于典型的工作站或笔记本电脑，科学家很难选错。有多种免费操作系统可选，大多基于 BSD、Linux 和 Solaris。其中任何一种都能很好满足典型科学家的需求。MS Windows 也有 POSIX 兼容层，如 Cygwin 和 Windows Subsystem for Linux（WSL），便于在 Windows 上直接运行 Unix 软件，还有免费的虚拟机，如 VirtualBox 和 qemu，允许我们同时在一台机器上运行多个操作系统。

无与伦比的可靠性

但对于我们这些管理许多多用户研究服务器的人来说呢？熟练的系统管理员始终严重短缺，科学研究领域感受尤为深刻。供需规律决定了经验丰富的系统管理员价格不菲。科研人员靠不断申请经费维持实验室运转。除少数例外，大多数研究者经费不足，无法与富有的企业争夺有限的人才库。事实上，学术界的大多数主要研究者收入远低于经验丰富的 Unix 系统管理员。

在这种情况下，选择最节省 IT 人力时间的系统至关重要。我们必须让少量 IT 工作人员尽可能高效，避免系统停摆，并快速、干净地完成软件部署等常见任务。这正是 FreeBSD 在同类系统中独树一帜之处。FreeBSD 无与伦比的可靠性和易管理性节省了宝贵的 IT 人力，可用于更具创造性的工作。相比于研究社区中经验不足的系统管理员所采用的方法，它能将人力需求减少一个数量级。

经验丰富的系统管理员知道远离前沿操作系统，因为它们会带来一次又一次的意外，分散他们从事创造性工作的注意力。正因如此，绝大多数大型 HPC 集群运行 Enterprise Linux，而非其他搭载最新内核、编译器和其他系统软件的发行版。这并非对前沿平台的批评。事实上，许多典型用户使用它们，修复最新内核特性、编译器等的 bug，这非常重要。今天的前沿就是明天的 Enterprise。

Enterprise Linux 系统通过选取较新前沿系统的快照并宣布暂停重大升级，实现高可靠性和长期二进制兼容。例如，Redhat Enterprise 和 CentOS 基于 Fedora 的快照。这种做法的缺点是，附带的工具和库已过时，无法支持最新的开源科学软件。例如，Redhat Enterprise 7（本文撰写时最新版本）附带 GCC 4.8.5（2015 年 6 月）和 GNU libc 2.17。最新版本是 GCC 8.1 和 libc 2.27。要在这样的系统上构建最新开源软件，必须安装更新的核心工具和库。直接替换它们会牺牲稳定性以及 Enterprise Linux 旨在保证的商业软件二进制兼容性。我们在 CentOS 系统上采用的解决方案是保留所有这些核心工具原位，并使用 pkgsrc——跨平台包管理器——在其旁边安装更新的工具。许多人转而使用容器或虚拟机，以提供更现代的、与过时的 Enterprise 基本系统隔离的环境。

FreeBSD 让我们得以避免这些问题，它提供的稳定性匹敌甚至超过 Enterprise Linux，同时在基本系统中提供更现代的工具。本文撰写时，FreeBSD 11.2 和即将发布的 FreeBSD 12 均提供 clang 6（2018 年 3 月）作为基础编译器，并能轻松支持大多数当前的开源科学软件。

最小化管理时间

一台 FreeBSD 系统可以在约 5 分钟内从零开始安装，并在不到一小时内完成多种用途的全配置，得益于基本系统中设计良好的工具以及用于管理附加包的 FreeBSD Ports 系统（稍后详细介绍）。FreeBSD handbook 是一本优秀的教程，覆盖大多数常见任务且保持相当及时。无需在网上搜索并冒险遵循过时或错误的说明。

日常维护快速且简单，使用 `freebsd-update`，一套用于安装基本系统 bug 修复和安全补丁的二进制更新系统。与许多其他操作系统不同，FreeBSD 安全通告包含如何应用补丁的清晰说明，包括何时需要重启或重启服务。

用 FreeBSD Ports 管理软件

在科学计算中，从想法到发表论文涉及四个步骤：

1. 开发软件
2. 部署软件
3. 学习软件
4. 运行软件

步骤 1 和 3 主要是平台无关的。遗憾的是，步骤 2——软件部署——往往是科学计算中的主要瓶颈。步骤 4——运行软件——是较小但实际的瓶颈，需要能够部署优化构建的软件。FreeBSD Ports 有潜力轻松消除这些瓶颈，因为它允许用户从庞大的二进制包集合中轻松安装，也能从源码轻松安装任何包，并可指定编译器选项。FreeBSD 还强力支持 OpenMP、pthreads 和 MPI，用于需要并行计算以缩短运行时间的场景。

绝大多数科学软件是开源的，在多种（通常是前沿）平台上开发，并常通过非常原始的方法部署。许多开发者根本不面向包管理器，而是为自己的开发平台和其他几个平台提供预编译二进制文件，并附带晦涩的说明，用于执行“原始”安装——手动从源码构建，或更糟——使用其捆绑的依赖软件。他们从源码构建的说明对普通用户有效的几率几乎为零。

部分问题在于，开发者大多是没有计算机科学训练的科学家，多为自学成才的研究生，为撰写学位论文而开发软件。他们不了解可持续开发和系统管理实践。如果他们的软件在毕业后还在使用，很可能清理代码，使其更便携、更易部署。然而，鉴于科学不断、快速的发展，以及学生开发者的轮换门现象，研究计算社区基本上注定永远生活在充斥初生、混乱代码的世界。

FreeBSD Ports 系统可以通过两种方式缓解此问题：

FreeBSD Ports 拥有所有包管理器中最大的现有包集合。截至本文撰写时，FreeBSD 用户可以通过一条命令安装超过 32,000 个包中的任何一个。如果你需要的包尚未在集合中，大多数或所有依赖项很可能已经在那里，因此创建新的 FreeBSD Port 所需的工作通常只是人工原始安装所需的一小部分。另请注意，FreeBSD 的 Port 选项大幅增加了可能的软件安装数量。在比较约 32,000 个 FreeBSD Ports 与不支持从源码便捷构建的系统的二进制包数量时，必须考虑这一点。许多此类系统中的二进制包实际上是同一软件的不同构建版本。

设想这样的场景：不是数千名科学家各自浪费 40 小时苦于相同的人工原始安装，而是其中一位创建 FreeBSD Port，此后全世界其他人都可以在几秒钟内安装该软件。这相当于将数千人力小时从毫无意义的重复 IT 工作转向富有成效的科学探索。这就是 FreeBSD Ports 和其他包管理器的潜力。

二进制包管理器（快速安装预编译包及依赖项）与便捷从源码构建的包管理器（如 FreeBSD Ports、Gentoo Portage、MacPorts 和 pkgsrc）之间存在另一个重要差异。二进制包安装速度当然快得多，但可能存在兼容性、安全性和性能问题。要便携，必须使用静态库编译且仅支持通用 CPU 特性，这排除了利用新指令和其他 CPU 特性，而这些特性可能显著提升性能。在极端情况下，你可能看到 30% 的速度提升——通过利用所有可用 CPU 特性的非便携二进制文件。这可以在 HPC 集群上运行大型分析时节省数千核心小时。

使用 FreeBSD Ports，从源代码构建优化二进制文件、利用 CPU 的最佳特性，如同安装二进制包一样简单。电脑构建和安装时间当然更长，但你付出的努力大致相同。要安装便携（可能较慢）的二进制包，我们可以使用以下命令：

```sh
pkg install canu
```

要从源码构建优化版本，我们应在 **/etc/make.conf** 中调整构建设置（例如添加 `CXXFLAGS+=-march=native`），然后运行以下命令：

```sh
cd /usr/ports/biology/canu
make install
```

如果你需要的软件尚无 FreeBSD Port，考虑创建一个。它并不如人们想象的那么难。成为 FreeBSD Ports committer 有相当陡峭的学习曲线，committer 须经严格的质量控制后才能向系统添加 Port。然而，Port 无需提交即可使用 Ports 系统部署。事实上，所有 Port 在提交前都部署并测试过。创建基本功能 Port 或升级现有 Port 的学习曲线相当平缓。任何会写 Makefile 并使用上游开发者所用构建系统的人，都可以相当快地学会。Porter’s Handbook（<https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/>）覆盖了你需要了解的大部分内容，从入门到成为 FreeBSD committer。

如果从 FreeBSD Ports 系统安装二进制包，可以使用以下命令快速轻松更新它们：

```sh
pkg upgrade
```

（注意，这可能会用较新的二进制包替换你从源码安装的优化版本，因此留意这一点，必要时在 `pkg upgrade` 之后从源码重新构建 Port。）

用于从源码构建的 Port 框架也可以通过 `portsnap` 或 `svn` 轻松更新。对于希望保持系统运行最新一切的人，这是很棒的特性。但如果你需要在跨越数月甚至数年的长期研究中保持同一版本运行怎么办？运行 `pkg upgrade` 可能真的会破坏你的研究。

现阶段虽然测试不充分，但可以在不同前缀下部署多个 Ports 树。Ports 也可以这样安装，无需 root 权限。FreeBSD Ports 项目每三个月在不同前缀下分支快照。这些季度快照中的 Ports 永不升级，尽管可能收到 bug 和安全补丁。

我一直在试验部署季度快照，前缀如 **/sharedapps/ports-2018Q1**，相应安装到 **/sharedapps/local-2018Q1**。软件可以静态安装于此，永不升级，而其他安装到标准前缀的软件定期通过 `pkg upgrade` 升级。

这套系统借鉴了 pkgsrc 包管理器更完善的支持特性，pkgsrc 设计为可在任何 POSIX 平台上以用户希望的任何前缀引导启动。我们多年来一直在 CentOS 系统上这样使用 pkgsrc。

我们也可以在 FreeBSD 上这样使用 pkgsrc，但有强烈动机以类似方式使用 FreeBSD Ports，主要因为目前它拥有比 pkgsrc 更大的集合。要让 FreeBSD Ports 以这种方式使用，仍有一些工作要做，但这种部署方式的基本支持已存在。我们只需投入使用并理顺细节。

对科学有益的基础特性

科学界对先进的 ZFS 文件系统有浓厚兴趣。其性能、灵活性和数据保护特性对投入大量时间和金钱生成包含研究结果文件的用户极具吸引力。

FreeBSD 的 RootOnZFS 特性允许我们部署从 ZFS 文件系统启动的 FreeBSD 安装，安装程序中提供简单的菜单界面。任何配备多块磁盘的现代 PC 都可以在几分钟内运行 RAIDZ 阵列上的 FreeBSD。

然而，ZFS 并非适用于所有用途。ZFS 相当耗内存。在 HPC 计算节点上，本地磁盘仅用于存放操作系统和提供临时存储，我们可能不希望 ZFS 与计算进程争夺内存资源。同样的理由适用于任何主要用于 CPU 或内存密集型任务的机器。幸运的是，FreeBSD 的 UFS2 文件系统也提供可靠的性能和可靠性，内存占用极低。

FreeBSD 提供企业级可靠性和易管理性，但 Enterprise Linux 的另一大优势——对商业软件产品的支持——又如何呢？幸运的是，FreeBSD 的 Linux 兼容模块允许我们运行大多数 Linux 二进制文件，无性能损失、内存开销极小、磁盘空间和精力投入也相当少。

FreeBSD 的 Linux 兼容性常被误称为模拟或兼容层。实际上，它既非模拟也非兼容层。FreeBSD Linux 兼容性的基础是直接支持 Linux 系统调用的内核模块。该模块激活替代的函数指针表，当运行 Linux 二进制文件时直接调用 Linux 兼容的内核函数。

要完成 Linux 兼容环境，我们只需安装 Linux 程序所需的任何共享库和工具的 Linux 版本，与在真正的 Linux 系统上一样。

FreeBSD Ports 系统提供了便捷安装 RHEL/CentOS Yum 包管理器使用的 RPM 的工具。创建从 CentOS Yum 仓库安装软件的 FreeBSD Port 在大多数情况下都很简单，许多你可能需要的此类 Port 已存在。

FreeBSD 的 Linux 兼容性相当稳健，能够运行绝大多数商业 Linux 二进制文件。我个人在 FreeBSD 机器上运行过许多版本的 Linux Matlab，功能完整，包括 Java 桌面和 MEX 编译系统（使用 Linux GCC 编译器）。不过，到了这个阶段，我建议大多数 FreeBSD 用户运行 Octave——功能完备的开源 Matlab 兼容套件。对大多数典型用户，它几乎与 Matlab 完全相同，免费，几秒钟即可安装。

当然，在 FreeBSD 上运行 Linux 二进制文件还需要一些额外工作。运行像 Matlab 或 ANSYS 这样复杂的软件可能需要相当多的努力。像共享内存 LS-DYNA 这样简单的应用程序安装起来很简单。依赖 MPI（Message Passing Interface）进行分布式并行计算的 Linux 二进制文件也可能是个挑战。如果你严重依赖复杂的闭源 Linux 应用程序，可能更适合运行 Enterprise Linux 系统。

要让 FreeBSD 成为 HPC 中有竞争力的平台，它还需要更轻松地支持其他一些目前仅在 Linux 上良好工作的子系统，例如 NVIDIA 的 CUDA GPU 平台（尽管开放标准 OpenCL 正开始获得关注）和常用于分布式并行计算的 Infiniband 互连。

还有一些剩余特性可能确保 Enterprise Linux 在一段时间内在 HPC 中保持主导地位。

不过，就目前而言，FreeBSD 已经是出色的平台，能够满足大多数典型科学计算的需求。如果你主要运行开源软件，并希望花时间做科学而非 IT 维护，FreeBSD 会很好地服务你。 •

***

**Jason Bacon** 是威斯康星大学密尔沃基分校研究计算的首席系统管理员，自 1983 年起开始与计算机打交道，自 1995 年起使用 FreeBSD 和 Linux。他是 The C/Unix Programmer’s Guide 的作者，这是一本面向初学者到中级 C/C++ 程序员的综合指南，涵盖 UNIX、Linux、Macintosh OS X 及类似系统下的编程。他精通西班牙语和德语，通晓法语和普通话。当他不在室内折腾各种系统时，常能在户外找到他骑行、海上皮划艇、越野滑雪、徒步和水肺潜水。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://freebsd-journal-cn.bsdcn.org/20180708-da-shu-ju/freebsd-in-scientific-computing.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
