将Postmarket OS移植到Librem 5的冒险

2020-09-23 07:59:46

自从我决定停止使用我的诺基亚N900以来,我就一直渴望摆脱Android的枷锁。诺基亚已经放弃了Linux手机,很明显,我一直以来最喜欢的智能手机不会再有安全补丁了。多年来,让谷歌退出Android一直是我的任务,我求助于运行自己的“去谷歌”LineageOS版本。我一直在渴望更好的东西。2017年5月,当我第一次读到PostMarket OS(简称PMOS)时,我还在国外。Postmarket OS是一个基于Alpine Linux的Linux发行版,它致力于提供运行主流Linux内核的Linux发行版,以此作为复兴被制造商遗忘已久的旧智能手机的一种手段。我心爱的N900是一个支持(粗糙)的设备!我很快在eBay上订购了第二辆N900,等我回来后再回家接我,因为显然需要两辆。显然是…。我与postmarket OS的关系就这样开始了,一直延续到今天。

尽管…并不是所有的事情都是美好的。过了一段时间后,事情变得很清楚,旧的N900 CPU运行“现代”应用程序的速度不会更快,而且它的GPU永远不会有免费的用户空间图形驱动程序,所以当我第一次了解Librem 5时,我非常兴奋。当然,它没有实体滑出式键盘,但公司承诺将Linux支持视为一等公民的承诺太好了,不能放弃。我立即预订了开发工具包(“devkit”)和手机,完全打算将PostMarket OS移植到这台设备上,并最终完全使用它来取代我口袋里堆积如山的Android。

Devkit来得再好不过了(讽刺);就在假日季节之前!由于我的“其他义务”,我在盒子里度过了最初的几天之后,它很快就被拆开了,我开始计划下一步的行动。一些粗略的研究告诉我,devkit使用恩智浦的SoC,使用引导加载程序u-boot,并使用一个名为uuu的实用程序进行刷新。由于我不完全确定uuu是如何工作的,而且一旦我开始尝试使用它来刷新PMOS,预计会遇到麻烦,所以第一个任务是焊接使用UART的标题。

正如我怀疑的那样,事实证明这是非常值得的一步。纯粹主义应该考虑下一次只添加标题,尽管无论如何DIY都非常简单。我对devkit所做的唯一其他修改(几天后完成)是在SoC散热器的正上方增加了一个外部40 mm风扇。这不是必须的,但我确实使设备重启了至少一次编译MESA,所以我想这不会有什么坏处。这位粉丝的一张照片(稍后显示)在互联网上引起了一些焦虑。哎呀。根据Purism的建议,在添加电池之后,我现在已经准备好完成一些工作了!

“不要重新发明轮子,只要重新调整它就行了”(安东尼J.迪安吉洛)。

作为使用恩智浦(和Emcraft)设备的新手,第一天的大部分时间都在试图收集尽可能多的信息,包括该设备如何引导、如何将映像推送到该设备以进行引导、它希望在映像中的哪个位置“安装”引导加载程序(u-boot),以及内核和设备树文件所需的格式和位置。Emcraft在他们的网站上有数量惊人的信息,还有一些以树外内核补丁和预编译二进制文件的形式出现的例子。到目前为止,最大的突破是发现了纯粹主义的Jenkins CI实例。由于熟悉$DAILY_JOB的Jenkins输出,我能够弄清楚Purism是如何构建所有主要组件的。通过在Purism的GitLab实例中搜索在CI中运行的脚本名,我可以找到这些脚本的适当存储库和源代码,以用作我必须为支持PMOS中的devkit和phone而创建的Alpine Linux包的模型。

在掌握了尝试引导自定义u-boot和内核所需的基本知识后,我开始深入研究uuu。这对我来说是一个全新的工具,但是为PMOS/Alpine Linux打包非常容易。可以向uuu实用程序传递一个脚本,其中包含要执行的任意命令,同样,Purism以前在这方面所做的工作为我提供了一个有用的模板,供我稍后在创建PMOS映像以刷新到设备时使用。我能够使用Purism的devkit工件中的u-boot映像来验证我打包的uuu是否正常工作。

下一步是考虑构建/打包用于DDR培训的u-boot、ARM可信固件(ATF)和Cortex M4固件。但是,由于这些组件都不使用上游/主线源代码,因此这些软件包必须与Alpine Linux中已经存在的任何组件不同(例如,不能使用它们的u-boot),以便将源代码与来自Purism/Emcraft/nxp/等的任何补丁一起使用。这里最大的障碍是M4固件需要是

要达到让u-boot/固件映像正常工作的地步,需要反复尝试,其中一些不是我的错,而是我自己的错误,并且在devkit上拥有UART头绝对是我解决所有这些早期的、Linux之前的内核引导问题所必需的。

Postmarket OS中的设备由特定于设备的Alpine Linux程序包支持,这些程序包负责安装设备特有的任何附加配置,并向负责构建PMOS映像的工具(Pmbootstrap)提供参数以刷新到设备。PMOS中设备包的常见组件包括用于设置音频的配置文件,以及用于指定在生成的映像中“安装”u-boot的位置的参数。通过在运行pmbootstrap init时只指定新设备,pmbootstrap使创建骨架设备包变得非常容易。困难的部分是收集帮助启用和设置设备硬件的所有各种配置文件。再一次,纯粹主义的公共存储库来拯救!通过绕过它们的公共repos(例如,librem5-base),PureOS中的Librem5上的大多数功能都可以在PMOS中尽早启用。不幸的是,PMOS中的大多数设备都需要下游内核。Devkit和phone(到今天为止)也不例外,尽管它离主线足够近,我不必应用PMOS包含的各种黑客技术来处理古老的、废弃的下游内核。因此,创建一个Alpine Linux包来构建/安装Purism的内核分支相对简单。最后一个主要的作品是图形。如果我只想使用帧缓冲区引导到控制台,我本可以忽略这一点,但这不可能在2020年使用智能手机!(/troll)。

我想运行等离子Mobile和Phosh,唯一能做到这一点的方法是在devkit上使用支持GPU的MESA版本。当时,对这款GPU的支持是在MESA的上游,但它有很多问题。如果我想有一个很好的机会运行硬件加速的图形环境,我将不得不打包Purism的Mesa分支。这最终会在以后的Alpine Linux软件包依赖解析中产生各种问题(与Alpine的Mesa软件包和子软件包的冲突经常发生),所以值得庆幸的是,这只是暂时的,直到Purism将其所有补丁都放在上游Mesa中。

我现在已经具备了为devkit生成我的第一个可引导postmarket操作系统映像并将其刷新到设备上所需的一切!

不过我没有。用uuu手动刷新设备对我来说没问题,但我希望任何使用Librem5的人都能很容易地使用pmbootstrap构建PMOS并将其刷新到设备上。第一个变化是教pmbootstrap使uuu自动化。Pmbootstrap支持使用外部工具直接刷新设备已经有很长一段时间了。大多数最初搭载android的设备都使用Fast boot进行闪存,这不是librem 5的一个选项。支持映像闪存并不是必需的,但这比试图使用dd等可怕的工具销毁闪存盘,或者要求人们运行与pmbootstrap不同的其他命令/脚本才能在他们的设备上安装pmos要好得多。将uuu自动化添加到pmbootstrap中基本上就是将一些新的pmbootstrap配置参数添加到设备包中,这些参数可用于告诉pmbootstrap使用uuu,然后在指示将映像刷新到设备时修补pmbootstrap以使用正确的参数调用uu。

如前所述,Librem 5 devkit(和电话)需要两个固件文件来引导:U-boot和M4固件。Pmbootstrap知道如何处理嵌入u-boot固件(由PMOS中支持的某些设备使用),但不知道如何将两个单独的固件嵌入到可闪存的PMOS映像中。添加此功能的另一个补丁,以及一些更多的设备包配置参数就足够了。现在我已经为…做好了准备。

当时,devkit的板载显示屏不起作用,所以我只能凑合着把HDMI换成外部显示屏,幸运的是,它工作得很好。XFCE是一个相当轻量级的桌面环境,默认情况下包含(大部分)电池,所以我最喜欢在设备上第一次启动PMOS。

虽然我确实从KDE开发人员Bhushan Shah那里得到了一些帮助,但等离子Mobile在很大程度上也是开箱即用的。没有什么比凌晨1点49分拍摄的一张略显模糊的黑色照片更能说明成功了

Purism Matrix频道中的许多人都对“设备融合”感到兴奋,特别是使用带有外部键盘/鼠标/显示器的手机,就像使用台式PC一样。为了不被遗漏,我想玩“长老卷轴3:晨风”(通过OpenMW)可能会很有趣,它基本上需要一个键盘/鼠标才能使用。在将OpenMW打包成Alpine Linux之后,我现在可以在devkit上玩有史以来最好的RPG之一了。虽然不是以超级流畅的帧速率,但是考虑到这个硬件有多早,以及它在MESA的支持现状,这是意料之中的。

快进到几周后,Purism开始向普通大众交付他们的第一部手机。我推迟了收到我订购的手机,直到“长青”的那一批,因为我想要一款质量更高的手机,可以用上几年。当Purism好心地借给我一部Birch手机玩的时候,我被困在PMOS上使用devkit,并开始后悔自己的决定,这让我很沮丧。没有浪费时间删除上面的PureOS映像(对不起,Purism!)。为PMOS腾出空间。幸运的是,这款手机选择了相同的SoC,因此在postmarket操作系统中只需要对设备包进行很小的修改,因为手机与devkit共享相同的内核和u-boot源代码。U-boot配置不同,但这只是在编译时选择适当的defconfig的问题。

从一开始就令人担忧的一件事是,在Linux引导之前,手机上没有随时可以访问的UART来调试问题。现在,这并不是大多数电话用户关心的事情,但我曾广泛依赖devkit来找到引导PMOS的正确配置参数组合。手机的原理图显示有4个UART,但没有一个预先安装了插头,其中两个在后盖下的超小型测试点垫中可用。我们在PostMarketOS上使用的一些设备通过3.5毫米耳机插孔支持串行控制台输出。这对Librem5来说是一个很好的功能,但希望它对我目前的情况没有任何帮助。

来自Purism的Eric Kuzmenko向我指给我一个M.2调试转接板,显然Purism曾经在内部使用过它,并向我提供了一个只公开UART的布局版本。我已经制作了这块板,但(到今天为止)仍然没有成功地让u-boot在它上面输出串行控制台。因此,如果出现与Linux u-boot之前相关的问题,我不得不退回到使用devkit来调试它们。幸运的是,我还没有遇到任何特定于手机的Linux前引导问题。

值得注意的是,这在很大程度上是我和其他任何想要移植操作系统在这台设备上运行的人的问题。绝大多数用户不会错过轻松访问UART串行控制台的机会。

幸运的是,对于我第一次尝试在手机上引导,我遇到的唯一问题是不小心使用了为devkit构建的u-boot映像。哎呀。幸运的是,这并没有导致任何魔法烟雾的释放!

如果它看起来像一部电话,功能也像一部电话,那么它一定是一部电话。

不久之后,Purism展示了他们在PureOS发行版中启用的现代工作。使用ModemManager启用电话调制解调器很容易,但在电话呼叫期间音频路由不正确。Purism发布了一个名为Wys的小应用程序,用于处理电话呼叫期间的音频路由,因此在为Alpine Linux打包此应用程序后(这样它就可以在PMOS中使用),我就可以在某种程度上拨打和接听电话了。音频质量和接近感应器的支持仍然需要一些工作,但这是一部真正的手机的要素已经具备了。SMS只是在PMOS上工作,没有任何改变,这是一个非常令人惊喜的惊喜,因为在过去花了很多时间来研究如何在N900上使用Ofono测试脚本发送和接收SMS。移动数据连接也刚刚在PMOS中与Phosh和ModemManager一起工作;这是另一个非常令人惊喜的惊喜!

Librem5上的postmarket操作系统有了一个很好的开端,但在我完全依赖Librem5来取代我现在的手机之前,还有很多工作要做(包括PureOS和postmarket OS的上游)。对于那些有兴趣参与的人,可以在这个GitLab里程碑上看到Librem5的售后操作系统支持的当前状态,您可以在这里访问我们的IRC/Matrix频道。

虽然总有改进的空间,但使用Librem5devkit/手机和Purism是超级令人耳目一新的。如果没有来自Purism的大量帮助,我不可能这么快地将PostMarket OS移植到Librem5;这既是通过公共回复和CI的方式隐含的,也是通过Purism员工对我的查询的回应而显式的。许多启动PostMarket OS的设备在很大程度上被制造商忽视或遗忘了,它们使用的是一些原本打算在Android上运行的超级旧的下游内核,所以让PMOS在这些设备上运行的努力是一座更大的山要爬。我欢迎这个拥有一流Linux支持的设备的新时代!

纯粹主义认为,建造Librem 5只是在发起数字权利运动的道路上迈出的一步,在这场运动中,我们人民捍卫我们的数字权利,我们将你的数据和你家人的数据的控制权重新放回属于它的地方:掌握在你自己的手中。