在VmWare虚拟机内实现Linux客户操作系统的内核调试模块



很抱歉发了这么长的帖子。

我需要一些关于我将要承担的项目的意见。

我正在尝试制作一个应用程序,从位于VmWare虚拟机内的来宾Linux操作系统收集内核调试信息,并将它们高效地发送到主机操作系统。

到目前为止,我已经找到了一个类似的项目,但是为Windows[1]编写的。该项目的作者编写了一个加载到内存中的DLL,并替换了KdSendPacket和KdReceivePacket函数的实现,以使用VmWare GuestRpc[2]机制,而不是慢速串行端口。然后通过命名管道将数据发送到主机(Kd或WinDbg)上的调试应用程序。

作者声称,通过避免串行端口传输,速度提高了45%。

我正在尝试实现类似的功能,但对于Linux,并尝试使调试过程比使用串行端口更快

我的具体问题是:

  1. 是否存在类似的应用程序?我没能找到
  2. 例如,将其功能与netconsole[3]进行比较,这样的应用程序值得吗
  3. 你建议用什么方法拦截printk消息
  4. 在Linux上有相当于KdSendPacket/KdReceivePacket的软件吗

[1] 。http://virtualkd.sysprogs.org/dox/operation.html

[2] 。http://articles.sysprogs.org/kdvmware/guestrpc.shtml

[3] 。http://www.kernel.org/doc/Documentation/networking/netconsole.txt

使用串行端口确实不太理想。。即使是(虚拟)网络也比这更好,但回到主机-客户IPC通道,VMware的VMCI会浮现在脑海中。

许多方法可以用来实现您的目标,如果网络连接,可以应用以下方法:

  1. 使用syslog服务并通过网络将日志传输到服务器:syslogd,syslogng似乎支持将日志发送到具有一些过滤器临界条件的日志服务器。

  2. 直接调用内核模块中的tcp/udp套接字函数,将收集到的数据发送回服务器。

其他方法,您可以在主机上编写应用程序,调用hypervisor的共享内存访问函数来读取内核模块的内存缓冲区。然而,xen/kvm管理程序都支持这些api,我不确定vmware是否有这种库。

最新更新