systemd-198-4

- temporarily fix switch-root and local-fs.target problem
- patch kernel-install to use grubby, if available
This commit is contained in:
Harald Hoyer 2013-03-13 08:31:41 +01:00
parent b59c3ff43c
commit 2e2e24ef36
4 changed files with 558 additions and 2 deletions

View File

@ -0,0 +1,119 @@
From 7b40ce553f0ec9487077e53f5bdc46580025901c Mon Sep 17 00:00:00 2001
From: Michael Biebl <biebl@debian.org>
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

View File

@ -0,0 +1,365 @@
From 700e07ffd53083114e91bb4ba646ed26d0463f67 Mon Sep 17 00:00:00 2001
From: Harald Hoyer <harald@redhat.com>
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 @@
<filename>halt.target</filename>,
<filename>hibernate.target</filename>,
<filename>hybrid-sleep.target</filename>,
+ <filename>initrd-fs.target</filename>,
<filename>kbrequest.target</filename>,
<filename>kexec.target</filename>,
<filename>local-fs.target</filename>,
@@ -78,6 +79,7 @@
<filename>remote-fs.target</filename>,
<filename>remote-fs-pre.target</filename>,
<filename>rescue.target</filename>,
+ <filename>root-fs.target</filename>,
<filename>rpcbind.target</filename>,
<filename>runlevel2.target</filename>,
<filename>runlevel3.target</filename>,
@@ -296,6 +298,22 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><filename>initrd-fs.target</filename></term>
+ <listitem>
+ <para>systemd automatically
+ adds dependencies of type
+ Before to sysroot-usr.mount and
+ all mount points fround in
+ <filename>/etc/fstab</filename>
+ that have the
+ <option>auto</option> and
+ <option>x-initrd.mount</option>
+ mount options set.
+ See also <literal>systemd-fstab-generator</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><filename>kbrequest.target</filename></term>
<listitem>
<para>systemd starts this
@@ -505,6 +523,17 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><filename>root-fs.target</filename></term>
+ <listitem>
+ <para>systemd automatically
+ adds dependencies of type
+ Before to the sysroot.mount unit,
+ which is generated from the kernel command
+ line by the <literal>systemd-fstab-generator</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><filename>rpcbind.target</filename></term>
<listitem>
<para>systemd automatically
@@ -760,6 +789,7 @@
<citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
<citerefentry><refentrytitle>systemd.target</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
<citerefentry><refentrytitle>bootup</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+ <citerefentry><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
</para>
</refsect1>
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

View File

@ -0,0 +1,43 @@
From 5150a366a4771a2a498d4e062482728d1dce94dd Mon Sep 17 00:00:00 2001
From: Harald Hoyer <harald@redhat.com>
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

View File

@ -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 <harald@redhat.com> 198-4
- fix switch-root and local-fs.target problem
- patch kernel-install to use grubby, if available
* Fri Mar 08 2013 Harald Hoyer <harald@redhat.com> 198-3
- add Conflict with dracut < 026 because of the new switch-root isolate