Mount /proc inside slice.
Sapan Bhatia [Mon, 3 Jun 2013 19:24:27 +0000 (15:24 -0400)]
lxcsu
setns.c

diff --git a/lxcsu b/lxcsu
index 83f1144..2f1c0af 100755 (executable)
--- a/lxcsu
+++ b/lxcsu
@@ -136,10 +136,13 @@ def main ():
         setns.chcontext('/proc/%s/ns/net'%pid)
 
     if (not options.mntns):
-        open('/proc/lxcsu','w').write(pid)
+        setns.chcontext('/proc/%s/ns/mnt'%pid)
 
     if (not options.pidns):
-        open('/proc/pidsu','w').write(pid)
+        setns.chcontext('/proc/%s/ns/pid'%pid)
+
+    if (!os.access('/proc/self'):
+        setns.proc_mount()
 
     # cgroups is not yet LXC-safe, so we need to use the course grained access control
     # strategy of unmounting the filesystem
diff --git a/setns.c b/setns.c
index 776804d..fded30b 100644 (file)
--- a/setns.c
+++ b/setns.c
@@ -2,6 +2,7 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <asm-generic/unistd.h>
+#include <sys/mount.h>
 
 static PyObject *
 chfscontext(PyObject *self, PyObject *args)
@@ -27,6 +28,16 @@ chfscontext(PyObject *self, PyObject *args)
 out:
     return Py_BuildValue("i", sts);
 }
+
+static PyObject *
+proc_mount(PyObject *self, PyObject *args)
+{
+    int sts; 
+    sts = mount("none","/proc","procfs",0,NULL);
+
+    return Py_BuildValue("i", sts);
+}
+
 static PyObject *
 chcontext(PyObject *self, PyObject *args)
 {
@@ -54,6 +65,7 @@ out:
 
 static PyMethodDef SetnsMethods[] =
 {
+         {"proc_mount", proc_mount, METH_VARARGS, "Mount a volume via the mount system call."},
          {"chcontext", chcontext, METH_VARARGS, "Switch into an lxc container."},
          {"chfscontext", chfscontext, METH_VARARGS, "Switch into an lxc container."},
               {NULL, NULL, 0, NULL}