From 1a6f5e35853e06d024078e552530c6d9e8e2a4c6 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Mar 15 2013 06:20:38 +0000 Subject: systemd-198-5 - do not mount anything, when not running as pid 1 - add initrd.target for systemd in the initrd --- diff --git a/0061-main-don-t-mount-sys-dev-and-friends-when-we-run-wit.patch b/0061-main-don-t-mount-sys-dev-and-friends-when-we-run-wit.patch new file mode 100644 index 0000000..88b23cc --- /dev/null +++ b/0061-main-don-t-mount-sys-dev-and-friends-when-we-run-wit.patch @@ -0,0 +1,32 @@ +From c1dae1b3c9729fb8ab749dd4e2dad07e0fad7ed8 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Thu, 14 Mar 2013 21:36:38 +0100 +Subject: [PATCH] main: don't mount /sys, /dev and friends when we run with PID + != 1 + +Back from old times when we developed systemd on non-systemd hosts we +still mounted the missing directories such as the cgroup stuff even when +running with a PID != 1. There's no point for that anymore, so let's +just do that if we are actually PID 1, and never otherwise. + +https://bugs.freedesktop.org/show_bug.cgi?id=62354 +--- + src/core/main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/core/main.c b/src/core/main.c +index 7b03983..01a6d41 100644 +--- a/src/core/main.c ++++ b/src/core/main.c +@@ -1437,7 +1437,7 @@ int main(int argc, char *argv[]) { + + /* Mount /proc, /sys and friends, so that /proc/cmdline and + * /proc/$PID/fd is available. */ +- if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS")) { ++ if (getpid() == 1) { + r = mount_setup(loaded_policy); + if (r < 0) + goto finish; +-- +1.8.1 + diff --git a/0062-Make-initrd.target-the-default-target-in-the-initrd.patch b/0062-Make-initrd.target-the-default-target-in-the-initrd.patch new file mode 100644 index 0000000..3d1b471 --- /dev/null +++ b/0062-Make-initrd.target-the-default-target-in-the-initrd.patch @@ -0,0 +1,348 @@ +From 9e5f0f92915b777308797294c6e103e430957b5d Mon Sep 17 00:00:00 2001 +From: Harald Hoyer +Date: Thu, 14 Mar 2013 13:12:10 +0100 +Subject: [PATCH] Make initrd.target the default target in the initrd + +First, rename root-fs.target to initrd-root-fs.target to clarify its usage. + +Mount units with "x-initrd-rootfs.mount" are now ordered before +initrd-root-fs.target. As we sometimes construct /sysroot mounts in +/etc/fstab in the initrd, we want these to be mounted before the +initrd-root-fs.target is active. + +initrd.target can be the default target in the initrd. + + (normal startup) + : + : + v + basic.target + | + ______________________/| + / | + | sysroot.mount + | | + | v + | initrd-root-fs.target + | | + | v + | initrd-parse-etc.service +(custom initrd services) | + | v + | (sysroot-usr.mount and + | various mounts marked + | with fstab option + | x-initrd.mount) + | | + | v + | initrd-fs.target + | | + \______________________ | + \| + v + initrd.target + | + v + initrd-cleanup.service + isolates to + initrd-switch-root.target + | + v + ______________________/| + / | + | initrd-udevadm-cleanup-db.service + | | +(custom initrd services) | + | | + \______________________ | + \| + v + initrd-switch-root.target + | + v + initrd-switch-root.service + | + v + switch-root +--- + Makefile.am | 3 +- + man/bootup.xml | 73 +++++++++++++++++++++++++ + man/systemd.special.xml | 4 +- + src/core/special.h | 2 +- + src/fstab-generator/fstab-generator.c | 11 +++- + units/initrd-cleanup.service.in | 3 +- + units/initrd-fs.target | 1 + + units/initrd-parse-etc.service.in | 7 ++- + units/{root-fs.target => initrd-root-fs.target} | 2 + + units/initrd-switch-root.target | 4 +- + units/initrd.target | 17 ++++++ + 11 files changed, 115 insertions(+), 12 deletions(-) + rename units/{root-fs.target => initrd-root-fs.target} (89%) + create mode 100644 units/initrd.target + +diff --git a/Makefile.am b/Makefile.am +index 175d14b..cf21544 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -347,8 +347,9 @@ dist_systemunit_DATA = \ + units/kexec.target \ + units/local-fs.target \ + units/local-fs-pre.target \ ++ units/initrd.target \ + units/initrd-fs.target \ +- units/root-fs.target \ ++ units/initrd-root-fs.target \ + units/remote-fs.target \ + units/remote-fs-pre.target \ + units/network.target \ +diff --git a/man/bootup.xml b/man/bootup.xml +index f65abf5..6bd22ef 100644 +--- a/man/bootup.xml ++++ b/man/bootup.xml +@@ -174,6 +174,79 @@ + + + ++ Systemd in the Initrd ++ If the initrd creation tool used the services provided ++ by systemd, the default target in the initrd is the ++ initrd-fs.target. The process is the same as above until the basic.target is reached. ++ Systemd now continues to the initrd.target. If the root device could be mounted ++ on /sysroot, the sysroot.mount unit is active and the initrd-root-fs.target is reached. ++ initrd-parse-etc.service scans /sysroot/etc/fstab for the /usr mountpoint and for entries ++ marked with the x-initrd.mount option set. If these mountpoint are ++ mounted in /sysroot, the initrd-fs.target is reached. ++ The initrd-cleanup.service isolates to the initrd-switch-root.target, ++ where cleanup services can run. At the very last end ++ initrd-switch-root.service is activated, which will cause ++ the system to switch root to /sysroot. ++ ++ ++ ++ (same as above) ++ : ++ : ++ v ++ basic.target ++ | emergency.service ++ ______________________/| | ++ / | v ++ | sysroot.mount emergency.target ++ | | ++ | v ++ | initrd-root-fs.target ++ | | ++ | v ++ | initrd-parse-etc.service ++ (custom initrd services) | ++ | v ++ | (sysroot-usr.mount and ++ | various mounts marked ++ | with fstab option ++ | x-initrd.mount) ++ | | ++ | v ++ | initrd-fs.target ++ | | ++ \______________________ | ++ \| ++ v ++ initrd.target ++ | ++ v ++ initrd-cleanup.service ++ isolates to ++ initrd-switch-root.target ++ | ++ v ++ ______________________/| ++ / | ++ | initrd-udevadm-cleanup-db.service ++ | | ++ (custom initrd services) | ++ | | ++ \______________________ | ++ \| ++ v ++ initrd-switch-root.target ++ | ++ v ++ initrd-switch-root.service ++ | ++ v ++ switch-root ++ ++ ++ ++ ++ + System Manager Shutdown + + System shutdown also consists of various target +diff --git a/man/systemd.special.xml b/man/systemd.special.xml +index 7b78099..67a81b6 100644 +--- a/man/systemd.special.xml ++++ b/man/systemd.special.xml +@@ -79,7 +79,7 @@ + remote-fs.target, + remote-fs-pre.target, + rescue.target, +- root-fs.target, ++ initrd-root-fs.target, + rpcbind.target, + runlevel2.target, + runlevel3.target, +@@ -523,7 +523,7 @@ + + + +- root-fs.target ++ initrd-root-fs.target + + systemd automatically + adds dependencies of type +diff --git a/src/core/special.h b/src/core/special.h +index 52e593b..c7b856e 100644 +--- a/src/core/special.h ++++ b/src/core/special.h +@@ -49,7 +49,7 @@ + #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_INITRD_ROOT_FS_TARGET "initrd-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 b4fb134..cf85d31 100644 +--- a/src/fstab-generator/fstab-generator.c ++++ b/src/fstab-generator/fstab-generator.c +@@ -199,6 +199,12 @@ static bool mount_in_initrd(struct mntent *me) { + streq(me->mnt_dir, "/usr"); + } + ++static bool mount_is_rootfs(struct mntent *me) { ++ assert(me); ++ ++ return hasmntopt(me, "x-initrd-rootfs.mount"); ++} ++ + 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, + const char *pre, const char *post, const char *source) { +@@ -434,6 +440,9 @@ static int parse_fstab(const char *prefix, bool initrd) { + if (initrd) { + post = SPECIAL_INITRD_FS_TARGET; + pre = NULL; ++ } else if (mount_is_rootfs(me)) { ++ post = SPECIAL_INITRD_ROOT_FS_TARGET; ++ pre = NULL; + } else if (mount_is_network(me)) { + post = SPECIAL_REMOTE_FS_TARGET; + pre = SPECIAL_REMOTE_FS_PRE_TARGET; +@@ -525,7 +534,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, NULL, SPECIAL_ROOT_FS_TARGET, "/proc/cmdline"); ++ false, NULL, SPECIAL_INITRD_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 5bef090..218ec80 100644 +--- a/units/initrd-cleanup.service.in ++++ b/units/initrd-cleanup.service.in +@@ -10,8 +10,7 @@ Description=Cleaning Up and Shutting Down Daemons + DefaultDependencies=no + ConditionPathExists=/etc/initrd-release + OnFailure=emergency.target +-Wants=root-fs.target initrd-fs.target +-After=root-fs.target initrd-fs.target ++After=initrd-root-fs.target initrd-fs.target initrd.target + + [Service] + Type=oneshot +diff --git a/units/initrd-fs.target b/units/initrd-fs.target +index 6ba1758..7578b88 100644 +--- a/units/initrd-fs.target ++++ b/units/initrd-fs.target +@@ -11,3 +11,4 @@ Documentation=man:systemd.special(7) + OnFailure=emergency.target + OnFailureIsolate=yes + ConditionPathExists=/etc/initrd-release ++After=initrd-parse-etc.service +diff --git a/units/initrd-parse-etc.service.in b/units/initrd-parse-etc.service.in +index 44fee7b..07728e2 100644 +--- a/units/initrd-parse-etc.service.in ++++ b/units/initrd-parse-etc.service.in +@@ -8,13 +8,14 @@ + [Unit] + Description=Reload Configuration from the Real Root + DefaultDependencies=no +-Requires=root-fs.target +-After=root-fs.target ++Requires=initrd-root-fs.target ++After=initrd-root-fs.target + OnFailure=emergency.target + ConditionPathExists=/etc/initrd-release + + [Service] + Type=oneshot + ExecStartPre=@rootbindir@/systemctl daemon-reload +-ExecStart=@rootbindir@/systemctl start initrd-fs.target ++# we have to retrigger initrd-fs.target after daemon-reload ++ExecStart=-@rootbindir@/systemctl --no-block start initrd-fs.target + ExecStart=@rootbindir@/systemctl --no-block start initrd-cleanup.service +diff --git a/units/root-fs.target b/units/initrd-root-fs.target +similarity index 89% +rename from units/root-fs.target +rename to units/initrd-root-fs.target +index 1351534..cd189f0 100644 +--- a/units/root-fs.target ++++ b/units/initrd-root-fs.target +@@ -9,3 +9,5 @@ + Description=Initrd Root File System + Documentation=man:systemd.special(7) + ConditionPathExists=/etc/initrd-release ++OnFailure=emergency.target ++OnFailureIsolate=yes +diff --git a/units/initrd-switch-root.target b/units/initrd-switch-root.target +index cf646c4..f347687 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 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 ++Wants=initrd-udevadm-cleanup-db.service initrd-root-fs.target initrd-fs.target systemd-journald.service ++After=initrd-udevadm-cleanup-db.service initrd-root-fs.target initrd-fs.target emergency.service emergency.target +diff --git a/units/initrd.target b/units/initrd.target +new file mode 100644 +index 0000000..5622de4 +--- /dev/null ++++ b/units/initrd.target +@@ -0,0 +1,17 @@ ++# 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 Target ++Documentation=man:systemd.special(7) ++OnFailure=emergency.target ++OnFailureIsolate=yes ++ConditionPathExists=/etc/initrd-release ++Requires=basic.target ++Wants=initrd-root-fs.target initrd-fs.target initrd-parse-etc.service ++After=initrd-root-fs.target initrd-fs.target basic.target rescue.service rescue.target ++AllowIsolate=yes +-- +1.8.1 + diff --git a/systemd.spec b/systemd.spec index f1b8ba5..85e009d 100644 --- a/systemd.spec +++ b/systemd.spec @@ -14,7 +14,7 @@ Name: systemd Url: http://www.freedesktop.org/wiki/Software/systemd Version: 198 -Release: 4%{?gitcommit:.git%{gitcommit}}%{?dist} +Release: 5%{?gitcommit:.git%{gitcommit}}%{?dist} # For a breakdown of the licensing, see README License: LGPLv2+ and MIT and GPLv2+ Summary: A System and Service Manager @@ -80,7 +80,7 @@ Provides: systemd-units = %{version}-%{release} # part of system since f18, drop at f20 Provides: udev = %{version} Obsoletes: udev < 183 -Conflicts: dracut < 026-19 +Conflicts: dracut < 026-48 # f18 version, drop at f20 Conflicts: plymouth < 0.8.5.1 # Ensures correct multilib updates added F18, drop at F20 @@ -101,6 +101,8 @@ Provides: systemd-analyze = 198 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 +Patch61: 0061-main-don-t-mount-sys-dev-and-friends-when-we-run-wit.patch +Patch62: 0062-Make-initrd.target-the-default-target-in-the-initrd.patch # kernel-install patch for grubby, drop if grubby is obsolete Patch1000: kernel-install-grubby.patch @@ -750,6 +752,10 @@ fi %{_libdir}/pkgconfig/gudev-1.0* %changelog +* Fri Mar 15 2013 Harald Hoyer 198-5 +- do not mount anything, when not running as pid 1 +- add initrd.target for systemd in the initrd + * Wed Mar 13 2013 Harald Hoyer 198-4 - fix switch-root and local-fs.target problem - patch kernel-install to use grubby, if available