bootrc: add experimental reboot method to load another kernel

syntax: reboot!bootfile[!method...]

this echos bootfile to /dev/reboot, causing bootfile kernel
to be started.

when method is given, we first connect to the filesystem and
set bootargs so that bootfile can be loaded from the target
network or local fileserver.

note, when no bootfile is given, this causes the kernel to
reboot to bios.
This commit is contained in:
cinap_lenrek 2018-09-16 22:35:16 +02:00
parent 9d60ece816
commit 2985d53b7a
2 changed files with 57 additions and 0 deletions

View file

@ -48,6 +48,7 @@ $objtype
rc
lib
rcmain
reboot.rc 555 sys sys ../boot/reboot.rc
local.rc 555 sys sys ../boot/local.rc
net.rc 555 sys sys ../boot/net.rc
bin

56
sys/src/9/boot/reboot.rc Executable file
View file

@ -0,0 +1,56 @@
#!/bin/rc
fn configreboot {
if(~ $"* *!*){
*=`{echo $* | sed 's,!, ,'}
shift
*=`{echo $* | sed 's,!, ,'}
x=m$1
x=$$x
shift
# config method
$x(1) $*
}
}
fn connectreboot {
if(~ $"* *!*){
*=`{echo $* | sed 's,!, ,'}
bootfile=$1
shift
bootargs=$*
*=`{echo $* | sed 's,!, ,'}
x=m$1
x=$$x
shift
# connect method
$x(2) $*
rfork ne
# set new kernel parameters
echo -n $bootargs > '#ec/bootargs'
# remove part of our temporary root
/mnt/broot/$cputype/bin/unmount /$cputype/bin /bin
/mnt/broot/$cputype/bin/unmount /rc/bin /bin
/mnt/broot/$cputype/bin/unmount /
# create the name space, mount the root fs
/mnt/broot/$cputype/bin/bind / /
/mnt/broot/$cputype/bin/mount -ac '#s/boot' /
}
if not {
bootfile=$1
}
# load the new kernel
/mnt/broot/$cputype/bin/echo reboot $bootfile > /dev/reboot
exit 'reboot failed'
}
mreboot=(configreboot connectreboot)
mt=(mreboot $mt)