diff --git a/gbootroot b/gbootroot index b834e85..e3e5f7f 100755 --- a/gbootroot +++ b/gbootroot @@ -511,14 +511,14 @@ else { "mkdir $tmp1/gboot_non_root_$user", "gBootRoot: ERROR: Could not make temporary directory") != 2; } - $tmp = "$tmp1/gboot_non_root_" . $user; + $tmp = "$tmp1/gboot_non_root_$user"; if (!-d "$tmp1/gboot_non_root_mnt_$user") { $mnt = "$tmp1/gboot_non_root_mnt_$user" if err_custom_perl( "mkdir $tmp1/gboot_non_root_mnt_$user", "gBootRoot: ERROR: Could not make mount directory") != 2; } - $mnt = "$tmp1/gboot_non_root_mnt" . $user; + $mnt = "$tmp1/gboot_non_root_mnt_$user"; } @@ -2665,9 +2665,18 @@ sub lilo { sub lilo_put_it_together { my $B = "boot"; + my $fs_type = (split(/\s/,$main::makefs))[0]; + # Time to do a little calculations - my $device_size = (split(/\s+/,`df $mnt`))[8]; - my $boot_size = (stat($container[KERNEL]))[12]/2 + (stat("$tmp/$initrd"))[12]/2; + my $device_size; + if ( $fs_type ne "genext2fs" ) { + $device_size = (split(/\s+/,`df $mnt`))[8]; + } + else { + $device_size = $container[SIZE]; + } + my $boot_size = (stat($container[KERNEL]))[12]/2 + + (stat("$tmp/$initrd"))[12]/2; my $remain_boot = $device_size - $boot_size; pb($B,1); @@ -2680,38 +2689,99 @@ sub lilo_put_it_together { $entry5->set_text("$remain_boot k"); } - # Better do this first + # Here everything is copied over either to the device or the the $mnt + # directory if genext2fs is used. info(0, "Copy over initrd ramdisk\n"); + info(0, "Copy over initrd ramdisk .. $tmp/$initrd $mnt/$initrd\n"); return if err_custom("cp $tmp/$initrd $mnt/$initrd", "gBootRoot: ERROR: Could not copy over initrd") == 2; pb($B,2); info(0, "Copying over kernel\n"); - return if - err_custom("rm -rf $mnt/lost+found; cp $container[KERNEL] $mnt/kernel", - "gBootRoot: ERROR: Could not copy over the kernel") == 2; + if ( $fs_type ne "genext2fs" ) { + return if + err_custom("rm -rf $mnt/lost+found; cp $container[KERNEL] $mnt/kernel", "gBootRoot: ERROR: Could not copy over the kernel") == 2; + } + else { + sys("rm -rf $mnt/*"); + return if + err_custom("cp $container[KERNEL] $mnt/kernel", "gBootRoot: ERROR: Could not copy over the kernel") == 2; + } pb($B,3); info(0, "Making stuff for lilo\n"); # will be 0 if mkdir fails, but 0 if cp succeeds ? return if err(sys("mkdir $mnt/{boot,dev}")) == 2; - return if err(sys("cp -a /dev/{null,fd?,hda1} $mnt/dev")) == 2; - # Hopefully, this works, but have never tested it -- o.k I did - if ($container[BOOT_DEVICE] !~ m,/dev/fd\d{1}$,) { - return if err(sys("cp -a $container[BOOT_DEVICE] $mnt/dev")) == 2; - } + # DEVICES SECTION + my @devices; + my $device_table = "$tmp/boot_device_table.txt"; + my $norm_root_dev; + if ( $fs_type eq "genext2fs" ) { - # This adds that next device - ($norm_root_device) = gdkbirdaao(); - if (!-e "$mnt/dev/$norm_root_device") { - return if err(sys("cp -a /dev/$norm_root_device $mnt/dev")) == 2; - } + info(0, "Making $device_table for genext2fs\n"); + my $error; + unlink( $device_table ) if -e $device_table; + + # + # /dev is always needs to be made automatically + open(BootRoot::Yard::DEVICE_TABLE, ">$device_table") or + ($error = error("$device_table: $!")); + return "ERROR"if $error && $error eq "ERROR"; + + print BootRoot::Yard::DEVICE_TABLE + "# \t\t\t\t\t\t" . + "\t\t\t\n"; + print BootRoot::Yard::DEVICE_TABLE "/dev\t\td\t0755\t-\t-\t-\t-\t-\t-\t-\n"; + + # Keep a record of the devices required + @devices = qw(/dev/null /dev/fd0 /dev/fd1 /dev/hda1); + for ( split(" ", $container[BOOT_DEVICE] ) ) { + push(@devices, $_ ) if $_; + } + + # This adds that next device if found in lilo.conf + ($norm_root_device) = gdkbirdaao(); + if ( $norm_root_device ) { + my @existing_device_test = + grep ( /\/dev\/$norm_root_dev/, @devices ); + if ( !@existing_device_test ) { + push( @devices, "/dev/$norm_root_device" ); + } + } + + # For frame buffer devices and the like. + for ( split(" ", $entry_advanced[1] ) ) { + push(@devices, $_ ) if $_; + } + + device_table( @devices ); + close(BootRoot::Yard::DEVICE_TABLE); - # For frame buffer devices and the like. - if ($entry_advanced[1]) { - return if errcp(sys("cp -a $entry_advanced[1] $mnt/dev")) == 2; } + else { + + info(0, "Copying over devices to $mnt/dev\n"); + + return if err(sys("cp -a /dev/{null,fd?,hda1} $mnt/dev")) == 2; + + # Hopefully, this works, but have never tested it -- o.k I did + if ($container[BOOT_DEVICE] !~ m,/dev/fd\d{1}$,) { + return if err(sys("cp -a $container[BOOT_DEVICE] $mnt/dev")) == 2; + } + + # This adds that next device if found in lilo.conf + ($norm_root_device) = gdkbirdaao(); + if (!-e "$mnt/dev/$norm_root_device") { + return if err(sys("cp -a /dev/$norm_root_device $mnt/dev")) == 2; + } + + # For frame buffer devices and the like. + if ($entry_advanced[1]) { + return if errcp(sys("cp -a $entry_advanced[1] $mnt/dev")) == 2; + } + + } # end DEVICES SECTION info(0, "Copy over important lilo stuff\n"); return if @@ -2733,20 +2803,40 @@ sub lilo_put_it_together { $entry5->set_text("$remain_boot k"); # Got to umount,mount, and umount again to make sure everything is - # copied over before doing lilo - return if errum(sys("umount $mnt")) == 2; - info(0, "Umount device\n"); - info(0, "Remount device\n"); + # copied over before doing lilo unless genext2fs in being used. + if ( $fs_type ne "genext2fs" ) { + return if errum(sys("umount $mnt")) == 2; + info(0, "Umount device\n"); + info(0, "Remount device\n"); + } pb($B,6); # Real device - if ( $> == 0 ) { - return if errm(sys("mount -t ext2 $entry_advanced[0] $mnt")) == 2; + if ( $fs_type ne "genext2fs" ) { + if ( $> == 0 ) { + return if errm(sys("mount -t ext2 $entry_advanced[0] $mnt")) == 2; + } + else { + return if errm(sys("mount $mnt")) == 2; + } } else { - return if errm(sys("mount $mnt")) == 2; + + my $error; + +# + if ( + sys("/usr/lib/bootroot/$main::makefs -b $device_size -d $mnt -D $device_table $entry_advanced[0]") !~ + /^0$/ ) { + $error = error("Cannot $fs_type filesystem.\n"); + return "ERROR" if $error && $error eq "ERROR"; + } + +# + } + info(0, "Configuring lilo\n"); pb($B,7); chdir("$mnt"); #"boot_root: ERROR: Could not change directories\n"; @@ -2754,25 +2844,47 @@ sub lilo_put_it_together { # This enforces that lilo is only ran on a bootable drive, # otherwise the user has to do it manually. if ($container[BOOT_DEVICE] eq $entry_advanced[0]) { - if (err_custom("lilo -v -C brlilo.conf -r $mnt", - "gBootRoot: ERROR: lilo failed") == 2) { - chdir($pwd); return; + +# + if ( err_custom("lilo -v -C brlilo.conf -r $mnt", + "gBootRoot: ERROR: lilo failed") == 2 ) { + chdir($pwd); + + if ( $fs_type eq "genext2fs" && $> != 0 ) { + info(0, "Ask your administrator to add this line to the" . + " fstab file:\n"); + info(0, "\n/dev/fd0\t$mnt\tauto\tdefaults,noauto,user\t0\t0\n\n"); + } + else { + return; + } } +# + } + $remain_boot = $remain_boot - (stat("$mnt/boot/map"))[12]/2; $entry5->set_text("$remain_boot k"); pb($B,8); chdir($pwd); # or die "boot_root: ERROR: Could not change directories\n"; - info(0, "Umounting $mnt\n"); - my $um = errum(sys("umount $mnt")); - pb($B,10); + my $um; + if ( $fs_type ne "genext2fs" ) { + info(0, "Umounting $mnt\n"); + $um = errum(sys("umount $mnt")); + pb($B,10); + } + else { + $um = 0; + } if ($ok == 1 || $ok == 2) { - return if - errrm(sys("rmdir $tmp/initrd_mnt")) == 2; + if ( $fs_type ne "genext2fs" ) { + return if + errrm(sys("rmdir $tmp/initrd_mnt")) == 2; + } } # Here's where we copy over that compressed filesystem @@ -3334,7 +3446,6 @@ sub initrd { else { - if ( $> == 0 ) { info(0, "Copying over devices to $tmp/initrd_mnt/dev\n"); return if errcp( @@ -3354,7 +3465,7 @@ sub initrd { sys("$main::sudo mknod b 2 0 $tmp/initrd_mnt/dev/fd0"); } - } + } # end DEVICES SECTION pb($I,7); @@ -3510,16 +3621,18 @@ sub initrd { if ( sys("/usr/lib/bootroot/$main::makefs -b $size_needed -d $tmp/initrd_mnt -D $device_table $tmp/$initrd") !~ /^0$/ ) { - $error = error("Cannot $fs_type filesystem."); + $error = error("Cannot $fs_type filesystem.\n"); return "ERROR" if $error && $error eq "ERROR"; } - info(0, "Compressing initrd\n"); } + else { info(0, "Umounting loop device, and compressing initrd\n"); return if errum(sys("umount $tmp/initrd_mnt")) == 2; } + + info(0, "Compressing initrd\n"); sys("gzip -f9 $tmp/$initrd"); pb($I,10); # This takes the longest. @@ -3729,6 +3842,8 @@ sub mtab_check { my $dialog; my $error = 1; + + my $fs_type = (split(/\s/,$main::makefs))[0]; # Check to see if $device is mounted open (MTAB, "/etc/mtab") or die "no mtab!\n"; @@ -3737,7 +3852,7 @@ sub mtab_check { if ($count == 1) { # ROOT_DEVICE - if (m,$entry_advanced[3],) { + if ( m,$entry_advanced[3], && $fs_type ne "genext2fs" ) { # Safety Check: $dialog = "Please umount the device first.\nPress OK when you are ready."; @@ -3746,7 +3861,7 @@ sub mtab_check { } - elsif ($count == 0) { + elsif ( $count == 0 && $fs_type ne "genext2fs" ) { # BOOT_DEVICE if (m,$entry_advanced[0],) { @@ -3765,7 +3880,7 @@ sub mtab_check { # Make sure the drive and storage medium are accessible # Keep asking until they are. - if ($error == 1) { + if ( $error == 1 && $fs_type ne "genext2fs" ) { destroy $mtab; # $size has to be determined by boot disk or root disk @@ -3813,6 +3928,13 @@ sub mtab_check { } # if $error == 1 + if ( $fs_type eq "genext2fs" ) { + + lilo_put_it_together() if $count == 0; # mtab(1) runs from here + device2() if $count == 1; + + } + } # end sub mtab_check ##################