皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

OPEN_TREE_NAMESPACE 为处理容器提供安全与性能优势

预计即将合并到即将到来的 Linux 7.0 内核周期中的一个新功能是为 open_tree() 系统调用添加一个 OPEN_TREE_NAMESPACE 标志。如果你在 Linux 上处理大量容器化工作负载,这个 OPEN_TREE_NAMESPACE 选项可以提供出色的性能提升,并带来额外的安全优势。

微软工程师 Christian Brauner 开发了 open_tree() 的 OPEN_TREE_NAMESPACE 功能,以减少在启动容器时对那些最终不必要且将被立即销毁的挂载点复制的浪费。Brauner 在 12 月晚些时候的补丁系列中详细解释了这一点:

在创建容器时,通常涉及使用 clone3() 或 unshare() 调用 CLONE_NEWNS。这会复制调用者的完整挂载命名空间。运行时还会组装一个新的根文件系统,然后使用 pivot_root() 将旧的挂载树切换到新的根文件系统。之后它会递归地卸载旧的挂载树,从而移除所有挂载。

在一个基本系统上,这里挂载表并不特别大,这仍然会复制大约 30 个挂载。仅仅为了之后移除这些挂载而复制所有这些挂载非常浪费。

如果使用中间的挂载命名空间,这些命名空间只存在非常短的时间并立即被销毁,这会更加加剧问题,导致大量挂载被无谓地复制和销毁。

在挂载表很大且系统并行生成数千或数万个命名空间的情况下,这很快会成为瓶颈,增加对信号量的争用。

扩展 open_tree() 函数,添加新的 OPEN_TREE_NAMESPACE 标志。与 OPEN_TREE_CLONE 类似,仅复制指定的挂载树。OPEN_TREE_NAMESPACE 不会返回指向该挂载树的文件描述符,而是使 open_tree() 返回一个指向新挂载命名空间的文件描述符。在该新的挂载命名空间中,复制的挂载树被挂载在真实根文件系统的一个副本之上。

调用者可以 setns() 进入该挂载命名空间,并执行任何额外的设置,例如将分离的挂载移入其中。

这允许 OPEN_TREE_NAMESPACE 功能类似于 unshare(CLONE_NEWNS) 和 pivot_root() 的组合。

在测试新功能时,发现其速度提高了约 40%:

使用旧的基于 pivot_root() 的方法,我可以在 60 秒内创建大约 73k 个”容器”。使用新的 open_tree() 方法,我可以在同一时间内创建大约 109k 个。因此,新方法似乎比旧方案快约 40%(而且系统调用也少得多)。

除了 OPEN_TREE_NAMESPACE 更加节省资源、效率更高之外,还预计能带来安全方面的好处,例如在容器根目录尝试访问底层挂载时被卸载,可以阻止攻击。

OPEN_TREE_NAMESPACE 为处理容器提供安全与性能优势

几天前,OPEN_TREE_NAMESPACE 的补丁已经被加入到了 vfs/vfs.git 的 vfs-7.0.namespace Git 分支中。现在代码已经到位,预计将在即将到来的 Linux 6.20~7.0 内核合并窗口中提交,除非最后出现任何问题。

转自  OPEN_TREE_NAMESPACE To Provide A Security & Performance Win For Dealing With Containers – Phoronix