mirror of
https://github.com/fspc/gbootroot.git
synced 2025-02-24 17:33:24 -05:00
Now makes initrd as non-root user.
This commit is contained in:
parent
2924fdf6d6
commit
905be9a57d
162
gbootroot
162
gbootroot
@ -3183,7 +3183,6 @@ sub initrd {
|
||||
my($lib,$what,$path,$value,$tool);
|
||||
my $I = "initrd";
|
||||
|
||||
|
||||
# Basically this means the ARS was never opened or edited and the
|
||||
# default behavior is to use the same device.
|
||||
if ( !$entry_advanced[3] ) {
|
||||
@ -3199,41 +3198,65 @@ sub initrd {
|
||||
pb($I,1);
|
||||
my $size_needed = initrd_size((stat("$tmp/linuxrc"))[12]/2);
|
||||
unlink("$tmp/linuxrc");
|
||||
|
||||
info(0, "Using loop device to make initrd\n");
|
||||
info(0, "Make sure you have loop device capability in your running kernel\n");
|
||||
sys("dd if=/dev/zero of=$tmp/$initrd bs=1024 count=$size_needed");
|
||||
pb($I,2);
|
||||
# no need to enter y every time .. could use -F
|
||||
my $error;
|
||||
open(T,"|mke2fs -F -m0 -i8192 $tmp/$initrd >/dev/null 2>&1") or
|
||||
($error = error("Can not make ext2 filesystem on initrd.\n"));
|
||||
return "ERROR" if $error && $error eq "ERROR";
|
||||
print T "y\n"; close(T);
|
||||
pb($I,3);
|
||||
info(0, "Mounting initrd in $tmp/initrd_mnt\n");
|
||||
|
||||
# moved this from initrd() to help with testing
|
||||
my $fs_type = (split(/\s/,$main::makefs))[0];
|
||||
|
||||
|
||||
if ( $fs_type ne "genext2fs" ) {
|
||||
|
||||
info(0, "Using loop device to make initrd\n");
|
||||
info(0, "Make sure you have loop device capability" .
|
||||
" in your running kernel\n");
|
||||
sys("dd if=/dev/zero of=$tmp/$initrd bs=1024 count=$size_needed");
|
||||
pb($I,2);
|
||||
# no need to enter y every time .. could use -F
|
||||
my $error;
|
||||
open(T,"|mke2fs -F -m0 -i8192 $tmp/$initrd >/dev/null 2>&1") or
|
||||
($error = error("Can not make ext2 filesystem on initrd.\n"));
|
||||
return "ERROR" if $error && $error eq "ERROR";
|
||||
print T "y\n"; close(T);
|
||||
pb($I,3);
|
||||
info(0, "Mounting initrd in $tmp/initrd_mnt\n");
|
||||
|
||||
}
|
||||
|
||||
# clean initrd_mnt if any garbage is found.
|
||||
if (-d "$tmp/initrd_mnt") {
|
||||
sys("rm -rf $tmp/initrd_mnt");
|
||||
}
|
||||
if (!-d "$tmp/initrd_mnt") {
|
||||
return if errmk(sys("mkdir $tmp/initrd_mnt")) == 2;
|
||||
}
|
||||
|
||||
|
||||
# Here the loop device is made on tmp, not mnt
|
||||
if ( $> == 0 ) {
|
||||
return if errm(sys("mount -o loop -t ext2 $tmp/$initrd $tmp/initrd_mnt"))
|
||||
== 2;
|
||||
if ( $fs_type eq "genext2fs" ) {
|
||||
info(0, "Using genext2fs to make initrd rather than a loop device\n");
|
||||
}
|
||||
|
||||
else {
|
||||
return if errm(sys("mount $tmp/initrd_mnt"))
|
||||
if ( $> == 0 ) {
|
||||
return if errm(sys("mount -o loop -t ext2 $tmp/$initrd $tmp/initrd_mnt")) == 2;
|
||||
}
|
||||
else {
|
||||
return if errm(sys("mount $tmp/initrd_mnt")) == 2;
|
||||
}
|
||||
}
|
||||
pb($I,4);
|
||||
|
||||
info(0, "Putting everything together\n");
|
||||
open(LC, ">$tmp/initrd_mnt/linuxrc") or die "Couldn't write linuxrc to loop device\n";
|
||||
if ( $fs_type eq "genext2fs" ) {
|
||||
open(LC, ">$tmp/initrd_mnt/linuxrc") or die "Couldn't write linuxrc to $tmp/initrd_mnt\n";
|
||||
}
|
||||
else {
|
||||
open(LC, ">$tmp/initrd_mnt/linuxrc") or die "Couldn't write linuxrc to loop device\n";
|
||||
}
|
||||
print LC initrd_heredoc($broot_image,$device); close(LC);
|
||||
# I could test this but somebody's system may do permissions differently
|
||||
sys("chmod 755 $tmp/initrd_mnt/linuxrc");
|
||||
sys("rmdir $tmp/initrd_mnt/lost+found");
|
||||
if ($fs_type ne "genext2fs" ) {
|
||||
sys("rmdir $tmp/initrd_mnt/lost+found");
|
||||
}
|
||||
pb($I,5);
|
||||
|
||||
info(0, "... the dirs\n");
|
||||
@ -3247,28 +3270,67 @@ sub initrd {
|
||||
return if err(sys("cp -a $container[BOOT_DEVICE] $mnt/dev")) == 2;
|
||||
}
|
||||
|
||||
if ( $> == 0 ) {
|
||||
return if errcp(
|
||||
sys("cp -a /dev/{console,null,ram0,ram1,tty0} $tmp/initrd_mnt/dev")) == 2;
|
||||
return if errcp(sys("cp -a $container[BOOT_DEVICE] $tmp/initrd_mnt/dev"))
|
||||
== 2;
|
||||
# DEVICES SECTION
|
||||
my @devices;
|
||||
my $device_table = "$tmp/boot_device_table.txt";
|
||||
if ( $fs_type eq "genext2fs" ) {
|
||||
|
||||
info(0, "Making $device_table for genext2fs\n");
|
||||
my $error;
|
||||
unlink( $device_table ) if -e $device_table;
|
||||
|
||||
#<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/console dev/null /dev/ram0 /dev/ram1 /dev/tty0);
|
||||
for ( split(" ", $container[BOOT_DEVICE] ) ) {
|
||||
push(@devices, $_ ) if $_;
|
||||
}
|
||||
|
||||
device_table( @devices );
|
||||
close(BootRoot::Yard::DEVICE_TABLE);
|
||||
|
||||
}
|
||||
|
||||
else {
|
||||
# This could be replaced by a devfs.
|
||||
sys("$main::sudo mknod c 5 1 $tmp/initrd_mnt/dev/console");
|
||||
sys("$main::sudo mknod c 1 3 $tmp/initrd_mnt/dev/null");
|
||||
sys("$main::sudo mknod b 1 0 $tmp/initrd_mnt/dev/ram0");
|
||||
sys("$main::sudo mknod b 1 1 $tmp/initrd_mnt/dev/ram1");
|
||||
sys("$main::sudo mknod c 4 0 $tmp/initrd_mnt/dev/tty0");
|
||||
sys("$main::sudo mknod b 2 0 $tmp/initrd_mnt/dev/fd0");
|
||||
|
||||
|
||||
if ( $> == 0 ) {
|
||||
info(0, "Copying over devices to $tmp/initrd_mnt/dev\n");
|
||||
return if errcp(
|
||||
sys("cp -a /dev/{console,null,ram0,ram1,tty0} $tmp/initrd_mnt/dev")
|
||||
) == 2;
|
||||
return if errcp(
|
||||
sys("cp -a $container[BOOT_DEVICE] $tmp/initrd_mnt/dev")) == 2;
|
||||
}
|
||||
else {
|
||||
info(0, "Mknod devices at $tmp/initrd_mnt/dev\n");
|
||||
# This could be replaced by a devfs.
|
||||
sys("$main::sudo mknod c 5 1 $tmp/initrd_mnt/dev/console");
|
||||
sys("$main::sudo mknod c 1 3 $tmp/initrd_mnt/dev/null");
|
||||
sys("$main::sudo mknod b 1 0 $tmp/initrd_mnt/dev/ram0");
|
||||
sys("$main::sudo mknod b 1 1 $tmp/initrd_mnt/dev/ram1");
|
||||
sys("$main::sudo mknod c 4 0 $tmp/initrd_mnt/dev/tty0");
|
||||
sys("$main::sudo mknod b 2 0 $tmp/initrd_mnt/dev/fd0");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pb($I,7);
|
||||
|
||||
# This and libs should be user accessible
|
||||
info(0, ".. the modules\n");
|
||||
my @modules = kernel_modules();
|
||||
|
||||
|
||||
if (@modules) {
|
||||
|
||||
mkpath("$tmp/initrd_mnt/lib/modules/$kernel_version");
|
||||
@ -3296,10 +3358,8 @@ sub initrd {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
info(0, ".. the bins\n");
|
||||
my @initrd_stuff;
|
||||
if (@modules) {
|
||||
@ -3377,15 +3437,39 @@ sub initrd {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
info(0, "Determine run-time link bindings\n");
|
||||
# Has a return code of 0 regardless
|
||||
# Also, produces false alarms even when it is working.
|
||||
info(1, "Ignore warnings about missing directories\n");
|
||||
sys("ldconfig -v -r $tmp/initrd_mnt");
|
||||
info(0, "Umounting loop device, and compressing initrd\n");
|
||||
return if errum(sys("umount $tmp/initrd_mnt")) == 2;
|
||||
|
||||
|
||||
if ( $fs_type eq "genext2fs" ) {
|
||||
info(0, "Using genext2fs to contruct the initrd\n");
|
||||
# The -D option is unique to the newest unreleased version of
|
||||
# genextfs modified by BusyBox maintainer Erick Andersen
|
||||
# August 20, 2001.
|
||||
|
||||
my $error;
|
||||
|
||||
# genext2fs doesn't make accurate sized filesystems.
|
||||
$size_needed = $size_needed + 1000;
|
||||
|
||||
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.");
|
||||
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;
|
||||
}
|
||||
sys("gzip -f9 $tmp/$initrd");
|
||||
|
||||
pb($I,10); # This takes the longest.
|
||||
|
||||
$initrd = $initrd . ".gz";
|
||||
|
Loading…
x
Reference in New Issue
Block a user