继昨日Linux 7.0-rc1版本发布后,Linus Torvalds撰写并合并了一项补丁,以移除Linux内核中的WARN_ALL_UNSEEDED_RANDOM配置选项。尽管该选项的设立初衷良好,但在某些系统上可能产生大量不必要的内核日志干扰。
WARN_ALL_UNSEEDED_RANDOM选项作为Linux内核的组成部分已存在多年,启用后会在内核使用未初始化随机数时发出警告。该选项早年引入旨在帮助检测系统安全使用随机数生成器之前就调用随机数生成的情况,以协助发现内核代码中未初始化随机数的使用。但由于某些CPU在完全初始化CRNG方面存在限制,WARN_ALL_UNSEEDED_RANDOM可能产生无休止的干扰信息。在收到一份内核错误报告(其中大量日志仅为未初始化随机数的提示信息,导致部分早期启动日志丢失)后,Torvalds决定彻底移除该选项。
Linus Torvalds在移除WARN_ALL_UNSEEDED_RANDOM选项的补丁中说明:
"该配置选项历史久远——最初是random.c的内部调试选项(当时称为DEBUG_RANDOM_BOOT),随后重命名并作为CONFIG_WARN_UNSEEDED_RANDOM配置选项公开,最终进一步更名为当前的CONFIG_WARN_ALL_UNSEEDED_RANDOM。
其设立初衷是好的:原本有限频次报告仅能提示部分情况,若需查看所有详细细节,则可启用此'ALL'选项。
然而事实证明——或许并不意外——当开发者不关注且不修复首批限频报告的问题时,他们必然也不会关注其他同类问题,因此对全部情况进行警告实际上并无助益。
非限频报告会引发新问题:热心用户启用调试选项后,这些无人关注的过量信息洪流反而会在系统故障时掩盖真正有价值的日志信息。
我最近收到一份内核错误报告(与随机数无关),其中三分之二被截断的dmesg日志全是以下信息的变体:
random: get_random_u32 called from __get_random_u32_below+0x10/0x70 with crng_init=0
这导致早期启动信息丢失(同时使未被覆盖的日志信息更难阅读)。
对于真正关注此类问题的开发者(如果存在的话),正确的排查方式几乎必然是使用启动时追踪功能。该功能不仅能提供调用堆栈信息,可能也是修复任何问题的必要条件。
相关说明请参阅Documentation/trace/boottime-trace.rst。
若未来因故需要重新引入此类信息的实际打印功能,必须建立去重过滤机制,而非当前这种'全量打印'模式。"
此举合乎情理,值得庆幸的是随着该选项的移除,这些令人困扰的内核日志信息将不复存在。
除今日移除该选项外,Torvalds在上周末发布Linux 7.0-rc1之前还进行了部分编码工作,引入了default_gfp()辅助宏并调整现有内核代码以适配使用。