Package: grub-installer Version: 1.60+squeeze3 Severity: important *** Please type your report below this line *** When I specify in my preseeding file: d-i partman-auto/disk string /dev/sdb d-i grub-installer/bootdev string /dev/sdb grub-installer ignores me and installs to /dev/sda. partman-auto does the right thing. In some cases this can result in an unbootable system. Attached is a syslog excerpt for the execution of grub-installer, with DEBCONF_DEBUG=5 set in the boot line. You can see that it reads in the right disk name from the preseeding file, but somewhere in the step_os_probe .. step_bootdev .. step_install_loader sequence it changes $bootdev to /dev/sda. I have also observed (on other installations, using software RAID-1) that d-i grub-installer/bootdev string /dev/sda /dev/sdb is read in but also ultimately ignored and grub-installer only installs to /dev/sda. This installation was on a machine with two hard disks of identical size, but only one was intended to be used in the installation. The partioning was one ext3 partition for /, and one LVM for everything else. No separate /boot partition. No software raid is specified. I was able to stop the installer at the end and ran grub-installer again on one of the installer consoles: sh -vx /usr/bin/grub-installer /target 1>/target/var/log/gi 2>&1 This shows the problem comes when parsing the grub-mkdevicemap output. + os-prober + db_settitle debian-installer/grub-installer/title + _db_cmd SETTITLE debian-installer/grub-installer/title + IFS= printf %s\n SETTITLE debian-installer/grub-installer/title + IFS= read -r _db_internal_line + RET=OK + return 0 + tmpfile=/tmp/menu.lst.extras + [ -s /tmp/os-probed ] + q=grub-installer/only_debian + state=1 + [ ] + chroot /target grub-mkdevicemap --no-floppy -m+ -head -n1 + cut -f2 + default_bootdev_os=/dev/disk/by-id/scsi-35000c50017a6040b + [ /dev/disk/by-id/scsi-35000c50017a6040b ] + chroot /target readlink -f /dev/disk/by-id/scsi-35000c50017a6040b + default_bootdev=/dev/sda when I run that grub-mkdevicemap on the host after installation, I get: # grub-mkdevicemap --no-floppy -m - (hd0) /dev/disk/by-id/scsi-35000c50017a6040b (hd1) /dev/disk/by-id/scsi-35000c50017a7843b so it seems that there is a disconnect here from the specification of $bootdev and the attempt to guess $default_bootdev_os. The consequences are as follows. A little further down the script there is this, er, dense if statement: case $ARCH:$grub_package in *:grub|*:grub-pc|sparc:grub-ieee1275) if [ "$(device_to_disk "$cdsrc")" = "$default_bootdev" ] || \ ([ -n "$hdsrc" ] && [ "$(device_to_disk "$hdsrc")" = "$default_bootdev" ]) || \ ([ "$default_bootdev" = '(hd0)' ] && \ (([ -n "$cdfs" ] && [ "$cdfs" != "iso9660" ]) || \ [ "$hybrid" = true ])) || \ ([ "$default_bootdev" != '(hd0)' ] && \ ! partmap "$default_bootdev" >/dev/null && \ ! grub_probe -t fs -d "$default_bootdev" >/dev/null); then db_fget grub-installer/bootdev seen if [ "$RET" != true ]; then bootfs=$(findfs /boot) [ "$bootfs" ] || bootfs="$(findfs /)" disk=$(device_to_disk "$bootfs") db_set grub-installer/bootdev "$disk" state=2 fi fi ;; ... This fails out at the "$default_bootdev" = '(hd0)' comparison. + device_to_disk + echo + sed s:\(/dev/\(cciss\|ida\|rs\)/c[0-9]d[0-9][0-9]*\|/dev/mmcblk[0-9]\|/dev/\(ad\|da\)[0-9]\+\|/dev/[a-z]\+\).*:\1: + [ = /dev/sda ] + [ -n ] + [ /dev/sda = (hd0) ] Then we come to step_bootdev, a loop that continues until we have a suitable value of $state. There $default_bootdev supercedes what I set $bootdev to. $state is already set to 1 and $q to grub-installer/only_debian (see above). db_progress STEP 1 db_progress INFO grub-installer/progress/step_bootdev while : ; do if [ "$state" = 1 ]; then db_input high $q || true if ! db_go; then # back up to menu db_progress STOP exit 10 fi db_get $q if [ "$RET" = true ]; then bootdev="$default_bootdev" break else # Exit to menu if /boot is on SATA RAID/multipath; we # don't support device selection in that case if [ "$frdev" ]; then db_progress STOP exit 10 fi state=2 fi ... + db_progress STEP 1 + _db_cmd PROGRESS STEP 1 + IFS= printf %s\n PROGRESS STEP 1 + IFS= read -r _db_internal_line RET=OK + return 0 + db_progress INFO grub-installer/progress/step_bootdev + _db_cmd PROGRESS INFO grub-installer/progress/step_bootdev + IFS= printf %s\n PROGRESS INFO grub-installer/progress/step_bootdev + IFS= read -r _db_internal_line Determining GRUB boot device... RET=OK + return 0 + : + [ 1 = 1 ] + db_input high grub-installer/only_debian + _db_cmd INPUT high grub-installer/only_debian + IFS= printf %s\n INPUT high grub-installer/only_debian + IFS= read -r _db_internal_line + RET=30 question skipped + return 30 + true + db_go + _db_cmd GO + IFS= read -r _db_internal_line + RET=ok + return 0 + db_get grub-installer/only_debian + _db_cmd GET grub-installer/only_debian + IFS= printf %s\n GET grub-installer/only_debian + IFS= read -r _db_internal_line + RET=true + return 0 + [ true = true ] + bootdev=/dev/sda + break + db_progress STEP 1 + _db_cmd PROGRESS STEP 1 + IFS= printf %s\n PROGRESS STEP 1 + IFS= read -r _db_internal_line 5 RET=OK + return 0 + db_subst grub-installer/progress/step_install_loader BOOTDEV /dev/sda + _db_cmd SUBST grub-installer/progress/step_install_loader BOOTDEV /dev/sda + IFS= printf %s\n SUBST grub-installer/progress/step_install_loader BOOTDEV /dev/sda + IFS= read -r _db_internal_line + RET=0 + return 0 + db_progress INFO grub-installer/progress/step_install_loader + _db_cmd PROGRESS INFO grub-installer/progress/step_install_loader + IFS= printf %s\n PROGRESS INFO grub-installer/progress/step_install_loader + IFS= read -r _db_internal_line Running "grub-install /dev/sda"... RET=OK + return 0 + info Installing grub on '/dev/sda' + log info: Installing grub on '/dev/sda' + logger -t grub-installer info: Installing grub on '/dev/sda' preseeding details: d-i partman-auto/method string lvm d-i partman-auto/disk string /dev/sdb d-i grub-installer/bootdev string /dev/sdb d-i grub-installer/only_debian boolean true d-i grub-installer/with_other_os boolean true d-i grub-installer/grub2_instead_of_grub_legacy boolean true d-i partman-auto-lvm/no_boot boolean true d-i partman-md/device_remove_md boolean true d-i partman-md/confirm boolean true d-i partman-lvm/device_remove_lvm boolean true d-i partman-lvm/confirm boolean true d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/mount_style select uuid d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/confirm_nooverwrite boolean true d-i partman-auto/expert_recipe string my_server : \ 2048 2000 2048 ext3 \ $primary{ } \ $bootable{ } \ method{ format } \ format{ } \ use_filesystem{ } \ filesystem{ ext3 } \ label{ root } \ mountpoint{ / } \ . \ 100% 2000 200% linux-swap \ $defaultignore{ } \ $lvmok{ } \ method{ swap } \ format{ } \ . \ 10240 1000 10240 ext3 \ $defaultignore{ } \ $lvmok{ } \ method{ format } \ format{ } \ use_filesystem{ } \ filesystem{ ext3 } \ mountpoint{ /usr } \ . \ .. etc... It happens that /dev/sda has a software raid signature, but from the discussion above I think it is not causing the bug. # fdisk -l /dev/sda Disk /dev/sda: 300.0 GB, 300000000000 bytes 255 heads, 63 sectors/track, 36472 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: 0x0002eb77 Device Boot Start End Blocks Id System /dev/sda1 1 125 999424 fd Linux raid autodetect Partition 1 does not end on cylinder boundary. /dev/sda2 125 36473 291968000 fd Linux raid autodetect After installation this is the state of /dev/sdb # fdisk -l /dev/sdb Disk /dev/sdb: 300.0 GB, 300000000000 bytes 255 heads, 63 sectors/track, 36472 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: 0x000de478 Device Boot Start End Blocks Id System /dev/sdb1 * 1 249 1998848 83 Linux Partition 1 does not end on cylinder boundary. /dev/sdb2 250 36473 290967553 5 Extended /dev/sdb5 250 36473 290967552 8e Linux LVM I would really like to see this fixed in the stable release, how can I help? -- System Information: Debian Release: 6.0.4 APT prefers stable APT policy: (990, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 2.6.32-5-amd64 (SMP w/8 CPU cores) Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash
Attachment:
syslog.grub-installer.gz
Description: Binary data