mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-07 17:17:44 +03:00
gpt-auto: also load the boot loader partition during regular boots
This commit is contained in:
parent
d9223c07f5
commit
9f1cb0c1fa
@ -322,7 +322,6 @@ static int add_swap(const char *path) {
|
|||||||
return generator_add_symlink(arg_dest, SPECIAL_SWAP_TARGET, "wants", name);
|
return generator_add_symlink(arg_dest, SPECIAL_SWAP_TARGET, "wants", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_EFI
|
|
||||||
static int add_automount(
|
static int add_automount(
|
||||||
const char *id,
|
const char *id,
|
||||||
const char *what,
|
const char *what,
|
||||||
@ -384,8 +383,43 @@ static int add_automount(
|
|||||||
return generator_add_symlink(arg_dest, SPECIAL_LOCAL_FS_TARGET, "wants", unit);
|
return generator_add_symlink(arg_dest, SPECIAL_LOCAL_FS_TARGET, "wants", unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int add_esp(DissectedPartition *p) {
|
static int add_xbootldr(DissectedPartition *p) {
|
||||||
const char *esp;
|
int r;
|
||||||
|
|
||||||
|
assert(p);
|
||||||
|
|
||||||
|
if (in_initrd()) {
|
||||||
|
log_debug("In initrd, ignoring the XBOOTLDR partition.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = fstab_is_mount_point("/boot");
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to parse fstab: %m");
|
||||||
|
if (r > 0) {
|
||||||
|
log_debug("/boot specified in fstab, ignoring XBOOTLDR partition.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = path_is_busy("/boot");
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
if (r > 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return add_automount("boot",
|
||||||
|
p->node,
|
||||||
|
"/boot",
|
||||||
|
p->fstype,
|
||||||
|
true,
|
||||||
|
"umask=0077",
|
||||||
|
"Boot Loader Partition",
|
||||||
|
120 * USEC_PER_SEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ENABLE_EFI
|
||||||
|
static int add_esp(DissectedPartition *p, bool has_xbootldr) {
|
||||||
|
const char *esp_path = NULL, *id = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(p);
|
assert(p);
|
||||||
@ -395,21 +429,37 @@ static int add_esp(DissectedPartition *p) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If /efi exists we'll use that. Otherwise we'll use /boot, as that's usually the better choice */
|
/* If /efi exists we'll use that. Otherwise we'll use /boot, as that's usually the better choice, but
|
||||||
esp = access("/efi/", F_OK) >= 0 ? "/efi" : "/boot";
|
* only if there's no explicit XBOOTLDR partition around. */
|
||||||
|
if (access("/efi", F_OK) < 0) {
|
||||||
|
if (errno != ENOENT)
|
||||||
|
return log_error_errno(errno, "Failed to determine whether /efi exists: %m");
|
||||||
|
|
||||||
|
/* Use /boot as fallback, but only if there's no XBOOTLDR partition */
|
||||||
|
if (!has_xbootldr) {
|
||||||
|
esp_path = "/boot";
|
||||||
|
id = "boot";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!esp_path)
|
||||||
|
esp_path = "/efi";
|
||||||
|
if (!id)
|
||||||
|
id = "efi";
|
||||||
|
|
||||||
/* We create an .automount which is not overridden by the .mount from the fstab generator. */
|
/* We create an .automount which is not overridden by the .mount from the fstab generator. */
|
||||||
r = fstab_is_mount_point(esp);
|
r = fstab_is_mount_point(esp_path);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to parse fstab: %m");
|
return log_error_errno(r, "Failed to parse fstab: %m");
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
log_debug("%s specified in fstab, ignoring.", esp);
|
log_debug("%s specified in fstab, ignoring.", esp_path);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = path_is_busy(esp);
|
r = path_is_busy(esp_path);
|
||||||
if (r != 0)
|
if (r < 0)
|
||||||
return r < 0 ? r : 0;
|
return r;
|
||||||
|
if (r > 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (is_efi_boot()) {
|
if (is_efi_boot()) {
|
||||||
sd_id128_t loader_uuid;
|
sd_id128_t loader_uuid;
|
||||||
@ -425,15 +475,15 @@ static int add_esp(DissectedPartition *p) {
|
|||||||
return log_error_errno(r, "Failed to read ESP partition UUID: %m");
|
return log_error_errno(r, "Failed to read ESP partition UUID: %m");
|
||||||
|
|
||||||
if (!sd_id128_equal(p->uuid, loader_uuid)) {
|
if (!sd_id128_equal(p->uuid, loader_uuid)) {
|
||||||
log_debug("Partition for %s does not appear to be the partition we are booted from.", esp);
|
log_debug("Partition for %s does not appear to be the partition we are booted from.", p->node);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
log_debug("Not an EFI boot, skipping ESP check.");
|
log_debug("Not an EFI boot, skipping ESP check.");
|
||||||
|
|
||||||
return add_automount("boot",
|
return add_automount(id,
|
||||||
p->node,
|
p->node,
|
||||||
esp,
|
esp_path,
|
||||||
p->fstype,
|
p->fstype,
|
||||||
true,
|
true,
|
||||||
"umask=0077",
|
"umask=0077",
|
||||||
@ -441,7 +491,7 @@ static int add_esp(DissectedPartition *p) {
|
|||||||
120 * USEC_PER_SEC);
|
120 * USEC_PER_SEC);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static int add_esp(DissectedPartition *p) {
|
static int add_esp(DissectedPartition *p, bool has_xbootldr) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -569,8 +619,14 @@ static int enumerate_partitions(dev_t devnum) {
|
|||||||
r = k;
|
r = k;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m->partitions[PARTITION_XBOOTLDR].found) {
|
||||||
|
k = add_xbootldr(m->partitions + PARTITION_XBOOTLDR);
|
||||||
|
if (k < 0)
|
||||||
|
r = k;
|
||||||
|
}
|
||||||
|
|
||||||
if (m->partitions[PARTITION_ESP].found) {
|
if (m->partitions[PARTITION_ESP].found) {
|
||||||
k = add_esp(m->partitions + PARTITION_ESP);
|
k = add_esp(m->partitions + PARTITION_ESP, m->partitions[PARTITION_XBOOTLDR].found);
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
r = k;
|
r = k;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user