mirror of
https://github.com/systemd/systemd.git
synced 2025-01-10 05:18:17 +03:00
cryptsetup-generator: Add support for naming luks devices on kernel cmdline
This commit is contained in:
parent
6cd5b12aa5
commit
baade8cc23
@ -283,6 +283,8 @@
|
||||
<term><varname>rd.luks=</varname></term>
|
||||
<term><varname>luks.crypttab=</varname></term>
|
||||
<term><varname>rd.luks.crypttab=</varname></term>
|
||||
<term><varname>luks.name=</varname></term>
|
||||
<term><varname>rd.luks.name=</varname></term>
|
||||
<term><varname>luks.uuid=</varname></term>
|
||||
<term><varname>rd.luks.uuid=</varname></term>
|
||||
<term><varname>luks.options=</varname></term>
|
||||
|
@ -139,6 +139,25 @@
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>luks.name=</varname></term>
|
||||
<term><varname>rd.luks.name=</varname></term>
|
||||
|
||||
<listitem><para>Takes a LUKS super
|
||||
block UUID followed by an '=' and a name. This implies
|
||||
<varname>rd.luks.uuid=</varname> or <varname>luks.uuid=</varname>
|
||||
and will additionally make the LUKS device given by
|
||||
the UUID appear under the provided name.</para>
|
||||
|
||||
<para><varname>rd.luks.name=</varname>
|
||||
is honored only by initial RAM disk
|
||||
(initrd) while
|
||||
<varname>luks.name=</varname> is
|
||||
honored by both the main system and
|
||||
the initrd.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>luks.options=</varname></term>
|
||||
<term><varname>rd.luks.options=</varname></term>
|
||||
|
@ -37,6 +37,7 @@
|
||||
typedef struct crypto_device {
|
||||
char *uuid;
|
||||
char *keyfile;
|
||||
char *name;
|
||||
char *options;
|
||||
bool create;
|
||||
} crypto_device;
|
||||
@ -266,6 +267,7 @@ static void free_arg_disks(void) {
|
||||
while ((d = hashmap_steal_first(arg_disks))) {
|
||||
free(d->uuid);
|
||||
free(d->keyfile);
|
||||
free(d->name);
|
||||
free(d->options);
|
||||
free(d);
|
||||
}
|
||||
@ -286,7 +288,7 @@ static crypto_device *get_crypto_device(const char *uuid) {
|
||||
return NULL;
|
||||
|
||||
d->create = false;
|
||||
d->keyfile = d->options = NULL;
|
||||
d->keyfile = d->options = d->name = NULL;
|
||||
|
||||
d->uuid = strdup(uuid);
|
||||
if (!d->uuid) {
|
||||
@ -362,6 +364,22 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
|
||||
} else if (free_and_strdup(&arg_default_keyfile, value))
|
||||
return log_oom();
|
||||
|
||||
} else if (STR_IN_SET(key, "luks.name", "rd.luks.name") && value) {
|
||||
|
||||
r = sscanf(value, "%m[0-9a-fA-F-]=%ms", &uuid, &uuid_value);
|
||||
if (r == 2) {
|
||||
d = get_crypto_device(uuid);
|
||||
if (!d)
|
||||
return log_oom();
|
||||
|
||||
d->create = arg_whitelist = true;
|
||||
|
||||
free(d->name);
|
||||
d->name = uuid_value;
|
||||
uuid_value = NULL;
|
||||
} else
|
||||
log_warning("Failed to parse luks name switch %s. Ignoring.", value);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -446,14 +464,16 @@ static int add_proc_cmdline_devices(void) {
|
||||
|
||||
HASHMAP_FOREACH(d, arg_disks, i) {
|
||||
const char *options;
|
||||
_cleanup_free_ char *name = NULL, *device = NULL;
|
||||
_cleanup_free_ char *device = NULL;
|
||||
|
||||
if (!d->create)
|
||||
continue;
|
||||
|
||||
name = strappend("luks-", d->uuid);
|
||||
if (!name)
|
||||
return log_oom();
|
||||
if (!d->name) {
|
||||
d->name = strappend("luks-", d->uuid);
|
||||
if (!d->name)
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
device = strappend("UUID=", d->uuid);
|
||||
if (!device)
|
||||
@ -466,7 +486,7 @@ static int add_proc_cmdline_devices(void) {
|
||||
else
|
||||
options = "timeout=0";
|
||||
|
||||
r = create_disk(name, device, d->keyfile ?: arg_default_keyfile, options);
|
||||
r = create_disk(d->name, device, d->keyfile ?: arg_default_keyfile, options);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user