mirror of
https://github.com/fspc/gbootroot.git
synced 2025-02-23 17:13:22 -05:00
This almost creates a successful normal user boot disk .. but doesn't find /dev/fd0 despite
its existence. Also, rootdisk isn't created yet. Getting pretty close.
This commit is contained in:
parent
2eff37e59b
commit
e507aa375e
248
gbootroot
248
gbootroot
@ -273,6 +273,10 @@ my $modules_directory = "/lib/modules";
|
|||||||
if ( $> != 0 && -e "/usr/lib/bootroot/genext2fs" ) {
|
if ( $> != 0 && -e "/usr/lib/bootroot/genext2fs" ) {
|
||||||
$main::makefs = "genext2fs -z -r0 -i8192";
|
$main::makefs = "genext2fs -z -r0 -i8192";
|
||||||
}
|
}
|
||||||
|
# This is for experimental stuff .. basically so I can test
|
||||||
|
# the boot fs as a normal user, since it's hard to create a boot disk
|
||||||
|
# with enough room using genext2fs, otherwise.
|
||||||
|
my $busybox = 1;
|
||||||
|
|
||||||
|
|
||||||
# Yard Stuff
|
# Yard Stuff
|
||||||
@ -331,7 +335,9 @@ my @original_container;
|
|||||||
my $file_dialog;
|
my $file_dialog;
|
||||||
|
|
||||||
my $mtab;
|
my $mtab;
|
||||||
my ($tmp,$mnt);
|
# $old_mount is used for a little swapping magic when a normal user
|
||||||
|
# is using genext2fs and lilo.
|
||||||
|
my ($tmp, $mnt, $old_mount);
|
||||||
my $norm_root_device;
|
my $norm_root_device;
|
||||||
my ($hbox_advanced);
|
my ($hbox_advanced);
|
||||||
my $separator_advanced;
|
my $separator_advanced;
|
||||||
@ -2707,7 +2713,7 @@ sub lilo_put_it_together {
|
|||||||
|
|
||||||
# If genext2fs is being used clean $tmp/bootdisk if any garbage is found,
|
# If genext2fs is being used clean $tmp/bootdisk if any garbage is found,
|
||||||
# and temporarily rename $mnt to that directory.
|
# and temporarily rename $mnt to that directory.
|
||||||
my $old_mount;
|
#my $old_mount;
|
||||||
if ( $fs_type eq "genext2fs" ) {
|
if ( $fs_type eq "genext2fs" ) {
|
||||||
if (-d "$tmp/bootdisk") {
|
if (-d "$tmp/bootdisk") {
|
||||||
sys("rm -rf $tmp/bootdisk");
|
sys("rm -rf $tmp/bootdisk");
|
||||||
@ -2824,7 +2830,13 @@ sub lilo_put_it_together {
|
|||||||
|
|
||||||
# Write out the HEREDOCS
|
# Write out the HEREDOCS
|
||||||
open(LC, ">$mnt/brlilo.conf") or die "Couldn't write $mnt/brlilo.conf\n";
|
open(LC, ">$mnt/brlilo.conf") or die "Couldn't write $mnt/brlilo.conf\n";
|
||||||
print LC brlilo($container[BOOT_DEVICE]); close(LC);
|
if ( $> == 0 ) {
|
||||||
|
print LC brlilo($container[BOOT_DEVICE]); close(LC);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print LC brlilo_non_root($container[BOOT_DEVICE]); close(LC);
|
||||||
|
}
|
||||||
|
|
||||||
open(M, ">$mnt/message") or die "Couldn't write $mnt/message\n";
|
open(M, ">$mnt/message") or die "Couldn't write $mnt/message\n";
|
||||||
print M message(); close(M);
|
print M message(); close(M);
|
||||||
pb($B,5);
|
pb($B,5);
|
||||||
@ -2844,10 +2856,15 @@ sub lilo_put_it_together {
|
|||||||
|
|
||||||
if ( $fs_type eq "genext2fs" ) {
|
if ( $fs_type eq "genext2fs" ) {
|
||||||
|
|
||||||
|
# info(0,"HERE /usr/lib/bootroot/$main::makefs -b $device_size -d $mnt -D $device_table $entry_advanced[0]");
|
||||||
|
|
||||||
my $error;
|
my $error;
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# When creating a fs on floppy, specifying -i causes genext2fs to fail,
|
||||||
|
# its better to just let the program figure out the inode size for now.
|
||||||
if (
|
if (
|
||||||
sys("/usr/lib/bootroot/$main::makefs -b $device_size -d $mnt -D $device_table $entry_advanced[0]") !~
|
sys("/usr/lib/bootroot/genext2fs -z -b $device_size -d $mnt -D $device_table $entry_advanced[0]") !~
|
||||||
/^0$/ ) {
|
/^0$/ ) {
|
||||||
$error = error("Cannot $fs_type filesystem.\n");
|
$error = error("Cannot $fs_type filesystem.\n");
|
||||||
return "ERROR" if $error && $error eq "ERROR";
|
return "ERROR" if $error && $error eq "ERROR";
|
||||||
@ -2877,6 +2894,7 @@ sub lilo_put_it_together {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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";
|
||||||
@ -2885,10 +2903,26 @@ sub lilo_put_it_together {
|
|||||||
# 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",
|
# root can happily chroot
|
||||||
"gBootRoot: ERROR: lilo failed") == 2 ) {
|
if ( $> == 0 ) {
|
||||||
chdir($pwd);
|
|
||||||
return;
|
if ( err_custom("lilo -v -C brlilo.conf -r $mnt",
|
||||||
|
"gBootRoot: ERROR: lilo failed") == 2 ) {
|
||||||
|
chdir($pwd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# At this point the normal user needs to be asked first if they have
|
||||||
|
# root lilo power, before going on.
|
||||||
|
else {
|
||||||
|
|
||||||
|
if ( err_custom("$main::sudo lilo -v -C $mnt/brlilo.conf -b $entry_advanced[0]", "gBootRoot: ERROR: lilo failed") == 2 ) {
|
||||||
|
chdir($pwd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#
|
#
|
||||||
}
|
}
|
||||||
@ -3421,6 +3455,15 @@ sub initrd {
|
|||||||
$device = $entry_advanced[3];
|
$device = $entry_advanced[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
my $fs_type = (split(/\s/,$main::makefs))[0];
|
||||||
|
|
||||||
|
if ( $fs_type eq "genext2fs" ) {
|
||||||
|
if ( $compress eq "bzip2" ) {
|
||||||
|
$compress = "bunzip2";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
my $broot_image = basename($root_image);
|
my $broot_image = basename($root_image);
|
||||||
open(LC, ">$tmp/linuxrc") or die "Couldn't write linuxrc to loop device\n";
|
open(LC, ">$tmp/linuxrc") or die "Couldn't write linuxrc to loop device\n";
|
||||||
print LC initrd_heredoc($broot_image,$device); close(LC);
|
print LC initrd_heredoc($broot_image,$device); close(LC);
|
||||||
@ -3428,8 +3471,6 @@ sub initrd {
|
|||||||
my $size_needed = initrd_size((stat("$tmp/linuxrc"))[12]/2);
|
my $size_needed = initrd_size((stat("$tmp/linuxrc"))[12]/2);
|
||||||
unlink("$tmp/linuxrc");
|
unlink("$tmp/linuxrc");
|
||||||
|
|
||||||
my $fs_type = (split(/\s/,$main::makefs))[0];
|
|
||||||
|
|
||||||
|
|
||||||
if ( $fs_type ne "genext2fs" ) {
|
if ( $fs_type ne "genext2fs" ) {
|
||||||
|
|
||||||
@ -3495,8 +3536,10 @@ sub initrd {
|
|||||||
pb($I,6);
|
pb($I,6);
|
||||||
|
|
||||||
# Hopefully, this works, but have never tested it - o.k I did
|
# Hopefully, this works, but have never tested it - o.k I did
|
||||||
if ($container[BOOT_DEVICE] !~ m,/dev/fd\d{1}$,) {
|
if ( $fs_type ne "genext2fs" ) {
|
||||||
return if err(sys("cp -a $container[BOOT_DEVICE] $mnt/dev")) == 2;
|
if ($container[BOOT_DEVICE] !~ m,/dev/fd\d{1}$,) {
|
||||||
|
return if err(sys("cp -a $container[BOOT_DEVICE] $mnt/dev")) == 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# DEVICES SECTION
|
# DEVICES SECTION
|
||||||
@ -3619,14 +3662,16 @@ sub initrd {
|
|||||||
|
|
||||||
# Will put the stuff in sbin because the is where the kernel looks for
|
# Will put the stuff in sbin because the is where the kernel looks for
|
||||||
# modprobe.
|
# modprobe.
|
||||||
foreach (@initrd_stuff) {
|
if ( ! $busybox ) {
|
||||||
($path,$value) = stripper(find_file_in_path($_),"bin");
|
|
||||||
$value == 0 ? ($tool = "cp -a") : ($tool = "mv");
|
foreach (@initrd_stuff) {
|
||||||
if (!$path) {
|
($path,$value) = stripper(find_file_in_path($_),"bin");
|
||||||
info(1,"gBootRoot Error: Couldn't find $_\n");
|
$value == 0 ? ($tool = "cp -a") : ($tool = "mv");
|
||||||
|
if (!$path) {
|
||||||
|
info(1,"gBootRoot Error: Couldn't find $_\n");
|
||||||
|
}
|
||||||
|
return if errcp(sys("$tool $path $tmp/initrd_mnt/sbin")) == 2;
|
||||||
}
|
}
|
||||||
return if errcp(sys("$tool $path $tmp/initrd_mnt/sbin")) == 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($compress eq "bzip2" && -e find_file_in_path($compress)) {
|
if ($compress eq "bzip2" && -e find_file_in_path($compress)) {
|
||||||
($path,$value) = stripper(find_file_in_path($compress),"bin");
|
($path,$value) = stripper(find_file_in_path($compress),"bin");
|
||||||
@ -3634,56 +3679,98 @@ sub initrd {
|
|||||||
return if errcp(sys("$tool $path $tmp/initrd_mnt/sbin")) == 2;
|
return if errcp(sys("$tool $path $tmp/initrd_mnt/sbin")) == 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Testing if init is sufficient for grabbing the correct libraries for the
|
# Testing if init is sufficient for grabbing the correct libraries for the
|
||||||
# executables immediately above. This could be modified to test a
|
# executables immediately above. This could be modified to test a
|
||||||
# list of executables. Now bzip2 uses libbz2.so.1.0, so if bzip2 is
|
# list of executables. Now bzip2 uses libbz2.so.1.0, so if bzip2 is
|
||||||
# present on the system this will be the tester instead, and size
|
# present on the system this will be the tester instead, and size
|
||||||
# has to be figured out differently.
|
# has to be figured out differently.
|
||||||
info(0, ".. the libs\n");
|
info(0, ".. the libs\n");
|
||||||
|
|
||||||
my $lib_tester;
|
my $lib_tester;
|
||||||
if ($bz2_toggle->active && -x find_file_in_path("bzip2") ) {
|
if ($bz2_toggle->active && -x find_file_in_path("bzip2") ) {
|
||||||
|
|
||||||
|
$lib_tester = find_file_in_path("bzip2");
|
||||||
|
|
||||||
$lib_tester = find_file_in_path("bzip2");
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
$lib_tester = find_file_in_path("init");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $dir;
|
||||||
|
|
||||||
|
open(L,"ldd $lib_tester|") or die "Oops, no $lib_tester could be found :)\n"; # safe to use ldd, this is going to be fixed later with library_dependencies
|
||||||
|
while (<L>) {
|
||||||
|
my $place;
|
||||||
|
($lib,$place) = (split(/=>/,$_))[0,1];
|
||||||
|
$place = (split(" ",$place))[0];
|
||||||
|
$lib =~ s/\s+//;
|
||||||
|
$lib = basename($lib);
|
||||||
|
$lib =~ s/\s+$//;
|
||||||
|
$dir = dirname($place);
|
||||||
|
info(0,"$dir/$lib\n");
|
||||||
|
open (SL,"ls -l $dir/$lib|") or die "humm: $!\n";
|
||||||
|
while (<SL>) {
|
||||||
|
# symbolic link
|
||||||
|
if (-l "$dir/$lib") {
|
||||||
|
$what = (split(/\s+/,$_))[10];
|
||||||
|
($path,$value) = stripper("$dir/$lib","lib");
|
||||||
|
$value == 0 ? ($tool = "cp -a") : ($tool = "mv");
|
||||||
|
return if errcp(sys("$tool $path $tmp/initrd_mnt$dir")) == 2;
|
||||||
|
($path,$value) = stripper("$dir/$what","lib");
|
||||||
|
$value == 0 ? ($tool = "cp -a") : ($tool = "mv");
|
||||||
|
return if errcp(sys("$tool $path $tmp/initrd_mnt$dir")) == 2;
|
||||||
|
}
|
||||||
|
# no symbolic link
|
||||||
|
else {
|
||||||
|
($path,$value) = stripper("$dir/$lib","lib");
|
||||||
|
return if errcp(sys("cp -a $path $tmp/initrd_mnt$dir")) == 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} # not busybox
|
||||||
|
|
||||||
else {
|
else {
|
||||||
|
|
||||||
$lib_tester = find_file_in_path("init");
|
my $error;
|
||||||
|
|
||||||
|
# busybox binary
|
||||||
|
$tool = "cp -a";
|
||||||
|
$path = "/home/mttrader/busybox/busybox/busybox";
|
||||||
|
return if errcp(sys("$tool $path $tmp/initrd_mnt/sbin")) == 2;
|
||||||
|
|
||||||
|
#Currently defined functions:
|
||||||
|
# [, ash, bunzip2, busybox, echo, false, gzip, insmod, modprobe,
|
||||||
|
# mount, sh, test, true, umount
|
||||||
|
|
||||||
|
my $target = "$tmp/initrd_mnt/sbin/busybox";
|
||||||
|
my @busystuff = qw(ash sh bunzip2 echo gzip insmod modprobe mount
|
||||||
|
umount);
|
||||||
|
chdir("$tmp/initrd_mnt/sbin/");
|
||||||
|
foreach ( @busystuff ) {
|
||||||
|
|
||||||
|
symlink("busybox", "$tmp/initrd_mnt/sbin/$_" );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# uClibc
|
||||||
|
mkpath("$tmp/initrd_mnt/usr/i386-linux-uclibc/lib");
|
||||||
|
$path = "/usr/i386-linux-uclibc/lib/libuClibc-0.9.5.so";
|
||||||
|
return if errcp(sys("$tool $path $tmp/initrd_mnt/usr/i386-linux-uclibc/lib")) == 2;
|
||||||
|
sys("chmod 755 $tmp/initrd_mnt/usr/i386-linux-uclibc/lib/libuClibc-0.9.5.so");
|
||||||
|
chdir("$tmp/initrd_mnt/lib");
|
||||||
|
symlink("../usr/i386-linux-uclibc/lib/libuClibc-0.9.5.so", "$tmp/initrd_mnt/lib/libc.so.0" );
|
||||||
|
|
||||||
|
$path = "/usr/i386-linux-uclibc/lib/ld-uClibc-0.9.5.so";
|
||||||
|
return if errcp(sys("$tool $path $tmp/initrd_mnt/usr/i386-linux-uclibc/lib")) == 2;
|
||||||
|
sys("chmod 755 $tmp/initrd_mnt/usr/i386-linux-uclibc/lib/ld-uClibc-0.9.5.so");
|
||||||
|
chdir("$tmp/initrd_mnt/usr/i386-linux-uclibc/lib");
|
||||||
|
symlink("ld-uClibc-0.9.5.so", "$tmp/initrd_mnt/usr/i386-linux-uclibc/lib/ld-uClibc.so.0" );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my $dir;
|
|
||||||
|
|
||||||
open(L,"ldd $lib_tester|") or die "Oops, no $lib_tester could be found :)\n"; # safe to use ldd, this is going to be fixed later with library_dependencies
|
|
||||||
while (<L>) {
|
|
||||||
my $place;
|
|
||||||
($lib,$place) = (split(/=>/,$_))[0,1];
|
|
||||||
$place = (split(" ",$place))[0];
|
|
||||||
$lib =~ s/\s+//;
|
|
||||||
$lib = basename($lib);
|
|
||||||
$lib =~ s/\s+$//;
|
|
||||||
$dir = dirname($place);
|
|
||||||
info(0,"$dir/$lib\n");
|
|
||||||
open (SL,"ls -l $dir/$lib|") or die "humm: $!\n";
|
|
||||||
while (<SL>) {
|
|
||||||
# symbolic link
|
|
||||||
if (-l "$dir/$lib") {
|
|
||||||
$what = (split(/\s+/,$_))[10];
|
|
||||||
($path,$value) = stripper("$dir/$lib","lib");
|
|
||||||
$value == 0 ? ($tool = "cp -a") : ($tool = "mv");
|
|
||||||
return if errcp(sys("$tool $path $tmp/initrd_mnt$dir")) == 2;
|
|
||||||
($path,$value) = stripper("$dir/$what","lib");
|
|
||||||
$value == 0 ? ($tool = "cp -a") : ($tool = "mv");
|
|
||||||
return if errcp(sys("$tool $path $tmp/initrd_mnt$dir")) == 2;
|
|
||||||
}
|
|
||||||
# no symbolic link
|
|
||||||
else {
|
|
||||||
($path,$value) = stripper("$dir/$lib","lib");
|
|
||||||
return if errcp(sys("cp -a $path $tmp/initrd_mnt$dir")) == 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
info(0, "Determine run-time link bindings\n");
|
info(0, "Determine run-time link bindings\n");
|
||||||
# Has a return code of 0 regardless
|
# Has a return code of 0 regardless
|
||||||
@ -4078,7 +4165,6 @@ INITRD
|
|||||||
|
|
||||||
} # end sub initrd_heredoc
|
} # end sub initrd_heredoc
|
||||||
|
|
||||||
|
|
||||||
sub brlilo {
|
sub brlilo {
|
||||||
|
|
||||||
my ($device) = @_;
|
my ($device) = @_;
|
||||||
@ -4117,6 +4203,44 @@ LILOCONF
|
|||||||
} # end sub brlilo
|
} # end sub brlilo
|
||||||
|
|
||||||
|
|
||||||
|
sub brlilo_non_root {
|
||||||
|
|
||||||
|
my ($device) = @_;
|
||||||
|
$entry_advanced[2] ? $entry_advanced[2] = $entry_advanced[2]
|
||||||
|
: $entry_advanced[2] = $container[ABS_APPEND];
|
||||||
|
|
||||||
|
# HEREDOC
|
||||||
|
my $brlilo = << "LILOCONF";
|
||||||
|
boot = $device
|
||||||
|
message = $old_mount/message
|
||||||
|
delay = 50
|
||||||
|
vga = normal
|
||||||
|
install = $old_mount/boot/boot.b
|
||||||
|
map = $old_mount/boot/map
|
||||||
|
backup = /dev/null
|
||||||
|
compact
|
||||||
|
|
||||||
|
# bootdisk
|
||||||
|
image = $old_mount/kernel
|
||||||
|
append = "load_ramdisk=1 debug $entry_advanced[2]"
|
||||||
|
initrd = $old_mount/$initrd
|
||||||
|
root = $device
|
||||||
|
label = bootdisk
|
||||||
|
read-write
|
||||||
|
|
||||||
|
# normalboot
|
||||||
|
#image = kernel
|
||||||
|
#append = "$entry_advanced[2]"
|
||||||
|
#root = /dev/$norm_root_device
|
||||||
|
#label = normalboot
|
||||||
|
#read-only
|
||||||
|
LILOCONF
|
||||||
|
|
||||||
|
return $brlilo;
|
||||||
|
|
||||||
|
} # end sub brlilo_non_root
|
||||||
|
|
||||||
|
|
||||||
sub message {
|
sub message {
|
||||||
# HEREDOC
|
# HEREDOC
|
||||||
my $message = << "MESSAGE";
|
my $message = << "MESSAGE";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user