From 1de372dcd4f43ef10b5f8ee95dc32c45d770a134 Mon Sep 17 00:00:00 2001 From: Wes Peters Date: Fri, 26 Apr 2002 07:31:04 +0000 Subject: [PATCH] Add a -k option to reboot to specify the kernel to boot next time around. If the kernel boots successfully, the record of this kernel is erased, it is intended to be a one-shot option for testing kernels. This could be improved by having the loader remove the record of the next kernel to boot, it is currently removed in /etc/rc immediately after disks are mounted r/w. I'd like to MFC this before the 4.6 freeze unless there is violent objection. Reviewed by: Several on IRC MFC after: 4 days --- etc/rc | 4 ++++ sbin/reboot/reboot.8 | 14 ++++++++++++++ sbin/reboot/reboot.c | 25 ++++++++++++++++++++----- sys/boot/forth/loader.conf | 2 +- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/etc/rc b/etc/rc index c5e7d53cd26f..ed4ceeab5f38 100644 --- a/etc/rc +++ b/etc/rc @@ -314,6 +314,10 @@ if [ -n "${diskless_mount}" -a -r "${diskless_mount}" ]; then sh ${diskless_mount} fi +# If we booted a special kernel remove the record so we will boot +# the default kernel next time +rm -f /boot/nextkernel + # Reseed /dev/random with previously stored entropy. case ${entropy_dir} in [Nn][Oo]) diff --git a/sbin/reboot/reboot.8 b/sbin/reboot/reboot.8 index a16eef1b212c..bf914b1a5aa1 100644 --- a/sbin/reboot/reboot.8 +++ b/sbin/reboot/reboot.8 @@ -44,12 +44,16 @@ .Sh SYNOPSIS .Nm halt .Op Fl lnqp +.Op Fl k Ar kernel .Nm .Op Fl dlnqp +.Op Fl k Ar kernel .Nm fasthalt .Op Fl lnqp +.Op Fl k Ar kernel .Nm fastboot .Op Fl dlnqp +.Op Fl k Ar kernel .Sh DESCRIPTION The .Nm halt @@ -72,6 +76,16 @@ The system is requested to create a crash dump. This option is supported only when rebooting, and it has no effect unless a dump device has previously been specified with .Xr dumpon 8 . +.It Fl k Ar kernel +Boot the specified +.Ar kernel +on the next system boot. If the kernel boots successfully, the +.Em default +kernel will be booted on succesive boots, this is a one-shot option. +If the boot fails, the system will continue attempting to boot +.Ar kernel +until the boot process is interrupted and a valid kernel booted. +This may change in the future. .It Fl l The halt or reboot is .Em not diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c index 61f971d40e3b..be8911fbd84e 100644 --- a/sbin/reboot/reboot.c +++ b/sbin/reboot/reboot.c @@ -51,6 +51,7 @@ static const char rcsid[] = #include #include #include +#include #include #include #include @@ -68,9 +69,9 @@ int main(int argc, char *argv[]) { struct passwd *pw; - int ch, howto, i, lflag, nflag, qflag, pflag, sverrno; + int ch, howto, i, fd, kflag, lflag, nflag, qflag, pflag, sverrno; u_int pageins; - char *p; + char *kernel, *p; const char *user; if (strstr((p = rindex(*argv, '/')) ? p + 1 : *argv, "halt")) { @@ -78,12 +79,16 @@ main(int argc, char *argv[]) howto = RB_HALT; } else howto = 0; - lflag = nflag = qflag = 0; - while ((ch = getopt(argc, argv, "dlnpq")) != -1) + kflag = lflag = nflag = qflag = 0; + while ((ch = getopt(argc, argv, "dk:lnpq")) != -1) switch(ch) { case 'd': howto |= RB_DUMP; break; + case 'k': + kflag = 1; + kernel = optarg; + break; case 'l': lflag = 1; break; @@ -117,6 +122,16 @@ main(int argc, char *argv[]) err(1, NULL); } + if (kflag) { + fd = open("/boot/nextkernel", O_WRONLY | O_CREAT, 0444); + if (fd > -1) { + (void)write(fd, "kernel=\"", 8L); + (void)write(fd, kernel, strlen(kernel)); + (void)write(fd, "\"\n", 2); + close(fd); + } + } + /* Log the reboot. */ if (!lflag) { if ((user = getlogin()) == NULL) @@ -195,7 +210,7 @@ main(int argc, char *argv[]) void usage() { - (void)fprintf(stderr, "usage: %s [-dnpq]\n", + (void)fprintf(stderr, "usage: %s [-dnpq] [-k kernel]\n", dohalt ? "halt" : "reboot"); exit(1); } diff --git a/sys/boot/forth/loader.conf b/sys/boot/forth/loader.conf index 49debbf340bf..aa1d68924607 100644 --- a/sys/boot/forth/loader.conf +++ b/sys/boot/forth/loader.conf @@ -22,7 +22,7 @@ userconfig_script_load="NO" userconfig_script_name="/boot/kernel.conf" userconfig_script_type="userconfig_script" -loader_conf_files="/boot/device.hints /boot/loader.conf /boot/loader.conf.local" +loader_conf_files="/boot/device.hints /boot/loader.conf /boot/loader.conf.local /boot/nextkernel" verbose_loading="NO" # Set to YES for verbose loader output