在代理环境下使用XenServer

在本文中,我将解释在使用XenServer的代理环境下,当使用Debian或Ubuntu的Network Installation Notes1时,出现xenopsd内部错误导致无法启动宿主操作系统内核的问题的对策方法。
值得一提的是,根据经历来看,XenServer的文档2 3 4中没有提到此问题,并且在搜索引擎中也找不到相关信息,因此当我试图通过修改代码进行应对时,发现这个问题已经在实现中了。

错误追踪

在未进行处理的XenServer上执行网络安装说明会出现以下错误:找不到指定由/usr/bin/eliloader指定的安装源。

xenopsd internal error: VM = d795dc39-7539-267d-9977-26ec5ca09e42; domid = 16; Bootloader.Bad_error Traceback (most recent call last):
  File "/usr/bin/eliloader", line 1153, in ?
    sys.exit(main())
  File "/usr/bin/eliloader", line 1143, in main
    handle_first_boot(vm, img, args, other_config)
  File "/usr/bin/eliloader", line 872, in handle_first_boot
    kernel, ramdisk = debian_first_boot_handler(vm, repo_url, other_config)
  File "/usr/bin/eliloader", line 739, in debian_first_boot_handler
    fetchFile(vmlinuz_url, vmlinuz_file, pv_kernel_max_size)
  File "/usr/bin/eliloader", line 329, in fetchFile
    raise ResourceNotFound, source
__main__.ResourceNotFound

查看/usr/bin/eliloader的代码,可以发现在第891行有一个使用urllib2的代理相关实现。可以看到它从other_config[‘install-proxy’]中获取了代理的连接地址。

    # Make urllib2 use proxy server if one is supplied
    proxy = other_config['install-proxy']
    if proxy:
        proxy_support = urllib2.ProxyHandler({"http" : proxy})
        opener = urllib2.build_opener(proxy_support)
        urllib2.install_opener(opener)

在其他配置(other_config)中,可以看到它是通过canonicaliseOtherConfig函数(第881行)的返回值来获取的,在canonicaliseOtherConfig函数中可以看到它是从XenAPI中获取的(第314行)。

通过将install-proxy设置为VM的other_config,我们可以得知即使在代理环境下,/usr/bin/eliloader似乎也可以运行。

应对方法 fǎ)

在指定安装来源URL(Install from URL)后,使用XenCenter或类似工具创建虚拟机,不需要考虑其他事项。如果通过CUI操作,请参考通过安装源创建Linux虚拟机。

执行以下命令后,从XenServer控制台,将添加代理设置。

VMUUID=`xe vm-list name-label="<VMの名前>" --minimal`
xe vm-param-set uuid=$VMUUID other-config:install-proxy="<プロキシのURL>"

# 実行例はこんな感じ
VMUUID=`xe vm-list name-label="debian9" --minimal`
xe vm-param-set uuid=$VMUUID other-config:install-proxy="http://proxy.example.com:8080"

只要按照平常的方式启动,它会正常运行,没有任何问题。

创建已设置好代理的模板。

(Note: The translation provided is in Simplified Chinese)

由于每次都觉得这样做很烦琐,所以我会创建一个已设置代理的模板。只需克隆模板并设置参数即可。

在XenServer控制台上执行以下命令。

BASEUUID=$(xe template-list name-label="<ベースとなるテンプレートの名前>" --minimal)
NEWUUID=$(xe vm-clone uuid=$BASEUUID new-name-label="<新しいテンプレートの名前>")
xe template-param-set uuid=$NEWUUID other-config:install-proxy="<プロキシのURL>" other-config:default_template=true
# 毎回ミラーを入れるのが面倒なので,ついでにその辺りのパラメータもセットする.
xe template-param-set other-config:install-methods=http other-config-install-repository=http://cdn.debian.or.jp/debian/

# 実行例はこんな感じ
BASEUUID=$(xe template-list name-label="Debian Wheezy 7.0 (64-bit)" --minimal)
NEWUUID=$(xe vm-clone uuid=$BASEUUID new-name-label="Debian Wheezy 7.0 (64-bit) with proxy")
xe template-param-set uuid=$NEWUUID other-config:install-proxy="http://proxy.example.com:8080" other-config:default_template=true
xe template-param-set other-config:install-methods=http other-config-install-repository=http://cdn.debian.or.jp/debian/

更改模板名称时,请执行以下命令:

xe template-param-set uuid=`xe template-list name-label="<元の名前>" --minimal` name-label="<新しい名前>"

尽管有不同的表达方式,但似乎都称为netboot、network install、webinstall和netinstall等词语。

Citrix XenServer® 6.5 Service Pack 1安装指南

Citrix XenServer® 6.5 Service Pack 1虚拟机用户指南

Citrix XenServer® 6.5 Service Pack 1管理员指南

bannerAds