FreeBSD

共 688 篇文章。

用 rspamd 来实现反垃圾邮件

• Security

我搞邮件服务器有二十多年了,最开始是在学校做社团的邮件服务,后来有几年和 老房东 在某领先网络媒体公司做了多年针对公众提供的邮件服务,因此前同事群的名字也是「老邮条」。我个人的域名是2002年注册的,自从那时起我就一直在自己运行邮件服务。

在过去二十年中的大部分时间,我采用的是 amavisd-new,与直接使用 SpamAssassin 相比,它还增加了病毒扫描等一系列功能和 milter 接口,这让它与 MTA 更容易集成。

阅读全文… ( 本文约 1026 字,阅读大致需要 3 分钟 )

FreeBSD 14.0-RELEASE 发布了

• Development

上周末抽时间把服务器升级到了 FreeBSD 14.0-RELEASE。软件的发布中存在许多的工序,大致上,在 releng/ 分支上的代码树会正式命名为 -RELEASE,同时由一位 Release Engineer 开始最终的 build(对应的文件会发布到 FTP 上,并在 网站 上提供链接),并在适当的时候将 releng/ 分支上的代码tag 成 release。此后, Security Team 需要将 Release Engineer 签名的 -RELEASE 放到 freebsd-update builder 上再次 build、签名,并生成二进制更新所需的文件。

由于安装用的 ISO 映像文件都比较大,传统上将这些映像文件分发到全球的镜像站点上需要一些时间。现时,云服务提供商往往还有自己的 QA 步骤,因此最终宣布 -RELEASE 的时间往往会比 FTP上出现的时间晚上一周左右。技术上这段时间这个 build 依然只是一个发布候选版本(Release Candidate),因此普通用户不应使用这些版本,因为在这一周的时间如果遇到一些突发状况的话可能会需要将这个版本撤回(例如原本应发布为 FreeBSD 4.6.1 的 FreeBSD 4.6.2 就是这样的情况)。

阅读全文… ( 本文约 1101 字,阅读大致需要 3 分钟 )

记录一下当年把 FreeBSD 中 zlib 砍到只剩一份的过程

• Development, Kernel

软件项目中,实现同一功能的源代码只保留一份是一项十分重要的最佳实践,这种做法可以带来许多显而易见的好处:

  1. 简化依赖关系管理。 对于 C/C++ 项目来说,如果同一个函数库有不同的版本,意味着必须设法确保其中不包含同一符号的多个变体。
  2. 减少技术债的积累。 只保留一个版本意味着参与项目的所有开发者都使用最新版本的库,或是从一个接近最新版本的库升级到最新版本,这要比把技术债留给后人去解决要容易许多。尽管升级时需要考虑的问题会更多一些,但这也意味着更好的一致性。只留一份版本意味着在升级时必须通盘考虑全局的影响,配合持续集成测试的使用,这也会带来更好的代码品质,并让整个团队能够更快地进行迭代。
  3. 节省各类存储占用。
  4. 改善整体安全性。问题只需在一处进行修正。

2009年的时候 kmacy@ 做了 一些初步的工作,但后续没有继续推进。这之后 我 考虑重新把这个事给做掉,但苦于平时比较忙因此未能如愿。最终, Yoshihiro Ota完成了大部分的工作。

阅读全文… ( 本文约 2146 字,阅读大致需要 5 分钟 )

C main() 的 exit() 和 return

• Development

这里讨论一个犀利而无用的细节问题。事情的缘起是有人在 GitHub 上提了一个 pull request 要求把许多程序的main() 的终结部分从 exit(X) 改为 return X;,我反对了这一变动。

值得注意的是,在实践上,从 main 中 return 和调用 exit(3) 几乎等效的(此处还是有细微差别,后面将会讨论),原因是 C 运行环境库的启动部分(这部分会在连接过程中嵌入到可执行文件中,FreeBSD 的实现中,这部分位于 lib/libc/csu/libc_start1.c 的 __libc_start1:

1
2
3
4
5
6
7
void
__libc_start1(int argc, char *argv[], char *env[], void (*cleanup)(void),
    int (*mainX)(int, char *[], char *[]))
{
/* ... */
	exit(mainX(argc, argv, env));
}
阅读全文… ( 本文约 967 字,阅读大致需要 2 分钟 )

FreeBSD 14 确定延期

• Development

原定4月25日开始的code slush和KBI冻结并未发生,主要的原因是 OpenSSL 3.0 还未合并,以及 OpenZFS 近期的一些可靠性问题。

其中,OpenSSL 3.0 由于对 API 的改动比较大,因此会导致一些 port 无法正常工作(PR 258413)。近期已经有一批 port 标记为与 OpenSSL 3.x 不兼容,不过修掉这些可能会需要不少时间。

阅读全文… ( 本文约 536 字,阅读大致需要 2 分钟 )

FreeBSD 上的 nginx kTLS 支持

• Security

昨天,FreeBSD 13.2 正式发布了。kTLS 是在 FreeBSD 13.0 中由 Netflix 赞助的新功能,过去,TLS/SSL 应用程序对于通讯内容的加解密通常是在用户态进行的,这样一来,系统在读取出数据和发出数据之前需要进行额外的上下文切换,并在内核和用户地址空间之间来回复制缓冲区来满足加解密的需要。有了 kTLS 之后,内核可以在 sendfile(2) 时直接在内核上下文中完成加密和填充到网络协议栈的操作,从而减少了上下文切换和不必要的复制操作。

阅读全文… ( 本文约 836 字,阅读大致需要 2 分钟 )

Postmortem: UPS 测试导致系统停机故障的事后回顾

• Postmortem

摘要

事故影响

由于 UPS 测试触发了系统停机,导致 delphij.net 部分服务停止了约40分钟。服务从 2023-01-16 15:46:20 开始受到影响,至 16:26:55 完全恢复。如果服务未能及时修复,潜在地将会进一步影响包括权威DNS(有多个独立的冗余,但依赖于持续的数据更新)在内的一些其他关键服务。

问题根源

在测试时对于 CyberPower UPS 测试特性的认识不足导致电池电量消耗至临界值,由于对 nut 的配置未考虑这种情况直接将服务器关闭,这使得必须亲自到机房才能完成服务的恢复。

阅读全文… ( 本文约 2390 字,阅读大致需要 5 分钟 )

试试看 CyberPower UPS

• Hardware

因为机房和家里 之前发生过一些停电的问题,因此这两处我都放了UPS。

UPS使用的铅酸电池是有一定寿命的,机房这台UPS是2016年5月上线的(当时是觉得已经到了5年,应该换掉了;而当时查看价格发现购买一个UPS电池自己更换的原材料价值和买一个新的差不多,于是就直接整体换成了 APC BE600)。

阅读全文… ( 本文约 1384 字,阅读大致需要 3 分钟 )