在 FreeBSD 代码库上工作的推荐工作流程和环境是什么?
What is the recommended workflow and environment for working on the FreeBSD code base?
我想开发 FreeBSD 发行版的新功能或更改现有程序,特别是用户 space¹。为此,我需要对 FreeBSD 代码库进行更改,然后对其进行编译和测试。²
在 /usr/src
中的树上这样做并将结果安装到系统上似乎是个坏主意,因为它需要您 运行 您的开发机器在当前,以 root 进行开发如果你犯了一个错误,特权和软管你的系统。我想一定有更好的方法,可能还有 FreeBSD 开发人员使用的标准设置。³
开发 FreeBSD 代码库的推荐工作流程是什么?
¹ 因此特定于内核开发的注意事项并不是非常重要
² 我熟悉开发完成后提交更改的流程
³ 我之前都阅读过 development handbook and the FreeBSD handbook chapter on building the source 但似乎都没有推荐特定的过程。
我是 ports 提交者,不是 src 提交者,但 AFAIK 运行 CURRENT 是开发人员中的常见做法。
另一种工作方式是设置 CURRENT VM,通过 NFS 共享它,从主机挂载并通过 运行 make install DESTDIR=/mnt/current
安装。顺便说一句,您可以使用 BHyVe 进行虚拟化。
我是 src 提交者。
我经常从我打算移植到的最低版本开始(例如,RELENG_11_3。
然后我会这样做(在进行更改之前或之后):
make buildworld
然后部署到监狱目录:
make DESTDIR=/usr/jails/test installworld
正如第一响应者所暗示的,这个监狱目录可以与 bhyve 一起使用,但我发现配置监狱甚至只使用 chroot 更容易。
我喜欢在 /etc/rc.conf 中配置我的监狱而不是 /etc/jail.conf:
示例/etc/rc.conf 内容:
jail_enable="YES"
jail_list="test"
jail_test_rootdir="/usr/jails/test"
jail_test_hostname="test"
jail_test_devfs_enable="YES"
我可以提供更深入的例子,比如监狱有一个私人网络栈,这样你就可以通过 SSH 进入它,但是我不明白网络栈对你的测试很重要来自发布的问题。
你可以用"jls"看到运行ning监狱,你可以用"jexec test bash"
进入运行ning监狱
您可以在监狱中测试您的更改。
在进行这种沙箱时,只要您 built/installed 到监狱的 /usr/src 来自以下版本,监狱就会工作:
- 比客人大OS,或
- 与来宾 OS 或
在同一个 STABLE 分支中
- 至少与来宾二进制兼容OS
情况 1 和情况 2 非常安全,而情况 3(例如,运行比客人 OS 更新 /usr/src)可能会变得危险。例如,尝试 运行 /usr/src head (13.0-CURRENT) on a 12.0-RELEASE-pX guest OS 其中 KBI、KPI 和 API 都可能不同内核和用户区(有监狱,每个监狱 运行s 在来宾 OS 的内核下)。
如果您发现您必须 运行 最新的来源来对抗较老的访客 OS,那么 bhyve 绝对是解决方案。您将采用该监狱目录,而不是 运行 以该根目录为监狱,运行 一个以监狱目录为根的 bhyve 实例。我不经常使用 bhyve,所以我不记得您是否首先必须将内容存放在磁盘映像中并首先将 bhyve 指向磁盘映像——其他人 and/or Google 会知道答案。
我想开发 FreeBSD 发行版的新功能或更改现有程序,特别是用户 space¹。为此,我需要对 FreeBSD 代码库进行更改,然后对其进行编译和测试。²
在 /usr/src
中的树上这样做并将结果安装到系统上似乎是个坏主意,因为它需要您 运行 您的开发机器在当前,以 root 进行开发如果你犯了一个错误,特权和软管你的系统。我想一定有更好的方法,可能还有 FreeBSD 开发人员使用的标准设置。³
开发 FreeBSD 代码库的推荐工作流程是什么?
¹ 因此特定于内核开发的注意事项并不是非常重要
² 我熟悉开发完成后提交更改的流程
³ 我之前都阅读过 development handbook and the FreeBSD handbook chapter on building the source 但似乎都没有推荐特定的过程。
我是 ports 提交者,不是 src 提交者,但 AFAIK 运行 CURRENT 是开发人员中的常见做法。
另一种工作方式是设置 CURRENT VM,通过 NFS 共享它,从主机挂载并通过 运行 make install DESTDIR=/mnt/current
安装。顺便说一句,您可以使用 BHyVe 进行虚拟化。
我是 src 提交者。
我经常从我打算移植到的最低版本开始(例如,RELENG_11_3。
然后我会这样做(在进行更改之前或之后):
make buildworld
然后部署到监狱目录:
make DESTDIR=/usr/jails/test installworld
正如第一响应者所暗示的,这个监狱目录可以与 bhyve 一起使用,但我发现配置监狱甚至只使用 chroot 更容易。
我喜欢在 /etc/rc.conf 中配置我的监狱而不是 /etc/jail.conf:
示例/etc/rc.conf 内容:
jail_enable="YES"
jail_list="test"
jail_test_rootdir="/usr/jails/test"
jail_test_hostname="test"
jail_test_devfs_enable="YES"
我可以提供更深入的例子,比如监狱有一个私人网络栈,这样你就可以通过 SSH 进入它,但是我不明白网络栈对你的测试很重要来自发布的问题。
你可以用"jls"看到运行ning监狱,你可以用"jexec test bash"
进入运行ning监狱您可以在监狱中测试您的更改。
在进行这种沙箱时,只要您 built/installed 到监狱的 /usr/src 来自以下版本,监狱就会工作:
- 比客人大OS,或
- 与来宾 OS 或 在同一个 STABLE 分支中
- 至少与来宾二进制兼容OS
情况 1 和情况 2 非常安全,而情况 3(例如,运行比客人 OS 更新 /usr/src)可能会变得危险。例如,尝试 运行 /usr/src head (13.0-CURRENT) on a 12.0-RELEASE-pX guest OS 其中 KBI、KPI 和 API 都可能不同内核和用户区(有监狱,每个监狱 运行s 在来宾 OS 的内核下)。
如果您发现您必须 运行 最新的来源来对抗较老的访客 OS,那么 bhyve 绝对是解决方案。您将采用该监狱目录,而不是 运行 以该根目录为监狱,运行 一个以监狱目录为根的 bhyve 实例。我不经常使用 bhyve,所以我不记得您是否首先必须将内容存放在磁盘映像中并首先将 bhyve 指向磁盘映像——其他人 and/or Google 会知道答案。