mirror of
https://github.com/systemd/systemd.git
synced 2024-12-23 21:35:11 +03:00
gpt-generator: use /efi as mount point for the ESP if it exists
Let's make the EFI generator a bit smarter: if /efi exists it is used as mount point for the ESP, otherwise /boot is used. This should increase compatibility with distros which use legacy boot loaders that insist on having /boot as something that isn't the ESP.
This commit is contained in:
parent
36376e0b71
commit
b52a109ad3
@ -137,6 +137,11 @@
|
||||
<entry>Swap</entry>
|
||||
<entry>All swap partitions located on the disk the root partition is located on are enabled.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>c12a7328-f81f-11d2-ba4b-00a0c93ec93b</entry>
|
||||
<entry>EFI System Partition (ESP)</entry>
|
||||
<entry>The first ESP located on the disk the root partition is located on is mounted to <filename>/boot</filename> or <filename>/efi</filename>, see below.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
@ -150,16 +155,14 @@
|
||||
<filename>/etc/crypttab</filename> with a different device mapper
|
||||
device name.</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>Mount and automount units for the EFI System Partition (ESP) are generated on EFI systems. The ESP is mounted
|
||||
to <filename>/boot</filename>, unless a mount point directory <filename>/efi</filename> exists, in which case it is
|
||||
mounted there. Since this generator creates an automount unit, the mount will only be activated on-demand, when
|
||||
accessed. On systems where <filename>/boot</filename> (or <filename>/efi</filename> if it exists) 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> (or <filename>/efi</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,
|
||||
|
@ -453,33 +453,37 @@ static int add_boot(const char *what) {
|
||||
_cleanup_blkid_free_probe_ blkid_probe b = NULL;
|
||||
const char *fstype = NULL, *uuid = NULL;
|
||||
sd_id128_t id, type_id;
|
||||
const char *esp;
|
||||
int r;
|
||||
|
||||
assert(what);
|
||||
|
||||
if (!is_efi_boot()) {
|
||||
log_debug("Not an EFI boot, ignoring /boot.");
|
||||
log_debug("Not an EFI boot, ignoring the ESP.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (in_initrd()) {
|
||||
log_debug("In initrd, ignoring /boot.");
|
||||
log_debug("In initrd, ignoring the ESP.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (detect_container() > 0) {
|
||||
log_debug("In a container, ignoring /boot.");
|
||||
log_debug("In a container, ignoring the ESP.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If /efi exists we'll use that. Otherwise we'll use /boot, as that's usually the better choice */
|
||||
esp = access("/efi/", F_OK) >= 0 ? "/efi" : "/boot";
|
||||
|
||||
/* We create an .automount which is not overridden by the .mount from the fstab generator. */
|
||||
if (fstab_is_mount_point("/boot")) {
|
||||
log_debug("/boot specified in fstab, ignoring.");
|
||||
if (fstab_is_mount_point(esp)) {
|
||||
log_debug("%s specified in fstab, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (path_is_busy("/boot")) {
|
||||
log_debug("/boot already populated, ignoring.");
|
||||
if (path_is_busy(esp)) {
|
||||
log_debug("%s already populated, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -488,7 +492,6 @@ static int add_boot(const char *what) {
|
||||
log_debug("EFI loader partition unknown.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to read ESP partition UUID: %m");
|
||||
return r;
|
||||
@ -514,35 +517,35 @@ static int add_boot(const char *what) {
|
||||
|
||||
(void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
|
||||
if (!streq_ptr(fstype, "vfat")) {
|
||||
log_debug("Partition for /boot is not a FAT filesystem, ignoring.");
|
||||
log_debug("Partition for %s is not a FAT filesystem, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
r = blkid_probe_lookup_value(b, "PART_ENTRY_UUID", &uuid, NULL);
|
||||
if (r != 0) {
|
||||
log_debug_errno(errno, "Partition for /boot does not have a UUID, ignoring.");
|
||||
log_debug_errno(errno, "Partition for %s does not have a UUID, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sd_id128_from_string(uuid, &type_id) < 0) {
|
||||
log_debug("Partition for /boot does not have a valid UUID, ignoring.");
|
||||
log_debug("Partition for %s does not have a valid UUID, ignoring.", esp);
|
||||
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.");
|
||||
log_debug("Partition for %s does not appear to be the partition we are booted from.", esp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = add_automount("boot",
|
||||
what,
|
||||
"/boot",
|
||||
"vfat",
|
||||
true,
|
||||
"umask=0077",
|
||||
"EFI System Partition Automount",
|
||||
120 * USEC_PER_SEC);
|
||||
what,
|
||||
esp,
|
||||
"vfat",
|
||||
true,
|
||||
"umask=0077",
|
||||
"EFI System Partition Automount",
|
||||
120 * USEC_PER_SEC);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user