mirror of
https://github.com/troglobit/finit.git
synced 2026-10-01 05:22:48 +07:00
Replace experimental emergency shell with actual rescue mode
Most major init systems have a way to start a rescue shell. This is usally started when the string `rescue` is read from the kernel's command line. The traditional Finit way of handling this has been to skip certain phases of the standard boot, skip /etc/finit.conf et al, and go for a /lib/finit/rescue.conf instead. This pratice has been imroved over the last few commits with a sulogin. However, there was no way to resume boot, like most other init systems offer. This patch implements a very simple rescue mode, utilizing the new sulogin, replacing the old (and experimental) emergency shell. If Ctrl-D is pressed at the maintenance login prompt the boot is now resumed. The same goes for exit/Ctrl-D from the maintenace shell. The preferred sulogin is the bundled /libexec/finit/sulogin, but if that isn't installed, the first one in $PATH is used. If no sulogin at all is found, Finit proceeds as before this patch, to skip certains steps and go for a /lib/finit/rescue.conf. Hence, al steps can be controlled by an administrator. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
@@ -48,11 +48,6 @@ PKG_CHECK_MODULES([uev], [libuev >= 2.2.0])
|
|||||||
PKG_CHECK_MODULES([lite], [libite >= 2.2.0])
|
PKG_CHECK_MODULES([lite], [libite >= 2.2.0])
|
||||||
|
|
||||||
# Check for configured Finit features
|
# Check for configured Finit features
|
||||||
AC_ARG_ENABLE(emergency_shell,
|
|
||||||
AS_HELP_STRING([--enable-emergency-shell], [Experimental emergency fallback at boot.
|
|
||||||
Use only for debugging very early boot problems with Finit]),,[
|
|
||||||
enable_emergency_shell=no])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(auto_reload,
|
AC_ARG_ENABLE(auto_reload,
|
||||||
AS_HELP_STRING([--enable-auto-reload], [Automatic reload on any .conf change]),,[
|
AS_HELP_STRING([--enable-auto-reload], [Automatic reload on any .conf change]),,[
|
||||||
enable_auto_reload=no])
|
enable_auto_reload=no])
|
||||||
@@ -127,9 +122,6 @@ AC_ARG_WITH(watchdog,
|
|||||||
### Enable features ###########################################################################
|
### Enable features ###########################################################################
|
||||||
|
|
||||||
# Create config.h from selected features and fallback defaults
|
# Create config.h from selected features and fallback defaults
|
||||||
AS_IF([test "x$enable_emergency_shell" = "xyes"], [
|
|
||||||
AC_DEFINE(EMERGENCY_SHELL, 1, [Fork off init and let PID 1 wait and start /bin/sh if init crashes.])])
|
|
||||||
|
|
||||||
AS_IF([test "x$enable_auto_reload" = "xyes"], [
|
AS_IF([test "x$enable_auto_reload" = "xyes"], [
|
||||||
AC_DEFINE(AUTO_RELOAD, 1, [Finit automatically does `initctl reload` on any .conf change])])
|
AC_DEFINE(AUTO_RELOAD, 1, [Finit automatically does `initctl reload` on any .conf change])])
|
||||||
|
|
||||||
@@ -253,7 +245,6 @@ Optional features:
|
|||||||
Built-in watchdogd....: $with_watchdog $watchdog
|
Built-in watchdogd....: $with_watchdog $watchdog
|
||||||
Built-in logrotate....: $enable_logrotate
|
Built-in logrotate....: $enable_logrotate
|
||||||
Scripting tool logit..: $enable_logit
|
Scripting tool logit..: $enable_logit
|
||||||
Emergency shell.......: $enable_emergency_shell
|
|
||||||
Redirect output.......: $enable_redirect
|
Redirect output.......: $enable_redirect
|
||||||
Default hostname......: $hostname
|
Default hostname......: $hostname
|
||||||
Default runlevel......: $runlevel
|
Default runlevel......: $runlevel
|
||||||
|
|||||||
+16
-46
@@ -235,48 +235,6 @@ static void fs_init(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* If everything goes south we can use this to give the operator an
|
|
||||||
* emergency shell to debug the problem -- Finit should not crash!
|
|
||||||
*
|
|
||||||
* Note: Only use this for debugging a new Finit setup, don't use
|
|
||||||
* this in production since it gives a root shell to anyone
|
|
||||||
* if Finit crashes.
|
|
||||||
*
|
|
||||||
* This emergency shell steps in to prevent "Aieee, PID 1 crashed"
|
|
||||||
* messages from the kernel, which usually results in a reboot, so
|
|
||||||
* that the operator instead can debug the problem.
|
|
||||||
*/
|
|
||||||
static void emergency_shell(void)
|
|
||||||
{
|
|
||||||
#ifdef EMERGENCY_SHELL
|
|
||||||
pid_t pid;
|
|
||||||
|
|
||||||
pid = fork();
|
|
||||||
if (pid) {
|
|
||||||
while (1) {
|
|
||||||
pid_t id;
|
|
||||||
|
|
||||||
/* Reap 'em (prevents Zombies) */
|
|
||||||
id = waitpid(-1, NULL, WNOHANG);
|
|
||||||
if (id == pid)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "\n=> Embarrassingly, Finit has crashed. Check /dev/kmsg for details.\n");
|
|
||||||
fprintf(stderr, "=> To debug, add 'debug' to the kernel command line.\n\n");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Become session leader and set controlling TTY
|
|
||||||
* to enable Ctrl-C and job control in shell.
|
|
||||||
*/
|
|
||||||
setsid();
|
|
||||||
ioctl(STDIN_FILENO, TIOCSCTTY, 1);
|
|
||||||
|
|
||||||
execl(_PATH_BSHELL, _PATH_BSHELL, NULL);
|
|
||||||
}
|
|
||||||
#endif /* EMERGENCY_SHELL */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle bootstrap transition to configured runlevel, start TTYs
|
* Handle bootstrap transition to configured runlevel, start TTYs
|
||||||
@@ -505,13 +463,24 @@ int main(int argc, char *argv[])
|
|||||||
if (chdir("/"))
|
if (chdir("/"))
|
||||||
_pe("Failed cd /");
|
_pe("Failed cd /");
|
||||||
|
|
||||||
/* Allow progress, if enabled */
|
|
||||||
enable_progress(1);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In case of emergency.
|
* In case of emergency.
|
||||||
*/
|
*/
|
||||||
emergency_shell();
|
if (rescue) {
|
||||||
|
char *sulogin[] = {
|
||||||
|
_PATH_SULOGIN,
|
||||||
|
"sulogin",
|
||||||
|
};
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < NELEMS(sulogin); i++) {
|
||||||
|
if (systemf(sulogin[i]))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
rescue = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load plugins early, the first hook is in banner(), so we
|
* Load plugins early, the first hook is in banner(), so we
|
||||||
@@ -522,6 +491,7 @@ int main(int argc, char *argv[])
|
|||||||
/*
|
/*
|
||||||
* Hello world.
|
* Hello world.
|
||||||
*/
|
*/
|
||||||
|
enable_progress(1); /* Allow progress, if enabled */
|
||||||
banner();
|
banner();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user