开源之夏专访
2023 #10

OSPP:你作为在读本科生,已经有了较为丰富的项目开发和开源经历了,这些经历为你带来了什么。简单介绍一下你一路走来的心路历程吧?
马健尧:对于我来说这是从迷茫到坚定的一个心路过程,大一下学期时我仍在考虑自己该用什么语言进行开发?走错路了怎么办?大二上学期“项目”在我眼里仍然是高大上的一个名词,而大二下学期时我已经能够在开源之夏中完成一个像样的项目开发了。期间走过很多弯路,我最宝贵的收获就是:行动起来,思而不学则殆。我们只有开始产出的时候才能想明白一些事情,与其瞻前顾后,不如先尝试。
# 参与开源和开源之夏
OSPP:最初是如何了解到并决定参与开源之夏活动的?
马健尧:我是 2023 年 4 月底时才了解到开源之夏活动的,我的操作系统陈莉君老师在鲲鹏校园行中演讲时提到了这一活动。在演讲中我感受到了开源的美好愿景,开源之夏提供了非常好的一个平台,让学生们可以在导师的指导下对开源社区进行探索与学习,同时能够提升学生技术视野、接触行业前列的开发人员,这些机会与挑战让我兴趣盎然。
KubeOS 镜像构建支持定制化配置
KubeOS 是在 openEuler 社区孵化,基于 openEuler 的容器操作系统(简称为容器 OS),KubeOS 是面向云原生场景,专为容器和集群运行而设计的轻量化操作系统。目前 KubeOS 已提供 OS 镜像的构建工具,但是用户使用的场景不同,需要更加灵活的 OS 镜像构建能力。本项目期望是优化 OS 镜像构建工具,增加镜像定制化配置的能力,提供更加灵活可用的镜像制作能力。 项目链接: https://summer-ospp.ac.cn/org/prodetail/23b970506
马健尧:我在本届活动中承担的开源项目是 KubeOS 镜像构建支持定制化配置。我需要构建一个命令行工具,满足用户在创建镜像时对存储配置、文件配置、用户配置、systemd service 的需求,开发过程中遇到不少挑战。
可后来考虑到有个新的需求是支持创建多个分区,变动的参数不便于直接调用 kbimg.sh,需要生成一个新的脚本,于是有了这样的结构:
第二个问题是内存边界,当我在分配空间时,提示
错误: 您要求将分区从 4280MB 移动到 21.5GB (扇区 8359375..41943039)
我们可以管理的最近的分区是从 4488MB 到 21.5GB (扇区 8765440..41943006)
奇怪的是,我临近分区的大小以 4280 为边界,这个分区为什么不能以 4280 开始呢?
查了很久的资料,很有可能是 parted 为了防止分区冲突,在每个分区边界附近保留了一个小的缓冲区导致的这个问题。
从操作系统的角度来看,分区表和文件系统的区别需要注意:
分区表操作是在块设备的元数据中定义分区起止位置,并不真正占用空间。
而初始化文件系统是在这些分区内真正写入数据占用空间。
parted 在移动分区位置时,是操作分区表的元数据,调整起止位置信息。这时可能会在分区边界留出很小的缓冲区(比如 512 字节),从而造成实际可用空间比显示的少一点。
但文件系统在格式化分区时,会将整个分区空间全部使用。所以文件系统格式化后,可用空间会比 parted 显示的稍大。这个细微的差异,加上 parted 内部为防止重叠保留的缓冲区,就可能导致这种奇怪的错误。
还有一个有意思的问题,就是 efi 模式下创建的分区表是 gpt 格式,允许直接创建多个主分区,而 legacy 模式下创建的分区表是 msdos 格式,只能创建三个主分区,一个扩展分区,之后才能在此扩展分区之上创建多个逻辑分区。由于是不常出现的问题,因此想要找到解决方法只能慢慢的查资料,从 parted 的使用文档中读,这个过程很熬人,也很有收获。当然,在 git 、Go、code conduct 等方面也学到了很多知识,就不展开叙述了。对待问题我想和大家说的是:没有一开始就完善的程序,我们能看到的优秀项目如 Kubernetes,KubeOS 等都是经过多轮迭代升级而来。直面我们的错误,找出解决的方法,这一过程是很好的锻炼。
下面附上我的最初设计思路和最终设计思路,可以看出还是有许多变化。


OSPP:作为学生如何发掘自己的兴趣方向,找到自己热爱的开源社区?
马健尧:最好的方式是把视野放宽,注意 “beyond the code”,技术方向可太多了,前端、后端、ios、安卓、云原生、web 开发、客户端开发....我们要关注现实生活中自己擅长的、感兴趣的事情,才能找到自己热爱的开源社区。举个例子,我被 chatGPT 吸引了,意识到人工智能会给人类未来生活带来巨大变革,也意识到算力需求将会指数级增加,那么如何提供这个算力?了解云原生技术 -> 有哪些开源社区正在致力于这个方向 -> 找到对应社区 -> 阅读社区文档 -> 选择一个自己最感兴趣的。
OSPP:当前很多学生并不容易迈出参与开源社区的第一步,你认为学生如何有效参与开源社区?学生与开源社区之前能否建立长久的关联?
-
阅读社区的文档,一般完善的社区会有帮助你理解项目功能、各模块功能的 quick-start 文档; -
找到一个感兴趣的功能运行,因为一个大型开源项目会有很多功能模块,例如 KubeOS 就有着 agent、proxy、operator、kbimg 模块; -
读源码,看看这个功能是怎么实现的,相信现在有各种人工智能的帮助,读源码对同学们来说会方便很多。
-
观察是否有可以优化的地方,如果有,请尝试提一个 issue,如果社区觉得你的想法很棒,你就可以尝试完成你的 issue; -
关注社区 issue,是否有你能够完成的,如果有,请积极的申请它,它可能是几行代码的改动,也有可能是新增一个功能模块。
openEuler 社区
欧拉开源操作系统(openEuler, 简称“欧拉”)是面向数字基础设施的操作系统,支持服务器、 云计算、边缘计算、嵌入式等应用场景,支持多样性计算,致力于提供安全、稳定、易用的操作系统。通过为应用提供确定性保障能力,支持 OT 领域应用及 OT 与 ICT 的融合。欧拉开源社区通过开放的社区形式与全球的开发者共同构建一个开放、多元和架构包容的软件生态体系,孵化支持多种处理器架构、覆盖数字设施全场景,推动企业数字基础设施软硬件、应用生态繁荣发展。
官网:https://www.openeuler.org/zh/
OSPP:高校的教学内容与实际的开发环境是否有差异?学生应该如何自学更好地适应实际需求呢?
马健尧:这是困扰绝大部分计算机相关专业同学的问题,我在与不同学校、不同年级的同学交流之后得出这样一个看法:培养方案并不适合所有人。我相信培养方案的目的是自底向上,将各个底层知识全部打通,让学生拥有十分扎实的内功,可是大部分学生在自学时会感受到高校教育内容与实际开发环境有极强的割裂感。这样的培养方案造成了一个现象:想要直接就业的学生们倍感焦虑,绝大部分学生被推向考研。由于时间限制,大三需要实习、秋招,在校内将课程学好,想要投实习、找工作的时候却发现自己学的知识与工作需求并不匹配。比如计科专业是软件和硬件交叉学习,这对于在探索后想要走软件方向的学生是十分苦恼的。秋招、春招的时候发现自己没有实习经历、项目经历,于是被迫考研。国家也注意并重视这一现象,正在积极改革,不过预计得在 27 届之后。

从这个 Golang 工程师的需求举例,我们可以获取哪些信息?
学习计算机网络、操作系统、数据库、数据结构与算法;
学习进程间通讯编程;
学习存储系统;
学习 shell 工具;
-
学习后端服务技术栈。
至于语言的选择,其实每个语言都有其生态,不过是应用面有所区别,你只需要关注各个语言的生态,哪一个更符合兴趣就选择哪个,基础练扎实之后,转语言不会是一件很困难的事。
申请时请多关注几个项目,找一两个最感兴趣的就好,撰写申请书也是一件值得重视的事,体现了你对项目的理解与开发能力,与其左顾右盼不如专注一个项目申请书的完善。
请保持与导师的沟通,开源是相互协作的过程,不是单兵作战,更何况开源之夏为同学们请来了导师,他们的一句话也许会解决困扰你数天的问题。(在此感谢李元戎导师的指导,在她的帮助下学习,我受益良多)
请提前关注社区、社区方向与议题,一般某些议题会被保留,作为开源之夏的项目。同时开源之夏选择自己有经验、有贡献的社区会提升你的申请成功率。
本文分享自微信公众号 - openEuler(openEulercommunity)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。