Browse Source

Almost have genextfs done for boot, now just have to use a smaller kernel,

and put everything somewhere else besides $mnt, so that lilo can do its
thing on a real device assuming fstab is edited for a non-root user.
master
freesource 23 years ago
parent
commit
cde7f50f3f
  1. 208
      gbootroot

208
gbootroot

@ -511,14 +511,14 @@ else {
"mkdir $tmp1/gboot_non_root_$user", "mkdir $tmp1/gboot_non_root_$user",
"gBootRoot: ERROR: Could not make temporary directory") != 2; "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") { if (!-d "$tmp1/gboot_non_root_mnt_$user") {
$mnt = "$tmp1/gboot_non_root_mnt_$user" if err_custom_perl( $mnt = "$tmp1/gboot_non_root_mnt_$user" if err_custom_perl(
"mkdir $tmp1/gboot_non_root_mnt_$user", "mkdir $tmp1/gboot_non_root_mnt_$user",
"gBootRoot: ERROR: Could not make mount directory") != 2; "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 { sub lilo_put_it_together {
my $B = "boot"; my $B = "boot";
my $fs_type = (split(/\s/,$main::makefs))[0];
# Time to do a little calculations # Time to do a little calculations
my $device_size = (split(/\s+/,`df $mnt`))[8]; my $device_size;
my $boot_size = (stat($container[KERNEL]))[12]/2 + (stat("$tmp/$initrd"))[12]/2; 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; my $remain_boot = $device_size - $boot_size;
pb($B,1); pb($B,1);
@ -2680,38 +2689,99 @@ sub lilo_put_it_together {
$entry5->set_text("$remain_boot k"); $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\n");
info(0, "Copy over initrd ramdisk .. $tmp/$initrd $mnt/$initrd\n");
return if err_custom("cp $tmp/$initrd $mnt/$initrd", return if err_custom("cp $tmp/$initrd $mnt/$initrd",
"gBootRoot: ERROR: Could not copy over initrd") == 2; "gBootRoot: ERROR: Could not copy over initrd") == 2;
pb($B,2); pb($B,2);
info(0, "Copying over kernel\n"); info(0, "Copying over kernel\n");
return if if ( $fs_type ne "genext2fs" ) {
err_custom("rm -rf $mnt/lost+found; cp $container[KERNEL] $mnt/kernel", return if
"gBootRoot: ERROR: Could not copy over the kernel") == 2; 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); pb($B,3);
info(0, "Making stuff for lilo\n"); info(0, "Making stuff for lilo\n");
# will be 0 if mkdir fails, but 0 if cp succeeds ? # will be 0 if mkdir fails, but 0 if cp succeeds ?
return if err(sys("mkdir $mnt/{boot,dev}")) == 2; 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 # DEVICES SECTION
if ($container[BOOT_DEVICE] !~ m,/dev/fd\d{1}$,) { my @devices;
return if err(sys("cp -a $container[BOOT_DEVICE] $mnt/dev")) == 2; my $device_table = "$tmp/boot_device_table.txt";
} my $norm_root_dev;
if ( $fs_type eq "genext2fs" ) {
# This adds that next device info(0, "Making $device_table for genext2fs\n");
($norm_root_device) = gdkbirdaao(); my $error;
if (!-e "$mnt/dev/$norm_root_device") { unlink( $device_table ) if -e $device_table;
return if err(sys("cp -a /dev/$norm_root_device $mnt/dev")) == 2;
} #<path> <type> <mode> <uid> <gid> <major> <minor> <start><inc><count>
# /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
"# <path>\t<type>\t<mode>\t<uid>\t<gid>\t<major>\t<minor>" .
"\t<start>\t<inc>\t<count>\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"); info(0, "Copy over important lilo stuff\n");
return if return if
@ -2733,20 +2803,40 @@ sub lilo_put_it_together {
$entry5->set_text("$remain_boot k"); $entry5->set_text("$remain_boot k");
# Got to umount,mount, and umount again to make sure everything is # Got to umount,mount, and umount again to make sure everything is
# copied over before doing lilo # copied over before doing lilo unless genext2fs in being used.
return if errum(sys("umount $mnt")) == 2; if ( $fs_type ne "genext2fs" ) {
info(0, "Umount device\n"); return if errum(sys("umount $mnt")) == 2;
info(0, "Remount device\n"); info(0, "Umount device\n");
info(0, "Remount device\n");
}
pb($B,6); pb($B,6);
# Real device # Real device
if ( $> == 0 ) { if ( $fs_type ne "genext2fs" ) {
return if errm(sys("mount -t ext2 $entry_advanced[0] $mnt")) == 2; if ( $> == 0 ) {
return if errm(sys("mount -t ext2 $entry_advanced[0] $mnt")) == 2;
}
else {
return if errm(sys("mount $mnt")) == 2;
}
} }
else { 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"); info(0, "Configuring lilo\n");
pb($B,7); pb($B,7);
chdir("$mnt"); #"boot_root: ERROR: Could not change directories\n"; 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, # This enforces that lilo is only ran on a bootable drive,
# otherwise the user has to do it manually. # otherwise the user has to do it manually.
if ($container[BOOT_DEVICE] eq $entry_advanced[0]) { 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; $remain_boot = $remain_boot - (stat("$mnt/boot/map"))[12]/2;
$entry5->set_text("$remain_boot k"); $entry5->set_text("$remain_boot k");
pb($B,8); pb($B,8);
chdir($pwd); # or die "boot_root: ERROR: Could not change directories\n"; chdir($pwd); # or die "boot_root: ERROR: Could not change directories\n";
info(0, "Umounting $mnt\n"); my $um;
my $um = errum(sys("umount $mnt")); if ( $fs_type ne "genext2fs" ) {
pb($B,10); info(0, "Umounting $mnt\n");
$um = errum(sys("umount $mnt"));
pb($B,10);
}
else {
$um = 0;
}
if ($ok == 1 || $ok == 2) { if ($ok == 1 || $ok == 2) {
return if if ( $fs_type ne "genext2fs" ) {
errrm(sys("rmdir $tmp/initrd_mnt")) == 2; return if
errrm(sys("rmdir $tmp/initrd_mnt")) == 2;
}
} }
# Here's where we copy over that compressed filesystem # Here's where we copy over that compressed filesystem
@ -3334,7 +3446,6 @@ sub initrd {
else { else {
if ( $> == 0 ) { if ( $> == 0 ) {
info(0, "Copying over devices to $tmp/initrd_mnt/dev\n"); info(0, "Copying over devices to $tmp/initrd_mnt/dev\n");
return if errcp( return if errcp(
@ -3354,7 +3465,7 @@ sub initrd {
sys("$main::sudo mknod b 2 0 $tmp/initrd_mnt/dev/fd0"); sys("$main::sudo mknod b 2 0 $tmp/initrd_mnt/dev/fd0");
} }
} } # end DEVICES SECTION
pb($I,7); pb($I,7);
@ -3510,16 +3621,18 @@ sub initrd {
if ( if (
sys("/usr/lib/bootroot/$main::makefs -b $size_needed -d $tmp/initrd_mnt -D $device_table $tmp/$initrd") !~ sys("/usr/lib/bootroot/$main::makefs -b $size_needed -d $tmp/initrd_mnt -D $device_table $tmp/$initrd") !~
/^0$/ ) { /^0$/ ) {
$error = error("Cannot $fs_type filesystem."); $error = error("Cannot $fs_type filesystem.\n");
return "ERROR" if $error && $error eq "ERROR"; return "ERROR" if $error && $error eq "ERROR";
} }
info(0, "Compressing initrd\n");
} }
else { else {
info(0, "Umounting loop device, and compressing initrd\n"); info(0, "Umounting loop device, and compressing initrd\n");
return if errum(sys("umount $tmp/initrd_mnt")) == 2; return if errum(sys("umount $tmp/initrd_mnt")) == 2;
} }
info(0, "Compressing initrd\n");
sys("gzip -f9 $tmp/$initrd"); sys("gzip -f9 $tmp/$initrd");
pb($I,10); # This takes the longest. pb($I,10); # This takes the longest.
@ -3730,6 +3843,8 @@ sub mtab_check {
my $dialog; my $dialog;
my $error = 1; my $error = 1;
my $fs_type = (split(/\s/,$main::makefs))[0];
# Check to see if $device is mounted # Check to see if $device is mounted
open (MTAB, "/etc/mtab") or die "no mtab!\n"; open (MTAB, "/etc/mtab") or die "no mtab!\n";
while (<MTAB>) { while (<MTAB>) {
@ -3737,7 +3852,7 @@ sub mtab_check {
if ($count == 1) { if ($count == 1) {
# ROOT_DEVICE # ROOT_DEVICE
if (m,$entry_advanced[3],) { if ( m,$entry_advanced[3], && $fs_type ne "genext2fs" ) {
# Safety Check: # Safety Check:
$dialog = $dialog =
"Please umount the device first.\nPress OK when you are ready."; "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 # BOOT_DEVICE
if (m,$entry_advanced[0],) { if (m,$entry_advanced[0],) {
@ -3765,7 +3880,7 @@ sub mtab_check {
# Make sure the drive and storage medium are accessible # Make sure the drive and storage medium are accessible
# Keep asking until they are. # Keep asking until they are.
if ($error == 1) { if ( $error == 1 && $fs_type ne "genext2fs" ) {
destroy $mtab; destroy $mtab;
# $size has to be determined by boot disk or root disk # $size has to be determined by boot disk or root disk
@ -3813,6 +3928,13 @@ sub mtab_check {
} # if $error == 1 } # 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 } # end sub mtab_check
################## ##################

Loading…
Cancel
Save