我正在读关于挂载命名空间并查看:
在挂载命名空间中,您可以挂载和卸载文件系统,而不会影响主机文件系统。因此,您可以安装一组完全不同的设备(通常更少)。
我试图理解Linux命名空间,还有 LXC 之类的,但我不太明白上面这句话的意思。
我想要了解的是容器(1)如何拥有这样的文件:
/foo/a.txt
/foo/bar/b.txt
另一个容器 (2) 可以包含如下文件:
/foo/a.txt
/foo/x.txt
/foo/bar/b.txt
/foo/bar/y.txt
容器 (1) 和 (2) 的位置/foo/a.txt
和/foo/bar/b.txt
位置相同小路,但也许它们有不同的内容:
# container (1)
cat /foo/a.txt #=> Hello from (1)
# container (2)
cat /foo/a.txt #=> Hello from (2)
这意味着物理系统上的文件(我对此一无所知)以一种方式存储,可能分散在各处。但还有一个“虚拟”文件的集中数据库在操作系统中, 像这样:
db:
container1:
foo:
a.txt: Hello from a from (1)
bar:
b.txt: Hello from b from (1)
container2:
foo:
a.txt: Hello from a from (2)
x.txt: Hello from x from (2)
bar:
b.txt: Hello from b from (2)
y.txt: Hello from y from (2)
然后有其他物理文件的操作系统数据库可能如下所示:
drive1:
dir1:
foo:
a.txt
bar:
b.txt
dir2:
foo:
a.txt
x.txt
bar:
b.txt
y.txt
因此,当您在容器中创建文件时,您实际上创建了 2 条新记录:
- 1 为驱动器级物理文件映射
- 1 为容器级虚拟文件映射
这就是我想象的工作方式。这就是我如何看到有一种方法可以(1)向用户(在 LXC 容器或 cgroup(我对此不太了解)中)呈现感觉如何一个完整的“文件系统”,其中他们可以(2)创建自己的完全可定制的目录结构(可能具有与完全不同的虚拟文件系统相同的命名文件/目录/路径),以便(3)文件来自多个不同虚拟文件系统/容器的文件不会相互覆盖。
想知道它是否是这样工作的,如果不是,它实际上是如何工作的(或者它是如何工作的概述)。
答案1
挂载命名空间的排列方式有所不同挂载的文件系统。
这是非常灵活的,因为挂载可以是文件系统内子目录的绑定挂载。
# unshare --mount # run a shell in a new mount namespace
# mount --bind /usr/bin/ /mnt/
# ls /mnt/cp
/mnt/cp
# exit # exit the shell, and hence the mount namespace
# ls /mnt/cp
ls: cannot access '/mnt/cp': No such file or directory
您可以使用该命令列出当前的安装集findmnt
。
在完整的容器中,根挂载将被替换,并且您可以使用完全独立的挂载树。这涉及到一些额外的细节,比如pivot_root()
系统调用。您可能不需要确切地知道如何做到这一点。一些细节可以在这里找到:如何使用 Linux 命名空间执行 chroot?