热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LWN:Linux5.12中非常非常不妙的错误!

关注了就能看到更多这么棒的文章哦~Linux5.12’sverybad,doubleungooddayByJonathanCorbetMarch8,2021DeepLassiste

关注了就能看到更多这么棒的文章哦~

Linux 5.12’s very bad, double ungood day

By Jonathan Corbet
March 8, 2021
DeepL assisted translation
https://lwn.net/Articles/848431/

Linus Torvalds 发布内核的 -rc release 是确有必要的:在两周时间的合并窗口中,有 10,000 个左右的改动流入内核后,肯定会有一些错误需要解决。在所有这些 patch 被整合之后,-rc 内核提供了一个更广泛的测试机会。大多数时候,-rc 内核(甚至是最初的-rc1 版本)运行起来出乎意料地稳定。不过偶尔也会出现一些问题,让早期的测试者感到后悔来测试这个版本。事实证明,5.12-rc1 内核就是其中之一。

1 月 26 日,Christoph Hellwig 发布了 17 个 patch 的系列改动,其中清理了分配 BIO 结构的代码。BIO structure 代表了一个一个的 block-I/O request。最后一个 patch里简化了 swap file 所需的 request 分配。这组 patch 在一天后由 block 子系统的维护者 Jens Axboe 合入了。然后被包含在 2 月 17 日的这个 pull request 中,并于 2 月 21 日登陆 mainline,作为 Torvalds 家里恢复电力供应后所合入的大批 pull request 中的一部分。

“swapping”,是指当内存紧张时,内核将匿名页面(anonymous pages,那些没有对应的磁盘文件的 page——换句话说,就是程序数据)移动到 persistent storage 中。Linux 可以直接将数据 swap(换出)到块设备上的某个分区,这是传统系统中的常用设置。但是也可以换出到挂载上来的文件系统中的某个文件,而且这两种方式性能差异不大。交换文件(swapping to a file)给管理员带来了一些额外的灵活性。这种方法很简单,可以在不干扰现有 workload 的情况下,给当前正在运行的、内存不足的系统帮忙缓解一下紧张的内存空间。

有问题的 patch 在使用交换分区的情况下效果还不错。但是,当使用交换文件时,错误的丢弃了在文件系统中各个 block 中的 offset 偏移信息。这就导致了数据在 swap 出去的时候会写到错误的位置,而且很可能那里原本就有某些需要保留的数据。换句话说,放置了交换文件的这个文件系统会被破坏。有趣的是,2014 年就引入过一个类似 bug,并且潜伏了很长时间一直没有被发现,因为它只在极其罕见的配置条件下会出错)。

3 月 2 日,在 mainline 中合入了 fix。一天后,Torvalds 向 linux-kernel 邮件列表发送了一个警告邮件,描述了这个问题,并指出:”这就是我们业界所说的’double ungood'” 。他从他的 git 仓库中删除了 5.12-rc1 tag(其实是把它改名为 “5.12-rc1-dontuse”),并明确表示所有人都应该避免使用这个版本。他还对维护者提出了一些要求。

一个要求是关于 5.12-rc1 tag 的,他可以从他的版本库中删除它,但这不会改变其他人的 git 仓库。所以,他要求维护者应该自己手动删除这个 tag,防止不小心使用到这个版本。

除此之外,子系统的维护者经常会基于 -rc release 来开启新的分支,甚至很有可能是基于-rc1。但这次这样做的话,这些分支都会对正常的开发和测试社区造成严重危害,因为它们都不包含这个问题的 fix。git bisect 工具经常被用来寻找确认哪个 patch 导致了质量回退(regression),因此 git bisect 可能会导致当前代码跳到开发历史上的任何位置,如果包含那个错误 commit 的话(但不包含修复),这个 branch 会进一步扩展出去,导致今后发生破坏文件系统的情况。这一点,看起来也是 Linus 所说的”‘double ungood'”。

因此需要人们不要基于 5.12-rc1 创建分支,而是要么使用更老的版本,要么等到-rc2。这对于那些已经发布了基于-rc1 的分支的子系统维护者来说,就来不及做什么了。确实有些人肯定已经公开发布了。他们必须做个选择,是保留这个有危险的分支,还是将其 rebase 到一个更安全的 commit 节点上、但是可能会给其他在使用该 branch 的人带来麻烦。这种 rebasing 的做法通常是不受欢迎的,但 Torvalds 明确表示这次可以,也是期望大家这么做。

内核社区大多数人还是把它当作 “bug happened” 的情况,然后继续向前演进。我们确实可以说,这个过程确实已经按照它本该有的方式起作用了:一个灾难性的 bug 在稳定期(during the stabilization)被提前发现,并且永远不会接近生产系统(production system)。话虽如此,但可能还有反省和思考的余地,即如何能把事情做得更好。

例如,有人可能会说,review 过程可以做得更好。这个 patch 只发布了一次,第二天就被合入到了代码库中。mainline 仓库中的 patch 包含两个 Reviewed-by tag 和一个 Acked-by tag,但邮件列表记录里面可以看出这些 tag 都是为该系列中的其他 patch 提供的。也许这三个 reviewer 人都在邮件列表之外提供了他们的 Reviewed-by tag,但从公开的记录来看,看不出这个导致问题的 patch 到底有多少人 review。

就算有更多人 review,但是我们也不能确保这个 BUG 触发之前就被发现,但似乎这次没有太多的 review 机会。人们经常把 “cleanup” 补丁看成天生就是安全的,需要较少的 review,但这些 patch 也可能包含微妙的 bug。

在这个过程中,可以做得更好的是关于提醒整个社区这部分。在上面链接的邮件中,Torvalds 承认他应该更早采取行动,而不是等着确定这个提出的 fix 方案是否真的可以让问题消失。可以想象,下一次的警告邮件会更早发出。

这里还有一个小问题,居然很少有人谈到。vger.kernel.org 上的邮件列表已经有一段时间都有些小问题了。有时候,邮件列表上的邮件会被延迟一两天,或者完全消失了。Torvalds 的警告并没有延迟那么久,但还是花了几个小时才送到 linux-kernel 的接收者手中。这个警告邮件的延迟传递,是否导致了更多的测试者受害呢?还不清楚,但肯定这是没有好处的。

好消息是,目前正在采取措施使 vger mailing list 可以更加稳定、可靠。运气好的话,邮件列表的问题在不久的将来就会成为过去式。

不过,哪怕到了那个时候,只发给 linux-kernel 的警告邮件也有可能消失在其他信息之中。邮件列表中每天都会超过 1000 条信息,很可能会淹没重要的信息,并导致许多开发者完全取消订阅。对于这种紧急信息,我们很可能需要更好的沟通渠道。

最后,这个 bug 造成的实际麻烦可能没有想象中那么大,并没有出现大量的 “它毁了我的文件系统!”的消息。流程确实大部分都能按照预期的方式进行。如果运气好的话,从这次事件中吸取的教训可以帮助这个流程在下一次工作得更好。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

《LWN: Linux 5.12中非常非常不妙的错误!》


推荐阅读
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
author-avatar
手机用户2502917141
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有