在ubuntu20.04 上配置 qemu/kvm linux kernel调试环境

一:安装qemu/kvm 和 virsh

qemu/kvm 是虚拟机软件,virsh是管理虚拟机的命令行工具,可以使用virsh创建,编辑,启动,停止,删除虚拟机。

(1):安装之前,先确认CPU是否支持虚拟化技术,使用 egrep '(svm|vmx)' /proc/cupinfo 查看,如果有vmx或svm的输出,则说明是支持的。

(2):安装之前,检查BIOS中是否禁用了虚拟化支持,使用下面命令检查:

sudo apt install cpu-checker

kvm-ok

如果输出 INFO: /dev/kvm exists KVM acceleration can be used 则说明BIOS中已启用,否则需要进入BIOS中开启虚拟化支持,具体根据主板型号进入BIOS中设置。

(3):安装

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager

二:创建虚拟机镜像,安装操作系统

(1): 下载ubuntu-20.04.6-desktop-amd64.iso 镜像

(2): qemu-img create -f qcow2 ubuntuvm.img 40G

(3): qemu-system-x86_64 -enable-kvm -name ubuntuvm -m 4G -hda ubuntuvm.img -cdrom ubuntu-20.04.6-desktop-amd64.iso -boot d -vnc :18

(4): 使用VNC客户端链接虚拟机,完成ubunut的安装,vnc监听端口为 5918

(5): 当虚拟机上的ubuntu安装好之后,后续启动虚拟机用以下命令:

qemu-system-x86_64 -name ubuntuvm -m 4G -hda ubuntuvm.img -boot d -enable-kvm -cpu host -virtfs local,path=/your/path/,mount_tag=host0,security_model=passthrough,id=host0 -gdb tcp::1234 -vnc :18

其中-virfs选项是配置与宿主机的共享文件目录,在进入虚拟机的ubuntu系统以后,执行挂载操作,就可以实现宿主机与虚拟机共享文件了,具体挂载命令如下

sudo mount -t 9p -o trans=virtio,version=9p2000.L host0 /your/path

其中-gdb选择是开启gdb监听端口,这个在后面调试内核会用到

三: 在虚拟机上编译linux内核

(1):在虚拟机上下载Linux内核源码, 可以使用uname -srm 查看内核版本

sudo apt install linux-source-5.4.148

(2):源码下载下来,将其解压到/usr/src 目录下

sudo tar vjxkf linux-source-5.4.148.tar.bz2

(3):安装编译内核需要的依赖包

sudo apt install libncurses5-dev libssl-dev bison flex libelf-dev gcc make openssl libc6-dev

sudo apt install dwarves zstd binutils

(4): 编译前,进入/usr/src/linux-source-5.4.148目录,执行下面命令,进行内核参数配置

sudo make menuonfig

(5): 开启下面内核参数配置,可以在.config 文件中编辑

CONFIG_DEBUG_INFO=y

CONFIG_FRAME_POINTER=y

CONFIG_GDB_SCRIPTS=y

CONFIG_DEBUG_INFO_REDUCED=n

CONFIG_KGDB=y

CONFIG_RANDOMIZE_BASE=n

(6):编译安装

sudo make -j8

sudo make INSTALL_MOD_STRIP=1 modules_install

sudo make install

四: 调试内核

(1): 在宿主机上运行gdb需要内核二进制文件,我们可以将虚拟机的/usr/src/linux-source-5.4.148整个目录都拷贝到宿主机上,比如拷贝到/path/to/linux-build目录下。在/usr/src/linux-source-5.4.148下的vmlinux文件就是内核的二进制文件。

(2): 在宿主机上配置gdb环境,为了能够让gdb在启动时能够加载 Linux helper 脚本,需要在~/.gdbinit 文件中添加如下内容: /path/to/linux-build 就是上一步拷贝过来的linux源码目录

set auto-load safe-path /path/to/linux-build

(3): 在宿主机上执行 gdb vmlinux,然后target remote :1234 就可以attach到虚拟机的内核,进行调试了

$ gdb vmlinux

...

Reading symbols from vmlinux...

(gdb) target remote :1234

Remote debugging using :1234

相关推荐
存储服务专家StorageExpert17 小时前
手搓一个 DELL EMC Unity存储系统健康检查清单
linux·运维·服务器·存储维护·emc存储
笑口常开xpr18 小时前
Linux 库开发入门:静态库与动态库的 2 种构建方式 + 5 个编译差异 + 3 个加载技巧,新手速看
linux·c语言·动态库·静态库
SonOfWind031118 小时前
CentOS搭建本地源
linux·运维·centos
IT成长日记18 小时前
【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:
linux·运维·nginx·配置文件
Nimsolax18 小时前
Linux线程控制
linux
Light6018 小时前
领码方案|Linux 下 PLT → PDF 转换服务超级完整版:异步、权限、进度(一气呵成)
linux·spring boot·pdf·gpcl6/ghostpcl·s3/oss·权限与审计·异步与进度
YuTaoShao19 小时前
【LeetCode 每日一题】36. 有效的数独
linux·算法·leetcode
NiKo_W19 小时前
Linux 开发工具(1)
linux·运维·服务器
笑口常开xpr19 小时前
Linux动静态库开发基础:静态库与动态库的编译构建、链接使用及问题排查
linux·c语言·动态库·静态库
艾莉丝努力练剑20 小时前
【C++】类和对象(下):初始化列表、类型转换、Static、友元、内部类、匿名对象/有名对象、优化
linux·运维·c++·经验分享