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

Posted

技术标签:

【中文标题】在 VmWare 虚拟机中为 Linux 客户操作系统实现内核调试模块【英文标题】:Implementing a kernel debugging module for a Linux guest OS inside a VmWare VM 【发布时间】:2012-03-21 22:01:16 【问题描述】:

抱歉,这篇文章太长了。

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

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

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

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

我正在尝试实现类似的东西,但对于 Linux,并尝试使调试过程比使用串行端口快一点。

我的具体问题是:

    是否存在类似的应用程序? 我没找到。 例如,将其功能与 netconsole[3] 进行比较,这样的应用程序是否值得? 您建议使用哪种截取 printk 消息的方法? 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 比任何完全虚拟化的设备都要快得多。 ibm.com/developerworks/linux/library/l-virtio 【参考方案1】:

使用串行端口确实不是最理想的。即使是(虚拟)网络也比那更好,但回到主机-访客 IPC 通道,我想到了 VMware 的 VMCI。

【讨论】:

我考虑过使用 VMCI 套接字,但它似乎不是解决我的来宾主机通信问题的最佳选择。首先,它是一个用户空间 API,而我正在编写一个内核模块,并且它被认为是缓慢且不可靠的,尽管在他们引入 TCP 套接字之后这可能会有所改变。(communities.vmware.com/thread/160573?tstart=0)【参考方案2】:

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

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

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

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

【讨论】:

以上是关于在 VmWare 虚拟机中为 Linux 客户操作系统实现内核调试模块的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习_011_在 Linux 虚拟机中手动安装或升级 VMware Tools

在 Linux 虚拟机中手动安装或升级 VMware Tools

怎样将vmware虚拟机中的系统转移到物理机硬盘?虚拟机中为mac os

Linux:VMware虚拟机中Ubuntu安装详细过程

Linux:VMware虚拟机中Ubuntu安装详细过程

在 Linux 虚拟机中手动安装 VMware Tools VMware Workstation Pro 14.0 共享文件夹