[systemd-devel] [PATCH] Generate a fake systemd-fsck-root.service in the initramfs
Zbigniew Jędrzejewski-Szmek
zbyszek at in.waw.pl
Wed May 6 06:58:24 PDT 2015
On Wed, May 06, 2015 at 03:50:08PM +0200, Harald Hoyer wrote:
> Works for me... booted with "ro" on the kernel cmdline:
>
> $ systemctl status systemd-fsck-root.service
> ● systemd-fsck-root.service - File System Check on Root Device
> Loaded: loaded (/usr/lib/systemd/system/systemd-fsck-root.service; static;
> vendor preset: disabled)
> Active: inactive (dead) since Mi 2015-05-06 15:37:58 CEST; 1min 44s ago
> Docs: man:systemd-fsck-root.service(8)
> Main PID: 144 (code=exited, status=0/SUCCESS)
> CGroup: /system.slice/systemd-fsck-root.service
>
>
>
> [ 1.440568] systemd[1]: Starting Root File System Check Placeholder...
> [ 1.445484] systemd[1]: Started Root File System Check Placeholder.
> […]
> [ 1.786864] systemd[1]: Starting File System Check on /dev/gpt-auto-root...
> [ 1.804183] systemd[1]: Started File System Check on /dev/gpt-auto-root.
> [ 2.015962] systemd[1]: Mounting /sysroot...
> […]
> [ 2.294428] systemd[1]: Switching root.
> […]
> [ 2.570286] systemd[1]: Stopped Switch Root.
> […]
> [ 2.571714] systemd[1]: Stopped File System Check on Root Device.
> [ 2.571859] systemd[1]: Stopping File System Check on Root Device...
> […]
> [ 2.624669] systemd[1]: Started Remount Root and Kernel File Systems.
>
>
> Although "Stopping File System Check on Root Device" is strange...
Hm, that's strange. This would suggest that sd-fsck-root.service is not
wanted by anything in your system. I wonder if this is because you
have gpt-auto-root, and I'm using plain old fstab.
$ systemctl show -p WantedBy,RequiredBy,RequiredByOverridable systemd-fsck-root
RequiredBy=
RequiredByOverridable=
WantedBy=local-fs.target
Zbyszek
>
> On 06.05.2015 07:26, Zbigniew Jędrzejewski-Szmek wrote:
> > In the initramfs, we run systemd-fsck@<sysroot-device>.service.
> > In the real system we run systemd-fsck-root.service. Generate
> > a fake systemd-fsck-root.service if we are running a unit check
> > for the root file system. We don't really care if the real fsck unit
> > fails, because the failure will be handled in some other way.
> >
> > This fake unit is created and pulled in only when we actually plan to
> > check the file system for /sysroot. This way we avoid having an
> > active/exited systemd-fsck-root.service in the main filesystem if
> > we didn't do anything.
> >
> > https://bugzilla.redhat.com/show_bug.cgi?id=1201979
> >
> > C.f. 956eaf2b8d6c9999024705ddadc7393bc707de02.
> > ---
> > Something like this?
> >
> > TODO | 5 -----
> > src/shared/generator.c | 30 ++++++++++++++++++++++++++++++
> > 2 files changed, 30 insertions(+), 5 deletions(-)
> >
> > diff --git a/TODO b/TODO
> > index 430a354e84..cc827701f0 100644
> > --- a/TODO
> > +++ b/TODO
> > @@ -113,9 +113,6 @@ Features:
> > * Maybe add support for the equivalent of "ethtool advertise" to .link files?
> > http://lists.freedesktop.org/archives/systemd-devel/2015-April/030112.html
> >
> > -* fstab-generator should generate systemd-fsck-root.service when
> > - running in the initrd, and operate on the right device.
> > -
> > * .timer units should optionally support CLOCK_BOOTTIME in addition to CLOCK_MONOTONIC
> >
> > * create a btrfs qgroup for /var/lib/machines, and add all container
> > @@ -153,8 +150,6 @@ Features:
> > * Introduce $LISTEN_NAMES to complement $LISTEN_FDS, containing a
> > colon separated list of identifiers for the fds passed.
> >
> > -* when the fstab-generator runs in the initrd, it should create a /dev/null mask for systemd-fsck-root.service, to avoid that the the root fs is fsck'ed twice.
> > -
> > * maybe introduce WantsMountsFor=? Usecase:
> > http://lists.freedesktop.org/archives/systemd-devel/2015-January/027729.html
> >
> > diff --git a/src/shared/generator.c b/src/shared/generator.c
> > index 2dc34bf738..813ce1af9a 100644
> > --- a/src/shared/generator.c
> > +++ b/src/shared/generator.c
> > @@ -28,8 +28,32 @@
> > #include "generator.h"
> > #include "path-util.h"
> > #include "fstab-util.h"
> > +#include "fileio.h"
> > #include "dropin.h"
> >
> > +static int write_fsck_root_service(const char *dir) {
> > + const char *unit;
> > + int r;
> > +
> > + unit = strjoina(dir, "/systemd-fsck-root.service");
> > + log_debug("Creating %s.", unit);
> > +
> > + r = write_string_file_atomic(unit,
> > + "# Automatically generated by a systemd-fstab-generator or similar\n\n"
> > + "[Unit]\n"
> > + "Description=Root File System Check Placeholder\n"
> > + "DefaultDependencies=no\n"
> > + "Before=shutdown.target\n"
> > + "\n"
> > + "[Service]\n"
> > + "ExecStart=/bin/true\n"
> > + "Type=oneshot\n"
> > + "RemainAfterExit=yes\n");
> > + if (r < 0)
> > + log_warning_errno(errno, "Failed to write unit file %s: %m", unit);
> > + return r;
> > +}
> > +
> > int generator_write_fsck_deps(
> > FILE *f,
> > const char *dir,
> > @@ -79,6 +103,12 @@ int generator_write_fsck_deps(
> > "RequiresOverridable=%1$s\n"
> > "After=%1$s\n",
> > fsck);
> > +
> > + if (in_initrd() && path_equal(where, "/sysroot")) {
> > + (void) write_fsck_root_service(dir);
> > + fprintf(f,
> > + "Wants=systemd-fsck-root.service\n");
> > + }
> > }
> >
> > return 0;
> >
>
>
More information about the systemd-devel
mailing list