2023年10月28日,“第18届中国Linux内核开发者大会(CLK)”在深圳开幕。作为中国Linux内核领域最具有影响力的峰会之一,CLK以“自由、协作、创新”为理念,以开源技术的推广和普及为使命,促进Linux内核开发爱好者相互交流与进步。本届大会设置了主论坛,以及内存管理、云和服务器、Arch&虚拟化&I/O、调试/eBPF/调度四个分论坛。而在本次调试/eBPF/调度分论坛,众多技术专家分享了基于eBPF探索Linux内核可观测、可编程能力。
在会上也分享linux kernel 中强调内存安全的编程语言Rust之于终端的走向和思考。
内核堆漏洞持续成为Linux内核安全领域的一大难题,占据了已公开内核漏洞利用案例中高达75.4%(184/244)的比例。尽管内核开发者们已经采用了多种防御机制,如freelist、randomization、obfuscation等,但这些传统方法在当前环境下已经显得力不从心。
针对这一问题,南京大学博士生王子成,分享了基于eBPF的内核堆漏洞动态缓解机制。本次分享提出了一种创新性的内核堆漏洞缓解方案。该方案融合了eBPF in-kernel虚拟机的先进特性与安全分配器的随机化技术。最引人注目的是,该缓解机制能够在系统运行时动态部署,无需重启系统,从而实现即时防御。
其方案的核心思想是在分配时,为存在漏洞的vulnerable object分配随机地址,通过下述四步骤构建eBPF,将随机化object注入内核进行替换,整个过程无需patch/重新编译/重启。
•在vulnerable object分配点的caller函数入口开启ERA随机化标记
•在object分配函数kmalloc被替换为ERA 分配器
•用随机化object替换vulnerable object
•在vulnerable object分配点的caller函数出口关闭ERA随机化标记
经过严格的性能评估,该缓解机制仅带来约1%的CPU性能开销和约0.9%的内存开销,几乎不影响系统的整体性能。
作为面向未来的技术,可编程内核是对底层技术的重大改造,这或将极大程度提升虚拟机运行效率,从底层解决安卓卡顿问题,引领安卓流畅体验细节比拼的重要一环。此次OPPO平台软件开发中心GM许珉嘉还在主论坛上分享了ColorOS下基于用户体验改善的Linux内核优化方案,许珉嘉强调:手机与桌面和服务器系统,无论在硬件架构、软件架构和用户关切上都存在非常大的差异,这要求我们在Linux OS层面从各个维度进行针对移动设备场景的优化。那么在调试/eBPF/调度分论坛上,又有哪些让人眼前一亮的Linux内核优化方案呢?
FUSE作为一个用户空间文件系统的框架方便开发者可以在用户空间实现控制逻辑,而无需修改内核或具有特权,开发者可以更聚焦于应用场景的逻辑实现(glusterfs、sshfs、gvfs)。
由于存在用户态和内核态的切换开销,基于FUSE实现的文件系统性能远不如基础文件系统,FUSE文件系统的性能优化也成为一个业界关注的主要问题,在桌面系统中基于MTP协议(底层基于FUSE)的外设存储访问性能也会影响用户对系统的使用体验,本次分论坛中,统信软件 终端操作系统产线内核研发工程师何鲁港,分享了结合桌面操作系统中的需求利用BPF技术对FUSE的优化实践。
通过文件操作分发、FUSE原生代码解耦、直接生成BPF程序的三步操作,在不修改文件操作原语部分的FUSE原生代码基础上,在外部封装一层,其中:
PREPARE_DISPATCH 文件操作原语参数语义声明
DECLARE_KRNL_HANDLE 声明/定义文件操作原语的内核处理器
DECLARE_USER_HANDLE 定义文件操作原语的用户态处理器(FUSE原生代码)
DISPATCH_BPFUSE 根据BPF规则策略分发文件操作
COMPLETE_DISPATCH 结束文件操作分发及后处理
通过上述优化,该方案实现了支持前端语言直接生成BPF程序、与FUSE原生代码完全逻辑隔离、可扩展至VFS层、支持多种模式等多种特性。何鲁港指出,未来将通过优化元数据同步、简化接口,减少外部模块的依赖、Unilang规则完善与扩展等措施,进一步改善方案的优化的效率。
随着以Istio为代表的服务网格技术的生产落地,服务治理的演进逐步从业务中解耦,下沉到基础设施。数据面代理架构引入的时延开销一直是网格提供者亟须解决的问题。华为高级软件工程师谢颂杨分享了Kmesh: 基于可编程内核实现高性能服务网格数据面这一议题。
谢颂杨介绍了Kmesh从操作系统的角度提出一个新的service mesh数据面解决方案,通过eBPF +内核增强功能显著优化了数据面转发路径,从而使转发性能提升60%以上,有效地解决了网格数据面proxy架构带来的时延劣化问题。 该项目的探索与实践,是可编程内核助力云原生深度优化的典型案例。
谢颂杨对于服务网格的性能进行深度剖析,从上述网格耗时分布推断出一个结论:“sidecar架构引入大量时延开销,流量编排只占网格总开销的10%,大部分开销在数据拷贝、多出两次的建链通信、上下文切换调度等”。
针对这种现象,华为相关团队围绕实现应用透明、高效、低底噪的服务网络基础设施,以及提供高性能sidecarless网格数据面进行了相关探索。
通过Sockmap重定向Sockmap间数据流,优化内核协议栈路径,加速网格数据面,时延优化15+%
同时借助于能力卸载,流量治理下沉os,构建sidecarless服务网格等措施。基于ebpf在内核协议栈中构筑可编程的全栈流量编排运行时,实现了os原生的L4~L7 高性能网格数据面。
Rust 作为一门新兴的编程语言,其安全性和性能备受瞩目,逐渐被应用于系统级编程领域。本次分论坛,vivo底层软件技术研究总监杨铠衔通过介绍 Rust 特点,以及它在 Linux 内核中的现状和开发实践,探讨其未来的前景和发展趋势。
杨铠衔介绍,Rust清晰可控的内存及高效的性能,使得Rust同样适合开发Kernel。同时Rust透过几乎0成本的手段,约束开发工程师写出安全代码,更严格的限制,会逼迫出更优秀的设计。
同时Rust类比于C,有以下优势:
•Rust所有权机制可以解决内存泄漏、内存越界访问等问题
•Rust引用(类似C中的指针)的生命周期不允许超过其引用对象的生命周期,可以有效解决野指针等问题。
•Rust共享原则特性可以解决数据竞争等问题。
随着谷歌、微软、Linux Kernel等一线厂商的不断推进,内核 Rust 基础设施的日益完善,Rust作为Kernel开发的新兴语言,越来越被广大企业与开发者所接受并认可。
杨铠衔在实战案例分析中,解释了为什么重写file system,“vivo以用户为中心,而文件系统对终端用户体验有很大影响。Rust在fs的功能缺失还比较多,改写wrapfs只是一个过程,我们最终目的是在改写的过程中发现并补齐Rust在VFS缺失的功能,进而给社区做贡献,建立更多发展Rust的基石。”
Rust VFS内部封装lookup_callback是不安全的,最终会调用InodeOperations:lookup。该方案通过声明特征InodeOperations,让fs开发得以实现Rust下的lookup。
在上述结构中,为什么不让fs开发者直接通过binding对接C的VFS ?
杨铠衔指出,这是为了实现更清晰的安全边界:将binding带来的unsafe封装在Rust VFS层,由内核维护者保证其安全性;而fs开发者的代码则尽量使用纯粹的Rust,无需实现unsafe。不只是binding,任何其他类型的unsafe都建议封装在较为稳定的基础模块中,如此方能充分发挥出Rust在安全上的优势。
在分享的最后,杨铠衔总结道,Rust 以更稳健的内核代码,更小的维护成本,逐渐成为业界选择的趋势。而vivo未来不仅计划在Rust for Linux上持续探索文件系统、设备驱动等课题。同时也在考虑Rust for Android、Rust for RTOS的可能。