未来已经到来,或者直接在浏览器中编码

我会告诉你发生在我身上的一个有趣的情况,以及如何成为一个著名项目的贡献者。

不久前我正在琢磨一个想法:直接从 UEFI 启动 Linux...
这个想法并不新鲜,有很多关于这个主题的手册。 你可以看到其中之一 这里

事实上,我长期以来尝试解决这个问题的结果是完全形式化的 决定。 该解决方案非常有效,我在我的一些家用机器上使用它。 更详细地描述了该解决方案。 这里.

UEFI-Boot的本质是ESP(EFI System Partition)分区与/boot目录结合在一起。 那些。 所有内核和引导映像 (initrd) 都位于同一分区,UEFI 可以从该分区启动可执行文件,特别是启动系统引导加载程序。 但许多发行版中的 Linux 内核本身已经使用 UEFISTUB 选项进行了组装,该选项允许内核本身从 UEFI 启动。

该解决方案有一个不愉快的时刻 - ESP 分区被格式化为 FAT32,无法在其上创建硬链接(系统在更新 initrd 时定期创建硬链接)。 这并没有什么特别犯罪的地方,但是在更新内核组件时看到系统警告并不是很令人愉快......

还有另一种方法。

除了引导加载程序/Linux 内核之外,UEFI 引导管理器(与您需要注册操作系统引导加载程序的管理器相同)还可以加载驱动程序。 因此,您可以加载 /boot 所在文件系统的驱动程序,并使用 UEFI 直接从那里加载内核。 当然,驱动程序需要放置在ESP分区中。 这大致就是 GRUB 之类的引导加载程序所做的事情。 但亮点在于,所有常用的 GRUB 功能都已经在 UEFI 中了。 更准确地说是在它的下载管理器中。 更无聊的是,UEFI 启动管理器在某些方面甚至具有更多功能。

这似乎是一个美丽的解决方案,但有一个“但是”(或者更确切地说,确实如此,但稍后会详细介绍)。 事实上,UEFI 驱动系统非常简单。 不存在挂载文件系统或将驱动程序与特定设备关联之类的事情。 有一个传统名称为 Map 的系统调用,它依次获取每个驱动程序并尝试将其与所有(至少是合适的)设备关联起来。 如果驱动程序能够获取设备,则会创建映射 - 连接记录。 这正是新加载的驱动程序与所有其他驱动程序在公共堆中初始化的方式。 您只需将驱动程序引导记录中的一位 (LOAD_OPTION_FORCE_RECONNECT) 设置为 1,UEFI 将在加载后执行此全局重新映射。

但这并不那么容易做到。 标准 efibootmgr 实用程序(用于配置 UEFI 卸载管理器)不知道如何(或者更确切地说,不知道如何)设置此位。 我必须通过一个相当复杂和危险的过程手动安装它。

再次尝试用手做,我无法忍受并正式化 GitHub 上的问题 要求开发者添加此功能。

几天过去了,却没有人理会我的请求。 出于好奇,我查看了源代码......我分叉了它,并在我的膝盖上想出了如何添加此功能......“在我的膝盖上”因为我没有安装类似的东西并编辑了源代码直接在浏览器中编码。

我对C(编程语言)了解非常肤浅,但我勾画出了一个近似的解决方案(主要是复制粘贴)......然后我想 - 至少我可能有很多错误(我过去尝试编辑别人的) C 代码大约第 10 次完成)我将发出 Pull 请求。 出色地 设计的.

Travis CI 被附加到检查拉取请求。 他认真地告诉我所有的错误。 好吧,如果存在已知错误,则无需修复它:再次在浏览器中修复,并且在第四次尝试时代码有效(对我来说是一项成就)。

就像这样,在不离开浏览器的情况下,我将一个非常真实的 Pull 请求格式化为一个实用程序,该实用程序几乎在所有现代 Linux 发行版中都使用。

令我惊讶的是,在没有真正了解该语言的情况下,没有设置任何东西(依赖项需要相当多的库来进行汇编),甚至没有运行编译器,我只是在浏览器。

然而,自19年2019月XNUMX日以来,我的请求一直没有得到回应,我已经开始忘记这件事了。

但昨天这个请求被添加到了 master 中。

那么我的故事是关于什么的呢? 他谈论的事实是,在现代技术的框架内,事实证明,真正的代码已经可以在浏览器中编写,而无需在本地部署任何开发工具和依赖项。

此外,我必须承认,这已经是我对知名(至少在狭窄的​​圈子里)实用程序的第二次拉取请求。 上次,我要求更正 SyncThing Web 界面中某些字段的显示,结果导致我在完全不了解的环境中进行了一行编辑。

只有注册用户才能参与调查。 登录拜托

我应该多写还是不写?

  • 是的

  • 不值得

294 位用户投票。 138 名用户弃权。

来源: habr.com

添加评论