diff options
author | Kay Sievers <kay@vrfy.org> | 2014-06-24 18:10:30 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2014-06-24 18:12:31 +0200 |
commit | 971ff8c78b3a7d94ed2289077f856c6988d18183 (patch) | |
tree | e573e67b14bcfd30ae37edb7277f5fb82d5f8577 /src/core | |
parent | 574cc928887851269c5919123dbdf8e1b2713b23 (diff) |
switch-root: create essential base directories at system bootup
This allows us to bootup a rootfs with a /usr directory only.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/switch-root.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/core/switch-root.c b/src/core/switch-root.c index 518ec1f0a7..f82243f8b1 100644 --- a/src/core/switch-root.c +++ b/src/core/switch-root.c @@ -30,6 +30,8 @@ #include "util.h" #include "path-util.h" #include "switch-root.h" +#include "mkdir.h" +#include "base-filesystem.h" #include "missing.h" int switch_root(const char *new_root) { @@ -45,6 +47,7 @@ int switch_root(const char *new_root) { struct stat new_root_stat; bool old_root_remove; const char *i, *temporary_old_root; + int r; if (path_equal(new_root, "/")) return 0; @@ -56,6 +59,7 @@ int switch_root(const char *new_root) { * than not that /mnt exists and is suitable as mount point * and is on the same fs as the old root dir */ temporary_old_root = strappenda(new_root, "/mnt"); + mkdir_p(temporary_old_root, 0755); old_root_remove = in_initrd(); @@ -80,6 +84,8 @@ int switch_root(const char *new_root) { snprintf(new_mount, sizeof(new_mount), "%s%s", new_root, i); char_array_0(new_mount); + mkdir_parents(new_mount, 0755); + if ((stat(new_mount, &sb) < 0) || sb.st_dev != new_root_stat.st_dev) { @@ -99,6 +105,12 @@ int switch_root(const char *new_root) { } } + r = base_filesystem_create(new_root); + if (r < 0) { + log_error("Failed to create the base filesystem: %s", strerror(-r)); + return r; + } + if (chdir(new_root) < 0) { log_error("Failed to change directory to %s: %m", new_root); return -errno; |