From fb67e4aa36948b3ed1208bf963da5569d1b13409 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Fri, 10 Feb 2012 11:14:42 +0100 Subject: [PATCH] shutdown on demand Do not save and restore the initramfs, but instead, just unpack the default initramfs for shutdown on shutdown. --- Makefile | 9 +++------ dracut-backup.service | 15 --------------- dracut-initramfs-backup.sh | 22 ---------------------- dracut-initramfs-restore.sh | 10 ++++++++++ dracut-restore.service | 18 ------------------ dracut-shutdown.service | 18 ++++++++++++++++++ dracut.conf.d/fedora.conf.example | 1 - dracut.spec | 2 +- modules.d/90crypt/cryptroot-ask.sh | 1 + modules.d/90dmraid/dmraid.sh | 1 + modules.d/90dmsquash-live/dmsquash-live-root | 2 ++ modules.d/90lvm/lvm_scan.sh | 2 ++ modules.d/90mdraid/mdraid-cleanup.sh | 4 ++-- modules.d/90multipath/multipathd.sh | 1 + modules.d/95fcoe/fcoe-up | 2 ++ modules.d/95iscsi/iscsiroot | 2 ++ modules.d/95nbd/nbdroot | 1 + modules.d/95nfs/nfsroot | 2 +- modules.d/98usrmount/mount-usr.sh | 10 ++++++++++ modules.d/99base/dracut-lib.sh | 4 ++++ 20 files changed, 61 insertions(+), 66 deletions(-) delete mode 100644 dracut-backup.service delete mode 100644 dracut-initramfs-backup.sh create mode 100644 dracut-initramfs-restore.sh delete mode 100644 dracut-restore.service create mode 100644 dracut-shutdown.service diff --git a/Makefile b/Makefile index 09e87c8..99279ac 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ install: doc mkdir -p $(DESTDIR)$(sysconfdir)/dracut.conf.d install -m 0755 dracut-functions $(DESTDIR)$(pkglibdir)/dracut-functions install -m 0755 dracut-logger $(DESTDIR)$(pkglibdir)/dracut-logger - install -m 0755 dracut-initramfs-backup.sh $(DESTDIR)$(pkglibdir)/dracut-initramfs-backup + install -m 0755 dracut-initramfs-restore.sh $(DESTDIR)$(pkglibdir)/dracut-initramfs-restore cp -arx modules.d $(DESTDIR)$(pkglibdir) install -m 0644 dracut.8 $(DESTDIR)$(mandir)/man8/dracut.8 install -m 0644 dracut-catimages.8 $(DESTDIR)$(mandir)/man8/dracut-catimages.8 @@ -50,12 +50,9 @@ install: doc ln -s dracut.cmdline.7 $(DESTDIR)$(mandir)/man7/dracut.kernel.7 if [ -n "$(systemdsystemunitdir)" ]; then \ mkdir -p $(DESTDIR)$(systemdsystemunitdir); \ - install -m 0644 dracut-backup.service $(DESTDIR)$(systemdsystemunitdir); \ - install -m 0644 dracut-restore.service $(DESTDIR)$(systemdsystemunitdir); \ - mkdir -p $(DESTDIR)$(systemdsystemunitdir)/sysinit.target.wants; \ + install -m 0644 dracut-shutdown.service $(DESTDIR)$(systemdsystemunitdir); \ mkdir -p $(DESTDIR)$(systemdsystemunitdir)/reboot.target.wants; \ - ln -s ../dracut-backup.service $(DESTDIR)$(systemdsystemunitdir)/sysinit.target.wants/dracut-backup.service; \ - ln -s ../dracut-restore.service $(DESTDIR)$(systemdsystemunitdir)/reboot.target.wants/dracut-restore.service; \ + ln -s ../dracut-shutdown.service $(DESTDIR)$(systemdsystemunitdir)/reboot.target.wants/dracut-shutdown.service; \ fi clean: diff --git a/dracut-backup.service b/dracut-backup.service deleted file mode 100644 index 69110eb..0000000 --- a/dracut-backup.service +++ /dev/null @@ -1,15 +0,0 @@ -# This file is part of systemd. -# -# systemd is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -[Unit] -Description=Save /run/initramfs -ConditionPathExists=/run/initramfs - -[Service] -ExecStart=/usr/lib/dracut/dracut-initramfs-backup backup -Type=oneshot -RemainAfterExit=yes diff --git a/dracut-initramfs-backup.sh b/dracut-initramfs-backup.sh deleted file mode 100644 index 7320d40..0000000 --- a/dracut-initramfs-backup.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- -# ex: ts=8 sw=4 sts=4 et filetype=sh - -set -e -cd /run/initramfs - -if [ "x$1" = "xbackup" ]; then - compress="gzip" - command -v pigz > /dev/null 2>&1 && compress="pigz" - find . |cpio -H newc -o --quiet \ - | pigz > /var/lib/initramfs/_run_initramfs-backup.cpio.gz - mv -f /var/lib/initramfs/_run_initramfs-backup.cpio.gz \ - /var/lib/initramfs/run_initramfs-backup.cpio.gz - rm -fr etc bin lib lib64 sbin shutdown tmp usr var - > .backuped -elif [ "x$1" = "xrestore" ]; then - [ -f .backuped -a -f /var/lib/initramfs/run_initramfs-backup.cpio.gz ] || exit 1 - zcat /var/lib/initramfs/run_initramfs-backup.cpio.gz | cpio -id >/dev/null 2>&1 - rm .backuped - rm -f /var/lib/initramfs/run_initramfs-backup.cpio.gz -fi diff --git a/dracut-initramfs-restore.sh b/dracut-initramfs-restore.sh new file mode 100644 index 0000000..26b698b --- /dev/null +++ b/dracut-initramfs-restore.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh + +set -e +cd /run/initramfs +IMG="/boot/initramfs-$(uname -r).img" +[ -f .need_shutdown -a -f "$IMG" ] || exit 1 +zcat "$IMG" | cpio -id >/dev/null 2>&1 +rm .need_shutdown diff --git a/dracut-restore.service b/dracut-restore.service deleted file mode 100644 index 3a07efe..0000000 --- a/dracut-restore.service +++ /dev/null @@ -1,18 +0,0 @@ -# This file is part of systemd. -# -# systemd is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -[Unit] -Description=Restore /run/initramfs -After=getty@tty1.service prefdm.service -Before=reboot.service -DefaultDependencies=no -ConditionPathExists=/run/initramfs/.backuped - -[Service] -ExecStart=/usr/lib/dracut/dracut-initramfs-backup restore -Type=oneshot -RemainAfterExit=yes \ No newline at end of file diff --git a/dracut-shutdown.service b/dracut-shutdown.service new file mode 100644 index 0000000..4f06e35 --- /dev/null +++ b/dracut-shutdown.service @@ -0,0 +1,18 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +[Unit] +Description=Restore /run/initramfs +After=getty@tty1.service prefdm.service +Before=reboot.service +DefaultDependencies=no +ConditionPathExists=/run/initramfs/.need_shutdown + +[Service] +ExecStart=/usr/lib/dracut/dracut-initramfs-restore +Type=oneshot +RemainAfterExit=yes diff --git a/dracut.conf.d/fedora.conf.example b/dracut.conf.d/fedora.conf.example index 45063c6..adfecc8 100644 --- a/dracut.conf.d/fedora.conf.example +++ b/dracut.conf.d/fedora.conf.example @@ -5,6 +5,5 @@ i18n_vars="/etc/sysconfig/keyboard:KEYTABLE-KEYMAP /etc/sysconfig/i18n:SYSFONT-F add_dracutmodules+=" rpmversion " omit_dracutmodules+=" dash " stdloglvl=3 -prefix=/run/initramfs realinitpath="/usr/lib/systemd/systemd" install_items+=" vi /etc/virc ps grep cat rm openvt " diff --git a/dracut.spec b/dracut.spec index 6efd553..304f1f3 100644 --- a/dracut.spec +++ b/dracut.spec @@ -223,7 +223,7 @@ rm -rf $RPM_BUILD_ROOT %dir %{dracutlibdir}/modules.d %{dracutlibdir}/dracut-functions %{dracutlibdir}/dracut-logger -%{dracutlibdir}/dracut-initramfs-backup +%{dracutlibdir}/dracut-initramfs-restore %config(noreplace) /etc/dracut.conf %if 0%{?fedora} || 0%{?suse_version} || 0%{?rhel} > 6 %config /etc/dracut.conf.d/01-dist.conf diff --git a/modules.d/90crypt/cryptroot-ask.sh b/modules.d/90crypt/cryptroot-ask.sh index 6a95dc2..aba1331 100755 --- a/modules.d/90crypt/cryptroot-ask.sh +++ b/modules.d/90crypt/cryptroot-ask.sh @@ -117,6 +117,7 @@ unset device luksname luksfile # mark device as asked >> /tmp/cryptroot-asked-$2 +need_shutdown udevsettle exit 0 diff --git a/modules.d/90dmraid/dmraid.sh b/modules.d/90dmraid/dmraid.sh index feff516..574dc3b 100755 --- a/modules.d/90dmraid/dmraid.sh +++ b/modules.d/90dmraid/dmraid.sh @@ -40,3 +40,4 @@ else done fi +need_shutdown diff --git a/modules.d/90dmsquash-live/dmsquash-live-root b/modules.d/90dmsquash-live/dmsquash-live-root index d9fcc43..e3606cf 100755 --- a/modules.d/90dmsquash-live/dmsquash-live-root +++ b/modules.d/90dmsquash-live/dmsquash-live-root @@ -206,4 +206,6 @@ fi ln -s /dev/mapper/live-rw /dev/root printf '/bin/mount %s /dev/mapper/live-rw %s\n' "$ROOTFLAGS" "$NEWROOT" > $hookdir/mount/01-$$-live.sh +need_shutdown + exit 0 diff --git a/modules.d/90lvm/lvm_scan.sh b/modules.d/90lvm/lvm_scan.sh index 3c0094e..104565f 100755 --- a/modules.d/90lvm/lvm_scan.sh +++ b/modules.d/90lvm/lvm_scan.sh @@ -126,3 +126,5 @@ if [ "$lvmwritten" ]; then rm -f /etc/lvm/lvm.conf fi unset lvmwritten + +need_shutdown diff --git a/modules.d/90mdraid/mdraid-cleanup.sh b/modules.d/90mdraid/mdraid-cleanup.sh index 3ffa2d3..2e8a389 100755 --- a/modules.d/90mdraid/mdraid-cleanup.sh +++ b/modules.d/90mdraid/mdraid-cleanup.sh @@ -13,11 +13,11 @@ for md in /dev/md[0-9_]*; do containers="$containers $md" continue fi - mdadm -S "$md" >/dev/null 2>&1 + mdadm -S "$md" >/dev/null 2>&1 || need_shutdown done for md in $containers; do - mdadm -S "$md" >/dev/null 2>&1 + mdadm -S "$md" >/dev/null 2>&1 || need_shutdown done unset containers udevinfo diff --git a/modules.d/90multipath/multipathd.sh b/modules.d/90multipath/multipathd.sh index 4d8935f..6d6eb99 100755 --- a/modules.d/90multipath/multipathd.sh +++ b/modules.d/90multipath/multipathd.sh @@ -5,6 +5,7 @@ if [ -e /etc/multipath.conf ]; then modprobe dm-multipath multipathd -B || multipathd + need_shutdown else rm /etc/udev/rules.d/??-multipath.rules 2>/dev/null fi diff --git a/modules.d/95fcoe/fcoe-up b/modules.d/95fcoe/fcoe-up index 5c5bdb5..1e1bcf5 100755 --- a/modules.d/95fcoe/fcoe-up +++ b/modules.d/95fcoe/fcoe-up @@ -46,3 +46,5 @@ elif [ "$netdriver" = "bnx2x" ]; then else echo -n "$netif" > /sys/module/fcoe/parameters/create fi + +need_shutdown diff --git a/modules.d/95iscsi/iscsiroot b/modules.d/95iscsi/iscsiroot index e7bac74..d8f7c8f 100755 --- a/modules.d/95iscsi/iscsiroot +++ b/modules.d/95iscsi/iscsiroot @@ -205,6 +205,8 @@ else handle_netroot $iroot fi +need_shutdown + # now we have a root filesystem somewhere in /dev/sda* # let the normal block handler handle root= exit 0 diff --git a/modules.d/95nbd/nbdroot b/modules.d/95nbd/nbdroot index 1fb2140..e20b4e4 100755 --- a/modules.d/95nbd/nbdroot +++ b/modules.d/95nbd/nbdroot @@ -107,4 +107,5 @@ fi # NBD doesn't emit uevents when it gets connected, so kick it echo change > /sys/block/nbd0/uevent udevadm settle +need_shutdown exit 0 diff --git a/modules.d/95nfs/nfsroot b/modules.d/95nfs/nfsroot index 2103e24..764971b 100755 --- a/modules.d/95nfs/nfsroot +++ b/modules.d/95nfs/nfsroot @@ -106,4 +106,4 @@ echo 'settle_exit_if_exists="--exit-if-exists=/dev/root"; rm "$job"' > $hookdir/ # force udevsettle to break > $hookdir/initqueue/work - +need_shutdown diff --git a/modules.d/98usrmount/mount-usr.sh b/modules.d/98usrmount/mount-usr.sh index 5139c7a..9998624 100755 --- a/modules.d/98usrmount/mount-usr.sh +++ b/modules.d/98usrmount/mount-usr.sh @@ -11,6 +11,16 @@ mount_usr() # check, if we have to mount the /usr filesystem while read _dev _mp _fs _opts _rest; do if [ "$_mp" = "/usr" ]; then + case "$_dev" in + LABEL=*) + _dev="$(echo $_dev | sed 's,/,\\x2f,g')" + _dev="/dev/disk/by-label/${_dev#LABEL=}" + ;; + UUID=*) + _dev="${_dev#block:}" + _dev="/dev/disk/by-uuid/${_dev#UUID=}" + ;; + esac echo "$_dev ${NEWROOT}${_mp} $_fs ${_opts} $_rest" _usr_found="1" break diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh index 4897a3d..6b70adf 100755 --- a/modules.d/99base/dracut-lib.sh +++ b/modules.d/99base/dracut-lib.sh @@ -738,3 +738,7 @@ killproc() { fi done } + +need_shutdown() { + >/run/initramfs/.need_shutdown +}