fstab-generator: support fstab=/rd.fstab= kernel cmdline

This generalizes functionality already available in dracut.
This commit is contained in:
Lennart Poettering 2012-06-22 10:27:05 +02:00
parent 2488799b35
commit 9473414219
3 changed files with 78 additions and 4 deletions

4
TODO
View File

@ -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

View File

@ -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>

View File

@ -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;