mirror of
https://github.com/systemd/systemd.git
synced 2025-03-19 22:50:17 +03:00
gpt-auto-generator: merge efi-boot-generator
This commit is contained in:
parent
e4e6699395
commit
59512f21d7
1
.gitignore
vendored
1
.gitignore
vendored
@ -73,7 +73,6 @@
|
|||||||
/systemd-debug-generator
|
/systemd-debug-generator
|
||||||
/systemd-delta
|
/systemd-delta
|
||||||
/systemd-detect-virt
|
/systemd-detect-virt
|
||||||
/systemd-efi-boot-generator
|
|
||||||
/systemd-escape
|
/systemd-escape
|
||||||
/systemd-export
|
/systemd-export
|
||||||
/systemd-firstboot
|
/systemd-firstboot
|
||||||
|
@ -91,7 +91,6 @@ MANPAGES += \
|
|||||||
man/systemd-debug-generator.8 \
|
man/systemd-debug-generator.8 \
|
||||||
man/systemd-delta.1 \
|
man/systemd-delta.1 \
|
||||||
man/systemd-detect-virt.1 \
|
man/systemd-detect-virt.1 \
|
||||||
man/systemd-efi-boot-generator.8 \
|
|
||||||
man/systemd-escape.1 \
|
man/systemd-escape.1 \
|
||||||
man/systemd-fsck@.service.8 \
|
man/systemd-fsck@.service.8 \
|
||||||
man/systemd-fstab-generator.8 \
|
man/systemd-fstab-generator.8 \
|
||||||
@ -2304,7 +2303,6 @@ EXTRA_DIST += \
|
|||||||
man/systemd-debug-generator.xml \
|
man/systemd-debug-generator.xml \
|
||||||
man/systemd-delta.xml \
|
man/systemd-delta.xml \
|
||||||
man/systemd-detect-virt.xml \
|
man/systemd-detect-virt.xml \
|
||||||
man/systemd-efi-boot-generator.xml \
|
|
||||||
man/systemd-escape.xml \
|
man/systemd-escape.xml \
|
||||||
man/systemd-firstboot.xml \
|
man/systemd-firstboot.xml \
|
||||||
man/systemd-fsck@.service.xml \
|
man/systemd-fsck@.service.xml \
|
||||||
|
10
Makefile.am
10
Makefile.am
@ -2426,16 +2426,6 @@ EXTRA_DIST += \
|
|||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
if ENABLE_EFI
|
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
|
if HAVE_BLKID
|
||||||
bootctl_SOURCES = \
|
bootctl_SOURCES = \
|
||||||
src/boot/bootctl.c
|
src/boot/bootctl.c
|
||||||
|
@ -86,7 +86,7 @@
|
|||||||
<listitem><para>The boot partition used for bringing up the
|
<listitem><para>The boot partition used for bringing up the
|
||||||
system. On EFI systems this is possibly the EFI System
|
system. On EFI systems this is possibly the EFI System
|
||||||
Partition, also see
|
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
|
This directory is usually strictly local to the host, and
|
||||||
should be considered read-only, except when a new kernel or
|
should be considered read-only, except when a new kernel or
|
||||||
boot loader is installed. This directory only exists on
|
boot loader is installed. This directory only exists on
|
||||||
@ -804,7 +804,7 @@
|
|||||||
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
<citerefentry project='man-pages'><refentrytitle>hier</refentrytitle><manvolnum>7</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-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>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>tmpfiles.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>,
|
<citerefentry project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
@ -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>
|
|
@ -150,10 +150,16 @@
|
|||||||
<filename>/etc/crypttab</filename> with a different device mapper
|
<filename>/etc/crypttab</filename> with a different device mapper
|
||||||
device name.</para>
|
device name.</para>
|
||||||
|
|
||||||
<para>Also note that
|
<para>Mount and automount units for the EFI System Partition (ESP),
|
||||||
<citerefentry><refentrytitle>systemd-efi-boot-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
mounting it to <filename>/boot</filename> are generated on EFI
|
||||||
will mount the EFI System Partition (ESP) to
|
systems, where the boot loader communicates the used ESP to the operating
|
||||||
<filename>/boot</filename> if not otherwise mounted.</para>
|
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
|
<para>When using this generator in conjunction with btrfs file
|
||||||
systems, make sure to set the correct default subvolumes on them,
|
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.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.swap</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-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><refentrytitle>systemd-cryptsetup@.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
<citerefentry project='die-net'><refentrytitle>cryptsetup</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>,
|
<citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
@ -331,7 +331,6 @@ find $dir</programlisting>
|
|||||||
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd-cryptsetup-generator</refentrytitle><manvolnum>8</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-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><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
<citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd-getty-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd-getty-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
@ -1 +0,0 @@
|
|||||||
../Makefile
|
|
@ -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;
|
|
||||||
}
|
|
@ -46,51 +46,6 @@ static bool arg_enabled = true;
|
|||||||
static bool arg_root_enabled = true;
|
static bool arg_root_enabled = true;
|
||||||
static bool arg_root_rw = false;
|
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) {
|
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_free_ char *e = NULL, *n = NULL, *p = NULL, *d = NULL, *to = NULL;
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
@ -202,6 +157,7 @@ static int add_mount(
|
|||||||
const char *where,
|
const char *where,
|
||||||
const char *fstype,
|
const char *fstype,
|
||||||
bool rw,
|
bool rw,
|
||||||
|
const char *options,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *post) {
|
const char *post) {
|
||||||
|
|
||||||
@ -262,7 +218,10 @@ static int add_mount(
|
|||||||
if (fstype)
|
if (fstype)
|
||||||
fprintf(f, "Type=%s\n", 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);
|
fflush(f);
|
||||||
if (ferror(f))
|
if (ferror(f))
|
||||||
@ -281,6 +240,104 @@ static int add_mount(
|
|||||||
return 0;
|
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(
|
static int probe_and_add_mount(
|
||||||
const char *id,
|
const char *id,
|
||||||
const char *what,
|
const char *what,
|
||||||
@ -298,8 +355,7 @@ static int probe_and_add_mount(
|
|||||||
assert(where);
|
assert(where);
|
||||||
assert(description);
|
assert(description);
|
||||||
|
|
||||||
if (path_is_mount_point(where, AT_SYMLINK_FOLLOW) <= 0 &&
|
if (path_is_busy(where)) {
|
||||||
dir_is_empty(where) <= 0) {
|
|
||||||
log_debug("%s already populated, ignoring.", where);
|
log_debug("%s already populated, ignoring.", where);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -335,21 +391,163 @@ static int probe_and_add_mount(
|
|||||||
where,
|
where,
|
||||||
fstype,
|
fstype,
|
||||||
rw,
|
rw,
|
||||||
|
NULL,
|
||||||
description,
|
description,
|
||||||
post);
|
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) {
|
static int enumerate_partitions(dev_t devnum) {
|
||||||
|
|
||||||
_cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
|
_cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
|
||||||
_cleanup_udev_device_unref_ struct udev_device *d = NULL;
|
_cleanup_udev_device_unref_ struct udev_device *d = NULL;
|
||||||
_cleanup_blkid_free_probe_ blkid_probe b = NULL;
|
_cleanup_blkid_free_probe_ blkid_probe b = NULL;
|
||||||
_cleanup_udev_unref_ struct udev *udev = 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_list_entry *first, *item;
|
||||||
struct udev_device *parent = NULL;
|
struct udev_device *parent = NULL;
|
||||||
const char *name, *node, *pttype, *devtype;
|
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;
|
bool home_rw = true, srv_rw = true;
|
||||||
blkid_partlist pl;
|
blkid_partlist pl;
|
||||||
int r, k;
|
int r, k;
|
||||||
@ -521,6 +719,19 @@ static int enumerate_partitions(dev_t devnum) {
|
|||||||
if (k < 0)
|
if (k < 0)
|
||||||
r = k;
|
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)) {
|
} else if (sd_id128_equal(type_id, GPT_HOME)) {
|
||||||
|
|
||||||
/* We only care for the first /home partition */
|
/* 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) {
|
if (home) {
|
||||||
k = probe_and_add_mount("home", home, "/home", home_rw, "Home Partition", SPECIAL_LOCAL_FS_TARGET);
|
k = probe_and_add_mount("home", home, "/home", home_rw, "Home Partition", SPECIAL_LOCAL_FS_TARGET);
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
@ -645,6 +862,7 @@ static int add_root_mount(void) {
|
|||||||
in_initrd() ? "/sysroot" : "/",
|
in_initrd() ? "/sysroot" : "/",
|
||||||
NULL,
|
NULL,
|
||||||
arg_root_rw,
|
arg_root_rw,
|
||||||
|
NULL,
|
||||||
"Root Partition",
|
"Root Partition",
|
||||||
in_initrd() ? SPECIAL_INITRD_ROOT_FS_TARGET : SPECIAL_LOCAL_FS_TARGET);
|
in_initrd() ? SPECIAL_INITRD_ROOT_FS_TARGET : SPECIAL_LOCAL_FS_TARGET);
|
||||||
#else
|
#else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user