Xen 故障排除指南
1. DomU 接口编号每次重启都会递增
当 Xen 创建一个域时,它会查看
vif=[]
语句。
[]
内的每个字符串(这是一个 Python 数组)代表一个网络设备。例如,
vif=['','']
会为你创建两个带有随机 MAC 地址的网络设备。在 DomU 中,它们理想情况下会被命名为
eth0
和
eth1
;在 Dom0 中,它们被命名为
vifX.0
和
vifX.1
,其中
X
是域编号。
大多数现代 Linux 发行版默认会在首次启动时将
ethX
锁定到特定的 MAC 地址。在 RHEL/CentOS 中,设置位于
/etc/sysconfig/network-scripts/ifcfg-ethX
文件中的
HWADDR=
字段。大多数其他发行版使用
udev
来处理持久的 MAC 地址。
为了避免这个问题,我们可以在
xm
配置文件的
vif=
行中指定 MAC 地址,示例如下:
vif=['mac=00:16:3E:AA:AA:AB','mac=00:16:3E:AA:AA:AC']
这里使用了 XenSource MAC 前缀
00:16:3E
,以确保不会与任何已分配的硬件 MAC 地址冲突。如果不指定 MAC 地址,每次 DomU 启动时它都会随机生成,这可能会给将
ethX
锁定到特定 MAC 地址的 DomU 操作系统带来不便。
2. iptables 问题
iptables
规则也可能是 Xen 出现问题的根源。就像任何
iptables
设置一样,很容易以微妙的方式出错并导致整个系统故障。
为了确保
iptables
规则正常工作,最佳方法是发送数据包并观察其处理情况。可以运行
iptables -L -v
命令来查看每个规则命中的数据包数量或受链策略影响的计数器。需要注意的是,从 Dom0 端查看的
vif
接口计数器是反向的,即传出流量会报告为传入流量,反之亦然。
如果你启用了反欺骗(antispoof)功能,但发现仍能在 DomU 中伪造任意 IP 地址,可以在网络启动时添加以下命令:
echo 1 >/proc/sys/net/bridge/bridge-nf-call-iptables
此命令会使通过网桥发送的数据包经过转发链,Xen 的反欺骗规则就位于此链中。我们通常将该命令添加到
/etc/xen/scripts/network-bridge
文件的末尾。
如果你使用了
vifnames
,请确保名称简短,最好不超过 8 个字符。较长的名称可能会被截断,并且系统的不同部分截断的长度可能不同(至少在 CentOS 5.0 中是这样)。例如,实际的
vifnames
可能以一种长度截断,而防火墙规则(用于反欺骗)可能以另一种长度截断,这可能会阻止来自相关域的所有数据包。
3. 内存问题
当内存不足时,Xen(确切地说是 Linux 驱动域)的表现可能会很奇怪。由于 Xen 和 Dom0 需要一定数量的连续、不可交换的内存,即使有足够的交换空间,也可能会发现内存不足杀手(oom-killer)频繁终止进程。
目前找到的最佳解决方案是为 Dom0 分配更多内存,并将其内存分配固定为一个合适的值,例如 512MB,以避免 Xen 不断调整其内存大小。
调整 Dom0 内存分配的基本方法是:
1. 编辑
menu.lst
文件,在
kernel
行后面添加
dom0_mem
内核参数来设置上限,示例如下:
kernel /xen.gz dom0_mem=512M noreboot
如果未指定单位,Xen 会默认该值以 KB 为单位。
2. 编辑
/etc/xen/xend-config.sxp
文件,添加
dom0-min-mem
参数来设置下限,示例如下:
(dom0-min-mem 512)
我们通常将这两个参数设置为相同的值,以避免 Dom0 在内存气球调节(ballooning)时出现问题。
4. 其他常见错误信息及解决方法
4.1 xenconsole: Could not read tty from store: No such file or directory
此消息通常在尝试连接到域的虚拟控制台时出现,尤其是当 Xen 的内核与用户空间不匹配时(例如,升级了 Xen 的支持工具但未更改管理程序)。
如果是半虚拟化(paravirtualized)域,可以尝试以下操作:
1. 先终止并重新启动
xenconsoled
进程,确保它完全终止。有时
xenconsoled
会挂起,需要使用
-9
信号强制终止:
pkill xenconsoled && /usr/sbin/xenconsoled
-
然后使用
xm console重新连接。
如果问题仍然存在,很可能是尝试访问的域没有配置必要的 Xen 前端控制台设备。可以检查域内核和
initrd
中是否包含
xvc
驱动。
如果是 HVM 域,运行的是默认(未优化)且不包含控制台驱动的内核,可以尝试使用帧缓冲区或启动不同的内核。也可以在域配置文件中设置
serial=pty
,并将 DomU 操作系统的控制台设置为
com1
。
4.2 VmError: (22, ‘Invalid argument’)
此错误可能有多种原因。常见的问题是工具和运行中的 Xen 管理程序版本不匹配。尽管
/usr/sbin
中安装的二进制文件可能正确,但底层的 Python 模块可能存在问题。可以通过各种可用的证据来检查其正确性,例如文件日期、文件中的注释、
xm info
命令的输出等。
该错误也可能表示 PAE(Physical Address Extension)不匹配。此时,可以查看
/var/log/xen/xend-debug.log
文件以获取问题的简要描述:
tail /var/log/xen/xend-debug.log
如果出现类似
ERROR: Non PAE-kernel on PAE host.
和
ERROR: Error constructing guest OS
的错误信息,则表明存在 PAE 不匹配问题。需要注意的是,Dom0 作为一个特殊的 Xen 客户域,也可能会遇到此问题,管理程序会在启动时以大框错误消息报告 PAE 不匹配并立即重启。
4.3 “no version for struct_module found: kernel tainted”
在 Slackware 机器上尝试安装二进制 Xen 发行版时可能会遇到此错误。二进制发行版附带的内核非常精简,需要一个包含适当模块的
initrd
。由于某些原因,默认脚本加载模块的顺序可能有误,导致部分加载失败并出现上述错误消息。
解决方法是更改
initrd
中的加载顺序,具体步骤取决于你的发行版。
4.4 持续的 4GiB seg fixup 消息
在启动新安装的 i386 域时,可能会看到满屏类似以下的消息:
4gb seg fixup, process init (pid 1), cs:ip 73:b7ec2fc5
这些消息与
/lib/tls
问题有关,Xen 会抱怨需要为使用负偏移量访问堆栈的进程模拟 4GiB 段。启动时可能还会看到一个大消息提醒你解决此问题。
解决此问题的方法有多种:
- 编译
glibc
时使用
-mno-tls-direct-seg-refs
选项。
- 为你的发行版安装适当的
libc6-xen
包(Red Hat 类和 Debian 类发行版都有相应的包)。
- 对于 Red Hat 及其派生发行版,可以运行以下命令:
echo 'hwcap 0 nosegneg' > /etc/ld.so.conf.d/libc6-xen.conf
ldconfig
这些命令会指示动态加载器避免特定的优化。
- 对于基于 Debian 的发行版(使用 2.6.18 内核),可以直接运行:
apt-get install libc6-xen
-
如果上述方法都失败,或者你不想费力寻找支持
no-tls-direct-seg-refs选项的gcc版本,可以按照错误消息的建议将 TLS 库移开:
mv /lib/tls /lib/tls.disabled
根据经验,移动该库通常不会导致问题,系统仍能正常运行。
4.5 磁盘驱动(initrd 问题)
使用发行版内核时,Xen DomU 可能会启动但无法找到其根设备,例如出现以下错误信息:
VFS: Cannot open root device "sda1" or unknown-block(0,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
此问题的根本原因通常是 DomU 内核未包含必要的驱动程序,并且未指定 ramdisk。查看启动输出可以确认这一点,可能会看到类似以下的消息:
XENBUS: Device with no driver: device/vbd/769
XENBUS: Device with no driver: device/vbd/770
XENBUS: Device with no driver: device/vif/0
几乎所有发行版内核都附带一个精简内核,需要一个包含磁盘驱动的
initrd
才能完成启动。这些消息可能是在
initrd
加载之前由内核发出的,也可能表示
initrd
不包含必要的驱动程序,这是一个严重的问题。
如果内核成功加载了
initrd
但未能切换到真正的根文件系统,你可能会被困在
initrd
中,只能访问有限的文件。此时,需要确保设备存在(例如
/dev/sda1
),并且你已经安装了 Xen 磁盘前端内核模块。
在 PyGRUB DomU 中,内核升级(和新的
initrd
)后也可能会出现此问题,尤其是在模块配置文件(Debian 中的
/etc/modules
,Red Hat 中的
/etc/modprobe.conf
)未指定
xenblk
时。对于 RHEL/CentOS DomU,可以通过运行以下命令解决问题:
mkinitrd --preload xenblk
如果你使用外部内核并想使用发行版内核,必须在域配置文件中指定
ramdisk=
行,并指定一个包含
xenblk
(如果希望在启动前使用网络,还需要包含
xennet
)驱动的 ramdisk。
另一种解决方案是从源代码编译 Xen,并构建一个足够通用的 DomU 内核,其中已经包含
xenblk
和
xennet
驱动。即使继续使用发行版内核启动 Dom0,这也可以避免 Red Hat 和 Debian 内核的特定问题。不过,这可能会给一些 DomU 发行版带来问题,因为预期的
initrd
可能不存在,而且有时很难为包含磁盘驱动的内核构建
initrd
。但通用内核通常至少可以启动,我们通常会将这些通用内核作为 DomU PyGRUB 配置中的次要救援启动选项,因为无论
initrd
损坏得多严重,它们都能正常工作。
4.6 XenStore 问题
有时 XenStore 会损坏,
xenstored
进程可能会崩溃,或者由于各种原因,XenStore 无法存储和报告信息。例如,当保存 XenStore 数据库的块设备已满时,就可能出现这种情况。
最明显的症状是
xm list
命令会错误地报告域名,示例如下:
# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 2554 2 r----- 16511.2
Domain-10 10 127 1 -b---- 1671.5
Domain-11 11 255 1 -b---- 442.0
Domain-14 14 63 1 -b---- 1758.2
Domain-15 15 62 1 -b---- 7507.7
Domain-16 16 127 1 -b---- 11194.9
Domain-6 6 94 1 -b---- 5454.2
Domain-7 7 62 1 -b---- 270.8
Domain-9 9 127 1 -b---- 1715.7
这会导致所有可以接受名称或 ID 的命令(如
xm console
)无法识别名称。
由于
xenstored
无法重启,你需要重启系统。如果你运行的是 3.1 之前版本的 Xen(包括 RHEL 5.x 版本),需要先删除
/var/lib/xenstored/tdb
文件,然后再重启:
rm /var/lib/xenstored/tdb
reboot
4.7 Xen 日志
这些错误消息是 Xen 故障排除的良好起点,但有时可能不足以解决问题,此时需要深入挖掘。
4.7.1 dmesg 和 xm dmesg
虽然
xm dmesg
的输出不是传统意义上的日志文件,但它是重要的诊断信息来源。如果问题的根源从错误消息中不明显,可以先查看 Xen 内核消息缓冲区。Linux 的
dmesg
命令用于打印 Linux 内核的消息缓冲区,通常包含自系统上次启动以来的所有内核消息(如果系统运行时间较长,可能会显示一系列无聊的状态消息)。
由于 Xen 本身可以看作一个内核,它提供了类似的工具
xm dmesg
来打印管理程序启动时的消息(启动消息中以
(XEN)
开头的行)。例如:
xm dmesg | tail -3
输出可能如下:
(XEN) (file=platform_hypercall.c, line=129) Domain 0 says that IO-APIC REGSEL is good
(XEN) microcode: error! Bad data in microcode data file
(XEN) microcode: Error in the microcode data
在这种情况下,这些错误通常是无害的,处理器只会使用出厂安装的微代码运行。需要注意的是,和内核一样,Xen 只保留固定大小的消息缓冲区,旧的消息会被丢弃。
4.7.2 Xen 的日志文件
如果
xm dmesg
提供的信息不足,Xen 的详细日志是下一步的排查方向。Xen 使用的主要日志文件及其重要性大致如下:
| 日志文件 | 说明 |
| ---- | ---- |
|
/var/log/xen/xend.log
| 主要的
xend
日志,记录域的启动、关闭、设备创建、调试信息等,有时会包含难以理解的 Python 转储信息,通常是首先要检查的日志文件。 |
|
/var/log/xen/xend-debug.log
| 包含 Xen 更实验性特性的信息,如帧缓冲区。当 Xen 遇到问题时,会提供详细的回溯信息。 |
|
/var/log/xen/xen-hotplug.log
| 与热插拔相关的日志。 |
|
/var/log/syslog
| 系统范围内的日志,由于
xend
使用
syslog
工具,Xen 的消息也会显示在此日志中。 |
|
/var/log/debug
| 调试日志,同样可能包含 Xen 的相关信息。 |
大多数 Xen 故障排除都涉及前两个日志文件。由于
xend
使用
syslog
工具,Xen 的消息也会显示在系统范围的
/var/log/syslog
和
/var/log/debug
中。需要注意的是,
syslog
的配置非常灵活,我们假设你已经根据自己的需求进行了配置。
如果你使用 HVM,
qemu-dm
会生成自己的日志,但通常可以安全地忽略这些日志,因为 HVM 域的问题通常不是由 QEMU 的设备模拟引起的。
4.7.3 调试构建的重要性
为了便于故障排除(实际上,对于日常使用也是如此),建议在构建 Xen 时开启所有调试选项。这样可以使错误消息更详细、更丰富,更容易找出问题的根源并解决它们。
虽然大量的调试输出可能会让人担心性能问题,但根据经验,在正常运行 Xen 时,性能影响可以忽略不计。调试构建允许你在需要时运行带有大量调试输出的 Xen,但在不使用该模式时,其性能与正常构建相当。如果发现错误消息没有帮助,建议确保所有调试选项都已开启。要为管理程序启用完整输出,可以在管理程序命令行(通常在
/boot/grub/menu.lst
中)添加
loglvl=all guest_loglvl=all
选项。
4.7.4 使用调试器
如果最大详细级别的日志仍然不足以解决问题,就需要在 Python 层面使用调试器来解决问题。
一种尝试的方法是在前台运行
xend
服务器并查看其调试输出,这比单纯查看日志能提供更多信息。
对于当前版本的 Xen,调试功能已经包含在发行版中。可以通过以下命令启用调试输出:
export XEND_DEBUG=1
export XEND_DAEMONIZE=0
xend start
这将在前台启动
xend
并使其在运行过程中打印调试消息。
你还可以通过设置
XENSTORED_TRACE=1
来获取 XenStore 的详细调试信息,可以在
xend
环境能够获取该变量的地方设置,例如
/etc/init.d/xend
文件的顶部或根用户的
.bashrc
文件中。
4.7.5 Xen 的后端架构:理解调试信息
要更好地利用这些调试输出,了解 Xen 的架构是很有帮助的。
查看实际的
xend
可执行文件,你会发现它非常简短,大部分工作由外部 Python 库完成,这些库位于 Python 库目录中的
/xen/xend/server
下(例如,在某些系统中是
/usr/lib/python2.4/site-packages/xen/xend/server
)。同样,
xm
也是一个简短的 Python 脚本。
大多数错误消息都来自这个目录树中的某个地方,并且会友好地显示负责的文件和行号,方便你更仔细地检查 Python 脚本。例如,
/var/log/xen/xend.log
中的一行可能如下:
[2007-08-07 20:14:26 6008] WARNING (XendAPI:672) API call: VM.get_auto_power_on not found
开头是日期、时间和
xend
的进程 ID(PID),接着是错误的严重程度(这里是
WARNING
),然后是错误发生的文件和行号,最后是错误消息的内容。
综上所述,Xen 的故障排除需要综合运用多种方法,包括检查接口配置、
iptables
规则、内存使用情况、处理各种错误消息、查看日志文件以及使用调试工具等。通过逐步排查和分析,能够有效地解决大多数常见问题。
5. 故障排除流程总结
为了更清晰地展示 Xen 故障排除的步骤,我们可以用以下 mermaid 流程图来概括:
graph TD;
A[出现问题] --> B{问题是否与网络接口有关};
B -- 是 --> C[检查 vif 配置及 MAC 地址];
C --> D{是否指定 MAC 地址};
D -- 否 --> E[在 xm 配置文件的 vif= 行指定 MAC 地址];
D -- 是 --> F{是否存在 iptables 问题};
F -- 是 --> G[运行 iptables -L -v 查看计数器];
G --> H{是否启用反欺骗但仍可伪造 IP};
H -- 是 --> I[添加 echo 1 >/proc/sys/net/bridge/bridge - nf - call - iptables 到网络启动];
F -- 否 --> J{问题是否与内存有关};
J -- 是 --> K[调整 dom0 内存分配];
K --> L[编辑 menu.lst 设置 dom0_mem 上限];
L --> M[编辑 /etc/xen/xend - config.sxp 设置 dom0 - min - mem 下限];
J -- 否 --> N{是否有特定错误消息};
N -- 是 --> O[根据错误消息类型处理];
O --> P{是否是 xenconsole 错误};
P -- 是 --> Q[重启 xenconsoled 进程并重新连接];
P -- 否 --> R{是否是 VmError 错误};
R -- 是 --> S[检查工具和 Xen 管理程序版本及 PAE 匹配情况];
R -- 否 --> T{是否是 no version for struct_module 错误};
T -- 是 --> U[更改 initrd 中模块加载顺序];
T -- 否 --> V{是否是 4GiB seg fixup 消息};
V -- 是 --> W[按相应方法解决 glibc 或 TLS 库问题];
V -- 否 --> X{是否是磁盘驱动问题};
X -- 是 --> Y[检查 initrd 和内核驱动,按不同发行版解决];
X -- 否 --> Z{是否是 XenStore 问题};
Z -- 是 --> AA[根据 Xen 版本处理,必要时重启];
N -- 否 --> AB[查看 xm dmesg 输出];
AB --> AC{是否能找到问题根源};
AC -- 否 --> AD[查看 Xen 日志文件];
AD --> AE{是否需要调试构建};
AE -- 是 --> AF[构建 Xen 时开启所有调试选项];
AF --> AG[添加 loglvl = all guest_loglvl = all 到管理程序命令行];
AE -- 否 --> AH{是否需要使用调试器};
AH -- 是 --> AI[在前台运行 xend 并启用调试输出];
AI --> AJ[设置 XENSTORED_TRACE = 1 获取 XenStore 调试信息];
6. 常见问题及解决方法汇总表
| 问题类型 | 具体表现 | 解决方法 |
|---|---|---|
| DomU 接口编号递增 | DomU 每次重启接口编号递增,可能导致 ethX 与 MAC 地址绑定问题 | 在 xm 配置文件的 vif= 行指定 MAC 地址,如 vif=[‘mac=00:16:3E:AA:AA:AB’,’mac=00:16:3E:AA:AA:AC’] |
| iptables 问题 | 网络连接异常,反欺骗功能失效 | 运行 iptables -L -v 查看计数器;若反欺骗失效,添加 echo 1 >/proc/sys/net/bridge/bridge - nf - call - iptables 到网络启动;使用 vifnames 时确保名称不超过 8 个字符 |
| 内存问题 | 系统运行缓慢,oom - killer 频繁终止进程 | 为 Dom0 分配更多内存,编辑 menu.lst 设置 dom0_mem 上限,编辑 /etc/xen/xend - config.sxp 设置 dom0 - min - mem 下限 |
| xenconsole 错误 | xenconsole: Could not read tty from store: No such file or directory | 重启 xenconsoled 进程(必要时用 - 9 信号强制终止),然后用 xm console 重新连接;检查域内核和 initrd 中是否包含 xvc 驱动 |
| VmError | VmError: (22, ‘Invalid argument’) | 检查工具和 Xen 管理程序版本是否匹配,查看底层 Python 模块;查看 /var/log/xen/xend - debug.log 检查 PAE 匹配情况 |
| no version for struct_module | “no version for struct_module found: kernel tainted” | 更改 initrd 中模块加载顺序 |
| 4GiB seg fixup 消息 | 启动新安装的 i386 域时满屏 4gb seg fixup 消息 | 编译 glibc 时使用 - mno - tls - direct - seg - refs 选项;安装 libc6 - xen 包;移动 /lib/tls 目录 |
| 磁盘驱动问题 | VFS: Cannot open root device 等错误 | 检查 initrd 是否包含必要驱动;对于 RHEL/CentOS DomU 运行 mkinitrd –preload xenblk;从源代码编译 Xen 构建通用内核 |
| XenStore 问题 | xm list 错误报告域名 | 若 Xen 版本在 3.1 之前,删除 /var/lib/xenstored/tdb 文件后重启系统 |
7. 注意事项
- 在进行任何配置更改之前,建议备份相关的配置文件,以免出现不可恢复的错误。
- 对于调试构建和调试工具的使用,虽然能提供更多信息,但可能会对系统性能产生一定影响,使用后可根据情况关闭相关调试选项。
- 在处理磁盘驱动问题时,不同发行版的操作步骤可能有所不同,需要仔细参考相应发行版的文档。
8. 总结
Xen 作为一个强大的虚拟化管理程序,在使用过程中难免会遇到各种问题。通过对网络接口、
iptables
、内存、错误消息、日志文件等多个方面的检查和处理,结合调试工具和对 Xen 架构的理解,我们可以有效地进行故障排除。遵循上述的故障排除流程和方法,能够帮助我们快速定位并解决大多数常见问题,确保 Xen 环境的稳定运行。同时,不断积累故障排除的经验,也有助于我们更好地应对未来可能出现的复杂问题。
超级会员免费看
52

被折叠的 条评论
为什么被折叠?



