diff --git a/0007-Backup-and-restore-run-initramfs-via-systemd-service.patch b/0007-Backup-and-restore-run-initramfs-via-systemd-service.patch index f281d79..8dca35b 100644 --- a/0007-Backup-and-restore-run-initramfs-via-systemd-service.patch +++ b/0007-Backup-and-restore-run-initramfs-via-systemd-service.patch @@ -1,18 +1,16 @@ -From 39fdc4101ac9c04a2b8365567739da8573f12431 Mon Sep 17 00:00:00 2001 +From 4cfd24d1799fafacf6624c9638454de93dd6f331 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Fri, 10 Feb 2012 09:37:18 +0100 Subject: [PATCH] Backup and restore /run/initramfs via systemd services This saves the space /run/initramfs is taking for the shutdown - -[Raw patch edited by kay, this is not the git version] --- Makefile | 16 ++++++++++++++-- dracut-backup.service | 15 +++++++++++++++ dracut-initramfs-backup.sh | 22 ++++++++++++++++++++++ dracut-restore.service | 18 ++++++++++++++++++ - dracut.spec | 12 +++++++++++- - 5 files changed, 80 insertions(+), 3 deletions(-) + dracut.spec | 13 ++++++++++++- + 5 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 dracut-backup.service create mode 100644 dracut-initramfs-backup.sh create mode 100644 dracut-restore.service @@ -67,7 +65,7 @@ new file mode 100644 index 0000000..69110eb --- /dev/null +++ b/dracut-backup.service -@@ -0,0 +1,16 @@ +@@ -0,0 +1,15 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it @@ -77,7 +75,6 @@ index 0000000..69110eb + +[Unit] +Description=Save /run/initramfs -+DefaultDependencies=no +ConditionPathExists=/run/initramfs + +[Service] @@ -138,7 +135,7 @@ index 0000000..3a07efe +RemainAfterExit=yes \ No newline at end of file diff --git a/dracut.spec b/dracut.spec -index 1b0b76b..17a62b2 100644 +index 1b0b76b..6efd553 100644 --- a/dracut.spec +++ b/dracut.spec @@ -27,6 +27,7 @@ Source0: http://www.kernel.org/pub/linux/utils/boot/dracut/dracut-%{version}.tar @@ -170,7 +167,15 @@ index 1b0b76b..17a62b2 100644 echo %{name}-%{version}-%{release} > $RPM_BUILD_ROOT/%{dracutlibdir}/modules.d/10rpmversion/dracut-version -@@ -266,6 +272,10 @@ rm -rf $RPM_BUILD_ROOT +@@ -217,6 +223,7 @@ rm -rf $RPM_BUILD_ROOT + %dir %{dracutlibdir}/modules.d + %{dracutlibdir}/dracut-functions + %{dracutlibdir}/dracut-logger ++%{dracutlibdir}/dracut-initramfs-backup + %config(noreplace) /etc/dracut.conf + %if 0%{?fedora} || 0%{?suse_version} || 0%{?rhel} > 6 + %config /etc/dracut.conf.d/01-dist.conf +@@ -266,6 +273,10 @@ rm -rf $RPM_BUILD_ROOT %config(noreplace) /etc/logrotate.d/dracut_log %attr(0644,root,root) %ghost %config(missingok,noreplace) %{_localstatedir}/log/dracut.log %dir %{_sharedstatedir}/initramfs diff --git a/0008-shutdown-on-demand.patch b/0008-shutdown-on-demand.patch new file mode 100644 index 0000000..a2815f9 --- /dev/null +++ b/0008-shutdown-on-demand.patch @@ -0,0 +1,349 @@ +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 ++} diff --git a/dracut.spec b/dracut.spec index fd59124..bf45aba 100644 --- a/dracut.spec +++ b/dracut.spec @@ -10,7 +10,7 @@ Name: dracut Version: 015 -Release: 9.git20120210%{?dist} +Release: 9.git20120213%{?dist} Summary: Initramfs generator using udev %if 0%{?fedora} || 0%{?rhel} > 6 @@ -31,6 +31,7 @@ Patch4: 0004-dracut-honor-binaries-in-sbin-first.patch Patch5: 0005-98usrmount-mount-usr.sh-remove-extra-slash.patch Patch6: 0006-99shutdown-shutdown-don-t-do-console_init-on-shutdow.patch Patch7: 0007-Backup-and-restore-run-initramfs-via-systemd-service.patch +Patch8: 0008-shutdown-on-demand.patch BuildArch: noarch @@ -231,7 +232,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