CentOS 5.5 上升级 Xen 后遇到的一个问题

前几天用 CentOS 5.5 官方源升级我们的一台 Xen 服务器的时候发现一个问题,升级后的 xen 内核和 xend 服务都能正常启动,但是 xm 这类工具用不了:

# uname -a
Linux n46.xen.vpsee.com 2.6.18-194.32.1.el5xen #1 SMP Wed Jan 5 18:44:24 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

# /etc/init.d/xend status
xend is running

# xm list
Error: Unable to connect to xend: No such file or directory. Is xend running?

检查 xen 日志报错如下:

# vi /var/log/xen/xend.log
[2011-01-14 09:54:38 4664] INFO (SrvDaemon:332) Xend Daemon started
[2011-01-14 09:54:38 4664] INFO (SrvDaemon:336) Xend changeset: unavailable.
[2011-01-14 09:54:38 4664] ERROR (SrvDaemon:349) Exception starting xend ((13, 'Permission denied'))
Traceback (most recent call last):
  File "/usr/lib64/python2.4/site-packages/xen/xend/server/SrvDaemon.py", line 341, in run
...
  File "/usr/lib64/python2.4/site-packages/xen/xend/XendNode.py", line 871, in xenschedinfo
    sched_id = self.xc.sched_id_get()
Error: (13, 'Permission denied')

这种 xen/xend 正常,xm 不能用的情况很明显是 xen hypervisor 和 xen tools 之间的匹配问题。这是因为 VPSee 以前用 CentOS 的非官方源升级到了 Xen 3.4.3,造成以前升级的 xen tools 和上面刚刚官方升级的 xen hypervisor 不匹配,所以需要把 /boot/grub/menu.lst 里面刚升级成功的的 kernel /xen.gz-2.6.18-194.32.1.el5 换成原来的 kernel /xen.gz-3.4.3,然后重启一下就可以了:

# vi /boot/grub/menu.lst
title CentOS (2.6.18-194.32.1.el5xen)
        root (hd0,0)
        kernel /xen.gz-3.4.3
        module /vmlinuz-2.6.18-194.32.1.el5xen ro root=LABEL=/
        module /initrd-2.6.18-194.32.1.el5xen.img

评论 (14 Comments)

  1. XEN不是一般的难装,从网上的各种教程的源码安装我就没成功过,后来没办法,只能用第三方源直接安装了。
    到后来有了KVM,我们就直接不用XEN了,全部转到KVM上了。
    博主我刚用了你的VPS。确实不错,啥时候推出个KVM的VPS啊?

  2. @18988
    我们在 Xen 上有多年的企业生产环境运营经验,对 KVM 还不够熟悉,目前还没有找到切换到 KVM 的理由。

  3. 昨天下午一台生产机器yum update了一下
    升级到了kernel-xen-2.6.18-194.32.1.el5.x86_64
    重启机器提示
    [root@server4 log]# uname -a
    Linux server4.miphost.com 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_
    [root@server4 log]# xm top
    ERROR Internal error: Could not obtain handle on privileged command interface (2 = No such file or directory)
    ERROR Internal error: Could not obtain handle on privileged command interface (2 = No such file or directory)
    xc_interface_open: No such file or directory
    Failed to initialize xenstat library

    照着博主配置修改后无法启动了…
    求助

  4. 你的内核显示 2.6.18-194.el5,应该是 2.6.18-194.32.1.el5xen,你可能因为升级修改了 grub 默认启动的顺序进入了非 xen 内核,修改 grub 配置的默认启动顺序进入 xen 内核就可以了。

  5. 最开始用xen就是看了您的《在debain上装xen》之后,现在有一个问题困扰了很久,想请教您。
    正如您在《Xen 性能对比:Native,Dom0 和 DomU》中提到的Xen的Dom0的性能是比较差的,所以我只是用它作管理用。但是Dom0和DomU的CPU数量该如何分配?有什么原则吗?特别是对于DomU处理IO密集应用时,比如一个4Core,4G的主机,应怎样为装了CentOS的Dom0和DomU分配资源,能最大优化DomU的网络IO性能?
    谢谢!

  6. @xener
    如果你对性能有较高的要求的话,建议单独分配1个 cpu core 给 dom0 独享,然后把剩下的3个 cpu core 分配给 domU.

  7. 哥 救命阿 我快崩溃了 xen上安装不上虚拟机 什么时候有时间向你请教下 能给个联系方式吗

  8. 您好 我使用的是 centos5 xen已经安装上了 但是怎么装也装不上虚拟机。下面使我的安装步骤 麻烦抽时间看下

    我是初学者,清多多包涵。

    使用配置文件centos5.cfg安装 内容如下
    kernel = “/boot/vmlinuz-xen-centos5”
    ramdisk = “/boot/initrd-xen-centos5”
    name = “centos5-vm”
    memory = “512”
    disk = [ ‘tap:aio:/home/cnc/domains/centos5/disk.img,xvda,w’, ]
    vif = [ ‘bridge=xenbr0’, ]
    vcpus=1
    on_reboot = ‘destroy’
    on_crash = ‘destroy’

    然后使用命令 xm create -c centos5.cfg

    在安装过程中需要选择 local cd
    hard disk
    nfs
    http
    ftp

    选择http
    输入 mirror.centos.org
    centos/5/os/i386
    然后 显示 can’t retrive http://mirror.centos.org/centos/5/os/i386/images/stage2.img.
    但是使用 firefox可以访问。

    安装到这里就进行不下去了,请多多帮忙。

  9. @同甫
    你看看 Xen 的日志 /var/log/xen/xend.log,日志信息能帮助排错。

  10. 您好,我的centOs5.4由xen3.1.2升级了xen3.4.3,通过如下方式:
    # cd /etc/yum.repos.d/
    # wget http://www.gitco.de/repo/GITCO-XEN3.4.3_x86_64.repo
    # yum groupupdate xen 关联xen的相关包
    # reboot
    xen升级成功,但是创建好的虚拟机,执行ruby脚本查询虚拟机cpu,内存等信息出错了(该脚本来源自OpenNebula云计算管理工具中)。如下错误:
    [root@node150 images]# /var/tmp/one/vmm/xen/poll one-0
    Error executing sudo /usr/sbin/xentop -bi2
    /var/tmp/one/vmm/xen/poll:186:in `get_vm_info’: undefined method `[]’ for nil:NilClass (NoMethodError)
    from /var/tmp/one/vmm/xen/poll:310:in `print_one_vm_info’
    from /var/tmp/one/vmm/xen/poll:344
    请教下是什么原因呢?多谢啦!
    注:在xen3.1.2下测试是没有问题的

    以下是poll脚本(ruby)
    module XEN
    CONF={
    ‘XM_POLL’ => ‘sudo /usr/sbin/xentop -bi2’
    }

    def self.get_vm_info(vm_id)
    data = get_all_vm_info[vm_id]

    if !data
    return {:STATE => ‘d’}
    else
    return data
    end
    end

    def self.get_all_vm_info
    begin
    text=`#{CONF[‘XM_POLL’]}`
    lines=text.strip.split(“\n”)
    block_size=lines.length/2
    valid_lines=lines.last(block_size)

    domain_lines=valid_lines[4..-1]

    domains=Hash.new

    domain_lines.each do |dom|
    dom_data=dom.gsub(‘no limit’, ‘no-limit’).strip.split

    dom_hash=Hash.new

    dom_hash[:name]=dom_data[0]
    dom_hash[:state]=get_state(dom_data[1])
    dom_hash[:usedcpu]=dom_data[3]
    dom_hash[:usedmemory]=dom_data[4]
    dom_hash[:nettx]=dom_data[10]
    dom_hash[:netrx]=dom_data[11]

    domains[dom_hash[:name]]=dom_hash
    end

    domains
    rescue
    STDERR.puts “Error executing #{CONF[‘XM_POLL’]}”
    nil
    end
    end

    def self.get_state(state)
    case state.gsub(‘-‘, ”)[-1..-1]
    when *%w{r b s d}
    ‘a’
    when ‘p’
    ‘p’
    when ‘c’
    ‘e’
    else
    ‘-‘
    end
    end
    end

    def select_hypervisor
    hypervisor=nil
    params=ARGV.clone

    params.each_with_index do |param, index|
    case param
    when ‘–kvm’
    hypervisor=KVM
    ARGV.delete_at(index)
    when ‘–xen’
    hypervisor=XEN
    ARGV.delete_at(index)
    end
    end

    if !hypervisor
    case $0
    when %r{/vmm\/kvm/}
    hypervisor=KVM
    when %r{/vmm\/xen/}
    hypervisor=XEN
    end
    end

    hypervisor
    end

    def load_vars(hypervisor)
    case hypervisor.name
    when ‘XEN’
    file=’xenrc’
    vars=%w{XM_POLL}
    when ‘KVM’
    file=’kvmrc’
    vars=%w{LIBVIRT_URI}
    else
    return
    end

    begin
    env=`. #{File.dirname($0)+”/#{file}”};env`

    lines=env.split(“\n”)
    vars.each do |var|
    lines.each do |line|
    if a=line.match(/^(#{var})=(.*)$/)
    hypervisor::CONF[var]=a[2]
    break
    end
    end
    end
    rescue
    end
    end

    def print_data(name, value)
    if value
    “#{name.to_s.upcase}=#{value}”
    else
    nil
    end
    end

    def print_one_vm_info(hypervisor, vm_id)
    info=hypervisor.get_vm_info(vm_id)

    exit(-1) if !info

    #info.merge!(get_interface_statistics(vm_id))

    values=info.map do |key, value|
    print_data(key, value)
    end

    puts values.zip.join(‘ ‘)
    end

    def print_all_vm_info(hypervisor)
    require ‘yaml’
    require ‘base64’

    vms=hypervisor.get_all_vm_info

    puts Base64.encode64(vms.to_yaml).delete(“\n”)
    end

    hypervisor=select_hypervisor

    if !hypervisor
    STDERR.puts “Could not detect hypervisor”
    exit(-1)
    end

    load_vars(hypervisor)

    vm_id=ARGV[0]

    if vm_id
    print_one_vm_info(hypervisor, vm_id)
    else
    print_all_vm_info(hypervisor)
    end

  11. 紧急求助!

    VPSEE,有一台服务器,建议客户使用64G内存,安装XEN3.0.4做虚拟化。
    结果发现只能识别出32G内存!!!

    查了半天也没发现任何解决办法,求救啊!~~~~

  12. 补充:安装的是64位系统,理论上识别64G内存没有任何问题!

  13. @Brooks
    和 xen hypervisor 能支持多少内存有关(当然也需要 dom0 的 Linux 是64位的)。你查一下 xen 文档,好像 xen 3.0.2 最大支持 32GB,xen 3.0.4 可以支持 128GB,我不太记得了。

  14. centos 64G内存,安装XEN3.0做虚拟化。
    结果发现只能识别出32G内存!!! 同求!

发表评论