This creates /dev/fd, /dev/stdin, /dev/stdout, and /std/stderr as symlinks to the /proc/self/fd tree on container creation. These are needed for shells like bash to be fully functional. --- src/nspawn/nspawn.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 7d188f0..2a7f843 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -373,6 +373,35 @@ static int setup_resolv_conf(const char *dest) { return 0; } +static int create_dev_fd_symlinks(const char *dest) { + + static const char symlinks[] = + "/proc/self/fd\0" "fd\0" + "/proc/self/fd/0\0" "stdin\0" + "/proc/self/fd/1\0" "stdout\0" + "/proc/self/fd/2\0" "stderr\0"; + + const char *i, *to; + int r = 0; + + NULSTR_FOREACH_PAIR(to, i, symlinks) { + char *from = NULL; + + if (asprintf(&from, "%s/dev/%s", dest, i) < 0) + return log_oom(); + + r = symlink(to, from); + free(from); + + if (r < 0) { + log_error("failed to symlink %s to %s: %m", from, to); + break; + } + } + + return r; +} + static int copy_devnodes(const char *dest) { static const char devnodes[] = @@ -1204,6 +1233,9 @@ int main(int argc, char *argv[]) { if (copy_devnodes(arg_directory) < 0) goto child_fail; + if (create_dev_fd_symlinks(arg_directory) < 0) + goto child_fail; + if (setup_dev_console(arg_directory, console) < 0) goto child_fail; -- 1.7.11.4 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel