[systemd-devel] [PATCH V3] Make initrd-fs.target the default target in the initrd
harald at redhat.com
harald at redhat.com
Thu Mar 14 15:01:18 PDT 2013
From: Harald Hoyer <harald at redhat.com>
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-fs.target can now be isolated and be the default target in the
initrd.
(same as above)
:
:
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-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 | 2 +-
man/bootup.xml | 70 +++++++++++++++++++++++++
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 | 5 ++
units/initrd-parse-etc.service.in | 6 +--
units/{root-fs.target => initrd-root-fs.target} | 0
units/initrd-switch-root.target | 4 +-
10 files changed, 95 insertions(+), 12 deletions(-)
rename units/{root-fs.target => initrd-root-fs.target} (100%)
diff --git a/Makefile.am b/Makefile.am
index 175d14b..d92b24a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -348,7 +348,7 @@ dist_systemunit_DATA = \
units/local-fs.target \
units/local-fs-pre.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..26bb917 100644
--- a/man/bootup.xml
+++ b/man/bootup.xml
@@ -174,6 +174,76 @@
</refsect1>
<refsect1>
+ <title>Systemd in the Initrd</title>
+ <para>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-fs.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 <emphasis>x-initrd.mount</emphasis> 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.
+ </para>
+
+<programlisting>
+ (same as above)
+ :
+ :
+ v
+ basic.target
+ | emergency.service
+ ______________________/| |
+ / | v
+ | sysroot.mount <emphasis>emergency.target</emphasis>
+ | |
+ | 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-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
+</programlisting>
+ </refsect1>
+
+
+ <refsect1>
<title>System Manager Shutdown</title>
<para>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 @@
<filename>remote-fs.target</filename>,
<filename>remote-fs-pre.target</filename>,
<filename>rescue.target</filename>,
- <filename>root-fs.target</filename>,
+ <filename>initrd-root-fs.target</filename>,
<filename>rpcbind.target</filename>,
<filename>runlevel2.target</filename>,
<filename>runlevel3.target</filename>,
@@ -523,7 +523,7 @@
</listitem>
</varlistentry>
<varlistentry>
- <term><filename>root-fs.target</filename></term>
+ <term><filename>initrd-root-fs.target</filename></term>
<listitem>
<para>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..53f2dff 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
[Service]
Type=oneshot
diff --git a/units/initrd-fs.target b/units/initrd-fs.target
index 6ba1758..25b69f8 100644
--- a/units/initrd-fs.target
+++ b/units/initrd-fs.target
@@ -11,3 +11,8 @@ Documentation=man:systemd.special(7)
OnFailure=emergency.target
OnFailureIsolate=yes
ConditionPathExists=/etc/initrd-release
+Wants=initrd-parse-etc.service
+After=initrd-parse-etc.service
+Requires=basic.target
+After=basic.target rescue.service rescue.target
+AllowIsolate=yes
diff --git a/units/initrd-parse-etc.service.in b/units/initrd-parse-etc.service.in
index 44fee7b..2b8eed4 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=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
+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 100%
rename from units/root-fs.target
rename to units/initrd-root-fs.target
diff --git a/units/initrd-switch-root.target b/units/initrd-switch-root.target
index cf646c4..cdf0612 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 systemd-journald.service
+After=initrd-udevadm-cleanup-db.service initrd-root-fs.target initrd-fs.target emergency.service emergency.target
--
1.8.1
More information about the systemd-devel
mailing list