Xen技术使用与故障排除指南
1. XenStore可写键与VNC自动连接
1.1 XenStore可写键
XenStore中的许多键是可写的。不过,不建议通过向XenStore写入来调整内存使用。可通过可写的XenStore键进行域间通信,下面有相关示例。
1.2 VNC自动连接
Xen LiveCD有个很棒的特性:Xen域启动并完成引导后,会自动弹出VNC窗口。实现这一功能的基础架构包括domU中的脚本、dom0中的监听器以及它们之间的XenBus。
1.2.1 domU中的脚本
domU中的
vnc - advertiser
脚本从domU启动脚本中触发,等待Xvnc会话启动。找到会话后,它会向XenStore写入信息:
xenstore - write /tool/vncwatch/${domid} ${local_addr}${screen}
1.2.2 dom0中的脚本
dom0中对应的脚本
vnc - watcher.py
会监视XenStore的写入操作。以下是该脚本的完整代码及详细注释:
#!/usr/bin/env python
###
# VNC watch utility
# Copyright (C) 2005 XenSource Ltd
#
# This file is subject to the terms and conditions of the GNU General
# Public License. See the file "COPYING" in the main directory of
# this archive for more details.
###
# Watches for VNC appearing in guests and fires up a local VNC
# viewer to that guest.
###
# Import libraries necessary to interact with the xenstore. Xswatch
# watches a xenstore node and activates a script-defined function
# when the node changes, while xstransact supports standard read and
# write operations.
from xen.xend.xenstore import xswatch
from xen.xend.xenstore.xstransact import xstransact
from os import system
def main():
# first make the node:
xstransact.Mkdir("/tool/vncwatch")
xstransact.SetPermissions("/tool/vncwatch",
{ "dom" : 0,
"read" : True,
"write" : True })
active_connections = {}
# The watchFired method does the actual work of the script. When the
# watcher notes changes to the path "/tool/vncwatch/", it calls
# watchFired with the path (and arguments, which are unused in this
# script).
def watchFired(path, *args, **nargs):
if path == "/tool/vncwatch":
# not interested:
return 1
# If we reach this point, something's changed under our path of
# interest. Let's read the value at the path.
vncaddr = xstransact.Read(path)
print vncaddr
# When the vnc-advertiser notices that Xvnc's shut down in the domU,
# it removes the value from the xenstore. If that happens, the
# watcher than removes the connection from its internal list (because
# presumably the VNC session no longer exists).
if vncaddr == None:
# server terminated, remove from connection list:
if path in active_connections:
active_connections.remove(path)
else:
# server started or changed, find out what happened:
if (not active_connections.has_key(path)) or active_connections[path] != vncaddr:
# Recall that the vnc-advertiser script writes ${domid}
# ${local_addr}${screen} to the patch /tool/vncwatch/. The watcher
# takes that information and uses it to execute the vncviewer command
# with appropriate arguments.
active_connections[path] = vncaddr
system("vncviewer -truecolour " + vncaddr + " &")
return 1
# Associate the watchFired event with a watcher on the path
# "tool/vncwatch"
mywatch = xswatch.xswatch("/tool/vncwatch", watchFired)
xswatch.watchThread.join()
if __name__ == "__main__":
main()
该脚本的执行流程如下:
graph LR
A[开始] --> B[创建节点/tool/vncwatch并设置权限]
B --> C[初始化活动连接列表]
C --> D[设置路径/tool/vncwatch的监听器]
D --> E{路径有变化?}
E -- 是 --> F[读取路径值]
F --> G{值为空?}
G -- 是 --> H[从活动连接列表中移除路径]
G -- 否 --> I{连接信息有变化?}
I -- 是 --> J[更新活动连接列表并启动VNC查看器]
E -- 否 --> K[继续监听]
H --> K
J --> K
2. Xen故障排除概述
2.1 故障排除的重要性与方法
遇到Xen相关问题时不要惊慌,虽然Xen复杂,但很多问题都有已知的解决办法。故障排除时,关键是要清楚机器的状态,包括其正在执行的操作、出现的问题、错误信息以及错误来源。
2.2 故障排除的一般步骤
通常采用以下步骤进行故障排除:
1. 重现问题。
2. 若问题产生错误信息,以此为起点展开排查。
3. 若错误信息不足以解决问题,查看日志。
4. 若日志无帮助,使用
set -x
确保脚本正确执行,并仔细检查非Xen特定部分的系统控制流程。
5. 使用
strace
或
pdb
跟踪Xen特定部分的执行流程,找出故障点。
如果实在无法解决问题,可以向Xen的邮件列表(xen - devel和xen - users)或IRC频道(#xen on irc.oftc.net)寻求帮助。
2.3 故障排除各阶段常见问题及解决方法
2.3.1 错误信息阶段
错误信息是故障的首要迹象,Xen的错误信息有时比较模糊,以开发者为导向,很难确定是哪种用户错误导致的,甚至不确定是否是用户错误。但这些信息仍有助于诊断问题。
2.3.2 Dom0启动错误
- 内核/管理程序不匹配 :Xen内核和dom0内核在PAE支持方面必须匹配。64位管理程序要求dom0为64位或i386 - PAE;32位管理程序则要求dom0为32位。现代Xen版本甚至没有i386非PAE模式的编译选项,运行旧操作系统(如NetBSD 4)时会有问题。
-
initrd不匹配
:如果initrd与内核不匹配,机器可能无法正常启动。安装Xen.org内核后,若发行版需要initrd,建议使用发行版的initrd创建脚本。以CentOS为例,安装Xen.org内核后,确保
/etc/modprobe.conf正确描述根设备,然后运行:
# mkinitrd /boot/initrd - 2.6.18.8 - xen.img 2.6.18.8 - xen
将
/boot/initrd - 2.6.18.8 - xen.img
替换为新initrd的期望文件名,将
2.6.18.8 - xen
替换为要构建initrd的内核的
uname - r
输出。
2.3.3 DomU预启动错误
-
PyGRUB无法找到内核
:使用PyGRUB时,若出现
VmError: Boot loader didn't return any data!信息,通常是因为磁盘配置不正确或domU中没有有效的GRUB配置。需检查磁盘配置,确保/boot/grub/menu.lst存在于第一个domU VBD的文件系统中。- 可手动运行PyGRUB进行故障排除:
# /usr/bin/pygrub type:/path/to/disk/image
- 选择内核后,PyGRUB会输出类似信息,表明成功加载内核并放置在dom0文件系统中,需检查该位置是否存在内核文件。
-
终端问题
:PyGRUB对连接的终端很挑剔。若PyGRUB退出并抱怨
libncurses,或者同一域上的PyGRUB对部分人有效而对其他人无效,可能是终端问题。可尝试将控制台大小调整为80 × 24,手动设置TERM = vt100后再创建域。
2.3.4 低内存条件下创建域
错误信息
XendError: Error creating domain: I need 131072 KiB, but dom0_min_mem is 262144 and shrinking to 262144 KiB would leave only - 16932 KiB free.
表示系统内存不足,无法按要求创建domU。解决办法是调整
dom0_min_mem
,或调整domU以减少内存需求,也可两者同时进行,甚至添加更多内存。
2.3.5 domU设备配置问题
-
存储问题
:domU因缺少设备而无法启动,问题大多与存储有关。有时domU加载内核并完成部分启动序列后,会抱怨无法访问根设备,可能是initrd的
/dev目录中没有根设备节点。解决方法是在disk =行中使用hd*或sd*设备,例如:
disk = ['phy:/dev/tempest/sebastian,sda1,r']
root = "/dev/sda1"
成功启动域后,可正确创建xvd设备或编辑udev配置。
-
Xen块驱动问题
:若domU内核包含SCSI驱动,Xen块驱动在连接使用
sdX
命名约定的虚拟驱动器时可能会有问题,此时应使用
xvdX
约定。
2.3.6 磁盘故障排除
-
设备规格错误
:如
Error: DestroyDevice() takes exactly 3 arguments (2 given)这类错误频繁出现,通常意味着设备规格存在问题。需检查配置文件中vif =和disk =行是否有拼写错误;若错误信息涉及块设备,可能是引用了不存在的设备或文件。 -
块循环不足
:使用文件支持的块设备而非LVM卷时,内核可能会耗尽块循环。可通过查看日志中的错误信息
Error: Device 769 (vbd) could not be connected. Backend device not found.来确认。解决方法是增加块循环:-
若循环驱动是模块,编辑
/etc/modules.conf,添加options loop max_loop = 64(或其他合适的数字),然后重新加载模块:
-
若循环驱动是模块,编辑
# rmmod loop
# insmod loop
- 若循环驱动内置于内核,可在dom0内核命令行添加`max_loop`选项,如在`/boot/grub/menu.lst`中:
module linux - 2.6 - xen0 max_loop = 64
重启后问题应可解决。
2.3.7 VM重启过快
磁盘问题若未通过特定错误信息显示,可能会在日志中表现为VM重启过快。如
[2007 - 08 - 23 16:06:51 xend.XendDomainInfo 2889] ERROR (XendDomainInfo:1675) VM sebastian restarting too fast (4.260192 seconds since the last restart). Refusing to restart to avoid loops.
表示域陷入重启循环。可使用
- c
选项启动域,查看启动时导致其死亡的原因。
2.3.8 Xen网络故障排除
排除Xen网络故障时,需了解Xen的网络工作原理,将问题分解并隔离到相应组件。以
network - bridge
为例,故障排除步骤如下:
1. 运行网络脚本的
status
参数,如
/etc/xen/scripts/network - bridge status
,查看dom0中的网络状态。
2. 使用
brctl show
详细检查网络,结合
xm vnet - create
和
vnet - delete
命令及其他用户空间工具,设置好桥接和Xen虚拟网络设备。
3. 后端设置好后,检查前端。查看domU的日志和
dmesg
,确保domU正在初始化其网络设备。
4. 若一切正常,从底层到高层系统地解决问题。首先确保domU中出现相关设备;然后使用
arping
和
tcpdump
检查链路是否正常。例如,检查域
caliban
(IP地址192.0.2.86)与dom0(IP地址192.0.2.67)的连通性:
# arping 192.0.2.67
# tcpdump -i vif72.0
若
arping
无响应,可能是dom0的桥接设置不正确,可使用
brctl show
检查桥接。同时,要确保桥接连接到能让domU访问目标网络的接口,检查路由和DNS服务器等高层设置。
不同版本的Xen在桥接命名上有所不同,Xen 3.2之前默认桥接名为
xenbr0
,Xen 3.2及以后为
eth0
;RHEL/CentOS默认创建
virbr0
桥接,类似于
network - nat
,通过DHCP服务器在dom0上分配私有地址。
3. 常见问题总结与对比
3.1 不同阶段错误信息对比
| 错误阶段 | 错误信息 | 可能原因 | 解决方法 |
|---|---|---|---|
| Dom0启动 | 内核/管理程序不匹配 | Xen内核和dom0内核在PAE支持方面不一致 | 确保内核和管理程序的PAE支持匹配,如64位管理程序对应64位或i386 - PAE的dom0 |
| initrd不匹配 | initrd与内核不匹配 | 使用发行版的initrd创建脚本,安装Xen.org内核后正确配置根设备并重新生成initrd | |
| DomU预启动 | PyGRUB无法找到内核 | 磁盘配置不正确或domU中没有有效的GRUB配置 |
检查磁盘配置,确保
/boot/grub/menu.lst
存在于第一个domU VBD的文件系统中,手动运行PyGRUB进行排查
|
| 终端问题 | PyGRUB对连接的终端要求高 |
调整控制台大小为80 × 24,手动设置
TERM = vt100
后再创建域
| |
| 创建域 | 低内存条件下创建域 | 系统内存不足 |
调整
dom0_min_mem
,或调整domU以减少内存需求,也可两者同时进行,甚至添加更多内存
|
| domU设备配置 | 存储问题 |
initrd的
/dev
目录中没有根设备节点
|
在
disk =
行中使用
hd*
或
sd*
设备,成功启动域后创建xvd设备或编辑udev配置
|
| Xen块驱动问题 |
domU内核包含SCSI驱动,与
sdX
命名约定的虚拟驱动器冲突
|
使用
xvdX
约定
| |
| 磁盘 | 设备规格错误 | 设备规格存在问题 |
检查配置文件中
vif =
和
disk =
行是否有拼写错误,确认引用的设备或文件存在
|
| 块循环不足 | 使用文件支持的块设备时内核耗尽块循环 | 增加块循环,根据循环驱动情况编辑配置文件或在内核命令行添加选项并重新加载或重启 | |
| VM | VM重启过快 | 磁盘问题导致域陷入重启循环 |
使用
- c
选项启动域,查看启动时导致其死亡的原因
|
| 网络 | ARP无响应 | dom0的桥接设置不正确 |
使用
brctl show
检查桥接,确保桥接连接到能让domU访问目标网络的接口,检查路由和DNS服务器等高层设置
|
3.2 网络故障排除流程
graph LR
A[开始] --> B[运行网络脚本status参数]
B --> C[使用brctl show检查网络]
C --> D[设置桥接和虚拟网络设备]
D --> E[检查domU日志和dmesg]
E --> F{设备正常?}
F -- 是 --> G[使用arping和tcpdump检查链路]
F -- 否 --> H[检查domU配置和日志]
G --> I{ARP有响应?}
I -- 是 --> J[网络正常]
I -- 否 --> K[使用brctl show检查桥接]
K --> L[检查桥接连接和高层设置]
H --> D
L --> G
4. 总结与注意事项
4.1 总结
Xen在使用过程中可能会遇到多种问题,但通过系统的故障排除方法,大多数问题都可以得到解决。在使用Xen时,要注意内核与管理程序的匹配、磁盘和设备的配置、内存的使用以及网络的设置等方面。同时,要善于利用错误信息和日志来定位问题,按照正确的步骤进行排查和修复。
4.2 注意事项
- 内核与管理程序匹配 :务必确保Xen内核和dom0内核在PAE支持等方面一致,避免因不匹配导致启动问题。
-
磁盘和设备配置
:在配置domU的磁盘和设备时,要考虑到不同设备命名约定和内核驱动的兼容性,如使用
hd*、sd*或xvd*设备时要根据实际情况选择。 - 内存管理 :在创建domU时,要合理分配内存,避免因内存不足导致创建失败。
- 网络设置 :网络故障排除时,要从底层到高层全面检查,包括桥接设置、链路状态、路由和DNS服务器等。同时,要注意不同版本Xen的桥接命名差异。
- 日志和错误信息 :错误信息和日志是故障排查的重要依据,要仔细分析其中的内容,从中找出问题的线索。
总之,掌握Xen的故障排除方法和注意事项,能够帮助我们更高效地使用Xen,减少因故障带来的损失。在遇到问题时,要保持冷静,按照正确的步骤进行排查和解决。
Xen技术使用与故障排除指南
超级会员免费看
24

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



