[Pkg-xen-devel] Bug#603391: Workaround PyGrub issue

Tril tril at metapipe.net
Sun Sep 29 03:59:12 UTC 2013


Confirmed this issue. To reproduce: Install a fresh Wheezy AMD64 guest
under Xen 4.1 (hypervirtualized, boot from the
debian-7.1.0-amd64-CD-1.iso). Use "entire disk" automatic layout for
partitioning, this creates /dev/xvda1 for / and /dev/xvda5 for swap.
It will create /boot/grub/grub.cfg with many references to
(/dev/xvda,msdos1) which works fine when the machine is booted
hypervirtualized.  PyGrub can not handle the /dev/ syntax for devices,
even though Grub can.

My details:
Package: xen-utils-4.1
Version: 4.1.4-3+deb7u1
Architecture: amd64 

Confirmed workaround: inside the guest, create /boot/grub/device.map (NOT devices.map)
containing:
(hd0) /dev/xvda 

run update-grub
shutdown the guest and reboot it using PyGrub.  It will now work.

Backtrace from manual run of the buggy GrubConf.py:
# python /usr/lib/xen-4.1/lib/python/grub/GrubConf.py grub2  grub.cfg
WARNING:root:Unknown directive load_video
WARNING:root:Unknown directive terminal_output
WARNING:root:Unknown image directive load_video
Traceback (most recent call last):
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 462, in <module>
    g = Grub2ConfigFile(sys.argv[2])
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 354, in __init__
    _GrubConfigFile.__init__(self, fn)
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 174, in __init__
    self.parse()
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 413, in parse
    self.add_image(Grub2Image(title, img))
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 320, in __init__
    _GrubImage.__init__(self, title, lines)
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 89, in __init__
    self.reset(lines)
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 105, in reset
    self._parse(lines)
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 100, in _parse
    map(self.set_from_line, lines)
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 330, in set_from_line
    setattr(self, self.commands[com], arg.strip())
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 108, in set_root
    self._root = GrubDiskPart(val)
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 55, in __init__
    (self.disk, self.part) = str.split(",", 2)
  File "/usr/lib/xen-4.1/lib/python/grub/GrubConf.py", line 70, in set_disk
    self._disk = int(val[2:])
ValueError: invalid literal for int() with base 10: 'ev/xvda'


Contents of grub.cfg triggering the error:

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  load_env
fi
set default="0"
if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  insmod vbe
  insmod vga
  insmod video_bochs
  insmod video_cirrus
}

insmod part_msdos
insmod ext2
set root='(/dev/xvda,msdos1)'
search --no-floppy --fs-uuid --set=root f395d5a0-4612-4872-806c-33cd37c152f0
if loadfont /usr/share/grub/unicode.pf2 ; then
  set gfxmode=640x480
  load_video
  insmod gfxterm
  insmod part_msdos
  insmod ext2
  set root='(/dev/xvda,msdos1)'
  search --no-floppy --fs-uuid --set=root f395d5a0-4612-4872-806c-33cd37c152f0
  set locale_dir=($root)/boot/grub/locale
  set lang=en_US
  insmod gettext
fi
terminal_output gfxterm
set timeout=5
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-amd64' --class debian --class gnu-linux --class gnu --class os {
	load_video
	insmod gzio
	insmod part_msdos
	insmod ext2
	set root='(/dev/xvda,msdos1)'
	search --no-floppy --fs-uuid --set=root f395d5a0-4612-4872-806c-33cd37c152f0
	echo	'Loading Linux 3.2.0-4-amd64 ...'
	linux	/boot/vmlinuz-3.2.0-4-amd64 root=UUID=f395d5a0-4612-4872-806c-33cd37c152f0 ro  
	echo	'Loading initial ramdisk ...'
	initrd	/boot/initrd.img-3.2.0-4-amd64
}
menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
	load_video
	insmod gzio
	insmod part_msdos
	insmod ext2
	set root='(/dev/xvda,msdos1)'
	search --no-floppy --fs-uuid --set=root f395d5a0-4612-4872-806c-33cd37c152f0
	echo	'Loading Linux 3.2.0-4-amd64 ...'
	linux	/boot/vmlinuz-3.2.0-4-amd64 root=UUID=f395d5a0-4612-4872-806c-33cd37c152f0 ro single 
	echo	'Loading initial ramdisk ...'
	initrd	/boot/initrd.img-3.2.0-4-amd64
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###



More information about the Pkg-xen-devel mailing list