Xen 故障排除与 xm 命令参考指南
1. 调试技巧
1.1 使用 pdb 调试
当你需要调试时,可以在代码中添加调试模块
pdb
。例如,打开
/usr/lib/python2.5/site-packages/xen/xend/XendAPI.py
文件,在文件顶部添加如下代码:
import pdb
然后在第 672 行附近添加断点:
pdb.set_trace()
重新运行服务器,当
xend
遇到新的断点时,就会启动调试器。此时,你可以进行常见的调试操作,如修改变量值、单步执行函数、进入子程序等。
1.2 处理域处于阻塞状态的问题
xm list
工具报告的“阻塞”状态通常意味着域处于空闲状态,但真正的问题可能是域无响应。例如,启动域时出现如下问题:
[root@localhost ~]# xm create -c sebastian.cfg
Using config file "/etc/xen/sebastian.cfg".
Going to boot Fedora Core (2.6.18-1.2798.fc6xen)
kernel: /vmlinuz-2.6.18-1.2798.fc6xen
initrd: /initrd-2.6.18-1.2798.fc6xen.img
Started domain sebastian
rtc: IRQ 8 is not free.
i8042.c: No controller found.
查看
/var/log/xen/xend-debug.log
文件,发现如下信息:
10/09/2007 20:11:48 Autoprobing TCP port
10/09/2007 20:11:48 Autoprobing selected port 5900
端口 5900 是 VNC 端口,问题是 Xen 没有使用
xm console
连接的虚拟控制台设备,而是使用了帧缓冲作为控制台。启动 VNC 客户端并连接到 5900 端口,即可获得预期的图形控制台。
1.3 Xen 信息消息的层次结构
Xen 的信息消息分为以下几个层次:
-
DEBUG
:开发者用于输出他们感兴趣的信息,通常很有用,但会产生大量数据。
-
INFO
:对管理员来说有趣或有用的信息,但不表示存在问题。
-
WARNING
:表示存在问题,但不是关键问题。例如,依赖
VM.get_auto_power_on
函数可能会有问题,但不使用该函数不会有不良影响。
-
ERROR
:表示真正的、无法否认的错误,通常意味着域异常退出。
1.4 调试热插拔
Xen 广泛使用
udev
来创建和销毁虚拟设备,其与 Linux 热插拔子系统的交互信息通常记录在
/var/log/xen/xen-hotplug.log
文件中。
首先,使用
udevmonitor
查看
udev
事件,它应该显示每个
vif
和
vbd
的添加事件以及
vif
的在线事件。这些事件会通过
/etc/udev/rules.d/xen-backend.rules
规则,执行
/etc/xen/scripts
中的相应脚本。
在感兴趣的设备脚本(如
blktap
)顶部添加如下代码,以增加额外的日志记录:
set -x
exec 2>>/var/log/xen-hotplug.log
这将使 shell 展开脚本中的命令并将其写入
xen-hotplug.log
文件,帮助你追踪问题的根源并解决问题。
1.5 使用 strace 进行故障排除
strace
是一种重要的通用故障排除技术,可用于查看 Xen 控制工具的实际操作。例如,当 Xen 无法找到外部二进制文件(如
xen-vncfb
)时,可以使用以下命令:
# strace -e trace=open -f xm create prospero 2>&1 | grep ENOENT | less
在设置 PyGRUB 时,使用
strace
发现缺少必要的目录:
# strace xm create -c prospero
(snipped)
mknod("/var/lib/xen/xenbl.4961", S_IFIFO|0600) = -1 ENOENT (No such file or directory)
创建该目录即可解决问题:
# mkdir -p /var/lib/xen/
1.6 解决 Python 路径问题
Python 有自己的内部搜索路径,用于查找模块。如果路径中不包含 Xen 模块,可能会出现如下错误:
# xm create -c sebastian.cfg
Using config file "/etc/xen/sebastian.cfg".
Traceback (most recent call last):
File "/usr/bin/pygrub", line 26, in ?
import grub.fsys
ImportError: No module named fsys
调整搜索路径的正确方法是在 Python 路径中已存在的目录下添加
.pth
文件,该文件应包含包含 Python 模块的目录路径。例如:
# echo "/usr/local/lib/python2.5/site-packages" >> /usr/lib/python2.5/local.pth
启动 Python 确认路径是否更新正确:
# python
>>>> import sys
>>>> print sys.path
['', '/usr/lib/python25.zip', 'usr/lib/python2.5' (etc)
'/usr/local/lib/python2.5/site-packages']
1.7 处理神秘锁定问题
如果 Xen 或
dom0
神秘挂起,可能是
dom0
发生内核崩溃,同时控制台日志记录不足。
- 使用串行控制台可以获得更详细的信息,若未看到崩溃消息,可以尝试在控制台连续按下三次
CTRL - A
切换输入到 Xen 管理程序。
- 若没有串行控制台,尽量将 VGA 控制台保持在
tty1
,有时可以使用数码相机保存内核崩溃的输出。
- 若机器在看到崩溃消息前重启,且无法使用串行控制台,可以在
domU
的
menu.lst
文件中指定 Linux 内核的模块行添加
panic = 0
参数,但这会导致计算机挂起而非重启,适合测试环境。
1.8 内核参数:安全模式
当管理程序串行控制台也无法工作时,可以尝试以下内核参数:
-
ignorebiostables
:在某些 Intel 芯片组的 I/O 压力下,该参数可能有助于避免挂起。
-
acpi = off
和
nousb
:有报告称这些参数可以提高某些硬件的稳定性。
- 禁用 BIOS 中的超线程功能,某些 Xen 版本可能存在相关问题。
在
/boot/grub/menu.lst
文件中添加这些参数后的示例如下:
root hd0(0)
kernel /boot/xen-3.0.gz
module /boot/vmlinuz-2.6-xen ignorebiostables acpi=off noapic nousb
1.9 获取帮助
- 邮件咨询 :可以直接发送与 Xen 相关的问题邮件,但不保证能够得到帮助。
-
邮件列表
:有多个关于 Xen 的流行邮件列表,如
Xen - users和Xen - devel,Xen - users更适合初学者提问。 - Xen 维基 :Xen 有一个广泛的维基,虽然部分内容可能过时,但仍是一个有价值的起点。
-
Xen IRC 频道
:在
irc.oftc.net上有一个受欢迎的#xen频道,可以随时加入交流。 - Bugzilla :Xen 维护了一个公开的 Bug 数据库,可通过关键字搜索问题。
- 发行版供应商 :不要忘记参考发行版供应商的特定文档和支持资源。
-
xen - bugtool
:当其他方法都失败时,可以使用
xen - bugtool收集相关故障排除信息,将其保存为.tar.bz2文件后,可上传到网络并发送消息到Xen - devel邮件列表。
1.10 xm 命令概述
xm
命令是与 Xen 控制平面功能交互的主要接口,通过向
xend
发送指令来实现各种功能。
xm
命令的一般语法如下:
xm <subcommand> <domain specifier> [options]
选项可以放在域指定符之前或之后,通常建议放在最后。例如,关闭域 10 的命令如下:
xm shutdown 10
xm
命令通常是异步的,可能在实际完成之前返回。例如,
xm shutdown
命令可能需要几分钟才能真正关闭域,通常需要使用
xm list
命令确认域是否已停止运行。
1.11 xm 子命令列表
| 子命令 | 说明 |
|---|---|
| addlabel, cfgbootpolicy, dumppolicy, getlabel, labels, loadpolicy, makepolicy, resources, rmlabel | 与 Xen 的安全策略基础设施交互 |
| block - attach, block - configure, block - detach, block - list | 管理附加到域的存储设备 |
| console | 连接到指定域的控制台 |
| create | 创建并启动域,需要指定配置文件 |
| debug - keys * | 与 Xen 内置的 GDB 存根交互(Xen 3.1 及以后版本) |
| delete * | 从 Xen 管理中移除域(Xen 3.1 及以后版本) |
| destroy | 强制终止域,立即释放资源 |
| dmesg | 打印内核启动的诊断消息 |
| domid, domname | 根据域名查找域 ID 或根据域 ID 查找域名 |
| dry - run | 测试是否能成功找到并使用虚拟设备,也可用于调试域配置中的 Python 代码 |
| dump - core | 触发立即内存转储 |
| info | 打印 Xen 主机的有用信息 |
| list | 列出域信息,可显示域的状态 |
| log |
打印
/var/log/xend.log
文件内容
|
| mem - max | 指定域可使用的最大内存 |
| mem - set | 调整域的内存分配 |
| migrate | 迁移域 |
| network - attach, network - detach, network - list | 管理虚拟网络设备 |
| new * | 将域添加到 Xen 管理,但不分配资源或运行(Xen 3.1 及以后版本) |
| pause | 暂停域 |
| reboot | 命令域干净地重启 |
| rename | 更改域的可读名称 |
| restore, save | 保存和恢复域的状态,类似于休眠 |
| resume * | 使域从暂停状态恢复(Xen 3.1 及以后版本) |
| sched - credit | 配置信用调度器 |
| sched - sedf | 调整过时的 SEDF 调度器的参数 |
| shell * | 启动交互式 shell(Xen 3.1 及以后版本) |
| shutdown | 命令域关闭 |
| start * | 启动已管理的域(Xen 3.1 及以后版本) |
| suspend * | 暂停已管理的域(Xen 3.1 及以后版本) |
| sysrq | 向域发送魔法系统请求键 |
| top |
以类似于
top
命令的格式显示运行中的 Xen 域的状态信息
|
| trigger * | 向域发送 CPU 事件(Xen 3.1 及以后版本) |
| unpause | 恢复已暂停的域 |
| uptime | 打印域的运行时间 |
| vcpu - list, vcpu - pin, vcpu - set | 控制 SMP 系统中域使用的 CPU |
| vnet - create, vnet - delete, vnet - list | 与 Xen 的 VLAN 支持交互 |
| vtpm - list | 列出附加到域的虚拟 TPM |
流程图:Xen 故障排除流程
graph TD;
A[遇到问题] --> B{问题类型};
B -->|域阻塞| C[查看日志,如 /var/log/xen/xend-debug.log];
C --> D{是否找到原因};
D -->|是| E[解决问题];
D -->|否| F[进一步调试,如使用 strace];
B -->|热插拔问题| G[使用 udevmonitor 查看事件];
G --> H[添加额外日志记录];
H --> I[追踪问题根源并解决];
B -->|Python 路径问题| J[检查 Python 搜索路径];
J --> K[添加 .pth 文件];
K --> L[确认路径更新];
B -->|神秘锁定| M{是否有串行控制台};
M -->|是| N[查看串行控制台消息];
M -->|否| O[保持 VGA 控制台在 tty1];
N --> P{是否看到崩溃消息};
P -->|否| Q[按三次 CTRL - A 切换输入];
O --> R[可使用数码相机保存输出];
B -->|其他| S[尝试内核参数];
S --> T{是否解决问题};
T -->|是| E;
T -->|否| U[使用 xen - bugtool 收集信息];
U --> V[上传信息到网络并咨询邮件列表];
以上就是 Xen 故障排除和
xm
命令的相关内容,希望能帮助你更好地使用和管理 Xen 环境。在遇到问题时,按照上述步骤逐步排查,通常可以找到解决方法。如果仍然无法解决,可以通过各种渠道获取更多帮助。
2. xm 子命令详细解析
2.1 安全策略相关子命令
addlabel
、
cfgbootpolicy
、
dumppolicy
、
getlabel
、
labels
、
loadpolicy
、
makepolicy
、
resources
和
rmlabel
这些子命令用于与 Xen 的安全策略基础设施交互。不过目前在实际应用中,尚未发现这些安全策略有太多实用价值。若你对安全模块感兴趣,可查看 Xen 源代码分发中包含的示例策略。
2.2 存储设备管理子命令
- block - attach :将存储设备附加到指定的域。具体操作时,需明确设备的相关信息和要附加到的目标域。
- block - configure :对已附加到域的存储设备进行配置,可调整设备的参数等。
- block - detach :从指定域中分离存储设备。
- block - list :列出附加到指定域的所有存储设备,方便查看设备状态和信息。
2.3 控制台子命令
console
子命令用于连接到指定域的控制台。但要注意,只有当域配置为使用 Xen 的虚拟控制台时,该命令才有效。即使配置正确,有时可能需要按下
ENTER
键才能获得登录提示。对于新用户来说,输入
xm console
后看到空白屏幕可能会感到困惑,这是因为自上次使用后,控制台缓冲区没有新内容。
2.4 创建域子命令
create
子命令在近期版本的 Xen 中,相当于
xm new
后再执行
xm start
,是创建并启动域的常用命令。该命令期望输入一个配置文件的名称,若未指定文件,则默认使用
/etc/xen/xmdefconfig
。
create
子命令支持以下选项:
-
-h
:打印帮助信息。
-
-q
:安静模式,减少输出信息。
-
--path
:指定域配置文件的基础路径,默认为
/etc/xen
。
-
-n
:预运行模式,打印将生成的配置,用于调试域配置中的 Python 代码。
-
-x
:类似于
-n
,但以 XML 格式输出域定义。不过截至 Xen 3.3,此选项仍依赖已弃用的
xml.dom.ext
模块,在许多 Python 安装中可能无法正常工作。
-
-c
:自动连接到控制台,这对于与 PyGRUB 交互是必需的。
-
-s
:跳过 XML 域配置的 DTD 检查。
若未为
xm create
提供完整路径,它将默认在
/etc/xen
中查找配置文件,可使用
--path
选项更改查找路径。
2.5 调试相关子命令
- debug - keys *(Xen 3.1 及以后版本) :该子命令用于与 Xen 内置的 GDB 存根交互,允许发送魔法按键来控制存根的输出。但只有在编译 Xen 时启用了 GDB 存根,此命令才会生效,通常仅在开发 Xen 内部代码时有用。
-
dry - run
:理论上,此子命令用于测试 Xen 是否能成功找到并使用其虚拟设备,但实际效果并不理想,在预测启动域是否成功方面表现不佳。不过,它在调试域配置中的 Python 代码时很有用,同时也是
xm create的一个子选项,可使xm create以预运行模式创建域。
2.6 域管理子命令
- delete *(Xen 3.1 及以后版本) :从 Xen 的管理中移除指定的域。若域正在运行,该命令会先关闭域,然后移除其定义。
-
destroy
:此命令相当于直接拔掉物理机器的电源插头,会强制终止指定的域,并立即将所有资源返回给管理程序。当
domU完全锁定时,可能需要使用该命令来终止它。 -
domid 和 domname
:
domid命令根据域名查找对应的域 ID,domname命令则根据域 ID 查找对应的域名。当管理大量域时,这两个命令非常实用。
2.7 系统信息子命令
-
dmesg
:与系统的
dmesg命令类似,用于打印内核启动时的诊断消息,有助于排查系统启动过程中出现的问题。 -
info
:打印关于 Xen 主机的大量有用信息,包括所使用的 Xen 精确版本、处理器的功能以及可供
domU使用的内存等。 -
log
:简单地打印
/var/log/xend.log文件的内容,方便查看 Xen 控制守护进程的日志信息。
2.8 域列表子命令
list
子命令以表格形式列出域的信息。其最简形式仅列出域,但也可通过提供
--long
选项打印出关于域的详细信息,包括完整的 s - 表达式。短形式的
list
命令还会显示每个域的状态:
-
'b'(blocked)
:表示域正在等待某些操作,可能是 I/O 操作或调度原因。空闲的域通常会显示为阻塞状态,这是正常现象,当有任务时会自动解除阻塞。
-
'p'(paused)
:表示域已被
xm pause
命令暂停。
-
'c'(crashed)
:表示域已崩溃。
-
'd'(dying)
:表示域正在关闭并处于被管理程序销毁的过程中。若域长时间处于此状态,可能存在 bug。
-
's'(shutdown)
:表示域正在关闭,可能是由于内部命令(如
halt
)或
dom0
发出的命令(如
xm shutdown
)。使用
xm new
导入的域定义在使用
xm start
启动之前,也会显示为关闭状态。
-
'r'(running)
:表示域当前正在物理计算机上执行。在单处理器机器上,
xm list
通常会显示
dom0
是唯一运行的域,因为
dom0
负责生成和显示
xm list
的输出。
2.9 内存管理子命令
-
mem - max
:指定域可使用的最大内存量(以兆字节为单位),此设置与域配置文件中的
maxmem指令相同。目前,该命令对正在运行的域无效,更改将在域重启后生效。 -
mem - set
:通过向目标
domU中的气球驱动程序发送消息来调整域的内存分配。但这种调整需要domU操作系统的配合,因此不能保证一定成功。而且,如果分配的内存过多或过少,可能会导致域不稳定,所以一般不建议频繁使用此命令。
2.10 迁移相关子命令
migrate
子命令用于迁移域。迁移过程较为复杂,涉及到资源的重新分配和状态的保存与恢复。在迁移过程中,需要确保目标主机具备足够的资源和合适的环境。
2.11 网络设备管理子命令
-
network - attach
:将虚拟网络设备(如
vif)附加到指定的域。 - network - detach :从指定域中分离虚拟网络设备。
- network - list :列出附加到指定域的所有虚拟网络设备,方便查看网络设备的状态和配置。
2.12 生命周期管理子命令
-
new *(Xen 3.1 及以后版本)
:将一个域添加到 Xen 的管理中,但并不实际分配资源或运行该域。通常需要配合
-f选项指定一个描述域的文件,该文件可以是 XML 格式或标准的 Python 配置格式。添加后,可使用xm start命令启动该域。 - start *(Xen 3.1 及以后版本) :启动已添加到 Xen 管理中的域。
- pause :暂停指定的域。暂停期间,域继续占用内存并锁定其设备,但不会在 CPU 上调度运行。
-
reboot
:命令指定的域进行干净的重启。但如果使用 PyGRUB,
xm reboot不会加载新的内核,需要先关闭域,然后重新创建才能加载新内核,这与在domU内部使用shutdown -r命令类似。 - rename :允许管理员更改与域 ID 关联的可读名称。
-
restore 和 save
:这两个子命令相互配合,实现域的状态保存和恢复功能,类似于计算机的休眠功能。
xm save命令使域释放其资源并将状态保存到指定的文件中,xm restore命令则从之前创建的保存文件中恢复域的状态。 -
resume *(Xen 3.1 及以后版本)
:指示处于暂停状态的域恢复运行。此命令仅适用于由
xend生命周期支持管理的域,即xend具备管理非活动域的能力。 - suspend *(Xen 3.1 及以后版本) :暂停已管理的域,使其进入暂停状态。
2.13 调度器相关子命令
-
sched - credit
:信用调度器是 Xen 的默认调度器,
sched - credit子命令用于配置信用调度器,允许显示或调整域的权重和上限。通过合理调整这些参数,可以优化域的资源分配和调度。 -
sched - sedf
:虽然 sedf 调度器已过时,但如果仍在使用该调度器,可以使用
sched - sedf子命令调整域的调度参数。
2.14 其他子命令
-
shell *(Xen 3.1 及以后版本)
:启动一个交互式 shell,称为 “The Xen Master”,在该 shell 中可以直接执行各种
xm子命令,提供了一种更便捷的操作方式。 -
shutdown
:命令指定的域进行关闭操作,但不会立即重启。该命令需要
domU的配合,如果域未能正常关闭,xend不会强制终止它。若xm shutdown命令失败,可以尝试使用xm destroy命令。 -
sysrq
:向
domU发送魔法系统请求键。由于dom0不会将系统请求键传递给domU,因此无法通过xm console发送系统请求键。当域看起来无响应时,该命令是一个有用的最后手段。具体的系统请求键功能可以参考 Linux 内核源代码树中的Documentation/sysrq.txt文件。 -
top
:以类似于系统
top命令的格式显示正在运行的 Xen 域的状态信息,包括 CPU 使用率、内存使用率等,方便实时监控域的运行状态。 - trigger *(Xen 3.1 及以后版本) :向指定的域发送 CPU 事件,可触发不可屏蔽中断(NMI)、复位或初始化事件。不过,在 Xen 3.2/i386 中,复位和初始化事件可能会返回 “函数未实现” 的错误消息。该命令主要用于调试目的。
-
unpause
:恢复已被
xm pause命令暂停的域,使其继续在 CPU 上调度运行。 -
uptime
:打印指定域的运行时间。若未指定域,则打印所有
VM的运行时间。 -
vcpu - list, vcpu - pin, vcpu - set
:这些子命令用于控制 SMP 系统中域使用的 CPU。
vcpu - list列出域使用的vcpu信息,vcpu - pin可以将域的vcpu固定到特定的物理 CPU 上,vcpu - set可以调整域使用的vcpu数量。 - vnet - create, vnet - delete, vnet - list :与 Xen 的 VLAN 支持交互。不过目前尚未有实际使用这些功能的案例,若你在使用过程中有相关经验,欢迎分享。
- vtpm - list :列出附加到指定域的虚拟 TPM(可信平台模块)。虽然在文档中对 TPM 的介绍不多,但在某些安全相关的场景中可能会用到。
3. 总结
Xen 是一个功能强大但复杂的虚拟化管理系统,在使用过程中难免会遇到各种问题。通过掌握
xm
命令的各个子命令以及相应的故障排除方法,可以更高效地管理和维护 Xen 环境。
在遇到问题时,首先要根据问题的表现和类型,按照故障排除流程逐步排查。例如,若域出现阻塞状态,可先查看相关日志文件,确定问题根源;若遇到 Python 路径问题,可通过添加
.pth
文件来解决。同时,合理利用各种工具和资源,如
strace
、
xen - bugtool
等,以及各种获取帮助的渠道,如邮件列表、维基和 IRC 频道等,能够更好地解决问题。
此外,对于
xm
子命令的使用,要根据具体需求选择合适的命令,并注意不同命令的适用条件和限制。例如,一些新的子命令可能仅适用于特定版本的 Xen,在使用时需要确认版本兼容性。
希望本文能够帮助你更好地理解和使用 Xen 虚拟化系统,在实际操作中更加得心应手。若你在使用过程中还有其他疑问或经验,欢迎交流分享。
流程图:xm 子命令使用流程
graph TD;
A[选择操作类型] --> B{管理类型};
B -->|安全策略| C[使用 addlabel 等子命令];
B -->|存储设备| D[使用 block - attach 等子命令];
B -->|控制台| E[使用 console 子命令];
B -->|创建域| F[使用 create 子命令];
B -->|调试| G[使用 debug - keys 或 dry - run 子命令];
B -->|域管理| H[使用 delete 等子命令];
B -->|系统信息| I[使用 dmesg 等子命令];
B -->|域列表| J[使用 list 子命令];
B -->|内存管理| K[使用 mem - max 等子命令];
B -->|迁移| L[使用 migrate 子命令];
B -->|网络设备| M[使用 network - attach 等子命令];
B -->|生命周期管理| N[使用 new 等子命令];
B -->|调度器| O[使用 sched - credit 等子命令];
B -->|其他| P[使用 sysrq 等子命令];
C --> Q[执行具体操作];
D --> Q;
E --> Q;
F --> Q;
G --> Q;
H --> Q;
I --> Q;
J --> Q;
K --> Q;
L --> Q;
M --> Q;
N --> Q;
O --> Q;
P --> Q;
Q --> R[检查操作结果];
R -->|成功| S[完成操作];
R -->|失败| T[进行故障排除];
T --> A;
通过以上的总结和流程图,希望能为你在使用 Xen 和
xm
命令时提供清晰的指导,帮助你更好地应对各种情况。
超级会员免费看
52

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



