我正在尝试从已创建的命名空间(名为“test”)中启动一个新进程。
我研究了一些方法,包括 nsenter:
import subprocess
from nsenter import Namespace
with Namespace(mypid, 'net'):
# output network interfaces as seen from within the mypid's net NS:
subprocess.check_output(['ip', 'a'])
但我似乎无法找到在哪里可以找到 var、mypid 的参考......!
理想情况下,我想将 nsenter 之类的依赖项保持在最低限度(为了可移植性),所以我可能想沿着 ctypes 路线走下去,比如(尽管 netns 没有系统调用......):
nsname = 'test'
netnspath = '%s%s' % ('/run/netns/', nsname)
netnspath = netnspath.encode('ascii')
libc = ctypes.CDLL('libc.so.6')
printdir(libc)
fd = open(netnspath)
print libc.syscall(???, fd.fileno())
或(取自http://tech.zalando.com/posts/entering-kernel-namespaces-with-python.html)
import ctypes
libc = ctypes.CDLL('libc.so.6')
# replace MYPID with the container's PID
fd = open('/proc/<MYPID>/ns/net')
libc.setns(fd.fileno(), 0)
# we are now inside MYPID's network namespace
但是,我仍然必须知道 PID,再加上我的 libc 没有 setns!
关于如何获得 PID 的任何想法都会很棒!
蒂亚!