svn commit: r337740 - in head: sbin/init stand/man

Edward Tomasz Napierala trasz at FreeBSD.org
Tue Aug 14 11:01:54 UTC 2018


Author: trasz
Date: Tue Aug 14 11:01:52 2018
New Revision: 337740
URL: https://svnweb.freebsd.org/changeset/base/337740

Log:
  Add init_exec kenv(1) variable, to make init(8) execute a file
  after opening the console, replacing init as PID 1.
  
  From the user point of view, it makes it possible to run eg the
  shell as PID 1, using 'set init_exec=/bin/sh' at the loader(8)
  prompt.
  
  Reviewed by:	kib
  MFC after:	2 weeks
  Relnotes:	yes
  Sponsored by:	DARPA, AFRL
  Differential Revision:	https://reviews.freebsd.org/D16625

Modified:
  head/sbin/init/init.8
  head/sbin/init/init.c
  head/stand/man/loader.8

Modified: head/sbin/init/init.8
==============================================================================
--- head/sbin/init/init.8	Tue Aug 14 11:00:54 2018	(r337739)
+++ head/sbin/init/init.8	Tue Aug 14 11:01:52 2018	(r337740)
@@ -31,7 +31,7 @@
 .\"     @(#)init.8	8.3 (Berkeley) 4/18/94
 .\" $FreeBSD$
 .\"
-.Dd August 7, 2018
+.Dd August 14, 2018
 .Dt INIT 8
 .Os
 .Sh NAME
@@ -316,6 +316,14 @@ See
 .Xr reboot 8
 .Fl r
 for details.
+.It Va init_exec
+If set to a valid file name in the root file system,
+instructs
+.Nm
+to directly execute that file as the very first action,
+replacing
+.Nm
+as PID 1.
 .It Va init_script
 If set to a valid file name in the root file system,
 instructs
@@ -341,6 +349,8 @@ Defines the shell binary to be used for executing the 
 The default is
 .Dq Li /bin/sh .
 It is used for running the
+.Va init_exec
+or
 .Va init_script
 if set, as well as for the
 .Pa /etc/rc

Modified: head/sbin/init/init.c
==============================================================================
--- head/sbin/init/init.c	Tue Aug 14 11:00:54 2018	(r337739)
+++ head/sbin/init/init.c	Tue Aug 14 11:01:52 2018	(r337740)
@@ -149,6 +149,7 @@ static state_t current_state = death_single;
 static void execute_script(char *argv[]);
 static void open_console(void);
 static const char *get_shell(void);
+static void replace_init(char *path);
 static void write_stderr(const char *message);
 
 typedef struct init_session {
@@ -330,6 +331,11 @@ invalid:
 	close(1);
 	close(2);
 
+	if (kenv(KENV_GET, "init_exec", kenv_value, sizeof(kenv_value)) > 0) {
+		replace_init(kenv_value);
+		_exit(0); /* reboot */
+	}
+
 	if (kenv(KENV_GET, "init_script", kenv_value, sizeof(kenv_value)) > 0) {
 		state_func_t next_transition;
 
@@ -1085,6 +1091,22 @@ execute_script(char *argv[])
 	shell = get_shell();
 	execv(shell, argv);
 	stall("can't exec %s for %s: %m", shell, script);
+}
+
+/*
+ * Execute binary, replacing init(8) as PID 1.
+ */
+static void
+replace_init(char *path)
+{
+	char *argv[3];
+	char sh[] = "sh";
+
+	argv[0] = sh;
+	argv[1] = path;
+	argv[2] = NULL;
+
+	execute_script(argv);
 }
 
 /*

Modified: head/stand/man/loader.8
==============================================================================
--- head/stand/man/loader.8	Tue Aug 14 11:00:54 2018	(r337739)
+++ head/stand/man/loader.8	Tue Aug 14 11:01:52 2018	(r337740)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd August 13, 2018
+.Dd August 14, 2018
 .Dt LOADER 8
 .Os
 .Sh NAME
@@ -490,6 +490,9 @@ directive from
 has been processed, allowing kernel panics that happen during the early stages
 of boot to be captured.
 .It Va init_chroot
+See
+.Xr init 8 .
+.It Va init_exec
 See
 .Xr init 8 .
 .It Va init_path


More information about the svn-src-all mailing list