diff options
author | Olivier Blin <oblin@mandriva.com> | 2007-11-05 19:07:43 +0000 |
---|---|---|
committer | Olivier Blin <oblin@mandriva.com> | 2007-11-05 19:07:43 +0000 |
commit | b03e57801b01b455e24fb63c8608637453723296 (patch) | |
tree | a6ee1065d27a34d6146a357de9997551996c2660 | |
parent | 7fb9052ca741c2e51c1db56d62b28ec796d13dea (diff) | |
download | draklive-b03e57801b01b455e24fb63c8608637453723296.tar draklive-b03e57801b01b455e24fb63c8608637453723296.tar.gz draklive-b03e57801b01b455e24fb63c8608637453723296.tar.bz2 draklive-b03e57801b01b455e24fb63c8608637453723296.tar.xz draklive-b03e57801b01b455e24fb63c8608637453723296.zip |
compute media dirs on the fly instead of hardcoding at start (to support CD-Rom boot images with non-hidden media directories)
-rwxr-xr-x | draklive | 73 |
1 files changed, 47 insertions, 26 deletions
@@ -129,6 +129,7 @@ my %storage = ( modules => 'bus/usb disk/hardware_raid|ide|sata|scsi|usb', media_modules => 'disk/cdrom', fs => 'iso9660', + can_hide => 0, source => 'LABEL=MDVCDROOT', read_only => 1, detect => \&detect_devices::burners, @@ -141,6 +142,7 @@ my %storage = ( modules => 'bus/usb disk/usb', media_modules => 'disk/raw', fs => 'vfat', + can_hide => 1, bootloader => 'grub', source => 'LABEL=MDVUSBROOT', detect => sub { grep { detect_devices::isKeyUsb($_) } detect_devices::get() }, @@ -235,8 +237,9 @@ my %loop = ( mount => sub { my ($live, $dir) = @_; $dir->{loop} = "/dev/loop" . $loop_number++; + my $media_loopbacks = get_media_prefix($live, 'loopbacks'); ( - "/bin/losetup $dir->{loop} $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}$live->{prefix}{media}{loopbacks}$dir->{path}", + "/bin/losetup $dir->{loop} $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}${media_loopbacks}$dir->{path}", "mount -o ro -t squashfs $dir->{loop} $live->{prefix}{live}{mnt}$dir->{mountpoint}", ); }, @@ -246,7 +249,8 @@ my %loop = ( delay_mount => 1, mount => sub { my ($live, $dir) = @_; - "sh -c 'modules=; for m in $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}$live->{prefix}{media}{loopbacks}$dir->{path}/*; do n=\$(basename \$m); n=\${n%.sqfs}; d=$live->{prefix}{live}{mnt}$dir->{mountpoint}/\$n; mkdir -p \$d; mount -n -o loop,ro -t squashfs \$m \$d && modules=\$modules\$d=ro:; done; echo \$modules | sed -e s/:\$// > $dir->{list}'"; + my $media_loopbacks = get_media_prefix($live, 'loopbacks'); + "sh -c 'modules=; for m in $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}${media_loopbacks}$dir->{path}/*; do n=\$(basename \$m); n=\${n%.sqfs}; d=$live->{prefix}{live}{mnt}$dir->{mountpoint}/\$n; mkdir -p \$d; mount -n -o loop,ro -t squashfs \$m \$d && modules=\$modules\$d=ro:; done; echo \$modules | sed -e s/:\$// > $dir->{list}'"; }, }, loopfs => { @@ -264,8 +268,9 @@ my %loop = ( my ($live, $dir) = @_; $dir->{loop} = "/dev/loop" . $loop_number++; my $fsck = "chroot </dev/tty1 $live->{prefix}{live}{mnt}$dir_distrib_sqfs->{mountpoint} /sbin/fsck $dir->{loop}"; + my $media_loopbacks = get_media_prefix($live, 'loopbacks'); ( - "losetup $dir->{loop} $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}$live->{prefix}{media}{loopbacks}$dir->{path}", + "losetup $dir->{loop} $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}${media_loopbacks}$dir->{path}", qq(sh -c "$fsck -a || $fsck -y"), "mount -t $dir->{fs} $dir->{loop} $live->{prefix}{live}{mnt}$dir->{mountpoint}", ); @@ -614,8 +619,9 @@ sub build_syslinux_cfg { my $append = get_default_append($live); #- syslinux wants files at root (used with vfat fs) my $to_root = get_boot_setting($media, 'fs', $opts) eq 'vfat'; + my $boot = get_media_prefix($live, 'boot', $opts->{boot}); my ($initrd, $kernel, $bootlogo, $help) = map { $to_root ? basename($_) : $_ } - map { $live->{prefix}{media}{boot} . $_ } get_initrd_path($media), @syslinux_boot_files; + map { $boot . $_ } get_initrd_path($media), @syslinux_boot_files; my $has_bootlogo = $live->{system}{gfxboot} && -e get_builddir($live) . $live->{prefix}{build}{boot} . '/syslinux/bootlogo'; my $timeout = get_bootloader_timeout($live) * 10; @@ -640,15 +646,16 @@ sub build_grub_cfg { #- FIXME: use the bootloader module from drakx my ($part_nb) = $device =~ /(\d+)$/; my $grub_part = "(hd0" . (defined $part_nb ? "," . ($part_nb-1) : "") . ")"; + my $boot = get_media_prefix($live, 'boot'); #- FIXME handle boot media join("\n", "timeout " . get_bootloader_timeout($live), - if_($live->{system}{gfxboot}, "gfxmenu $grub_part" . $live->{prefix}{media}{boot} . "/gfxmenu"), + if_($live->{system}{gfxboot}, "gfxmenu $grub_part" . $boot . "/gfxmenu"), "default 0", (map { my ($name, $cmdline) = @$_; "title " . $live->{media}{title} . if_($name, " ($name)"), - "kernel $grub_part" . $live->{prefix}{media}{boot} . "/vmlinuz " . get_default_append($live) . if_($cmdline, " $cmdline"), - "initrd " . $live->{prefix}{media}{boot} . get_initrd_path($media); + "kernel $grub_part" . $boot . "/vmlinuz " . get_default_append($live) . if_($cmdline, " $cmdline"), + "initrd " . $boot . get_initrd_path($media); } group_by2('' => '', @{$live->{system}{boot_entries}})), "", ); @@ -689,9 +696,10 @@ sub configure_draklive_resize { my $resizable_loopback = find { $_->{min_size} } @{$live->{mount}{dirs} || []}; if ($resizable_loopback) { + my $media_loopbacks = get_media_prefix($live, 'loopbacks'); output(get_system_root($live) . '/etc/sysconfig/draklive-resize', <<EOF); DRAKLIVE_RESIZE=yes -LOOPBACK=$live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}$live->{prefix}{media}{loopbacks}$resizable_loopback->{path} +LOOPBACK=$live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}${media_loopbacks}$resizable_loopback->{path} TYPE=$resizable_loopback->{fs} MIN_SIZE=$resizable_loopback->{min_size} MOUNT=$live->{prefix}{live}{mnt}$resizable_loopback->{mountpoint}_resized @@ -949,6 +957,13 @@ sub get_media_device { $device; } +sub get_media_prefix { + my ($live, $setting, $o_boot) = @_; + my $hidden = $live->{system}{hide_media_dirs} && get_boot_setting($live->{media}, 'can_hide', { boot => $o_boot }); + use Data::Dumper; print Dumper($setting, $o_boot, $hidden); + $live->{prefix}{media}{$hidden ? "hidden_$setting" : $setting}; +} + sub get_media_source_for_nash { my ($media) = @_; my $label = get_media_label($media); @@ -1054,10 +1069,10 @@ sub create_cdrom_master { 'isolinux=' . get_builddir($live) . $live->{prefix}{build}{boot} . '/syslinux', 'isolinux/isolinux.bin=/usr/lib/syslinux/isolinux.bin', 'isolinux/isolinux.cfg=' . get_builddir($live) . $live->{prefix}{build}{boot} . get_syslinux_path($live->{media}, $opts), - $live->{prefix}{media}{boot} . '=' . get_builddir($live) . $live->{prefix}{build}{boot}, + get_media_prefix($live, 'boot', $opts->{boot}) . '=' . get_builddir($live) . $live->{prefix}{build}{boot}, if_(!$opts->{boot_only}, (map { - $live->{prefix}{media}{loopbacks} . $_ . + get_media_prefix($live, 'loopbacks', $opts->{boot}) . $_ . '=' . get_builddir($live) . $live->{prefix}{build}{loopbacks} . $_; } list_selected_loopbacks($live)), @@ -1145,6 +1160,9 @@ sub record_cdrom_master { sub record_usb_master { my ($live, $opts) = @_; my $media = $live->{media}; + my $media_boot = get_media_prefix($live, 'boot', $opts->{boot}); + my $media_loopbacks = get_media_prefix($live, 'loopbacks', $opts->{boot}); + if (my $label = !$opts->{boot_only} && $opts->{device} && get_media_label($media)) { set_device_label($opts->{device}, get_media_setting($media, 'fs'), $label); } @@ -1155,10 +1173,10 @@ sub record_usb_master { mkdir_p($live->{mnt}); run_('mount', if_(-f $device, '-o', 'loop'), $device, $live->{mnt}) or die "unable to mount $device\n"; - rm_rf($live->{mnt} . $live->{prefix}{media}{boot}) if -e $live->{mnt} . $live->{prefix}{media}{boot}; - cp_af(get_builddir($live) . $live->{prefix}{build}{boot}, $live->{mnt} . $live->{prefix}{media}{boot}); + rm_rf($live->{mnt} . $media_boot) if -e $live->{mnt} . $media_boot; + cp_af(get_builddir($live) . $live->{prefix}{build}{boot}, $live->{mnt} . $media_boot); - my $grub_device_map = $live->{mnt} . $live->{prefix}{media}{boot} . "/grub/device.map"; + my $grub_device_map = $live->{mnt} . $media_boot . "/grub/device.map"; if ($bootloader eq 'syslinux') { cp_f(get_builddir($live) . $_, $live->{mnt}) foreach map { $live->{prefix}{boot} . $_; @@ -1166,9 +1184,9 @@ sub record_usb_master { } elsif ($bootloader eq 'grub') { #- FIXME: add get_grub_path (when building boot configuration files) # and get_bootloader_path (when copying) - mkdir_p($live->{mnt} . $live->{prefix}{media}{boot} . '/grub'); - cp_f(get_builddir($live) . $live->{prefix}{build}{boot} . '/gfxmenu', $live->{mnt} . $live->{prefix}{media}{boot}); - output_p($live->{mnt} . $live->{prefix}{media}{boot} . '/grub/menu.lst', build_grub_cfg($live, $media, $device)); + mkdir_p($live->{mnt} . $media_boot . '/grub'); + cp_f(get_builddir($live) . $live->{prefix}{build}{boot} . '/gfxmenu', $live->{mnt} . $media_boot); + output_p($live->{mnt} . $media_boot . '/grub/menu.lst', build_grub_cfg($live, $media, $device)); unlink $grub_device_map; } @@ -1184,8 +1202,8 @@ sub record_usb_master { my $root = get_system_root($live); substInFile { s!^\s*exec_prefix=.*!exec_prefix=$root!; - s!^\s*grub_prefix=/boot/!grub_prefix=$live->{prefix}{media}{boot}/!; - s!^\s*bootdir=(.*)/boot$!bootdir=$1$live->{prefix}{media}{boot}!; + s!^\s*grub_prefix=/boot/!grub_prefix=${media_boot}/!; + s!^\s*bootdir=(.*)/boot$!bootdir=$1${media_boot}!; } $local_grub_install; my $master_device = $device; @@ -1220,7 +1238,7 @@ sub record_usb_master { } } : sub {}, 'rsync', '-vdP', '--inplace', '--files-from=' . $list_file, - $loopbacks_source, $live->{mnt} . $live->{prefix}{media}{loopbacks}, + $loopbacks_source, $live->{mnt} . $media_loopbacks, ); unlink $list_file; if (!$r) { @@ -1240,7 +1258,7 @@ sub record_usb_master { if (get_media_setting($media, 'fs') eq 'vfat') { mtools_run_('mattrib', '+h', '-i', $device, '::' . $_) foreach @hidden_files; mtools_run_('mattrib', '+r', '+s', '-/', '-i', $device, '::' . $_) - foreach $live->{prefix}{media}{boot}, $live->{prefix}{media}{loopbacks}; + foreach $media_boot, $media_loopbacks; } } @@ -1315,7 +1333,9 @@ sub copy_wizard { file => N("Select a file"), ); my ($source_type, $source_path); - my $source_is_mounted = sub { -d ($live->{settings}{builddir} . $live->{prefix}{media}{boot}) }; + my $media_boot = get_media_prefix($live, 'boot'); + my $media_loopbacks = get_media_prefix($live, 'loopbacks'); + my $source_is_mounted = sub { -d ($live->{settings}{builddir} . $media_boot) }; my $umount_source = sub { if ($source_type ne 'live' && $source_is_mounted->()) { run_('umount', $live->{settings}{builddir}); @@ -1333,7 +1353,7 @@ sub copy_wizard { }, source => { name => N("Which live system do you want to copy?"), - data => [ if_(-d ($live_media . $live->{prefix}{media}{loopbacks}), + data => [ if_(-d ($live_media . $media_loopbacks), { type => 'list', val => \$source_type, list => sort(keys(%source_types)), format => sub { $source_types{$_[0]} } }), @@ -1353,7 +1373,7 @@ sub copy_wizard { 0; }, post => sub { - my $boot = $live->{settings}{builddir} . $live->{prefix}{media}{boot}; + my $boot = $live->{settings}{builddir} . $media_boot; @available_storage = sort(grep { -d "$boot/$_" && exists $storage{$_}{detect} } all($boot)); if (@available_storage == 1) { $storage = $available_storage[0]; @@ -1469,9 +1489,10 @@ sub complete_config { scripts => '/scripts', }, media => { - # FIXME: CDROM image for USB systems use wrong boot directory - boot => $live->{system}{hide_media_dirs} ? '/.boot' : '/boot', - loopbacks => $live->{system}{hide_media_dirs} ? '/.loopbacks' : '/loopbacks', + boot => '/boot', + hidden_boot => '/.boot', + loopbacks => '/loopbacks', + hidden_loopbacks => '/.loopbacks', mnt => '/media', }, live => { |