From b0438462089d1e1460429a57718305de08985908 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 24 Mar 2015 00:52:59 +0100 Subject: [PATCH] fstab-generator: Support root on tmpfs (or other deviceless FS) This allows for stateless systems. --- src/fstab-generator/fstab-generator.c | 21 +++++++++++-------- src/shared/util.c | 29 +++++++++++++++++++++++++++ src/shared/util.h | 1 + 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index 2ece12f79..77c97fdb2 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -397,15 +397,20 @@ static int add_root_mount(void) { _cleanup_free_ char *what = NULL; const char *opts; - if (isempty(arg_root_what)) { - log_debug("Could not find a root= entry on the kernel command line."); - return 0; - } + if (fstype_is_deviceless(arg_root_fstype)) { + if (free_and_strdup(&what, arg_root_what) < 0) + return log_oom(); + } else { + if (isempty(arg_root_what)) { + log_debug("Could not find a root= entry on the kernel command line."); + return 0; + } - what = fstab_node_to_udev_node(arg_root_what); - if (!path_is_absolute(what)) { - log_debug("Skipping entry what=%s where=/sysroot type=%s", what, strna(arg_root_fstype)); - return 0; + what = fstab_node_to_udev_node(arg_root_what); + if (!path_is_absolute(what)) { + log_debug("Skipping entry what=%s where=/sysroot type=%s", what, strna(arg_root_fstype)); + return 0; + } } if (!arg_root_options) diff --git a/src/shared/util.c b/src/shared/util.c index ad548da82..2d50f73dc 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -1713,6 +1713,35 @@ bool fstype_is_network(const char *fstype) { return nulstr_contains(table, fstype); } +bool fstype_is_deviceless(const char *fstype) { + static const char table[] = + "autofs\0" + "bdev\0" + "cgroup\0" + "configfs\0" + "cpuset\0" + "debugfs\0" + "devpts\0" + "devtmpfs\0" + "efivarfs\0" + "hugetlbfs\0" + "mqueue\0" + "overlayfs\0" + "pipefs\0" + "proc\0" + "pstore\0" + "ramfs\0" + "rootfs\0" + "rpc_pipefs\0" + "securityfs\0" + "sockfs\0" + "sysfs\0" + "tmpfs\0"; + + return !isempty(fstype) && ( + nulstr_contains(table, fstype) || fstype_is_network(fstype)); +} + int chvt(int vt) { _cleanup_close_ int fd; diff --git a/src/shared/util.h b/src/shared/util.h index 29e85bb7e..b5f44b8a1 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -409,6 +409,7 @@ int fd_cloexec(int fd, bool cloexec); int close_all_fds(const int except[], unsigned n_except); bool fstype_is_network(const char *fstype); +bool fstype_is_deviceless(const char *fstype); int chvt(int vt); -- 2.30.2