最新消息:

解决KVM虚拟化,宿主机kernel无法再虚拟机下使用

未分类 admin 3471浏览 0评论

我们知道,在KVM里测试内核会碰到一个很严重的问题:那就是在 host 编译的内核不能直接在 guest 里使用。有两个原因:一是 host 和 guest 的硬件可能不一样,所以需要的 config 不一样;二是内核模块即便是安装进了 initramfs 也仍有很多需要安装到 /lib/modules/`uname -r`。

有三种解决办法:

1. host 和 guest 都使用发行版自带的 config,这个 config 是可以在很多机器上运行,所以基本上一定可以在你的guest 里使用,然后用 guestfish 把编译的内核模块拷贝进 guest;这么做的好处是 host 和 guest 都使用同一个 config;坏处也显然,需要进行太多host => guest 拷贝操作。

2. 在 1) 的基础上进行改进,把 host 作为 build server,为 guest 提供 PXE,NFS 服务,这样 guest 里就可以直接使用编译好的内核以及内核模块。这个方法的缺点是,需要一些系统管理技巧,我暂时还没有时间折腾;优点是,如果你的 build server 搭建得比较好,你甚至可以给其它机器(非虚拟)提供服务。

3. guest 使用和 host 不同的 config,guest 的 config 是经过专门定制的,只编译本机器所需要的内核特性和模块,并且把所有的模块都编译进内核(builtin),这样我们甚至不需要 initramfs!优点是,config 很少,即使重新编译花费时间也很少;缺点也很显然,config 很难用于别的机器,尤其是非虚拟化的机器。需要特别注意:如果你的系统用了 LVM 那么它将无法使用!因为内核无法自己检测 LVM!另外,编译进内核的模块和不像单独加载的模块那样灵活,比如 netconsole 模块,我们通常是通过模块参数来指定其功能,而一旦变成 builtin 我们就不得不通过 configfs 来进行操作了,也就是说测试脚本就得重写了。

为了定制上述 3) 中专门的 config,我花了不少时间把我的 config 精简到最少,但同时又包含了 KVM 里需要功能以及我调试用到的选项,我把最终的 config 放到了 github 上进行管理:

https://github.com/congwang/kernelconfig/blob/master/kvm-mini-config

我的目标是让它可以在尽可能多的 KVM guest 上可以运行(显然不可能保证所有),同时尽量不破坏用户空间的程序比如 systemd(取决于发行版),当然还要保持编译出的内核可能的小。欢迎帮忙测试。:-)

下一步是尝试实现第2种方法,我们需要搭建一个集编译内核、PXE服务器、NFS服务器于一身的服务器,准备弄一个新的 github 项目去搞一下。

当然,如果你有其它更好的主意,希望不吝赐教!

附我常用的一些内核调试选项:

一定要有的:

CONFIG_DEBUG_KERNEL=y

内存相关:

CONFIG_SLUB_DEBUG=y

CONFIG_DEBUG_VM=y

CONFIG_DEBUG_LIST=y

内核加锁相关:

CONFIG_DEBUG_ATOMIC_SLEEP=y

CONFIG_LOCKDEP=y

CONFIG_DEBUG_SPINLOCK=y

CONFIG_DEBUG_MUTEXES=y

CONFIG_DEBUG_LOCK_ALLOC=y

CONFIG_PROVE_LOCKING=y

CONFIG_PROVE_RCU=y

ftrace 相关:

CONFIG_FTRACE=y

CONFIG_FUNCTION_TRACER=y

锁死检测:

CONFIG_LOCKUP_DETECTOR=y

CONFIG_HARDLOCKUP_DETECTOR=y

CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y

CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=1

CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y

CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1

CONFIG_DETECT_HUNG_TASK=y

CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=300

kdump 相关:

CONFIG_KEXEC=y

CONFIG_CRASH_DUMP=y

CONFIG_PHYSICAL_START=0x1000000

CONFIG_RELOCATABLE=y

netconsole 相关:

CONFIG_NETCONSOLE=y

CONFIG_NETCONSOLE_DYNAMIC=y

CONFIG_NETPOLL=y

kprobe,jump label 相关:

CONFIG_KPROBES=y

CONFIG_JUMP_LABEL=y

转载请注明:爱开源 » 解决KVM虚拟化,宿主机kernel无法再虚拟机下使用

您必须 登录 才能发表评论!