24、Xen技术使用与故障排除指南

Xen技术使用与故障排除指南

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,减少因故障带来的损失。在遇到问题时,要保持冷静,按照正确的步骤进行排查和解决。

第三方支付功能的技术人员;尤其适合从事电商、在线教育、SaaS类项目开发的工程师。; 使用场景及目标:① 实现微信支付宝的Native、网页/APP等主流支付方式接入;② 掌握支付过程中关键的安全机制如签名验签、证书管理敏感信息保护;③ 构建完整的支付闭环,包括下单、支付、异步通知、订单状态更新、退款对账功能;④ 通过定时任务处理内容支付超时概要状态不一致问题:本文详细讲解了Java,提升系统健壮性。; 阅读应用接入支付宝和建议:建议结合官方文档沙微信支付的全流程,涵盖支付产品介绍、开发环境搭建箱环境边学边练,重点关注、安全机制、配置管理、签名核心API调用及验签逻辑、异步通知的幂等处理实际代码实现。重点异常边界情况;包括商户号AppID获取、API注意生产环境中的密密钥证书配置钥安全接口调用频率控制、使用官方SDK进行支付。下单、异步通知处理、订单查询、退款、账单下载等功能,并深入解析签名验签、加密解密、内网穿透等关键技术环节,帮助开发者构建安全可靠的支付系统。; 适合人群:具备一定Java开发基础,熟悉Spring框架和HTTP协议,有1-3年工作经验的后端研发人员或希望快速掌握第三方支付集成的开发者。; 使用场景及目标:① 实现微信支付Native模式支付宝PC网页支付的接入;② 掌握支付过程中核心的安全机制如签名验签、证书管理、敏感数据加密;③ 处理支付结果异步通知、订单状态核对、定时任务补偿、退款及对账等生产级功能; 阅读建议:建议结合文档中的代码示例官方API文档同步实践,重点关注支付流程的状态一致性控制、幂等性处理和异常边界情况,建议在沙箱环境中完成全流程测试后再上线。
matlab2python 这是一个Python脚本,用于将Matlab文件或代码行转换为Python。此项目处于alpha阶段。 该实现严重依赖于Victor Leikehman的SMOP项目。 当前实现围绕SMOP构建,具有以下差异: 力图生成不依赖libsmop的代码,仅使用如numpy这样的标准Python模块。 使用常见缩写如np而非全称numpy。 尝试重排数组和循环索引,从0开始而不是1。 不使用来自libsmop的外部类matlabarray和cellarray。 增加了对Matlab类的基本支持,类体中声明的属性在构造函数中初始化。 因上述改动,产出代码“安全性较低”,但可能更接近用户自然编写的代码。 实现相对直接,主要通过替换SMOP使用的后端脚本,这里称为smop\backend_m2py.py。 一些函数替换直接在那里添加。 额外的类支持、导入模块以及其他微调替换(或说是黑客技巧)在matlabparser\parser.py文件中完成。 安装 代码用Python编写,可按如下方式获取: git clone https://github.com/ebranlard/matlab2python cd matlab2python # 安装依赖项 python -m pip install --user -r requirements.txt # 让包在任何目录下都可用 python -m pip install -e . # 可选:运行测试 pytest # 可选:立即尝试 python matlab2python.py tests/files/fSpectrum.m -o fSpectrum.py 使用方法 主脚本 存储库根目录下的主脚本可执行,并带有一些命令行标志(部分直接取自SMOP)。要将文件file.m转换为file.py,只需输入:
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值