CLion调试Linux Kernel

1. 编译Kernel

先按照https://www.kernel.org/doc/html/latest/dev-tools/gdb-kernel-debugging.html说明的config设定编译内核并且安装到guest上。

menuconfig中按“/”是可以搜索的,例如要找“CONFIG_GDB_SCRIPTS”,按“/”输入“GDB_SCRIPTS”。

qemu启用了virtio的话,记得选上VIRTIO_BLK和VIRTIO_NET。

2. QEMU

2.1 关闭KVM

关闭KVM,关闭KVM,关闭KVM,重要的事情说三次!不然step by step的时候,会无限跳到arch/x86/kernel/apic/apic.c的sysvec_apic_timer_interrupt。要关闭KVM,运行qemu时去掉–enalbe-kvm参数,用libvirt的话,domain的type值置qemu:

2.2 启用gdbserver

运行QEMU时加上参数-s,或者通过“-gdb tcp::端口号”参数手动指定端口,libvirt xml的设定如下:

或者:

3. CLion

点击右上角的“Select Run/Debug Configuration”,添加个GDB Remote Debug:

‘targer remote’ args填入qemu监听的gdbserver IP和端口,Symbol file选编译出的vmlinux(在源码根目录下)。

5. 调试

断点的设定跟平常无异。

启动qemu,按Debug按钮开始调试:

Debug标签页,pause后可以调用gdb console,如果kernel在运行,点左侧的“| |”即可:

栈、变量以及源码通过IDE浏览会直观许多:

6. <optimized out>

提醒下:通过-O0参数是无法成功编译Kernel的。

gdb console通过disassemble可以反汇编当前函数:

优化后的汇编其实不太好跟实际写的C代码联系起来,如果实在不行,就printk吧……

 

双路超线程物理服务器的QEMU CPU affinity调整

首先运行 virsh capabilities 查看物理机物理核心及其线程与逻辑处理器(线程)的关系:

其中的socket_id代表CPU的槽位,core_id代表CPU物理核心,siblings表示哪些逻辑处理器(线程)是属于同一个物理核心的。

例如id为0以及8的逻辑处理器,都属于同一个CPU槽位且属于同一个物理核心。

在这台物理机上建立的虚拟机,想得到最佳的性能,首先不要跨CPU插槽,其次,不要让多个虚拟机CPU共享同一个物理核心。

根据上面的信息,4核心8线程的虚拟机CPU亲和度配置如下:

其中vcpu 0和1在虚拟机中对应一个物理核心的两个线程,将其亲和度设定到逻辑处理器0和8,后面vcpu 2-7,同理。

启动虚拟机,通过 virsh vcpupin 进行验证:

到虚拟机中查看/proc/cpuinfo:

上面输出的信息可以确定设定无误,因为第一、二个逻辑核心对应了第一个物理核心,后面第三到第八个也同理。如果输出的core id与cputune处设定时所期望的顺序不对,调整cputune中的参数即可。

[Updated] libvirt & qemu change VNC password without restart

文章【libvirt & qemu无需重启(在线)更改VNC密码】已于2019-02-17更新。


有两个方法,一个是通过libvirt的virDomainUpdateDeviceFlags接口,另一个是通过qemu-monitor。

以下把“DOMAIN_NAME”替换为虚拟机的名称,“YOU_NEW_VNC_PASSWORD”替换为你的新密码。

通过virDomainUpdateDeviceFlags接口

使用libvirt管理虚拟机的情况下,这个方法是首选,libvirt官方是不推荐使用了libvirt的情况下操纵qemu-monitor的。

首先编写VNC graphic的XML配置:

注意,使用了current及live标记的情况下,是不能更改监听地址与监听端口的,所以需要运行时修改密码请注意port与address与现配置一致。

virDomainUpdateDeviceFlags函数原型见此:https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainUpdateDeviceFlags

这是PHP调用的例子:

 

使用virsh控制台的,可以通过update-device命令,把前面编写的XML内容保存为文件,例如domain-vnc-graphic.xml:

 

通过qemu-monitor

 

qemu with pool/volume storage: Could not open ‘xxxxxxx’: Permission denied

volume信息:

虚拟机disk配置:

启动虚拟机:

查看syslog:

似乎没找比较好的方法解决此问题。

一个选择是弃用type=’volume’,改成type=’file’。

另一种选择是关闭apparmor: