我们再次回到博客,经过另外三周的(主要)错误修复。在 上一篇帖子 中,我们承诺会分享一些关于自更新功能以及新存储堆栈中 LVM 支持的消息。我们已经实现了这些… 还有更多!

所以这将会是一篇很长的帖子,但其中也隐藏着一些亮点。你必须继续阅读才能找到它们。

自更新改进

我们已经在之前的几份报告中提到过 YaST 中的新自更新功能,该功能允许在执行系统安装之前更新安装程序本身。

但事实证明,最初的实现存在一个重要的缺陷。自更新过程发生在执行了一些安装步骤之后。然后,在更新安装程序后,它被重新启动,并且其中一些步骤丢失了配置或只是重复执行了它们的操作。

经过一些讨论,我们决定将自更新步骤提前,放到最开始。为了下载更新,我们基本上只需要正常工作的网络连接和初始化的软件包管理。因此,我们将自更新步骤移动到初始自动网络设置(DHCP)之后,并将软件包初始化添加到自更新步骤中。

The self-update in action

如你所见,自更新步骤是安装工作流程中的第一步,语言选择和 EULA 对话框在自更新完成并重新启动 YaST 之后 显示。这意味着以下所有步骤都不需要记住它们的状态,因为它们不会在重新启动后被调用两次。

缺点是,我们不得不放弃一些功能。自更新步骤发生在语言选择和可选磁盘激活之前。这意味着默认情况下,自更新进度(以及潜在的错误消息)将以英语显示。但你仍然可以使用“language”启动选项,并通过 linuxrc 手动设置语言。

好的一面是,仅仅通过重新定位自更新过程,我们就修复了大约六个报告的错误。所以我们确信这是值得的。

有关更多详细信息,请参阅更新的 文档

亮点一:使用 info 启动参数

info 启动参数是一个相当旧的 linuxrc 选项,但可能不太为人所知。该参数是一个 URL,指向包含更多启动选项的文本文件。

当我们测试更新的自更新时,我们需要构建一个驱动程序更新磁盘并传递几个启动选项。为了避免在启动命令行上重复相同的选项,并与团队共享启动选项,我们创建了一个 info.txt 文件,内容如下:

insecure=1
startshell=1
dud=ftp://example.com/self_update.dud

然后你只需使用 info=ftp://example.com/info.txt 启动安装,linuxrc 将从文件中读取其他参数。这可以节省你大量的输入,尤其是在需要多次重复测试时。

修复了 7 个(是的,七个)不同 SLE 版本的安全漏洞

几周前,在常规代码审查期间,我们的安全专家在 YaST 的 libstorage 中发现了一个漏洞,该漏洞与我们向某些外部命令提供加密密码的方式有关。这种威胁到底有多危险尚有争议。它在系统安装期间从不是一个问题,但它会影响创建加密分区(主要是加密 LVM 物理卷)或安装系统中加密文件的管理员。

潜在的攻击者如果可以访问 /tmp,可以在 YaST 调用“cryptsetup”或“losetup”命令的精确时刻拦截密码。这真的只有几毫秒的时间。但我们不想冒任何风险,无论风险有多小。

因此,我们不仅修复了当前代码流中的漏洞,还将其回溯到所有仍在支持的 SLE 版本(即使在某些情况下只有一个客户)——回溯到 2009 年底的 SLES-10 SP3。这意味着将修复回溯到至少 7 个 SLE 版本(对于 Leap,这些修复会自动选取)。

正如你所能想象的,这变得越来越困难,因为我们回溯到历史中:在像 libstorage 这样的中央库中,由于工具和环境(内核、udev 等)不断变化,事情会不断变化。只有在一种情况下补丁可以干净地应用;在所有其他情况下,它都涉及大量的手动工作(当然包括测试)。

这有趣吗?不,当然不是。这是一项繁琐且令人沮丧的经历。我们是否欠我们的用户(付费客户以及社区用户)修复安全问题,无论它们有多么理论化?是的,当然。这就是我们做这些事情的原因。

存储重构:每个 LVM 部分都各就其位

在允许的时间内,我们继续向未来的 libstorage 替代品添加新功能。在之前的冲刺中,我们添加了支持读取和操作各种 LVM 块设备(PV、VG 和 LV),但一个重要的方面缺失了:决定操作的顺序与执行它们一样重要。我们指示库操作之间的依赖关系,并实施了几个自动测试用例,以确保我们不会尝试执行不那么聪明的操作,例如从卷组中删除物理卷并在之后 缩小其逻辑卷。

我们的自动化测试用例的好处是,它们会生成漂亮的图形,非常适合说明博客文章。:simple_smile

One of the several added test-cases

亮点二:享受 Google 夏季代码项目成果

如你所知,openSUSE 是被选为参与 2016 年 Google 夏季代码项目的自由软件组织之一。对于 YaST,这意味着我们有幸拥有 Joaquín Yeray 作为学生。你可以在 他的 GSoC 博客 中了解更多关于他和他在 YaST 和开源方面的经验。

但 openSUSE 社区不仅获得了一个新成员,我们还有一个新的 YaST 模块。yast2-alternatives 包已经接受到 Tumbleweed,也将成为 Leap 42.2 的一部分。所以我们有了新的工具加入我们心爱的配置瑞士军刀!

我们非常喜欢 Joaquín 和他的模块,以至于我们正在重构 YaST 开发教程,使其基于他的模块(而不是 yast2-journal)。他已经在为此工作,所以希望我们还能在一段时间内看到 Joaquín。

统一许可处理屏幕

我们收到了一份关于自动安装(AutoYaST)中的许可协议屏幕与普通安装期间显示的屏幕不同的报告。因此,我们决定查看问题并统一它们。我们正处于下一个 SLE 和下一个 Leap 开发过程的后期阶段,因此我们决定不统一代码,而是简单地调整一个对话框,使其看起来像另一个。此外,我们已经过了字符串冻结期,因此我们不得不使用一个技巧并重用另一个已经翻译好的文本。我们还借此机会修复了一些小的可用性问题。

在这些情况下,一些图像胜过千言万语,因此为了理解我们所做的事情,请查看 这个拉取请求 的描述,其中包含许多图像(对于本博客文章来说太多了)。

The new AutoYaST license screen

更智能的检查以避免重复的仓库

openSUSE 软件服务器定义了安装期间可以添加的在线仓库。openSUSE DVD 也指定了自己的在线仓库,这些仓库始终会添加到系统中。而且这些仓库重叠了。

在 openSUSE 42.1 中,即使已经有检查来避免这种情况,一个仓库也被添加了两次。所以我们进行了调查。

我们发现有问题的仓库的 URL 并不完全相同,其中一个带有尾部斜杠。因此,我们使 URL 比较更容错,如果 URL 仅在尾部斜杠上不同,则仍然被认为是相同的。

修复后,所有仓库都只添加一次,没有重复项。

亮点三:我们在寻找新的队友!

经过 12 份冲刺报告,大多数读者可能已经意识到,作为一名全职 YaST 开发人员的生活绝不是无聊的……而且我们总是很忙。乐趣和工作与他人分享会更好,所以…… 我们正在寻找新的英雄 加入我们的旅程。

即使你觉得在 YaST 中进行黑客操作不是你的事,也许你对 SUSE 的其他职位 感兴趣。

改进了关于 YaST 环境变量的文档

YaST 的行为会受到几个环境变量的影响,但并非所有人都了解它们。在本次冲刺期间,我们还决定花一些时间记录它们。生成的文档将很快正确地集成到我们的 集中式开发文档 中,但你现在可以偷偷地查看 这里

分支 Tumbleweed 和即将发布的稳定版本

我们过去几个月在博客中介绍的大多数功能和错误修复都已合并到 Tumbleweed、即将发布的 Leap 42.2 和未来的 SLE 12-SP2 中,因为我们始终尝试使这三个代码库尽可能地彼此靠近。

现在 Leap 42.2 和 SLE 12-SP2 已经接近发布日期,我们计划对更改更加保守。在本冲刺结束时,我们决定为 Tumbleweed 和稳定的兄弟版本分支代码。从现在开始,最令人兴奋的东西只会出现在 Tumbleweed 中,而 SLE 12-SP2 和 Leap 42.2 将变得越来越无聊。

车轮继续转动

所以这是刚刚完成的冲刺中最有趣内容的一个非常小的选择。接下来会发生什么?当然是另一个冲刺!我们已经为它计划了一些有趣的事情,例如将新的分区提案集成到安装程序中,或者完成在最新的 Hack Week 期间启动的 超酷的 UI 设计师

与往常一样,你可以在常规渠道(#yast IRC 频道yast-devel 邮件列表)中每天关注开发,或者等待另外三周的下一次冲刺报告。与此同时……玩得开心!