CentOS 5.1にインストールしたxenでDomUをkickstartを使って自動的に作成する設定をしていたら、その問題が起きました。
>sudo /usr/sbin/virt-install --extra-args='ks=http://ks-server/kickstart.php?host=myhost&ip=192.168.1.151&mac=00:00:00:00:01:51' What is the name of your virtual machine? myhost How much RAM should be allocated (in megabytes)? 512 What would you like to use as the disk (path)? /var/xen/myhost.img How large would you like the disk (/var/xen/myhost.img) to be (in gigabytes)? 8 Would you like to enable graphics support? (yes or no) no What is the install location? ftp://ftp.riken.jp/Linux/centos/4/os/i386/ Starting install... Retrieving CentOS... 310 B 00:00 Retrieving vmlinuz... 100% |=========================| 1.0 MB 00:00 Retrieving initrd.img... 100% |=========================| 853 kB 00:00 Creating storage file... 100% |=========================| 8.0 GB 00:00 libvir: XML error : line 10: EntityRef: expecting ';' libvir: XML error : line 10: EntityRef: expecting ';' libvir: Xen Daemon error : XML description for domain is not well formed or invalid Traceback (most recent call last): File "/usr/sbin/virt-install", line 633, in ? main() File "/usr/sbin/virt-install", line 578, in main dom = guest.start_install(conscb,progresscb) File "/usr/lib/python2.4/site-packages/virtinst/Guest.py", line 649, in start_install return self._do_install(consolecb, meter) File "/usr/lib/python2.4/site-packages/virtinst/Guest.py", line 666, in _do_install self.domain = self.conn.createLinux(install_xml, 0) File "/usr/lib/python2.4/site-packages/libvirt.py", line 503, in createLinux if ret is None:raise libvirtError('virDomainCreateLinux() failed', conn=self) libvirt.libvirtError: virDomainCreateLinux() failed XML description for domain is not well formed or invalid
virt-install では、extra-argsに”ks=”を設定して、kickstartの設定ファイルを読み込むことができます。 このとき、リモートの設定ファイルを変更することなく設定ファイルを読み込むために、設定ファイルをPHPにして、Query Stringで設定ファイルのパラメータを変更できるようにしていました。
この場合、host/ip/macを引数として渡しています。
Googleに聞いたところ、CentOS 5.1のlibvirtに問題があるようでした。
ここでは、install locationにシングルクォートが入っている場合を指摘していますが、設定全体でXMLのspecial characterのエスケープがされていないため、今回のようにextra-argsにアンパサンド(&)が入っている場合も同様の問題が起こりました。
問題を回避するため、kickstartの設定をおいているサーバーのapacheの設定を修正し、kickstartの設定ファイルのURIを変更しました。
http://ks-server/kickstart/myhost/192.168.1.151/00:00:00:00:01:51 でkickstartの設定ファイルを取得する
RewriteLogLevel 9 RewriteLog "/var/log/apache2/www-local-rewrite.log" RewriteRule ^/kickstart/(.*?)/(.*?)/(.*)$ /kickstart.php?host=$1&ip=$2&mac=$3 [L]
これで自動インストールすることができました。
このバグはCentOS 5.2のlibvirtでは修正されているらしく、修正もすでに公開されています。
参考