chroot如何影响dynamic库的内存使用?

虽然有类似的话题有另一个问题 ,但它并不包括共享库在chrooted jail中的内存使用。

假设我们有一些类似的chroot。 更具体地说,完全相同的二进制文件和共享库集合实际上是硬链接到主副本,以节省磁盘空间(以防止文件更改的可能性的文件系统挂载只读)。

内存使用如何影响这种设置?

正如在chroot系统调用中所描述的那样:

这个调用改变了路径名解析过程中的一个成分,除此之外别无其他。

因此,共享库将以相同的方式加载,就像它在chroot jail之外(共享只读页面,重复数据等)

http://man7.org/linux/man-pages/man2/chroot.2.html

由于硬链接共享相同的底层inode,因此内核在缓存/映射时将它们视为相同的项目。

您将看到通过使用硬链接节省文件系统缓存,以及节省磁盘空间。

我遇到的最大问题是,如果有人管理这样一个chroot环境的只读属性,那么他们可以通过修改任何硬连接的文件来颠覆所有这些。

当我设置这个时,我拷贝了每个chroot的共享库,而不是链接到一个只读的挂载。 使用单独的文件,文本段不共享。 相同的inode可能映射到相同的只读文本段,但这可能会随可用的内存管理硬件和类似的体系结构细节而变化。

在你的系统上试试这个实验:编写一个小程序,使一些大型的共享库最小化。 如你所描述的那样,运行二三十个chroot监狱,每个监狱都有一个运行的程序副本。 在运行前和运行期间检查整个内存的使用情况,并剖析一个实例以获得良好的文本/数据段细分。 如果内存使用量增加了每个实例的映射的完整大小,则不会共享这些段。 相反,如果内存占用了地图的一小部分,这些段将被共享。