网站标准宽度,如何做微信小程序开发,公司注册查询核名,有没有专门做建材的网站在虚拟化环境中#xff0c;实时获取虚拟机内核日志对于系统管理员和开发者来说至关重要。传统的 dmesg 工具可以方便地查看本地系统的内核日志#xff0c;但在KVM#xff08;基于内核的虚拟机#xff09;环境下#xff0c;获取虚拟机内部的内核日志则复杂得多。为了简化这…在虚拟化环境中实时获取虚拟机内核日志对于系统管理员和开发者来说至关重要。传统的 dmesg 工具可以方便地查看本地系统的内核日志但在KVM基于内核的虚拟机环境下获取虚拟机内部的内核日志则复杂得多。为了简化这一过程kvm-dmesg 应运而生——这是一款专为KVM虚拟化环境设计的工具它使得我们能够直接从宿主机获取虚拟机Guest VM的内核日志极大地方便了调试和排错工作。
1. 介绍
kvm-dmesg 是一个专门用于从KVM虚拟机中提取内核日志的工具。它提供了与传统的 dmesg 工具类似的功能但其最大的亮点在于可以跨越虚拟化边界直接从宿主机获取虚拟机内核的日志信息。
2. 主要功能
kvm-dmesg 可以从KVM虚拟机中获取内核日志帮助管理员或开发者快速访问虚拟机的内核输出尤其在调试和排查问题时能够直观地获取虚拟机的dmesg日志。
支持两种连接方式 为了适应不同的使用场景kvm-dmesg 提供了两种不同的连接方式
libvirt 接口 如果虚拟机是通过 libvirt 管理的kvm-dmesg 可以通过 libvirt 来与虚拟机进行通信并输出其内核日志。QMP 套接字 如果虚拟机对外暴露有QMP套接字可以通过 QEMU Monitor ProtocolQMP直接与虚拟机进行连接并获取日志。
仅支持 x86_64 Linux 虚拟机 当前版本的 kvm-dmesg 仅支持 x86_64 架构的 Linux 虚拟机对于其他架构的支持可能会在未来版本中考虑。
依赖 System.map 符号表 为了将虚拟机内核日志中的地址信息映射为可读的符号kvm-dmesg 需要访问虚拟机的 System.map 符号表。该符号表包含了内核的符号信息可以将内核日志中的地址转换为具体的符号和函数名称从而更加高效。
3. 实现原理
linux内核中log_buf定义如下
// printk.c
#define __LOG_BUF_LEN (1 CONFIG_LOG_BUF_SHIFT)
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
static char *log_buf __log_buf;
static u32 log_buf_len __LOG_BUF_LEN;实现过程如图所示主要是通过qemu获取guest的CR3寄存器的值然后经过页表转换获取到log_buf指针指向的地址取出内核环形缓冲区中的内存数据并解析成dmesg日志。
4. 使用方法
使用 kvm-dmesg 获取虚拟机内核日志的过程非常简单。以下是两种主要的连接方式
1. 使用 libvirt 接口获取日志
./kvm-dmesg domain_name system.map_path2. 使用 QMP 套接字获取日志
./kvm-dmesg socket_path system.map_path以QMP为例具体使用方法如下
$ ./kvm-dmesg /tmp/qmp.sock System.map-5.15.171[ 0.000000] Linux version 5.15.171 (rayyleeubuntu-dev) (gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #1 SMP Tue Nov 12 14:44:05 UTC 2024
[ 0.000000] Command line: consolettyS0
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000001ffdffff] usable
[ 0.000000] BIOS-e820: [mem 0x000000001ffe0000-0x000000001fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000feffc000-0x00000000feffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000fd00000000-0x000000ffffffffff] reserved
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] SMBIOS 2.8 present.
[ 0.000000] DMI: QEMU Standard PC (i440FX PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
[ 0.000000] tsc: Fast TSC calibration using PIT
[ 0.000000] tsc: Detected 3194.022 MHz processor
[ 0.000569] e820: update [mem 0x00000000-0x00000fff] usable reserved
[ 0.000571] e820: remove [mem 0x000a0000-0x000fffff] usable
...工具地址https://github.com/rayylee/kvm-dmesg