FreeBSD的textdump
最近遇到一些奇怪的bug,因为是对恢复时间有比较高要求的系统,所以顺便研究了一下用FreeBSD的textdump来代替更早前出现的minidump的方法。
minidump是2004年初提出的,FreeBSD 6.2-RELEASE开始加入了这个功能,并且在7.x开始默认启用。具体原理是在panic时做dump的时候只存储那些映射为内核内存的物理内存页。这种做法实际上是赌VM的页表在崩溃的时候没有被写坏(绝大多数情况下这是成立的,除非在调试VM本身)。
UPDATE: 杨总 说,Solaris上有一个叫 Fast Crash Dump 的功能。看了一下介绍,是在dump的时候用指定的压缩算法去压缩再转存。先记一笔。
textdump是Robert N. M. Watson在2008年提出的一个新概念,从7.0-RELEASE开始引入:
在编译内核时,需要加入内核调试器。
指定的 ddb 脚本可以挂在某个特定的事件上,比如 panic 进入 kdb 时自动执行
系统提供一个默认的ddb脚本,保存下面这些信息:
- 内核编译时的配置
- ddb的输出(具体是:show locks; show alllocks; show lockedvnods; show pcpu; bt; ps; alltrace;),基本上足够cover分析常见问题所需的信息
- 内核msgbuf的内容(类似dmesg)
- panic信息(如果是panic的话)
- 内核版本。
启用textdump是需要内核调试器的,因此有一定的安全风险,例如可以从控制台进入ddb。使用时的内核编译配置是options KDB、 DDB和SC_DISABLE_KDBKEY(禁止在控制台热键呼出调试器),然后在 /etc/rc.conf 中加入 ddb_enable=“YES” 令系统在引导过程中将ddb脚本汇入内核,并指定dumpdev。
需要注意的是目前textdump与KDB_UNATTENDED不兼容,因为后者会令内核不调用调试器而直接重启。
textdump保存的内容非常少,因此可以大大减少dump所需的时间。