开源社区与运营 – 2021 上海计算机教育年会演讲稿

大家好,我是马全一,目前在华为技术有限公司工作,任开源社区运营总监,主要负责 openEuler 操作系统的开源社区运营,同时也负责 openGauss 、openLooKen 两个开源项目的运营指导。2000 年参加工作后一直从事技术开发和技术管理等工作;2013 年开始在国内运营 Docker 社区,推广容器技术、Kubernetes 等云原生技术;2015 年加入华为负责 CNCF 等海外基金会的一些工作,维护华为和谷歌、红帽等云原生领域核心企业的开发者关系,同时也参与了华为云容器相关产品的设计和开发;2017 年底离开华为加入腾讯,负责腾讯云容器产品的设计,开源了 TKEStack 项目;2020 年初又回到华为负责 openEuler 操作系统开源社区相关的运营工作。因为工作的原因,这两年也致力于同一些高校操作系统课程的老师合作进行教学改革的探索。


今天和大家主要聊的话题是什么是开源社区以及开源社区和高校的关系等几个方面。在这两年的工作里面,我发现大家对开源、对社区这两个词都有一定的误解,所以今天也是借这机会跟各位老师一起探讨这个非常有意义的话题。

最近这两年 “开源” 这个词逐渐进入到大家的视野,尤其是最近政府把开源写入了十四五的规划中,大家更加迫切的去思考这个词。十四五规划在 第一节 加强关键数字技术创新应用 中写了如下话:

聚焦高端芯片、操作系统、人工智能关键算法、传感器等关键领域,加快推进基础理论、基础算法、装备材料等研发突破与迭代应用。加强通用处理器、云计算系统和软件核心技术一体化研发。加快布局量子计算、量子通信、神经芯片、DNA存储等前沿技术,加强信息科学与生命科学、材料等基础学科的交叉创新,支持数字技术开源社区等创新联合体发展,完善开源知识产权和法律体系,鼓励企业开放软件源代码、硬件设计和应用服务。

这周我也在 工业和信息化部关于印发“十四五”软件和信息技术服务业发展规划的通知 看到了反复出现 ”开源“ 这个词,在整个通知中提到 ”开源“ 有 40 多次。相信教育部等相关部委也会根据十四五规划的精神发布者自己的规划,可以预计 ”开源“ 一定会出现在各种文件中。在国家的文件中,我们可以看到 ”开源“ 是作为一种软件开发的行为出现,是一种软件开发的模式,从封闭的模式到开开放的模式。

当然我们也经常看到国外的一些文章介绍开源,国内甚至出现了一些人称自己是 “开源布道师” 甚至是 “斗士”。从这些人的口中讲出来的开源,更像是一种文化现象,是一种软件开发的指导思想。这让我想起来这些年在软件开发行业经常讲 “DevOps” 这个词,现在大多数软件公司的软件开发和运维都尽量遵循 “DevOps” 。但是 “DevOps” 是没有一个固定规则的,我们看到的一些讲 “DevOps” 的文章也更多是一种最佳实践的总结,所以这些总结都是根据公司的业务发展、技术演进逐渐演化而来的,用一个更加学术的点的词形容 “DevOps” 是形而上学的从非官方角度听到的国内外开源各种内容,和 “DevOps” 更见像一些,也是一种形而上学的指导。

那 ”开源“ 到底是什么呢,其实也根本没有一个官方的定义。最近我也有幸参与了信通院、工信部等部门关于 ”开源“ 的相关标准制定,在各种讨论中来自于各个公司和社区的专家也有各种争论,我看大家一时也不会达成一种共识。当 ”开源“ 对于软件开发影响越来越大,当”软件吞噬世界,开源吞噬软件“这样的论点层出不穷时,就会引来一些主管机构的忧虑,当然就有必要制定标准。制定标准的目的在我看不仅是了发展开源,更多的是管理”开源“这种行为。当然也参照国外的做法,成立了政府领导的非盈利组织开源基金会,这是一个进步,当然也是一个困扰,国内早就有不少非盈利组织承担某些政府职能造成的负面新闻。

从我个人来看更觉得 ”开源“ 是一种文化,是一种文化来指导工程师的软件工作,就像 “DevOps” 指导大家的开发过程更加敏捷和高效一样。如果参与者没有 ”开源“ 的精神,那 ”开源“ 就只是一种动作,把代码开放出来让人访问而已,可能这也是国内会有我从事的这个工作职位 ”开源运营“ 的原因。代码开放出来需要有人访问,需要有人去用,需要有人参与到开源项目中贡献,那怎么办呢?找个人来做这个运营的工作,把社区盘活吧。谁想到这个职位还挺热的,最近每周都会有不同的猎头加我的微信问我某某公司的开源项目是不是感兴趣。

所以 ”开源“ 是一种文化和行为的复合体,是无法没有一个具体标准的行为。所以我想现在看到的国内 ”开源“ 更多是一种行为,文化对于本来已经博大精深的中国文化来讲,融入也就需要漫长的时间,也许更多的是将来会是有一种 “中国特色” 的 “开源” 。当然这不是我们的独特性,在美国和欧盟也都是有更多的 “开源” 被政府、军方进行管理和指导。

提到社区,这又是一种纠结的词需要解释。首先大家提到社区就会想到我们居住的小区,实际在 Community 这个词的翻译成社区后首先用到了我们居住地形容,真正对于文化这个方向,社区这个词实际用的比较少,其实社区是没有物理、时间和空间限制的。

我在运营工作中最被经常被问的问题是如何加入 openEuler 社区?在当前我接触的人里面,大多互联网经历时注册论坛开始的,其实我上学的时候也会跑到水木清华上求各种下载资源的链接。所以在大多数人的眼里,加入社区就是要去个论坛中注册,如果没有注册过程那就不叫加入社区。一般解释到这里的时候,我脑中就会出现电影电视情节中普遍的现象,大学生穿着麻布 Hoodie ,拿着蜡烛口念咒语加入兄弟会的情节。

跟合作伙伴解释什么是开源、什么是社区还好,这正好是我的工作,如果大家都懂开源,我也就失业了,只能回去写代码搞产品设计了。但是公司也让我讲明白如何加入到 openEuler 社区,因为公司有一些其它的组织同时也在搞技术社区,方法就是弄了一个论坛,只要在论坛注册了就是加入了这个技术社区,不管多少方法总是可以搞几十万注册用户的,也就是几十万人加入了某技术社区。这给老板汇报的时候听起来多有气势和价值,所以我的职级徘徊不前是由原因的。当然还有某友商搞的 AI 开源框架,技术做的确实不错,但说起来社区都敢讲百万了,更让我无地自容,愧对公司给我的薪水了。

为了应对公司的纠结,openEuler 以签署 CLA 作为加入社区的条件。CLA 是 Contributor License Agreement 的简称,中文称为贡献者许可协议,其实这是一些大型项目为了在法律诉讼中免责而让开发者签署的一个文件,跟社区其实没什么因果关系。因为 openEuler 设计的 CLA 签署环节中,企业签署需要加盖公章,一般公司都会有个相对比较正式的流程,有法务审核,如果签署的话,是对 openEuler 社区的认可,所以作为该公司加入 openEuler 社区这个说法来看,于情是可以讲的过去。所以公司动用各种部门的力量,在短短两年的时间里面签署了 300 多家公司,而且在当前这个政治形势下,还有不少欧美公司签署,确实是国内执行力最强的公司。只是于理来讲,这和加入社区没有什么关系。

对于社区的真正含义,只要是大家对共同的事务感兴趣就可以说是社区的一份子了。即使我是使用 openEuler 操作系统的用户,没有跟社区有什么交集,都可以说是社区的成员。所以这里关键点是对共同的事务感兴趣,这里的事务可以是实体的也可以是非实体的。所以从形式看,我们可以用另一个词来形容,Club 。当然这个 Club 不是夜店的意思,而是指对某件事情感兴趣的人聚集在一起而形成的团体。我和几个做云原生相关开发的开发者朋友,因为大家都对某种酒类感兴趣,所以在去年疫情的时候组建了一个 ”云原生喝酒 SIG “ ,这里有人喜欢白酒、有人喜欢啤酒,我更喜欢精酿啤酒。其实这就是一个 Club 的形式,我们也可以看作是一个社区,我们经常半夜聚集在一起,通过腾讯会议大家各自拿出藏酒,边喝边讨论技术问题或者各种八卦消息。在我看这是一种非常让人舒服的社区形式,没有必要大家一起签个文件什么的,最近这个社区酒后已经膨胀到要去注册一个 ”云原生喝酒基金会“ 来正式运作几个开源项目了。

所以社区是一群人因为共同的兴趣和爱好,不论时间、空间、年龄、性别、国际、种族等等聚集在一起形成的一种聚集形态。当然可以给这种形态设计一个门槛,签署一些合同或者文件,或者其它的任何形式的仪式。

当我们把开源和社区两个词叠加在一起,就得到了一个组合。华为内部有个黑话可以解释这种组合,这个词就是“正交” 。对于 openEuler 社区来讲,这个共同感兴趣的实体就是 openEuler 开源操作系统,这个社区就是属于下载安装使用的那些开发者,在 gitee 上提交代码的开发者,参加社区会议的开发者,还有那些看到 openEuler 各种宣传但因为拖延症晚期还没有去尝试更深入了解的人。我的工作就是让这些人能够在社区产生更深层次的活动,产生新的想法和 Idea 并且鼓励大家把它变成现实。听起来这份工作是让人心悦神奕的,其实在工作中也是磕磕绊绊一地鸡毛。

我在公司内外最经常讲的话是 “每个人都是趋利” 的,对于我自己也是这样。所以这样一个面向服务器的操作系统,大多数用在数据中心安装的操作系统,实在是无法激起那些已经每天 996 ,007 的开发者去尝试使用的。不管我们提供多少听起来让人热血沸腾的技术特性,对于开发者来说并不能影响他们眼前的工作,也无从有动力做这个尝试。操作系统可以说是这个行业最古老的存在,技术代差以数十年记,在当前互联网和智能设备普及的今天,是拿不出来一个什么特性吸引普通开发者去尝试的。不光是华为,腾讯阿里这些友商的竞品也跟我们面临了同样的问题。

但是华为有自己的战略决心,我们会把精力投入到下一代开发者的培养上,这是其它公司的在这种重投入,长周期和回报低的项目上最终会被甩在华为身后的原因。这是大家这两年在华为参与、主导的跟各个高校合作上,除了之前的各种合作方向之外,操作系统也逐渐增加比重的原因。但是我们看到的是高校的计算机教育上,从事基础软件不光是操作系统,包括数据库的教授和老师是少之又少的。当然这也是 “趋利” 的结果。但是华为有信心更有耐心,会基础软件这个方向持续投入,为整个行业培养培养未来的基石人才。

我们这两年也在尝试和高校从事教学改革之外的合作方式,譬如我们正在和大连理工大学软件学院在开源合规、操作系统、Rust 编程语言等方向展开更多的合作。由华为的技术专家和大学教授一起组建开源实验室,辅导学生在各种前沿的技术方向上投入研究。当然这种研究的基础是必须是开源,必须是在 openEuler是社区进行。我们采用这样开放的研究方式,希望能够尝试把开源社区构建成一个开放的科研平台,聚集不同学校感兴趣的老师一起深入探索。我们希望把开源的文化精神范围扩大,扩大到学术研究的方式上。这件事情给我带来的愉悦感,远远大于给各种企业讲解如何加入开源社区来的更多。

openEuler 开源社区和中国科学院软件研究所深入合作了 2 年,我们共同执行的 暑期 2020 、暑期 2021 是这两年国内开源社区最受瞩目的项目,通过这两年的暑期活动,有近千名高校学生有机会通过开源社区和业界顶尖的工程师合作、学习。最近我们又设计了新的 openEuler 开始社区实习项目,让这种方式从暑期的时间延续到在校的其它时间。学生加入到实习项目后,可以在开源社区领取实习的项目,和华为以及其它合作伙伴的工程师一起学习工作,完成项目后会有相应的积分,获取一定积分就可以得到中国科学院软件研究所开具的实习证明,同时也有实习奖金。我们希望这种方式的实习工作能够得到学校的认可,能够抵学生在校期间的实习学分,让学生有更多的动力参与到开源社区,了解开源社区。期望通过开源,通过社区让学生有机会对自己所学的专业、课程等东西更加深入,能够热爱自己的专业,成为未来软件发展的中坚力量。

我们一直致力在高校和开源社区间建立起一个有效的链接,通过开源的精神和形式,真正的把产业、教学和科研连接在一起,形成一个正向的循环,而不是把高校作为企业研发人力的补充。开源是精神文化,也是形式和平台,让我们一起利用好当前的这个机遇,共同获得成功。

在 openEuler 开源社区的运营实践中,我们针对普通开发者的运营工作更多的是依靠商业牵引,所以在华为的工作体系中有商业体系对开源社区项目的商业拓展进行支持,这是大多数公司对于开源项目发展给予不了的支持,所以 openEuler 的商业拓展结果强于高校开发者生态的发展速度。这对高校的开发者也是一种牵引,希望商业上的成功能够吸引高校的老师和学生投入到这个领域,但是这种变化的速度是比较缓慢的。如果我们希望社区真正意义上的成功,需要给开源社区一个充分的成长空间。之前我有运营过国内的 Docker 社区,而后被 Kubernetes 社区超越。从它诞生到极盛花了一年半的时间,这是至今为止开源社区成长速度最快的。当然这里有 Docker 技术和产品本身的特性,而且当处在 IaaS 发展尽头如何向 PaaS 转身,加上 Solomon 、Brandon 等一众人物的加持,才有了容器技术发展的今天,也才有而后 Kubernetes 出现一统江湖,当然 CNCF、OCI 等一众基金会的成立也是为了削弱 Docker 的发展。从这里我们看到,一个开源项目的成功也离不开“天时”、“地利” 和 “人和” 三点。我从腾讯回到华为参与 openEuler 开源项目的运营也正是看到 openEuler 在当时是具有这三点的。

何为 “天时” ?这几年正直中美贸易战愈演愈烈之时,华为遭受各种方向的制裁,从国家政策到公司内外都看到我们在基础软件领域的薄弱,无法支撑自主的发展。这时不管是政府的政策还是公司内的战略都会向基础软件倾斜,才会有华为持续的大规模投资支撑 openEuler 操作系统发展。没有这些战略资源的支持,openEuler 是不可能发展到今天的程度。这些也是商业运营能够快速发展的根本原因。加入 openEuler 社区的 300 多家企业也是看到了这种大势,加入了也不会损失什么,这个车不可能不搭。

何为 “地利” ?这 2 年 openEuler 并没有走国际社区的运作路线看,因为疫情出国是有些麻烦的。所以我们把优势的人力和优势的资源都集中在国内,利用华为已有的商业渠道网络、校园合作网络去发展社区的商业合作伙伴,发展高校师生参与到社区。虽然对比 CentOS 、Debian 和 Ubuntu 在时间上 openEuler 已经落后很多,但是在国内这个有限的地利范围内,我们集中优势努力的去弥补时间上差距。在有限的地利空间内,在战略资源优势集中的情况下,我们可以创造局部的优势,成为成功者。

何为 “人和” ?在运作 openEuler 操作系统的最初,华为就坚持一个商业策略,华为自己不做 openEuler 的商业发行版,这是和国内其它操作系统商业发行版厂商合作的基础。因为华为一直坚守这个承诺,所以在 openEuler 社区才建立起最核心的一圈伙伴和开发者。这也是社区发展的基石,大家以 openEuler 作为上游开源发行版,建立起一个可以循环的商业场景。没有这些人坚守在社区,也没有机会扩大发展。

如果我们坚持运营一个开源社区,顺应 “天时、地利、人和” 之势才有获得成功的可能,另一个方面要给开源社区一个时间,万物发展都有它顺应的规律。之前我谈到 Docker 社区的发展需要了一年半时间,openEuler 从各方面来讲绝对没有当时 Docker 优势,所以经过两年我们也不能讲自己是成功的开源社区,所以也是希望在座的各位能真心的支持 openEuler 开源社区,希望媒体给社区、给开源一些空间,避免过度的宣传造成 “捧杀” 。

说到开源和社区,现在我经常被问到如何建立一个社区,如何运作一个社区。尤其是一些原先和开源搭不上边的机构和组织。尤其是现在搞个社区经常是一个机构牵头,然后说我成立某某社区,然后挂靠在一些机构和学会,然后就利用各种行政手段让一些头部的公司来加入。前面这个阶段操作的如火纯青,因为以前搞各种协会套路都很熟悉了。而后就会问一个问题,我怎么运营这个社区,怎么搞开源,面对这种机构的教了我其实内心是很无语的。

首先当我强调社区属于所有参与的人,不属于某个人、某个机构或者建立的人时,我们遇到第一个麻烦的问题。那么开源社区属于谁呢,当然如果从法律角度来说,还有签署 CLA 的各种问题。但是核心的来讲,社区是属于所有参与者的。这个问题其实不光是外部交流起来困难,在华为内部也是如此。我们要清楚的意识到参与开源社区的所有人都是平等的,虽然有些人在社区里面有些 Title ,但是都不代表他们具有权力,这些 Title 代表了他们服务社区的义务。最近有个 Rust 基金会 Moderation Team 辞职的消息,可以看到国外成熟社区的运作模式,任何一个 Team 都是有自己的职责和工作,Team 之间是相互制衡的。那么一个主管机构建立了一个社区,然后听到说这个社区应该是属于所有人的,大家可以想象交流时的场景了。

其次开源社区是一定要有开源项目的,没有开源项目大家就没有交流的标的物了。大家都没有共同感兴趣的话题,这社区还聚体在一起做什么呢?当然也可以像我们可以搞一个云原生喝酒社区。那么有多少开源项目能够建立起一个社区呢?我随手写几行代码开源就能搞一个社区么,这明显是不可能的。这里涉及到如何设计一个开源项目,这是个技术问题,也是产品问题。之前我有一些演讲谈到开源项目本身当作是一个产品来设计,今天可能没有更多的机会去讲细节,希望下次能有机会来交流。

最终,我们要讲为什么要运营一个开源社区。从华为的角度运作 openEuler 操作系统是有明确的商业诉求,就是为了华为的鲲鹏服务器建设一个具有完整生态的操作系统,保证鲲鹏服务器的使用是有操作系统的支持。但是很多政府机构,行业机构建立开源社区是为什么?我其实并不是很能理解。但是我最担心的是,将来你要建设一个社区的时候,还需与去一些政府部门的批准或者在政府部门的领导下。像现在开发一个游戏现在还需与申请版号,你将来搞个社区可能还需要找什么部门去备案,只有市场化的充分竞争才能激起更多的创新

Git 内部存储机制深入解析 – 演讲稿

这次在上海的会议上对 Git 的内部存储和机制做了一个演讲,但是录的视频有点短,选了两段代表我对 Git 一些机制理解的视频。如果有问题,请在 Slide 中进行评论讨论。

演讲的原始 PPT 已经共享在 Google Slide ,因为现场是 4:3 的比例,会议方做了重构,造成一些文字看不清楚

对 Git Commit Object 的理解
对 Tag 和 Branch 的理解

openEuler,未来可期 – 北京工业大学 – 工程大师论坛

大家好,我是马全一,目前在华为技术有限公司工作,任开源社区运营总监,主要负责 openEuler 操作系统的开源社区运营,同时也负责 openGauss 、openLooKen 两个开源项目的运营指导。2000 年参加工作后一直从事技术开发和技术管理等工作;2013 年开始在国内运营 Docker 社区,推广容器技术、Kubernetes 等云原生技术;2015 年加入华为负责 CNCF 等海外基金会的一些工作,维护华为和谷歌、红帽等云原生领域核心企业的开发者关系,同时也参与了华为云容器相关产品的设计和开发;2017 年底离开华为加入腾讯,负责腾讯云容器产品的设计,开源了 TKEStack 项目;2020 年初又回到华为负责 openEuler 操作系统开源社区相关的运营工作。因为工作的原因,这两年也致力于同一些高校操作系统课程的老师合作进行教学改革的探索。

参与 openEuler 让我有机会重回学校,但我在大学期间学习的是师范类生物教育专业,对计算机相关学科的教学体系并不了解,经过一段时间的摸索后让我对操作系统课程的教学情况有了一些认知,但是也带来了一些疑惑。今天不是来给大家讲操作系统的高深知识,这部分我相信咱们学校的任课教授一定会比我讲的更好更精彩,我今天来是把当前业界操作系统发展的趋势,一些当前操作系统设计背后的理念,以及我对行业以及基础软件未来发展的个人判断带给大家。希望给今天参与这个讲座的学生带来操作系统这些基础软件未来发展方向的一些参考意见,期望在将来择业或者选择学术方向时有一些参考。

在我演讲的过程中有什么问题,大家可以随时在聊天窗口打出来,我尽量及时的进行答复。

 

最近我在读《高效写作》这本书,其中有段话是这样说的,”早在学生时代,我们就学会了如何掩盖自己的无知。我们知道如何用长篇累牍来填补自己不知道的东西,也会在游移不定处故作坚定。所以,迷失感确实表明自己力有不逮(dài),不确定能否言之有物。” 当我这两年和很多高校的操作系统老师一起探讨教学改革时,发现不止是我自己,很多高校的教授和学者也迷失在这快速变革的时代中,无从坚持操作系统课程的初心。 当前大学教授、助教都是有很大的科研压力、论文压力、项目压力和生活压力。生活在这种高成本的社会,需要获取丰厚的收入支撑家庭,还要兼顾工作和科研,每天都沉浸焦虑之中。在这个过程中,每个人都会自然的选择更容易出成果的科研技术方向投入,这也是无可厚非的。这就造成了最近这五、六年见大部分科研方向都转向了 AI ,甚至一些非计算机相关专业的方向也都在向 AI 靠拢。各种相关顶级会议和期刊上,来自中国的论文和研究也越来越多。这一状况这也就牵引了我们的研究生、本科生在学习的过程中偏向于这个方向。不可否认,最近几年应届生高薪的 Offer 也都出在了 AI 这个领域。但是随着 AI 发展,落地场景局限,AI 方向 Offer 数量已经急剧减少,争夺国内几家公司的 AI Offer 就像千军万马争过独木桥一样。我之前在腾讯的北京交通大学的实习生转正后,我有咨询他具体情况,他们所在寝室 4 个人,只有他一个人是搞 Kubernetes 的,拿到了腾讯的 Offer ,其它 3 个学 AI 的都没有拿到 Offer ,最终选择去考公务员或者去银行之类的。当然现在考公务员、从政也是一股潮流,也不能说他们的选择不好。只是市场的调节有时候是滞后的,大家在选择方向时一定要谨慎,我也听说教育部也有发文在纠正这个科研和教学方向的发展。

 

那我们返回来讲操作系统是有“钱途”么,操作系统的发展是什么样子的,我们到底应该怎么选择呢。首先我们看操作系统是干什么用的,我的观点是操作系统是一个“中间件”,是计算机硬件和应用之间沟通的桥梁,当然操作系统也做了内存管理、进程管理等复杂的事情,但这些功能的核心诉求是让应用更好的使用硬件。

譬如说内存这些年的演进,就是让应用程序能够使用更大的内存,更高效的使用内存。Linux 系统的交换分区,就是在内存比较昂贵、比较小的年代,划分一部分硬盘空间作为在系统内存不够时使用的。在 openEuler 最新的版本发布了一个内存分级扩展的功能,为什么要这样做这样的功能呢?当前内存制造工艺已经达到瓶颈,ARAM 生态发展让每个 CPU 核的成本越来越低。之前我们配置服务器的时候按照 1 个 CPU 核配 2 G 内存、后来发展到 4G、8G,16G 甚至更大,为的是数据库、虚拟机、大数据、人工智能、深度学习这些场景中需要巨大算力的同时,满足内存的支持。譬如 AI 场景我们就经常需要把大量的数据读入内存或者 GPU 的显存进行计算。所以内存容量成为了制约业务和算力的问题。那么内存分级扩展通过机器本身的高速内存和低速内存介质混合在一起形成多级内存,譬如 RDAM 这种远端的内存就属于低速内存。通过内存自动调度让热数据在高速内存区中运行,让冷数据交换到低速内存区,从而增加内存容量,保证核心业务高效平稳运行。这种方式适用于内存使用量大,且使用相对不频繁的应用进程上,如 MySQL 、Nginx 等。

前面讲我们配置机器的内存是根据计算机的核数来的,要为什么要这样配置呢,CPU 和内存的之间的关系对计算机的性能有什么影响呢?我们知道 CPU 都是有多级缓存的,缓存的速度要比内存快,如果一个计算任务需要的内存数据能够绑定在一个核上计算时,它使用的数据都在固定的内存和缓存上,节省了在核之间调度计算任务,数据在不同的缓存和内存区域进行交换的时间,从而提升了整个的计算效率。那么这里都逻辑是什么,就是用空间换时间;在有一些优化策略里面就是时间换空间,可以让任务跑的慢一点没关系,但是要保证任务能够完成,前面我们说的设置内存交换空间就是这样的策略。所以我们从操作系统领域到其它的软件的性能调优,其实也都大多是利用这个原则。所以我们在工作的时候经常说,如果脱离开场景,谈性能优化都是刷流氓。硬件规格是固定的,它的计算能力是固定的,不会因为任何调优而凭空产生更多的算力。华为很多针对鲲鹏服务器的在内核层面的调优,在根本上也是基于这个原则,利用了 ARM 上核数多的优势,再加上内存绑定这类技巧,实现在单机的性能上超越 x86 架构的服务器。其实根本时由于 x86 的制造工业和发展方向这几年没有什么突破,牙膏厂这几年有些没落的趋势。这部分的内容在 openEuler 操作系统这本书都有,我们最近也在整理相关的内容和实验,把这部分开源在 openEuler 社区。

我们再讲讲 openEuler 做点其它内存方面的优化,在 gcc 和 jdk 方面都做了内存对齐优化。在我们的系统中,CPU 从一个时钟周期读取的内存单元 4 bytes 是连续的,所以编译器在分配数据的时候如果能把数据放到 4 bytes 内,或者连续的 4 bytes 倍数的内存中,CPU 读取的效率也就提高了。

我们看到了这些操作系统以及周边工作的优化都是为了在提升硬件效率,所以我会把操作系统必做中间件,这个中间件就是将硬件经过优化提供给应用程序。

我这里举例的 openEuler 是华为内部使用了近 10 年的操作系统,在 2019 年 12 月 31 日正式宣布开源。openEuler 的包格式选择的是 rpm ,这个是 RedHat 、SUSE 等操作系统普遍选择的包格式,但是打包的规范,openEuler 有自己做了重新的定义,规范上不同于 Fedora ,是独立体系的包格式。当然 openEuler 的内核和其它 Linux 发行版一样是使用的 Linux Kernel ,所有的软件包也是来源于 Linux 上游社区,所有的内核版本选择、软件包版本选择、发布周期等等都有自己独立的规范。按照 Linux 操作系统的约定俗称,openEuler 属于一个 Linux 发行版,和 Fedora、OpenSUSE、Debian、Ubuntu 一样的发型吧。如果基于 CentOS 来做的发型版,使用了 CentOS 的内核版本,使用了 CentOS 的包定义,即使是自己重新编译,也不能称之为 Linux 发行版,我们一般称呼这样的发行版位为 CentOS 的衍生版。

当然目前国内的大型企业和云计算厂商使用的是 CentOS 或者自己制作的衍生版本,这个现象产生是有原因的,并不是说 CentOS 就一定有多好。CentOS 是根据 RedHat 企业版的 Linux 内核版本以及包版本编译的社区版本,我们可以看它是 RedHat 企业版的克隆。在国内 IT 发展的早期,大家并不是所有的服务器操作系统都购买 RedHat 企业版,只是少部分购买,大部分用 CentOS 这种克隆版本。当出现 CVE 按照漏洞或者内核升级的时候,利用少量购买的 License ,就可以获取到 RedHat 的更新和技术支持,而这些正好是可以用在 CentOS 的克隆版本上的,这样就慢慢形成了国内普遍使用 CentOS 作为服务器的版本,Ubuntu Desktop 作为最好用的桌面版本在开发者的桌面一统天下。现在随着国内越来越重视版权,这样的行为基本不可见了,绝大部分厂商都购买各种各样的正版操作系统。

 

那对于 Linux 操作系统从出现到现在有 30 年的时间,未来他的发展是怎么样的呢,有什么新的技术会影响它的发展,我们如何选择它的方向学习呢?

首先是近几年出现了新的编程语言 Rust ,正在被开发者接受,而且 Linux 内核也是第一次接受 C 语言之外的开发语言,这个对 Linux 内核的发展产生了重大的影响。Rust 相比其它编程语言最大改进是从语言的机制实现了内存安全。自从 2004 年开始,微软安全相应中心(Microsoft Security Response Centre, MSRC) 对每个报告的安全漏洞进行分类。MSRC 的 Matter Miller 在 BlueHat IL 2019 年的会议中公布 70% 的漏洞都和内存安全 (Memory Safety) 相关。虽然 C 使用智能指针能避免部分内存安全的问题,但是 C 依旧没有完全避免内存安全和数据竞争的问题。依靠开发者做 “正确的事情” 依旧是无法避免内存安全问题。Google 在其漏洞奖励计划 (Vulnerability Rewards Program,VRP) 的统计数据中,内存带来的漏洞占统计数据的 59% ,是占比第一的,同样的 Apple 在其安全报告中也是列举了大量内存相关的漏洞,这也是 Rust 语言产生的重要原因之一。可以看到 Rust 语言引入到 Linux 内核开发中,必将吸引大量的开发者参与,Linux 内核开发生态也将迎来井喷的发展。

我们知道 Linux Kernel 是宏内核,随着功能的不断叠加,当前已经成为非常庞大的体系。宏内核在保证效率的同时,也带来了一些开发和安全上的问题。安全上随着功能增加,暴露出来的攻击面也就越大,系统也就越脆弱。之前我在一些公司工作的时候,都是根据服务器的硬件和要在服务器上运行的程序来定制内核,内核通常不大,基本在 4M 左右。当然这些年很少有企业来这样做了,也少有运维工程师有能力根据业务情况定制内核了。在开发层面,由于 Linux Kernel 的庞大体系致使调试非常困难,这个状况也使得社区发布了一些项目来帮助内核开发着,这里面堪称内核调试瑞士军刀的项目就是 ebpf 。ebpf 是从 bpf 也就是 Berkely Packet Filter 发展演进而来的,e 的意思是 Extended ,原先的 bpf 则成为 Classic Berkely Packet Filter 。3.18 版本以后的内核都带有 ePBF 解释器和 JIT 编译器,使得内核能够在运行过程中执行字节码的指令,能够在内核运行过程中输出内核的一些状态。我们可以简单点的理解,它是内核运行过程中的一个虚拟机,你可以在虚拟机中执行一些指令。利用 epbf 可以实现在网卡驱动和内核协议栈之间插入了eBPF扩展的网包过滤、转发功能,这个也就是我们讲的 XDP 功能,这部分中 openEuler 21.09 版本中也是支持的。

从这几年云计算的发展,引入当前操作系统功能模块实现的一个潮流,就是所谓的计算下沉。简单点解释就是之前在内核中做的一部分工作,都在计算机不同的部件中直接完成,而不经过内核,由他们分担一部分内核功能,从而提升效率和速度,我们经常听到到 DPDK 就是这种潮流的代表。为了加速网络传输的速度,讲对网络数据的解包封包和转发,直接在网卡中进行,网卡承担了很多内核做的功能。随着 RISC-V 的逐渐兴起,设计各种各样的计算卡已经成为一种潮流,再未来的服务器中,我们一定会看到多种多样架构的各种硬件参杂在一起。我之前在腾讯内部推广一个理念就是多维异构,意思是软件和硬件都是异构的。软件不管是容器、KVM、Rust-VMM 这种底层技术带来的上层 Kubernetes 编排能力增强,会把计算业务、大数据、AI 等混合调度在一个集群中;底层 RISC-V 、ARM64 和 X86 混合在一起形成服务器集群,发挥各自的长处服务于业务。openEuler 虽然生于华为,但是推出的时候就支持 X86 和 ARM64 两种架构,当前我们正在和中国科学院软件研究所的专家们一起向 RISC-V 移植,目标就是支持各种厂商的芯片,支持各种架构,为上层业务提供性能、稳定性和安全的保障。

 

中科院软件研究所一直是 openEuler 社区中重要成员之一,openEuler 社区在去年和今年都举办了暑期高校学生的竞赛活动 暑期 2020 和暑期 2021 ,在这两年的活动中有近千名学生参与到开源社区的开发中,在这里不仅仅是 openEuler 社区,更有 100 多个其它开源社区参与进来。在这些活动中,参与的学生有机会和各个公司顶尖的工程师一起工作,学习到新的技能,了解开源社区和参与社区。当然竞赛活动是有选拔的,在众多的报名者中只有少数的学生有机会参与到这个活动中。考虑到这个情况,openEuler 社区也会中近期和中科院软件所发起新的开源社区活动就是 openEuler 开源社区实习。每个学生都可以报名参与 openEuler 开源社区的实习,经过学生资格的认证后,可以在 openEuler 社区选择相关的任务,不同难度和工作量的任务会有不同的积分,在一定时间内当学生完成的一定积分的任务后,由中科院软件所为学生开具中科院的实习证明,同时有一定金额的实习奖金。我们也正在和一些学校进行积极的沟通,目前已经有一些学校认可这个活动的实习证明,可以用来申请我们课业中的实习学分。这个活动的门槛就会低很多,任何学生都可以报名参与,优秀的学生我相信在明年的暑期 2022 活动中,就更容易中选参与更高级别的竞赛活动。实习活动应该在本月发布,希望大家关注 openEuler 公众号、头条号,获取活动报名的最新信息。

 

openEuler 开源社区从始至终都是一个开放的社区,目前有很多国内外的操作系统厂商、硬件厂商、中间件厂商和独立的开发者参与。社区有理事会、技术委员会、各个技术方向 SIG 组等完善的社区组织架构。就在这个月,我们也正是加入了国内唯一的开源基金会开放原子基金会,openEuler 的治理和管理都将在基金会和政府的指导下更加规范和开放。目前除中国科学院软件研究所以外还有大连理工大学也都深入的在和社区合作,利用 openEuler 开源社区的平台,为高校计算机教育打造一个学习和科研的平台。

希望大家能更多的关注操作系统、数据库这些基础软件,希望能够有更多的高校师生参与到开源社区,希望能为大家将来的择业和科研提供更多的帮助。

Contributor License Agreement 浅析

什么是CLA,CLA的主要作用

在开源项目中通常存在三个角色围绕在整个项目的生命周期,在他们之间使用不同的协议约束之间的关系。

  • 所有者 开源项目所有者的角色比较复杂,有可能是一个独立开发者个体,也可能是多个开发者组成的小团体或是一家商业公司。他们共同的特点是对这个开源项目具有控制权,拥有代码写入的权限和修改许可证的权利。
  • 贡献者 是指所有者之外的向开源项目贡献代码的开发者。有些开发者向开源项目贡献代码是出于个人意愿或者兴趣,我们可以称呼他们为独立贡献者,这些具有贡献精神的独立开发者是值得大家敬佩的,也是各种开源项目去努力吸引的;也有很多开发者是受雇于公司为开源项目贡献代码,大多数情况是因为工作中使用了某些开源项目,出于工作的需要贡献代码进行 Bug 的修复和新增功能,也有一些公司是有全职的开源开发者,专职在项目中贡献代码,这是一份让人非常羡慕的工作。
  • 用户 开源项目的用户是非常复杂的角色。用户可能是指使用在其它开源项目中使用这个开源项目的开发者,或是在商业项目开发中使用这个开源项目的开发者,也有可能是指使用这个开源项目开发的软件的用户,角色的切换随着场景在变化。

Open Source License ,在中文中我们通常讲为开源许可证,是约束开源项目和用户之间的行为。开发者、用户或者是下游开源或商业项目是都有可能受开源项目的许可证约束,而且许可证的种类繁多,内容纷繁复杂,如果稍有不慎就会陷入法律纠纷的麻烦中。所以在目前开源合规方面的很多都是针对许可证合规的研究。

CLA 是 Contributor License Agreement 的缩写,一般翻译为贡献者许可协议,开发者向开源项目贡献的时候通常被要求需要签署 CLA 协议(或类似协议)。CLA 是约束开源项目和贡献者之间的关系,通常是要求贡献者在代码和专利做出声明或者承诺。CLA 的协议内容一般都不长,通常包含两个部分:

<1> 代码相关部分

◆ 签署 CLA 是要求贡献者声明对贡献内容(不仅限于代码,文档等其它内容一样有效)拥有所有权,或者是贡献者得到了相关的授权可以贡献这些内容。

◆ 贡献者卷提交的内容是在该开源项目选定的开源协议下进行,贡献的内容也遵循该项目的开源协议。

<2> 专利相关部分

◆ 签署 CLA 是要求贡献者声明如果贡献中包含了专利,该贡献者拥有该专利的所有权,或者得到相应的授权可以贡献该专利。

◆ 签署 CLA 等于贡献者授权开源项目以及开源项目的用户能够使用这个专利

CLA 对于开源项目的贡献者和用户也是一种保护,能够帮助开源项目避免不必要的诉讼和骚扰。

  • 贡献者签署 CLA 后是对贡献者的一种保护,签署 CLA 并不能改变捐献的代码和专利的所有权,只是授权的一种行为。
  • 因为开源项目使用了 CLA ,每一个贡献都在 CLA 的保护下,在出现侵权的诉讼时,用户或开源项目可以引用 CLA 作为自己免责的证据。

所以,针对对 CLA 进行一个简要的总结:

  • Contributor License Agreement 是一个轻量级的许可协议,签署人是代码(包含文档等其它内容)和专利的拥有者(或是被授权贡献),授权这些贡献在项目的开源许可证下进行再分发。
CLA 和 DCO 之间的区别

DCO 的全称是 Developer Certificate of Origin ,是贡献者声明贡献内容所有权的轻量级协议,这里可以把 DCO 看做是更轻量级的 CLA 。CLA 和 DCO 的区别:

  • CLA 签署一般是在贡献前签署,签署一次后后续贡献就不用再签署;DCO 是需要在每次提交代码时签署。如果使用 git 作为版本管理工具,在签署时添加 -s 参数可自动完成签署,签署后会在 Git Message 的尾部添加 Signed-off-by: Random J Developer <random@developer.example.org> 的内容,姓名和密码来自于 Git 的 Config 文件。
  • CLA 通常包括一个管理系统,主要是为签署 CLA 的企业管理向开源项目贡献的员工。在管理系统中通常是通过贡献人的邮件地址或者 ID (版本管理服务的 ID,类似 Github.com ) 识别是否企业员工,通过集成到 PR (Pull Request) 来控制代码合入;企业员工更换工作内容或者离职后,企业可以通过管理系统取消其代表企业的贡献权限。openEuler 操作系统开源社区采用的 CLA 系统就是社区根据实际情况自研的,可以在 https://github.com/opensourceways/app-cla-server 获取到代码。

CLA 的签署过程可以看做是显示签署,CLA 的内容可以进行修改,通常大型企业主导的开源项目会使用 CLA 的模式,这样更容易地控制法律文本内容,降低诉讼产生的风险;目前 DCO 的内容主要是来自 https://developercertificate.org 中,在 Github 中使用 DCO 的应用检查是否含有 Signed-off-by 时默认认可 DCO 的内容,是隐式签署,企业也无法控制 DCO 的文本内容。

开源社区的一些正面和负面的看法

目前 Google 、Microsoft 、华为等大型企业的开源项目都使用了 CLA ,减少了针对开源项目的诉讼风险,利于开源项目的发展。但是社区对 CLA 也存在一些负面的看法:

  • 签署 CLA 等于放弃了一些法律权利,但是羞涩的法律文本对于开发者来说都是不友好的,即使认真地阅读了 CLA 内容,也很难确定到底是要放弃什么样的权利。很多开发者在第一次贡献前,就可能因为要签署 CLA 而放弃了。
  • 还有一些开发者认为 CLA 更多是为企业贡献者服务,对于个人开发者并不友好,并没有考虑到他们的感受和贡献的意愿;甚至有一些开发者认为这些签署 CLA 的项目并不是把开发者放到第一位考虑,而是先努力降低自己的风险。
  • 最近几年几个著名的开源项目更改 License 协议,也带来了开发者对签署 CLA 的抱怨。有很多开发者认为开源项目没有权利更改 License 协议,或者是滥用了签署 CLA 赋予的权利。

总之,对于开源项目的所有者或背后实际控制的公司,都倾向于使用 CLA 的方式代替 DCO 来获取贡献者的授权,相信未来越来越多的开发者在参与开源社区贡献时,需要签署CLA。

附录

• DCO 的文本内容:

◆ Developer Certificate of Origin Version 1.1

◆ Copyright (C) 2004, 2006 The Linux Foundation and its contributors.

◆ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

◆ Developer’s Certificate of Origin 1.1

◆ By making a contribution to this project, I certify that:

◆ (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or

◆ (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or

◆ (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it.

◆ (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved.

开源社区运营指标的设计探索

前言
开源社区的运营过程,是扩大开源项目用户群体和开发者群体的过程。如何确定开发者群体的变化、如何确定贡献者转化比率是我们一直希望从数字化运营中获取的关键的信息。本文根据 openEuler 运营的实战经验,设计了对于开源社区贡献者的分层定义,希望通过数据维度为社区的健康状况提供一个新的维度可供观测。
介绍 – 漏斗模型

运营视角通常依据对开源项目的贡献程度,对代码托管平台 ( github.com 或 gitee.com )在项目上留下数字足迹的开发者进行划分,对不同的开发者实施不同的运营策略。由于操作系统开源社区的特殊性,在 openEuler 项目的实践过程中,发现从 openEuler 官网的开发者、操作系统下载安装的开发者、日常进行软件包更新的开发者在以上操作过程中不需要账号,无法进行身份的确认造成无法进行追踪,在运营过程中针对这部分开发者都只进行数据统计。所以 openEuler 社区的开发者目前限定指在代码托管平台和 openEuler 代码仓库进行过交互的开发者,即已经进入代码仓库触达的开发者。

实际运营过程中,openEuler 社区将开发者分为三个层级:

  1. 代码贡献者(D2):狭义贡献者,合入了 PR(Pull Request) 的开发者
  2. 贡献者 (D1):  广义贡献者,合入 PR(Pull Request)、提交 Issue 或者评论 issue 或者PR 的开发者
  3. 开发者 (D0):  触达贡献者,合入 PR(Pull Request)、提交 Issue 或者评论 issue 或者PR ,以及针对代码仓库进行过 Star、Watch、或 Fork 的开发者

根据以上分类,三个层级的开发者从 D0 到 D2 之间形成了包含关系,因此形成了漏斗模型

展现 – 直观

在运营后台为了更好的展现不同层级开发者的转换以及活跃情况等,可以参考如下展示方式:

  • 标准漏斗图实现,展示每层开发者之间的转化率
  • 按照时间分布展示时间序列上每个层级的开发者活跃人数
  • 按照组织分布展示每个组织投入的人数

 image

组织

应用 – 面向开发者运营

在社区中每个参与的开发者都是活生生的个体而不是平台或者 KPI 中的一个冰冷的数字,有一些开源社区运营的同学痴迷数字化的运营,忽略了开发者的个性。每个开发者都是运营人员的客户,需要用服务的心态去对待每个开发者的诉求,面向开发者运营而不是 KPI 运营。

根据漏斗模型建议采取差别的运营策略:

  1. 代码贡献者(D2):关注开发者的社区成长路径和职业路径,培养成为项目的 Maintainer 或 Evangelist – 培养开发者对社区的忠诚度
  2. 贡献者 (D1):  关注开发者对项目功能的诉求,协助开发者将项目运用在实际生产中;解决开发者在项目技术路线和使用过程中和社区的沟通 – 提升开发者对社区的信任度
  3. 开发者 (D0):  属于项目的关注者,运营重点在于将项目的技术特点、落地案例等关键信息对 D0 开发者进行传播,吸引其对项目进行深度试用 – 抓住开发者对社区的关注度

同时也可以根据漏斗模型的数据结合其它运营数据观察到社区的变化

  1. 开发者在开源项目中参与周期的变化,开源项目的开发者并不是稳定的,更像是“铁打的营盘流水的兵”- 新贡献者从何而来、核心贡献者流失何方,更是运营者对社区状况的变化
  2. 观察社区深层次的文化和利益冲突是否会导致开源社区内的角色发生变化,何种特质的开发者更容易成长为社区的中坚力量 – 关键开发者的识别,是运营者提升运营效率的关键
总结

开源社区的运营需要完整的数据支持,如何在大量数据面前梳理出开发者这个关键模型,提升运营效率是 openEuler 一直在深入探索的。然而任何模型都是要符合开源项目本身的技术特点和生命周期,希望此模型对其它开源项目的运营有一定的参考意义。

注:
  1. D0D1D2 为简写,全称应为:Developer Level ZeroDevelop Level OneDeveloper Level Two

在 amd64 架构上交叉编译,使用 openEuler 内核构建支持 Taishan 系列服务器的 Gentoo 系统

openEuler 是华为在 2019 年 12 月 31 日开源的 Linux 操作系统,它的 20.03 LTS 版本基于内核 4.19.95 版本,是目前对鲲鹏系列服务器支持最好的 Linux 发行版。还是用习惯了 Gentoo ,决定用 U 盘做一个基于 openEuler 内核的 Gentoo 系统去测试 Taishan 2280 的服务器。

在 amd64 架构的 Gentoo 系统中构编译 aarch64 的环境

首先需要在 x86 的环境下准备 aarch64 的交叉编译环境。Gentoo 下的交叉环境构建是使用 crossdev 工具,所以先通过 emerge 命令进行安装。

emerge -avt sys-devel/crossdev 

修改 /etc/portage/repos.conf/crossdev.conf 配置文件的内容,主要是生成的交叉编译工具链的存储位置。如果没有对应的目录,通过 mkdir -pv /usr/local/portage-crossdev 命令创建目录。

[crossdev]
location = /usr/local/portage-crossdev
priority = 10
masters = gentoo
auto-sync = no

构建 aarch64 的交叉编译工具链

crossdev --stable -t aarch64-unknown-linux-gnu --init-target -oO /usr/local/portage-crossdev
echo "cross-aarch64-unknown-linux-gnu/gcc cxx multilib fortran -mudflap nls openmp -sanitize -vtv" >> /etc/portage/package.use/crossdev
crossdev --stable -t aarch64-unknown-linux-gnu -oO /usr/local/portage-crossdev

通过 gcc 命令确定是否安装正确

gcc-config -l
aarch64-unknown-linux-gnu-gcc --version
aarch64-unknown-linux-gnu-c++ --version
aarch64-unknown-linux-gnu-g++ --version

构建 QEMU 环境

make.conf 文件中加入编译参数,同时将 static-libsstatic-user 加入到 QEMU 和依赖包中。

echo 'QEMU_SOFTMMU_TARGETS="alpha aarch64 arm i386 mips mips64 mips64el mipsel ppc ppc64 s390x sh4 sh4eb sparc sparc64 x86_64"' >> /etc/portage/make.conf
echo 'QEMU_USER_TARGETS="alpha aarch64 arm armeb i386 mips mipsel ppc ppc64 ppc64abi32 s390x sh4 sh4eb sparc sparc32plus sparc64"' >> /etc/portage/make.conf
echo app-emulation/qemu static-user >> /etc/portage/package.use/qemu
echo dev-libs/glib static-libs >> /etc/portage/package.use/glib
echo sys-libs/zlib static-libs >> /etc/portage/package.use/zlib
echo sys-apps/attr static-libs >> /etc/portage/package.use/attr
echo dev-libs/libpcre static-libs >> /etc/portage/package.use/libpcre
emerge -avt app-emulation/qemu

使用 quickpkg 命令构建 `QEMU` 的二进制包

quickpkg app-emulation/qemu

检查内核是否启用 CONFIG_BINFMT_MISC 选项,非 “M” 模式 。内核选项需要参考 Gentoo 官方 wiki

启用 binfmt_misc 并注册 aarch64 架构

[ -d /proc/sys/fs/binfmt_misc ] || modprobe binfmt_misc
[ -f /proc/sys/fs/binfmt_misc/register ] || mount/ binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-aarch64:' > /proc/sys/fs/binfmt_misc/register

启用 qemu-binfmt

rc-service qemu-binfmt start
rc-update add qemu-binfmt default

最后在 mount 命令中检查 binfmt_misc 是否存在

binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)

准备安装介质

使用 fdisk 命令格式化硬盘,创建 efiroot 两个分区

gentoo-amd64 ~ # fdisk /dev/sdb
Welcome to fdisk (util-linux 2.35.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk /dev/sdb: 1.84 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: Portable SSD T5
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: DF2FC989-B32E-4885-8341-363663A4ABEF

Command (m for help): n
Partition number (1-128, default 1):
First sector (34-3907029134, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-3907029134, default 3907029134): +256M

Created a new partition 1 of type 'Linux filesystem' and of size 256 MiB.
Partition #1 contains a vfat signature.

Do you want to remove the signature? [Y]es/[N]o: Y

The signature will be removed by a write command.

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 1
Changed type of partition 'Linux filesystem' to 'EFI System'.

Command (m for help): n
Partition number (2-128, default 2):
First sector (526336-3907029134, default 526336):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (526336-3907029134, default 3907029134):

Created a new partition 2 of type 'Linux filesystem' and of size 1.8 TiB.
Partition #2 contains a vfat signature.

Do you want to remove the signature? [Y]es/[N]o: Y

The signature will be removed by a write command.

Command (m for help): t
Partition number (1,2, default 2): 2
Partition type (type L to list all types): 25

Changed type of partition 'Linux filesystem' to 'Linux root (ARM-64)'.

Command (m for help): p
Disk /dev/sdb: 1.84 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: Portable SSD T5
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: DF2FC989-B32E-4885-8341-363663A4ABEF

Device      Start        End    Sectors  Size Type
/dev/sdb1    2048     526335     524288  256M EFI System
/dev/sdb2  526336 3907029134 3906502799  1.8T Linux root (ARM-64)

Filesystem/RAID signature on partition 1 will be wiped.
Filesystem/RAID signature on partition 2 will be wiped.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

格式化磁盘

mkfs.ext4 /dev/sdb2
mkfs.vfat -F 32 /dev/sdb1

挂载安装介质,准备环境

挂载格式化后的分区到安装目录

mount /dev/sdb2 /mnt/gentoo
mkdir -p /mnt/gentoo/boot/efi
mount /dev/sdb1 /mnt/gentoo/boot/efi
mount

/dev/sdb2 on /mnt/gentoo type ext4 (rw,relatime)
/dev/sdb1 on /mnt/gentoo/boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)

到开源镜像站点下载 stage3 文件到安装的根目录并解压

cd /mnt/gentoo/
links https://mirrors.163.com
time tar xvf stage3-arm64-20191124.tar.bz2

拷贝 repos.conf 的配置,并修改 rsync 的镜像源为 rsync://rsync.cn.gentoo.org/gentoo-portage

mkdir --parents /mnt/gentoo/etc/portage/repos.conf
cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf

拷贝 DNS 解析文件到安装目录,加载系统目录

cp -v /etc/resolv.conf /mnt/gentoo/etc/
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /dev/pts /mnt/gentoo/dev/pts
chroot /mnt/gentoo /bin/bash

切换环境安装 Gentoo 系统

切换到安装环境,设置盘符以区分安装环境和系统环境,并更新 portage

source /etc/profile
export PS1="(chroot) ${PS1}"
time emerge-webrsync
time emerge --sync

编辑 make.conf 文件

# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /usr/share/portage/config/make.conf.example for a more
# detailed example.
COMMON_FLAGS="-O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
# WARNING: Changing your CHOST is not something that should be done lightly.
# Please consult https://wiki.gentoo.org/wiki/Changing_the_CHOST_variable before changing.
CHOST="aarch64-unknown-linux-gnu"

# NOTE: This stage was built with the bindist Use flag enabled
PORTDIR="/usr/portage"
DISTDIR="/usr/portage/distfiles"
PKGDIR="/usr/portage/packages"

# This sets the language of build output to English.
# Please keep this setting intact when reporting bugs.
LC_MESSAGES=C

MAKEOPTS="-j41"
GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo"
EMERGE_DEFAULT_OPTS="--ask --verbose=y --keep-going --with-bdeps=y --load-average"
LINGUAS="en_US zh_CN en zh"
ACCEPT_KEYWORDS="*"
ACCEPT_LICENSE="*"

FEATURES="-pid-sandbox"

# Language
LINGUAS="en_US zh_CN en zh"

# Python
PYTHON_TARGETS="python2_7 python3_6"

# Ruby
RUBY_TARGETS="ruby25 ruby26 ruby27"

# GRUP UEFI
GRUB_PLATFORM="arm64-efi"

# QEMU
QEMU_SOFTMMU_TARGETS="alpha aarch64 arm i386 mips mips64 mips64el mipsel ppc ppc64 s390x sh4 sh4eb sparc sparc64 x86_64"
QEMU_USER_TARGETS="alpha aarch64 arm armeb i386 mips mipsel ppc ppc64 ppc64abi32 s390x sh4 sh4eb sparc sparc32plus sparc64"

设置时区和中文语言支持

echo "Asia/Shanghai"  > /etc/timezone
time emerge --config sys-libs/timezone-data
nano -w /etc/locale.gen

en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN.GB2312 GB2312
zh_CN.GB18030 GB18030

locale-gen

下载内核源代码、编译工具 genkernel 和其它的依赖工具,提前下载 openEuler 的内核并拷贝到 /usr/src 目录下。

time emerge --ask gentoo-sources sys-kernel/linux-firmware genkernel vim wget links curl dev-vcs/git sys-boot/grub:2 efibootmgr

下载生成 fstab 的脚本工具,并生成 /etc/fstab 配置文件,通过 blkid 命令使用 UUID 切换

wget https://raw.githubusercontent.com/YangMame/Gentoo-Installer/master/genfstab
chmod +x genfstab
./genfstab / > /etc/fstab

使用 make 的编译命令编译和安装内核,genkernel 命令可能会不执行不编译 dtbs 部分 。

cd /usr/src
time unlink linux
time ln -s openEuler linux
time cd linux
time make clean
time make distclean
time make openeuler_defconfig
time make menuconfig
time make -j$(nproc) Image modules dtbs
time make install
time make modules_install
time make dtbs_install

使用 grub 安装 EFI 启动,efibootmgr 用于在泰山服务器上启动后添加启动项。

grub-install --target=arm64-efi
grub-mkconfig -o /boot/grub/grub.cfg

设置密码、主机名和安装必备软件并设置启动项目

passwd
time emerge -avt net-misc/dhcpcd app-misc/livecd-tools
time emerge -avt syslog-ng gentoolkit
time rc-update add sshd default
rc-update add syslog-ng default
rc-update add dhcpcd default
vim /etc/conf.d/hostname

退出安装环境,用安装介质启动泰山服务器

exit
umount /mnt/gentoo/dev/pts
umount /mnt/gentoo/dev
umount /mnt/gentoo/proc
umount /mnt/gentoo/boot/efi
umount /mnt/gentoo/boot
umount /mnt/gentoo

DevOps Is Philosophy

DevOps is an operational philosophy that promotes better communication between development and operations as more elements of operations become programmable.

DevOps is philosophy, and it’s invisible. But it is like the soul through our work, either development, operation, testing even marketing or business. There are no rules in DevOps, no definition in DevOps and no right or wrong in DevOps. You would do DevOps in your way, I do it in my way.

You would do DevOps in your way. I do it in my way.