【发布时间】:2015-05-08 15:31:15
【问题描述】:
我正在尝试从已创建的命名空间(名为“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())
OR(取自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 的想法都会很棒!
TIA!
【问题讨论】:
标签: python namespaces ctypes nsenter