在代理环境下使用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管理员指南