diff --git a/0013-build-sys-don-t-hard-code-binary-paths-in-initrd-.se.patch b/0013-build-sys-don-t-hard-code-binary-paths-in-initrd-.se.patch new file mode 100644 index 0000000..a6ae04e --- /dev/null +++ b/0013-build-sys-don-t-hard-code-binary-paths-in-initrd-.se.patch @@ -0,0 +1,119 @@ +From 7b40ce553f0ec9487077e53f5bdc46580025901c Mon Sep 17 00:00:00 2001 +From: Michael Biebl +Date: Sat, 9 Mar 2013 09:46:11 +0100 +Subject: [PATCH] build-sys: don't hard-code binary paths in initrd-*.service + +Instead use @bindir@ for udevadm and @rootbindir@ for systemctl. +--- + Makefile.am | 16 ++++++++++------ + ...{initrd-cleanup.service => initrd-cleanup.service.in} | 2 +- + ...trd-parse-etc.service => initrd-parse-etc.service.in} | 6 +++--- + ...switch-root.service => initrd-switch-root.service.in} | 2 +- + ...p-db.service => initrd-udevadm-cleanup-db.service.in} | 2 +- + 5 files changed, 16 insertions(+), 12 deletions(-) + rename units/{initrd-cleanup.service => initrd-cleanup.service.in} (87%) + rename units/{initrd-parse-etc.service => initrd-parse-etc.service.in} (75%) + rename units/{initrd-switch-root.service => initrd-switch-root.service.in} (88%) + rename units/{initrd-udevadm-cleanup-db.service => initrd-udevadm-cleanup-db.service.in} (93%) + +diff --git a/Makefile.am b/Makefile.am +index 05bf582..afd259a 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -382,11 +382,7 @@ dist_systemunit_DATA = \ + units/systemd-udevd-control.socket \ + units/systemd-udevd-kernel.socket \ + units/system-update.target \ +- units/initrd-parse-etc.service \ +- units/initrd-cleanup.service \ +- units/initrd-switch-root.target \ +- units/initrd-udevadm-cleanup-db.service \ +- units/initrd-switch-root.service ++ units/initrd-switch-root.target + + nodist_systemunit_DATA = \ + units/getty@.service \ +@@ -418,7 +414,11 @@ nodist_systemunit_DATA = \ + units/systemd-udevd.service \ + units/systemd-udev-trigger.service \ + units/systemd-udev-settle.service \ +- units/debug-shell.service ++ units/debug-shell.service \ ++ units/initrd-parse-etc.service \ ++ units/initrd-cleanup.service \ ++ units/initrd-udevadm-cleanup-db.service \ ++ units/initrd-switch-root.service + + dist_userunit_DATA = \ + units/user/default.target \ +@@ -460,6 +460,10 @@ EXTRA_DIST += \ + units/systemd-hybrid-sleep.service.in \ + units/systemd-suspend.service.in \ + units/quotaon.service.in \ ++ units/initrd-parse-etc.service.in \ ++ units/initrd-cleanup.service.in \ ++ units/initrd-udevadm-cleanup-db.service.in \ ++ units/initrd-switch-root.service.in \ + introspect.awk \ + man/custom-html.xsl + +diff --git a/units/initrd-cleanup.service b/units/initrd-cleanup.service.in +similarity index 87% +rename from units/initrd-cleanup.service +rename to units/initrd-cleanup.service.in +index 8998696..e926a1e 100644 +--- a/units/initrd-cleanup.service ++++ b/units/initrd-cleanup.service.in +@@ -15,4 +15,4 @@ After=local-fs.target swap.target + + [Service] + Type=oneshot +-ExecStart=/usr/bin/systemctl --no-block isolate initrd-switch-root.target ++ExecStart=@rootbindir@/systemctl --no-block isolate initrd-switch-root.target +diff --git a/units/initrd-parse-etc.service b/units/initrd-parse-etc.service.in +similarity index 75% +rename from units/initrd-parse-etc.service +rename to units/initrd-parse-etc.service.in +index 3a71a7e..1a2711a 100644 +--- a/units/initrd-parse-etc.service ++++ b/units/initrd-parse-etc.service.in +@@ -15,6 +15,6 @@ ConditionPathExists=/etc/initrd-release + + [Service] + Type=oneshot +-ExecStartPre=/usr/bin/systemctl daemon-reload +-ExecStart=/usr/bin/systemctl start local-fs.target +-ExecStart=/usr/bin/systemctl --no-block start initrd-cleanup.service ++ExecStartPre=@rootbindir@/systemctl daemon-reload ++ExecStart=@rootbindir@/systemctl start local-fs.target ++ExecStart=@rootbindir@/systemctl --no-block start initrd-cleanup.service +diff --git a/units/initrd-switch-root.service b/units/initrd-switch-root.service.in +similarity index 88% +rename from units/initrd-switch-root.service +rename to units/initrd-switch-root.service.in +index e076b39..6740264 100644 +--- a/units/initrd-switch-root.service ++++ b/units/initrd-switch-root.service.in +@@ -15,5 +15,5 @@ AllowIsolate=yes + [Service] + Type=oneshot + # we have to use "--force" here, otherwise systemd would umount /run +-ExecStart=/usr/bin/systemctl --no-block --force switch-root /sysroot ++ExecStart=@rootbindir@/systemctl --no-block --force switch-root /sysroot + KillMode=none +diff --git a/units/initrd-udevadm-cleanup-db.service b/units/initrd-udevadm-cleanup-db.service.in +similarity index 93% +rename from units/initrd-udevadm-cleanup-db.service +rename to units/initrd-udevadm-cleanup-db.service.in +index 983189e..b800c21 100644 +--- a/units/initrd-udevadm-cleanup-db.service ++++ b/units/initrd-udevadm-cleanup-db.service.in +@@ -15,4 +15,4 @@ Before=initrd-switch-root.target + + [Service] + Type=oneshot +-ExecStart=-/usr/bin/udevadm info --cleanup-db ++ExecStart=-@bindir@/udevadm info --cleanup-db +-- +1.8.1 + diff --git a/0045-add-initrd-fs.target-and-root-fs.target.patch b/0045-add-initrd-fs.target-and-root-fs.target.patch new file mode 100644 index 0000000..ccdf5ad --- /dev/null +++ b/0045-add-initrd-fs.target-and-root-fs.target.patch @@ -0,0 +1,365 @@ +From 700e07ffd53083114e91bb4ba646ed26d0463f67 Mon Sep 17 00:00:00 2001 +From: Harald Hoyer +Date: Mon, 4 Mar 2013 19:01:05 +0100 +Subject: [PATCH] add initrd-fs.target and root-fs.target + +Instead of using local-fs*.target in the initrd, use root-fs.target for +sysroot.mount and initrd-fs.target for /sysroot/usr and friends. + +Using local-fs.target would mean to carry over the activated +local-fs.target to the isolated initrd-switch-root.target and thus in +the real root. Having local-fs.target already active after +deserialization causes ordering problems with the real root services and +targets. + +We better isolate to targets for initrd-switch-root.target, which are +only available in the initrd. +--- + Makefile.am | 2 + + man/systemd.special.xml | 30 +++++++++++++ + src/core/special.h | 2 + + src/fstab-generator/fstab-generator.c | 79 ++++++++++++++++++++--------------- + units/initrd-cleanup.service.in | 4 +- + units/initrd-fs.target | 13 ++++++ + units/initrd-parse-etc.service.in | 6 +-- + units/initrd-switch-root.target | 4 +- + units/root-fs.target | 11 +++++ + 9 files changed, 110 insertions(+), 41 deletions(-) + create mode 100644 units/initrd-fs.target + create mode 100644 units/root-fs.target + +diff --git a/Makefile.am b/Makefile.am +index b6d3306..2a010c7 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -347,6 +347,8 @@ dist_systemunit_DATA = \ + units/kexec.target \ + units/local-fs.target \ + units/local-fs-pre.target \ ++ units/initrd-fs.target \ ++ units/root-fs.target \ + units/remote-fs.target \ + units/remote-fs-pre.target \ + units/network.target \ +diff --git a/man/systemd.special.xml b/man/systemd.special.xml +index 0d1df84..7b78099 100644 +--- a/man/systemd.special.xml ++++ b/man/systemd.special.xml +@@ -64,6 +64,7 @@ + halt.target, + hibernate.target, + hybrid-sleep.target, ++ initrd-fs.target, + kbrequest.target, + kexec.target, + local-fs.target, +@@ -78,6 +79,7 @@ + remote-fs.target, + remote-fs-pre.target, + rescue.target, ++ root-fs.target, + rpcbind.target, + runlevel2.target, + runlevel3.target, +@@ -296,6 +298,22 @@ + + + ++ initrd-fs.target ++ ++ systemd automatically ++ adds dependencies of type ++ Before to sysroot-usr.mount and ++ all mount points fround in ++ /etc/fstab ++ that have the ++ and ++ ++ mount options set. ++ See also systemd-fstab-generator. ++ ++ ++ ++ + kbrequest.target + + systemd starts this +@@ -505,6 +523,17 @@ + + + ++ root-fs.target ++ ++ systemd automatically ++ adds dependencies of type ++ Before to the sysroot.mount unit, ++ which is generated from the kernel command ++ line by the systemd-fstab-generator. ++ ++ ++ ++ + rpcbind.target + + systemd automatically +@@ -760,6 +789,7 @@ + systemd.socket5, + systemd.target5, + bootup7 ++ systemd-fstab-generator8 + + + +diff --git a/src/core/special.h b/src/core/special.h +index 99c0e12..52e593b 100644 +--- a/src/core/special.h ++++ b/src/core/special.h +@@ -48,6 +48,8 @@ + #define SPECIAL_SOCKETS_TARGET "sockets.target" + #define SPECIAL_LOCAL_FS_TARGET "local-fs.target" + #define SPECIAL_LOCAL_FS_PRE_TARGET "local-fs-pre.target" ++#define SPECIAL_INITRD_FS_TARGET "initrd-fs.target" ++#define SPECIAL_ROOT_FS_TARGET "root-fs.target" + #define SPECIAL_REMOTE_FS_TARGET "remote-fs.target" /* LSB's $remote_fs */ + #define SPECIAL_REMOTE_FS_PRE_TARGET "remote-fs-pre.target" + #define SPECIAL_SWAP_TARGET "swap.target" +diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c +index 910bbc1..b4fb134 100644 +--- a/src/fstab-generator/fstab-generator.c ++++ b/src/fstab-generator/fstab-generator.c +@@ -200,14 +200,13 @@ static bool mount_in_initrd(struct mntent *me) { + } + + static int add_mount(const char *what, const char *where, const char *type, const char *opts, +- int passno, bool noauto, bool nofail, bool automount, bool isbind, bool isnetwork, +- const char *source) { ++ int passno, bool noauto, bool nofail, bool automount, bool isbind, ++ const char *pre, const char *post, const char *source) { + char _cleanup_free_ + *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL, + *automount_name = NULL, *automount_unit = NULL; + FILE _cleanup_fclose_ *f = NULL; + int r; +- const char *post, *pre; + + assert(what); + assert(where); +@@ -227,14 +226,6 @@ static int add_mount(const char *what, const char *where, const char *type, cons + mount_point_ignore(where)) + return 0; + +- if (isnetwork) { +- post = SPECIAL_REMOTE_FS_TARGET; +- pre = SPECIAL_REMOTE_FS_PRE_TARGET; +- } else { +- post = SPECIAL_LOCAL_FS_TARGET; +- pre = SPECIAL_LOCAL_FS_PRE_TARGET; +- } +- + name = unit_name_from_path(where, ".mount"); + if (!name) + return log_oom(); +@@ -259,17 +250,19 @@ static int add_mount(const char *what, const char *where, const char *type, cons + "DefaultDependencies=no\n", + source); + +- if (!path_equal(where, "/")) ++ if (!path_equal(where, "/")) { ++ if (pre) ++ fprintf(f, ++ "After=%s\n" ++ "Wants=%s\n", ++ pre, ++ pre); + fprintf(f, +- "After=%s\n" +- "Wants=%s\n" + "Conflicts=" SPECIAL_UMOUNT_TARGET "\n" +- "Before=" SPECIAL_UMOUNT_TARGET "\n", +- pre, +- pre); +- ++ "Before=" SPECIAL_UMOUNT_TARGET "\n"); ++ } + +- if (!noauto && !nofail && !automount) ++ if (post && !noauto && !nofail && !automount) + fprintf(f, + "Before=%s\n", + post); +@@ -299,14 +292,16 @@ static int add_mount(const char *what, const char *where, const char *type, cons + } + + if (!noauto) { +- lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL); +- if (!lnk) +- return log_oom(); ++ if (post) { ++ lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL); ++ if (!lnk) ++ return log_oom(); + +- mkdir_parents_label(lnk, 0755); +- if (symlink(unit, lnk) < 0) { +- log_error("Failed to create symlink %s: %m", lnk); +- return -errno; ++ mkdir_parents_label(lnk, 0755); ++ if (symlink(unit, lnk) < 0) { ++ log_error("Failed to create symlink %s: %m", lnk); ++ return -errno; ++ } + } + + if (!isbind && +@@ -353,12 +348,17 @@ static int add_mount(const char *what, const char *where, const char *type, cons + "SourcePath=%s\n" + "DefaultDependencies=no\n" + "Conflicts=" SPECIAL_UMOUNT_TARGET "\n" +- "Before=" SPECIAL_UMOUNT_TARGET " %s\n" +- "\n" ++ "Before=" SPECIAL_UMOUNT_TARGET "\n", ++ source); ++ ++ if (post) ++ fprintf(f, ++ "Before= %s\n", ++ post); ++ ++ fprintf(f, + "[Automount]\n" + "Where=%s\n", +- source, +- post, + where); + + fflush(f); +@@ -421,7 +421,8 @@ static int parse_fstab(const char *prefix, bool initrd) { + if (streq(me->mnt_type, "swap")) + k = add_swap(what, me); + else { +- bool noauto, nofail, automount, isbind, isnetwork; ++ bool noauto, nofail, automount, isbind; ++ const char *pre, *post; + + noauto = !!hasmntopt(me, "noauto"); + nofail = !!hasmntopt(me, "nofail"); +@@ -429,11 +430,21 @@ static int parse_fstab(const char *prefix, bool initrd) { + hasmntopt(me, "comment=systemd.automount") || + hasmntopt(me, "x-systemd.automount"); + isbind = mount_is_bind(me); +- isnetwork = mount_is_network(me); ++ ++ if (initrd) { ++ post = SPECIAL_INITRD_FS_TARGET; ++ pre = NULL; ++ } else if (mount_is_network(me)) { ++ post = SPECIAL_REMOTE_FS_TARGET; ++ pre = SPECIAL_REMOTE_FS_PRE_TARGET; ++ } else { ++ post = SPECIAL_LOCAL_FS_TARGET; ++ pre = SPECIAL_LOCAL_FS_PRE_TARGET; ++ } + + k = add_mount(what, where, me->mnt_type, me->mnt_opts, + me->mnt_passno, noauto, nofail, automount, +- isbind, isnetwork, fstab_path); ++ isbind, pre, post, fstab_path); + } + + if (k < 0) +@@ -514,7 +525,7 @@ static int parse_new_root_from_proc_cmdline(void) { + + log_debug("Found entry what=%s where=/sysroot type=%s", what, type); + r = add_mount(what, "/sysroot", type, opts, 0, false, false, false, +- false, false, "/proc/cmdline"); ++ false, NULL, SPECIAL_ROOT_FS_TARGET, "/proc/cmdline"); + + return (r < 0) ? r : 0; + } +diff --git a/units/initrd-cleanup.service.in b/units/initrd-cleanup.service.in +index e926a1e..5bef090 100644 +--- a/units/initrd-cleanup.service.in ++++ b/units/initrd-cleanup.service.in +@@ -10,8 +10,8 @@ Description=Cleaning Up and Shutting Down Daemons + DefaultDependencies=no + ConditionPathExists=/etc/initrd-release + OnFailure=emergency.target +-Requires=local-fs.target swap.target +-After=local-fs.target swap.target ++Wants=root-fs.target initrd-fs.target ++After=root-fs.target initrd-fs.target + + [Service] + Type=oneshot +diff --git a/units/initrd-fs.target b/units/initrd-fs.target +new file mode 100644 +index 0000000..6ba1758 +--- /dev/null ++++ b/units/initrd-fs.target +@@ -0,0 +1,13 @@ ++# This file is part of systemd. ++# ++# systemd is free software; you can redistribute it and/or modify it ++# under the terms of the GNU Lesser General Public License as published by ++# the Free Software Foundation; either version 2.1 of the License, or ++# (at your option) any later version. ++ ++[Unit] ++Description=Initrd File Systems ++Documentation=man:systemd.special(7) ++OnFailure=emergency.target ++OnFailureIsolate=yes ++ConditionPathExists=/etc/initrd-release +diff --git a/units/initrd-parse-etc.service.in b/units/initrd-parse-etc.service.in +index 1a2711a..44fee7b 100644 +--- a/units/initrd-parse-etc.service.in ++++ b/units/initrd-parse-etc.service.in +@@ -8,13 +8,13 @@ + [Unit] + Description=Reload Configuration from the Real Root + DefaultDependencies=no +-Requires=local-fs.target swap.target +-After=local-fs.target swap.target ++Requires=root-fs.target ++After=root-fs.target + OnFailure=emergency.target + ConditionPathExists=/etc/initrd-release + + [Service] + Type=oneshot + ExecStartPre=@rootbindir@/systemctl daemon-reload +-ExecStart=@rootbindir@/systemctl start local-fs.target ++ExecStart=@rootbindir@/systemctl start initrd-fs.target + ExecStart=@rootbindir@/systemctl --no-block start initrd-cleanup.service +diff --git a/units/initrd-switch-root.target b/units/initrd-switch-root.target +index f706d29..cf646c4 100644 +--- a/units/initrd-switch-root.target ++++ b/units/initrd-switch-root.target +@@ -12,5 +12,5 @@ DefaultDependencies=no + Requires=initrd-switch-root.service + Before=initrd-switch-root.service + AllowIsolate=yes +-Wants=initrd-udevadm-cleanup-db.service local-fs.target swap.target systemd-journald.service +-After=initrd-udevadm-cleanup-db.service local-fs.target swap.target emergency.service emergency.target ++Wants=initrd-udevadm-cleanup-db.service root-fs.target initrd-fs.target systemd-journald.service ++After=initrd-udevadm-cleanup-db.service root-fs.target initrd-fs.target emergency.service emergency.target +diff --git a/units/root-fs.target b/units/root-fs.target +new file mode 100644 +index 0000000..1351534 +--- /dev/null ++++ b/units/root-fs.target +@@ -0,0 +1,11 @@ ++# This file is part of systemd. ++# ++# systemd is free software; you can redistribute it and/or modify it ++# under the terms of the GNU Lesser General Public License as published by ++# the Free Software Foundation; either version 2.1 of the License, or ++# (at your option) any later version. ++ ++[Unit] ++Description=Initrd Root File System ++Documentation=man:systemd.special(7) ++ConditionPathExists=/etc/initrd-release +-- +1.8.1 + diff --git a/kernel-install-grubby.patch b/kernel-install-grubby.patch new file mode 100644 index 0000000..38505d9 --- /dev/null +++ b/kernel-install-grubby.patch @@ -0,0 +1,43 @@ +From 5150a366a4771a2a498d4e062482728d1dce94dd Mon Sep 17 00:00:00 2001 +From: Harald Hoyer +Date: Wed, 13 Mar 2013 07:57:53 +0100 +Subject: [PATCH] kernel-install: add fedora specific callouts to + new-kernel-pkg + +--- + src/kernel-install/kernel-install | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/src/kernel-install/kernel-install b/src/kernel-install/kernel-install +index 16c06e0..cf9829e 100644 +--- a/src/kernel-install/kernel-install ++++ b/src/kernel-install/kernel-install +@@ -25,6 +25,25 @@ COMMAND="$1" + KERNEL_VERSION="$2" + KERNEL_IMAGE="$3" + ++if [[ -x /sbin/new-kernel-pkg ]]; then ++ case "$COMMAND" in ++ add) ++ /sbin/new-kernel-pkg --package kernel --mkinitrd --dracut --depmod --install "$KERNEL_VERSION" || exit $? ++ /sbin/new-kernel-pkg --package kernel --rpmposttrans "$KERNEL_VERSION" || exit $? ++ ;; ++ remove) ++ /sbin/new-kernel-pkg --rminitrd --rmmoddep --remove "$KERNEL_VERSION" || exit $? ++ ;; ++ *) ++ ;; ++ esac ++ ++ # exit, if we can't find a boot loader spec conforming setup ++ if ! [[ -d /boot/loader/entries || -L /boot/loader/entries ]]; then ++ exit 0 ++ fi ++fi ++ + [[ -f /etc/os-release ]] && . /etc/os-release + if ! [[ $ID ]]; then + echo "Can't determine the name of your distribution. Please create /etc/os-release." >&2 +-- +1.8.1 + diff --git a/systemd.spec b/systemd.spec index fa65752..9da764a 100644 --- a/systemd.spec +++ b/systemd.spec @@ -25,7 +25,7 @@ Url: http://www.freedesktop.org/wiki/Software/systemd # THIS PACKAGE FOR A NON-RAWHIDE DEVELOPMENT DISTRIBUTION! Version: 198 -Release: 3%{?gitcommit:.git%{gitcommit}}%{?dist} +Release: 4%{?gitcommit:.git%{gitcommit}}%{?dist} # For a breakdown of the licensing, see README License: LGPLv2+ and MIT and GPLv2+ Summary: A System and Service Manager @@ -91,7 +91,7 @@ Provides: systemd-units = %{version}-%{release} # part of system since f18, drop at f20 Provides: udev = %{version} Obsoletes: udev < 183 -Conflicts: dracut < 026 +Conflicts: dracut < 026-19 # f18 version, drop at f20 Conflicts: plymouth < 0.8.5.1 # Ensures correct multilib updates added F18, drop at F20 @@ -107,6 +107,15 @@ Provides: nss-myhostname = 0.4 Obsoletes: systemd-analyze < 198 Provides: systemd-analyze = 198 +# patches for dracut's initramfs +# remove for new git snapshots or releases +BuildRequires: git +Patch13: 0013-build-sys-don-t-hard-code-binary-paths-in-initrd-.se.patch +Patch45: 0045-add-initrd-fs.target-and-root-fs.target.patch + +# kernel-install patch for grubby, drop if grubby is obsolete +Patch1000: kernel-install-grubby.patch + %description systemd is a system and service manager for Linux, compatible with SysV and LSB init scripts. systemd provides aggressive parallelization @@ -175,6 +184,22 @@ glib-based applications using libudev functionality. %prep %setup -q %{?gitcommit:-n %{name}-git%{gitcommit}} +if command -v git &>/dev/null && [ -n "%{patches}" ]; then + git init + git config user.email "systemd-maint@redhat.com" + git config user.name "Fedora systemd team" + git add . + git commit -a -q -m "%{version} baseline." + + # Apply all the patches. + git am %{patches} +else + +# kernel-install patch for grubby, drop if grubby is obsolete +%patch1000 -p1 + +fi + %build %{?gitcommit: ./autogen.sh } %configure \ @@ -736,6 +761,10 @@ fi %{_libdir}/pkgconfig/gudev-1.0* %changelog +* Wed Mar 13 2013 Harald Hoyer 198-4 +- fix switch-root and local-fs.target problem +- patch kernel-install to use grubby, if available + * Fri Mar 08 2013 Harald Hoyer 198-3 - add Conflict with dracut < 026 because of the new switch-root isolate