diff --git a/configure.ac b/configure.ac index a7b9299..9c9a3e1 100644 --- a/configure.ac +++ b/configure.ac @@ -342,6 +342,7 @@ AC_CONFIG_FILES([Makefile po/Makefile.in systemd-units/plymouth-reboot.service systemd-units/plymouth-start.service systemd-units/plymouth-switch-root.service + systemd-units/plymouth-switch-root-initramfs.service systemd-units/systemd-ask-password-plymouth.path systemd-units/systemd-ask-password-plymouth.service systemd-units/Makefile diff --git a/scripts/plymouth-populate-initrd.in b/scripts/plymouth-populate-initrd.in index 616ecc4..0ff1f12 100755 --- a/scripts/plymouth-populate-initrd.in +++ b/scripts/plymouth-populate-initrd.in @@ -22,6 +22,7 @@ [ -z "$PLYMOUTH_POLICYDIR" ] && PLYMOUTH_POLICYDIR="@PLYMOUTH_POLICY_DIR@" [ -z "$PLYMOUTH_DAEMON_PATH" ] && PLYMOUTH_DAEMON_PATH="@PLYMOUTH_DAEMON_DIR@/plymouthd" [ -z "$PLYMOUTH_CLIENT_PATH" ] && PLYMOUTH_CLIENT_PATH="@PLYMOUTH_CLIENT_DIR@/plymouth" +[ -z "$PLYMOUTH_DRM_ESCROW_PATH" ] && PLYMOUTH_DRM_ESCROW_PATH="@PLYMOUTH_LIBEXECDIR@/plymouth/plymouthd-fd-escrow" [ -z "$SYSTEMD_UNIT_DIR" ] && SYSTEMD_UNIT_DIR="@SYSTEMD_UNIT_DIR@" # Generic substring function. If $2 is in $1, return 0. @@ -416,6 +417,7 @@ ddebug "Running with PLYMOUTH_LDD_PATH=$PLYMOUTH_LDD_PATH" mkdir -p ${INITRDDIR}${PLYMOUTH_DATADIR}/plymouth/themes inst ${PLYMOUTH_DAEMON_PATH} $INITRDDIR inst ${PLYMOUTH_CLIENT_PATH} $INITRDDIR +inst ${PLYMOUTH_DRM_ESCROW_PATH} $INITRDDIR inst ${PLYMOUTH_DATADIR}/plymouth/themes/text/text.plymouth $INITRDDIR inst ${PLYMOUTH_PLUGIN_PATH}/text.so $INITRDDIR inst ${PLYMOUTH_DATADIR}/plymouth/themes/details/details.plymouth $INITRDDIR diff --git a/src/main.c b/src/main.c index 23319a1..aa6f90b 100644 --- a/src/main.c +++ b/src/main.c @@ -158,6 +158,7 @@ static void on_quit (state_t *state, static bool sh_is_init (state_t *state); static void cancel_pending_delayed_show (state_t *state); static void prepare_logging (state_t *state); +static void dump_debug_buffer_to_file (void); static void on_session_output (state_t *state, @@ -653,6 +654,12 @@ on_newroot (state_t *state, } ply_trace ("new root mounted at \"%s\", switching to it", root_dir); + + if (!strcmp (root_dir, "/run/initramfs") && debug_buffer != NULL) { + ply_trace ("switching back to initramfs, dumping debug-buffer now"); + dump_debug_buffer_to_file (); + } + chdir (root_dir); chroot ("."); chdir ("/"); diff --git a/systemd-units/Makefile.am b/systemd-units/Makefile.am index b1d843b..cd2d7be 100644 --- a/systemd-units/Makefile.am +++ b/systemd-units/Makefile.am @@ -1,5 +1,6 @@ systemd_unit_templates = \ plymouth-switch-root.service.in \ + plymouth-switch-root-initramfs.service.in \ plymouth-start.service.in \ plymouth-read-write.service.in \ plymouth-quit.service.in \ @@ -37,17 +38,25 @@ install-data-hook: $(LN_S) ../plymouth-quit.service && \ $(LN_S) ../plymouth-quit-wait.service) (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/reboot.target.wants && \ - rm -f plymouth-reboot.service && \ - $(LN_S) ../plymouth-reboot.service) + rm -f plymouth-reboot.service \ + plymouth-switch-root-initramfs.service && \ + $(LN_S) ../plymouth-reboot.service && \ + $(LN_S) ../plymouth-switch-root-initramfs.service) (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/kexec.target.wants && \ - rm -f plymouth-kexec.service && \ - $(LN_S) ../plymouth-kexec.service) + rm -f plymouth-kexec.service \ + plymouth-switch-root-initramfs.service && \ + $(LN_S) ../plymouth-kexec.service && \ + $(LN_S) ../plymouth-switch-root-initramfs.service) (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/poweroff.target.wants && \ - rm -f plymouth-poweroff.service && \ - $(LN_S) ../plymouth-poweroff.service) + rm -f plymouth-poweroff.service \ + plymouth-switch-root-initramfs.service && \ + $(LN_S) ../plymouth-poweroff.service && \ + $(LN_S) ../plymouth-switch-root-initramfs.service) (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/halt.target.wants && \ - rm -f plymouth-halt.service && \ - $(LN_S) ../plymouth-halt.service) + rm -f plymouth-halt.service \ + plymouth-switch-root-initramfs.service && \ + $(LN_S) ../plymouth-halt.service && \ + $(LN_S) ../plymouth-switch-root-initramfs.service) uninstall-hook: (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/initrd-switch-root.target.wants && \ @@ -57,13 +66,17 @@ uninstall-hook: (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/multi-user.target.wants && \ rm -f plymouth-quit.service plymouth-quit-wait.service) (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/reboot.target.wants && \ - rm -f plymouth-reboot.service) + rm -f plymouth-reboot.service \ + plymouth-switch-root-initramfs.service) (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/kexec.target.wants && \ - rm -f plymouth-kexec.service) + rm -f plymouth-kexec.service \ + plymouth-switch-root-initramfs.service) (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/poweroff.target.wants && \ - rm -f plymouth-poweroff.service) + rm -f plymouth-poweroff.service \ + plymouth-switch-root-initramfs.service) (cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/halt.target.wants && \ - rm -f plymouth-halt.service) + rm -f plymouth-halt.service \ + plymouth-switch-root-initramfs.service) rmdir --ignore-fail-on-non-empty \ $(DESTDIR)$(SYSTEMD_UNIT_DIR)/sysinit.target.wants \ $(DESTDIR)$(SYSTEMD_UNIT_DIR)/multi-user.target.wants \ diff --git a/systemd-units/plymouth-switch-root-initramfs.service.in b/systemd-units/plymouth-switch-root-initramfs.service.in new file mode 100644 index 0000000..0610803 --- /dev/null +++ b/systemd-units/plymouth-switch-root-initramfs.service.in @@ -0,0 +1,15 @@ +[Unit] +Description=Tell Plymouth To Jump To initramfs +DefaultDependencies=no +# dracut-shutdown.service restores the initramfs when it is _stopped_ +# use Conflicts to make sure its ExecStop has run before we do +Conflicts=dracut-shutdown.service +After=plymouth-halt.service plymouth-reboot.service plymouth-poweroff.service plymouth-kexec.service dracut-shutdown.service +ConditionPathExists=/run/initramfs/bin/sh + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=-@PLYMOUTH_CLIENT_DIR@/plymouth update-root-fs --new-root-dir=/run/initramfs +Type=oneshot +RemainAfterExit=yes