自行为一加6编译Postmarket os内核
序
在为自己的一加6刷上PostmarketOS后突然某一天想使用它的照相机功能。原因是想到使用pmos拍照后笔者可以直接使用scp指令来传输手机相片到自己运行着GNU/Linux的电脑上,就感到相对便捷。但是在官方维基百科上看来OP6(一加6)的摄像功能还未进入release[0],因为想看一下目前的摄像功能已经到哪一步了,也可能是因为想折腾些东西了,于是花了些时间研究怎么才能自己编译内核然后丢到OP6中。完成编译后总结就是摄像头不完善,是可以拍照的但有些许问题,但笔者认为这依然是一个很大的成就。在这里也感谢pmos的开发者的奉献,让人们能使用上相对更加free(自由)的软件。因为编译过程感觉比较有趣,遂有了这篇随笔。
注意
因为本随笔介绍的是如何编译最新的源码,因此这意味着编译出来的内核是不稳定的,风险需要个人承担。要想安装稳定的PostmarketOS请查看别的教程,或者到官方维基页面查看[7]。
参考资料
对于想自己捣鼓的读者笔者在这里放了自认为有用的链接以供参考:
https://wiki.postmarketos.org/wiki/Compiling_kernels_with_envkernel.sh
https://wiki.postmarketos.org/wiki/Pmbootstrap
https://wiki.postmarketos.org/wiki/OnePlus_6_(oneplus-enchilada)#Camera
https://wiki.postmarketos.org/wiki/SDM845_Mainlining
https://wiki.postmarketos.org/wiki/User:Magdesign#Compile_Kernel
pmbootstrap
正如官方所说的[1],pmboostrap是一个专为PostmarketOS开发使用的命令行应用。笔者使用的是Arch遂用如下指令下载:
sudo pacman -S pmbootstrap
然后需要初始化一下:
pmbootstrap init
然后要回答一些问题:
问得是work和pmaports的路径,笔者直接Enter选择默认
[09:46:02] Location of the 'work' path. Multiple chroots (native, device arch, device rootfs) will be created in there.
[09:46:02] Work path [/home/user/.local/var/pmbootstrap]:
[09:46:48] Location of the 'pmaports' path, containing package definitions.
[09:46:48] pmaports path [/home/user/.local/var/pmbootstrap/cache_git/pmaports]:
官方说除非你的设备在main或community的范围内,否则应该选edge[2]。笔者因为本来就是为了体验最新的东西的,遂选择edge:
[09:46:51] Choose the postmarketOS release channel.
[09:46:51] Available (11):
[09:46:51] * edge: Rolling release / Most devices / Occasional breakage: https://postmarketos.org/edge
[09:46:51] * v24.12: Latest release / Recommended for best stability
[09:46:51] * v24.06: Old release (unsupported)
[09:46:51] Channel [edge]:
然后是设备,笔者的是一加遂选oneplus:
[09:52:52] Choose your target device vendor (either an existing one, or a new one for porting).
[09:52:52] Available vendors (94): acer, alcatel, amazon, amediatech, amlogic, apple, ark, arrow, asus, ayn, bananapi, beelink, bq, clockworkpi, cubietech, cutiepi, dongshanpi, epson, essential, fairphone, finepower, fly, fxtec, generic, goclever, google, gp, hisense, htc, huawei, inet, infocus, jolla, khadas, klipad, kobo, lark, leeco, lenovo, lg, librecomputer, linksys, mangopi, medion, meizu, microsoft, mobvoi, motorola, nextbit, nobby, nokia, nvidia, odroid, oneplus, oppo, ouya, pine64, planet, pocketbook, postmarketos, powkiddy, purism, qcom, qemu, qualcomm, radxa, raspberry, realme, samsung, semc, sharp, shift, sipeed, solidrun, sony, sourceparts, surftab, t2m, thundercomm, tokio, tolino, trekstor, valve, vernee, vivo, volla, wexler, wiko, wileyfox, xiaomi, xunlong, yu, zte, zuk
代码名因为是一加6遂选enchilada[3]:
[09:54:02] Available codenames (16): bacon, billie2, cheeseburger, dumpling, enchilada, fajita, guacamole, hotdogb, instantnoodlep, kebab, lemonade, lemonadep, oneplus2, oneplus3, oneplus3t, onyx
用户名和Wifi后端就直接Enter选择默认了:
[09:56:44] Username [user]:
[09:56:46] Available providers for postmarketos-base-ui-wifi (2):
[09:56:46] * wpa_supplicant: Use wpa_supplicant as the WiFi backend. (default)
[09:56:46] * iwd: Use iwd as the WiFi backend (but may not work with all devices)
[09:56:46] Provider [default]:
用户界面的话因为笔者的一加6已经是一个带Phosh的pmos了,因为我们这次只是为了kernel,遂选择console:
...
[09:58:06] User interface [console]:
接下来的问题就直接Enter选择默认应该不会有什么问题的[4]。
看到如下就完成初始化了。
[10:03:11] DONE!
用envkernel.sh编译内核
因为大多数电脑的芯片架构跟手机的芯片架构不一样,比如笔者的电脑是amd64而一加6的是aarch64,因此会涉及到交叉编译的内容。而交叉编译简单来说就是在计算机上编译能在另一个架构不同的计算机上运行的软件。而pmos社区必然会遇到这类问题,而正如官方所言,envkernel.sh就是为了让编译更加方便而诞生的。它能在电脑上设置一个Alpine Linux环境然后通过改变环境变量以及利用alias来使make指令使用交叉编译器(cross compiler)[5]。
接下来就先把要用的内核源码clone一下,一加6的是sdm845,所以是这个链接。
在命令行跑:
git clone https://gitlab.com/sdm845-mainline/linux.git
因为envkernel.sh在pmbootstrap的git里,我们也要clone下来:
git clone https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
进入linux源码文件夹,并且source envkernel.sh:
cd linux
source ../pmbootstrap/helpers/envkernel.sh
然后就会开始初始化Alpine chroot:
[10:29:34] Update package index for x86_64 (4 file(s))
[10:29:38] (native) Creating chroot
[10:29:42] (native) % apk -q add abuild bash bc binutils bison binutils-aarch64 gcc-aarch64 diffutils elfutils-dev findutils flex g++ gcc gmp-dev linux-headers openssl-dev make mpc1-dev mpfr-dev musl-dev ncurses-dev perl py3-dt-schema sed yamllint yaml-dev xz
[10:30:27] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
[10:30:27] DONE!
[10:30:28] (native) % su pmos -c mkdir /tmp/envkernel; touch /tmp/envkernel/gcc_setup_done
[10:30:28] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
[10:30:28] DONE!
[10:30:28] (native) % chown -R pmos:pmos /mnt/linux/.output
[10:30:28] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
[10:30:28] DONE!
pmbootstrap envkernel.sh activated successfully.
* kernel source: /home/user/Coding/linux-sdm845
* output folder: /home/user/Coding/linux-sdm845/.output
* architecture: arm64 (oneplus-enchilada is aarch64)
* cross compile: aarch64-alpine-linux-musl-gcc (Alpine 14.2.0)
* aliases: make, kernelroot, pmbootstrap, pmbroot, run-script (see 'type make' etc.)
* run 'deactivate' to revert all env changes
接下来我们就会看到prompt前面都会有一个[envkernel] 那就代表我们正在chroot中。在chroot时我们的make指令都会使用交叉编译器。想从chroot中退出直接打deactivate就行。
接下来我们先打deactivate退出来,运行这条指令:
git log --oneline
我们会看到:
299e39119dcc (HEAD -> sdm845/6.14-dev, origin/sdm845/6.14-dev, origin/HEAD) arch: arm64: dts: qcom: sdm845-lg-judyln: update devicetree
6f43125d5129 arch: arm64: dts: qcom: sdm845-lg-common: enable debug uart
a4a685e21b3a (tag: sdm845-6.14-rc5-r2) arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor
568f590acb40 (tag: sdm845-6.14-rc5-r1) media: qcom: camss: Power pipeline only when streaming
778bda201c57 fixup media: i2c: Add imx371 image sensor driver
da7241698e70 fixup media: i2c: Add imx376 image sensor driver
84a296902d70 fixup! arm64: dts: qcom: sdm845-oneplus: camera bringup
...
请注意这一条:
...
a4a685e21b3a (tag: sdm845-6.14-rc5-r2) arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor
...
这个IMX519就是一加6的摄像头传感器,把它关掉的原因可以看到是:
git log a4a685e21b3a
commit a4a685e21b3a97d5b2ee39ac612929c1a868fd20 (tag: sdm845-6.14-rc5-r2)
Author: Joel Selvaraj <foss@joelselvaraj.com>
Date: Thu Mar 6 16:56:30 2025 -0600
arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor
Since it doesnt currently work.
Signed-off-by: Joel Selvaraj <foss@joelselvaraj.com>
嗯目前用不了,不过因为笔者好奇用不了到什么程度所以我们用以下指令把这个commit给revert掉:
git revert a4a685e21b3a
然后我们再查看一下git log --oneline:
868f3493560c (HEAD -> sdm845/6.14-dev) Revert "arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor"
299e39119dcc (origin/sdm845/6.14-dev, origin/HEAD) arch: arm64: dts: qcom: sdm845-lg-judyln: update devicetree
6f43125d5129 arch: arm64: dts: qcom: sdm845-lg-common: enable debug uart
可以看到多了一个revert的commit。然后我们用刚刚的source指令再次进入chroot。使用如下指令来搞定默认配置先:
make defconfig sdm845.config
这样子就会用sdm845.config把defconfig给覆写掉,接下来运行make menuconfig然后按/搜索IMX519,我们会看到IMX519被配置为模块了:
Symbol: VIDEO_IMX519 [=m]
│ Type : tristate
│ Defined at drivers/media/i2c/Kconfig:297
│ Prompt: Sony IMX519 sensor support
│ Depends on: MEDIA_SUPPORT [=m] && VIDEO_CAMERA_SENSOR [=y] && I2C [=y] && VIDEO_DEV [=m]
│ Location:
│ -> Device Drivers
│ -> Multimedia support (MEDIA_SUPPORT [=m])
│ -> Media ancillary drivers
│ -> Camera sensor devices (VIDEO_CAMERA_SENSOR [=y])
│ (1) -> Sony IMX519 sensor support (VIDEO_IMX519 [=m])
│ Selects: MEDIA_CONTROLLER [=y] && VIDEO_V4L2_SUBDEV_API [=y] && V4L2_CCI_I2C [=m] && V4L2_FWNODE [=m]
接下来就可以开始编译啦!运行:
make
想快一些可以运行 (n是线程数量):
make -jn
然后是等待...
编译完成后,用下面的指令打包内核[6]:
pmbootstrap build --envkernel linux-postmarketos-qcom-sdm845
在~/.local/var/pmbootstrap/packages/edge/aarch64/中可以看到打包好的内核,笔者的内核包文件名是:
linux-postmarketos-qcom-sdm845-6.14.0_p20250312121930-r0.apk
将一加6用数据线跟电脑连接,确保手机的sshd已经打开:
sudo service sshd start
运行下面的指令将我们自己编译的pmos内核包安装上去:
pmbootstrap sideload linux-postmarketos-qcom-sdm845
接下来就是确认安装是否成功,ssh到手机里跑下面的命令:
apk info --who-owns /boot/vmlinuz
笔者这边显示的是:
/boot/vmlinuz is owned by linux-postmarketos-qcom-sdm845-6.14.0_p20250312121930-r0
也就是刚刚打包好的内核,这就说明成功了!
成果
因为笔者的目的是观摩一下Postmarket OS对一加6摄像功能最新进展如何,以下是一些照片演示与截屏
前置摄像头:
最明显的问题应该是拍出来是自带紫色的。

后置摄像头:
后置摄像头就自带一种怀旧的颜色了。

总结
运作正常的摄像功能见多了后看到运作不正常的摄像感觉有些有趣。编译过程还是比较有趣的,pmbootstrap帮助开发者减少了很多交叉编译的麻烦。在这里向pmos的开发者们致敬。
作者:chenw1
链接:https://www.cnblogs.com/chenw1/p/18766766
本文来自博客园,欢迎转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。
自行为一加6编译Postmarket os内核的更多相关文章
- 从cpu加电到加载OS内核的详细过程(清华大学ucore-lab1总结一)
结合最近学习清华的OS课,先用“人话”来高度抽象的描述一下我自己的理解.CPU在系统加电也就是我们按下电源开关后,开始初始化他的寄存器,主要是cs和eip(本文基于x86架构),然后在ROM中找到一个 ...
- 编译安装linux内核步骤
编译安装linux内核步骤: 一.获取内核源码 源码网址:www.kernel.org 二.解压内核源码 首先以root帐号登录,然后进入/usr/src子目录.如果用户在安装Linux时,安装了内核 ...
- Linux课程实践二:编译模块实现内核数据操控
一.内核模块原理 1. Linux内核增加功能 Linux内核整体结构很庞大,包含了很多的组件,现在有两种方法将需要的功能包含进内核当中: - 静态加载:将所有的功能都编译进Linux内核. - 动态 ...
- 编译Android4.3内核源代码
--------------------------------------------------------------------------------------------------- ...
- 将MPLS编译进linux内核中
系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...
- centos源码编译安装新版本内核
在工作中,很多时候由于需要使用新的技术方案,需要较新版本的内核来支持新的功能,而centos系统自带的内核版本普遍都比较旧,因此我们需要对系统的内核进行升级,安装新版的内核.本文以centos7系 ...
- 【转】如何下载并编译Android4.0内核源码goldfish(图文)
原文网址:http://blog.csdn.net/flydream0/article/details/7070392 关于如何下载Android4.0源码,请查看我的博客内另一篇文章(同样是图文教程 ...
- linux内核系列(一)编译安装Linux内核 2.6.18
1.配置环境 操作系统:CentOS 5.2 下载linux-2.6.18版本的内核,网址:http://www.kernel.org 说明:该编译文档适合2.6.18以上的Linux内核版本,只需所 ...
- 【转】6.4.6 将驱动编译进Linux内核进行测试
原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android ...
- VirtualBox虚拟机安装RedHat7.3编译Linux0.01内核
引子 由于需要编译linux0.01内核,而目前的linux版本太高需要降低gcc版本等等,需要做不少调整非常不方便. 所以,直接安装RedHat7.3,这样就好编译linux0.01的内核了. 但是 ...
随机推荐
- Redis-十大数据类型
Reids数据类型指的是value的类型,key都是字符串 redis-server:启动redis服务 redis-cli:进入redis交互式终端 常用的key的操作 redis的命令和参数不区分 ...
- Qt编写地图综合应用22-动态轨迹
一.前言 上一篇文章写道拿到路径规划的轨迹点坐标集合,并且已经可以通过调用addPolyline绘制线段的形式将轨迹点绘制,接下来就是要如何动态的绘制这些轨迹点,最简单的方法就是开个定时器挨个取出下一 ...
- 使用MathNet.Numerics库构造矩阵并初始化时,编译器报错“this方法没有任何重载采用"1"个参数”
最近在使用MathNet.Numerics库作一些数据处理工作,构造一个矩阵并初始化时,编译器报错"this方法没有任何重载采用"1"个参数". 问题分析: 构 ...
- [转]怎么使用PyCharm编写Python程序,简单教程
原文链接:怎么使用PyCharm编写Python程序,简单教程.
- Redis 源码简洁剖析 14 - Redis 持久化
Redis 持久化方式 RDB 优势 劣势 AOF 优势 劣势 Redis < 7.0 参考链接 Redis 源码简洁剖析系列 Redis 持久化方式 主要参考 Redis 官方文档:Redis ...
- 使用Redis防止重复发送RabbitMQ消息
问题 今天遇到一个问题,发送MQ消息的时候需要保证不会重复发送,注意不是可靠到达(可靠到达可以通过消息确认机制和回调接口保证),这里保证的是不会生产多条一样的消息. 方法 综合讨论下来决定使用Redi ...
- 在 .NET 9 中使用 Scalar 替代 Swagger
前言 在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore(一个为ASP.NET Core API提供Swagger工具的项目)从ASP.N ...
- Note -「Lagrange 反演」记笔习学
也许施工完成啦? 对于常数项为 \(0\),一次项非 \(0\) 的多项式 \(F,G\),定义复合运算 \(\circ\),满足 \[(F\circ G)(x)=F(G(x))=\sum_{ ...
- biancheng-Spring Cloud Alibaba Nacos
参考http://c.biancheng.net/springcloud/what-is-alibaba.html http://c.biancheng.net/springcloud/nacos.h ...
- 在JDBC中使用带参数的SQL语句
ADO.Net中,支持带参数的SQL语句,例如:Select * from Tables where column1=@column1,其中@column1为SQL参数,使用起来非常方便,而JDBC中 ...