[systemd-devel] [PATCH 1/2] fstab-generator: Support root on tmpfs (or other deviceless FS)
Tobias Hunger
tobias.hunger at gmail.com
Mon Mar 23 16:52:59 PDT 2015
This allows for stateless systems.
---
src/fstab-generator/fstab-generator.c | 21 +++++++++++++--------
src/shared/util.c | 30 ++++++++++++++++++++++++++++++
src/shared/util.h | 1 +
3 files changed, 44 insertions(+), 8 deletions(-)
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 2ece12f..77c97fd 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 ad548da..cb03527 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -1713,6 +1713,36 @@ 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"
+ "nfs\0"
+ "nfs4\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 nulstr_contains(table, fstype);
+}
+
int chvt(int vt) {
_cleanup_close_ int fd;
diff --git a/src/shared/util.h b/src/shared/util.h
index 29e85bb..b5f44b8 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.3.3
More information about the systemd-devel
mailing list