From 9473414219330b9febc1d0712bbf49ad74cf962f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 22 Jun 2012 10:27:05 +0200 Subject: [PATCH] fstab-generator: support fstab=/rd.fstab= kernel cmdline This generalizes functionality already available in dracut. --- TODO | 4 +- man/kernel-command-line.xml | 14 +++++- src/fstab-generator/fstab-generator.c | 64 +++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/TODO b/TODO index 4aa03a525..f301ac121 100644 --- a/TODO +++ b/TODO @@ -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 f7b35f5e2..10b348fcc 100644 --- a/man/kernel-command-line.xml +++ b/man/kernel-command-line.xml @@ -240,7 +240,19 @@ Configures the LUKS full-disk encryption logic at boot. For details see - cryptsetup@.service8. + systemd-cryptsetup-generator8. + + + + + fstab= + rd.fstab= + + + Configures the + /etc/fstab + logic at boot. For details see + systemd-fstab-generator8. diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index d9ba3e32e..f832730b4 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; -- 2.30.2