CN116775034A - 内核观测程序的构建方法、装置及设备 - Google Patents
内核观测程序的构建方法、装置及设备 Download PDFInfo
- Publication number
- CN116775034A CN116775034A CN202211600219.6A CN202211600219A CN116775034A CN 116775034 A CN116775034 A CN 116775034A CN 202211600219 A CN202211600219 A CN 202211600219A CN 116775034 A CN116775034 A CN 116775034A
- Authority
- CN
- China
- Prior art keywords
- kernel
- program
- ebpf
- observation
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 94
- 230000006870 function Effects 0.000 claims description 213
- 238000004458 analytical method Methods 0.000 claims description 84
- 238000012795 verification Methods 0.000 claims description 56
- 230000008569 process Effects 0.000 claims description 24
- 230000015654 memory Effects 0.000 claims description 19
- 238000012986 modification Methods 0.000 claims description 11
- 230000004048 modification Effects 0.000 claims description 11
- 230000006978 adaptation Effects 0.000 claims description 10
- 238000001914 filtration Methods 0.000 claims description 10
- 238000009434 installation Methods 0.000 claims description 4
- 238000011161 development Methods 0.000 description 44
- 238000010276 construction Methods 0.000 description 40
- 238000010586 diagram Methods 0.000 description 23
- 238000003860 storage Methods 0.000 description 13
- 238000012545 processing Methods 0.000 description 9
- 230000006399 behavior Effects 0.000 description 7
- 238000005516 engineering process Methods 0.000 description 6
- 230000004044 response Effects 0.000 description 6
- 230000008859 change Effects 0.000 description 4
- 238000004891 communication Methods 0.000 description 4
- 238000004519 manufacturing process Methods 0.000 description 4
- 238000005259 measurement Methods 0.000 description 4
- 230000001960 triggered effect Effects 0.000 description 4
- 238000013480 data collection Methods 0.000 description 3
- 238000012423 maintenance Methods 0.000 description 3
- 238000005457 optimization Methods 0.000 description 3
- 230000003068 static effect Effects 0.000 description 3
- 238000011144 upstream manufacturing Methods 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 239000000284 extract Substances 0.000 description 2
- 230000005291 magnetic effect Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000013515 script Methods 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 230000003044 adaptive effect Effects 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000005294 ferromagnetic effect Effects 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 238000012827 research and development Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000013024 troubleshooting Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/76—Adapting program code to run in a different environment; Porting
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本申请实施例提供一种内核观测程序的构建方法、装置及设备,所述方法包括:接收程序编译请求,所述程序编译请求中携带有eBPF程序和目标编译参数;响应于所述程序编译请求,对所述eBPF程序进行解析处理,得到所述eBPF程序的符号引用信息文件;从所述eBPF程序的符号引用信息文件中确定出目标内核符号;基于所述目标内核符号,确定内核符号头文件;基于所述目标编译参数和所述内核符号头文件,对所述eBPF程序进行编译,得到所述eBPF程序的内核观测程序。
Description
技术领域
本申请实施例涉及计算机技术领域,涉及但不限于一种内核观测程序的构建方法、装置5及设备。
背景技术
伯克利数据包过滤器(BPF,Berkeley Packet Filter)最初是由从用户空间注入到内核的一个简单的字节码构成,BPF在内核位置利用一个校验器进行检查,以避免内核崩溃或者安
全问题,并附着到一个套接字上,接着在每个接收到的数据包上运行。之后,BPF被移植到0Linux系统上,应用于部分应用程序上,例如,网络数据采集分析工具(TCPDump)。BPF的简化语言以及存在于内核中的即时编译器(JIT,Just-In-Time Compiler),使BPF成为一个性能卓越的工具。
扩展伯克利数据包过滤器无需更改内核源代码或添加其他模块便可以运行用户植入内
核中的程序。扩展伯克利数据包过滤器可以作为Linux内核中的轻量级虚拟机(VM,Virtual5Machine),开发人员可以在虚拟机中运行一些需要内核去做的程序。BPF提供一种在内核事
件和用户程序事件发生时安全注入代码的机制,这就让非内核开发人员也可以对内核进行控制。
另外,作为观测操作系统内核行为的重要技术,eBPF程序观测内核行为的方法也和内
核具体特性的支持情况以及实现方式紧密相关。因为不同版本的内核对于内核具体特性是否0能够支持以及实现方式上的不同,都会直接导致eBPF程序对应的与特性相关的观测方法,
随着版本内核的改变而改变。然而,对于复杂度达到一定程度的eBPF程序,随着适配的版本内核的增多,eBPF程序中识别内核特性支持情况的判断语句也会随之增多,增加了eBPF内核观测程序的开发难度,也严重损害了eBPF程序的可读性及可维护性。
发明内容
5基于相关技术中的问题,本申请实施例提供一种内核观测程序的构建方法、装置及设备。
本申请实施例的技术方案是这样实现的:
本申请实施例提供一种内核观测程序的构建方法,所述方法包括:
接收程序编译请求,所述程序编译请求中携带有eBPF程序和目标编译参数;
响应于所述程序编译请求,对所述eBPF程序进行解析处理,得到所述eBPF程序的符号引用信息文件;
从所述eBPF程序的符号引用信息文件中确定出目标内核符号;
基于所述目标内核符号,确定内核符号头文件;
基于所述目标编译参数和所述内核符号头文件,对所述eBPF程序进行编译,得到所述eBPF程序的内核观测程序。
本申请实施例提供一种内核观测程序的构建装置,所述装置包括:
接收模块,用于接收程序编译请求,所述程序编译请求中携带有eBPF程序和目标编译参数;
解析模块,用于响应于所述程序编译请求,对所述eBPF程序进行解析处理,得到所述eBPF程序的符号引用信息文件;
确定模块,用于从所述eBPF程序的符号引用信息文件中确定出目标内核符号;
所述确定模块,还用于基于所述目标内核符号,确定内核符号头文件;
编译模块,用于基于所述目标编译参数和所述内核符号头文件,对所述eBPF程序进行编译,得到所述eBPF程序的内核观测程序。
在一些实施例中,所述确定模块,还用于获取所述目标内核符号的声明信息;对所述声明信息进行信息组装,得到内核符号头文件。
在一些实施例中,所述装置还包括:
分析模块,用于在以下任意一种情况下:对所述eBPF程序进行编译时、完成对所述eBPF程序的编译时,对所述内核观测程序进行兼容性分析;或者,调用定时后台任务,对以下任意一种eBPF程序进行兼容性分析:当前提交的所述eBPF程序、当前导入的未进行兼容性适配的eBPF程序;当所述兼容性分析通过时,对所述内核观测程序进行功能验证;当所述兼容性分析未通过时,对所述eBPF程序进行适配性修改,得到修改后的eBPF程序;基于所述修改后的eBPF程序,重新提交携带有所述修改后的eBPF程序的程序编译请求。
在一些实施例中,所述装置还包括:
验证模块,用于当确定所述功能验证通过时,对所述内核观测程序进行通过标记,得到标记后的内核观测程序;当确定所述功能验证未通过时,对所述eBPF程序进行适配性修改,得到修改后的eBPF程序;基于所述修改后的eBPF程序,重新提交携带有所述修改后的eBPF程序的程序编译请求。
在一些实施例中,所述分析模块,还用于获取所述内核观测程序中的目标观测点函数;基于所述目标观测点函数的调用关系,确定所述目标观测点函数的调用关系树;遍历所述调用关系树,确定所述目标观测点函数在初始版本内核和目标版本内核之间的编译距离;基于所述编译距离,确定兼容性分析结果。
在一些实施例中,所述验证模块,还用于响应于针对所述内核观测程序的功能验证请求,基于所述目标版本内核对应的内核安装程序,创建虚拟机;通过所述虚拟机,对所述内核观测程序进行功能验证。
在一些实施例中,所述装置还包括:
过滤模块,用于接收针对所述内核观测程序的多个观测点函数的查询请求;响应于所述查询请求,确定出每一所述版本内核的内核代码对应的所述多个观测点函数;对所述多个观测点函数进行过滤处理,得到所述目标观测点函数。
在一些实施例中,所述分析模块,还用于获取所述eBPF程序中每一版本内核对应的内核代码,所述内核代码包括内核源码和内核安装程序;对所述内核源码进行解析处理,得到所述内核源码的符号引用信息文件;基于所述内核源码的符号引用信息文件,确定所述内核代码的符号引用关系索引;基于所述符号引用关系索引,确定所述目标观测点函数的调用关系,其中,所述调用关系树包括多个调用关系,所述调用关系即调用关系树上的每一分支,每一分支代表该观测点函数被调用到的路径。
本申请实施例提供一种内核观测程序的构建设备,包括:存储器,用于存储可执行指令;处理器,用于执行所述存储器中存储的可执行指令时,实现上述内核观测程序的构建方法。
本申请实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行所述可执行指令时,实现上述内核观测程序的构建方法。
本申请实施例提供的内核观测程序的构建方法、装置及设备,首先对eBPF程序进行解析处理,得到eBPF程序的符号引用信息文件,从eBPF程序的符号引用信息文件中确定出目标内核符号,然后,基于目标内核符号,确定内核符号头文件;最后,基于目标编译参数和内核符号头文件,对eBPF程序进行编译,得到eBPF程序的内核观测程序。如此,本申请实施例通过eBPF程序,得到内核符号头文件,之后,基于目标编译参数和内核符号头文件,对eBPF程序进行编译,得到内核观测程序,使得可以将内核观测程序的可执行程序下发到待观测内核的服务器上运行,能够避免在待观测内核的服务器环境中引入依赖项,不仅降低了内核观测程序的开发难度,还为具体的内核观测程序在不同版本内核的正常运行提供了基础保障,保障了eBPF程序的可读性及可维护性,从而提高了内核观测程序的可移植性。
附图说明
图1是本申请实施例提供的内核观测程序的构建系统的结构示意图;
图2是本申请实施例提供的内核观测程序的构建方法的流程示意图;
图3是本申请实施例提供的内核观测程序的兼容性分析方法的一种流程示意图;
图4是本申请实施例提供的远程构建内核观测程序的架构示意图;
图5是本申请实施例提供的内核观测程序的开发方法的流程示意图;
图6是本申请实施例提供的内核观测程序的兼容性分析方法的又一种流程示意图;
图7是本申请实施例提供的调用关系树的SVG图的示意图;
图8为本申请实施例提供的内核观测程序的构建装置的组成结构示意图;
图9为本申请实施例提供的内核观测程序的构建设备的组成结构示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。除非另有定义,本申请实施例所使用的所有的技术和科学术语与属于本申请实施例的技术领域的技术人员通常理解的含义相同。本申请实施例所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
这里,先对本申请实施例涉及的专业术语进行说明。
(1)BTF(BPF类型格式)是一种元数据格式,用于对与BPF程序或者映射(map)有关的调试信息进行编码。BTF也可以被扩展到包括已定义的子程序的函数信息和行信息。
(2)伯克利数据包过滤器是一种数据包过滤技术,是为了避免一系列从内核空间到用户空间的无用数据包的复制行为。
(3)扩展伯克利数据包过滤器(eBPF,Extended Berkeley Packet Filter)是一种数据包过滤技术,是从伯克利数据包过滤器(BPF,Berkeley Packet Filter)技术扩展而来的内核技术(从Linux 4.x开始)。
相关技术中,eBPF将原本单一的数据包过滤事件逐步扩展到了内核态函数、用户态函数、跟踪点、性能事件(Performance Events)以及安全控制等。eBPF不仅扩展了寄存器的数量,也引入了全新的BPF映射存储。eBPF程序架构强调安全性和稳定性,看上去更像内核模块,但与内核模块不同,eBPF程序不需要重新编译内核,并且可以确保eBPF程序运行完成,而不会造成系统的崩溃。eBPF程序并不像常规的线程那样,启动后就一直运行在那里,它需要事件触发后才会执行。这些事件包括系统调用、内核跟踪点、内核函数和用户态函数的调用退出、网络事件,等等。借助于强大的内核态插桩(kprobe)和用户态插桩(uprobe),eBPF程序几乎可以在内核和应用的任意位置进行插桩。
eBPF程序通过绑定到操作系统的具体内核函数上,利用操作系统调用接口被加载到内核,当绑定的内核函数被调用执行时,eBPF程序就会被内核触发执行。同时,eBPF程序借助一种MAP映射的内存区域,将内核函数的执行过程中的数据信息传递到用户的数据收集程序中,从而实现了实时、动态的观测操作系统内核执行过程的行为和数据的目的。在算力网络场景中,可以动态观测、收集内核调度中央处理器(CPU,Central Processing Unit)计算资源的策略数据,实现均衡CPU算力负载等功能。
相关技术中,基于eBPF内核观测技术,在内核函数(如tcp_drop)前进行插桩;通过插桩的函数,从寄存器中抓取内核函数tcp_drop的丢包数据,并将丢包数据存入eBPF MAP中;在用户态数据收集程序中,读取eBPF MAP中的丢包数据,将所读取的丢包数据匹配响应的虚拟机、进程或容器,获取匹配数据,这些匹配数据用于操作系统中相关服务进程的分析。
eBPF技术和操作系统内核的特性有比较密切的关系。一方面,eBPF技术本身就是一种Linux操作系统内核的特性,只有部分版本的Linux内核才对eBPF技术提供了完善的支持。相关技术中,用于执行用户程序的内核模块可以通过文件写入的方式实时生成,因此,在不对用户程序进行修改的情况下,也可以使用户程序在未预先设置有内核模块的内核(即低版本内核)中运行,也即是使用户程序在包含低版本内核的操作系统的内核态下运行。同时,利用上述方式实际上还能够得到与不同用户程序各自对应的内核模块,从而使得不同的用户程序均能够在低版本内核中运行,增强操作系统中低版本内核的用户程序执行能力。eBPF技术在上述实现方案中,提出了用户程序加载到操作系统内核执行的通用方案,为eBPF程序在低版本的内核中运行提供了方法。
在相关技术中,开发eBPF内核观测程序的技术方案至少包括以下方式:(1)以BPF编译器集合(BCC,BPF Compiler Collection)项目为代表,需要在待观测内核行为的操作系统中,安装eBPF程序编译工具和待观测内核的头文件等依赖项。在运行eBPF观测程序时,这种方案会执行eBPF程序编译、加载、检查、被触发执行、观测数据收集的整个流程。BCC项目这种构建eBPF内核观测程序的方案,需要过于繁重的依赖项,而在为较低版本的内核开发eBPF观测程序,以及需要在生产环境执行eBPF观测程序时,安装依赖项都会受到限制;此外,“一次编写,到处编译”带来的计算负载的冲高和执行效率的下降,也降低了使用这种方案构建eBPF内核观测程序的可用性。
(2)另一种构建eBPF内核观测程序方案的实现逻辑是“一次编译,到处运行”,依赖于待观测的内核提供对应版本内核的BTF信息,用于对eBPF程序中访问到的内核数据结构进行重定位。同时,该方案提供了探测待观测内核中具体数据结构、函数是否存在的判断接口,实现了针对不同版本内核对具体特性的支持情况,采用不同的观测方法的方案。虽然,这种方案给eBPF内核观测程序带来了一些可移植性,但仍无法识别不同版本内核对具体特性在函数调用路径上的变化,从而可能造成eBPF程序观测到错误的结果。同时,依赖eBPF程序中的条件判断语句区分不同版本内核的观测方法,依赖于eBPF程序开发者对不同版本内核的实现逻辑充分理解,才能开发出高移植性的eBPF程序,提高了eBPF内核观测程序的构建门槛。对于稍复杂一点的eBPF程序,随着适配版本内核的增多,程序中识别内核特性支持情况的判断语句也会随之增多,严重损害了eBPF程序的可读性及可维护性。
基于相关技术中存在的上述至少一个问题,本申请实施例提供一种内核观测程序的构建方法,首先对eBPF程序进行解析处理,得到eBPF程序的符号引用信息文件,从eBPF程序的符号引用信息文件中确定出目标内核符号,然后,基于目标内核符号,确定内核符号头文件;最后,基于目标编译参数和内核符号头文件,对eBPF程序进行编译,得到内核观测程序。如此,本申请实施例通过eBPF程序,得到内核符号头文件,之后,基于目标编译参数和内核符号头文件,对eBPF程序进行编译,得到内核观测程序,能够避免在待观测内核的服务器环境中引入依赖项,不仅降低了内核观测程序的开发难度,还为具体的内核观测程序在不同版本内核的正常运行提供了基础保障,保障了eBPF程序的可读性及可维护性,从而提升了有效提高了内核观测程序的可移植性。
下面说明本申请实施例的内核观测程序的构建设备的示例性应用,本申请实施例提供的内核观测程序的构建设备可以实施为终端,也可以实施为服务器。在一种实现方式中,本申请实施例提供的内核观测程序的构建设备可以实施为笔记本电脑,平板电脑,台式计算机,移动设备等各种类型的终端;在另一种实现方式中,本申请实施例提供的内核观测程序的构建设备还可以实施为服务器,其中,服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(CDN,Content Delivery Network)、以及大数据和人工智能平台等基础云计算服务的云服务器。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请实施例中不做限制。下面,将说明内核观测程序的构建设备实施为服务器时的示例性应用。
参加图1,图1是本申请实施例提供的内核观测程序的构建系统的结构示意图。为实现对内核观测程序的构建,本申请实施例可以提供一内核观测程序构建平台,该内核观测程序构建平台可以实施为一内核观测程序构建应用。本申请实施例提供的内核观测程序的构建系统10中包括开发环境端100、网络200和构建服务端300,其中,构建服务端300是内核观测程序构建应用的服务器。开发环境端100通过网络200连接构建服务端300,网络200可以是广域网或者局域网,又或者是二者的组合。
在一些实施例中,请参照图1,在进行内核观测程序构建时,开发环境端100获取待编译的eBPF程序和目标编译参数,将获取的eBPF程序和目标编译参数封装至程序编译请求,开发环境端100通过网络200将程序编译请求发送给构建服务端300,程序编译请求中携带有eBPF程序和目标编译参数。构建服务端300,响应于程序编译请求,对eBPF程序进行解析处理,得到eBPF程序的符号引用信息文件。构建服务端300从eBPF程序的符号引用信息文件中确定出目标内核符号;然后,基于目标内核符号,确定内核符号头文件;最后,基于目标编译参数和内核符号头文件,对eBPF程序进行编译,得到eBPF程序的内核观测程序。
在一些实施例中,构建服务端300在得到eBPF程序的内核观测程序后,构建服务端300可以将内核观测程序存储起来,也可以将内核观测程序下发至当前已授权的服务器,以使得当前已授权的服务器可以下载内核观测程序,从而实现对不同版本内核的观测。
本申请实施例提供一种内核观测程序的构建方法,该内核观测程序的构建方法可以通过构建服务端来执行。参见图2,图2是本申请实施例提供的内核观测程序的构建方法的流程示意图,将结合图2示出的步骤进行说明。
步骤S201,接收程序编译请求,所述程序编译请求中携带有eBPF程序和目标编译参数。
在一些实施例中,程序编译请求用于请求构建服务端编译出一内核观测程序,该内核观测程序用于观测程序编译请求中指定的版本内核。这里,程序编译请求中携带有eBPF程序和目标编译参数,目标编译参数包括目标编译架构和初始内核版本。目标编译架构是指与程序编译请求对应的编译架构,该编译架构可以用于对eBPF程序进行编译,以得到编译后的eBPF程序。每一编译架构都具有对应的架构标识,架构标识是编译架构的唯一标识,该唯一标识用于区别不同编译架构,例如BuildArch=X86_64。在实际应用中,构建服务端可以基于架构标识确定当前程序编译请求中携带的编译架构。初始内核版本指的是服务器基于的内核版本,即最初的内核版本。
举例来说,程序编译请求可以是构建服务端接收的编译一通信应用程序的请求;程序编译请求可以是构建服务端接收的编译一购物应用程序的请求;程序编译请求可以是构建服务端接收的编译一内核观测程序的请求,如eBPF程序。
步骤S202,响应于所述程序编译请求,对所述eBPF程序进行解析处理,得到所述eBPF程序的符号引用信息文件。
在一些实施例中,当构建服务端接收到一程序编译请求时,构建服务端响应该程序编译请求,通过eBPF编译器中预先存储的预编译命令对eBPF程序进行解析,得到eBPF程序的符号引用信息文件。
在一些实施例中,符号是指函数、变量等任何形式的字面量。符号引用文件是指具备相互引用关系的符号构成的文件。这里,eBPF程序的符号也包括内核符号。
步骤S203,从所述eBPF程序的符号引用信息文件中确定出目标内核符号。
在一些实施例中,构建服务端对eBPF程序进行解析处理后,得到eBPF程序的符号引用信息文件,之后,构建服务端从eBPF程序的符号引用信息文件中提取出eBPF程序访问到的内核符号,即目标内核符号。
步骤S204,基于所述目标内核符号,确定内核符号头文件。
在一些实施例中,上述步骤S204可以通过以下方式实现:
首先,获取所述目标内核符号的声明信息。然后,对所述声明信息进行信息组装,得到内核符号头文件。
在一些实施例中,构建服务端可以根据指定的内核版本,从指定内核版本的内核代码中提取出目标内核符号的声明信息,并将这些声明信息组装成内核头文件。这里,声明信息包括该观测点函数的各个入参的数据结构的字段信息、函数返回值等。内核头文件可以为vmlinux.h依赖项。
在本申请实施例中,可以先对内核观测程序的开发项目进行初始化处理,得到内核观测程序的初始模板文件,初始模板文件包括但不限于eBPF程序的初始模板文件、构建开发项目的Makefile模板文件。这里,可以将得到的内核头文件或者vmlinux.h依赖项的代码导入eBPF程序的初始模板文件中,得到内核符号头文件,以实现定义eBPF程序的许可证。eBPF程序的许可证是指可以用于在eBPF程序的加载到内核执行时,能够内核校验的许可证。
在一些实施例中,上述将内核符号头文件导入eBPF程序的初始模板文件中,也就是将与依赖相关的代码导入eBPF程序的初始模板文件中,以此表征对内核符号头文件的依赖,换言之,构建服务端并未实际将内核符号头文件导入eBPF程序的初始模板文件中。实际上,在构建服务端编译eBPF程序时,才会导入内核符号头文件。
步骤S205,基于所述目标编译参数和所述内核符号头文件,对所述eBPF程序进行编译,得到所述eBPF程序的内核观测程序。
在一些实施例中,构建服务端可以根据直接获取的目标编译参数和内核符号头文件,对eBPF程序进行交叉、静态编译,构建得到eBPF程序的内核观测程序的可执行程序;也可以根据目标编译架构的架构标识调用对应的目标编译架构,然后根据调用的目标编译架构和内核符号头文件,对eBPF程序进行交叉、静态编译,构建得到eBPF程序的内核观测程序的可执行程序。
由此可见,本申请实施例提供的内核观测程序的构建方法,首先对eBPF程序进行解析处理,得到eBPF程序的符号引用信息文件;然后,从eBPF程序的符号引用信息文件中确定出目标内核符号;然后,基于目标内核符号,确定内核符号头文件;最后,基于目标编译参数和内核符号头文件,对所述eBPF程序进行编译,得到所述内核观测程序。如此,本申请实施例通过eBPF程序,得到内核符号头文件,之后,基于目标编译参数和内核符号头文件,对eBPF程序进行编译,得到内核观测程序,能够避免在待观测内核的服务器环境中引入依赖项,不仅降低了内核观测程序的开发难度,还为具体的内核观测程序在不同版本内核的正常运行提供了基础保障,保障了eBPF程序的可读性及可维护性,从而提高了有效提高了内核观测程序的可移植性。
在一些实施例中,还可以对内核观测程序进行兼容性分析,以确定构建的内核观测程序是否能够兼容不同版本的内核。当满足预设条件时,可以对内核观测程序的兼容性分析。在本申请实施例中,预设条件可以是:对eBPF程序进行编译时、完成对eBPF程序的编译时。也就是说,在满足上述预设条件中任意一种时,构建服务端会对内核观测程序进行兼容性分析。
在另一些实施例中,构建服务端可以调用定时后台任务,对以下任意一种eBPF程序进行兼容性分析:当前提交的eBPF程序、当前导入的未进行兼容性适配的eBPF程序。这里,兼容性分析是指构建服务端可以对内核观测程序兼容不同版本内核的兼容情况进行分析。定时后台任务即周期性对所构建的内核观测程序进行兼容性分析的任务。
在对eBPF程序进行编译时,可以对内核观测程序兼容性分析,从而能够及时得知编译过程中的内核观测程序的兼容性情况,以便于可以实时调整eBPF程序的编译过程。当完成对eBPF程序的编译时,可以对内核观测程序兼容性分析,能够得到编译后的内核观测程序的兼容性情况。或者,可以对当前提交的eBPF程序进行兼容性分析,查看当前提交的eBPF程序的兼容性情况,以确定是否需要对当前提交的eBPF程序进行编译。可以对当前导入的未进行兼容性适配的eBPF程序进行兼容性分析,查看当前导入的未进行兼容性适配的eBPF程序的兼容性情况,以确定是否需要对当前导入的未进行兼容性适配的eBPF程序进行兼容性适配。
在一些实施例中,构建服务端还可以存储有云端任务单元,可以预先配置该云端任务单元,通过云端任务单元对内核观测程序进行兼容性分析。例如,云端任务单元可以定期轮询构建服务端所构建的内核观测程序,周期性(如每分钟、每小时、每天、每周或每月等时间粒度)对所构建的内核观测程序进行兼容性分析。这里,定时后台任务即周期性对所构建的内核观测程序进行兼容性分析的任务。
在一些实施例中,在针对内核观测程序的兼容性分析触发之后,可以对内核观测程序进行兼容性分析,以确定构建的内核观测程序是否能够兼容不同版本的内核。基于前述实施例,本申请实施例提供一种内核观测程序的兼容性分析方法,该内核观测程序的兼容性分析方法可以由构建服务端执行,图3是本申请实施例提供的内核观测程序的兼容性分析方法的一种流程示意图,如图3所示,该内核观测程序的兼容性分析方法包括以下步骤:
步骤S301,接收针对所述内核观测程序的多个观测点函数的查询请求。
在一些实施例中,观测点函数可以为在整个内核运行路径上支持安插哨岗的地方,eBPF程序就是这些哨岗回调的程序,哨岗即本申请实施例中的观测点函数。eBPF程序将内核执行到其中一个哨岗时,可以收集内核的相关环境数据,并将收集的相关环境数据反馈给用户,这里,用户查看的数据是内核在运行时的相关环境数据。每一版本内核支持的哨岗是该版本内核的固有属性,以便于基于内核支持的哨岗编译出对应的内核观测程序。
在本申请实施例中,构建服务端可以接收针对内核观测程序的查询请求,该查询请求用于查询内核观测程序中的观测点函数,在查询过程中,可以查询内核观测程序的开发项目的初始版本内核,或者重新指定要查询的版本内核。
在另一些实施例中,构建服务端也可以查询不同版本内核中指定观点测函数的声明信息,声明信息包括该观测点函数的各个入参的数据结构的字段信息、函数返回值等。当然,构建服务端也可以查询不同版本内核中指定观测点函数的上下游调用关系,并支持在查询过程中设定观点测函数的调用深度值,这里,调用深度值指的是观测点函数的嵌套次数。例如,观测点函数A的调用深度值为5,对应的,该观测点函数的嵌套次数为5次。
步骤S302,响应于所述查询请求,确定出每一所述版本内核的内核代码对应的所述多个观测点函数。
步骤S303,对所述多个观测点函数进行过滤处理,得到所述目标观测点函数。
在一些实施例中,构建服务端可以通过网络或者存储等类别对每一版本内核中的多个观测点函数进行过滤处理,构建服务端也可以通过观测点关键字对每一版本内核中的多个观测点函数进行过滤,以得到目标观测点函数。
步骤S304,获取所述内核观测程序中的目标观测点函数。
在本申请实施例中,构建服务端首先获取内核观测程序中所有跟踪的内核观测点函数,即目标观测点函数。
步骤S305,基于所述目标观测点函数的调用关系,确定所述目标观测点函数的调用关系树。
在一些实施例中,目标观测点函数的调用关系树,是一棵程序数据结构的多叉树,以目标观测点函数作为该调用关系树的根节点,各个树节点所指代的观测点函数可以被该节点的子节点所指代的观测点函数调用执行,调用关系树的叶子节点代表内接入口函数或者模块入口函数。
在一些实施例中,上述步骤S305可以通过以下方式实现:首先,获取所述eBPF程序中每一版本内核对应的内核代码,所述内核代码包括内核源码和内核安装程序。然后,对所述内核源码进行解析处理,得到所述内核源码的符号引用信息文件。再然后,基于所述内核源码的符号引用信息文件,确定所述内核代码的符号引用关系索引。最后,基于所述符号引用关系索引,确定所述目标观测点函数的调用关系,其中,所述调用关系树包括多个调用关系,所述调用关系即调用关系树上的每一分支,每一分支代表该观测点函数被调用到的路径。
步骤S306,遍历所述调用关系树,确定所述目标观测点函数在初始版本内核和目标版本内核之间的编译距离。
编译距离即莱文斯坦距离(Levenshtein),是针对两个字符串(例如英文字)的差异程度的量化计算。编译距离的计算方式是计算至少需要多少次的处理才能将其中一个字符串变成另一个字符串。也就是说,计算目标观测点函数或者数据结构,在初始版本内核中的定义转变为目标版本内核中的定义所需要的操作次数。这里操作可以包括插入任意字符、删除任意字符以及修改任意字符。这里的定位是指函数或者数据结构的具体实现代码。
举例来说,给定的两个字符串分别为S和T,例如:S=“ABCF”,T=“DBFG”。对于T来说,设定存在三种操作方式:在任意位置添加任意字符;删除存在的任意字符;修改任意字符。也就是说,编译距离是经过最少操作可以把字符串T变成字串符S的次数。
在一些实施例中,构建服务端遍历该调用关系树,计算每个树节点上所指代的观测点函数以及相关数据结构在初始版本内核和目标版本内核之间的编辑距离。
在另一些实施例中,在确定出目标观测点函数的编译距离之后,还可以继续查询内核观测程序中的观测点函数,以确定是否还存在有观测点函数。
步骤S307,基于所述编译距离,确定兼容性分析结果。
在一些实施例中,上述步骤S307还可以包括以下内容:
当确定所述编辑距离为编辑距离阈值时,确定兼容性分析结果为兼容通过;当确定所述编辑距离大于所述编辑距离阈值时,确定兼容性分析结果为兼容未通过。
在一些实施例中,构建服务端可以将所有目标观测点函数及相关数据结构的编辑距离进行求和,得到兼容性分析得分,即兼容性分析结果。构建服务端也可以将该eBPF程序涉及的每一目标观测点函数生成的调用关系树转化成SVG图像格式的URL链接。然后,输出兼容性分析得分和该SVG图像格式的URL链接。
当内核观测程序涉及的观测点函数和内核数据结构,在初始版本内核和目标版本内核之间的编辑距离都为零,求和得到内核观测程序的兼容性分析得分为零时,可以确定该内核观测程序在初始版本内核和目标版本内核之间完全兼容。此时,兼容性分析结果为兼容通过。
当内核观测程序的兼容性分析得分不为零时,则兼容性验证不通过,开发环境端可以利用SVG图查看编辑距离不为零的目标观测点函数或者数据结构,可以分析该目标观测点函数或者数据结构在初始版本内核和目标版本内核中内核代码上的差异,是否影响到初始版本内核和目标版本内核在两个版本内核的兼容性。若开发环境端确认初始版本内核和目标版本内核之间兼容时,则请求构建服务端标记该兼容性分析进入通过状态。否则,开发环境端可以对所述eBPF程序进行适配性修改,得到修改后的eBPF程序;基于所述修改后的eBPF程序,重新提交携带有所述修改后的eBPF程序的程序编译请求。或者,开发环境端选择不做处理,该兼容性分析依然保持待确认状态。
在一些实施例中,在执行上述步骤S307之后,还可以执行以下步骤S308至步骤S309:
步骤S308,当所述兼容性分析通过时,对所述内核观测程序进行功能验证。
步骤S309,当所述兼容性分析未通过时,对所述eBPF程序进行适配性修改,得到修改后的eBPF程序;基于所述修改后的eBPF程序,重新提交携带有所述修改后的eBPF程序的程序编译请求。
在一些实施例中,上述对内核观测程序进行功能验证可以通过以下方式实现:首先,响应于针对所述内核观测程序的功能验证请求,基于所述目标版本内核对应的内核安装程序,创建虚拟机。之后,通过所述虚拟机,对所述内核观测程序进行功能验证。
在一些实施例中,构建服务端可以根据目标版本内核,先启动模板虚拟机,在模板虚拟机中安装与目标版本内核对应的版本内核,然后,将模板虚拟机设置为从目标版本内核对应的版本内核中启动,设置完成后,重启该模板虚拟机,进入该版本内核。之后,在模板虚拟机中放置构建后的内核观测程序的可执行程序,最后启动模板虚拟机的登录命令,构建服务端可以对内核观测函数进行功能验证,以验证当前的eBPF程序的功能是否可以正常运行。
在一些实施例中,在执行上述步骤S308之后,还可以执行步骤S310至步骤S311。
步骤S310,当确定所述功能验证通过时,对所述内核观测程序进行通过标记,得到标记后的内核观测程序。
步骤S311,当确定所述功能验证未通过时,对所述eBPF程序进行适配性修改,得到修改后的eBPF程序;基于所述修改后的eBPF程序,重新提交携带有所述修改后的eBPF程序的程序编译请求。
在一些实施例中,构建服务端可以接收内核观测程序的功能验证流程,该功能验证包括手动验证和自动验证两种方式,可以通过虚拟机登陆方式,将内核观测程序登陆到虚拟机上手动执行操作,以验证eBPF内核观测程序的正确性。然后,对于验证通过的内核观测程序,可以请求构建服务端对验证通过的内核观测程序进行通过标记,得到标记后的内核观测程序。当采用自动验证方式时,可以在内核观测程序的开发项目下创建验证测试程序,并在自动验证成功后执行通过标记。
在一些实施例中,在验证通过之后,还可以批量下载指定版本内核下的验证通过的内核观测程序。这些内核观测程序的可执行程序可以直接下发到待观测内核的构建服务端上执行。
由此可见,本申请实施例提供的内核观测程序的兼容性分析方法,解决了eBPF内核观测程序在移植到目标版本内核上执行过程中出现的兼容性问题。在本申请实施例中,利用eBPF程序和不同版本内核的兼容性分析结果,能够及时适配得到兼容不同版本内核的内核观测程序,并在虚拟机中验证内核观测程序在该版本内核下观测结果的正确性。如此,保留了内核观测程序和目标版本内核的强关联性,从而不仅保证了内核观测程序的内核代码的简明性,便于内核观测程序的维护和更新,而且通过虚拟机对内核观测程序进行验证也能够保障内核观测程序观测结果的正确性,避免了不同版本内核由于函数调用路径、处理逻辑优化等的改变,而导致在生产环境实际使用内核观测程序时观测到错误数据的情况。
本申请实施例提供中,开发人员可以基于开发项目的初始化结果得到的模板文件、内核观测点的查询接口和SVG图,便捷地开发出高可移植性的内核观测程序,极大地降低了内核观测程序的开发难度,大大提高了使用程序观测内核行为的易用性。
下面,将说明本申请实施例在一个实际的应用场景中的示例性应用。
本申请实施例提供了一种eBPF内核观测程序(即上述实施例中的内核观测程序),并且编译构建后的内核观测程序能够兼容各个版本内核的可执行程序的方法。
本申请实施例提供的内核观测程序构建方法,在eBPF研发环境中部署,将得到的内核观测程序的可执行程序下发到待观测内核的服务器上直接运行即可,可以避免在待观测内核的服务器环境中引入依赖项。另外,本申请实施例通过实现内核观测程序的编译以及兼容不同版本内核的辅助手段,不仅降低了内核观测程序的开发难度,而且为具体内核观测程序在不同版本内核的正确运行提供了有效保障,在一定程度上提高了内核观测程序的可移植性。
本申请实施例提供的内核观测程序构建方法由开发环境端和构建服务端两部分组成远程构建架构。本申请实施例提供一种远程构建内核观测程序,图4为本申请实施例的远程构建内核观测程序的架构示意图,如图4所示。图中分别示出了开发环境端和构建服务端,其中,构建服务端至少包括:代码模块401、编译模块402、分析模块403、验证模块404和归档模块405。
代码模块401,用于预先导入待观测eBPF程序兼容的不同版本的内核代码,内核代码包括内核源码和内核安装程序,并对内核源码进行解析,得到内核源码的符号引用信息文件;基于内核源码的符号引用信息文件,建立内核代码中的函数、变量等符号的符号引用关系索引;完成相关内核模块初始化、函数注册等信息缓存工作,响应于接收的内核观测程序的多个观测点函数的查询请求,以及观测点函数调用关系请求等。这里,可以通过人为输入网络获取链接或者上传本地压缩包的方式导入内核代码。
编译模块402,用于安装编译eBPF程序所需要的eBPF编译器以及与eBPF编译器相关的依赖项,在接收到程序编译请求时,构建服务端可以通过eBPF编译器中的预先存储的预编译命令对eBPF程序进行解析,以得到eBPF程序的符号引用信息文件。之后,从eBPF程序的符号引用信息文件中提取出访问到的内核符号,即目标内核符号,根据指定的内核版本,从指定内核版本的内核代码中提取出目标内核符号的声明信息,并将这些声明信息组装成内核符号头文件,例如vmlinux.h头文件。之后,构建服务端可以根据目标编译参数和内核符号头文件,对提交的eBPF程序进行交叉、静态编译,构建得到eBPF程序对应的内核观测程序的可执行程序。这里,编译得到的是可执行程序形式的文件。
分析模块403,用于对提交的内核观测程序是否兼容不同版本内核的兼容情况进行兼容性分析,并将兼容性分析结果保存,以供开发人员后续查询。这里,兼容性分析触发方式包括:对eBPF程序进行编译时、完成对eBPF程序的编译时,对内核观测程序进行兼容性分析;或者,调用定时后台任务,对当前提交的所述eBPF程序、当前导入的未进行兼容性适配的eBPF程序,进行兼容性分析。
验证模块404,用于根据指定内核版本,通过导入的目标内核版本对应的内核安装程序建立虚拟机,并将构建后的内核观测程序置于虚拟机中,然后,构建服务端返回所接收的虚拟机登录命令,以便于可以登录虚拟机验证内核观测程序的功能验证是否正确。这里,可以通过以下方式建立虚拟机:启动模板虚拟机,在模板虚拟机中安装目标内核版本对应的内核,然后,将模板虚拟机设置为从目标版本内核对应的版本内核中启动,设置完成后,重启该模板虚拟机,进入该版本内核。
归档模块405,用于根据已适配版本内核的内核观测程序以及标记后的内核观测程序,将已适配版本内核的内核观测程序以及标记后的内核观测程序对应的内核观测程序源码和可执行文件进行归档,并支持批量下载目标版本内核下的归档程序文件。
开发环境端至少包括:初始化模块406、查询模块407、提交模块408、触发模块409和下载模块410。
初始化模块406,用于初始化内核观测程序的开发项目,开发环境端可以向构建服务端发起查询请求,该查询请求用于查询已预置的内核版本和可以支持的内核版本、编译架构、初始设定该开发项目的初始内核版本以及目标编译参数等配置。初始化后,可以生成内核观测程序开发项目的初始模板文件。初始模板文件包括但不限于eBPF程序的初始模板文件、构建开发项目的Makefile模板文件。eBPF程序的初始模板文件中可以导入内核头文件或者vmlinux.h依赖项的代码,得到内核符号头文件,以实现定义eBPF程序的许可证,以及设置内核观测点函数和调用用户态收集程序的数据收集接口等的示例代码。这里,eBPF程序的许可证是指可以用于在eBPF程序的加载到内核执行时,能够内核校验的许可证。基于上述模板文件,使得只需添加eBPF程序绑定的内核观测函数,就能够将观测数据放入数据收集接口。
查询模块407,用于向构建服务端发送查询请求,该查询请求用于查询初始版本内核的内核代码可以支持的观测点函数。在查询过程中,开发环境端可以使用该开发项目的初始版本内核,或者重新指定要查询的版本内核,即目标版本内核。同时,开发环境端支持通过网络、存储等类别,或者观测点函数关键字,对目标版本内核支持的观测点函数进行过滤处理,得到目标观测点函数。开发环境端也可以查询具体版本内核中,目标观测点函数的声明信息,声明信息包括该观测点函数的各个入参的数据结构的字段信息、函数返回值。开发环境端也可以查询具体内核版本中,目标观测点函数的上下游调用关系,并支持在查询过程中指定观测点函数的调用深度值,这里,调用深度值指的是观测点函数的嵌套次数。
提交模块408,用于支持将编写完成的内核观测程序,提交到服务端进行编译,编译日志可以保存在开发项目的日志目录下,用于优化分析或者排查编译报错。开发环境端支持触发服务器,对已提交的内核观测程序是否兼容其他版本内核的兼容情况进行兼容性分析。
触发模块409,用于支持向构建服务端发起eBPF程序的验证流程,包括手动验证和自动验证两种方式。开发环境端可以通过构建服务端提供的虚拟机登陆方式,登陆到虚拟机手动执行操作验证内核观测程序的正确性。然后,对于验证通过的内核观测程序,可以请求服务器对验证通过的内核观测程序进行通过标记,得到标记后的内核观测程序。当采用自动验证方式时,开发环境端可以在当前开发项目下创建验证测试程序,并支持在自动验证成功后执行标记验证通过标签的回调函数。
下载模块410,用于批量下载指定版本内核中验证通过的所有内核观测程序的可执行程序。这些内核观测的可执行程序可以直接下发到待观测内核的服务器上执行。
本申请实施例提供一种内核观测程序的开发方法,图5为本申请实施例提供的内核观测程序的开发方法的流程示意图,如图5所示,该内核观测程序的开发方法包括以下步骤:
步骤S501,初始化内核观测程序的开发项目,得到eBPF程序的模板文件。
步骤S502,确定目标观测点信息,基于模板文件对eBPF程序进行编写。
步骤S503,提交程序编译请求。
步骤S504,确定是否触发兼容性分析,若是,则执行步骤S505;若否,则执行步骤S508。
步骤S505,确定兼容性分析结果是否为兼容通过,若是,则执行步骤S508;若否,则执行步骤S506。
步骤S506,当确定兼容性分析结果为兼容未通过时,手动确认兼容性分析结果是否为兼容性通过;若是,则执行步骤S508;若否,则执行步骤S507。
步骤S507,当手动确认兼容性分析结果为兼容性未通过时,根据兼容性分析结果,对eBPF程序进行适配性修改。
在执行步骤S507之后,还可以返回执行步骤S503,即在对eBPF程序进行适配性修改后,得到修改后的eBPF程序;基于修改后的eBPF程序,重新提交携带有修改后的eBPF程序的程序编译请求。
步骤S508,确定内核观测程序是否编译成功,若是,则执行步骤S509;若否,则执行步骤513。
步骤S509,提交功能验证请求,并登录虚拟机进行验证。
步骤S510,确定功能验证是否通过,若是,则执行步骤S511;若否,则执行步骤S513。
步骤S511,当确定功能验证通过时,提交验证通过标记。
步骤S512,批量下载内核观测程序的可执行程序。
步骤S513,当确定内核观测为未编译成功时,根据报错结果,对eBPF程序进行适应性修改。
在执行步骤S513之后,还可以轮询执行步骤S503,即在对eBPF程序进行适配性修改后,得到修改后的eBPF程序;基于修改后的eBPF程序,重新提交携带有修改后的eBPF程序的程序编译请求。
由此可见,本申请实施例提供的内核观测程序的构建方法,通过在构建服务端预置了待观测内核的源代码和eBPF程序的编译工具链,可以直接将构建的内核观测程序下发到待观测内核的服务器上运行,不需要在待观测内核的服务器上安装其他依赖项。同时,解决了eBPF内核观测程序在移植到目标版本内核上执行过程中出现的兼容性问题。在本申请实施例中,利用eBPF程序和不同版本内核的兼容性分析结果,能够及时适配得到兼容不同版本内核的内核观测程序,并在虚拟机中验证内核观测程序在该版本内核下观测结果的正确性。
如此,保留了内核观测程序和目标版本内核的强关联性,从而不仅保证了内核观测程序的内5核代码的简明性,便于内核观测程序的维护和更新,而且通过虚拟机对内核观测程序进行验
证也能够保障内核观测程序观测结果的正确性,避免了不同版本内核由于函数调用路径、处理逻辑优化等的改变,而导致在生产环境实际使用内核观测程序时观测到错误数据的情况。
另外,本申请实施例提供中,开发人员可以基于开发项目的初始化结果得到的初始模板文件、内核观测点的查询接口和SVG图,便捷地开发出高可移植性的eBPF内核观测程序,极大地0降低了eBPF内核观测程序的开发难度,大大提高了使用eBPF程序观测内核行为的易用性。
在一些实施例中,开发过程中触发兼容性分析时,或者构建服务端在定时任务中自动触发兼容性分析时,构建服务端执行兼容性分析任务,即分析内核观测程序初始版本内核与目标版本内核之间的兼容性,本申请实施例提供一种兼容性分析方法,图6为本申请实施例提
供的兼容性分析方法的又一种流程示意图,如图6所示,该兼容性分析方法包括以下步骤:5步骤S601,构建服务端获取eBPF程序中的内核观测点函数。
步骤S602,构建服务端基于eBPF程序中的目标观测点函数的调用关系,确定目标观测点函数的调用关系树。
在一些实施例中,目标观测点函数的函数调用树,是一棵程序数据结构的多叉树,以目
标观测点函数作为该调用关系树的根节点,各个树节点所指代的观测点函数可以被该节点的0子节点所指代的观测点函数调用执行,调用关系树的叶子节点代表内接入口函数或者模块入
口函数。
步骤S603,遍历调用关系树,确定目标观测点函数在初始内核版本和目标内核版本之间的编译距离。
在一些实施例中,计算目标观测点函数或者数据结构,在初始版本内核中的定义转变为5目标版本内核中的定义所需要的操作次数。这里操作可以包括插入任意字符、删除任意字符
以及修改任意字符。这里的定位是指函数或者数据结构的具体实现代码。
步骤S604,确定eBPF程序中是否还有其余观测点函数。
在一些实施例中,一个eBPF程序中可以包括有多个内核观测点函数及入参、全局变量
等内核数据结构。当确定eBPF程序中还包括其余观点测函数时,则轮询上述步骤S602至步0骤S603。
步骤S605,将所有目标观测点函数及相关数据结构的编辑距离进行求和,得到兼容性分析得分,并将每一目标观测点函数生成的调用关系树转化成SVG图像格式的URL链接。
这里,兼容性分析得分即上述实施例中的兼容性分析结果。
步骤S606,确定兼容性分析得分是否为零。
步骤S607,当内核观测程序的兼容性分析得分不为零时,则兼容性验证不通过。
在一些实施例中,开发环境端可以利用SVG图查看编辑距离不为零的目标观测点函数或者数据结构,具体分析该目标观测点函数或者数据结构在初始版本内核和目标版本内核中内核代码上的差异,是否影响到该在初始版本内核和目标版本内核在两个版本内核的兼容性。若开发人员确认该在初始版本内核和目标版本内核在初始版本内核和目标版本内核之间兼容,则请求服务器标记该兼容性分析进入通过状态。否则,开发环境端可以对eBPF程序进行适配性修改,得到修改后的eBPF程序;基于修改后的eBPF程序,重新提交携带有修改后的eBPF程序的程序编译请求。或者,开发环境端选择不做处理,该兼容性分析依然保持待确认状态。
步骤S608,当内核观测程序的兼容性分析得分为零时,则兼容性验证通过。
在一些实施例中,内核观测程序涉及的观测点函数和内核数据结构,在初始版本内核和目标版本内核之间的编辑距离都为零,求和得到内核观测程序的兼容性分析得分为零时,可以确定该内核观测程序在初始版本内核和目标版本内核之间完全兼容。此时,兼容性分析结果为兼容通过状态。
为了便于理解上述实施例中的调用关系树,本申请实施例提供一种调用关系树的SVG图,图7为本申请实施例提供的调用关系树的SVG图的示意图,如图7所示,图中分别示出了内核观测点函数按钮701、图例部分702、插桩函数一703、观测点函数一704、观测点函数二705、观测点函数三706、区别函数示意图707、观测点函数四708、观测点函数五709、观测点函数六710、观测点函数七711、观测点函数八712、折叠和扩展按钮713。这里,观测点函数一704、观测点函数二705和观测点函数三706为插桩函数一701的调用路径,观点测函数四708和观测点函数五709为观测点函数一704的调用路径,观点函数六710、观测点函数七711和观测点函数八712为观测点函数三706的调用路径。
在一些实施例中,调用关系树的SVG图的URL链接可以在任意浏览器等应用程序中打开,以供开发人员查看该SVG图。图7中的SVG图描绘了该eBPF程序中目标观测点函数的调用关系树以及初始版本内核和目标版本内核在这些观测点函数及其相关内核结构上的编辑距离。这里,SVG图支持任意比例的放大缩小,以保证在查看过程中像素不会失真。
SVG图中的内核观测点函数按钮701具有以下作用:可以通过点击内核观测点函数按钮701中的对应函数按钮,切换在SVG图中的中间部分显示的观测点函数的调用关系树的树状图。
SVG图中的图例部分702,分别示出了初始内核版本x.xx.xx,欲兼容的目标内核版本
#.###.#,以及区别两个版本内核中函数定义的表示示例,例如,这里的采用Missing样式框
选的观测点函数表示:目标版本内核中没有该观测点函数(如观测点函数六707);采用Diff5样式框选的观测点函数表示:目标版本内核中该观测点函数的定义与初始版本内核中有区别(如插桩函数一703);采用Added样式框选的观测点函数表示:该观测点函数为目标版本内核中新增的(如观测点函数二705)。其余实线框选的函数,表示初始版本内核与目标版本内核中该观测点函数的定义相同(如观测点函数一704)。这里,定义可以为不同版本内核对应的内核代码。
0SVG图中的区别函数示意图707,分别示出了编译距离以及跳转代码按钮。对于初始版
本内核与目标版本内核中定义有区别的观测点函数(如图中Function3),可以通过将鼠标指针驻留在对应的观测点函数按钮上,SVG图则可以显示该区别函数示意图707函数定义在两个版本内核之间的编辑距离。通过点击对应的函数按钮,可以跳转页面显示两个版本内核对该函数的实现代码细节。
5SVG图中的折叠和扩展按钮713具有以下作用:可以通过点击每个观测点函数按钮下方的折叠和扩展按钮713,可以关闭和显示该观测点函数上下游的函数调用关系,从而充分利用SVG图放大缩小不失真的特性,可以直观地展示内核观测点函数之间具体的调用关系。
由此可见,本申请实施例提供的内核观测程序的构建方法,通过在构建服务端预置了待
观测内核的源代码和eBPF程序的编译工具链,可以直接将构建的内核观测程序下发到待观0测内核的服务器上运行,不需要在待观测内核的服务器上安装其他依赖项。同时,解决了
eBPF内核观测程序在移植到目标版本内核上执行过程中出现的兼容性问题。在本申请实施例中,利用eBPF程序和不同版本内核的兼容性分析结果,能够及时适配得到兼容不同版本内核的eBPF程序,并在虚拟机中验证eBPF程序在该版本内核下观测结果的正确性。如此,
保留了内核观测程序和目标版本内核的强关联性,从而不仅保证了eBPF程序的内核代码的5简明性,便于eBPF程序的维护和更新,而且通过虚拟机对内核观测程序进行验证也能够保
障eBPF程序观测结果的正确性,避免了不同版本内核由于函数调用路径、处理逻辑优化等的改变,而导致在生产环境实际使用eBPF程序时观测到错误数据的情况。另外,本申请实施例提供中,服务器可以基于开发项目的初始化结果得到的模板文件、内核观测点的查询接
口和SVG图,便捷地开发出高可移植性的内核观测程序,极大地降低了内核观测程序的开0发难度,大大提高了使用eBPF程序观测内核行为的易用性。
图8是本申请实施例提供的内核观测程序的构建装置的组成结构示意图,如图8所示,内核观测程序的构建装置800包括:接收模块801,用于接收程序编译请求,所述程序编译请求中携带有eBPF程序和目标编译参数;解析模块802,用于响应于所述程序编译请求,对所述eBPF程序进行解析处理,得到所述eBPF程序的符号引用信息文件;确定模块803,用于从所述eBPF程序的符号引用信息文件中确定出目标内核符号;所述确定模块803,还用于基于所述目标内核符号,确定内核符号头文件;编译模块804,用于基于所述目标编译参数和所述内核符号头文件,对所述eBPF程序进行编译,得到所述eBPF程序的内核观测程序。
在一些实施例中,所述确定模块,还用于获取所述目标内核符号的声明信息;对所述声明信息进行信息组装,得到内核符号头文件。
在一些实施例中,所述装置还包括:分析模块,用于在以下任意一种情况下:对所述eBPF程序进行编译时、完成对所述eBPF程序的编译时,对所述内核观测程序进行兼容性分析;或者,调用定时后台任务,对以下任意一种eBPF程序进行兼容性分析:当前提交的所述eBPF程序、当前导入的未进行兼容性适配的eBPF程序;当所述兼容性分析通过时,对所述内核观测程序进行功能验证;当所述兼容性分析未通过时,对所述eBPF程序进行编译适配性修改,得到修改后的eBPF程序;基于所述修改后的eBPF程序,重新提交携带有所述eBPF程序的程序编译请求。
在一些实施例中,所述装置还包括:验证模块,用于当确定所述功能验证通过时,对所述内核观测程序进行通过标记,得到标记后的内核观测程序;当确定所述功能验证未通过时,对所述eBPF程序进行适配性修改,得到修改后的eBPF程序;基于所述eBPF程序,重新提交携带有所述eBPF程序的程序编译请求。
在一些实施例中,所述分析模块,还用于获取所述内核观测程序中的目标观测点函数;基于所述目标观测点函数的调用关系,确定所述目标观测点函数的调用关系树;遍历所述调用关系树,确定所述目标观测点函数在初始版本内核和目标版本内核之间的编译距离;基于所述编译距离,确定兼容性分析结果。
在一些实施例中,所述验证模块,还用于响应于针对所述内核观测程序的功能验证请求,基于所述目标版本内核对应的内核安装程序,创建虚拟机;通过所述虚拟机,对所述内核观测程序进行功能验证。
在一些实施例中,所述装置还包括:过滤模块,用于接收针对所述内核观测程序的多个观测点函数的查询请求;响应于所述查询请求,确定出每一所述版本内核的内核代码对应的所述多个观测点函数;对所述多个观测点函数进行过滤处理,得到所述目标观测点函数。
在一些实施例中,所述分析模块,还用于获取所述eBPF程序中每一版本内核对应的内核代码,所述内核代码包括内核源码和内核安装程序;对所述内核源码进行解析处理,得到所述内核源码的符号引用信息文件;基于所述内核源码的符号引用信息文件,确定所述内核代码的符号引用关系索引;基于所述符号引用关系索引,确定所述目标观测点函数的调用关系,其中,所述调用关系树包括多个调用关系,所述调用关系即调用关系树上的每一分支,每一分支代表该观测点函数被调用到的路径。
需要说明的是,本申请实施例装置的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果,因此不做赘述。对于本装置实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
需要说明的是,本申请实施例中,如果以软件功能模块的形式实现上述的内核观测程序的构建方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台终端执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read Only Memory)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本申请实施例不限制于任何特定的硬件和软件结合。
对应的,本申请实施例提供一种内核观测程序的构建设备,图9是本申请实施例提供的内核观测程序的构建设备的组成结构示意图,如图9所示,所述内核观测程序的构建设备900至少包括:处理器901和配置为存储可执行指令的计算机可读存储介质902,其中处理器901通常控制所述内核观测程序的构建设备的总体操作。计算机可读存储介质902配置为存储由处理器901可执行的指令和应用,还可以缓存待处理器901和内核观测程序的构建设备900中各模块待处理或已处理的数据,可以通过闪存(FLASH)或随机访问存储器(RAM,Random Access Memory)实现。
本申请实施例提供一种存储有可执行指令的存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本申请实施例提供的方法,例如,如图2示出的方法。
在一些实施例中,存储介质可以是计算机可读存储介质,例如,铁电存储器(FRAM,Ferromagnetic Random Access Memory)、只读存储器(ROM,Read Only Memory)、可编程只读存储器(PROM,Programmable Read Only Memory)、可擦除可编程只读存储器(EPROM,Erasable Programmable Read Only Memory)、带电可擦可编程只读存储器(EEPROM,Electrically Erasable Programmable Read Only Memory)、闪存、磁表面存储器、光盘、或光盘只读存储器(CD-ROM,Compact Disk-Read Only Memory)等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(HTML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。作为示例,可执行指令可被部署为在一个电子设备上执行,或者在位于一个地点的多个电子设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个电子设备上执行。
以上所述,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。
应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本申请的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。
以上所述,仅为本申请的实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
Claims (10)
1.一种内核观测程序的构建方法,其特征在于,所述方法包括:
接收程序编译请求,所述程序编译请求中携带有eBPF程序和目标编译参数;
响应于所述程序编译请求,对所述eBPF程序进行解析处理,得到所述eBPF程序的符号引用信息文件;
从所述eBPF程序的符号引用信息文件中确定出目标内核符号;
基于所述目标内核符号,确定内核符号头文件;
基于所述目标编译参数和所述内核符号头文件,对所述eBPF程序进行编译,得到所述eBPF程序的内核观测程序。
2.根据权利要求1所述的方法,其特征在于,所述基于所述目标内核符号,确定内核符号头文件,包括:
获取所述目标内核符号的声明信息;
对所述声明信息进行信息组装,得到内核符号头文件。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在以下任意一种情况下:对所述eBPF程序进行编译时、完成对所述eBPF程序的编译时,对所述内核观测程序进行兼容性分析;
或者,
调用定时后台任务,对以下任意一种eBPF程序进行兼容性分析:当前提交的所述eBPF程序、当前导入的未进行兼容性适配的eBPF程序;
当所述兼容性分析通过时,对所述内核观测程序进行功能验证;
当所述兼容性分析未通过时,对所述eBPF程序进行适配性修改,得到修改后的eBPF程序;
基于所述修改后的eBPF程序,重新提交携带有所述修改后的eBPF程序的程序编译请求。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
当确定所述功能验证通过时,对所述内核观测程序进行通过标记,得到标记后的内核观测程序;
当确定所述功能验证未通过时,对所述eBPF程序进行适配性修改,得到修改后的eBPF程序;
基于所述修改后的eBPF程序,重新提交携带有所述修改后的eBPF程序的程序编译请求。
5.根据权利要求3所述的方法,其特征在于,所述对所述内核观测程序进行兼容性分析,包括:
获取所述内核观测程序中的目标观测点函数;
基于所述目标观测点函数的调用关系,确定所述目标观测点函数的调用关系树;
遍历所述调用关系树,确定所述目标观测点函数在初始内核版本和目标内核版本之间的编译距离;
基于所述编译距离,确定兼容性分析结果。
6.根据权利要求3所述的方法,其特征在于,所述对所述内核观测程序进行功能验证,包括:
响应于针对所述内核观测程序的功能验证请求,基于所述目标内核版本对应的内核安装程序,创建虚拟机;
通过所述虚拟机,对所述内核观测程序进行功能验证。
7.根据权利要求5所述的方法,其特征在于,在获取所述内核观测程序中的目标观测点函数之前,所述方法还包括:
接收针对所述内核观测程序的多个观测点函数的查询请求;
响应于所述查询请求,确定出每一所述内核版本的内核代码对应的所述多个观测点函数;
对所述多个观测点函数进行过滤处理,得到所述目标观测点函数。
8.根据权利要求5所述的方法,其特征在于,所述确定所述目标观测点函数的调用关系树,包括:
获取所述eBPF程序中每一内核版本对应的内核代码,所述内核代码包括内核源码和内核安装程序;
对所述内核源码进行解析处理,得到所述内核源码的符号引用信息文件;
基于所述内核源码的符号引用信息文件,确定所述内核代码的符号引用关系索引;
基于所述符号引用关系索引,确定所述目标观测点函数的调用关系,其中,所述调用关系树包括多个调用关系,所述调用关系即调用关系树上的每一分支,每一分支代表该观测点函数被调用的路径。
9.一种内核观测程序的构建装置,其特征在于,所述装置包括:
接收模块,用于接收程序编译请求,所述程序编译请求中携带有eBPF程序和目标编译参数;
解析模块,用于响应于所述程序编译请求,对所述eBPF程序进行解析处理,得到所述eBPF程序的符号引用信息文件;
确定模块,用于从所述eBPF程序的符号引用信息文件中确定出目标内核符号;
所述确定模块,还用于基于所述目标内核符号,确定内核符号头文件;
编译模块,用于基于所述目标编译参数和所述内核符号头文件,对所述eBPF程序进行编译,得到所述eBPF程序的内核观测程序。
10.一种内核观测程序的构建设备,其特征在于,包括:
存储器,用于存储可执行指令;处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求1至8任一项所述的内核观测程序的构建方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211600219.6A CN116775034A (zh) | 2022-12-12 | 2022-12-12 | 内核观测程序的构建方法、装置及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211600219.6A CN116775034A (zh) | 2022-12-12 | 2022-12-12 | 内核观测程序的构建方法、装置及设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116775034A true CN116775034A (zh) | 2023-09-19 |
Family
ID=88006937
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211600219.6A Pending CN116775034A (zh) | 2022-12-12 | 2022-12-12 | 内核观测程序的构建方法、装置及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116775034A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117591436A (zh) * | 2024-01-18 | 2024-02-23 | 南京研利科技有限公司 | 一种Go源码的可观测性数据获取方法及装置 |
-
2022
- 2022-12-12 CN CN202211600219.6A patent/CN116775034A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117591436A (zh) * | 2024-01-18 | 2024-02-23 | 南京研利科技有限公司 | 一种Go源码的可观测性数据获取方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10162610B2 (en) | Method and apparatus for migration of application source code | |
Fazzini et al. | Automated cross-platform inconsistency detection for mobile apps | |
AU2012203071B2 (en) | Computer-implemented method, system and computer program product for displaying a user interface component | |
Doyle | Beginning PHP 5.3 | |
EP2368189B1 (en) | Debugging pipeline | |
CN110688307B (zh) | JavaScript代码检测方法、装置、设备和存储介质 | |
US20110239200A1 (en) | Method for compiling a computer program | |
CN110673837B (zh) | 代码修复方法及装置、电子设备、计算机可读存储介质 | |
CN112579476B (zh) | 一种漏洞和软件对齐的方法、装置以及存储介质 | |
Stocco et al. | Clustering-aided page object generation for web testing | |
KR20140050323A (ko) | 라이선스 검증 방법 및 그 장치 | |
CN116775034A (zh) | 内核观测程序的构建方法、装置及设备 | |
Zhang et al. | Blockaid: Data access policy enforcement for web applications | |
US20220206927A1 (en) | Test package analyzer | |
Mesbah | Software analysis for the web: Achievements and prospects | |
Silva et al. | Identifying classes in legacy JavaScript code | |
Johansen | Test-driven JavaScript development | |
CN111831277B (zh) | 虚拟数据生成方法、系统、设备及计算机可读存储介质 | |
CN112464242A (zh) | 一种网页平台漏洞采集方法、系统、终端及存储介质 | |
Buckler | Node. js: Novice to Ninja | |
Xu et al. | COOPER: Testing the Binding Code of Scripting Languages with Cooperative Mutation. | |
CN116028108B (zh) | 一种依赖包安装用时分析方法、装置、设备及存储介质 | |
Kwon et al. | Lightweight migration for web applications with framework separation | |
Asegehegn | Evaluation of Rust and WebAssembly when building a Progressive Web Application: An analysis of performance and memory usage | |
Soto-Sánchez et al. | A dataset of regressions in web applications detected by end-to-end tests |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |