Browse Source

This adds boot making capabilities for non-root users, right now mknod

privileges are needed, but this will be replaced with devfs if possible.
master
freesource 23 years ago
parent
commit
2374f01fa2
  1. 86
      gbootroot

86
gbootroot

@ -129,6 +129,7 @@ my $home = "$ENV{HOME}/.gbootroot";
my $uml_xterm = "xterm -e";
$main::editor = "emacs --font 6x13";
$main::makefs = "mke2fs -F -m0 -i8192"; # Root Disk
my $sudo = "sudo";
# CHANGES
#
@ -505,7 +506,7 @@ my $time = sprintf("%02d:%02d:%02d-%02d-%02d-%04d",
$hour, $min, $sec, $month+1, $day, $year+1900);
# Here's where stuff gets intersting, non-root users can create root_fs,
# which is great for UML.
# which is great for UML, and a boot disk.
if ( $> == 0 ) {
@ -528,12 +529,29 @@ else {
# The Administrator just needs to add a line like the one below to the
# fstab for each non-root user who wants to be able to create root_fs.
# Ofcourse, the user is locked into the ext2 fs in this example, and
# `id -u` has to be the actual effective numeric user id.
# In this example, `id -u` has to be the actual effective numeric user
# id, and the root_fs has to always be named root_fs when it is being
# made, but it can be renamed afterwards.
#
# /tmp/gboot_non_root_`id -u`/root_fs \
# /tmp/gboot_non_root_`id -u`/loopback \
# ext2 defaults,noauto,user,loop 0 0
# auto defaults,noauto,user,loop 0 0
#
# For the boot/root disks the administrator will have to give the user
# special su privileges (mknod) to make special devices. The $sudo
# variable can be set to sudo or super, fakeroot won't work.
# These include: /dev/{console,null,ram0,ram1,tty0}
# These two lines need to be added to create the boot_fs and the boot/root
# disk. In this example the user is locked into using one type of device
# for the boot/root
#
# /tmp/gboot_not_root_`id -u`/initrd_image \
# /tmp/gboot_not_root_'id -u1`/initrd_mnt \
# auto defaults,noauto,user,loop 0 0
#
# /dev/fd0 /tmp/gboot_not_root_mnt_`id -u` auto defaults,noauto,user 0 0
my $user = $>;
@ -544,9 +562,9 @@ else {
}
$tmp = "$tmp1/gboot_non_root_" . $user;
if (!-d "$tmp1/gbootroot_mnt$time") {
$mnt = "$tmp1/gbootroot_mnt$time" if err_custom_perl(
"mkdir $tmp1/gbootroot_mnt$time",
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;
}
@ -2615,7 +2633,15 @@ sub lilo_put_it_together {
info(0, "Umount device\n");
info(0, "Remount device\n");
pb($B,6);
return if errm(sys("mount -t ext2 $entry_advanced[0] $mnt")) == 2;
# Real device
if ( $> == 0 ) {
return if errm(sys("mount -t ext2 $entry_advanced[0] $mnt")) == 2;
}
else {
return if errm(sys("mount $mnt")) == 2;
}
info(0, "Configuring lilo\n");
pb($B,7);
chdir("$mnt"); #"boot_root: ERROR: Could not change directories\n";
@ -3046,9 +3072,15 @@ sub initrd {
if (!-d "$tmp/initrd_mnt") {
return if errmk(sys("mkdir $tmp/initrd_mnt")) == 2;
}
return if errm(sys("mount -o loop -t ext2 $tmp/$initrd $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;
}
else {
return if errm(sys("mount $tmp/initrd_mnt"))
}
pb($I,4);
info(0, "Putting everything together\n");
@ -3070,10 +3102,21 @@ sub initrd {
return if err(sys("cp -a $container[BOOT_DEVICE] $mnt/dev")) == 2;
}
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"))
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;
}
else {
# This could be replaced by a devfs.
sys("$sudo mknod c 5 1 $tmp/initrd_mnt/dev/console");
sys("$sudo mknod c 1 3 $tmp/initrd_mnt/dev/null");
sys("$sudo mknod b 1 0 $tmp/initrd_mnt/dev/ram0");
sys("$sudo mknod b 1 1 $tmp/initrd_mnt/dev/ram1");
sys("$sudo mknod c 4 0 $tmp/initrd_mnt/dev/tty0");
sys("$sudo mknod b 2 0 $tmp/initrd_mnt/dev/fd0");
}
pb($I,7);
# This and libs should be user accessible
@ -3451,8 +3494,9 @@ sub mtab_check {
sys("mke2fs -F -m0 -i8192 $entry_advanced[3] $root_device_size");
}
# BOOT_DEVICE
elsif ($count == 0) {
elsif ($count == 0) {
sys("mke2fs -F -m0 -i8192 $entry_advanced[0] $container[SIZE]");
}
@ -3464,12 +3508,22 @@ sub mtab_check {
# ROOT_DEVICE
if ($count == 1) {
return if errm(sys("mount -t ext2 $entry_advanced[3] $mnt")) == 2;
if ( $> == 0 ) {
return if errm(sys("mount -t ext2 $entry_advanced[3] $mnt")) == 2;
}
else {
return if errm(sys("mount $mnt")) == 2;
}
}
# BOOT_DEVICE
elsif ($count == 0) {
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;
}
}

Loading…
Cancel
Save