* [PATCH/RFC] unshare: add --fork/--mount-proc options for pid namespaces
@ 2013-06-28 0:04 Mike Frysinger
2013-07-01 11:40 ` Karel Zak
0 siblings, 1 reply; 6+ messages in thread
From: Mike Frysinger @ 2013-06-28 0:04 UTC (permalink / raw)
To: util-linux; +Cc: ebiederm, mtk.manpages
The ability of unshare to launch a new pid namespace is a bit limited.
The first process in the namespace is expected to be the "init" for it.
When it's not, you get bad behavior.
For example, trying to launch a shell in a new pid namespace fails very
quickly:
$ sudo unshare -p dash
# uname -r
3.8.3
# uname -m
dash: 2: Cannot fork
# ls -ld /
dash: 3: Cannot fork
# echo $$
1324
For this to work smoothly, we need an init process to actively watch over
things. But forcing people to re-use an existing init or write their own
mini init is a bit overkill. So let's add a --fork option to unshare to
do this common bit of book keeping. Now we can do:
$ sudo unshare -p --fork dash
# uname -r
3.8.3
# uname -m
x86_64
# ls -ld /
drwxr-xr-x 22 root root 4096 May 4 14:01 /
# echo $$
1
When it comes to pid namespaces, it's also useful for /proc to reflect
the current namespace. Again, this is easy to pull off, but annoying
to force everyone to do it themselves. So let's add a --mount-proc to
do the magic for us. The downside is that this also implies creating
a mount namespace as mounting the new pid namespace /proc over top the
system one will quickly break all other processes on the system.
$ sudo unshare --fork -p dash --mount-proc
# ps uaxOT
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4328 632 pts/15 S 19:51 0:00 dash
root 2 0.0 0.0 22592 1148 pts/15 R+ 19:51 0:00 ps uaxOT
Thanks to Michael Kerrisk for his namespace articles on lwn.net
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
sys-utils/unshare.1 | 10 ++++++++++
sys-utils/unshare.c | 41 +++++++++++++++++++++++++++++++++++++----
2 files changed, 47 insertions(+), 4 deletions(-)
diff --git a/sys-utils/unshare.1 b/sys-utils/unshare.1
index bd0f13e..5e2c27c 100644
--- a/sys-utils/unshare.1
+++ b/sys-utils/unshare.1
@@ -63,6 +63,16 @@ Unshare the UTS namespace.
.TP
.BR \-U , " \-\-user"
Unshare the user namespace.
+.TP
+.BR \-\-fork
+Fork the specified process as a child of unshare rather than running it
+directly. This is useful when creating a new pid namespace.
+.TP
+.BR \-\-mount\-proc
+Just before running the program, mount the proc filesystem at /proc. This
+is useful when creating a new pid namespace. It also implies creating a
+new mount namespace since the /proc mount would otherwise mess up existing
+programs on the system.
.SH SEE ALSO
.BR unshare (2),
.BR clone (2)
diff --git a/sys-utils/unshare.c b/sys-utils/unshare.c
index 8cc9c46..bc25d76 100644
--- a/sys-utils/unshare.c
+++ b/sys-utils/unshare.c
@@ -21,9 +21,12 @@
#include <errno.h>
#include <getopt.h>
#include <sched.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
#include "nls.h"
#include "c.h"
@@ -46,6 +49,8 @@ static void usage(int status)
fputs(_(" -n, --net unshare network namespace\n"), out);
fputs(_(" -p, --pid unshare pid namespace\n"), out);
fputs(_(" -U, --user unshare user namespace\n"), out);
+ fputs(_(" --fork fork before launching <program>\n"), out);
+ fputs(_(" --mount-proc mount /proc first (implies --mount)\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(USAGE_HELP, out);
@@ -66,12 +71,17 @@ int main(int argc, char *argv[])
{ "net", no_argument, 0, 'n' },
{ "pid", no_argument, 0, 'p' },
{ "user", no_argument, 0, 'U' },
+ { "fork", no_argument, 0, 1 },
+ { "mount-proc", no_argument, 0, 2 },
{ NULL, 0, 0, 0 }
};
int unshare_flags = 0;
int c;
+ pid_t pid;
+ bool forkit = false;
+ bool mount_proc = false;
setlocale(LC_MESSAGES, "");
bindtextdomain(PACKAGE, LOCALEDIR);
@@ -85,6 +95,9 @@ int main(int argc, char *argv[])
case 'V':
printf(UTIL_LINUX_VERSION);
return EXIT_SUCCESS;
+ case 2: /* --mount-proc */
+ mount_proc = true;
+ /* fall through */
case 'm':
unshare_flags |= CLONE_NEWNS;
break;
@@ -103,6 +116,9 @@ int main(int argc, char *argv[])
case 'U':
unshare_flags |= CLONE_NEWUSER;
break;
+ case 1: /* --fork */
+ forkit = true;
+ break;
default:
usage(EXIT_FAILURE);
}
@@ -111,9 +127,26 @@ int main(int argc, char *argv[])
if (-1 == unshare(unshare_flags))
err(EXIT_FAILURE, _("unshare failed"));
- if (optind < argc) {
- execvp(argv[optind], argv + optind);
- err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
+ pid = forkit ? fork() : 1;
+ if (pid == 0) {
+ /* child */
+ if (mount_proc && mount("proc", "/proc", "proc", 0, NULL))
+ err(EXIT_FAILURE, _("mount(/proc) failed"));
+ if (optind < argc) {
+ execvp(argv[optind], argv + optind);
+ err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
+ }
+ exec_shell();
+ } else {
+ /* parent */
+ int status;
+ if (waitpid(pid, &status, 0) == -1)
+ err(EXIT_FAILURE, _("waitpid failed"));
+ if (WIFEXITED(status))
+ return WEXITSTATUS(status);
+ else if (WIFSIGNALED(status))
+ kill(getpid(), WTERMSIG(status));
+ /* still here !? */
+ err(EXIT_FAILURE, _("child exit failed"));
}
- exec_shell();
}
--
1.8.2.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH/RFC] unshare: add --fork/--mount-proc options for pid namespaces
2013-06-28 0:04 [PATCH/RFC] unshare: add --fork/--mount-proc options for pid namespaces Mike Frysinger
@ 2013-07-01 11:40 ` Karel Zak
2013-07-01 14:47 ` Mike Frysinger
0 siblings, 1 reply; 6+ messages in thread
From: Karel Zak @ 2013-07-01 11:40 UTC (permalink / raw)
To: Mike Frysinger; +Cc: util-linux, ebiederm, mtk.manpages
On Thu, Jun 27, 2013 at 08:04:58PM -0400, Mike Frysinger wrote:
> When it comes to pid namespaces, it's also useful for /proc to reflect
> the current namespace. Again, this is easy to pull off, but annoying
> to force everyone to do it themselves. So let's add a --mount-proc to
> do the magic for us.
This is not so easy. For example on Fedora 18 the default is "shared":
# grep /proc /proc/self/mountinfo
14 33 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc rw
it means that unshare( CLONE_NEWNS ) has no expected effect and the
following mount(/proc) has horrible impact for all system. You have
to use (for example):
mount --make-rprivate /proc
unshare --fork --mount-proc --pid
The --fork option makes sense, but I have doubts about --mount-proc.
It would be better to keep unshare(1) simple and stupid rather than
expect that we can setup usable container by the util.
It's easy to call "mount proc /proc -t proc" after "unshare --pid
--mount --fork".
> - if (optind < argc) {
> - execvp(argv[optind], argv + optind);
> - err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
> + pid = forkit ? fork() : 1;
^^^^^^^^^^^^^^^^^^^^^^^^^^
> + if (pid == 0) {
> + /* child */
> + if (mount_proc && mount("proc", "/proc", "proc", 0, NULL))
> + err(EXIT_FAILURE, _("mount(/proc) failed"));
> + if (optind < argc) {
> + execvp(argv[optind], argv + optind);
> + err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
> + }
> + exec_shell();
> + } else {
> + /* parent */
> + int status;
> + if (waitpid(pid, &status, 0) == -1)
> + err(EXIT_FAILURE, _("waitpid failed"));
> + if (WIFEXITED(status))
> + return WEXITSTATUS(status);
> + else if (WIFSIGNALED(status))
> + kill(getpid(), WTERMSIG(status));
> + /* still here !? */
> + err(EXIT_FAILURE, _("child exit failed"));
> }
> - exec_shell();
> }
I guess it's bug that exec_shell() only when forkit is set and
waitpid() is called always.
See the patch below.
Karel
>From 535b754f0003b60b9d7c0358cc4366fae169dd19 Mon Sep 17 00:00:00 2001
From: Mike Frysinger <vapier@gentoo.org>
Date: Thu, 27 Jun 2013 20:04:58 -0400
Subject: [PATCH] unshare: add --fork options for pid namespaces
The ability of unshare to launch a new pid namespace is a bit limited.
The first process in the namespace is expected to be the "init" for it.
When it's not, you get bad behavior.
For example, trying to launch a shell in a new pid namespace fails very
quickly:
$ sudo unshare -p dash
# uname -r
3.8.3
# uname -m
dash: 2: Cannot fork
# ls -ld /
dash: 3: Cannot fork
# echo $$
1324
For this to work smoothly, we need an init process to actively watch over
things. But forcing people to re-use an existing init or write their own
mini init is a bit overkill. So let's add a --fork option to unshare to
do this common bit of book keeping. Now we can do:
$ sudo unshare -p --fork dash
# uname -r
3.8.3
# uname -m
x86_64
# ls -ld /
drwxr-xr-x 22 root root 4096 May 4 14:01 /
# echo $$
1
Thanks to Michael Kerrisk for his namespace articles on lwn.net
[kzak@redhat.com: - fix "forkif logic, remove --mount-proc]
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/unshare.1 | 6 +++++-
sys-utils/unshare.c | 31 ++++++++++++++++++++++++++++---
2 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/sys-utils/unshare.1 b/sys-utils/unshare.1
index bd0f13e..c387ceb 100644
--- a/sys-utils/unshare.1
+++ b/sys-utils/unshare.1
@@ -56,13 +56,17 @@ Unshare the mount namespace.
Unshare the network namespace.
.TP
.BR \-p , " \-\-pid"
-Unshare the pid namespace.
+Unshare the pid namespace. See also \fB--fork\fP option.
.TP
.BR \-u , " \-\-uts"
Unshare the UTS namespace.
.TP
.BR \-U , " \-\-user"
Unshare the user namespace.
+.TP
+.BR \-f , " \-\-fork"
+Fork the specified process as a child of unshare rather than running it
+directly. This is useful when creating a new pid namespace.
.SH SEE ALSO
.BR unshare (2),
.BR clone (2)
diff --git a/sys-utils/unshare.c b/sys-utils/unshare.c
index 8cc9c46..a889eee 100644
--- a/sys-utils/unshare.c
+++ b/sys-utils/unshare.c
@@ -24,6 +24,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <sys/wait.h>
#include "nls.h"
#include "c.h"
@@ -46,6 +47,7 @@ static void usage(int status)
fputs(_(" -n, --net unshare network namespace\n"), out);
fputs(_(" -p, --pid unshare pid namespace\n"), out);
fputs(_(" -U, --user unshare user namespace\n"), out);
+ fputs(_(" -f, --fork fork before launching <program>\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(USAGE_HELP, out);
@@ -66,20 +68,23 @@ int main(int argc, char *argv[])
{ "net", no_argument, 0, 'n' },
{ "pid", no_argument, 0, 'p' },
{ "user", no_argument, 0, 'U' },
+ { "fork", no_argument, 0, 'f' },
{ NULL, 0, 0, 0 }
};
int unshare_flags = 0;
-
- int c;
+ int c, forkit = 0;
setlocale(LC_MESSAGES, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
atexit(close_stdout);
- while ((c = getopt_long(argc, argv, "hVmuinpU", longopts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "fhVmuinpU", longopts, NULL)) != -1) {
switch (c) {
+ case 'f':
+ forkit = 1;
+ break;
case 'h':
usage(EXIT_SUCCESS);
case 'V':
@@ -111,6 +116,26 @@ int main(int argc, char *argv[])
if (-1 == unshare(unshare_flags))
err(EXIT_FAILURE, _("unshare failed"));
+ if (forkit) {
+ int status;
+ pid_t pid = fork();
+
+ switch(pid) {
+ case -1:
+ err(EXIT_FAILURE, _("fork failed"));
+ case 0: /* child */
+ break;
+ default: /* parent */
+ if (waitpid(pid, &status, 0) == -1)
+ err(EXIT_FAILURE, _("waitpid failed"));
+ if (WIFEXITED(status))
+ return WEXITSTATUS(status);
+ else if (WIFSIGNALED(status))
+ kill(getpid(), WTERMSIG(status));
+ err(EXIT_FAILURE, _("child exit failed"));
+ }
+ }
+
if (optind < argc) {
execvp(argv[optind], argv + optind);
err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
--
1.8.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH/RFC] unshare: add --fork/--mount-proc options for pid namespaces
2013-07-01 11:40 ` Karel Zak
@ 2013-07-01 14:47 ` Mike Frysinger
2013-07-03 10:36 ` Karel Zak
0 siblings, 1 reply; 6+ messages in thread
From: Mike Frysinger @ 2013-07-01 14:47 UTC (permalink / raw)
To: Karel Zak; +Cc: util-linux, ebiederm, mtk.manpages
[-- Attachment #1: Type: Text/Plain, Size: 1839 bytes --]
On Monday 01 July 2013 07:40:08 Karel Zak wrote:
> On Thu, Jun 27, 2013 at 08:04:58PM -0400, Mike Frysinger wrote:
> > When it comes to pid namespaces, it's also useful for /proc to reflect
> > the current namespace. Again, this is easy to pull off, but annoying
> > to force everyone to do it themselves. So let's add a --mount-proc to
> > do the magic for us.
>
> This is not so easy. For example on Fedora 18 the default is "shared":
>
> # grep /proc /proc/self/mountinfo
> 14 33 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc rw
>
> it means that unshare( CLONE_NEWNS ) has no expected effect and the
> following mount(/proc) has horrible impact for all system. You have
> to use (for example):
>
> mount --make-rprivate /proc
> unshare --fork --mount-proc --pid
i'm not quite following here. are you saying that Fedora 18 by default makes
it hard to do pid namespaces ?
> The --fork option makes sense, but I have doubts about --mount-proc.
>
> It would be better to keep unshare(1) simple and stupid rather than
> expect that we can setup usable container by the util.
>
> It's easy to call "mount proc /proc -t proc" after "unshare --pid
> --mount --fork".
unless you're running on a system that has a shared /proc ? :)
> > - if (optind < argc) {
> > - execvp(argv[optind], argv + optind);
> > - err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
> > + pid = forkit ? fork() : 1;
> ^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> I guess it's bug that exec_shell() only when forkit is set and
> waitpid() is called always.
i fixed this locally already. guess i sent out a stale version. change the
"1" to "0".
> See the patch below.
sure, that gets us half way home :)
> + switch(pid) {
needs a space before the (
-mike
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH/RFC] unshare: add --fork/--mount-proc options for pid namespaces
2013-07-01 14:47 ` Mike Frysinger
@ 2013-07-03 10:36 ` Karel Zak
2013-07-03 17:08 ` Mike Frysinger
0 siblings, 1 reply; 6+ messages in thread
From: Karel Zak @ 2013-07-03 10:36 UTC (permalink / raw)
To: Mike Frysinger; +Cc: util-linux, ebiederm, mtk.manpages
On Mon, Jul 01, 2013 at 10:47:04AM -0400, Mike Frysinger wrote:
> On Monday 01 July 2013 07:40:08 Karel Zak wrote:
> > On Thu, Jun 27, 2013 at 08:04:58PM -0400, Mike Frysinger wrote:
> > > When it comes to pid namespaces, it's also useful for /proc to reflect
> > > the current namespace. Again, this is easy to pull off, but annoying
> > > to force everyone to do it themselves. So let's add a --mount-proc to
> > > do the magic for us.
> >
> > This is not so easy. For example on Fedora 18 the default is "shared":
> >
> > # grep /proc /proc/self/mountinfo
> > 14 33 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc rw
> >
> > it means that unshare( CLONE_NEWNS ) has no expected effect and the
> > following mount(/proc) has horrible impact for all system. You have
> > to use (for example):
> >
> > mount --make-rprivate /proc
> > unshare --fork --mount-proc --pid
>
> i'm not quite following here. are you saying that Fedora 18 by default makes
> it hard to do pid namespaces ?
/proc does not have to be private. You have to call
mount("none", "/proc", NULL, MS_PRIVATE|MS_REC, NULL);
to be sure that unshare(CLONE_NEWNS) makes any effect. It's mistake
to blindly call
unshare( CLONE_NEWNS );
mount("proc, "/proc", "proc", 0, NULL);
If we want to add --mount-proc to unshare(1) than the implementation has to
be robust. Your current patch is dangerous on systems where /proc is shared.
It would be also nice to support optional argument to specify the
mountpoint --mount-proc[=<mountpoint>].
See the patch below -- works for me.
Karel
>From 03719f39f83770af7dc1f6fca38c6c1deb98d84c Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 3 Jul 2013 12:28:16 +0200
Subject: [PATCH] unshare: add --mount-proc for pid namespaces
Based on patch from Mike Frysinger <vapier@gentoo.org>.
Mike Frysinger wrote:
When it comes to pid namespaces, it's also useful for /proc to reflect
the current namespace. Again, this is easy to pull off, but annoying
to force everyone to do it themselves. So let's add a --mount-proc to
do the magic for us. The downside is that this also implies creating
a mount namespace as mounting the new pid namespace /proc over top the
system one will quickly break all other processes on the system.
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/unshare.1 | 8 +++++++-
sys-utils/unshare.c | 30 +++++++++++++++++++++++-------
2 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/sys-utils/unshare.1 b/sys-utils/unshare.1
index c387ceb..dfd4189 100644
--- a/sys-utils/unshare.1
+++ b/sys-utils/unshare.1
@@ -56,7 +56,7 @@ Unshare the mount namespace.
Unshare the network namespace.
.TP
.BR \-p , " \-\-pid"
-Unshare the pid namespace. See also \fB--fork\fP option.
+Unshare the pid namespace. See also \fB--fork\fP and \fB--mount-proc\fP options.
.TP
.BR \-u , " \-\-uts"
Unshare the UTS namespace.
@@ -67,6 +67,12 @@ Unshare the user namespace.
.BR \-f , " \-\-fork"
Fork the specified process as a child of unshare rather than running it
directly. This is useful when creating a new pid namespace.
+.TP
+.BR "\fB\-\-mount-proc\fR [=\fImountpoint\fP]"
+Just before running the program, mount the proc filesystem at the \fImountpoint\fP
+(default is /proc). This is useful when creating a new pid namespace. It also
+implies creating a new mount namespace since the /proc mount would otherwise
+mess up existing programs on the system.
.SH SEE ALSO
.BR unshare (2),
.BR clone (2)
diff --git a/sys-utils/unshare.c b/sys-utils/unshare.c
index a889eee..a64b776 100644
--- a/sys-utils/unshare.c
+++ b/sys-utils/unshare.c
@@ -25,6 +25,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
+#include <sys/mount.h>
#include "nls.h"
#include "c.h"
@@ -41,13 +42,14 @@ static void usage(int status)
_(" %s [options] <program> [args...]\n"), program_invocation_short_name);
fputs(USAGE_OPTIONS, out);
- fputs(_(" -m, --mount unshare mounts namespace\n"), out);
- fputs(_(" -u, --uts unshare UTS namespace (hostname etc)\n"), out);
- fputs(_(" -i, --ipc unshare System V IPC namespace\n"), out);
- fputs(_(" -n, --net unshare network namespace\n"), out);
- fputs(_(" -p, --pid unshare pid namespace\n"), out);
- fputs(_(" -U, --user unshare user namespace\n"), out);
- fputs(_(" -f, --fork fork before launching <program>\n"), out);
+ fputs(_(" -m, --mount unshare mounts namespace\n"), out);
+ fputs(_(" -u, --uts unshare UTS namespace (hostname etc)\n"), out);
+ fputs(_(" -i, --ipc unshare System V IPC namespace\n"), out);
+ fputs(_(" -n, --net unshare network namespace\n"), out);
+ fputs(_(" -p, --pid unshare pid namespace\n"), out);
+ fputs(_(" -U, --user unshare user namespace\n"), out);
+ fputs(_(" -f, --fork fork before launching <program>\n"), out);
+ fputs(_(" --mount-proc[=<dir>] mount proc filesystem first (implies --mount)\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(USAGE_HELP, out);
@@ -59,6 +61,9 @@ static void usage(int status)
int main(int argc, char *argv[])
{
+ enum {
+ OPT_MOUNTPROC = CHAR_MAX + 1
+ };
static const struct option longopts[] = {
{ "help", no_argument, 0, 'h' },
{ "version", no_argument, 0, 'V'},
@@ -69,11 +74,13 @@ int main(int argc, char *argv[])
{ "pid", no_argument, 0, 'p' },
{ "user", no_argument, 0, 'U' },
{ "fork", no_argument, 0, 'f' },
+ { "mount-proc", optional_argument, 0, OPT_MOUNTPROC },
{ NULL, 0, 0, 0 }
};
int unshare_flags = 0;
int c, forkit = 0;
+ const char *procmnt = NULL;
setlocale(LC_MESSAGES, "");
bindtextdomain(PACKAGE, LOCALEDIR);
@@ -108,6 +115,10 @@ int main(int argc, char *argv[])
case 'U':
unshare_flags |= CLONE_NEWUSER;
break;
+ case OPT_MOUNTPROC:
+ unshare_flags |= CLONE_NEWNS;
+ procmnt = optarg ? optarg : "/proc";
+ break;
default:
usage(EXIT_FAILURE);
}
@@ -136,6 +147,11 @@ int main(int argc, char *argv[])
}
}
+ if (procmnt &&
+ (mount("none", procmnt, NULL, MS_PRIVATE|MS_REC, NULL) != 0 ||
+ mount("proc", procmnt, "proc", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL) != 0))
+ err(EXIT_FAILURE, _("mount %s failed"), procmnt);
+
if (optind < argc) {
execvp(argv[optind], argv + optind);
err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
--
1.8.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH/RFC] unshare: add --fork/--mount-proc options for pid namespaces
2013-07-03 10:36 ` Karel Zak
@ 2013-07-03 17:08 ` Mike Frysinger
2013-07-09 9:08 ` Karel Zak
0 siblings, 1 reply; 6+ messages in thread
From: Mike Frysinger @ 2013-07-03 17:08 UTC (permalink / raw)
To: Karel Zak; +Cc: util-linux, ebiederm, mtk.manpages
[-- Attachment #1: Type: Text/Plain, Size: 2122 bytes --]
On Wednesday 03 July 2013 06:36:35 Karel Zak wrote:
> On Mon, Jul 01, 2013 at 10:47:04AM -0400, Mike Frysinger wrote:
> > On Monday 01 July 2013 07:40:08 Karel Zak wrote:
> > > On Thu, Jun 27, 2013 at 08:04:58PM -0400, Mike Frysinger wrote:
> > > > When it comes to pid namespaces, it's also useful for /proc to
> > > > reflect the current namespace. Again, this is easy to pull off, but
> > > > annoying to force everyone to do it themselves. So let's add a
> > > > --mount-proc to do the magic for us.
> > >
> > > This is not so easy. For example on Fedora 18 the default is "shared":
> > >
> > > # grep /proc /proc/self/mountinfo
> > > 14 33 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc
> > > rw
> > >
> > > it means that unshare( CLONE_NEWNS ) has no expected effect and the
> > > following mount(/proc) has horrible impact for all system. You have
> > >
> > > to use (for example):
> > > mount --make-rprivate /proc
> > > unshare --fork --mount-proc --pid
> >
> > i'm not quite following here. are you saying that Fedora 18 by default
> > makes it hard to do pid namespaces ?
>
> /proc does not have to be private. You have to call
>
> mount("none", "/proc", NULL, MS_PRIVATE|MS_REC, NULL);
>
> to be sure that unshare(CLONE_NEWNS) makes any effect. It's mistake
> to blindly call
>
> unshare( CLONE_NEWNS );
> mount("proc, "/proc", "proc", 0, NULL);
>
> If we want to add --mount-proc to unshare(1) than the implementation has
> to be robust. Your current patch is dangerous on systems where /proc is
> shared.
well, it usually does more:
unshare(...);
fork();
mount(...);
but if just adding MS_PRIVATE makes it work w/out needing to do
unshare(NEWNS), that's even better. i'm not familiar with that flag as it's
not in the mount(2) man page (looks like it's listed as a TODO).
> It would be also nice to support optional argument to specify the
> mountpoint --mount-proc[=<mountpoint>].
>
> See the patch below -- works for me.
Acked-by: Mike Frysinger <vapier@gentoo.or>
-mike
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH/RFC] unshare: add --fork/--mount-proc options for pid namespaces
2013-07-03 17:08 ` Mike Frysinger
@ 2013-07-09 9:08 ` Karel Zak
0 siblings, 0 replies; 6+ messages in thread
From: Karel Zak @ 2013-07-09 9:08 UTC (permalink / raw)
To: Mike Frysinger; +Cc: util-linux, ebiederm, mtk.manpages
On Wed, Jul 03, 2013 at 01:08:30PM -0400, Mike Frysinger wrote:
> i'm not familiar with that flag as it's
> not in the mount(2) man page (looks like it's listed as a TODO).
the flag is used for mount --make-private,
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/sharedsubtree.txt
> Acked-by: Mike Frysinger <vapier@gentoo.or>
Merged, thanks.
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-07-09 9:08 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-28 0:04 [PATCH/RFC] unshare: add --fork/--mount-proc options for pid namespaces Mike Frysinger
2013-07-01 11:40 ` Karel Zak
2013-07-01 14:47 ` Mike Frysinger
2013-07-03 10:36 ` Karel Zak
2013-07-03 17:08 ` Mike Frysinger
2013-07-09 9:08 ` Karel Zak
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox