diff options
Diffstat (limited to 'perl-install')
-rw-r--r-- | perl-install/NEWS | 2 | ||||
-rw-r--r-- | perl-install/bootloader.pm | 18 |
2 files changed, 14 insertions, 6 deletions
diff --git a/perl-install/NEWS b/perl-install/NEWS index 1f9b3ce2f..e2dfe4854 100644 --- a/perl-install/NEWS +++ b/perl-install/NEWS @@ -1,6 +1,8 @@ - bootloader: o when reading existing menu.lst, keep verbatim entries for which the device has no mount-point + o handle "root (hd...)" for menu.lst entries (#23591) + (nb: when writing, "root ..." will not be used) - diskdrake: o fix garbaged error messages when umounting fs o disallow "Use for loopback" when the partition used for loopback is diff --git a/perl-install/bootloader.pm b/perl-install/bootloader.pm index 0e328c7b4..b6f8a8938 100644 --- a/perl-install/bootloader.pm +++ b/perl-install/bootloader.pm @@ -254,7 +254,7 @@ sub read_grub_menu_lst { push @{$b{entries}}, $e = { label => $v }; $global = 0; } elsif ($global) { - $b{$keyword} = $v eq '' ? 1 : grub2file($v, $grub2dev, $fstab); + $b{$keyword} = $v eq '' ? 1 : grub2file($v, $grub2dev, $fstab, \%b); } else { if ($keyword eq 'kernel') { $e->{type} = 'image'; @@ -264,7 +264,7 @@ sub read_grub_menu_lst { $e->{kernel_or_dev} = grub2dev($e->{rootnoverify} || $e->{grub_root}, $grub2dev); $e->{append} = ""; } elsif ($keyword eq 'initrd') { - $e->{initrd} = grub2file($v, $grub2dev, $fstab); + $e->{initrd} = grub2file($v, $grub2dev, $fstab, $e); } elsif ($keyword eq 'map') { $e->{mapdrive}{$2} = $1 if $v =~ m/\((.*)\) \((.*)\)/; } elsif ($keyword eq 'module') { @@ -280,14 +280,14 @@ sub read_grub_menu_lst { if ($e->{kernel} =~ /xen/ && @{$e->{modules} || []} == 2 && $e->{modules}[1] =~ /initrd/) { (my $xen, $e->{xen_append}) = split(' ', $e->{kernel}, 2); ($e->{kernel}, my $initrd) = @{delete $e->{modules}}; - $e->{xen} = grub2file($xen, $grub2dev, $fstab); - $e->{initrd} = grub2file($initrd, $grub2dev, $fstab); + $e->{xen} = grub2file($xen, $grub2dev, $fstab, $e); + $e->{initrd} = grub2file($initrd, $grub2dev, $fstab, $e); } if (my $v = delete $e->{kernel}) { (my $kernel, $e->{append}) = split(' ', $v, 2); $e->{append} = join(' ', grep { !/^BOOT_IMAGE=/ } split(' ', $e->{append})); $e->{root} = $1 if $e->{append} =~ s/root=(\S*)\s*//; - $e->{kernel_or_dev} = grub2file($kernel, $grub2dev, $fstab); + $e->{kernel_or_dev} = grub2file($kernel, $grub2dev, $fstab, $e); } my ($vga, $other) = partition { /^vga=/ } split(' ', $e->{append}); if (@$vga) { @@ -1497,7 +1497,13 @@ sub grub2dev { # replace dummy "(hdX,Y)" in "(hdX,Y)/boot/vmlinuz..." by appropriate path if needed sub grub2file { - my ($grub_file, $grub2dev, $fstab) = @_; + my ($grub_file, $grub2dev, $fstab, $o_entry) = @_; + + if ($grub_file =~ m!^/!) { + my $root = $o_entry && ($o_entry->{rootnoverify} || $o_entry->{grub_root}); + $root and $grub_file = "$root$grub_file"; + } + if (my ($device, $rel_file) = grub2dev_and_file($grub_file, $grub2dev)) { my $part = fs::get::device2part($device, $fstab); if (my $mntpoint = $part && $part->{mntpoint}) { |