summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perl-install/bootloader.pm43
-rw-r--r--perl-install/diskdrake/interactive.pm15
2 files changed, 57 insertions, 1 deletions
diff --git a/perl-install/bootloader.pm b/perl-install/bootloader.pm
index 3b741825f..4ceabb33d 100644
--- a/perl-install/bootloader.pm
+++ b/perl-install/bootloader.pm
@@ -1181,4 +1181,47 @@ sub install {
$f->($bootloader, $fstab, $hds, $bootloader->{method});
}
+sub update_for_renumbered_partitions {
+ my ($in, $renumbering) = @_;
+
+ my %files = (
+ lilo => '/etc/lilo.conf',
+ grub => '/boot/grub/menu.lst',
+ grub_install => '/boot/grub/install.sh',
+ );
+
+ my %configs = map {
+ my $f = cat_("$::prefix/$files{$_}");
+ $_ => { orig => $f, new => $f, file => $files{$_} };
+ } keys %files;
+
+ my $grub2dev = read_grub_device_map();
+ my %dev2grub = reverse %$grub2dev;
+
+ foreach (@$renumbering) {
+ my ($old, $new) = @$_;
+ my $old_grub = dev2grub($old, \%dev2grub);
+ my $new_grub = dev2grub($new, \%dev2grub);
+ log::l("renaming $old -> $new and $old_grub -> $new_grub");
+ foreach (values %configs) {
+ $_->{new} =~ s/\b$old/$new/g;
+ $_->{new} =~ s/\Q$old_grub/$new_grub/g;
+ }
+ }
+
+ any { $_->{orig} ne $_->{new} } values %configs or return 1; # no need to update
+
+ $in->ask_okcancel('', N("Your bootloader configuration must be updated because partition has been renumbered")) or return;
+
+ foreach (values %configs) {
+ output("$::prefix/$_->{file}", $_->{new}) if $_->{new} ne $_->{orig};
+ }
+ if ($configs{lilo}{orig} ne $configs{lilo}{new} && detect_bootloader() =~ /LILO/ ||
+ $configs{grub_install}{orig} ne $configs{grub_install}{new} && detect_bootloader() =~ /GRUB/) {
+ $in->ask_warn('', N("The bootloader can't be installed correctly. You have to boot rescue and choose \"%s\"",
+ N("Re-install Boot Loader")));
+ }
+ 1;
+}
+
1;
diff --git a/perl-install/diskdrake/interactive.pm b/perl-install/diskdrake/interactive.pm
index 88b959d1d..80294d42b 100644
--- a/perl-install/diskdrake/interactive.pm
+++ b/perl-install/diskdrake/interactive.pm
@@ -113,9 +113,10 @@ struct hd {
list will_tell_kernel # list of actions to tell to the kernel so that it knows the new partition table
bool hasBeenDirty # for undo
bool rebootNeeded # happens when a kernel reread failed
- bool partitionsRenumbered # happens when you
+ list partitionsRenumbered # happens when you
# - remove an extended partition which is not the last one
# - add an extended partition which is the first extended partition
+ list allPartitionsRenumbered # used to update bootloader configuration
int bus, id
partition_table_elem primary
@@ -270,6 +271,8 @@ sub Done {
$all_hds->{current_fstab} = $new;
fs::write_fstab($all_hds);
}
+ update_bootloader_for_renumbered_partitions($in, $all_hds);
+
if (any { $_->{rebootNeeded} } @{$all_hds->{hds}}) {
$in->ask_warn('', N("You need to reboot for the partition table modifications to take place"));
tell_wm_and_reboot();
@@ -1119,6 +1122,8 @@ sub warn_if_renumbered {
my $l = delete $hd->{partitionsRenumbered};
return if is_empty_array_ref($l);
+ push @{$hd->{allPartitionsRenumbered}}, @$l;
+
my @l = map {
my ($old, $new) = @$_;
N("partition %s is now known as %s", $old, $new) } @$l;
@@ -1279,3 +1284,11 @@ sub tell_wm_and_reboot() {
), $wm, $pid;
}
}
+
+sub update_bootloader_for_renumbered_partitions {
+ my ($in, $all_hds) = @_;
+ my @renumbering = map { @{$_->{allPartitionsRenumbered} || []} } @{$all_hds->{hds}} or return;
+
+ require bootloader;
+ bootloader::update_for_renumbered_partitions($in, \@renumbering);
+}