mirror of
https://github.com/systemd/systemd.git
synced 2024-12-26 03:22:00 +03:00
gpt-generator: relax EFI check a bit
Previously, we'd not mount the ESP except on EFI boots, and only when the ESP used for booting matches the ESP we found. With this change on non-EFI boots we'll mount a discovered ESP anyway, and on EFI boots we'll only mount it if it matches the ESP we booted from.
This commit is contained in:
parent
5b8411a2aa
commit
7ba25ab561
@ -450,19 +450,11 @@ static int add_automount(
|
||||
}
|
||||
|
||||
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 the ESP.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (in_initrd()) {
|
||||
log_debug("In initrd, ignoring the ESP.");
|
||||
return 0;
|
||||
@ -487,58 +479,67 @@ static int add_boot(const char *what) {
|
||||
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;
|
||||
}
|
||||
if (is_efi_boot()) {
|
||||
_cleanup_blkid_free_probe_ blkid_probe b = NULL;
|
||||
const char *fstype = NULL, *uuid_string = NULL;
|
||||
sd_id128_t loader_uuid, part_uuid;
|
||||
|
||||
errno = 0;
|
||||
b = blkid_new_probe_from_filename(what);
|
||||
if (!b) {
|
||||
if (errno == 0)
|
||||
return log_oom();
|
||||
return log_error_errno(errno, "Failed to allocate prober: %m");
|
||||
}
|
||||
/* If this is an EFI boot, be extra careful, and only mount the ESP if it was the ESP used for booting. */
|
||||
|
||||
blkid_probe_enable_partitions(b, 1);
|
||||
blkid_probe_set_partitions_flags(b, BLKID_PARTS_ENTRY_DETAILS);
|
||||
r = efi_loader_get_device_part_uuid(&loader_uuid);
|
||||
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;
|
||||
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);
|
||||
errno = 0;
|
||||
b = blkid_new_probe_from_filename(what);
|
||||
if (!b) {
|
||||
if (errno == 0)
|
||||
return log_oom();
|
||||
return log_error_errno(errno, "Failed to allocate prober: %m");
|
||||
}
|
||||
|
||||
(void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
|
||||
if (!streq_ptr(fstype, "vfat")) {
|
||||
log_debug("Partition for %s is not a FAT filesystem, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
blkid_probe_enable_partitions(b, 1);
|
||||
blkid_probe_set_partitions_flags(b, BLKID_PARTS_ENTRY_DETAILS);
|
||||
|
||||
errno = 0;
|
||||
r = blkid_probe_lookup_value(b, "PART_ENTRY_UUID", &uuid, NULL);
|
||||
if (r != 0) {
|
||||
log_debug_errno(errno, "Partition for %s does not have a UUID, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
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);
|
||||
|
||||
if (sd_id128_from_string(uuid, &type_id) < 0) {
|
||||
log_debug("Partition for %s does not have a valid UUID, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
(void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
|
||||
if (!streq_ptr(fstype, "vfat")) {
|
||||
log_debug("Partition for %s is not a FAT filesystem, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!sd_id128_equal(type_id, id)) {
|
||||
log_debug("Partition for %s does not appear to be the partition we are booted from.", esp);
|
||||
return 0;
|
||||
}
|
||||
errno = 0;
|
||||
r = blkid_probe_lookup_value(b, "PART_ENTRY_UUID", &uuid_string, NULL);
|
||||
if (r != 0) {
|
||||
log_debug_errno(errno, "Partition for %s does not have a UUID, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = add_automount("boot",
|
||||
if (sd_id128_from_string(uuid_string, &part_uuid) < 0) {
|
||||
log_debug("Partition for %s does not have a valid UUID, ignoring.", esp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!sd_id128_equal(part_uuid, loader_uuid)) {
|
||||
log_debug("Partition for %s does not appear to be the partition we are booted from.", esp);
|
||||
return 0;
|
||||
}
|
||||
} else
|
||||
log_debug("Not an EFI boot, skipping ESP check.");
|
||||
|
||||
return add_automount("boot",
|
||||
what,
|
||||
esp,
|
||||
"vfat",
|
||||
@ -546,8 +547,6 @@ static int add_boot(const char *what) {
|
||||
"umask=0077",
|
||||
"EFI System Partition Automount",
|
||||
120 * USEC_PER_SEC);
|
||||
|
||||
return r;
|
||||
}
|
||||
#else
|
||||
static int add_boot(const char *what) {
|
||||
|
Loading…
Reference in New Issue
Block a user