diff options
-rw-r--r-- | TODO | 4 | ||||
-rw-r--r-- | man/kernel-command-line.xml | 14 | ||||
-rw-r--r-- | src/fstab-generator/fstab-generator.c | 64 |
3 files changed, 78 insertions, 4 deletions
@@ -30,9 +30,7 @@ Features: * exclude processes marked with argv[0][0]=@ from the normal service killing too -* support rd.luks= kernel cmdline params in cryptsetup generator - -* support rd.fstab= kernel cmdline params in fstab generator +* support rd.luks.allow-discards= kernel cmdline params in cryptsetup generator * support rd.driver= kernel cmdline params in modules load diff --git a/man/kernel-command-line.xml b/man/kernel-command-line.xml index f7b35f5e23..10b348fcc6 100644 --- a/man/kernel-command-line.xml +++ b/man/kernel-command-line.xml @@ -240,7 +240,19 @@ <para>Configures the LUKS full-disk encryption logic at boot. For details see - <citerefentry><refentrytitle>cryptsetup@.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para> + <citerefentry><refentrytitle>systemd-cryptsetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><varname>fstab=</varname></term> + <term><varname>rd.fstab=</varname></term> + + <listitem> + <para>Configures the + <filename>/etc/fstab</filename> + logic at boot. For details see + <citerefentry><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para> </listitem> </varlistentry> diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index d9ba3e32e2..f832730b40 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -32,8 +32,10 @@ #include "mount-setup.h" #include "special.h" #include "mkdir.h" +#include "virt.h" static const char *arg_dest = "/tmp"; +static bool arg_enabled = true; static int device_name(const char *path, char **unit) { char *p; @@ -492,6 +494,62 @@ finish: return r; } +static int parse_proc_cmdline(void) { + char *line, *w, *state; + int r; + size_t l; + + if (detect_container(NULL) > 0) + return 0; + + r = read_one_line_file("/proc/cmdline", &line); + if (r < 0) { + log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); + return 0; + } + + FOREACH_WORD_QUOTED(w, l, line, state) { + char *word; + + word = strndup(w, l); + if (!word) { + r = -ENOMEM; + goto finish; + } + + if (startswith(word, "fstab=")) { + r = parse_boolean(word + 6); + if (r < 0) + log_warning("Failed to parse fstab switch %s. Ignoring.", word + 6); + else + arg_enabled = r; + + } else if (startswith(word, "rd.fstab=")) { + + if (in_initrd()) { + r = parse_boolean(word + 6); + if (r < 0) + log_warning("Failed to parse fstab switch %s. Ignoring.", word + 6); + else + arg_enabled = r; + } + + } else if (startswith(word, "fstab.") || + (in_initrd() && startswith(word, "rd.fstab."))) { + + log_warning("Unknown kernel switch %s. Ignoring.", word); + } + + free(word); + } + + r = 0; + +finish: + free(line); + return r; +} + int main(int argc, char *argv[]) { int r; @@ -509,6 +567,12 @@ int main(int argc, char *argv[]) { umask(0022); + if (parse_proc_cmdline() < 0) + return EXIT_FAILURE; + + if (!arg_enabled) + return EXIT_SUCCESS; + r = parse_fstab(); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; |