> 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/2025-101112-freebsd-15.0/we-get-letters.md).

# 读者来信

作者：Michael W Lucas

![mailbox graphic](/files/NoKQjAkWyEz1lib5PCZt)

亲爱的“他们怎么让你写这专栏”：

FreeBSD 15 已经发布，基本系统以包的形式提供。在 2022 年 1/2 月刊的《FreeBSD 期刊》中，你整篇专栏都在抱怨 pkgbase。你错了。显然错了。这够不够让你终于闭嘴，不再回我们的信？

——想要有用答案的人

亲爱的“想抓把柄的”：

让我闭嘴是个早已解决的问题。每小时收费 200 美元（<https://givebutter.com/c/Penguicon24/auction/items/258146>）。至于他们为什么让我写这个？因为《FreeBSD 期刊》编辑 John Baldwin 急需一个来信专栏。如今有了专栏，他更急了，但原因完全不同。换个新鲜，权当休息。

言归正传，回到你真正的问题。打包的基本系统。怎么回事？为什么？

我并没有“整篇专栏抱怨 pkgbase”。是的，我说过升级 BSD 唯一正确的方式是从源码构建并自行安装。我还说过，打包的基本系统是“FreeBSD 的恐怖巨龙，吞噬每一个试图征服它的开发者”。

巨龙占据着重要的生态位。它们是警告，也是界限：**你到此为止，不得逾越**。我们称其为邪恶，只因人们厌恶限制。遇到限制或巨龙时，我们总想将其斩杀。我们至今还记得圣乔治斩杀无辜巨龙救公主的故事。我们之所以记得，是因为王室不断传颂这个故事，指望我们从下一条龙口中救出他们，却绝口不提国王曾认为龙吞食百姓虽可惜但可接受，直到他自己的女儿上了菜单。

总之，斩杀巨龙，你将名留青史。

真正的问题在哪？开发者和其他所谓的“技术人”一样聪明。但智力与现实世界几乎无关，对同辈压力也毫无防御之力。

“自举”——从系统上的代码和工具构建系统的能力——是原始 BSD 不可或缺的一部分，至今仍至关重要。BSD 系统应随附重建自身所需的全部源码和工具。BSD 系统的天然状态是一个单一、完整的整体。将其拆分成碎片，就像把苹果切片出售。不过打包确实 **感觉** 很方便。酷酷的企鹅小子们都有基本系统打包！我出生后不久就放弃了变酷的希望，所以同辈压力只能引起我的倦怠。

有人觉得从源码构建 FreeBSD“慢”且“烦人”。在未开悟者看来或许如此，但关键在于技术正确性。正确性是每一个 BSD 的首要目标，看着编译器第无数次递归重建编译器，是为达到如此纯粹巅峰所付出的微薄代价。技术正确性还不是最糟的正确性，只是感觉如此。

2006 年，Colin Percival 发布了 **freebsd-update(8)**，让没耐性的人能跳过这道成人礼，从而推动了 FreeBSD 的更广泛采用和部署。

FreeBSD 还有 Ports 系统。Ports 让系统管理员按需构建附加软件，并打包成方便的 tar 包，随处安装。Ports 中三万四千多个附加程序支持着一团乱麻般的选项和依赖，恰好印证了我们为何要将 BSD 构建为单体整体，和应对所有这些交互所需的包管理软件。**pkg(8)** 中的现代包管理工具于 2012 年底首次纳入 FreeBSD 9.1。

新的包管理工具刚一推出，那些痴迷于所谓“易用性”的人就抛弃了 Unix“许多小工具各司其职”的哲学，开始喋喋不休地谈论用单一工具同时管理基本系统和附加软件的便利。能有多难？毕竟，Emacs 和 vim 之类臃肿的文本编辑器也是由一大堆文件构建而成的。把整个基本系统打包成 tar，附上清单，不就完事了？

嗯，不行。

无数开发者屈服于将 FreeBSD 整理成友好包的诱惑，直到 2016 年发出公开测试号召。不出所料，一切就此崩坏。若你损坏了安装并想移除所有包从头再来，你会失去操作系统。这个细节很快修复了，但事实证明边界情况数不胜数，它们之间的交互更是数以百计。

最初的测试号召声称 FreeBSD 11 将随附打包的基本系统。此后一版再版推迟，残留的 bug 被逐一发现和修复。

和所有志愿者软件项目一样，pkgbase 卡在 99% 完成度长达数年。

FreeBSD 以其开放管理为荣，但项目中有一个人掌握着非凡的宇宙级权力：发布工程师。FreeBSD 15 的发布工程师一锤定音：“我们不仅要在 15 中打包基本系统，在基本系统打包完成之前，我将推迟发布。“众人退缩，但仍动手干活。`pkgbaseify` 工具将 FreeBSD 14 主机转换为使用 pkgbase，以便通过打包工具平滑升级到 FreeBSD 15。

经过这番测试，pkgbase 对大多数人来说应该都能用了。我毫不怀疑，某个过于聪明的人会用它把主机搞到无法启动，或者把 Rails 装成新内核，但用户要为自己的主意负责，而我已经备好一大桶爆米花。

我在自己的测试机上干净安装 FreeBSD 15，显示有 311 个包，除一个外，名称都以“FreeBSD”开头。例外当然是“pkg”。坦白说，如果你在生产服务器上删除 `FreeBSD-kernel-generic` 包，你得到的就是你应得的，即一条警告：你不能删除内核。或者 libc，或者链接器，或其他任何明显的候选。你可以移除编译器，但正如我在最初的 pkgbase 讨论中所说，“真正的操作系统在默认安装中随附功能完备的编译器。”我还对那些对编译器病态恐惧的人说了些不中听的话。

这样的转变值得深入审视并考量历史背景。十九年前，Colin 出于简化升级和打补丁的一时冲动发布了 `freebsd-update`。而那位把 FreeBSD 15 扣作人质、直到纳入打包基本系统才放行的发布工程师？

Colin Percival。

我想我看到了 **真正的** 问题所在……

有问题想问 Michael？ 发送至 <letters@freebsdjournal.org>

Michael W Lucas 是《Absolute FreeBSD》《Dear Abyss》《SSH Mastery》等众多书籍的作者。了解更多请访问 <https://mwl.io>。


---

# 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/2025-101112-freebsd-15.0/we-get-letters.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.
