mirror of
https://github.com/fspc/gbootroot.git
synced 2025-02-23 17:13:22 -05:00
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.
This commit is contained in:
parent
4592b76a91
commit
cde7f50f3f
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.
|
||||||
@ -3729,6 +3842,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";
|
||||||
@ -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…
x
Reference in New Issue
Block a user