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

7

很抱歉这篇文章比较长。

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

我正在尝试制作一个应用程序,从位于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


使用virtio控制台设备怎么样?virtio比任何全虚拟化设备都要快得多。http://www.ibm.com/developerworks/linux/library/l-virtio/ - kch
2个回答

0

有许多方法可以用来实现你的目标,如果网络已连接,可以采用以下方法:

  1. 使用syslog服务并通过网络将日志传输到您的服务器: syslogd、syslogng似乎支持按一定过滤条件将日志发送到日志服务器。

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

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


0
使用串口真的很次优.. 即使(虚拟)网络也比它更可取,但是回到主机-客户机IPC通道,VMware的VMCI出现在我的脑海中。

我曾考虑使用VMCI套接字,但它似乎不是解决我的客户机-主机通信问题的最佳选择。首先,它是一个用户空间API,而我正在编写一个内核模块,而且已知它速度慢且不可靠,尽管在引入TCP套接字后可能有所改善。(http://communities.vmware.com/thread/160573?tstart=0) - user852689

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接