]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
gpt-auto-generator: merge efi-boot-generator 777/head
authorKay Sievers <kay@vrfy.org>
Wed, 29 Jul 2015 14:50:49 +0000 (16:50 +0200)
committerKay Sievers <kay@vrfy.org>
Wed, 29 Jul 2015 16:16:48 +0000 (18:16 +0200)
.gitignore
Makefile-man.am
Makefile.am
man/file-hierarchy.xml
man/systemd-efi-boot-generator.xml [deleted file]
man/systemd-gpt-auto-generator.xml
man/systemd.generator.xml
src/efi-boot-generator/Makefile [deleted symlink]
src/efi-boot-generator/efi-boot-generator.c [deleted file]
src/gpt-auto-generator/gpt-auto-generator.c

index 10622d4dfaa8b48b51ec2c934a4511bcf30fe02c..9ff6da28d9c056fd706a5ec47cacad236d2f9035 100644 (file)
@@ -73,7 +73,6 @@
 /systemd-debug-generator
 /systemd-delta
 /systemd-detect-virt
-/systemd-efi-boot-generator
 /systemd-escape
 /systemd-export
 /systemd-firstboot
index 218a299e91df478a43f84b7cdc818080be8cbffb..c0cebaab63a208a44766e51950cc60c03d280720 100644 (file)
@@ -91,7 +91,6 @@ MANPAGES += \
        man/systemd-debug-generator.8 \
        man/systemd-delta.1 \
        man/systemd-detect-virt.1 \
-       man/systemd-efi-boot-generator.8 \
        man/systemd-escape.1 \
        man/systemd-fsck@.service.8 \
        man/systemd-fstab-generator.8 \
@@ -2304,7 +2303,6 @@ EXTRA_DIST += \
        man/systemd-debug-generator.xml \
        man/systemd-delta.xml \
        man/systemd-detect-virt.xml \
-       man/systemd-efi-boot-generator.xml \
        man/systemd-escape.xml \
        man/systemd-firstboot.xml \
        man/systemd-fsck@.service.xml \
index 4bf8362640988e2bc5b8760234fe223d662b2dae..6f4358058a739b3cafcf631992bd05cbd73ad5b0 100644 (file)
@@ -2426,16 +2426,6 @@ EXTRA_DIST += \
 
 # ------------------------------------------------------------------------------
 if ENABLE_EFI
-systemgenerator_PROGRAMS +=  \
-       systemd-efi-boot-generator
-
-systemd_efi_boot_generator_SOURCES = \
-       src/efi-boot-generator/efi-boot-generator.c
-
-systemd_efi_boot_generator_LDADD = \
-       libshared.la
-
-# ------------------------------------------------------------------------------
 if HAVE_BLKID
 bootctl_SOURCES = \
        src/boot/bootctl.c
index 3a5627d196c74fe3dc3a5dcb365ac52f8a9145af..058998b51f12d315a2ad001f410b7382c4bdf940 100644 (file)
@@ -86,7 +86,7 @@
         <listitem><para>The boot partition used for bringing up the
         system. On EFI systems this is possibly the EFI System
         Partition, also see
-        <citerefentry><refentrytitle>systemd-efi-boot-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
+        <citerefentry><refentrytitle>systemd-gpt-auto-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
         This directory is usually strictly local to the host, and
         should be considered read-only, except when a new kernel or
         boot loader is installed. This directory only exists on
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>hier</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-path</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-efi-boot-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-gpt-auto-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>tmpfiles.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
diff --git a/man/systemd-efi-boot-generator.xml b/man/systemd-efi-boot-generator.xml
deleted file mode 100644 (file)
index 23464bc..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0"?>
-<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<!--
-  This file is part of systemd.
-
-  Copyright 2013 Lennart Poettering
-
-  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.
-
-  systemd is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with systemd; If not, see <http://www.gnu.org/licenses/>.
--->
-<refentry id="systemd-efi-boot-generator">
-
-  <refentryinfo>
-    <title>systemd-efi-boot-generator</title>
-    <productname>systemd</productname>
-
-    <authorgroup>
-      <author>
-        <contrib>Developer</contrib>
-        <firstname>Lennart</firstname>
-        <surname>Poettering</surname>
-        <email>lennart@poettering.net</email>
-      </author>
-    </authorgroup>
-  </refentryinfo>
-
-  <refmeta>
-    <refentrytitle>systemd-efi-boot-generator</refentrytitle>
-    <manvolnum>8</manvolnum>
-  </refmeta>
-
-  <refnamediv>
-    <refname>systemd-efi-boot-generator</refname>
-    <refpurpose>Generator for automatically mounting the
-    EFI System Partition used by the current boot to
-    <filename>/boot</filename></refpurpose>
-  </refnamediv>
-
-  <refsynopsisdiv>
-    <para><filename>/usr/lib/systemd/system-generators/systemd-efi-boot-generator</filename></para>
-  </refsynopsisdiv>
-
-  <refsect1>
-    <title>Description</title>
-
-    <para><filename>systemd-efi-boot-generator</filename> is a
-    generator that automatically creates mount and automount units for
-    the EFI System Partition (ESP), mounting it to
-    <filename>/boot</filename>. Note that this generator will execute
-    no operation on non-EFI systems, on systems where the boot loader
-    does not communicate the used ESP to the OS, on systems where
-    <filename>/boot</filename> is an explicitly configured mount (for
-    example, listed in
-    <citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
-    or where the <filename>/boot</filename> mount point is non-empty.
-    Since this generator creates an automount unit, the mount will
-    only be activated on-demand, when accessed.</para>
-
-    <para><filename>systemd-efi-boot-generator</filename> implements
-    <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
-  </refsect1>
-
-  <refsect1>
-    <title>See Also</title>
-    <para>
-      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd.automount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-gpt-auto-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-      <citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-    </para>
-  </refsect1>
-
-</refentry>
index 710c2e065ebb1fc6a6a6fb9a8c8e8f828b7fd8ea..27ec72c986fc44f6467f39fc2423c9dd850d79dd 100644 (file)
     <filename>/etc/crypttab</filename> with a different device mapper
     device name.</para>
 
-    <para>Also note that
-    <citerefentry><refentrytitle>systemd-efi-boot-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-    will mount the EFI System Partition (ESP) to
-    <filename>/boot</filename> if not otherwise mounted.</para>
+    <para>Mount and automount units for the EFI System Partition (ESP),
+    mounting it to <filename>/boot</filename> are generated on EFI
+    systems, where the boot loader communicates the used ESP to the operating
+    system. Since this generator creates an automount unit, the mount will
+    only be activated on-demand, when accessed. On systems where
+    <filename>/boot</filename> is an explicitly configured mount
+    (for example, listed in
+    <citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
+    or where the <filename>/boot</filename> mount point is non-empty, no
+    mount units are generated.</para>
 
     <para>When using this generator in conjunction with btrfs file
     systems, make sure to set the correct default subvolumes on them,
       <citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-efi-boot-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-cryptsetup@.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='die-net'><refentrytitle>cryptsetup</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
index 2285e91812ad92ea12eeac421db1b94bca284055..4514c1afdf1758517694a123d5de15915a35b612 100644 (file)
@@ -331,7 +331,6 @@ find $dir</programlisting>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-cryptsetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-debug-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-efi-boot-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-getty-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
diff --git a/src/efi-boot-generator/Makefile b/src/efi-boot-generator/Makefile
deleted file mode 120000 (symlink)
index d0b0e8e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../Makefile
\ No newline at end of file
diff --git a/src/efi-boot-generator/efi-boot-generator.c b/src/efi-boot-generator/efi-boot-generator.c
deleted file mode 100644 (file)
index e6b15c9..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
-/***
-  This file is part of systemd.
-
-  Copyright 2013 Lennart Poettering
-
-  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.
-
-  systemd is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with systemd; If not, see <http://www.gnu.org/licenses/>.
-***/
-
-#include <unistd.h>
-#include <stdlib.h>
-
-#include "efivars.h"
-#include "path-util.h"
-#include "util.h"
-#include "mkdir.h"
-#include "virt.h"
-#include "generator.h"
-#include "special.h"
-
-static const char *arg_dest = "/tmp";
-
-int main(int argc, char *argv[]) {
-        _cleanup_free_ char *what = NULL;
-        _cleanup_fclose_ FILE *f = NULL;
-        int r = EXIT_SUCCESS;
-        sd_id128_t id;
-        char *name;
-
-        if (argc > 1 && argc != 4) {
-                log_error("This program takes three or no arguments.");
-                return EXIT_FAILURE;
-        }
-
-        if (argc > 1)
-                arg_dest = argv[3];
-
-        log_set_target(LOG_TARGET_SAFE);
-        log_parse_environment();
-        log_open();
-
-        umask(0022);
-
-        if (in_initrd()) {
-                log_debug("In initrd, exiting.");
-                return EXIT_SUCCESS;
-        }
-
-        if (detect_container(NULL) > 0) {
-                log_debug("In a container, exiting.");
-                return EXIT_SUCCESS;
-        }
-
-        if (!is_efi_boot()) {
-                log_debug("Not an EFI boot, exiting.");
-                return EXIT_SUCCESS;
-        }
-
-        r = path_is_mount_point("/boot", AT_SYMLINK_FOLLOW);
-        if (r > 0) {
-                log_debug("/boot is already a mount point, exiting.");
-                return EXIT_SUCCESS;
-        }
-        if (r == -ENOENT)
-                log_debug("/boot does not exist, continuing.");
-        else if (dir_is_empty("/boot") <= 0) {
-                log_debug("/boot already populated, exiting.");
-                return EXIT_SUCCESS;
-        }
-
-        r = efi_loader_get_device_part_uuid(&id);
-        if (r == -ENOENT) {
-                log_debug("EFI loader partition unknown, exiting.");
-                return EXIT_SUCCESS;
-        } else if (r < 0) {
-                log_error_errno(r, "Failed to read ESP partition UUID: %m");
-                return EXIT_FAILURE;
-        }
-
-        name = strjoina(arg_dest, "/boot.mount");
-        f = fopen(name, "wxe");
-        if (!f) {
-                log_error_errno(errno, "Failed to create mount unit file %s: %m", name);
-                return EXIT_FAILURE;
-        }
-
-        r = asprintf(&what,
-                     "/dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-                     SD_ID128_FORMAT_VAL(id));
-        if (r < 0) {
-                log_oom();
-                return EXIT_FAILURE;
-        }
-
-        fprintf(f,
-                "# Automatially generated by systemd-efi-boot-generator\n\n"
-                "[Unit]\n"
-                "Description=EFI System Partition\n"
-                "Documentation=man:systemd-efi-boot-generator(8)\n");
-
-        r = generator_write_fsck_deps(f, arg_dest, what, "/boot", "vfat");
-        if (r < 0)
-                return EXIT_FAILURE;
-
-        fprintf(f,
-                "\n"
-                "[Mount]\n"
-                "What=%s\n"
-                "Where=/boot\n"
-                "Type=vfat\n"
-                "Options=umask=0077,noauto\n",
-                what);
-
-        r = fflush_and_check(f);
-        if (r < 0) {
-                log_error_errno(r, "Failed to write mount unit file: %m");
-                return EXIT_FAILURE;
-        }
-
-        name = strjoina(arg_dest, "/boot.automount");
-        fclose(f);
-        f = fopen(name, "wxe");
-        if (!f) {
-                log_error_errno(errno, "Failed to create automount unit file %s: %m", name);
-                return EXIT_FAILURE;
-        }
-
-        fputs("# Automatially generated by systemd-efi-boot-generator\n\n"
-              "[Unit]\n"
-              "Description=EFI System Partition Automount\n\n"
-              "[Automount]\n"
-              "Where=/boot\n"
-              "TimeoutIdleSec=120\n", f);
-
-        r = fflush_and_check(f);
-        if (r < 0) {
-                log_error_errno(r, "Failed to write automount unit file: %m");
-                return EXIT_FAILURE;
-        }
-
-        name = strjoina(arg_dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/boot.automount");
-        mkdir_parents(name, 0755);
-
-        if (symlink("../boot.automount", name) < 0) {
-                log_error_errno(errno, "Failed to create symlink %s: %m", name);
-                return EXIT_FAILURE;
-        }
-
-        return EXIT_SUCCESS;
-}
index da5f3b647ae2a8a1375401da425271f433b6dd72..22dfd5496da0462cb3f0bb6edff386a5f0f4e2e1 100644 (file)
@@ -46,51 +46,6 @@ static bool arg_enabled = true;
 static bool arg_root_enabled = true;
 static bool arg_root_rw = false;
 
-static int add_swap(const char *path) {
-        _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL;
-        _cleanup_fclose_ FILE *f = NULL;
-        int r;
-
-        assert(path);
-
-        log_debug("Adding swap: %s", path);
-
-        r = unit_name_from_path(path, ".swap", &name);
-        if (r < 0)
-                return log_error_errno(r, "Failed to generate unit name: %m");
-
-        unit = strjoin(arg_dest, "/", name, NULL);
-        if (!unit)
-                return log_oom();
-
-        f = fopen(unit, "wxe");
-        if (!f)
-                return log_error_errno(errno, "Failed to create unit file %s: %m", unit);
-
-        fprintf(f,
-                "# Automatically generated by systemd-gpt-auto-generator\n\n"
-                "[Unit]\n"
-                "Description=Swap Partition\n"
-                "Documentation=man:systemd-gpt-auto-generator(8)\n\n"
-                "[Swap]\n"
-                "What=%s\n",
-                path);
-
-        fflush(f);
-        if (ferror(f))
-                return log_error_errno(errno, "Failed to write unit file %s: %m", unit);
-
-        lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL);
-        if (!lnk)
-                return log_oom();
-
-        mkdir_parents_label(lnk, 0755);
-        if (symlink(unit, lnk) < 0)
-                return log_error_errno(errno, "Failed to create symlink %s: %m", lnk);
-
-        return 0;
-}
-
 static int add_cryptsetup(const char *id, const char *what, bool rw, char **device) {
         _cleanup_free_ char *e = NULL, *n = NULL, *p = NULL, *d = NULL, *to = NULL;
         _cleanup_fclose_ FILE *f = NULL;
@@ -202,6 +157,7 @@ static int add_mount(
                 const char *where,
                 const char *fstype,
                 bool rw,
+                const char *options,
                 const char *description,
                 const char *post) {
 
@@ -262,7 +218,10 @@ static int add_mount(
         if (fstype)
                 fprintf(f, "Type=%s\n", fstype);
 
-        fprintf(f, "Options=%s\n", rw ? "rw" : "ro");
+        if (options)
+                fprintf(f, "Options=%s,%s\n", options, rw ? "rw" : "ro");
+        else
+                fprintf(f, "Options=%s\n", rw ? "rw" : "ro");
 
         fflush(f);
         if (ferror(f))
@@ -281,6 +240,104 @@ static int add_mount(
         return 0;
 }
 
+static int add_automount(
+                const char *id,
+                const char *what,
+                const char *where,
+                const char *fstype,
+                bool rw,
+                const char *options,
+                const char *description,
+                usec_t timeout) {
+
+        _cleanup_free_ char *unit = NULL, *lnk = NULL, *crypto_what = NULL;
+        _cleanup_free_ char *opt, *p = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
+        int r;
+
+        assert(id);
+        assert(where);
+        assert(description);
+
+        if (options)
+                opt = strjoin(options, ",noauto", NULL);
+        else
+                opt = strdup("noauto");
+        if (!opt)
+                return log_oom();
+
+        r = add_mount(id,
+                      what,
+                      where,
+                      fstype,
+                      rw,
+                      opt,
+                      description,
+                      NULL);
+        if (r < 0)
+                return r;
+
+        r = unit_name_from_path(where, ".automount", &unit);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate unit name: %m");
+
+        p = strjoin(arg_dest, "/", unit, NULL);
+        if (!p)
+                return log_oom();
+
+        f = fopen(p, "wxe");
+        if (!f)
+                return log_error_errno(errno, "Failed to create unit file %s: %m", unit);
+
+        fprintf(f,
+                "# Automatically generated by systemd-gpt-auto-generator\n\n"
+                "[Unit]\n"
+                "Description=%s\n"
+                "Documentation=man:systemd-gpt-auto-generator(8)\n"
+                "[Automount]\n"
+                "Where=%s\n"
+                "TimeoutIdleSec=%lld\n",
+                description,
+                where,
+                (unsigned long long)timeout / USEC_PER_SEC);
+
+        fflush(f);
+        if (ferror(f))
+                return log_error_errno(errno, "Failed to write unit file %s: %m", p);
+
+        lnk = strjoin(arg_dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/", unit, NULL);
+        if (!lnk)
+                return log_oom();
+        mkdir_parents_label(lnk, 0755);
+
+        if (symlink(p, lnk) < 0)
+                return log_error_errno(errno, "Failed to create symlink %s: %m", lnk);
+
+        return 0;
+}
+
+static bool path_is_busy(const char *where) {
+        int r;
+
+        /* already a mountpoint; generators run during reload */
+        r = path_is_mount_point(where, AT_SYMLINK_FOLLOW);
+        if (r > 0)
+                return false;
+
+        /* the directory might not exist on a stateless system */
+        if (r == -ENOENT)
+                return false;
+
+        if (r < 0)
+                return true;
+
+        /* not a mountpoint but it contains files */
+        if (dir_is_empty(where) <= 0)
+                return true;
+
+        return false;
+}
+
 static int probe_and_add_mount(
                 const char *id,
                 const char *what,
@@ -298,8 +355,7 @@ static int probe_and_add_mount(
         assert(where);
         assert(description);
 
-        if (path_is_mount_point(where, AT_SYMLINK_FOLLOW) <= 0 &&
-            dir_is_empty(where) <= 0) {
+        if (path_is_busy(where)) {
                 log_debug("%s already populated, ignoring.", where);
                 return 0;
         }
@@ -335,21 +391,163 @@ static int probe_and_add_mount(
                         where,
                         fstype,
                         rw,
+                        NULL,
                         description,
                         post);
 }
 
+static int add_swap(const char *path) {
+        _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
+        int r;
+
+        assert(path);
+
+        log_debug("Adding swap: %s", path);
+
+        r = unit_name_from_path(path, ".swap", &name);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate unit name: %m");
+
+        unit = strjoin(arg_dest, "/", name, NULL);
+        if (!unit)
+                return log_oom();
+
+        f = fopen(unit, "wxe");
+        if (!f)
+                return log_error_errno(errno, "Failed to create unit file %s: %m", unit);
+
+        fprintf(f,
+                "# Automatically generated by systemd-gpt-auto-generator\n\n"
+                "[Unit]\n"
+                "Description=Swap Partition\n"
+                "Documentation=man:systemd-gpt-auto-generator(8)\n\n"
+                "[Swap]\n"
+                "What=%s\n",
+                path);
+
+        fflush(f);
+        if (ferror(f))
+                return log_error_errno(errno, "Failed to write unit file %s: %m", unit);
+
+        lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL);
+        if (!lnk)
+                return log_oom();
+
+        mkdir_parents_label(lnk, 0755);
+        if (symlink(unit, lnk) < 0)
+                return log_error_errno(errno, "Failed to create symlink %s: %m", lnk);
+
+        return 0;
+}
+
+static int add_boot(const char *what) {
+#ifdef ENABLE_EFI
+        _cleanup_blkid_free_probe_ blkid_probe b = NULL;
+        const char *fstype = NULL, *uuid = NULL;
+        sd_id128_t id, type_id;
+        int r;
+
+        assert(what);
+
+        if (!is_efi_boot()) {
+                log_debug("Not an EFI boot, ignoring /boot.");
+                return 0;
+        }
+
+        if (in_initrd()) {
+                log_debug("In initrd, ignoring /boot.");
+                return 0;
+        }
+
+        if (detect_container(NULL) > 0) {
+                log_debug("In a container, ignoring /boot.");
+                return 0;
+        }
+
+        if (path_is_busy("/boot")) {
+                log_debug("/boot already populated, ignoring.");
+                return 0;
+        }
+
+        r = efi_loader_get_device_part_uuid(&id);
+        if (r == -ENOENT) {
+                log_debug("EFI loader partition unknown.");
+                return 0;
+        }
+
+        if (r < 0) {
+                log_error_errno(r, "Failed to read ESP partition UUID: %m");
+                return r;
+        }
+
+        errno = 0;
+        b = blkid_new_probe_from_filename(what);
+        if (!b) {
+                if (errno == 0)
+                        return log_oom();
+                log_error_errno(errno, "Failed to allocate prober: %m");
+                return -errno;
+        }
+
+        blkid_probe_enable_partitions(b, 1);
+        blkid_probe_set_partitions_flags(b, BLKID_PARTS_ENTRY_DETAILS);
+
+        errno = 0;
+        r = blkid_do_safeprobe(b);
+        if (r == -2 || r == 1) /* no result or uncertain */
+                return 0;
+        else if (r != 0)
+                return log_error_errno(errno ?: EIO, "Failed to probe %s: %m", what);
+
+        (void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
+        if (!streq(fstype, "vfat")) {
+                log_debug("Partition for /boot is not a FAT filesystem, ignoring.");
+                return 0;
+        }
+
+        r = blkid_probe_lookup_value(b, "PART_ENTRY_UUID", &uuid, NULL);
+        if (r != 0) {
+                log_debug_errno(r, "Partition for /boot does not have a UUID, ignoring. %m");
+                return 0;
+        }
+
+        if (sd_id128_from_string(uuid, &type_id) < 0) {
+                log_debug("Partition for /boot does not have a valid UUID, ignoring.");
+                return 0;
+        }
+
+        if (!sd_id128_equal(type_id, id)) {
+                log_debug("Partition for /boot does not appear to be the partition we are booted from.");
+                return 0;
+        }
+
+        r = add_automount("boot",
+                       what,
+                       "/boot",
+                       "vfat",
+                       "EFI System Partition Automount",
+                       false,
+                       "umask=0077",
+                       120 * USEC_PER_SEC);
+
+        return r;
+#else
+        return 0;
+#endif
+}
+
 static int enumerate_partitions(dev_t devnum) {
 
         _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
         _cleanup_blkid_free_probe_ blkid_probe b = NULL;
         _cleanup_udev_unref_ struct udev *udev = NULL;
-        _cleanup_free_ char *home = NULL, *srv = NULL;
+        _cleanup_free_ char *boot = NULL, *home = NULL, *srv = NULL;
         struct udev_list_entry *first, *item;
         struct udev_device *parent = NULL;
         const char *name, *node, *pttype, *devtype;
-        int home_nr = -1, srv_nr = -1;
+        int boot_nr = -1, home_nr = -1, srv_nr = -1;
         bool home_rw = true, srv_rw = true;
         blkid_partlist pl;
         int r, k;
@@ -521,6 +719,19 @@ static int enumerate_partitions(dev_t devnum) {
                         if (k < 0)
                                 r = k;
 
+                } else if (sd_id128_equal(type_id, GPT_ESP)) {
+
+                        /* We only care for the first /boot partition */
+                        if (boot && nr >= boot_nr)
+                                continue;
+
+                        boot_nr = nr;
+
+                        free(boot);
+                        boot = strdup(subnode);
+                        if (!boot)
+                                return log_oom();
+
                 } else if (sd_id128_equal(type_id, GPT_HOME)) {
 
                         /* We only care for the first /home partition */
@@ -551,6 +762,12 @@ static int enumerate_partitions(dev_t devnum) {
                 }
         }
 
+        if (boot) {
+                k = add_boot(boot);
+                if (k < 0)
+                        r = k;
+        }
+
         if (home) {
                 k = probe_and_add_mount("home", home, "/home", home_rw, "Home Partition", SPECIAL_LOCAL_FS_TARGET);
                 if (k < 0)
@@ -645,6 +862,7 @@ static int add_root_mount(void) {
                         in_initrd() ? "/sysroot" : "/",
                         NULL,
                         arg_root_rw,
+                        NULL,
                         "Root Partition",
                         in_initrd() ? SPECIAL_INITRD_ROOT_FS_TARGET : SPECIAL_LOCAL_FS_TARGET);
 #else