diff options
Diffstat (limited to 'perl-install/standalone/bootloader-config')
| -rwxr-xr-x | perl-install/standalone/bootloader-config | 107 |
1 files changed, 79 insertions, 28 deletions
diff --git a/perl-install/standalone/bootloader-config b/perl-install/standalone/bootloader-config index b5a8e6807..187ca3eed 100755 --- a/perl-install/standalone/bootloader-config +++ b/perl-install/standalone/bootloader-config @@ -54,7 +54,7 @@ if ($image) { } $image = "/boot/$image" if $image !~ m!^/!; } elsif ($kernel_version) { - $image = "/boot/vmlinuz-$kernel_version"; + $image = find { -e $_ } map { "/boot/$_-$kernel_version" } qw(vmlinux uImage vmlinuz); } @@ -64,6 +64,9 @@ fs::get_info_from_fstab($all_hds); my $bootloader = bootloader::read($all_hds); if (!$bootloader) { if (member($action, 'add-kernel', 'remove-kernel')) { + if ($no_initrd) { + die "Cannot find a bootloader installed and initrd build suppressed\n"; + } warn "Cannot find a boot loader installed. Only taking care of initrd\n"; } else { die "Cannot find a boot loader installed\n"; @@ -88,13 +91,19 @@ sub remove_kernel() { remove_now_broken_boot_symlinks(); if (!$bootloader) { - #- removing the initrd for weird configs where no mdv bootloader is configured + #- removing the initrd for weird configs where no mga bootloader is configured my $kernel_str = bootloader::vmlinuz2kernel_str($image) or die "bad kernel name $image\n"; my $initrd_long = bootloader::kernel_str2initrd_long($kernel_str); unlink "/boot/$initrd_long"; return; } + remove_kernel_generic() if bootloader::main_method($bootloader->{method}) ne 'grub2'; + + modify_bootloader(); +} + +sub remove_kernel_generic() { my %proposed_labels; my @new_entries; @@ -129,45 +138,44 @@ sub remove_kernel() { my ($kernel_str, $v) = @$_; bootloader::add_kernel($bootloader, $kernel_str, $v); } - - modify_bootloader(); } #-############################################################################### sub add_kernel() { configure_ide_controller(); - bootloader::create_link_source(); my $kernel_str = bootloader::vmlinuz2kernel_str($image) or die "bad kernel name $image\n"; if (!$bootloader) { - #- building the initrd for weird configs where no mdv bootloader is configured + #- building the initrd for weird configs where no mga bootloader is configured my $fake_bootloader = { vga => undef }; my %opts = (initrd_options => $initrd_options); my $initrd_long = bootloader::kernel_str2initrd_long($kernel_str); - bootloader::mkinitrd($kernel_str->{version}, $fake_bootloader, { %opts }, "/boot/$initrd_long"); + bootloader::mkinitrd($kernel_str->{version}, $fake_bootloader, \%opts, "/boot/$initrd_long"); return; } - my $root_part = fs::get::root([ fs::get::fstab($all_hds) ]) or die "can not find root partition\n"; + my $root_part = fs::get::root_([ fs::get::fstab($all_hds) ]) or warn "cannot find root partition in /etc/fstab\n"; + $root_part ||= fs::get::root_from_mounted() or die "cannot find root partition\n"; my %opts = ( root => fs::wild_device::from_part('', $root_part), initrd_options => $initrd_options, if_($label, label => $label), (grep_each { member($::a, 'vga', 'lock') } %{$bootloader->{default_options}}), ); - #- short name - bootloader::add_kernel($bootloader, $kernel_str, { %opts }, 0, $no_initrd) if !$no_short_name; - #- long name - $kernel_str->{use_long_name} = 1; - bootloader::add_kernel($bootloader, $kernel_str, { %opts }, 1, $no_initrd); + #- short name + bootloader::add_kernel($bootloader, $kernel_str, { %opts }, 0, $no_initrd) if !$no_short_name; + + #- long name + $kernel_str->{use_long_name} = 1; + bootloader::add_kernel($bootloader, $kernel_str, { %opts }, 1, $no_initrd); modify_bootloader(); } -sub configure_ide_controller { +sub configure_ide_controller() { my $modules_conf = modules::any_conf->read; if ($modules_conf->get_alias('ide-controller') || $modules_conf->get_probeall('ide-controller')) { @@ -235,9 +243,14 @@ sub rebuild_initrds() { #-############################################################################### sub migrate_to_uuids() { - _migrate_to_uuids__fstab(); + foreach (fs::get::fstab($all_hds)) { + _add_uuid_to_swap($_) if $_->{fs_type} eq 'swap' && !$_->{device_UUID}; + } my $fstab = [ fs::get::fstab($all_hds) ]; + + _migrate_to_uuids__fstab($fstab); + my $bootloader_migrated; my $may_migrate = sub { my ($label, $dev_ref) = @_; @@ -264,34 +277,72 @@ sub migrate_to_uuids() { } } -sub _migrate_to_uuids__fstab() { +sub _migrate_to_uuids__fstab { + my ($fstab) = @_; + + my @raw_fstab = fs::read_fstab('', '/etc/fstab', 'keep_freq_passno', 'verbatim_credentials'); + my $fstab_migrated; - foreach my $part (fs::get::really_all_fstab($all_hds)) { - if (_set_prefer_device_UUID($part)) { - log::l("migrate_to_uuids: migrating fstab $part->{device} entry"); - $fstab_migrated = 1; - } + foreach my $part (@raw_fstab) { + _should_prefer_UUID($part) or next; + + my $part_ = find { fs::get::is_same_hd($part, $_) } @$fstab + or log::l("migrate_to_uuids: do not know $part->{device}, cannot migrate it"), next; + + $part->{device_UUID} = $part_->{device_UUID} + or log::l("migrate_to_uuids: no UUID for $part->{device}, cannot migrate it"), next; + $part->{prefer_device_UUID} = 1; + $part->{prefer_device} = 0; + delete $part->{device_alias} if $part->{device_alias} && $part->{device_alias} =~ m!\bmapper/!; # see fs::dmraid::migrate_device_names() for more + + log::l("migrate_to_uuids: migrating fstab $part->{device} entry"); + $fstab_migrated = 1; } if ($fstab_migrated) { cp_af('/etc/fstab', '/etc/fstab.before-migrate-to-uuids'); - fs::write_fstab($all_hds); + + my ($s) = fs::prepare_write_fstab(\@raw_fstab, '', 'keep_smb_credentials'); + output('/etc/fstab', $s); } } sub _migrate_dev_to_uuid { my ($fstab, $dev) = @_; - $dev && $dev =~ m!/dev/! or next; + $dev && $dev =~ m!/dev/! or return; my $part = fs::get::device2part($dev, $fstab); + _should_prefer_UUID($part) or return; $part && $part->{device_UUID} && "UUID=$part->{device_UUID}"; } -sub _set_prefer_device_UUID { +sub _should_prefer_UUID { + my ($part) = @_; + devices::should_prefer_UUID($part->{device}) + || $part->{device} =~ m!\bmapper/!; # we want to migrate dmraid devices, because of xxx1 vs xxxp1 device name issue +} + +# add UUID to swap v.2 in case the swap was created long ago when mkswap didn't do it by default +sub _add_uuid_to_swap { my ($part) = @_; - $part->{device_UUID} && !$part->{prefer_device_UUID} && !$part->{prefer_device_LABEL} or return; - $part->{prefer_device_UUID} = 1; - $part->{prefer_device} = 0; - 1; + + my $ids = fs::type::call_blkid($part); + $ids->{ID_FS_VERSION} eq '2' + or log::l("ERROR: do not know swap version $ids->{ID_FS_VERSION}, so cannot add UUID to it"), return; + + my $uuid = run_program::get_stdout('uuidgen'); + log::l("adding UUID=$uuid to $part->{device}"); + $uuid =~ s/-//g; + $uuid =~ s/(..)/chr(hex($1))/ge; + + { + my $F; + sysopen($F, devices::make($part->{device}), 2) or die "error opening device $part->{device} for writing"; + sysseek($F, 1036, 0) && syswrite($F, $uuid) or log::l("writing UUID failed"); + } + + if (my $p = fs::type::type_subpart_from_magic($part)) { + $part->{device_UUID} = $p->{device_UUID}; + } } #-############################################################################### |
