Mount Namespace
基本信息
挂载命名空间是Linux内核的一个功能,提供了一组进程看到的文件系统挂载点的隔离。每个挂载命名空间都有自己的文件系统挂载点集,一个命名空间中对挂载点的更改不会影响其他命名空间。这意味着在不同挂载命名空间中运行的进程可以对文件系统层次结构有不同的视图。
挂载命名空间在容器化中特别有用,每个容器应该有自己的文件系统和配置,与其他容器和主机系统隔离开来。
工作原理:
创建新的挂载命名空间时,它会使用父命名空间的挂载点的副本进行初始化。这意味着在创建时,新命名空间与其父命名空间共享相同的文件系统视图。但是,命名空间内的挂载点的任何后续更改都不会影响父命名空间或其他命名空间。
当进程修改其命名空间内的挂载点,例如挂载或卸载文件系统时,更改仅限于该命名空间,不会影响其他命名空间。这允许每个命名空间拥有自己独立的文件系统层次结构。
进程可以使用
setns()
系统调用在命名空间之间移动,或者使用带有CLONE_NEWNS
标志的unshare()
或clone()
系统调用创建新的命名空间。当进程移动到新的命名空间或创建一个新的命名空间时,它将开始使用与该命名空间关联的挂载点。文件描述符和inode在命名空间之间共享,这意味着如果一个命名空间中的进程有指向文件的打开文件描述符,它可以将该文件描述符传递给另一个命名空间中的进程,两个进程将访问同一个文件。但是,由于挂载点的差异,两个命名空间中文件的路径可能不相同。
实验:
创建不同的命名空间
命令行界面
通过使用参数--mount-proc
挂载/proc
文件系统的新实例,确保新的挂载命名空间具有准确且独立的进程信息视图,特定于该命名空间。
Docker
检查您的进程位于哪个命名空间
查找所有挂载命名空间
进入挂载命名空间
此外,只有root用户才能进入另一个进程命名空间。而且,没有指向它的描述符(如/proc/self/ns/mnt
),你无法进入其他命名空间。
由于新挂载点只能在命名空间内访问,因此可能存在包含只能从中访问的敏感信息的命名空间。
挂载某物
参考资料
最后更新于