• Yann E. MORIN's avatar
    system: make systemd work on a read-only rootfs · 26085bbb
    Yann E. MORIN authored
    When the rootfs is readonly, systemd will expect /var to be writable.
    Because we do not really have a R/W filesystem to mount on /var, we make
    it a tmpfs [*], and use the systemd-tmpfiles feature to populate it with
    "factory" defaults.
    We obtain those factory defaults by redirecting /var to that location at
    build time, using a symlink /var -> /usr/share/factory which is the
    location in which systemd-tmpfiles will look for when instructed to
    "recursively copy" a directory.
    With a line like:
        C /var/something - - - -
    it will look for /usr/share/factory/something and copy it (recursively
    if it is a directory) to /var/something, but only if it does not already
    exist there.
    We also mark this copy with the exclamation mark, as it is only safe to
    copy on boot, not when changing targets.
    To be noted: the real format for such lines are:
        C /var/something - - - - /from/where/to/copy/something
    But if the source is not given, then it is implicitly taken from
    /usr/share/factory (which in our case is as-good a location as whatever
    else, so we use it, and thus we need not specify the source of the
    Note that we treat symlinks a little bit specially, by creating symlinks
    to the factory defaults rather than copying them.
    Finally, /var at build time is a symlink, but at runtime, it must be a
    directory (so we can mount the tmpfs over there). We can't change that
    as a target-finalize hook, because:
      - some packages may want to set ownership and/or access rights on
        files or directories in /var, and that only happens while assembling
        the filesystem images; changing /var from a symlink to a (then
        empty) directory would break this;
      - /var would be a directory on sub-sequent builds (until the next
        "make clean").
    Instead, we use the newly-introduce pre- and post-rootfs command hooks,
    to turn /var into a directory before assembling the image, and back to a
    symlink after assembling the image.
    [*] People who want the factory-defaults only on first boot will have
        to tweak the fstab to mount something else than a tmpfs on /var.
    Signed-off-by: default avatar"Yann E. MORIN" <yann.morin.1998@free.fr>
    Reviewed-by: default avatarRomain Naour <romain.naour@gmail.com>
    Signed-off-by: default avatarArnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
    Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>