我试图从Debian 6.0.4和Xen-4.0运行Ubuntu 12.10。 我意识到,pygrub可能无法parsingmenu.lst(我将symlinked menu.lst到/ boot中的grub.cfg),并以此configuration结束:
# # DO NOT EDIT THIS FILE # # It is automatically generated by grub-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os { insmod gzio insmod ext2 search --no-floppy --fs-uuid --set=root 7098a9fb-df7a-4e37-841d-73641c6b79c5 loopback loop0 /sdd set root=(loop0) linux /boot/vmlinuz-3.5.0-27-generic root=UUID=7098a9fb-df7a-4e37-841d-73641c6b79c5 ro console=hvc0 splash quiet initrd /boot/initrd.img-3.5.0-27-generic }
但不幸的是,pygrub仍然无法parsingconfiguration文件,并向我显示以下输出: 
我认为pygrub在menuentry中的loopback设备有问题。 我删除了违规行,并用一个简单的configurationreplace它们(类似于我的其他Debian Xen实例)。
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os { insmod ext2 set root=(hd0) linux /boot/vmlinuz-3.5.0-27-generic root=UUID=7098a9fb-df7a-4e37-841d-73641c6b79c5 ro console=hvc0 splash quiet initrd /boot/initrd.img-3.5.0-27-generic }
但不幸的是,这也不会启动:它显示pygrub菜单和错误消息:Traceback(最近一次调用最后):
File "/usr/lib/xen-4.0/bin/pygrub", line 704, in <module> chosencfg = run_grub(file, entry, fs, incfg["args"]) File "/usr/lib/xen-4.0/bin/pygrub", line 570, in run_grub img = g.cf.images[0] IndexError: list index out of range root@xenhost7:~# Error: Boot loader didn't return any data!
该错误似乎表明,pygrub能够parsing数据,但不知何故无法find内核。 但内核存在。 Fdisk也显示/ boot在第一个分区上:
Disk part: 32.2 GB, 32212254720 bytes 255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000c7dc8 Device Boot Start End Blocks Id System part1 1 3851 30924800 83 Linux part2 3851 3917 529409 5 Extended part5 3851 3917 529408 82 Linux swap / Solaris
请注意,使用外部内核启动计算机并不是一个真正的select,因为所有的虚拟机都是通过iSCSI启动的(我们将在不久的将来转换到KVM)。 原始grubconfiguration中的回环设备在启动时也可能产生问题。
任何build议,想法?
我们能够用指定的configuration启动系统:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os { insmod gzio insmod ext2 set root='(hd0)' linux /boot/vmlinuz-3.5.0-27-generic root=UUID=7098a9fb-df7a-4e37-841d-73641c6b79c5 ro console=hvc0 splash quiet initrd /boot/initrd.img-3.5.0-27-generic }
问题是我创build了一个menu.lst文件,pygrub与Grub 1.0(或0.95)相关联,这个文件首先被parsing。 Ubuntu 12.10中使用的文件格式是Grub 2.0文件。
因此,为了使用pygrub运行Ubuntu 12.10, set root={...}行必须用set root='(hd0)'replace。