diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-07-29 18:45:48 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-07-29 18:45:48 +0200 |
commit | c4a6d5085a8beadb2ea85fbf202b7674bd50bfb3 (patch) | |
tree | f26e479a1ef9b7d14c398c06fd98205baad8dbe5 | |
parent | 2b32ffa07dfb62385f82d073c9c2fff890ac1889 (diff) | |
parent | 59512f21d77d984cf1363fb0d1770218c5e17020 (diff) |
Merge pull request #777 from kaysievers/gtp-auto
gpt-auto-generator: merge efi-boot-generator
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile-man.am | 2 | ||||
-rw-r--r-- | Makefile.am | 10 | ||||
-rw-r--r-- | man/file-hierarchy.xml | 4 | ||||
-rw-r--r-- | man/systemd-efi-boot-generator.xml | 85 | ||||
-rw-r--r-- | man/systemd-gpt-auto-generator.xml | 15 | ||||
-rw-r--r-- | man/systemd.generator.xml | 1 | ||||
l--------- | src/efi-boot-generator/Makefile | 1 | ||||
-rw-r--r-- | src/efi-boot-generator/efi-boot-generator.c | 162 | ||||
-rw-r--r-- | src/gpt-auto-generator/gpt-auto-generator.c | 318 |
10 files changed, 280 insertions, 319 deletions
diff --git a/.gitignore b/.gitignore index 10622d4dfa..9ff6da28d9 100644 --- a/.gitignore +++ b/.gitignore @@ -73,7 +73,6 @@ /systemd-debug-generator /systemd-delta /systemd-detect-virt -/systemd-efi-boot-generator /systemd-escape /systemd-export /systemd-firstboot diff --git a/Makefile-man.am b/Makefile-man.am index 218a299e91..c0cebaab63 100644 --- a/Makefile-man.am +++ b/Makefile-man.am @@ -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 \ diff --git a/Makefile.am b/Makefile.am index 4bf8362640..6f4358058a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/man/file-hierarchy.xml b/man/file-hierarchy.xml index 3a5627d196..058998b51f 100644 --- a/man/file-hierarchy.xml +++ b/man/file-hierarchy.xml @@ -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 @@ -804,7 +804,7 @@ <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 index 23464bcf15..0000000000 --- a/man/systemd-efi-boot-generator.xml +++ /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> diff --git a/man/systemd-gpt-auto-generator.xml b/man/systemd-gpt-auto-generator.xml index 710c2e065e..27ec72c986 100644 --- a/man/systemd-gpt-auto-generator.xml +++ b/man/systemd-gpt-auto-generator.xml @@ -150,10 +150,16 @@ <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, @@ -170,7 +176,6 @@ <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>, diff --git a/man/systemd.generator.xml b/man/systemd.generator.xml index 2285e91812..4514c1afdf 100644 --- a/man/systemd.generator.xml +++ b/man/systemd.generator.xml @@ -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 index d0b0e8e008..0000000000 --- a/src/efi-boot-generator/Makefile +++ /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 index e6b15c9bb0..0000000000 --- a/src/efi-boot-generator/efi-boot-generator.c +++ /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; -} diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c index da5f3b647a..22dfd5496d 100644 --- a/src/gpt-auto-generator/gpt-auto-generator.c +++ b/src/gpt-auto-generator/gpt-auto-generator.c @@ -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 |