diff options
-rw-r--r-- | man/kernel-command-line.xml | 2 | ||||
-rw-r--r-- | man/systemd-cryptsetup-generator.xml | 19 | ||||
-rw-r--r-- | src/cryptsetup/cryptsetup-generator.c | 32 |
3 files changed, 47 insertions, 6 deletions
diff --git a/man/kernel-command-line.xml b/man/kernel-command-line.xml index 68460ac93d..e32ed1972e 100644 --- a/man/kernel-command-line.xml +++ b/man/kernel-command-line.xml @@ -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> diff --git a/man/systemd-cryptsetup-generator.xml b/man/systemd-cryptsetup-generator.xml index d4a9cc73ec..c8753cef37 100644 --- a/man/systemd-cryptsetup-generator.xml +++ b/man/systemd-cryptsetup-generator.xml @@ -140,6 +140,25 @@ </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> diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c index efbcb3afbc..3a866f36fc 100644 --- a/src/cryptsetup/cryptsetup-generator.c +++ b/src/cryptsetup/cryptsetup-generator.c @@ -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; } |