IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

我的内核配置文件

A Geek's Page 2012-09-18 23:19:21 累计浏览 4,809 次
本机暂存

    我们知道,在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

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Win7 + VirtualBox安装Mac OS X雪豹操作系统图文详解 (累计阅读 6,103)
  2. 深入理解 VXLAN (累计阅读 4,579)
  3. 一个 VLA (可变长度数组)的实现 (累计阅读 4,406)
  4. 一个绝妙的 exploit (累计阅读 4,355)
  5. 开源世界中的算法与数据结构 3 -- Linux Kernel List 和GList (累计阅读 4,040)
  6. 页缓存概述 (累计阅读 3,967)
  7. 从磁盘映像中挂载或提取指定分区 (累计阅读 3,788)
  8. t3sas raid卡驱动安装 (累计阅读 3,553)
  9. free命令中的buffers和cached (累计阅读 3,285)
  10. xen虚拟化之hvm类型虚拟机安装使用 (累计阅读 3,136)