我有一个进程调用unshare
创建一个新的网络命名空间,里面只有它自己。当它调用execve
启动 bash 时,ip 命令显示我只有一个lo
设备。如果我还创建了一个用户命名空间并将我的进程安排为命名空间内的 root,我可以使用该ip
命令启动该设备并且它可以工作。
我还可以使用该ip
命令veth
在此命名空间中创建设备。但它没有出现在ip netns list
新veth
设备中,并且新设备也没有出现在根级命名空间中(正如我所期望的)。如何将veth
根级命名空间中的设备连接到veth
进程命名空间中的新设备?该ip
命令似乎要求命名空间具有由ip
命令分配的名称,而我的则不需要,因为我没有使用ip netns add
它来创建它。
也许我可以通过编写自己的程序来使用 netlink 设备并进行设置。但我真的不想这样做。有没有办法通过命令行来做到这一点?
必须有办法做到这一点,因为 docker 容器也有自己的网络命名空间,而且该命名空间也是未命名的。然而,veth
它内部有一个设备连接到veth
它外部的设备。
我的目标是动态创建进程隔离上下文,理想情况下不需要成为容器外的 root。为此,我将创建一个 PID 命名空间、一个 UID 命名空间、一个网络命名空间、一个 IPC 命名空间和挂载命名空间。我也可以创建一个 cgroup 命名空间,但这些都是新的,我需要能够在当前支持的 SLES、RHEL 和 Ubuntu LTS 版本上运行。
我一直在处理这个命名空间,目前我的 User、PID 和 mount 命名空间工作令人满意。
/proc/pid/ns/net
如果必须,我可以挂载,但我更愿意从用户命名空间内部执行此操作,因此(再次)我不必在命名空间之外成为 root。大多数情况下,一旦命名空间中的所有进程都消失了,我希望一切都消失。完成后在文件系统上清理一堆状态会不太理想。尽管在容器首次分配时临时创建它然后立即删除它比在容器退出时必须清理它要好得多。
不,我不能使用泊坞窗,LXC,RKT,或任何其他现有的解决方案,使得我可以依靠比沼泽标准系统工具(像其他任何IP),系统库一样的glibc和Linux系统调用。
根据 IPv6 标准,Linux 为接口分配 IPv6 链路本地地址。这些接口始终分配有 /64 地址。这样对吗?我认为它们应该是/10。为什么给它们分配 /64 地址?
看来内核无论如何都在使用大页面,那么为什么要使用特定的内核参数来指定要保留的大页面数量呢?
毕竟,/proc/meminfo
显示、和的值,指示每种大小的页面存在的页表条目数DirectMap4K
DirectMap4M
DirectMap1G
。因此,显然,正在使用大于 4KiB 的页面。
为什么/proc/sys/vm/nr_hugepages
和朋友还存在?